From ac5b9174b69b7ae5a3559a037615f758463cee0d Mon Sep 17 00:00:00 2001 From: Chris Bieneman Date: Thu, 19 May 2016 20:48:54 +0000 Subject: [PATCH] Revert "[obj2yaml] [yaml2obj] Support for MachO Load Command data" This reverts commit r270115. This failed on several builders using GCC. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@270121 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ObjectYAML/MachOYAML.h | 4 -- lib/ObjectYAML/MachOYAML.cpp | 34 ++---------- tools/obj2yaml/macho2yaml.cpp | 80 +++++---------------------- tools/yaml2obj/yaml2macho.cpp | 83 ++++++----------------------- 4 files changed, 31 insertions(+), 170 deletions(-) diff --git a/include/llvm/ObjectYAML/MachOYAML.h b/include/llvm/ObjectYAML/MachOYAML.h index cb29c6dcd62..3c79a20c55a 100644 --- a/include/llvm/ObjectYAML/MachOYAML.h +++ b/include/llvm/ObjectYAML/MachOYAML.h @@ -52,9 +52,6 @@ struct LoadCommand { virtual ~LoadCommand(); llvm::MachO::macho_load_command Data; std::vector
Sections; - std::vector PayloadBytes; - std::string PayloadString; - uint64_t ZeroPadBytes; }; struct Object { @@ -68,7 +65,6 @@ struct Object { LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::LoadCommand) LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::MachOYAML::Section) -LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::yaml::Hex8) namespace llvm { namespace yaml { diff --git a/lib/ObjectYAML/MachOYAML.cpp b/lib/ObjectYAML/MachOYAML.cpp index 60ed53f7d1e..2faefca432e 100644 --- a/lib/ObjectYAML/MachOYAML.cpp +++ b/lib/ObjectYAML/MachOYAML.cpp @@ -96,33 +96,6 @@ void MappingTraits::mapping(IO &IO, IO.setContext(nullptr); } -template -void mapLoadCommandData(IO &IO, MachOYAML::LoadCommand &LoadCommand) {} - -template <> -void mapLoadCommandData( - IO &IO, MachOYAML::LoadCommand &LoadCommand) { - IO.mapOptional("Sections", LoadCommand.Sections); -} - -template <> -void mapLoadCommandData( - IO &IO, MachOYAML::LoadCommand &LoadCommand) { - IO.mapOptional("Sections", LoadCommand.Sections); -} - -template <> -void mapLoadCommandData( - IO &IO, MachOYAML::LoadCommand &LoadCommand) { - IO.mapOptional("PayloadString", LoadCommand.PayloadString); -} - -template <> -void mapLoadCommandData( - IO &IO, MachOYAML::LoadCommand &LoadCommand) { - IO.mapOptional("PayloadString", LoadCommand.PayloadString); -} - void MappingTraits::mapping( IO &IO, MachOYAML::LoadCommand &LoadCommand) { IO.mapRequired( @@ -133,14 +106,15 @@ void MappingTraits::mapping( case MachO::LCName: \ MappingTraits::mapping(IO, \ LoadCommand.Data.LCStruct##_data); \ - mapLoadCommandData(IO, LoadCommand); \ break; switch (LoadCommand.Data.load_command_data.cmd) { #include "llvm/Support/MachO.def" } - IO.mapOptional("PayloadBytes", LoadCommand.PayloadBytes); - IO.mapOptional("ZeroPadBytes", LoadCommand.ZeroPadBytes, 0ull); + if (LoadCommand.Data.load_command_data.cmd == MachO::LC_SEGMENT || + LoadCommand.Data.load_command_data.cmd == MachO::LC_SEGMENT_64) { + IO.mapOptional("Sections", LoadCommand.Sections); + } } void MappingTraits::mapping( diff --git a/tools/obj2yaml/macho2yaml.cpp b/tools/obj2yaml/macho2yaml.cpp index eae15533d07..b90147403bd 100644 --- a/tools/obj2yaml/macho2yaml.cpp +++ b/tools/obj2yaml/macho2yaml.cpp @@ -19,11 +19,6 @@ using namespace llvm; class MachODumper { - template - const char *processLoadCommandData( - MachOYAML::LoadCommand &LC, - const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd); - const object::MachOObjectFile &Obj; public: @@ -37,7 +32,6 @@ public: sizeof(MachO::LCStruct)); \ if (Obj.isLittleEndian() != sys::IsLittleEndianHost) \ MachO::swapStruct(LC.Data.LCStruct##_data); \ - EndPtr = processLoadCommandData(LC, LoadCmd); \ break; template @@ -74,10 +68,9 @@ template <> MachOYAML::Section constructSection(MachO::section_64 Sec) { } template -const char * -extractSections(const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd, - std::vector &Sections, - bool IsLittleEndian) { +void extractSections( + const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd, + std::vector &Sections, bool IsLittleEndian) { auto End = LoadCmd.Ptr + LoadCmd.C.cmdsize; const SectionType *Curr = reinterpret_cast(LoadCmd.Ptr + sizeof(SegmentType)); @@ -91,55 +84,6 @@ extractSections(const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd, Sections.push_back(constructSection(*Curr)); } } - return reinterpret_cast(Curr); -} - -template -const char *MachODumper::processLoadCommandData( - MachOYAML::LoadCommand &LC, - const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) { - return LoadCmd.Ptr + sizeof(StructType); -} - -template <> -const char *MachODumper::processLoadCommandData( - MachOYAML::LoadCommand &LC, - const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) { - return extractSections( - LoadCmd, LC.Sections, Obj.isLittleEndian()); -} - -template <> -const char *MachODumper::processLoadCommandData( - MachOYAML::LoadCommand &LC, - const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) { - return extractSections( - LoadCmd, LC.Sections, Obj.isLittleEndian()); -} - -template -const char * -readString(MachOYAML::LoadCommand &LC, - const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) { - auto Start = LoadCmd.Ptr + sizeof(StructType); - auto MaxSize = LoadCmd.C.cmdsize - sizeof(StructType); - auto Size = strnlen(Start, MaxSize); - LC.PayloadString = StringRef(Start, Size).str(); - return Start + Size; -} - -template <> -const char *MachODumper::processLoadCommandData( - MachOYAML::LoadCommand &LC, - const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) { - return readString(LC, LoadCmd); -} - -template <> -const char *MachODumper::processLoadCommandData( - MachOYAML::LoadCommand &LC, - const llvm::object::MachOObjectFile::LoadCommandInfo &LoadCmd) { - return readString(LC, LoadCmd); } Expected> MachODumper::dump() { @@ -155,25 +99,25 @@ Expected> MachODumper::dump() { for (auto LoadCmd : Obj.load_commands()) { MachOYAML::LoadCommand LC; - const char *EndPtr = LoadCmd.Ptr; switch (LoadCmd.C.cmd) { default: memcpy((void *)&(LC.Data.load_command_data), LoadCmd.Ptr, sizeof(MachO::load_command)); if (Obj.isLittleEndian() != sys::IsLittleEndianHost) MachO::swapStruct(LC.Data.load_command_data); - EndPtr = processLoadCommandData(LC, LoadCmd); break; #include "llvm/Support/MachO.def" } - auto RemainingBytes = LoadCmd.C.cmdsize - (EndPtr - LoadCmd.Ptr); - if (!std::all_of(EndPtr, &EndPtr[RemainingBytes], - [](const char C) { return C == 0; })) { - LC.PayloadBytes.insert(LC.PayloadBytes.end(), EndPtr, - &EndPtr[RemainingBytes]); - RemainingBytes = 0; + switch (LoadCmd.C.cmd) { + case MachO::LC_SEGMENT: + extractSections( + LoadCmd, LC.Sections, Obj.isLittleEndian()); + break; + case MachO::LC_SEGMENT_64: + extractSections( + LoadCmd, LC.Sections, Obj.isLittleEndian()); + break; } - LC.ZeroPadBytes = RemainingBytes; Y->LoadCommands.push_back(std::move(LC)); } diff --git a/tools/yaml2obj/yaml2macho.cpp b/tools/yaml2obj/yaml2macho.cpp index 2a1c6a7e9d2..0e8799e2ce1 100644 --- a/tools/yaml2obj/yaml2macho.cpp +++ b/tools/yaml2obj/yaml2macho.cpp @@ -94,60 +94,6 @@ SectionType constructSection(MachOYAML::Section Sec) { return TempSec; } -template -size_t writeLoadCommandData(MachOYAML::LoadCommand &LC, raw_ostream &OS) { - return 0; -} - -template <> -size_t writeLoadCommandData(MachOYAML::LoadCommand &LC, - raw_ostream &OS) { - size_t BytesWritten = 0; - for (auto Sec : LC.Sections) { - auto TempSec = constructSection(Sec); - OS.write(reinterpret_cast(&(TempSec)), - sizeof(MachO::section)); - BytesWritten += sizeof(MachO::section); - } - return BytesWritten; -} - -template <> -size_t -writeLoadCommandData(MachOYAML::LoadCommand &LC, - raw_ostream &OS) { - size_t BytesWritten = 0; - for (auto Sec : LC.Sections) { - auto TempSec = constructSection(Sec); - TempSec.reserved3 = Sec.reserved3; - OS.write(reinterpret_cast(&(TempSec)), - sizeof(MachO::section_64)); - BytesWritten += sizeof(MachO::section_64); - } - return BytesWritten; -} - -size_t writePayloadString(MachOYAML::LoadCommand &LC, raw_ostream &OS) { - size_t BytesWritten = 0; - if (!LC.PayloadString.empty()) { - OS.write(LC.PayloadString.c_str(), LC.PayloadString.length()); - BytesWritten = LC.PayloadString.length(); - } - return BytesWritten; -} - -template <> -size_t writeLoadCommandData(MachOYAML::LoadCommand &LC, - raw_ostream &OS) { - return writePayloadString(LC, OS); -} - -template <> -size_t writeLoadCommandData(MachOYAML::LoadCommand &LC, - raw_ostream &OS) { - return writePayloadString(LC, OS); -} - Error MachOWriter::writeLoadCommands(raw_ostream &OS) { for (auto &LC : Obj.LoadCommands) { size_t BytesWritten = 0; @@ -156,7 +102,6 @@ Error MachOWriter::writeLoadCommands(raw_ostream &OS) { OS.write(reinterpret_cast(&(LC.Data.LCStruct##_data)), \ sizeof(MachO::LCStruct)); \ BytesWritten = sizeof(MachO::LCStruct); \ - BytesWritten += writeLoadCommandData(LC, OS); \ break; switch (LC.Data.load_command_data.cmd) { @@ -164,25 +109,27 @@ Error MachOWriter::writeLoadCommands(raw_ostream &OS) { OS.write(reinterpret_cast(&(LC.Data.load_command_data)), sizeof(MachO::load_command)); BytesWritten = sizeof(MachO::load_command); - BytesWritten += writeLoadCommandData(LC, OS); break; #include "llvm/Support/MachO.def" } - if (LC.PayloadBytes.size() > 0) { - OS.write(reinterpret_cast(LC.PayloadBytes.data()), - LC.PayloadBytes.size()); - BytesWritten += LC.PayloadBytes.size(); + if(LC.Data.load_command_data.cmd == MachO::LC_SEGMENT) { + for(auto Sec : LC.Sections) { + auto TempSec = constructSection(Sec); + OS.write(reinterpret_cast(&(TempSec)), sizeof(MachO::section)); + BytesWritten += sizeof(MachO::section); + } + } else if(LC.Data.load_command_data.cmd == MachO::LC_SEGMENT_64) { + for(auto Sec : LC.Sections) { + auto TempSec = constructSection(Sec); + TempSec.reserved3 = Sec.reserved3; + OS.write(reinterpret_cast(&(TempSec)), sizeof(MachO::section_64)); + BytesWritten += sizeof(MachO::section_64); + } } - if (LC.ZeroPadBytes > 0) { - std::vector FillData; - FillData.insert(FillData.begin(), LC.ZeroPadBytes, 0); - OS.write(reinterpret_cast(FillData.data()), LC.ZeroPadBytes); - BytesWritten += LC.ZeroPadBytes; - } - - auto BytesRemaining = LC.Data.load_command_data.cmdsize - BytesWritten; + auto BytesRemaining = + LC.Data.load_command_data.cmdsize - BytesWritten; if (BytesRemaining > 0) { // TODO: Replace all this once the load command data is present in yaml. // For now I fill with 0xDEADBEEF because it is easy to spot on a hex