summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2019-02-22 08:45:21 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2019-02-22 08:45:21 +0000
commit11358dd65d29a7ae50861aa5711092d7e9dd66d0 (patch)
tree28ffe2cba36a31f0b881dc4e6248e1a7cd738dff
parent151100787d35ebdba8584f3c3df7b9db33749190 (diff)
downloadbcm5719-llvm-11358dd65d29a7ae50861aa5711092d7e9dd66d0.tar.gz
bcm5719-llvm-11358dd65d29a7ae50861aa5711092d7e9dd66d0.zip
[obj2yaml] - Do not miss section index for special symbols.
This fixes https://bugs.llvm.org/show_bug.cgi?id=40786 ("obj2yaml symbol output missing section index for SHN_ABS and SHN_COMMON symbols") Since SHN_ABS and SHN_COMMON symbols are special, we should preserve the st_shndx for them. The patch does this for them and the other special symbols. The test case is based on the test provided by James Henderson at the bug page! Differential revision: https://reviews.llvm.org/D58498 llvm-svn: 354661
-rw-r--r--llvm/test/tools/obj2yaml/Inputs/shn_xindex.obin0 -> 403 bytes
-rw-r--r--llvm/test/tools/obj2yaml/special-symbol-indices.yaml46
-rw-r--r--llvm/tools/obj2yaml/elf2yaml.cpp7
3 files changed, 53 insertions, 0 deletions
diff --git a/llvm/test/tools/obj2yaml/Inputs/shn_xindex.o b/llvm/test/tools/obj2yaml/Inputs/shn_xindex.o
new file mode 100644
index 00000000000..73e2b60ba1e
--- /dev/null
+++ b/llvm/test/tools/obj2yaml/Inputs/shn_xindex.o
Binary files differ
diff --git a/llvm/test/tools/obj2yaml/special-symbol-indices.yaml b/llvm/test/tools/obj2yaml/special-symbol-indices.yaml
new file mode 100644
index 00000000000..127dc25a0df
--- /dev/null
+++ b/llvm/test/tools/obj2yaml/special-symbol-indices.yaml
@@ -0,0 +1,46 @@
+# RUN: yaml2obj %s > %t
+# RUN: obj2yaml %t | FileCheck %s
+
+## Test checks that we are able to handle symbols with special/reserved indices.
+
+# CHECK: Symbols:
+# CHECK-NEXT: Global:
+# CHECK-NEXT: - Name: absolute
+# CHECK-NEXT: Index: SHN_ABS
+# CHECK-NEXT: Value: 0x0000000000001234
+# CHECK-NEXT: - Name: common
+# CHECK-NEXT: Index: SHN_COMMON
+# CHECK-NEXT: - Name: valid_index
+# CHECK-NEXT: Section: .text
+# CHECK-NEXT: - Name: processor_specific_index
+# CHECK-NEXT: Index: SHN_HEXAGON_SCOMMON_1
+# CHECK-NEXT: - Name: unknown_index
+# CHECK-NEXT: Index: 0x0000FFFE
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_HEXAGON
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+Symbols:
+ Global:
+ - Name: absolute
+ Index: SHN_ABS
+ Value: 0x1234
+ - Name: common
+ Index: SHN_COMMON
+ - Name: valid_index
+ Index: 0x1
+ - Name: processor_specific_index
+ Index: SHN_HEXAGON_SCOMMON_1
+ - Name: unknown_index
+ Index: 0xfffe
+
+## shn_xindex.o contains a symbol with st_shndx == SHN_XINDEX.
+## We do not support it at this moment.
+# RUN: not obj2yaml %S/Inputs/shn_xindex.o 2>&1 | FileCheck %s --check-prefix=ERR
+# ERR: Error reading file: {{.*}}shn_xindex.o: Feature not yet implemented.
diff --git a/llvm/tools/obj2yaml/elf2yaml.cpp b/llvm/tools/obj2yaml/elf2yaml.cpp
index b02c25ad153..7f5e9a28d72 100644
--- a/llvm/tools/obj2yaml/elf2yaml.cpp
+++ b/llvm/tools/obj2yaml/elf2yaml.cpp
@@ -284,6 +284,13 @@ ELFDumper<ELFT>::dumpSymbol(const Elf_Sym *Sym, const Elf_Shdr *SymTab,
return errorToErrorCode(SymbolNameOrErr.takeError());
S.Name = SymbolNameOrErr.get();
+ if (Sym->st_shndx >= ELF::SHN_LORESERVE) {
+ if (Sym->st_shndx == ELF::SHN_XINDEX)
+ return obj2yaml_error::not_implemented;
+ S.Index = (ELFYAML::ELF_SHN)Sym->st_shndx;
+ return obj2yaml_error::success;
+ }
+
auto ShdrOrErr = Obj.getSection(Sym, SymTab, ShndxTable);
if (!ShdrOrErr)
return errorToErrorCode(ShdrOrErr.takeError());
OpenPOWER on IntegriCloud