ObjCStructs.h   [plain text]


/// WriteModernMetadataDeclarations - Writes out metadata declarations for modern ABI.
/// struct _prop_t {
///   const char *name;
///   char *attributes;
/// }

template<typename _uintptr_t>
struct _prop_t {
  _uintptr_t name;
  _uintptr_t attributes;
};

/// struct _prop_list_t {
///   uint32_t entsize;      // sizeof(struct _prop_t)
///   uint32_t count_of_properties;
///   struct _prop_t prop_list[count_of_properties];
/// }

template<typename _uintptr_t>
struct _prop_list_t {
  uint32_t entsize;
  uint32_t count_of_properties;
  _uintptr_t prop_list;
};

/// struct _protocol_list_t {
///   long protocol_count;   // Note, this is 32/64 bit
///   struct _protocol_t * protocol_list[protocol_count];
/// }

template<typename _uintptr_t>
struct _protocol_list_t {
  _uintptr_t protocol_count;
  _uintptr_t protocol_list;
};

/// struct _objc_method {
///   SEL _cmd;
///   const char *method_type;
///   char *_imp;
/// }

template<typename _uintptr_t>
struct _objc_method {
  _uintptr_t _cmd;
  _uintptr_t method_type;
  _uintptr_t _imp;
};

/// struct _method_list_t {
///   uint32_t entsize;  // sizeof(struct _objc_method)
///   uint32_t method_count;
///   struct _objc_method method_list[method_count];
/// }

template<typename _uintptr_t>
struct _method_list_t {
  uint32_t entsize;
  uint32_t method_count;
  //_uintptr_t method_list;
};

/// struct _protocol_t {
///   id isa;  // NULL
///   const char *protocol_name;
///   const struct _protocol_list_t * protocol_list; // super protocols
///   const struct method_list_t *instance_methods;
///   const struct method_list_t *class_methods;
///   const struct method_list_t *optionalInstanceMethods;
///   const struct method_list_t *optionalClassMethods;
///   const struct _prop_list_t * properties;
///   const uint32_t size;  // sizeof(struct _protocol_t)
///   const uint32_t flags;  // = 0
///   const char ** extendedMethodTypes;
/// }

template<typename _uintptr_t>
struct _protocol_t {
  _uintptr_t isa;
  _uintptr_t protocol_name;
  _uintptr_t protocol_list;
  _uintptr_t instance_methods;
  _uintptr_t class_methods;
  _uintptr_t optionalInstanceMethods;
  _uintptr_t optionalClassMethods;
  _uintptr_t properties;
  uint32_t  size;
  uint32_t flags;
  _uintptr_t extendedMethodTypes;
};

/// struct _ivar_t {
///   unsigned long int *offset;  // pointer to ivar offset location
///   const char *name;
///   const char *type;
///   uint32_t alignment;
///   uint32_t size;
/// }

/// struct _ivar_list_t {
///   uint32 entsize;  // sizeof(struct _ivar_t)
///   uint32 count;
///   struct _ivar_t list[count];
/// }

/// struct _class_ro_t {
///   uint32_t flags;
///   uint32_t instanceStart;
///   uint32_t instanceSize;
///   uint32_t reserved;  // only when building for 64bit targets
///   const uint8_t *ivarLayout;
///   const char *name;
///   const struct _method_list_t *baseMethods;
///   const struct _protocol_list_t *baseProtocols;
///   const struct _ivar_list_t *ivars;
///   const uint8_t *weakIvarLayout;
///   const struct _prop_list_t *properties;
/// }

template<typename _uintptr_t>
struct _class_ro_t {
  uint32_t flags;
  uint32_t instanceStart;
  uint32_t instanceSize;
  uint32_t reserved;
  _uintptr_t ivarLayout;
  _uintptr_t name;
  _uintptr_t baseMethods;
  _uintptr_t baseProtocols;
  _uintptr_t ivars;
  _uintptr_t weakIvarLayout;
  _uintptr_t properties;
};

template<>
struct _class_ro_t<uint32_t> {
  uint32_t flags;
  uint32_t instanceStart;
  uint32_t instanceSize;
  uint32_t ivarLayout;
  uint32_t name;
  uint32_t baseMethods;
  uint32_t baseProtocols;
  uint32_t ivars;
  uint32_t weakIvarLayout;
  uint32_t properties;
};

/// struct _class_t {
///   struct _class_t *isa;
///   struct _class_t *superclass;
///   void *cache;
///   IMP *vtable;
///   struct _class_ro_t *ro;
/// }

template<typename _uintptr_t>
struct _class_t {
  _uintptr_t isa;
  _uintptr_t superclass;
  _uintptr_t cache;
  _uintptr_t vtable;
  _uintptr_t ro;
};

/// struct _category_t {
///   const char *name;
///   struct _class_t *cls;
///   const struct _method_list_t *instance_methods;
///   const struct _method_list_t *class_methods;
///   const struct _protocol_list_t *protocols;
///   const struct _prop_list_t *properties;
/// }

template<typename _uintptr_t>
struct _category_t {
  _uintptr_t name;
  _uintptr_t cls;
  _uintptr_t instance_methods;
  _uintptr_t class_methods;
  _uintptr_t protocols;
  _uintptr_t properties;
};

/// MessageRefTy - LLVM for:
/// struct _message_ref_t {
///   IMP messenger;
///   SEL name;
/// };

/// SuperMessageRefTy - LLVM for:
/// struct _super_message_ref_t {
///   SUPER_IMP messenger;
///   SEL name;
/// };