123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475 |
- #pragma once
- #include "il2cpp-config.h"
- #include <stdint.h>
- #include "il2cpp-tokentype.h"
- // This file contains the structures specifying how we store converted metadata.
- // These structures have 3 constraints:
- // 1. These structures will be stored in an external file, and as such must not contain any pointers.
- // All references to other metadata should occur via an index into a corresponding table.
- // 2. These structures are assumed to be const. Either const structures in the binary or mapped as
- // readonly memory from an external file. Do not add any 'calculated' fields which will be written to at runtime.
- // 3. These structures should be optimized for size. Other structures are used at runtime which can
- // be larger to store cached information
- typedef int32_t TypeIndex;
- typedef int32_t TypeDefinitionIndex;
- typedef int32_t FieldIndex;
- typedef int32_t DefaultValueIndex;
- typedef int32_t DefaultValueDataIndex;
- typedef int32_t CustomAttributeIndex;
- typedef int32_t ParameterIndex;
- typedef int32_t MethodIndex;
- typedef int32_t GenericMethodIndex;
- typedef int32_t PropertyIndex;
- typedef int32_t EventIndex;
- typedef int32_t GenericContainerIndex;
- typedef int32_t GenericParameterIndex;
- typedef int16_t GenericParameterConstraintIndex;
- typedef int32_t NestedTypeIndex;
- typedef int32_t InterfacesIndex;
- typedef int32_t VTableIndex;
- typedef int32_t InterfaceOffsetIndex;
- typedef int32_t RGCTXIndex;
- typedef int32_t StringIndex;
- typedef int32_t StringLiteralIndex;
- typedef int32_t GenericInstIndex;
- typedef int32_t ImageIndex;
- typedef int32_t AssemblyIndex;
- typedef int32_t InteropDataIndex;
- static const TypeIndex kTypeIndexInvalid = -1;
- static const TypeDefinitionIndex kTypeDefinitionIndexInvalid = -1;
- static const DefaultValueDataIndex kDefaultValueIndexNull = -1;
- static const CustomAttributeIndex kCustomAttributeIndexInvalid = -1;
- static const EventIndex kEventIndexInvalid = -1;
- static const FieldIndex kFieldIndexInvalid = -1;
- static const MethodIndex kMethodIndexInvalid = -1;
- static const PropertyIndex kPropertyIndexInvalid = -1;
- static const GenericContainerIndex kGenericContainerIndexInvalid = -1;
- static const GenericParameterIndex kGenericParameterIndexInvalid = -1;
- static const RGCTXIndex kRGCTXIndexInvalid = -1;
- static const StringLiteralIndex kStringLiteralIndexInvalid = -1;
- static const InteropDataIndex kInteropDataIndexInvalid = -1;
- // Encoded index (1 bit)
- // MethodDef - 0
- // MethodSpec - 1
- // We use the top 3 bits to indicate what table to index into
- // Type Binary Hex
- // Il2CppClass 001 0x20000000
- // Il2CppType 010 0x40000000
- // MethodInfo 011 0x60000000
- // FieldInfo 100 0x80000000
- // StringLiteral 101 0xA0000000
- // MethodRef 110 0xC0000000
- typedef uint32_t EncodedMethodIndex;
- enum Il2CppMetadataUsage
- {
- kIl2CppMetadataUsageInvalid,
- kIl2CppMetadataUsageTypeInfo,
- kIl2CppMetadataUsageIl2CppType,
- kIl2CppMetadataUsageMethodDef,
- kIl2CppMetadataUsageFieldInfo,
- kIl2CppMetadataUsageStringLiteral,
- kIl2CppMetadataUsageMethodRef,
- };
- #ifdef __cplusplus
- static inline Il2CppMetadataUsage GetEncodedIndexType(EncodedMethodIndex index)
- {
- return (Il2CppMetadataUsage)((index & 0xE0000000) >> 29);
- }
- static inline uint32_t GetDecodedMethodIndex(EncodedMethodIndex index)
- {
- return index & 0x1FFFFFFFU;
- }
- static inline uint32_t GetTokenType(uint32_t token)
- {
- return token & 0xFF000000;
- }
- static inline uint32_t GetTokenRowId(uint32_t token)
- {
- return token & 0x00FFFFFF;
- }
- #endif
- struct Il2CppImage;
- struct Il2CppType;
- struct Il2CppTypeDefinitionMetadata;
- typedef union Il2CppRGCTXDefinitionData
- {
- int32_t rgctxDataDummy;
- MethodIndex methodIndex;
- TypeIndex typeIndex;
- } Il2CppRGCTXDefinitionData;
- typedef enum Il2CppRGCTXDataType
- {
- IL2CPP_RGCTX_DATA_INVALID,
- IL2CPP_RGCTX_DATA_TYPE,
- IL2CPP_RGCTX_DATA_CLASS,
- IL2CPP_RGCTX_DATA_METHOD,
- IL2CPP_RGCTX_DATA_ARRAY,
- } Il2CppRGCTXDataType;
- #if RUNTIME_MONO
- typedef struct MonoRGCTXDefinition
- {
- Il2CppRGCTXDataType type;
- AssemblyIndex assemblyIndex;
- int32_t token;
- int32_t generic_parameter_index;
- } MonoRGCTXDefinition;
- #else
- typedef struct Il2CppRGCTXDefinition
- {
- Il2CppRGCTXDataType type;
- Il2CppRGCTXDefinitionData data;
- } Il2CppRGCTXDefinition;
- #endif
- typedef struct Il2CppInterfaceOffsetPair
- {
- TypeIndex interfaceTypeIndex;
- int32_t offset;
- } Il2CppInterfaceOffsetPair;
- typedef struct Il2CppTypeDefinition
- {
- StringIndex nameIndex;
- StringIndex namespaceIndex;
- TypeIndex byvalTypeIndex;
- TypeIndex byrefTypeIndex;
- TypeIndex declaringTypeIndex;
- TypeIndex parentIndex;
- TypeIndex elementTypeIndex; // we can probably remove this one. Only used for enums
- GenericContainerIndex genericContainerIndex;
- uint32_t flags;
- FieldIndex fieldStart;
- MethodIndex methodStart;
- EventIndex eventStart;
- PropertyIndex propertyStart;
- NestedTypeIndex nestedTypesStart;
- InterfacesIndex interfacesStart;
- VTableIndex vtableStart;
- InterfacesIndex interfaceOffsetsStart;
- uint16_t method_count;
- uint16_t property_count;
- uint16_t field_count;
- uint16_t event_count;
- uint16_t nested_type_count;
- uint16_t vtable_count;
- uint16_t interfaces_count;
- uint16_t interface_offsets_count;
- // bitfield to portably encode boolean values as single bits
- // 01 - valuetype;
- // 02 - enumtype;
- // 03 - has_finalize;
- // 04 - has_cctor;
- // 05 - is_blittable;
- // 06 - is_import_or_windows_runtime;
- // 07-10 - One of nine possible PackingSize values (0, 1, 2, 4, 8, 16, 32, 64, or 128)
- uint32_t bitfield;
- uint32_t token;
- } Il2CppTypeDefinition;
- typedef struct Il2CppFieldDefinition
- {
- StringIndex nameIndex;
- TypeIndex typeIndex;
- uint32_t token;
- } Il2CppFieldDefinition;
- typedef struct Il2CppFieldDefaultValue
- {
- FieldIndex fieldIndex;
- TypeIndex typeIndex;
- DefaultValueDataIndex dataIndex;
- } Il2CppFieldDefaultValue;
- typedef struct Il2CppFieldMarshaledSize
- {
- FieldIndex fieldIndex;
- TypeIndex typeIndex;
- int32_t size;
- } Il2CppFieldMarshaledSize;
- typedef struct Il2CppFieldRef
- {
- TypeIndex typeIndex;
- FieldIndex fieldIndex; // local offset into type fields
- } Il2CppFieldRef;
- typedef struct Il2CppParameterDefinition
- {
- StringIndex nameIndex;
- uint32_t token;
- TypeIndex typeIndex;
- } Il2CppParameterDefinition;
- typedef struct Il2CppParameterDefaultValue
- {
- ParameterIndex parameterIndex;
- TypeIndex typeIndex;
- DefaultValueDataIndex dataIndex;
- } Il2CppParameterDefaultValue;
- typedef struct Il2CppMethodDefinition
- {
- StringIndex nameIndex;
- TypeDefinitionIndex declaringType;
- TypeIndex returnType;
- ParameterIndex parameterStart;
- GenericContainerIndex genericContainerIndex;
- uint32_t token;
- uint16_t flags;
- uint16_t iflags;
- uint16_t slot;
- uint16_t parameterCount;
- } Il2CppMethodDefinition;
- typedef struct Il2CppEventDefinition
- {
- StringIndex nameIndex;
- TypeIndex typeIndex;
- MethodIndex add;
- MethodIndex remove;
- MethodIndex raise;
- uint32_t token;
- } Il2CppEventDefinition;
- typedef struct Il2CppPropertyDefinition
- {
- StringIndex nameIndex;
- MethodIndex get;
- MethodIndex set;
- uint32_t attrs;
- uint32_t token;
- } Il2CppPropertyDefinition;
- typedef struct Il2CppMethodSpec
- {
- MethodIndex methodDefinitionIndex;
- GenericInstIndex classIndexIndex;
- GenericInstIndex methodIndexIndex;
- } Il2CppMethodSpec;
- typedef struct Il2CppStringLiteral
- {
- uint32_t length;
- StringLiteralIndex dataIndex;
- } Il2CppStringLiteral;
- typedef struct
- {
- MethodIndex methodIndex;
- MethodIndex invokerIndex;
- } Il2CppGenericMethodIndices;
- typedef struct Il2CppGenericMethodFunctionsDefinitions
- {
- GenericMethodIndex genericMethodIndex;
- Il2CppGenericMethodIndices indices;
- } Il2CppGenericMethodFunctionsDefinitions;
- #define PUBLIC_KEY_BYTE_LENGTH 8
- static const int kPublicKeyByteLength = PUBLIC_KEY_BYTE_LENGTH;
- typedef struct Il2CppAssemblyNameDefinition
- {
- StringIndex nameIndex;
- StringIndex cultureIndex;
- StringIndex hashValueIndex;
- StringIndex publicKeyIndex;
- uint32_t hash_alg;
- int32_t hash_len;
- uint32_t flags;
- int32_t major;
- int32_t minor;
- int32_t build;
- int32_t revision;
- uint8_t public_key_token[PUBLIC_KEY_BYTE_LENGTH];
- } Il2CppAssemblyNameDefinition;
- typedef struct Il2CppImageDefinition
- {
- StringIndex nameIndex;
- AssemblyIndex assemblyIndex;
- TypeDefinitionIndex typeStart;
- uint32_t typeCount;
- TypeDefinitionIndex exportedTypeStart;
- uint32_t exportedTypeCount;
- MethodIndex entryPointIndex;
- uint32_t token;
- CustomAttributeIndex customAttributeStart;
- uint32_t customAttributeCount;
- } Il2CppImageDefinition;
- typedef struct Il2CppAssemblyDefinition
- {
- ImageIndex imageIndex;
- uint32_t token;
- int32_t referencedAssemblyStart;
- int32_t referencedAssemblyCount;
- Il2CppAssemblyNameDefinition aname;
- } Il2CppAssemblyDefinition;
- typedef struct Il2CppMetadataUsageList
- {
- uint32_t start;
- uint32_t count;
- } Il2CppMetadataUsageList;
- typedef struct Il2CppMetadataUsagePair
- {
- uint32_t destinationIndex;
- uint32_t encodedSourceIndex;
- } Il2CppMetadataUsagePair;
- typedef struct Il2CppCustomAttributeTypeRange
- {
- uint32_t token;
- int32_t start;
- int32_t count;
- } Il2CppCustomAttributeTypeRange;
- typedef struct Il2CppRange
- {
- int32_t start;
- int32_t length;
- } Il2CppRange;
- typedef struct Il2CppWindowsRuntimeTypeNamePair
- {
- StringIndex nameIndex;
- TypeIndex typeIndex;
- } Il2CppWindowsRuntimeTypeNamePair;
- #pragma pack(push, p1,4)
- typedef struct Il2CppGlobalMetadataHeader
- {
- int32_t sanity;
- int32_t version;
- int32_t stringLiteralOffset; // string data for managed code
- int32_t stringLiteralCount;
- int32_t stringLiteralDataOffset;
- int32_t stringLiteralDataCount;
- int32_t stringOffset; // string data for metadata
- int32_t stringCount;
- int32_t eventsOffset; // Il2CppEventDefinition
- int32_t eventsCount;
- int32_t propertiesOffset; // Il2CppPropertyDefinition
- int32_t propertiesCount;
- int32_t methodsOffset; // Il2CppMethodDefinition
- int32_t methodsCount;
- int32_t parameterDefaultValuesOffset; // Il2CppParameterDefaultValue
- int32_t parameterDefaultValuesCount;
- int32_t fieldDefaultValuesOffset; // Il2CppFieldDefaultValue
- int32_t fieldDefaultValuesCount;
- int32_t fieldAndParameterDefaultValueDataOffset; // uint8_t
- int32_t fieldAndParameterDefaultValueDataCount;
- int32_t fieldMarshaledSizesOffset; // Il2CppFieldMarshaledSize
- int32_t fieldMarshaledSizesCount;
- int32_t parametersOffset; // Il2CppParameterDefinition
- int32_t parametersCount;
- int32_t fieldsOffset; // Il2CppFieldDefinition
- int32_t fieldsCount;
- int32_t genericParametersOffset; // Il2CppGenericParameter
- int32_t genericParametersCount;
- int32_t genericParameterConstraintsOffset; // TypeIndex
- int32_t genericParameterConstraintsCount;
- int32_t genericContainersOffset; // Il2CppGenericContainer
- int32_t genericContainersCount;
- int32_t nestedTypesOffset; // TypeDefinitionIndex
- int32_t nestedTypesCount;
- int32_t interfacesOffset; // TypeIndex
- int32_t interfacesCount;
- int32_t vtableMethodsOffset; // EncodedMethodIndex
- int32_t vtableMethodsCount;
- int32_t interfaceOffsetsOffset; // Il2CppInterfaceOffsetPair
- int32_t interfaceOffsetsCount;
- int32_t typeDefinitionsOffset; // Il2CppTypeDefinition
- int32_t typeDefinitionsCount;
- int32_t imagesOffset; // Il2CppImageDefinition
- int32_t imagesCount;
- int32_t assembliesOffset; // Il2CppAssemblyDefinition
- int32_t assembliesCount;
- int32_t metadataUsageListsOffset; // Il2CppMetadataUsageList
- int32_t metadataUsageListsCount;
- int32_t metadataUsagePairsOffset; // Il2CppMetadataUsagePair
- int32_t metadataUsagePairsCount;
- int32_t fieldRefsOffset; // Il2CppFieldRef
- int32_t fieldRefsCount;
- int32_t referencedAssembliesOffset; // int32_t
- int32_t referencedAssembliesCount;
- int32_t attributesInfoOffset; // Il2CppCustomAttributeTypeRange
- int32_t attributesInfoCount;
- int32_t attributeTypesOffset; // TypeIndex
- int32_t attributeTypesCount;
- int32_t unresolvedVirtualCallParameterTypesOffset; // TypeIndex
- int32_t unresolvedVirtualCallParameterTypesCount;
- int32_t unresolvedVirtualCallParameterRangesOffset; // Il2CppRange
- int32_t unresolvedVirtualCallParameterRangesCount;
- int32_t windowsRuntimeTypeNamesOffset; // Il2CppWindowsRuntimeTypeNamePair
- int32_t windowsRuntimeTypeNamesSize;
- int32_t exportedTypeDefinitionsOffset; // TypeDefinitionIndex
- int32_t exportedTypeDefinitionsCount;
- } Il2CppGlobalMetadataHeader;
- #pragma pack(pop, p1)
- #if RUNTIME_MONO
- #pragma pack(push, p1,4)
- typedef struct Il2CppGlobalMonoMetadataHeader
- {
- int32_t sanity;
- int32_t version;
- int32_t stringOffset; // string data for metadata
- int32_t stringCount;
- int32_t genericMethodInfoMappingOffset; // hash -> generic MonoMethodInfo mapping
- int32_t genericMethodInfoMappingCount;
- int32_t monoStringOffset; // mono strings
- int32_t monoStringCount;
- int32_t methodMetadataOffset; // method metadata
- int32_t methodMetadataCount;
- int32_t genericArgumentIndicesOffset; // generic argument indices
- int32_t genericArgumentIndicesCount;
- int32_t typeTableOffset; // type table
- int32_t typeTableCount;
- int32_t fieldTableOffset; // field table
- int32_t fieldTableCount;
- int32_t genericMethodIndexTableOffset; // generic method index table
- int32_t genericMethodIndexTableCount;
- int32_t metaDataUsageListsTableOffset; // meta data usage lists table
- int32_t metaDataUsageListsTableCount;
- int32_t metaDataUsagePairsTableOffset; // meta data usage pairs table
- int32_t metaDataUsagePairsTableCount;
- int32_t assemblyNameTableOffset; // assembly names
- int32_t assemblyNameTableCount;
- } Il2CppGlobalMonoMetadataHeader;
- #pragma pack(pop, p1)
- #endif
|