diff options
Diffstat (limited to 'llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp')
-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) |