summaryrefslogtreecommitdiffstats
path: root/llvm/lib/ObjectYAML/ELFYAML.cpp
diff options
context:
space:
mode:
authorPetr Hosek <phosek@chromium.org>2017-09-07 20:44:16 +0000
committerPetr Hosek <phosek@chromium.org>2017-09-07 20:44:16 +0000
commit5c469a3daa34faede4b43d1ef4e35d91e82c73c9 (patch)
treea97b1e145fbdd2416609726e35fd3bd7f4e12722 /llvm/lib/ObjectYAML/ELFYAML.cpp
parent9e26e9795590be723bb2e8cd303d9b8159c67084 (diff)
downloadbcm5719-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.cpp37
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);
OpenPOWER on IntegriCloud