| /* DTrace types and macros for runtime data structures */ |
| |
| enum MetadataKind { |
| StructMetadataKind = 1, |
| EnumMetadataKind = 2, |
| OpaqueMetadataKind = 8, |
| TupleMetadataKind = 9, |
| FunctionMetadataKind = 10, |
| ExistentialMetadataKind = 12, |
| MetatypeMetadataKind = 13, |
| ObjCClassWrapperKind = 14, |
| HeapLocalVariableKind = 64, |
| HeapArrayKind = 65 |
| }; |
| |
| typedef struct NominalTypeDescriptor { |
| unsigned long kind; |
| const char *name; |
| unsigned long numFields; |
| unsigned long fieldOffsetVectorOffset; |
| const char *fieldNames; |
| } NominalTypeDescriptor; |
| |
| typedef struct Metadata { |
| void *valueWitnessTable; |
| unsigned long kind; |
| } Metadata; |
| |
| typedef struct ClassMetadata { |
| void *valueWitnessTable; |
| struct ClassMetadata *isa; |
| struct ClassMetadata *super; |
| void *data[3]; |
| NominalTypeDescriptor *descriptor; |
| unsigned long instanceSize, instanceAlign; |
| } ClassMetadata; |
| |
| #define copyinMetadata(T, ptr) \ |
| ((T*)copyin((unsigned long)(ptr) - sizeof(void*), sizeof(T))) |
| |
| #define copyinNominalTypeDescriptor(ptr) \ |
| ((NominalTypeDescriptor*)copyin((unsigned long)(ptr), sizeof(NominalTypeDescriptor))) |