123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614 |
- #pragma once
- #include "il2cpp-config.h"
- #include "Coff.h"
- #include "Tables.h"
- namespace hybridclr
- {
- namespace metadata
- {
- enum class CorILMethodFormat : uint8_t
- {
- Tiny = 0x2,
- Fat = 0x3,
- MoreSects = 0x8,
- InitLocals = 0x10,
- };
- enum class CorILSecion : uint8_t
- {
- EHTable = 0x1,
- OptILTable = 0x2,
- FatFormat = 0x40,
- MoreSects = 0x80,
- };
- enum class CorILExceptionClauseType
- {
- Exception = 0,
- Filter = 1,
- Finally = 2,
- Fault = 4,
- };
- struct CorILMethodFatHeader
- {
- uint16_t flags : 12;
- uint16_t size : 4;
- uint16_t maxStack;
- uint32_t codeSize;
- uint32_t localVarSigToken;
- };
- struct CorILEHSmall
- {
- uint16_t flags;
- uint16_t tryOffset;
- uint8_t tryLength;
- uint8_t handlerOffset0;
- uint8_t handlerOffset1;
- uint8_t handlerLength;
- uint32_t classTokenOrFilterOffset;
- };
- static_assert(sizeof(CorILEHSmall) == 12, "sizeof(CorILEHSmall) != 12");
- struct CorILEHFat
- {
- uint32_t flags;
- uint32_t tryOffset;
- uint32_t tryLength;
- uint32_t handlerOffset;
- uint32_t handlerLength;
- uint32_t classTokenOrFilterOffset;
- };
- static_assert(sizeof(CorILEHFat) == 24, "sizeof(CorILEHFat) != 24");
- struct CorILEHSectionHeaderSmall
- {
- uint8_t kind;
- uint8_t dataSize;
- uint16_t reserved;
- CorILEHSmall clauses[0];
- };
- #pragma pack(push, 1)
- struct CorILEHSectionHeaderFat
- {
- uint8_t kind;
- uint8_t dataSize0;
- uint8_t dataSize1;
- uint8_t dataSize2;
- CorILEHFat clauses[0];
- };
- #pragma pack(pop)
- const int MAX_TABLE_INDEX = 0x37;
- const int TABLE_NUM = MAX_TABLE_INDEX + 1;
- class TagBits
- {
- public:
- static const uint32_t TypeDefOrRef = 2;
- static const uint32_t HasConstant = 2;
- static const uint32_t HasCustomAttribute = 5;
- static const uint32_t HasFieldMarshal = 1;
- static const uint32_t HasDeclSecurity = 2;
- static const uint32_t MemberRefParent = 3;
- static const uint32_t HasSemantics = 1;
- static const uint32_t MethodDefOrRef = 1;
- static const uint32_t MemberForwarded = 1;
- static const uint32_t Implementation = 2;
- static const uint32_t CustomAttributeType = 3;
- static const uint32_t ResoulutionScope = 2;
- static const uint32_t TypeOrMethodDef = 1;
- static const uint32_t HasCustomDebugInformation = 5;
- };
- const TableType HasCustomAttributeAssociateTables[] = {
- TableType::METHOD,
- TableType::FIELD,
- TableType::TYPEREF,
- TableType::TYPEDEF,
- TableType::PARAM,
- TableType::INTERFACEIMPL,
- TableType::MEMBERREF,
- TableType::MODULE,
- TableType::DECLSECURITY,
- TableType::PROPERTY,
- TableType::EVENT,
- TableType::STANDALONESIG,
- TableType::MODULEREF,
- TableType::TYPESPEC,
- TableType::ASSEMBLY,
- TableType::ASSEMBLYREF,
- TableType::FILE,
- TableType::EXPORTEDTYPE,
- TableType::MANIFESTRESOURCE,
- TableType::GENERICPARAM,
- TableType::GENERICPARAMCONSTRAINT,
- TableType::METHODSPEC,
- };
- const TableType HasCustomDebugInformation[] = {
- TableType::METHOD,
- TableType::FIELD,
- TableType::TYPEREF,
- TableType::TYPEDEF,
- TableType::PARAM,
- TableType::INTERFACEIMPL,
- TableType::MEMBERREF,
- TableType::MODULE,
- TableType::DECLSECURITY,
- TableType::PROPERTY,
- TableType::EVENT,
- TableType::STANDALONESIG,
- TableType::MODULEREF,
- TableType::TYPESPEC,
- TableType::ASSEMBLY,
- TableType::ASSEMBLYREF,
- TableType::FILE,
- TableType::EXPORTEDTYPE,
- TableType::MANIFESTRESOURCE,
- TableType::GENERICPARAM,
- TableType::GENERICPARAMCONSTRAINT,
- TableType::METHODSPEC,
- TableType::DOCUMENT,
- TableType::LOCALSCOPE,
- TableType::LOCALVARIABLE,
- TableType::LOCALCONSTANT,
- TableType::IMPORTSCOPE,
- };
- inline TableType DecodeTokenTableType(uint32_t index)
- {
- return TableType(index >> 24);
- }
- inline uint32_t DecodeTokenRowIndex(uint32_t index)
- {
- return index & 0xFFFFFF;
- }
- struct ColumnOffsetSize
- {
- uint32_t size;
- uint16_t offset;
- };
- enum class SigType
- {
- DEFAULT = 0,
- C = 1,
- ST_STDCALL = 2,
- ST_THISCALL = 3,
- ST_FASTCALL = 4,
- VARARG = 5,
- FIELD = 6,
- LOCAL_VAR = 7,
- PROPERTY_NOT_THIS = 8,
- GENERIC = 0x10,
- SENTINEL = 0x41,
- };
- const uint32_t kSigMask = 0x0F;
- inline SigType DecodeSigType(uint8_t rawSigType)
- {
- return (SigType)(rawSigType & kSigMask);
- }
- inline uint8_t DecodeSigFlags(uint8_t rawSigType)
- {
- return (uint8_t)(rawSigType & 0xF0);
- }
- inline uint32_t EncodeToken(TableType type, uint32_t index)
- {
- return ((uint32_t)type << 24) | index;
- }
- inline void DecodeToken(uint32_t token, TableType& type, uint32_t& rowIndex)
- {
- type = (TableType)(token >> 24);
- rowIndex = token & 0xFFFFFF;
- }
- enum class MethodSigFlags
- {
- HAS_THIS = 0x20,
- EXPLICITTHIS = 0x40,
- DEFAULT = 0x0,
- VARARG = 0x5,
- GENERIC = 0x10,
- };
- inline Il2CppTypeEnum GetElementType(Il2CppTypeEnum encodeType)
- {
- return (Il2CppTypeEnum)((uint8_t)encodeType & 0x3f);
- }
- inline TableType DecodeTypeDefOrRefOrSpecCodedIndexTableType(uint32_t encodedToken)
- {
- switch (encodedToken & 0x3)
- {
- case 0: return TableType::TYPEDEF;
- case 1: return TableType::TYPEREF;
- case 2: return TableType::TYPESPEC;
- default: IL2CPP_ASSERT(false); return (TableType)-1;
- }
- }
- inline uint32_t DecodeTypeDefOrRefOrSpecCodedIndexRowIndex(uint32_t encodedToken)
- {
- return encodedToken >> 2;
- }
- inline uint32_t EncodeTypeDefOrRefOrSpecCodedIndex(TableType type, uint32_t rowIndex)
- {
- uint32_t tableBits;
- switch (type)
- {
- case TableType::TYPEDEF: tableBits = 0; break;
- case TableType::TYPEREF: tableBits = 1; break;
- case TableType::TYPESPEC: tableBits = 2; break;
- default: IL2CPP_ASSERT(0); tableBits = 0; break;
- }
- return (rowIndex << 2) | tableBits;
- }
- inline uint32_t ConvertTypeDefOrRefOrSpecToken2CodedIndex(uint32_t token)
- {
- TableType type;
- uint32_t rowIndex;
- DecodeToken(token, type, rowIndex);
- uint32_t tableBits;
- switch (type)
- {
- case TableType::TYPEDEF: tableBits = 0; break;
- case TableType::TYPEREF: tableBits = 1; break;
- case TableType::TYPESPEC: tableBits = 2; break;
- default: IL2CPP_ASSERT(0); tableBits = 0; break;
- }
- return (rowIndex << 2) | tableBits;
- }
- inline void DecodeResolutionScopeCodedIndex(uint32_t encodedToken, TableType& tokenType, uint32_t& rawIndex)
- {
- switch (encodedToken & 0x3)
- {
- case 0: tokenType = TableType::MODULE; break;
- case 1: tokenType = TableType::MODULEREF; break;
- case 2: tokenType = TableType::ASSEMBLYREF; break;
- case 3: tokenType = TableType::TYPEREF; break;
- }
- rawIndex = encodedToken >> 2;
- }
- inline TableType DecodeTypeOrMethodDefCodedIndexTableType(uint32_t encodeIndex)
- {
- switch (encodeIndex & 0x1)
- {
- case 0: return TableType::TYPEDEF;
- case 1: return TableType::METHOD;
- }
- IL2CPP_ASSERT(false);
- return (TableType)-1;
- }
- inline uint32_t DecodeTypeOrMethodDefCodedIndexRowIndex(uint32_t encodeIndex)
- {
- return encodeIndex >> 1;
- }
- inline TableType DecodeMethodDefOrRefCodedIndexTableType(uint32_t token)
- {
- switch (token & 0x1)
- {
- case 0: return TableType::METHOD;
- case 1: return TableType::MEMBERREF;
- }
- return (TableType)-1;
- }
- inline uint32_t DecodeMethodDefOrRefCodedIndexRowIndex(uint32_t token)
- {
- return token >> 1;
- }
- inline uint32_t EncodeMethodDefOrRefCodedIndex(TableType type, uint32_t rowIndex)
- {
- IL2CPP_ASSERT(type == TableType::METHOD || type == TableType::MEMBERREF);
- return (rowIndex << 1) | (type != TableType::METHOD);
- }
- inline uint32_t ConvertMethodDefOrRefToken2CodedIndex(uint32_t token)
- {
- TableType type;
- uint32_t rowIndex;
- DecodeToken(token, type, rowIndex);
- return EncodeMethodDefOrRefCodedIndex(type, rowIndex);
- }
- inline TableType DecodeMemberRefParentType(uint32_t token)
- {
- switch (token & 0x7)
- {
- case 0: return TableType::TYPEDEF;
- case 1: return TableType::TYPEREF;
- case 2: return TableType::MODULEREF;
- case 3: return TableType::METHOD;
- case 4: return TableType::TYPESPEC;
- default: IL2CPP_ASSERT(false); return (TableType)-1;
- }
- }
- inline uint32_t DecodeMemberRefParentRowIndex(uint32_t token)
- {
- return token >> 3;
- }
- inline TableType DecodeFieldDefOrDefType(uint32_t encodeIndex)
- {
- switch (encodeIndex & 0x1)
- {
- case 0: return TableType::FIELD;
- case 1: return TableType::MEMBERREF;
- }
- return (TableType)-1;
- }
- inline uint32_t DecodeFieldDefOrDefTypeRowIndex(uint32_t encodeIndex)
- {
- return encodeIndex >> 1;
- }
- inline uint32_t EncodeFieldDefOrRefCodedIndex(TableType type, uint32_t rowIndex)
- {
- IL2CPP_ASSERT(type == TableType::FIELD || type == TableType::MEMBERREF);
- return (rowIndex << 1) | (type != TableType::FIELD);
- }
- inline uint32_t ConvertFieldDefOrRefToken2CodedIndex(uint32_t token)
- {
- TableType type;
- uint32_t rowIndex;
- DecodeToken(token, type, rowIndex);
- return EncodeFieldDefOrRefCodedIndex(type, rowIndex);
- }
- inline TableType DecodeMemberRefParentCodedIndexTableType(uint32_t encodeIndex)
- {
- switch ((encodeIndex & 0x7))
- {
- case 0: return TableType::TYPEDEF;
- case 1: return TableType::TYPEREF;
- case 2: return TableType::MODULEREF;
- case 3: return TableType::METHOD;
- case 4: return TableType::TYPESPEC;
- default: IL2CPP_ASSERT(false); return (TableType)-1;
- }
- }
- inline uint32_t DecodeMemberRefParentCodedIndexRowIndex(uint32_t encodeIndex)
- {
- return encodeIndex >> 3;
- }
- inline TableType DecodeHasCustomAttributeCodedIndexTableType(uint32_t codedIndex)
- {
- switch (codedIndex & 0x1f)
- {
- case 0: return TableType::METHOD;
- case 1: return TableType::FIELD;
- case 2: return TableType::TYPEREF;
- case 3: return TableType::TYPEDEF;
- case 4: return TableType::PARAM;
- case 5: return TableType::INTERFACEIMPL;
- case 6: return TableType::MEMBERREF;
- case 7: return TableType::MODULE;
- case 8: return TableType::DECLSECURITY;
- case 9: return TableType::PROPERTY;
- case 10: return TableType::EVENT;
- case 11: return TableType::STANDALONESIG;
- case 12: return TableType::MODULEREF;
- case 13: return TableType::TYPESPEC;
- case 14: return TableType::ASSEMBLY;
- case 15: return TableType::ASSEMBLYREF;
- case 16: return TableType::FILE;
- case 17: return TableType::EXPORTEDTYPE;
- case 18: return TableType::MANIFESTRESOURCE;
- case 19: return TableType::GENERICPARAM;
- case 20: return TableType::GENERICPARAMCONSTRAINT;
- case 21: return TableType::METHODSPEC;
- default: IL2CPP_ASSERT(false); return (TableType)-1;
- }
- }
- inline uint32_t DecodeHasCustomAttributeCodedIndexRowIndex(uint32_t codedIndex)
- {
- return codedIndex >> 5;
- }
- inline TableType DecodeCustomAttributeTypeCodedIndexTableType(uint32_t codeIndex)
- {
- switch (codeIndex & 0x7)
- {
- case 2: return TableType::METHOD;
- case 3: return TableType::MEMBERREF;
- default: IL2CPP_ASSERT(false); return (TableType)-1;
- }
- }
- inline uint32_t DecodeCustomAttributeTypeCodedIndexRowIndex(uint32_t codedIndex)
- {
- return codedIndex >> 3;
- }
- enum class UserStringEncoding
- {
- ASCII = 0,
- Unicode = 1,
- };
- struct ExceptionClause
- {
- CorILExceptionClauseType flags;
- uint32_t tryOffset;
- uint32_t tryLength;
- uint32_t handlerOffsets;
- uint32_t handlerLength;
- uint32_t classTokenOrFilterOffset;
- };
- struct MethodBody
- {
- uint32_t flags;
- uint32_t codeSize;
- const uint8_t* ilcodes;
- uint32_t maxStack;
- std::vector<ExceptionClause> exceptionClauses;
- il2cpp::utils::dynamic_array<const Il2CppType*> localVars;
- // optional data sections
- };
- struct MethodRefInfo
- {
- const Il2CppType* containerType; // maybe generic
- const Il2CppMethodDefinition* methodDef;
- const Il2CppGenericInst* instantiation;
- };
- struct MethodImpl
- {
- MethodRefInfo body;
- MethodRefInfo declaration;
- };
- struct MethodDefSig
- {
- const Il2CppType* classType;
- const char* name;
- uint32_t flags;
- uint32_t genericParamCount;
- const Il2CppType* returnType;
- il2cpp::utils::dynamic_array<const Il2CppType*> params;
- };
- struct MethodRefSig
- {
- uint32_t flags;
- uint32_t genericParamCount;
- const Il2CppType* returnType;
- il2cpp::utils::dynamic_array<const Il2CppType*> params;
- };
- struct FieldRefSig
- {
- const Il2CppType* type;
- };
- struct FieldRefInfo
- {
- const Il2CppType* containerType; // maybe generic
- const Il2CppFieldDefinition* field;
- };
- struct ResolveModuleRef
- {
- };
- struct ResolveMethodDef
- {
- const Il2CppMethodDefinition* methodDef;
- };
- struct ResolveMemberRefParent
- {
- TableType parentType;
- const Il2CppType* type; // TYPEREF, TYPEDEF,TYPESPEC
- ResolveModuleRef moduleRef;
- ResolveMethodDef methodDef;
- };
- struct ResolveMemberRefSig
- {
- TableType memberType; // FIELD_POINTER OR METHOD_POINTER
- MethodRefSig method;
- FieldRefSig field;
- };
- struct ResolveMemberRef
- {
- ResolveMemberRefParent parent;
- const char* name;
- ResolveMemberRefSig signature;
- };
- struct MemberRefInfo
- {
- TableType memberType;
- MethodRefInfo method;
- FieldRefInfo field;
- };
- struct ResolveStandAloneMethodSig
- {
- int32_t flags;
- const Il2CppType* returnType;
- il2cpp::utils::dynamic_array<const Il2CppType*> params;
- };
- inline TableType DecodeHasConstantType(uint32_t token)
- {
- switch (token & 0x3)
- {
- case 0: return TableType::FIELD;
- case 1: return TableType::PARAM;
- case 2: return TableType::PROPERTY;
- default: IL2CPP_ASSERT(false); return (TableType)-1;
- break;
- }
- }
- inline uint32_t DecodeHashConstantIndex(uint32_t token)
- {
- return token >> 2;
- }
- enum class MethodSemanticsAttributes
- {
- Setter = 0x1,
- Getter = 0x2,
- Other = 0x4,
- AddOn = 0x8,
- RemoveOn = 0x10,
- Fire = 0x20,
- };
- inline TableType DecodeHasSemanticsCodedIndexTableType(uint32_t codedIndex)
- {
- switch (codedIndex & 0x1)
- {
- case 0: return TableType::EVENT;
- case 1: return TableType::PROPERTY;
- }
- return (TableType)-1;
- }
- inline uint32_t DecodeHasSemanticsCodedIndexRowIndex(uint32_t codedIndex)
- {
- return codedIndex >> 1;
- }
- }
- }
|