diff options
author | Petr Hosek <phosek@chromium.org> | 2017-09-07 20:44:16 +0000 |
---|---|---|
committer | Petr Hosek <phosek@chromium.org> | 2017-09-07 20:44:16 +0000 |
commit | 5c469a3daa34faede4b43d1ef4e35d91e82c73c9 (patch) | |
tree | a97b1e145fbdd2416609726e35fd3bd7f4e12722 /llvm/lib/ObjectYAML/ELFYAML.cpp | |
parent | 9e26e9795590be723bb2e8cd303d9b8159c67084 (diff) | |
download | bcm5719-llvm-5c469a3daa34faede4b43d1ef4e35d91e82c73c9.tar.gz bcm5719-llvm-5c469a3daa34faede4b43d1ef4e35d91e82c73c9.zip |
[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
llvm-svn: 312745
Diffstat (limited to 'llvm/lib/ObjectYAML/ELFYAML.cpp')
-rw-r--r-- | llvm/lib/ObjectYAML/ELFYAML.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp index cf0a943a880..20f0905ecc8 100644 --- a/llvm/lib/ObjectYAML/ELFYAML.cpp +++ b/llvm/lib/ObjectYAML/ELFYAML.cpp @@ -477,6 +477,28 @@ void ScalarBitSetTraits<ELFYAML::ELF_SHF>::bitset(IO &IO, #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>::mapping(IO &IO, ELFYAML::Symbol &Symbol) { 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>::mapping(IO &IO, ELFYAML::Symbol &Symbol) { 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); |