diff options
author | Fangrui Song <maskray@google.com> | 2018-06-12 16:20:44 +0000 |
---|---|---|
committer | Fangrui Song <maskray@google.com> | 2018-06-12 16:20:44 +0000 |
commit | f72cdb50bef481d0a2057c9e55b3612a6c05b839 (patch) | |
tree | 62a7c4d30140bf343d324a77193fb8c3b9518ecf /llvm/lib | |
parent | 5d49f665704523fece06d9621b3deeb5dc4b44e6 (diff) | |
download | bcm5719-llvm-f72cdb50bef481d0a2057c9e55b3612a6c05b839.tar.gz bcm5719-llvm-f72cdb50bef481d0a2057c9e55b3612a6c05b839.zip |
[MC] [X86] Teach leaq _GLOBAL_OFFSET_TABLE(%rip), %r15 to use R_X86_64_GOTPC32 instead of R_X86_64_PC32
Summary:
This is similar to D46319 (ARM). x86-64 psABI p40 gives an example:
leaq _GLOBAL_OFFSET_TABLE(%rip), %r15 # GOTPC32 reloc
GNU as creates R_X86_64_GOTPC32. However, MC currently emits R_X86_64_PC32.
Reviewers: javed.absar, echristo
Subscribers: kristof.beyls, llvm-commits, peter.smith, grimar
Differential Revision: https://reviews.llvm.org/D47507
llvm-svn: 334515
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp index 7e434175ec5..3c60181c20f 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp @@ -350,8 +350,14 @@ EmitImmediate(const MCOperand &DispOp, SMLoc Loc, unsigned Size, FixupKind == MCFixupKind(X86::reloc_riprel_4byte_movq_load) || FixupKind == MCFixupKind(X86::reloc_riprel_4byte_relax) || FixupKind == MCFixupKind(X86::reloc_riprel_4byte_relax_rex) || - FixupKind == MCFixupKind(X86::reloc_branch_4byte_pcrel)) + FixupKind == MCFixupKind(X86::reloc_branch_4byte_pcrel)) { ImmOffset -= 4; + // If this is a pc-relative load off _GLOBAL_OFFSET_TABLE_: + // leaq _GLOBAL_OFFSET_TABLE_(%rip), %r15 + // this needs to be a GOTPC32 relocation. + if (StartsWithGlobalOffsetTable(Expr) != GOT_None) + FixupKind = MCFixupKind(X86::reloc_global_offset_table); + } if (FixupKind == FK_PCRel_2) ImmOffset -= 2; if (FixupKind == FK_PCRel_1) |