mirror of
https://github.com/intel/llvm.git
synced 2026-01-27 14:50:42 +08:00
[llvm][SystemZ] Recognize @GOTENT modifier in assembler. (#107038)
Closes #105918. I'm unsure if there are other places that need to be updated for this.
This commit is contained in:
committed by
GitHub
parent
ebc7f55780
commit
bedac64d36
@@ -192,6 +192,7 @@ public:
|
||||
VK_Invalid,
|
||||
|
||||
VK_GOT,
|
||||
VK_GOTENT,
|
||||
VK_GOTOFF,
|
||||
VK_GOTREL,
|
||||
VK_PCREL,
|
||||
|
||||
@@ -226,6 +226,7 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
|
||||
case VK_DTPOFF: return "DTPOFF";
|
||||
case VK_DTPREL: return "DTPREL";
|
||||
case VK_GOT: return "GOT";
|
||||
case VK_GOTENT: return "GOTENT";
|
||||
case VK_GOTOFF: return "GOTOFF";
|
||||
case VK_GOTREL: return "GOTREL";
|
||||
case VK_PCREL: return "PCREL";
|
||||
@@ -404,137 +405,138 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
|
||||
MCSymbolRefExpr::VariantKind
|
||||
MCSymbolRefExpr::getVariantKindForName(StringRef Name) {
|
||||
return StringSwitch<VariantKind>(Name.lower())
|
||||
.Case("dtprel", VK_DTPREL)
|
||||
.Case("dtpoff", VK_DTPOFF)
|
||||
.Case("got", VK_GOT)
|
||||
.Case("gotoff", VK_GOTOFF)
|
||||
.Case("gotrel", VK_GOTREL)
|
||||
.Case("pcrel", VK_PCREL)
|
||||
.Case("gotpcrel", VK_GOTPCREL)
|
||||
.Case("gotpcrel_norelax", VK_GOTPCREL_NORELAX)
|
||||
.Case("gottpoff", VK_GOTTPOFF)
|
||||
.Case("indntpoff", VK_INDNTPOFF)
|
||||
.Case("ntpoff", VK_NTPOFF)
|
||||
.Case("gotntpoff", VK_GOTNTPOFF)
|
||||
.Case("plt", VK_PLT)
|
||||
.Case("tlscall", VK_TLSCALL)
|
||||
.Case("tlsdesc", VK_TLSDESC)
|
||||
.Case("tlsgd", VK_TLSGD)
|
||||
.Case("tlsld", VK_TLSLD)
|
||||
.Case("tlsldm", VK_TLSLDM)
|
||||
.Case("tpoff", VK_TPOFF)
|
||||
.Case("tprel", VK_TPREL)
|
||||
.Case("tlvp", VK_TLVP)
|
||||
.Case("tlvppage", VK_TLVPPAGE)
|
||||
.Case("tlvppageoff", VK_TLVPPAGEOFF)
|
||||
.Case("page", VK_PAGE)
|
||||
.Case("pageoff", VK_PAGEOFF)
|
||||
.Case("gotpage", VK_GOTPAGE)
|
||||
.Case("gotpageoff", VK_GOTPAGEOFF)
|
||||
.Case("imgrel", VK_COFF_IMGREL32)
|
||||
.Case("secrel32", VK_SECREL)
|
||||
.Case("size", VK_SIZE)
|
||||
.Case("abs8", VK_X86_ABS8)
|
||||
.Case("pltoff", VK_X86_PLTOFF)
|
||||
.Case("l", VK_PPC_LO)
|
||||
.Case("h", VK_PPC_HI)
|
||||
.Case("ha", VK_PPC_HA)
|
||||
.Case("high", VK_PPC_HIGH)
|
||||
.Case("higha", VK_PPC_HIGHA)
|
||||
.Case("higher", VK_PPC_HIGHER)
|
||||
.Case("highera", VK_PPC_HIGHERA)
|
||||
.Case("highest", VK_PPC_HIGHEST)
|
||||
.Case("highesta", VK_PPC_HIGHESTA)
|
||||
.Case("got@l", VK_PPC_GOT_LO)
|
||||
.Case("got@h", VK_PPC_GOT_HI)
|
||||
.Case("got@ha", VK_PPC_GOT_HA)
|
||||
.Case("local", VK_PPC_LOCAL)
|
||||
.Case("tocbase", VK_PPC_TOCBASE)
|
||||
.Case("toc", VK_PPC_TOC)
|
||||
.Case("toc@l", VK_PPC_TOC_LO)
|
||||
.Case("toc@h", VK_PPC_TOC_HI)
|
||||
.Case("toc@ha", VK_PPC_TOC_HA)
|
||||
.Case("u", VK_PPC_U)
|
||||
.Case("l", VK_PPC_L)
|
||||
.Case("tls", VK_PPC_TLS)
|
||||
.Case("dtpmod", VK_PPC_DTPMOD)
|
||||
.Case("tprel@l", VK_PPC_TPREL_LO)
|
||||
.Case("tprel@h", VK_PPC_TPREL_HI)
|
||||
.Case("tprel@ha", VK_PPC_TPREL_HA)
|
||||
.Case("tprel@high", VK_PPC_TPREL_HIGH)
|
||||
.Case("tprel@higha", VK_PPC_TPREL_HIGHA)
|
||||
.Case("tprel@higher", VK_PPC_TPREL_HIGHER)
|
||||
.Case("tprel@highera", VK_PPC_TPREL_HIGHERA)
|
||||
.Case("tprel@highest", VK_PPC_TPREL_HIGHEST)
|
||||
.Case("tprel@highesta", VK_PPC_TPREL_HIGHESTA)
|
||||
.Case("dtprel@l", VK_PPC_DTPREL_LO)
|
||||
.Case("dtprel@h", VK_PPC_DTPREL_HI)
|
||||
.Case("dtprel@ha", VK_PPC_DTPREL_HA)
|
||||
.Case("dtprel@high", VK_PPC_DTPREL_HIGH)
|
||||
.Case("dtprel@higha", VK_PPC_DTPREL_HIGHA)
|
||||
.Case("dtprel@higher", VK_PPC_DTPREL_HIGHER)
|
||||
.Case("dtprel@highera", VK_PPC_DTPREL_HIGHERA)
|
||||
.Case("dtprel@highest", VK_PPC_DTPREL_HIGHEST)
|
||||
.Case("dtprel@highesta", VK_PPC_DTPREL_HIGHESTA)
|
||||
.Case("got@tprel", VK_PPC_GOT_TPREL)
|
||||
.Case("got@tprel@l", VK_PPC_GOT_TPREL_LO)
|
||||
.Case("got@tprel@h", VK_PPC_GOT_TPREL_HI)
|
||||
.Case("got@tprel@ha", VK_PPC_GOT_TPREL_HA)
|
||||
.Case("got@dtprel", VK_PPC_GOT_DTPREL)
|
||||
.Case("got@dtprel@l", VK_PPC_GOT_DTPREL_LO)
|
||||
.Case("got@dtprel@h", VK_PPC_GOT_DTPREL_HI)
|
||||
.Case("got@dtprel@ha", VK_PPC_GOT_DTPREL_HA)
|
||||
.Case("got@tlsgd", VK_PPC_GOT_TLSGD)
|
||||
.Case("got@tlsgd@l", VK_PPC_GOT_TLSGD_LO)
|
||||
.Case("got@tlsgd@h", VK_PPC_GOT_TLSGD_HI)
|
||||
.Case("got@tlsgd@ha", VK_PPC_GOT_TLSGD_HA)
|
||||
.Case("got@tlsld", VK_PPC_GOT_TLSLD)
|
||||
.Case("got@tlsld@l", VK_PPC_GOT_TLSLD_LO)
|
||||
.Case("got@tlsld@h", VK_PPC_GOT_TLSLD_HI)
|
||||
.Case("got@tlsld@ha", VK_PPC_GOT_TLSLD_HA)
|
||||
.Case("got@pcrel", VK_PPC_GOT_PCREL)
|
||||
.Case("got@tlsgd@pcrel", VK_PPC_GOT_TLSGD_PCREL)
|
||||
.Case("got@tlsld@pcrel", VK_PPC_GOT_TLSLD_PCREL)
|
||||
.Case("got@tprel@pcrel", VK_PPC_GOT_TPREL_PCREL)
|
||||
.Case("tls@pcrel", VK_PPC_TLS_PCREL)
|
||||
.Case("notoc", VK_PPC_NOTOC)
|
||||
.Case("gdgot", VK_Hexagon_GD_GOT)
|
||||
.Case("gdplt", VK_Hexagon_GD_PLT)
|
||||
.Case("iegot", VK_Hexagon_IE_GOT)
|
||||
.Case("ie", VK_Hexagon_IE)
|
||||
.Case("ldgot", VK_Hexagon_LD_GOT)
|
||||
.Case("ldplt", VK_Hexagon_LD_PLT)
|
||||
.Case("lo8", VK_AVR_LO8)
|
||||
.Case("hi8", VK_AVR_HI8)
|
||||
.Case("hlo8", VK_AVR_HLO8)
|
||||
.Case("typeindex", VK_WASM_TYPEINDEX)
|
||||
.Case("tbrel", VK_WASM_TBREL)
|
||||
.Case("mbrel", VK_WASM_MBREL)
|
||||
.Case("tlsrel", VK_WASM_TLSREL)
|
||||
.Case("got@tls", VK_WASM_GOT_TLS)
|
||||
.Case("funcindex", VK_WASM_FUNCINDEX)
|
||||
.Case("gotpcrel32@lo", VK_AMDGPU_GOTPCREL32_LO)
|
||||
.Case("gotpcrel32@hi", VK_AMDGPU_GOTPCREL32_HI)
|
||||
.Case("rel32@lo", VK_AMDGPU_REL32_LO)
|
||||
.Case("rel32@hi", VK_AMDGPU_REL32_HI)
|
||||
.Case("rel64", VK_AMDGPU_REL64)
|
||||
.Case("abs32@lo", VK_AMDGPU_ABS32_LO)
|
||||
.Case("abs32@hi", VK_AMDGPU_ABS32_HI)
|
||||
.Case("hi", VK_VE_HI32)
|
||||
.Case("lo", VK_VE_LO32)
|
||||
.Case("pc_hi", VK_VE_PC_HI32)
|
||||
.Case("pc_lo", VK_VE_PC_LO32)
|
||||
.Case("got_hi", VK_VE_GOT_HI32)
|
||||
.Case("got_lo", VK_VE_GOT_LO32)
|
||||
.Case("gotoff_hi", VK_VE_GOTOFF_HI32)
|
||||
.Case("gotoff_lo", VK_VE_GOTOFF_LO32)
|
||||
.Case("plt_hi", VK_VE_PLT_HI32)
|
||||
.Case("plt_lo", VK_VE_PLT_LO32)
|
||||
.Case("tls_gd_hi", VK_VE_TLS_GD_HI32)
|
||||
.Case("tls_gd_lo", VK_VE_TLS_GD_LO32)
|
||||
.Case("tpoff_hi", VK_VE_TPOFF_HI32)
|
||||
.Case("tpoff_lo", VK_VE_TPOFF_LO32)
|
||||
.Default(VK_Invalid);
|
||||
.Case("dtprel", VK_DTPREL)
|
||||
.Case("dtpoff", VK_DTPOFF)
|
||||
.Case("got", VK_GOT)
|
||||
.Case("gotent", VK_GOTENT)
|
||||
.Case("gotoff", VK_GOTOFF)
|
||||
.Case("gotrel", VK_GOTREL)
|
||||
.Case("pcrel", VK_PCREL)
|
||||
.Case("gotpcrel", VK_GOTPCREL)
|
||||
.Case("gotpcrel_norelax", VK_GOTPCREL_NORELAX)
|
||||
.Case("gottpoff", VK_GOTTPOFF)
|
||||
.Case("indntpoff", VK_INDNTPOFF)
|
||||
.Case("ntpoff", VK_NTPOFF)
|
||||
.Case("gotntpoff", VK_GOTNTPOFF)
|
||||
.Case("plt", VK_PLT)
|
||||
.Case("tlscall", VK_TLSCALL)
|
||||
.Case("tlsdesc", VK_TLSDESC)
|
||||
.Case("tlsgd", VK_TLSGD)
|
||||
.Case("tlsld", VK_TLSLD)
|
||||
.Case("tlsldm", VK_TLSLDM)
|
||||
.Case("tpoff", VK_TPOFF)
|
||||
.Case("tprel", VK_TPREL)
|
||||
.Case("tlvp", VK_TLVP)
|
||||
.Case("tlvppage", VK_TLVPPAGE)
|
||||
.Case("tlvppageoff", VK_TLVPPAGEOFF)
|
||||
.Case("page", VK_PAGE)
|
||||
.Case("pageoff", VK_PAGEOFF)
|
||||
.Case("gotpage", VK_GOTPAGE)
|
||||
.Case("gotpageoff", VK_GOTPAGEOFF)
|
||||
.Case("imgrel", VK_COFF_IMGREL32)
|
||||
.Case("secrel32", VK_SECREL)
|
||||
.Case("size", VK_SIZE)
|
||||
.Case("abs8", VK_X86_ABS8)
|
||||
.Case("pltoff", VK_X86_PLTOFF)
|
||||
.Case("l", VK_PPC_LO)
|
||||
.Case("h", VK_PPC_HI)
|
||||
.Case("ha", VK_PPC_HA)
|
||||
.Case("high", VK_PPC_HIGH)
|
||||
.Case("higha", VK_PPC_HIGHA)
|
||||
.Case("higher", VK_PPC_HIGHER)
|
||||
.Case("highera", VK_PPC_HIGHERA)
|
||||
.Case("highest", VK_PPC_HIGHEST)
|
||||
.Case("highesta", VK_PPC_HIGHESTA)
|
||||
.Case("got@l", VK_PPC_GOT_LO)
|
||||
.Case("got@h", VK_PPC_GOT_HI)
|
||||
.Case("got@ha", VK_PPC_GOT_HA)
|
||||
.Case("local", VK_PPC_LOCAL)
|
||||
.Case("tocbase", VK_PPC_TOCBASE)
|
||||
.Case("toc", VK_PPC_TOC)
|
||||
.Case("toc@l", VK_PPC_TOC_LO)
|
||||
.Case("toc@h", VK_PPC_TOC_HI)
|
||||
.Case("toc@ha", VK_PPC_TOC_HA)
|
||||
.Case("u", VK_PPC_U)
|
||||
.Case("l", VK_PPC_L)
|
||||
.Case("tls", VK_PPC_TLS)
|
||||
.Case("dtpmod", VK_PPC_DTPMOD)
|
||||
.Case("tprel@l", VK_PPC_TPREL_LO)
|
||||
.Case("tprel@h", VK_PPC_TPREL_HI)
|
||||
.Case("tprel@ha", VK_PPC_TPREL_HA)
|
||||
.Case("tprel@high", VK_PPC_TPREL_HIGH)
|
||||
.Case("tprel@higha", VK_PPC_TPREL_HIGHA)
|
||||
.Case("tprel@higher", VK_PPC_TPREL_HIGHER)
|
||||
.Case("tprel@highera", VK_PPC_TPREL_HIGHERA)
|
||||
.Case("tprel@highest", VK_PPC_TPREL_HIGHEST)
|
||||
.Case("tprel@highesta", VK_PPC_TPREL_HIGHESTA)
|
||||
.Case("dtprel@l", VK_PPC_DTPREL_LO)
|
||||
.Case("dtprel@h", VK_PPC_DTPREL_HI)
|
||||
.Case("dtprel@ha", VK_PPC_DTPREL_HA)
|
||||
.Case("dtprel@high", VK_PPC_DTPREL_HIGH)
|
||||
.Case("dtprel@higha", VK_PPC_DTPREL_HIGHA)
|
||||
.Case("dtprel@higher", VK_PPC_DTPREL_HIGHER)
|
||||
.Case("dtprel@highera", VK_PPC_DTPREL_HIGHERA)
|
||||
.Case("dtprel@highest", VK_PPC_DTPREL_HIGHEST)
|
||||
.Case("dtprel@highesta", VK_PPC_DTPREL_HIGHESTA)
|
||||
.Case("got@tprel", VK_PPC_GOT_TPREL)
|
||||
.Case("got@tprel@l", VK_PPC_GOT_TPREL_LO)
|
||||
.Case("got@tprel@h", VK_PPC_GOT_TPREL_HI)
|
||||
.Case("got@tprel@ha", VK_PPC_GOT_TPREL_HA)
|
||||
.Case("got@dtprel", VK_PPC_GOT_DTPREL)
|
||||
.Case("got@dtprel@l", VK_PPC_GOT_DTPREL_LO)
|
||||
.Case("got@dtprel@h", VK_PPC_GOT_DTPREL_HI)
|
||||
.Case("got@dtprel@ha", VK_PPC_GOT_DTPREL_HA)
|
||||
.Case("got@tlsgd", VK_PPC_GOT_TLSGD)
|
||||
.Case("got@tlsgd@l", VK_PPC_GOT_TLSGD_LO)
|
||||
.Case("got@tlsgd@h", VK_PPC_GOT_TLSGD_HI)
|
||||
.Case("got@tlsgd@ha", VK_PPC_GOT_TLSGD_HA)
|
||||
.Case("got@tlsld", VK_PPC_GOT_TLSLD)
|
||||
.Case("got@tlsld@l", VK_PPC_GOT_TLSLD_LO)
|
||||
.Case("got@tlsld@h", VK_PPC_GOT_TLSLD_HI)
|
||||
.Case("got@tlsld@ha", VK_PPC_GOT_TLSLD_HA)
|
||||
.Case("got@pcrel", VK_PPC_GOT_PCREL)
|
||||
.Case("got@tlsgd@pcrel", VK_PPC_GOT_TLSGD_PCREL)
|
||||
.Case("got@tlsld@pcrel", VK_PPC_GOT_TLSLD_PCREL)
|
||||
.Case("got@tprel@pcrel", VK_PPC_GOT_TPREL_PCREL)
|
||||
.Case("tls@pcrel", VK_PPC_TLS_PCREL)
|
||||
.Case("notoc", VK_PPC_NOTOC)
|
||||
.Case("gdgot", VK_Hexagon_GD_GOT)
|
||||
.Case("gdplt", VK_Hexagon_GD_PLT)
|
||||
.Case("iegot", VK_Hexagon_IE_GOT)
|
||||
.Case("ie", VK_Hexagon_IE)
|
||||
.Case("ldgot", VK_Hexagon_LD_GOT)
|
||||
.Case("ldplt", VK_Hexagon_LD_PLT)
|
||||
.Case("lo8", VK_AVR_LO8)
|
||||
.Case("hi8", VK_AVR_HI8)
|
||||
.Case("hlo8", VK_AVR_HLO8)
|
||||
.Case("typeindex", VK_WASM_TYPEINDEX)
|
||||
.Case("tbrel", VK_WASM_TBREL)
|
||||
.Case("mbrel", VK_WASM_MBREL)
|
||||
.Case("tlsrel", VK_WASM_TLSREL)
|
||||
.Case("got@tls", VK_WASM_GOT_TLS)
|
||||
.Case("funcindex", VK_WASM_FUNCINDEX)
|
||||
.Case("gotpcrel32@lo", VK_AMDGPU_GOTPCREL32_LO)
|
||||
.Case("gotpcrel32@hi", VK_AMDGPU_GOTPCREL32_HI)
|
||||
.Case("rel32@lo", VK_AMDGPU_REL32_LO)
|
||||
.Case("rel32@hi", VK_AMDGPU_REL32_HI)
|
||||
.Case("rel64", VK_AMDGPU_REL64)
|
||||
.Case("abs32@lo", VK_AMDGPU_ABS32_LO)
|
||||
.Case("abs32@hi", VK_AMDGPU_ABS32_HI)
|
||||
.Case("hi", VK_VE_HI32)
|
||||
.Case("lo", VK_VE_LO32)
|
||||
.Case("pc_hi", VK_VE_PC_HI32)
|
||||
.Case("pc_lo", VK_VE_PC_LO32)
|
||||
.Case("got_hi", VK_VE_GOT_HI32)
|
||||
.Case("got_lo", VK_VE_GOT_LO32)
|
||||
.Case("gotoff_hi", VK_VE_GOTOFF_HI32)
|
||||
.Case("gotoff_lo", VK_VE_GOTOFF_LO32)
|
||||
.Case("plt_hi", VK_VE_PLT_HI32)
|
||||
.Case("plt_lo", VK_VE_PLT_LO32)
|
||||
.Case("tls_gd_hi", VK_VE_TLS_GD_HI32)
|
||||
.Case("tls_gd_lo", VK_VE_TLS_GD_LO32)
|
||||
.Case("tpoff_hi", VK_VE_TPOFF_HI32)
|
||||
.Case("tpoff_lo", VK_VE_TPOFF_LO32)
|
||||
.Default(VK_Invalid);
|
||||
}
|
||||
|
||||
/* *** */
|
||||
|
||||
@@ -185,6 +185,7 @@ unsigned SystemZELFObjectWriter::getRelocType(MCContext &Ctx,
|
||||
return getTLSGDReloc(Ctx, Loc, Kind);
|
||||
|
||||
case MCSymbolRefExpr::VK_GOT:
|
||||
case MCSymbolRefExpr::VK_GOTENT:
|
||||
if (IsPCRel && Kind == SystemZ::FK_390_PC32DBL)
|
||||
return ELF::R_390_GOTENT;
|
||||
Ctx.reportError(Loc, "Only PC-relative GOT accesses are supported for now");
|
||||
|
||||
@@ -19,6 +19,12 @@
|
||||
.align 16
|
||||
larl %r14, target@got
|
||||
|
||||
# CHECK: larl %r14, target@GOTENT # encoding: [0xc0,0xe0,A,A,A,A]
|
||||
# CHECK-NEXT: # fixup A - offset: 2, value: target@GOTENT+2, kind: FK_390_PC32DBL
|
||||
# CHECK-REL: 0x{{[0-9A-F]*2}} R_390_GOTENT target 0x2
|
||||
.align 16
|
||||
larl %r14, target@gotent
|
||||
|
||||
# CHECK: larl %r14, target@INDNTPOFF # encoding: [0xc0,0xe0,A,A,A,A]
|
||||
# CHECK-NEXT: # fixup A - offset: 2, value: target@INDNTPOFF+2, kind: FK_390_PC32DBL
|
||||
# CHECK-REL: 0x{{[0-9A-F]*2}} R_390_TLS_IEENT target 0x2
|
||||
|
||||
Reference in New Issue
Block a user