diff options
Diffstat (limited to 'llvm/tools')
| -rw-r--r-- | llvm/tools/obj2yaml/macho2yaml.cpp | 25 | ||||
| -rw-r--r-- | llvm/tools/yaml2obj/yaml2macho.cpp | 36 |
2 files changed, 46 insertions, 15 deletions
diff --git a/llvm/tools/obj2yaml/macho2yaml.cpp b/llvm/tools/obj2yaml/macho2yaml.cpp index ad6969cdd4a..eb875ffa1cf 100644 --- a/llvm/tools/obj2yaml/macho2yaml.cpp +++ b/llvm/tools/obj2yaml/macho2yaml.cpp @@ -9,9 +9,9 @@ #include "Error.h" #include "obj2yaml.h" -#include "llvm/Support/ErrorHandling.h" #include "llvm/Object/MachOUniversal.h" #include "llvm/ObjectYAML/MachOYAML.h" +#include "llvm/Support/ErrorHandling.h" using namespace llvm; @@ -24,6 +24,14 @@ public: Expected<std::unique_ptr<MachOYAML::Object>> dump(); }; +#define HANDLE_LOAD_COMMAND(LCName, LCValue, LCStruct) \ + case MachO::LCName: \ + memcpy((void *) & (LC.load_command_data.LCStruct), LoadCmd.Ptr, \ + sizeof(MachO::LCStruct)); \ + if (Obj.isLittleEndian() != sys::IsLittleEndianHost) \ + MachO::swapStruct(LC.load_command_data.LCStruct); \ + break; + Expected<std::unique_ptr<MachOYAML::Object>> MachODumper::dump() { auto Y = make_unique<MachOYAML::Object>(); Y->Header.magic = Obj.getHeader().magic; @@ -35,10 +43,17 @@ Expected<std::unique_ptr<MachOYAML::Object>> MachODumper::dump() { Y->Header.flags = Obj.getHeader().flags; Y->Header.reserved = 0; - for (auto load_command : Obj.load_commands()) { - auto LC = make_unique<MachOYAML::LoadCommand>(); - LC->cmd = static_cast<MachO::LoadCommandType>(load_command.C.cmd); - LC->cmdsize = load_command.C.cmdsize; + for (auto LoadCmd : Obj.load_commands()) { + MachOYAML::LoadCommand LC; + switch (LoadCmd.C.cmd) { + default: + memcpy((void *)&(LC.load_command_data.load_command), LoadCmd.Ptr, + sizeof(MachO::load_command)); + if (Obj.isLittleEndian() != sys::IsLittleEndianHost) + MachO::swapStruct(LC.load_command_data.load_command); + break; +#include "llvm/Support/MachO.def" + } Y->LoadCommands.push_back(std::move(LC)); } diff --git a/llvm/tools/yaml2obj/yaml2macho.cpp b/llvm/tools/yaml2obj/yaml2macho.cpp index ed243a2cdd9..bf891a6e983 100644 --- a/llvm/tools/yaml2obj/yaml2macho.cpp +++ b/llvm/tools/yaml2obj/yaml2macho.cpp @@ -79,17 +79,33 @@ Error MachOWriter::writeHeader(raw_ostream &OS) { Error MachOWriter::writeLoadCommands(raw_ostream &OS) { for (auto &LC : Obj.LoadCommands) { - MachO::load_command LCTemp; - LCTemp.cmd = LC->cmd; - LCTemp.cmdsize = LC->cmdsize; - OS.write(reinterpret_cast<const char *>(&LCTemp), - sizeof(MachO::load_command)); - auto remaining_size = LC->cmdsize - sizeof(MachO::load_command); - if (remaining_size > 0) { + size_t BytesWritten = 0; +#define HANDLE_LOAD_COMMAND(LCName, LCValue, LCStruct) \ + case MachO::LCName: \ + OS.write(reinterpret_cast<const char *>(&(LC.load_command_data.LCStruct)), \ + sizeof(MachO::LCStruct)); \ + BytesWritten = sizeof(MachO::LCStruct); \ + break; + + switch (LC.load_command_data.load_command.cmd) { + default: + OS.write( + reinterpret_cast<const char *>(&(LC.load_command_data.load_command)), + sizeof(MachO::load_command)); + BytesWritten = sizeof(MachO::load_command); + break; +#include "llvm/Support/MachO.def" + } + + auto BytesRemaining = + LC.load_command_data.load_command.cmdsize - BytesWritten; + if (BytesRemaining > 0) { // TODO: Replace all this once the load command data is present in yaml. - std::vector<char> fill_data; - fill_data.insert(fill_data.begin(), remaining_size, 0); - OS.write(fill_data.data(), remaining_size); + // For now I fill with 0xDEADBEEF because it is easy to spot on a hex + // viewer. + std::vector<uint32_t> FillData; + FillData.insert(FillData.begin(), BytesRemaining / 4 + 1, 0xDEADBEEFu); + OS.write(reinterpret_cast<char *>(FillData.data()), BytesRemaining); } } return Error::success(); |

