[xbuild] Fix assembly name comparison when resolving references.
[mono.git] / mono / metadata / cil-coff.h
index cb1aa73336916a7eaedcb8bac9a989f0fabeb31f..91ede875aad5d2380ae75c6a422ec7937b8b09eb 100644 (file)
@@ -3,13 +3,13 @@
 #define __MONO_CIL_COFF_H__
 
 #include <mono/metadata/metadata.h>
+#include <glib.h>
 
 /*
  * 25.2.1: Method header type values
  */
-#define METHOD_HEADER_FORMAT_MASK   7
+#define METHOD_HEADER_FORMAT_MASK   3
 #define METHOD_HEADER_TINY_FORMAT   2
-#define METHOD_HEADER_TINY_FORMAT1  6
 #define METHOD_HEADER_FAT_FORMAT    3
 
 /*
 #define METHOD_HEADER_SECTION_FAT_FORMAT  0x40
 #define METHOD_HEADER_SECTION_MORE_SECTS  0x80
 
-/* A metadata token */
-typedef guint32 mtoken_t;
-
+/* 128 bytes */
 typedef struct {
-       char msdos_header [128];
-} msdos_header_t;
+       char    msdos_sig [2];
+       guint16 nlast_page;
+       guint16 npages;
+       char    msdos_header [54];
+       guint32 pe_offset;
+       char    msdos_header2 [64];
+} MonoMSDOSHeader;
 
+/* 20 bytes */
 typedef struct {
        guint16  coff_machine;
        guint16  coff_sections;
@@ -42,11 +46,12 @@ typedef struct {
        guint32  coff_symcount;
        guint16  coff_opt_header_size;
        guint16  coff_attributes;
-} coff_header_t;
+} MonoCOFFHeader;
 
 #define COFF_ATTRIBUTE_EXECUTABLE_IMAGE 0x0002
 #define COFF_ATTRIBUTE_LIBRARY_IMAGE    0x2000
 
+/* 28 bytes */
 typedef struct {
        guint16 pe_magic;
        guchar  pe_major;
@@ -57,8 +62,21 @@ typedef struct {
        guint32 pe_rva_entry_point;
        guint32 pe_rva_code_base;
        guint32 pe_rva_data_base;
-} pe_header_t;
+} MonoPEHeader;
 
+/* 24 bytes */
+typedef struct {
+       guint16 pe_magic;
+       guchar  pe_major;
+       guchar  pe_minor;
+       guint32 pe_code_size;
+       guint32 pe_data_size;
+       guint32 pe_uninit_data_size;
+       guint32 pe_rva_entry_point;
+       guint32 pe_rva_code_base;
+} MonoPEHeader64;
+
+/* 68 bytes */
 typedef struct {
        guint32 pe_image_base;          /* must be 0x400000 */
        guint32 pe_section_align;       /* must be 8192 */
@@ -81,39 +99,161 @@ typedef struct {
        guint32 pe_heap_commit;
        guint32 pe_loader_flags;
        guint32 pe_data_dir_count;
-} pe_header_nt_t;
+} MonoPEHeaderNT;
+
+/* 88 bytes */
+typedef struct {
+       guint64 pe_image_base;
+       guint32 pe_section_align;       /* must be 8192 */
+       guint32 pe_file_alignment;      /* must be 512 or 4096 */
+       guint16 pe_os_major;            /* must be 4 */
+       guint16 pe_os_minor;            /* must be 0 */
+       guint16 pe_user_major;
+       guint16 pe_user_minor;
+       guint16 pe_subsys_major;
+       guint16 pe_subsys_minor;
+       guint32 pe_reserved_1;
+       guint32 pe_image_size;
+       guint32 pe_header_size;
+       guint32 pe_checksum;
+       guint16 pe_subsys_required;
+       guint16 pe_dll_flags;
+       guint64 pe_stack_reserve;
+       guint64 pe_stack_commit;
+       guint64 pe_heap_reserve;
+       guint64 pe_heap_commit;
+       guint32 pe_loader_flags;
+       guint32 pe_data_dir_count;
+} MonoPEHeaderNT64;
+
+typedef struct {
+       guint32 rde_data_offset;
+       guint32 rde_size;
+       guint32 rde_codepage;
+       guint32 rde_reserved;
+} MonoPEResourceDataEntry;
+
+#define MONO_PE_RESOURCE_ID_CURSOR     0x01
+#define MONO_PE_RESOURCE_ID_BITMAP     0x02
+#define MONO_PE_RESOURCE_ID_ICON       0x03
+#define MONO_PE_RESOURCE_ID_MENU       0x04
+#define MONO_PE_RESOURCE_ID_DIALOG     0x05
+#define MONO_PE_RESOURCE_ID_STRING     0x06
+#define MONO_PE_RESOURCE_ID_FONTDIR    0x07
+#define MONO_PE_RESOURCE_ID_FONT       0x08
+#define MONO_PE_RESOURCE_ID_ACCEL      0x09
+#define MONO_PE_RESOURCE_ID_RCDATA     0x0a
+#define MONO_PE_RESOURCE_ID_MESSAGETABLE       0x0b
+#define MONO_PE_RESOURCE_ID_GROUP_CURSOR       0x0c
+#define MONO_PE_RESOURCE_ID_GROUP_ICON 0x0d
+#define MONO_PE_RESOURCE_ID_VERSION    0x10
+#define MONO_PE_RESOURCE_ID_DLGINCLUDE 0x11
+#define MONO_PE_RESOURCE_ID_PLUGPLAY   0x13
+#define MONO_PE_RESOURCE_ID_VXD                0x14
+#define MONO_PE_RESOURCE_ID_ANICURSOR  0x15
+#define MONO_PE_RESOURCE_ID_ANIICON    0x16
+#define MONO_PE_RESOURCE_ID_HTML       0x17
+#define MONO_PE_RESOURCE_ID_ASPNET_STRING      0x65
+
+typedef struct {
+       /* If the MSB is set, then the other 31 bits store the RVA of
+        * the unicode string containing the name.  Otherwise, the
+        * other 31 bits contain the ID of this entry.
+        */
+       guint32 name;
+
+       /* If the MSB is set, then the other 31 bits store the RVA of
+        * another subdirectory.  Otherwise, the other 31 bits store
+        * the RVA of the resource data entry leaf node.
+        */
+       guint32 dir;
+} MonoPEResourceDirEntry;
+
+#define MONO_PE_RES_DIR_ENTRY_NAME_IS_STRING(d)        (GUINT32_FROM_LE((d).name) >> 31)
+#define MONO_PE_RES_DIR_ENTRY_NAME_OFFSET(d)   (GUINT32_FROM_LE((d).name) & 0x7fffffff)
+#define MONO_PE_RES_DIR_ENTRY_SET_NAME(d,i,o)  ((d).name = GUINT32_TO_LE(((guint32)((i)?1:0) << 31) | ((o) & 0x7fffffff)))
+
+#define MONO_PE_RES_DIR_ENTRY_IS_DIR(d)                (GUINT32_FROM_LE((d).dir) >> 31)
+#define MONO_PE_RES_DIR_ENTRY_DIR_OFFSET(d)    (GUINT32_FROM_LE((d).dir) & 0x7fffffff)
+#define MONO_PE_RES_DIR_ENTRY_SET_DIR(d,i,o)   ((d).dir = GUINT32_TO_LE(((guint32)((i)?1:0) << 31) | ((o) & 0x7fffffff)))
+
+typedef struct 
+{
+       guint32 res_characteristics;
+       guint32 res_date_stamp;
+       guint16 res_major;
+       guint16 res_minor;
+       guint16 res_named_entries;
+       guint16 res_id_entries;
+       /* Directory entries follow on here.  The array is
+        * res_named_entries + res_id_entries long, containing all
+        * named entries first.
+        */
+} MonoPEResourceDir;
 
 typedef struct {
        guint32 rva;
        guint32 size;
-} pe_dir_entry_t;
-
-typedef struct {
-       pe_dir_entry_t pe_export_table;
-       pe_dir_entry_t pe_import_table;
-       pe_dir_entry_t pe_resource_table;
-       pe_dir_entry_t pe_exception_table;
-       pe_dir_entry_t pe_certificate_table;
-       pe_dir_entry_t pe_reloc_table;
-       pe_dir_entry_t pe_debug;
-       pe_dir_entry_t pe_copyright;
-       pe_dir_entry_t pe_global_ptr;
-       pe_dir_entry_t pe_tls_table;
-       pe_dir_entry_t pe_load_config_table;
-       pe_dir_entry_t pe_bound_import;
-       pe_dir_entry_t pe_iat;
-       pe_dir_entry_t pe_delay_import_desc;
-       pe_dir_entry_t pe_cli_header;
-       pe_dir_entry_t pe_reserved;
-} pe_datadir_t;
+} MonoPEDirEntry;
+
+/* 128 bytes */
+typedef struct {
+       MonoPEDirEntry pe_export_table;
+       MonoPEDirEntry pe_import_table;
+       MonoPEDirEntry pe_resource_table;
+       MonoPEDirEntry pe_exception_table;
+       MonoPEDirEntry pe_certificate_table;
+       MonoPEDirEntry pe_reloc_table;
+       MonoPEDirEntry pe_debug;
+       MonoPEDirEntry pe_copyright;
+       MonoPEDirEntry pe_global_ptr;
+       MonoPEDirEntry pe_tls_table;
+       MonoPEDirEntry pe_load_config_table;
+       MonoPEDirEntry pe_bound_import;
+       MonoPEDirEntry pe_iat;
+       MonoPEDirEntry pe_delay_import_desc;
+       MonoPEDirEntry pe_cli_header;
+       MonoPEDirEntry pe_reserved;
+} MonoPEDatadir;
+
+/* 248 bytes */
+typedef struct {
+       char            pesig [4];
+       MonoCOFFHeader  coff;
+       MonoPEHeader    pe;
+       MonoPEHeaderNT  nt;
+       MonoPEDatadir   datadir;
+} MonoDotNetHeader32;
 
+/* 248 bytes */
 typedef struct {
        char            pesig [4];
-       coff_header_t   coff;
-       pe_header_t     pe;
-       pe_header_nt_t  nt;
-       pe_datadir_t    datadir;
-} dotnet_header_t;
+       MonoCOFFHeader  coff;
+       MonoPEHeader    pe;
+       MonoPEHeaderNT  nt;
+       MonoPEDatadir   datadir;
+} MonoDotNetHeader;
+
+/* XX248 bytes */
+typedef struct {
+       char              pesig [4];
+       MonoCOFFHeader    coff;
+       MonoPEHeader64    pe;
+       MonoPEHeaderNT64  nt;
+       MonoPEDatadir     datadir;
+} MonoDotNetHeader64;
+
+#define VTFIXUP_TYPE_32BIT                            0x01
+#define VTFIXUP_TYPE_64BIT                            0x02
+#define VTFIXUP_TYPE_FROM_UNMANAGED                   0x04
+#define VTFIXUP_TYPE_FROM_UNMANAGED_RETAIN_APPDOMAIN  0x08
+#define VTFIXUP_TYPE_CALL_MOST_DERIVED                0x10
+
+typedef struct {
+       guint32 rva;
+       guint16 count;
+       guint16 type;
+} MonoVTableFixup;
 
 typedef struct {
        char    st_name [8];
@@ -138,48 +278,48 @@ typedef struct {
 #define SECT_FLAGS_MEM_WRITE              0x80000000
        guint32 st_flags;
 
-} section_table_t;
+} MonoSectionTable;
 
 typedef struct {
        guint32        ch_size;
        guint16        ch_runtime_major;
        guint16        ch_runtime_minor;
-       pe_dir_entry_t ch_metadata;
+       MonoPEDirEntry ch_metadata;
 
 #define CLI_FLAGS_ILONLY         0x01
 #define CLI_FLAGS_32BITREQUIRED  0x02
+#define CLI_FLAGS_STRONGNAMESIGNED 0x8
 #define CLI_FLAGS_TRACKDEBUGDATA 0x00010000
        guint32        ch_flags;
 
-       mtoken_t       ch_entry_point;
-       pe_dir_entry_t ch_resources;
-       pe_dir_entry_t ch_strong_name;
-       pe_dir_entry_t ch_code_manager_table;
-       pe_dir_entry_t ch_vtable_fixups;
-       pe_dir_entry_t ch_export_address_table_jumps;
+       guint32        ch_entry_point;
+       MonoPEDirEntry ch_resources;
+       MonoPEDirEntry ch_strong_name;
+       MonoPEDirEntry ch_code_manager_table;
+       MonoPEDirEntry ch_vtable_fixups;
+       MonoPEDirEntry ch_export_address_table_jumps;
 
        /* The following are zero in the current docs */
-       pe_dir_entry_t ch_eeinfo_table;
-       pe_dir_entry_t ch_helper_table;
-       pe_dir_entry_t ch_dynamic_info;
-       pe_dir_entry_t ch_delay_load_info;
-       pe_dir_entry_t ch_module_image;
-       pe_dir_entry_t ch_external_fixups;
-       pe_dir_entry_t ch_ridmap;
-       pe_dir_entry_t ch_debug_map;
-       pe_dir_entry_t ch_ip_map;
-} cli_header_t;
+       MonoPEDirEntry ch_eeinfo_table;
+       MonoPEDirEntry ch_helper_table;
+       MonoPEDirEntry ch_dynamic_info;
+       MonoPEDirEntry ch_delay_load_info;
+       MonoPEDirEntry ch_module_image;
+       MonoPEDirEntry ch_external_fixups;
+       MonoPEDirEntry ch_ridmap;
+       MonoPEDirEntry ch_debug_map;
+       MonoPEDirEntry ch_ip_map;
+} MonoCLIHeader;
 
 /* This is not an on-disk structure */
 typedef struct {
-       dotnet_header_t   cli_header;
+       MonoDotNetHeader  cli_header;
        int               cli_section_count;
-       section_table_t  *cli_section_tables;
+       MonoSectionTable  *cli_section_tables;
        void            **cli_sections;
-       cli_header_t      cli_cli_header;
-} cli_image_info_t;
+       MonoCLIHeader     cli_cli_header;
+} MonoCLIImageInfo;
 
-guint32       cli_rva_image_map (cli_image_info_t *iinfo, guint32 rva);
-char         *cli_rva_map       (cli_image_info_t *iinfo, guint32 rva);
+guint32       mono_cli_rva_image_map (MonoImage *image, guint32 rva);
 
 #endif /* __MONO_CIL_COFF_H__ */