blob: 13331659e805c0e1ec6bf569879b4cff3a600cbd [file] [log] [blame]
//===--- SwiftRemoteMirrorTypes.h - Remote reflection types -----*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
///
/// \file
/// This header declares types in the libswiftReflection library.
///
//===----------------------------------------------------------------------===//
#ifndef SWIFT_REMOTE_MIRROR_TYPES_H
#define SWIFT_REMOTE_MIRROR_TYPES_H
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
// Pointers used here need to be pointer-sized on watchOS for binary
// compatibility. Everywhere else, they are 64-bit so 32-bit processes can
// potentially read from 64-bit processes.
#if defined(__APPLE__) && defined(__MACH__)
#include <TargetConditionals.h>
#if TARGET_OS_WATCH
#define SWIFT_REFLECTION_NATIVE_POINTERS 1
#endif
#endif
#if SWIFT_REFLECTION_NATIVE_POINTERS
typedef uintptr_t swift_reflection_ptr_t;
#else
typedef uint64_t swift_reflection_ptr_t;
#endif
typedef swift_reflection_ptr_t swift_typeref_t;
/// Represents one of the Swift reflection sections of an image.
typedef struct swift_reflection_section {
void *Begin;
void *End;
} swift_reflection_section_t;
/// Represents the remote address and size of an image's section
typedef struct swift_remote_reflection_section {
uintptr_t StartAddress;
uintptr_t Size;
} swift_remote_reflection_section_t;
typedef struct swift_reflection_section_pair {
swift_reflection_section_t section;
swift_reflection_ptr_t offset; ///< DEPRECATED. Must be zero
} swift_reflection_section_pair_t;
/// Represents the mapping between an image sections's local and remote addresses
typedef struct swift_reflection_section_mapping {
swift_reflection_section_t local_section;
swift_remote_reflection_section_t remote_section;
} swift_reflection_section_mapping_t;
/// Represents the set of Swift reflection sections of an image.
/// Not all sections may be present.
///
/// DEPRECATED. New RemoteMirror clients should use
/// \c swift_reflection_addImage .
typedef struct swift_reflection_info {
swift_reflection_section_pair_t field;
swift_reflection_section_pair_t associated_types;
swift_reflection_section_pair_t builtin_types;
swift_reflection_section_pair_t capture;
swift_reflection_section_pair_t type_references;
swift_reflection_section_pair_t reflection_strings;
// Start address in local and remote address spaces.
swift_reflection_ptr_t LocalStartAddress;
swift_reflection_ptr_t RemoteStartAddress;
} swift_reflection_info_t;
/// Represents the set of Swift reflection sections of an image,
typedef struct swift_reflection_mapping_info {
swift_reflection_section_mapping_t field;
swift_reflection_section_mapping_t associated_types;
swift_reflection_section_mapping_t builtin_types;
swift_reflection_section_mapping_t capture;
swift_reflection_section_mapping_t type_references;
swift_reflection_section_mapping_t reflection_strings;
} swift_reflection_mapping_info_t;
/// The layout kind of a Swift type.
typedef enum swift_layout_kind {
// Nothing is known about the size or contents of this value.
SWIFT_UNKNOWN,
// An opaque value with known size and alignment but no specific
// interpretation.
SWIFT_BUILTIN,
// A pointer-size value that is known to contain the address of
// another heap allocation, or NULL.
SWIFT_RAW_POINTER,
// Value types consisting of zero or more fields.
SWIFT_TUPLE,
SWIFT_STRUCT,
// An enum with no payload cases. The record will have no fields, but
// will have the correct size.
SWIFT_NO_PAYLOAD_ENUM,
// An enum with a single payload case. The record consists of a single
// field, being the enum payload.
SWIFT_SINGLE_PAYLOAD_ENUM,
// An enum with multiple payload cases. The record consists of a multiple
// fields, one for each enum payload.
SWIFT_MULTI_PAYLOAD_ENUM,
SWIFT_THICK_FUNCTION,
SWIFT_OPAQUE_EXISTENTIAL,
SWIFT_CLASS_EXISTENTIAL,
SWIFT_ERROR_EXISTENTIAL,
SWIFT_EXISTENTIAL_METATYPE,
// References to other objects in the heap.
SWIFT_STRONG_REFERENCE,
SWIFT_UNOWNED_REFERENCE,
SWIFT_WEAK_REFERENCE,
SWIFT_UNMANAGED_REFERENCE,
// Layouts of heap objects. These are only ever returned from
// swift_reflection_infoFor{Instance,Metadata}(), and not
// swift_reflection_infoForTypeRef().
SWIFT_CLASS_INSTANCE,
SWIFT_CLOSURE_CONTEXT,
} swift_layout_kind_t;
struct swift_childinfo;
/// A description of the memory layout of a type or field of a type.
typedef struct swift_typeinfo {
swift_layout_kind_t Kind;
unsigned Size;
unsigned Alignment;
unsigned Stride;
unsigned NumFields;
} swift_typeinfo_t;
typedef struct swift_childinfo {
/// The memory for Name is owned by the reflection context.
const char *Name;
unsigned Offset;
swift_layout_kind_t Kind;
swift_typeref_t TR;
} swift_childinfo_t;
// Values here match the values from MetadataAllocatorTags in Metadata.h.
enum swift_metadata_allocation_tag {
SWIFT_GENERIC_METADATA_CACHE_ALLOCATION = 14,
};
typedef int swift_metadata_allocation_tag_t;
/// A metadata allocation made by the Swift runtime.
typedef struct swift_metadata_allocation {
/// The allocation's tag, which describes what kind of allocation it is. This
/// may be one of the values in swift_metadata_allocation_tag, or something
/// else, in which case the tag should be considered unknown.
swift_metadata_allocation_tag_t Tag;
/// A pointer to the start of the allocation in the remote process.
swift_reflection_ptr_t Ptr;
/// The size of the allocation in bytes.
unsigned Size;
} swift_metadata_allocation_t;
typedef struct swift_metadata_cache_node {
swift_reflection_ptr_t Left;
swift_reflection_ptr_t Right;
} swift_metadata_cache_node_t;
/// An opaque pointer to a context which maintains state and
/// caching of reflection structure for heap instances.
typedef struct SwiftReflectionContext *SwiftReflectionContextRef;
#ifdef __cplusplus
} // extern "C"
#endif
#endif // SWIFT_REMOTE_MIRROR_TYPES_H