[llvm] r312745 - [yaml2obj][ELF] Add support for symbol indexes greater than SHN_LORESERVE
Petr Hosek via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 7 13:44:16 PDT 2017
Author: phosek
Date: Thu Sep 7 13:44:16 2017
New Revision: 312745
URL: http://llvm.org/viewvc/llvm-project?rev=312745&view=rev
Log:
[yaml2obj][ELF] Add support for symbol indexes greater than SHN_LORESERVE
Right now Symbols must be either undefined or defined in a specific
section. Some symbols have section indexes like SHN_ABS however. This
change adds support for outputting symbols that have such section
indexes.
Patch by Jake Ehrlich
Differential Revision: https://reviews.llvm.org/D37391
Added:
llvm/trunk/test/tools/yaml2obj/symbol-index-invalid.yaml
llvm/trunk/test/tools/yaml2obj/symbol-index.yaml
Modified:
llvm/trunk/include/llvm/ObjectYAML/ELFYAML.h
llvm/trunk/lib/ObjectYAML/ELFYAML.cpp
llvm/trunk/tools/yaml2obj/yaml2elf.cpp
Modified: llvm/trunk/include/llvm/ObjectYAML/ELFYAML.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ObjectYAML/ELFYAML.h?rev=312745&r1=312744&r2=312745&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ObjectYAML/ELFYAML.h (original)
+++ llvm/trunk/include/llvm/ObjectYAML/ELFYAML.h Thu Sep 7 13:44:16 2017
@@ -50,6 +50,7 @@ LLVM_YAML_STRONG_TYPEDEF(uint32_t, ELF_R
LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_RSS)
// Just use 64, since it can hold 32-bit values too.
LLVM_YAML_STRONG_TYPEDEF(uint64_t, ELF_SHF)
+LLVM_YAML_STRONG_TYPEDEF(uint16_t, ELF_SHN)
LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_STT)
LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_STV)
LLVM_YAML_STRONG_TYPEDEF(uint8_t, ELF_STO)
@@ -89,6 +90,7 @@ struct Symbol {
StringRef Name;
ELF_STT Type;
StringRef Section;
+ Optional<ELF_SHN> Index;
llvm::yaml::Hex64 Value;
llvm::yaml::Hex64 Size;
uint8_t Other;
@@ -267,6 +269,10 @@ struct ScalarBitSetTraits<ELFYAML::ELF_S
static void bitset(IO &IO, ELFYAML::ELF_SHF &Value);
};
+template <> struct ScalarEnumerationTraits<ELFYAML::ELF_SHN> {
+ static void enumeration(IO &IO, ELFYAML::ELF_SHN &Value);
+};
+
template <>
struct ScalarEnumerationTraits<ELFYAML::ELF_STT> {
static void enumeration(IO &IO, ELFYAML::ELF_STT &Value);
@@ -334,6 +340,7 @@ template <> struct MappingTraits<ELFYAML
template <>
struct MappingTraits<ELFYAML::Symbol> {
static void mapping(IO &IO, ELFYAML::Symbol &Symbol);
+ static StringRef validate(IO &IO, ELFYAML::Symbol &Symbol);
};
template <>
Modified: llvm/trunk/lib/ObjectYAML/ELFYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ObjectYAML/ELFYAML.cpp?rev=312745&r1=312744&r2=312745&view=diff
==============================================================================
--- llvm/trunk/lib/ObjectYAML/ELFYAML.cpp (original)
+++ llvm/trunk/lib/ObjectYAML/ELFYAML.cpp Thu Sep 7 13:44:16 2017
@@ -477,6 +477,28 @@ void ScalarBitSetTraits<ELFYAML::ELF_SHF
#undef BCase
}
+void ScalarEnumerationTraits<ELFYAML::ELF_SHN>::enumeration(
+ IO &IO, ELFYAML::ELF_SHN &Value) {
+#define ECase(X) IO.enumCase(Value, #X, ELF::X)
+ ECase(SHN_UNDEF);
+ ECase(SHN_LORESERVE);
+ ECase(SHN_LOPROC);
+ ECase(SHN_HIPROC);
+ ECase(SHN_LOOS);
+ ECase(SHN_HIOS);
+ ECase(SHN_ABS);
+ ECase(SHN_COMMON);
+ ECase(SHN_XINDEX);
+ ECase(SHN_HIRESERVE);
+ ECase(SHN_HEXAGON_SCOMMON);
+ ECase(SHN_HEXAGON_SCOMMON_1);
+ ECase(SHN_HEXAGON_SCOMMON_2);
+ ECase(SHN_HEXAGON_SCOMMON_4);
+ ECase(SHN_HEXAGON_SCOMMON_8);
+#undef ECase
+ IO.enumFallback<Hex32>(Value);
+}
+
void ScalarEnumerationTraits<ELFYAML::ELF_STT>::enumeration(
IO &IO, ELFYAML::ELF_STT &Value) {
#define ECase(X) IO.enumCase(Value, #X, ELF::X)
@@ -701,6 +723,7 @@ void MappingTraits<ELFYAML::Symbol>::map
IO.mapOptional("Name", Symbol.Name, StringRef());
IO.mapOptional("Type", Symbol.Type, ELFYAML::ELF_STT(0));
IO.mapOptional("Section", Symbol.Section, StringRef());
+ IO.mapOptional("Index", Symbol.Index);
IO.mapOptional("Value", Symbol.Value, Hex64(0));
IO.mapOptional("Size", Symbol.Size, Hex64(0));
@@ -709,6 +732,20 @@ void MappingTraits<ELFYAML::Symbol>::map
IO.mapOptional("Other", Keys->Other, ELFYAML::ELF_STO(0));
}
+StringRef MappingTraits<ELFYAML::Symbol>::validate(IO &IO,
+ ELFYAML::Symbol &Symbol) {
+ if (Symbol.Index && Symbol.Section.data()) {
+ return "Index and Section cannot both be specified for Symbol";
+ }
+ if (Symbol.Index && *Symbol.Index == ELFYAML::ELF_SHN(ELF::SHN_XINDEX)) {
+ return "Large indexes are not supported";
+ }
+ if (Symbol.Index && *Symbol.Index < ELFYAML::ELF_SHN(ELF::SHN_LORESERVE)) {
+ return "Use a section name to define which section a symbol is defined in";
+ }
+ return StringRef();
+}
+
void MappingTraits<ELFYAML::LocalGlobalWeakSymbols>::mapping(
IO &IO, ELFYAML::LocalGlobalWeakSymbols &Symbols) {
IO.mapOptional("Local", Symbols.Local);
Added: llvm/trunk/test/tools/yaml2obj/symbol-index-invalid.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/yaml2obj/symbol-index-invalid.yaml?rev=312745&view=auto
==============================================================================
--- llvm/trunk/test/tools/yaml2obj/symbol-index-invalid.yaml (added)
+++ llvm/trunk/test/tools/yaml2obj/symbol-index-invalid.yaml Thu Sep 7 13:44:16 2017
@@ -0,0 +1,21 @@
+# This test insures that the user cannot have both an Index and a Section field.
+# RUN: not yaml2obj %s
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x1000
+ AddressAlign: 0x0000000000000010
+ Content: "0000000000000000"
+Symbols:
+ Global:
+ - Name: _start
+ Section: .text
+ Index: SHN_ABS
Added: llvm/trunk/test/tools/yaml2obj/symbol-index.yaml
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/yaml2obj/symbol-index.yaml?rev=312745&view=auto
==============================================================================
--- llvm/trunk/test/tools/yaml2obj/symbol-index.yaml (added)
+++ llvm/trunk/test/tools/yaml2obj/symbol-index.yaml Thu Sep 7 13:44:16 2017
@@ -0,0 +1,35 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-readobj -symbols %t | FileCheck %s
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Symbols:
+ Global:
+ - Name: test
+ Index: SHN_ABS
+ Value: 0x1234
+
+#CHECK: Symbols [
+#CHECK-NEXT: Symbol {
+#CHECK-NEXT: Name: (0)
+#CHECK-NEXT: Value: 0x0
+#CHECK-NEXT: Size: 0
+#CHECK-NEXT: Binding: Local (0x0)
+#CHECK-NEXT: Type: None (0x0)
+#CHECK-NEXT: Other: 0
+#CHECK-NEXT: Section: Undefined (0x0)
+#CHECK-NEXT: }
+#CHECK-NEXT: Symbol {
+#CHECK-NEXT: Name: test (1)
+#CHECK-NEXT: Value: 0x1234
+#CHECK-NEXT: Size: 0
+#CHECK-NEXT: Binding: Global (0x1)
+#CHECK-NEXT: Type: None (0x0)
+#CHECK-NEXT: Other: 0
+#CHECK-NEXT: Section: Absolute (0xFFF1)
+#CHECK-NEXT: }
+#CHECK-NEXT:]
Modified: llvm/trunk/tools/yaml2obj/yaml2elf.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/yaml2obj/yaml2elf.cpp?rev=312745&r1=312744&r2=312745&view=diff
==============================================================================
--- llvm/trunk/tools/yaml2obj/yaml2elf.cpp (original)
+++ llvm/trunk/tools/yaml2obj/yaml2elf.cpp Thu Sep 7 13:44:16 2017
@@ -409,7 +409,10 @@ void ELFState<ELFT>::addSymbols(const st
exit(1);
}
Symbol.st_shndx = Index;
- } // else Symbol.st_shndex == SHN_UNDEF (== 0), since it was zero'd earlier.
+ } else if (Sym.Index) {
+ Symbol.st_shndx = *Sym.Index;
+ }
+ // else Symbol.st_shndex == SHN_UNDEF (== 0), since it was zero'd earlier.
Symbol.st_value = Sym.Value;
Symbol.st_other = Sym.Other;
Symbol.st_size = Sym.Size;
More information about the llvm-commits
mailing list