[llvm-commits] [llvm] r115623 - in /llvm/trunk: lib/MC/ELFObjectWriter.cpp test/MC/ELF/got.s
Rafael Espindola
rafael.espindola at gmail.com
Tue Oct 5 08:48:37 PDT 2010
Author: rafael
Date: Tue Oct 5 10:48:37 2010
New Revision: 115623
URL: http://llvm.org/viewvc/llvm-project?rev=115623&view=rev
Log:
Produce a undefined reference to _GLOBAL_OFFSET_TABLE_ when needed.
Modified:
llvm/trunk/lib/MC/ELFObjectWriter.cpp
llvm/trunk/test/MC/ELF/got.s
Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=115623&r1=115622&r2=115623&view=diff
==============================================================================
--- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Tue Oct 5 10:48:37 2010
@@ -70,6 +70,17 @@
}
}
+static bool RelocNeedsGOT(unsigned Type) {
+ switch (Type) {
+ default:
+ return false;
+ case ELF::R_X86_64_GOT32:
+ case ELF::R_X86_64_PLT32:
+ case ELF::R_X86_64_GOTPCREL:
+ return true;
+ }
+}
+
namespace {
class ELFObjectWriterImpl {
@@ -133,6 +144,8 @@
int NumRegularSections;
+ bool NeedsGOT;
+
ELFObjectWriter *Writer;
raw_ostream &OS;
@@ -153,7 +166,7 @@
public:
ELFObjectWriterImpl(ELFObjectWriter *_Writer, bool _Is64Bit,
bool _HasRelAddend, Triple::OSType _OSType)
- : Writer(_Writer), OS(Writer->getStream()),
+ : NeedsGOT(false), Writer(_Writer), OS(Writer->getStream()),
Is64Bit(_Is64Bit), HasRelocationAddend(_HasRelAddend),
OSType(_OSType) {
}
@@ -647,6 +660,9 @@
}
}
+ if (RelocNeedsGOT(Type))
+ NeedsGOT = true;
+
ELFRelocationEntry ERE;
ERE.Index = Index;
@@ -677,6 +693,14 @@
}
void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm) {
+ // FIXME: Is this the correct place to do this?
+ if (NeedsGOT) {
+ llvm::StringRef Name = "_GLOBAL_OFFSET_TABLE_";
+ MCSymbol *Sym = Asm.getContext().GetOrCreateSymbol(Name);
+ MCSymbolData &Data = Asm.getOrCreateSymbolData(*Sym);
+ Data.setExternal(true);
+ }
+
// Build section lookup table.
NumRegularSections = Asm.size();
DenseMap<const MCSection*, uint8_t> SectionIndexMap;
Modified: llvm/trunk/test/MC/ELF/got.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/got.s?rev=115623&r1=115622&r2=115623&view=diff
==============================================================================
--- llvm/trunk/test/MC/ELF/got.s (original)
+++ llvm/trunk/test/MC/ELF/got.s Tue Oct 5 10:48:37 2010
@@ -1,10 +1,14 @@
// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump | FileCheck %s
-// Test that this produces a R_X86_64_GOT32.
+// Test that this produces a R_X86_64_GOT32 and that we have an undefined
+// reference to _GLOBAL_OFFSET_TABLE_.
movl foo at GOT, %eax
movl foo at GOTPCREL(%rip), %eax
+// CHECK: (('st_name', 5) # '_GLOBAL_OFFSET_TABLE_'
+// CHECK-NEXT: ('st_bind', 1)
+
// CHECK: ('_relocations', [
// CHECK-NEXT: # Relocation 0
// CHECK-NEXT: (('r_offset',
More information about the llvm-commits
mailing list