Only clear the thumb bit from function addresses.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 3 Apr 2014 02:20:43 +0000 (02:20 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 3 Apr 2014 02:20:43 +0000 (02:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205500 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/ELFObjectFile.h
test/Object/Inputs/thumb-symbols.elf.arm [new file with mode: 0644]
test/Object/nm-trivial-object.test

index e2c5fc77fc49fbbe131792346c93dfc9c60435a3..9bdee9f56946d8031fbd81e0a5d21af10a31762f 100644 (file)
@@ -292,7 +292,8 @@ error_code ELFObjectFile<ELFT>::getSymbolAddress(DataRefImpl Symb,
   Result = ESym->st_value;
 
   // Clear the ARM/Thumb indicator flag.
-  if (Header->e_machine == ELF::EM_ARM)
+  if (EF.getHeader()->e_machine == ELF::EM_ARM &&
+      ESym->getType() == ELF::STT_FUNC)
     Result &= ~1;
 
   if (Header->e_type == ELF::ET_REL)
diff --git a/test/Object/Inputs/thumb-symbols.elf.arm b/test/Object/Inputs/thumb-symbols.elf.arm
new file mode 100644 (file)
index 0000000..923eef6
Binary files /dev/null and b/test/Object/Inputs/thumb-symbols.elf.arm differ
index ee0c3ffd8e19f5aa0a255644ef3a3a3824b9a719..4e90f9609c68a07242c20d40cee993d7fcf7607a 100644 (file)
@@ -18,6 +18,9 @@ RUN: llvm-nm %p/Inputs/common.coff-i386 \
 RUN:         | FileCheck %s -check-prefix COFF-COMMON
 RUN: llvm-nm %p/Inputs/relocatable-with-section-address.elf-x86-64 \
 RUN:         | FileCheck %s -check-prefix ELF-SEC-ADDR
+RUN: llvm-nm %p/Inputs/thumb-symbols.elf.arm \
+RUN:         | FileCheck %s -check-prefix ELF-THUMB
+
 
 COFF: 00000000 d .data
 COFF: 00000000 t .text
@@ -64,3 +67,8 @@ ELF-SEC-ADDR-NEXT: 0000005c D b
 ELF-SEC-ADDR-NEXT: 00000040 T f
 ELF-SEC-ADDR-NEXT: 00000050 T g
 ELF-SEC-ADDR-NEXT: 00000060 D p
+
+
+Test that we drop the thumb bit only from function addresses.
+ELF-THUMB: 00000000 t f
+ELF-THUMB: 00000003 t g