aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2010-09-23 17:25:18 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2010-09-23 17:25:18 +0000
commitb142bef30b2e2ef0c978f5f3041f1d4a429eb9b2 (patch)
tree21ff97626b7a0206390a1592819f3993f65b1c51
parentedf017487ffdd52cd42f3129c0e6b78fffb31e89 (diff)
Represent relocations against local symbols as relocations against the section
they are in. Both ways should be equivalent, but gas produces relocations against the section. Roman wrote the patch, I added the test. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114667 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/MC/ELFObjectWriter.cpp2
-rw-r--r--test/MC/ELF/local-reloc.s32
2 files changed, 33 insertions, 1 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp
index 513a509b69..7960a07499 100644
--- a/lib/MC/ELFObjectWriter.cpp
+++ b/lib/MC/ELFObjectWriter.cpp
@@ -502,7 +502,7 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm,
}
if (Base) {
- if (F && (!Symbol->isInSection() || SD.isCommon()) && !SD.isExternal()) {
+ if (F && !SD.isExternal()) {
Index = F->getParent()->getOrdinal() + LocalSymbolData.size() + 1;
Value += Layout.getSymbolAddress(&SD);
} else
diff --git a/test/MC/ELF/local-reloc.s b/test/MC/ELF/local-reloc.s
new file mode 100644
index 0000000000..e5a3d4cce5
--- /dev/null
+++ b/test/MC/ELF/local-reloc.s
@@ -0,0 +1,32 @@
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump --dump-section-data | FileCheck %s
+
+// Test that relocations with local symbols are represented as relocations
+// with the section. They should be equivalent, but gas behaves like this.
+
+ movl foo, %r14d
+foo:
+
+// Section number 1 is .text
+// CHECK: # Section 1
+// CHECK-next: (('sh_name', 1) # '.text'
+
+
+// Relocation refers to symbol number 2
+// CHECK: ('_relocations', [
+// CHECK-NEXT: # Relocation 0
+// CHECK-NEXT: (('r_offset',
+// CHECK-NEXT: ('r_sym', 2)
+// CHECK-NEXT: ('r_type',
+// CHECK-NEXT: ('r_addend',
+// CHECK-NEXT: ),
+// CHECK-NEXT: ])
+
+// Symbol number 2 is section number 1
+// CHECK: # Symbol 2
+// CHECK-NEXT: (('st_name', 0) # ''
+// CHECK-NEXT: ('st_bind', 0)
+// CHECK-NEXT: ('st_type', 3)
+// CHECK-NEXT: ('st_other', 0)
+// CHECK-NEXT: ('st_shndx', 1)
+// CHECK-NEXT: ('st_value', 0)
+// CHECK-NEXT: ('st_size', 0)