summaryrefslogtreecommitdiffstats
path: root/llvm/lib/ObjectYAML/ELFYAML.cpp
diff options
context:
space:
mode:
authorPetr Hosek <phosek@chromium.org>2017-07-19 20:38:46 +0000
committerPetr Hosek <phosek@chromium.org>2017-07-19 20:38:46 +0000
commiteb04da3a5609f1aea69816bb3e4498aeb0dcaebc (patch)
tree9c36710960e242e2c63053b33c8bdab32a0bcb9f /llvm/lib/ObjectYAML/ELFYAML.cpp
parent38b0f4a1f2f9da3915eb7865b8814d9c300d9b0d (diff)
downloadbcm5719-llvm-eb04da3a5609f1aea69816bb3e4498aeb0dcaebc.tar.gz
bcm5719-llvm-eb04da3a5609f1aea69816bb3e4498aeb0dcaebc.zip
[yaml2obj][ELF] Add support for program headers
This change adds basic support for program headers. I need to do some testing which requires generating program headers but I can't use ld.lld or clang to produce programs that have headers. I'd also like to test some strange things that those programs may never produce. Patch by Jake Ehrlich Differential Revision: https://reviews.llvm.org/D35276 llvm-svn: 308520
Diffstat (limited to 'llvm/lib/ObjectYAML/ELFYAML.cpp')
-rw-r--r--llvm/lib/ObjectYAML/ELFYAML.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/llvm/lib/ObjectYAML/ELFYAML.cpp b/llvm/lib/ObjectYAML/ELFYAML.cpp
index 39741dab327..fd0aa49445f 100644
--- a/llvm/lib/ObjectYAML/ELFYAML.cpp
+++ b/llvm/lib/ObjectYAML/ELFYAML.cpp
@@ -39,6 +39,21 @@ void ScalarEnumerationTraits<ELFYAML::ELF_ET>::enumeration(
IO.enumFallback<Hex16>(Value);
}
+void ScalarEnumerationTraits<ELFYAML::ELF_PT>::enumeration(
+ IO &IO, ELFYAML::ELF_PT &Value) {
+#define ECase(X) IO.enumCase(Value, #X, ELF::X)
+ ECase(PT_NULL);
+ ECase(PT_LOAD);
+ ECase(PT_DYNAMIC);
+ ECase(PT_INTERP);
+ ECase(PT_NOTE);
+ ECase(PT_SHLIB);
+ ECase(PT_PHDR);
+ ECase(PT_TLS);
+#undef ECase
+ IO.enumFallback<Hex32>(Value);
+}
+
void ScalarEnumerationTraits<ELFYAML::ELF_EM>::enumeration(
IO &IO, ELFYAML::ELF_EM &Value) {
#define ECase(X) IO.enumCase(Value, #X, ELF::X)
@@ -412,6 +427,14 @@ void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration(
#undef ECase
}
+void ScalarBitSetTraits<ELFYAML::ELF_PF>::bitset(IO &IO,
+ ELFYAML::ELF_PF &Value) {
+#define BCase(X) IO.bitSetCase(Value, #X, ELF::X)
+ BCase(PF_X);
+ BCase(PF_W);
+ BCase(PF_R);
+}
+
void ScalarBitSetTraits<ELFYAML::ELF_SHF>::bitset(IO &IO,
ELFYAML::ELF_SHF &Value) {
const auto *Object = static_cast<ELFYAML::Object *>(IO.getContext());
@@ -649,6 +672,15 @@ void MappingTraits<ELFYAML::FileHeader>::mapping(IO &IO,
IO.mapOptional("Entry", FileHdr.Entry, Hex64(0));
}
+void MappingTraits<ELFYAML::ProgramHeader>::mapping(
+ IO &IO, ELFYAML::ProgramHeader &Phdr) {
+ IO.mapRequired("Type", Phdr.Type);
+ IO.mapOptional("Flags", Phdr.Flags, ELFYAML::ELF_PF(0));
+ IO.mapOptional("Sections", Phdr.Sections);
+ IO.mapOptional("VAddr", Phdr.VAddr, Hex64(0));
+ IO.mapOptional("PAddr", Phdr.PAddr, Hex64(0));
+}
+
namespace {
struct NormalizedOther {
@@ -720,6 +752,11 @@ void MappingTraits<ELFYAML::SectionOrType>::mapping(
IO.mapRequired("SectionOrType", sectionOrType.sectionNameOrType);
}
+void MappingTraits<ELFYAML::SectionName>::mapping(
+ IO &IO, ELFYAML::SectionName &sectionName) {
+ IO.mapRequired("Section", sectionName.Section);
+}
+
static void sectionMapping(IO &IO, ELFYAML::MipsABIFlags &Section) {
commonSectionMapping(IO, Section);
IO.mapOptional("Version", Section.Version, Hex16(0));
@@ -837,6 +874,7 @@ void MappingTraits<ELFYAML::Object>::mapping(IO &IO, ELFYAML::Object &Object) {
IO.setContext(&Object);
IO.mapTag("!ELF", true);
IO.mapRequired("FileHeader", Object.Header);
+ IO.mapOptional("ProgramHeaders", Object.ProgramHeaders);
IO.mapOptional("Sections", Object.Sections);
IO.mapOptional("Symbols", Object.Symbols);
IO.setContext(nullptr);
OpenPOWER on IntegriCloud