GlobalMetadata.h 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #pragma once
  2. #include <stdint.h>
  3. #include "Assembly.h"
  4. #include "MetadataCache.h"
  5. #include "StackTrace.h"
  6. #include "il2cpp-class-internals.h"
  7. #include "il2cpp-config.h"
  8. #include "metadata/Il2CppTypeVector.h"
  9. #include "os/Mutex.h"
  10. #include "utils/dynamic_array.h"
  11. struct MethodInfo;
  12. struct Il2CppClass;
  13. struct Il2CppGenericContext;
  14. struct Il2CppGenericInst;
  15. struct Il2CppGenericMethod;
  16. struct Il2CppType;
  17. struct Il2CppString;
  18. namespace il2cpp
  19. {
  20. namespace vm
  21. {
  22. class GlobalMetadata
  23. {
  24. public:
  25. static void Register(const Il2CppCodeRegistration* const codeRegistration, const Il2CppMetadataRegistration* const metadataRegistration, const Il2CppCodeGenOptions* const codeGenOptions);
  26. static bool Initialize(int32_t* imagesCount, int32_t* assembliesCount);
  27. static void InitializeAllMethodMetadata();
  28. static void* InitializeRuntimeMetadata(uintptr_t* metadataPointer, bool throwOnError);
  29. static void InitializeStringLiteralTable();
  30. static void InitializeWindowsRuntimeTypeNamesTables(WindowsRuntimeTypeNameToClassMap& windowsRuntimeTypeNameToClassMap, ClassToWindowsRuntimeTypeNameMap& classToWindowsRuntimeTypeNameMap);
  31. static void InitializeUnresolvedSignatureTable(Il2CppUnresolvedSignatureMap& unresolvedSignatureMap);
  32. static void InitializeGenericMethodTable(Il2CppMethodTableMap& methodTableMap);
  33. static void BuildIl2CppImage(Il2CppImage* image, ImageIndex imageIndex, AssemblyIndex* imageAssemblyIndex);
  34. static void BuildIl2CppAssembly(Il2CppAssembly* assembly, AssemblyIndex assemblyIndex, ImageIndex* assemblyImageIndex);
  35. static void Clear();
  36. static const MethodInfo* GetAssemblyEntryPoint(const Il2CppImage* image);
  37. static Il2CppMetadataTypeHandle GetAssemblyTypeHandle(const Il2CppImage* image, AssemblyTypeIndex index);
  38. static const Il2CppAssembly* GetReferencedAssembly(const Il2CppAssembly* assembly, int32_t referencedAssemblyTableIndex, const Il2CppAssembly assembliesTable[], int assembliesCount);
  39. static Il2CppMetadataTypeHandle GetAssemblyExportedTypeHandle(const Il2CppImage* image, AssemblyExportedTypeIndex index);
  40. static Il2CppClass* GetTypeInfoFromType(const Il2CppType* type);
  41. static Il2CppClass* GetTypeInfoFromHandle(Il2CppMetadataTypeHandle handle);
  42. static const Il2CppType* GetInterfaceFromOffset(const Il2CppClass* klass, TypeInterfaceIndex offset);
  43. static Il2CppInterfaceOffsetInfo GetInterfaceOffsetInfo(const Il2CppClass* klass, TypeInterfaceOffsetIndex index);
  44. static Il2CppMetadataTypeHandle GetTypeHandleFromIndex(TypeDefinitionIndex typeIndex);
  45. static Il2CppMetadataTypeHandle GetTypeHandleFromType(const Il2CppType* type);
  46. static bool TypeIsNested(Il2CppMetadataTypeHandle handle);
  47. static bool TypeIsValueType(Il2CppMetadataTypeHandle handle);
  48. static bool StructLayoutPackIsDefault(Il2CppMetadataTypeHandle handle);
  49. static int32_t StructLayoutPack(Il2CppMetadataTypeHandle handle);
  50. static bool StructLayoutSizeIsDefault(Il2CppMetadataTypeHandle handle);
  51. static std::pair<const char*, const char*> GetTypeNamespaceAndName(Il2CppMetadataTypeHandle handle);
  52. static Il2CppClass* GetNestedTypeFromOffset(const Il2CppClass* klass, TypeNestedTypeIndex offset);
  53. static Il2CppMetadataTypeHandle GetNestedTypes(Il2CppMetadataTypeHandle handle, void** iter);
  54. static CustomAttributesCache* GenerateCustomAttributesCache(const Il2CppImage* image, uint32_t token);
  55. static CustomAttributesCache* GenerateCustomAttributesCache(Il2CppMetadataCustomAttributeHandle handle);
  56. static Il2CppMetadataCustomAttributeHandle GetCustomAttributeTypeToken(const Il2CppImage* image, uint32_t token);
  57. static bool HasAttribute(Il2CppMetadataCustomAttributeHandle token, Il2CppClass* attribute);
  58. static bool HasAttribute(const Il2CppImage* image, uint32_t token, Il2CppClass* attribute);
  59. static const MethodInfo* GetMethodInfoFromMethodHandle(Il2CppMetadataMethodDefinitionHandle handle);
  60. static const MethodInfo* GetMethodInfoFromVTableSlot(const Il2CppClass* klass, int32_t vTableSlot);
  61. static const uint8_t* GetParameterDefaultValue(const MethodInfo* method, const ParameterInfo* parameter, const Il2CppType** type, bool* isExplicitySetNullDefaultValue);
  62. static const uint8_t* GetFieldDefaultValue(const FieldInfo* field, const Il2CppType** type);
  63. static uint32_t GetFieldOffset(const Il2CppClass* klass, int32_t fieldIndexInType, FieldInfo* field);
  64. static int GetFieldMarshaledSizeForField(const FieldInfo* field);
  65. static Il2CppMetadataFieldInfo GetFieldInfo(const Il2CppClass* klass, TypeFieldIndex index);
  66. static Il2CppMetadataMethodInfo GetMethodInfo(const Il2CppClass* klass, TypeMethodIndex index);
  67. static Il2CppMetadataParameterInfo GetParameterInfo(const Il2CppClass* klass, Il2CppMetadataMethodDefinitionHandle handle, MethodParameterIndex index);
  68. static Il2CppMetadataPropertyInfo GetPropertyInfo(const Il2CppClass* klass, TypePropertyIndex index);
  69. static Il2CppMetadataEventInfo GetEventInfo(const Il2CppClass* klass, TypeEventIndex index);
  70. static Il2CppMetadataGenericContainerHandle GetGenericContainerFromGenericClass(const Il2CppGenericClass* genericClass);
  71. static Il2CppMetadataGenericContainerHandle GetGenericContainerFromMethod(Il2CppMetadataMethodDefinitionHandle handle);
  72. static Il2CppMetadataGenericParameterHandle GetGenericParameterFromType(const Il2CppType* type);
  73. static const MethodInfo* GetGenericInstanceMethod(const MethodInfo* genericMethodDefinition, const Il2CppGenericContext* context);
  74. static const Il2CppType* GetTypeFromRgctxDefinition(const Il2CppRGCTXDefinition* rgctxDef);
  75. static const Il2CppGenericMethod* GetGenericMethodFromRgctxDefinition(const Il2CppRGCTXDefinition* rgctxDef);
  76. static Il2CppClass* GetContainerDeclaringType(Il2CppMetadataGenericContainerHandle handle);
  77. static Il2CppClass* GetParameterDeclaringType(Il2CppMetadataGenericParameterHandle handle);
  78. static Il2CppMetadataGenericParameterHandle GetGenericParameterFromIndex(Il2CppMetadataGenericContainerHandle handle, GenericContainerParameterIndex index);
  79. static const Il2CppType* GetGenericParameterConstraintFromIndex(Il2CppMetadataGenericParameterHandle handle, GenericParameterConstraintIndex index);
  80. static void MakeGenericArgType(Il2CppMetadataGenericContainerHandle containerHandle, Il2CppMetadataGenericParameterHandle paramHandle, Il2CppType* arg);
  81. static uint32_t GetGenericContainerCount(Il2CppMetadataGenericContainerHandle handle);
  82. static bool GetGenericContainerIsMethod(Il2CppMetadataGenericContainerHandle handle);
  83. static const char* GetGenericParameterName(Il2CppMetadataGenericParameterHandle handle);
  84. static Il2CppGenericParameterInfo GetGenericParameterInfo(Il2CppMetadataGenericParameterHandle handle);
  85. static uint16_t GetGenericParameterFlags(Il2CppMetadataGenericContainerHandle handle, GenericContainerParameterIndex index);
  86. static int16_t GetGenericConstraintCount(Il2CppMetadataGenericParameterHandle handle);
  87. static const Il2CppGenericMethod* GetGenericMethodFromTokenMethodTuple(const Il2CppTokenIndexMethodTuple* tuple);
  88. static const MethodInfo* GetMethodInfoFromCatchPoint(const Il2CppCatchPoint* cp);
  89. static const MethodInfo* GetMethodInfoFromSequencePoint(const Il2CppSequencePoint* cp);
  90. static Il2CppClass* GetTypeInfoFromTypeSourcePair(const Il2CppTypeSourceFilePair* pair);
  91. static Il2CppClass* GetTypeInfoFromTypeIndex(TypeIndex index, bool throwOnError = true);
  92. static const Il2CppType* GetIl2CppTypeFromIndex(TypeIndex index);
  93. template<typename T>
  94. static inline bool IsRuntimeMetadataInitialized(T item)
  95. {
  96. // Runtime metadata items are initialized to an encoded token with the low bit set
  97. // on startup and when intialized are a pointer to an runtime metadata item
  98. // So we can rely on pointer allignment being > 1 on our supported platforms
  99. return !((uintptr_t)item & 1);
  100. }
  101. #if IL2CPP_ENABLE_NATIVE_STACKTRACES
  102. static void GetAllManagedMethods(std::vector<MethodDefinitionKey>& managedMethods);
  103. #endif
  104. };
  105. }
  106. }