diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2010-10-24 17:35:42 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2010-10-24 17:35:42 +0000 |
commit | 800fd3533c2c862c88bcfd86694e2fd9875c461f (patch) | |
tree | 895c4772964fb25a5a70adf1065a00144c446aa5 /llvm | |
parent | e16a5300baf930a0c74c81955444a63d45ac4bef (diff) | |
download | bcm5719-llvm-800fd3533c2c862c88bcfd86694e2fd9875c461f.tar.gz bcm5719-llvm-800fd3533c2c862c88bcfd86694e2fd9875c461f.zip |
Add X86::reloc_global_offset_table and use it to have a single place where
we check for _GLOBAL_OFFSET_TABLE_.
llvm-svn: 117241
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/MC/ELFObjectWriter.cpp | 9 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86AsmBackend.cpp | 1 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86FixupKinds.h | 5 | ||||
-rw-r--r-- | llvm/lib/Target/X86/X86MCCodeEmitter.cpp | 11 |
4 files changed, 16 insertions, 10 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index dad69eb14ab..db33af67d6f 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -701,6 +701,10 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, switch ((unsigned)Fixup.getKind()) { default: llvm_unreachable("invalid fixup kind!"); + case X86::reloc_global_offset_table: + Type = ELF::R_386_GOTPC; + break; + // FIXME: Should we avoid selecting reloc_signed_4byte in 32 bit mode // instead? case X86::reloc_signed_4byte: @@ -710,10 +714,7 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, default: llvm_unreachable("Unimplemented"); case MCSymbolRefExpr::VK_None: - if (Symbol->getName() == "_GLOBAL_OFFSET_TABLE_") - Type = ELF::R_386_GOTPC; - else - Type = ELF::R_386_32; + Type = ELF::R_386_32; break; case MCSymbolRefExpr::VK_GOT: Type = ELF::R_386_GOT32; diff --git a/llvm/lib/Target/X86/X86AsmBackend.cpp b/llvm/lib/Target/X86/X86AsmBackend.cpp index 17db41a76bb..be5671919dc 100644 --- a/llvm/lib/Target/X86/X86AsmBackend.cpp +++ b/llvm/lib/Target/X86/X86AsmBackend.cpp @@ -39,6 +39,7 @@ static unsigned getFixupKindLog2Size(unsigned Kind) { case X86::reloc_riprel_4byte: case X86::reloc_riprel_4byte_movq_load: case X86::reloc_signed_4byte: + case X86::reloc_global_offset_table: case FK_Data_4: return 2; case FK_Data_8: return 3; } diff --git a/llvm/lib/Target/X86/X86FixupKinds.h b/llvm/lib/Target/X86/X86FixupKinds.h index f408a413f04..64ee3eb3304 100644 --- a/llvm/lib/Target/X86/X86FixupKinds.h +++ b/llvm/lib/Target/X86/X86FixupKinds.h @@ -20,9 +20,12 @@ enum Fixups { reloc_pcrel_2byte, // 16-bit pcrel, e.g. callw reloc_riprel_4byte, // 32-bit rip-relative reloc_riprel_4byte_movq_load, // 32-bit rip-relative in movq - reloc_signed_4byte // 32-bit signed. Unlike FK_Data_4 + reloc_signed_4byte, // 32-bit signed. Unlike FK_Data_4 // this will be sign extended at // runtime. + reloc_global_offset_table // 32-bit, relative to the start + // of the instruction. Used only + // for _GLOBAL_OFFSET_TABLE_. }; } } diff --git a/llvm/lib/Target/X86/X86MCCodeEmitter.cpp b/llvm/lib/Target/X86/X86MCCodeEmitter.cpp index 47e91a8159c..950fdf107a2 100644 --- a/llvm/lib/Target/X86/X86MCCodeEmitter.cpp +++ b/llvm/lib/Target/X86/X86MCCodeEmitter.cpp @@ -39,7 +39,7 @@ public: ~X86MCCodeEmitter() {} unsigned getNumFixupKinds() const { - return 6; + return 7; } const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const { @@ -49,7 +49,8 @@ public: { "reloc_pcrel_2byte", 0, 2 * 8, MCFixupKindInfo::FKF_IsPCRel }, { "reloc_riprel_4byte", 0, 4 * 8, MCFixupKindInfo::FKF_IsPCRel }, { "reloc_riprel_4byte_movq_load", 0, 4 * 8, MCFixupKindInfo::FKF_IsPCRel }, - { "reloc_signed_4byte", 0, 4 * 8, 0} + { "reloc_signed_4byte", 0, 4 * 8, 0}, + { "reloc_global_offset_table", 0, 4 * 8, 0} }; if (Kind < FirstTargetFixupKind) @@ -229,10 +230,10 @@ EmitImmediate(const MCOperand &DispOp, unsigned Size, MCFixupKind FixupKind, // If we have an immoffset, add it to the expression. const MCExpr *Expr = DispOp.getExpr(); - if (StartsWithGlobalOffsetTable(Expr)) { - // FIXME: We should probably change the FixupKind to a special one so that - // other parts of MC don't have to check the symbol name. + if (FixupKind == FK_Data_4 && StartsWithGlobalOffsetTable(Expr)) { assert(ImmOffset == 0); + + FixupKind = MCFixupKind(X86::reloc_global_offset_table); ImmOffset = CurByte; } |