15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- X86RelocationFunction.h --------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
95460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#define DECL_X86_32_APPLY_RELOC_FUNC(Name) \
116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesstatic X86Relocator::Result Name(Relocation& pEntry, X86_32Relocator& pParent);
125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#define DECL_X86_32_APPLY_RELOC_FUNCS \
146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_32_APPLY_RELOC_FUNC(none)             \
156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_32_APPLY_RELOC_FUNC(abs)              \
166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_32_APPLY_RELOC_FUNC(rel)              \
176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_32_APPLY_RELOC_FUNC(plt32)            \
186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_32_APPLY_RELOC_FUNC(got32)            \
196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_32_APPLY_RELOC_FUNC(gotoff32)         \
206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_32_APPLY_RELOC_FUNC(gotpc32)          \
216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_32_APPLY_RELOC_FUNC(tls_gd)           \
226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_32_APPLY_RELOC_FUNC(tls_ie)           \
236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_32_APPLY_RELOC_FUNC(tls_gotie)        \
246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_32_APPLY_RELOC_FUNC(tls_le)           \
256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_32_APPLY_RELOC_FUNC(tls_ldm)          \
266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_32_APPLY_RELOC_FUNC(tls_ldo_32)       \
276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_32_APPLY_RELOC_FUNC(unsupport)
285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#define DECL_X86_32_APPLY_RELOC_FUNC_PTRS \
316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &none,               0, "R_386_NONE",             0  },  \
326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &abs,                1, "R_386_32",               32 },  \
336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &rel,                2, "R_386_PC32",             32 },  \
346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &got32,              3, "R_386_GOT32",            32 },  \
356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &plt32,              4, "R_386_PLT32",            32 },  \
366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &none,               5, "R_386_COPY",             0  },  \
376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &none,               6, "R_386_GLOB_DAT",         0  },  \
386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &none,               7, "R_386_JMP_SLOT",         0  },  \
396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &none,               8, "R_386_RELATIVE",         0  },  \
406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &gotoff32,           9, "R_386_GOTOFF",           32 },  \
416f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &gotpc32,           10, "R_386_GOTPC",            32 },  \
426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         11, "R_386_32PLT",            0  },  \
436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         12, "",                       0  },  \
446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         13, "",                       0  },  \
456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         14, "R_386_TLS_TPOFF",        0  },  \
466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &tls_ie,            15, "R_386_TLS_IE",           0  },  \
476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &tls_gotie,         16, "R_386_TLS_GOTIE",        0  },  \
486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &tls_le,            17, "R_386_TLS_LE",           0  },  \
496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &tls_gd,            18, "R_386_TLS_GD",           0  },  \
506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &tls_ldm,           19, "R_386_TLS_LDM",          0  },  \
516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &abs,               20, "R_386_16",               16 },  \
526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &rel,               21, "R_386_PC16",             16 },  \
536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &abs,               22, "R_386_8",                8  },  \
546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &rel,               23, "R_386_PC8",              8  },  \
556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         24, "R_386_TLS_GD_32",        0  },  \
566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         25, "R_386_TLS_GD_PUSH",      0  },  \
576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         26, "R_386_TLS_GD_CALL",      0  },  \
586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         27, "R_386_TLS_GD_POP",       0  },  \
596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         28, "R_386_TLS_LDM_32",       0  },  \
606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         29, "R_386_TLS_LDM_PUSH",     0  },  \
616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         30, "R_386_TLS_LDM_CALL",     0  },  \
626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         31, "R_386_TLS_LDM_POP",      0  },  \
636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &tls_ldo_32,        32, "R_386_TLS_LDO_32",       0  },  \
646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         33, "R_386_TLS_IE_32",        0  },  \
656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         34, "R_386_TLS_LE_32",        0  },  \
666f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         35, "R_386_TLS_DTPMOD32",     0  },  \
676f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         36, "R_386_TLS_DTPOFF32",     0  },  \
686f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         37, "R_386_TLS_TPOFF32",      0  },  \
696f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         38, "",                       0  },  \
706f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         39, "R_386_TLS_GOTDESC",      0  },  \
716f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         40, "R_386_TLS_DESC_CALL",    0  },  \
726f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         41, "R_386_TLS_DESC",         0  },  \
736f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         42, "R_386_IRELATIVE",        0  },  \
746f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         43, "R_386_NUM",              0  },  \
756f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &none,              44, "R_386_TLS_OPT",          0  }
766f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
776f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#define DECL_X86_64_APPLY_RELOC_FUNC(Name) \
786f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesstatic X86Relocator::Result Name(Relocation& pEntry, X86_64Relocator& pParent);
796f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
806f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#define DECL_X86_64_APPLY_RELOC_FUNCS \
816f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_64_APPLY_RELOC_FUNC(none)             \
826f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_64_APPLY_RELOC_FUNC(abs)              \
836f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_64_APPLY_RELOC_FUNC(signed32)         \
846f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_64_APPLY_RELOC_FUNC(gotpcrel)         \
856f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_64_APPLY_RELOC_FUNC(plt32)            \
866f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_64_APPLY_RELOC_FUNC(rel)              \
876f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen HinesDECL_X86_64_APPLY_RELOC_FUNC(unsupport)
886f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
896f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#define DECL_X86_64_APPLY_RELOC_FUNC_PTRS \
906f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &none,               0, "R_X86_64_NONE",            0  },  \
916f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &abs,                1, "R_X86_64_64",              64 },  \
926f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &rel,                2, "R_X86_64_PC32",            32 },  \
936f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,          3, "R_X86_64_GOT32",           32 },  \
946f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &plt32,              4, "R_X86_64_PLT32",           32 },  \
956f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &none,               5, "R_X86_64_COPY",            0  },  \
966f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &none,               6, "R_X86_64_GLOB_DAT",        0  },  \
976f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &none,               7, "R_X86_64_JMP_SLOT",        0  },  \
986f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &none,               8, "R_X86_64_RELATIVE",        0  },  \
996f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &gotpcrel,           9, "R_X86_64_GOTPCREL",        32 },  \
1006f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &abs,               10, "R_X86_64_32",              32 },  \
1016f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &signed32,          11, "R_X86_64_32S",             32 },  \
1026f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &abs,               12, "R_X86_64_16",              16 },  \
1036f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &rel,               13, "R_X86_64_PC16",            16 },  \
1046f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &abs,               14, "R_X86_64_8",               8  },  \
1056f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &rel,               15, "R_X86_64_PC8",             8  },  \
1066f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &none,              16, "R_X86_64_DTPMOD64",        0  },  \
1076f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         17, "R_X86_64_DTPOFF64",        0  },  \
1086f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &none,              18, "R_X86_64_TPOFF64",         0  },  \
1096f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         19, "R_X86_64_TLSGD",           0  },  \
1106f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         20, "R_X86_64_TLSLD",           0  },  \
1116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         21, "R_X86_64_DTPOFF32",        0  },  \
1126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         22, "R_X86_64_GOTTPOFF",        0  },  \
1136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         23, "R_X86_64_TPOFF32",         0  },  \
1146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         24, "R_X86_64_PC64",            64 },  \
1156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         25, "R_X86_64_GOTOFF64",        64 },  \
1166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         26, "R_X86_64_GOTPC32",         32 },  \
1176f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         27, "R_X86_64_GOT64",           64 },  \
1186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         28, "R_X86_64_GOTPCREL64",      64 },  \
1196f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         29, "R_X86_64_GOTPC64",         64 },  \
1206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         30, "R_X86_64_GOTPLT64",        64 },  \
1216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         31, "R_X86_64_PLTOFF64",        64 },  \
1226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         32, "R_X86_64_SIZE32",          32 },  \
1236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         33, "R_X86_64_SIZE64",          64 },  \
1246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         34, "R_X86_64_GOTPC32_TLSDESC", 0  },  \
1256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &unsupport,         35, "R_X86_64_TLSDESC_CALL",    0  },  \
1266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &none,              36, "R_X86_64_TLSDESC",         0  },  \
1276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &none,              37, "R_X86_64_IRELATIVE",       0  },  \
1286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  { &none,              38, "R_X86_64_RELATIVE64",      0  }
129