diff options
Diffstat (limited to 'llvm/tools')
-rw-r--r-- | llvm/tools/obj2yaml/macho2yaml.cpp | 13 | ||||
-rw-r--r-- | llvm/tools/yaml2obj/yaml2macho.cpp | 26 |
2 files changed, 33 insertions, 6 deletions
diff --git a/llvm/tools/obj2yaml/macho2yaml.cpp b/llvm/tools/obj2yaml/macho2yaml.cpp index b787a3e0c24..e71f467e794 100644 --- a/llvm/tools/obj2yaml/macho2yaml.cpp +++ b/llvm/tools/obj2yaml/macho2yaml.cpp @@ -21,10 +21,10 @@ class MachODumper { public: MachODumper(const object::MachOObjectFile &O) : Obj(O) {} - Expected<std::unique_ptr<MachOYAML::Object> > dump(); + Expected<std::unique_ptr<MachOYAML::Object>> dump(); }; -Expected<std::unique_ptr<MachOYAML::Object> > MachODumper::dump() { +Expected<std::unique_ptr<MachOYAML::Object>> MachODumper::dump() { auto Y = make_unique<MachOYAML::Object>(); Y->Header.magic = Obj.getHeader().magic; Y->Header.cputype = Obj.getHeader().cputype; @@ -34,12 +34,19 @@ Expected<std::unique_ptr<MachOYAML::Object> > MachODumper::dump() { Y->Header.sizeofcmds = Obj.getHeader().sizeofcmds; Y->Header.flags = Obj.getHeader().flags; + 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; + Y->LoadCommands.push_back(std::move(LC)); + } + return std::move(Y); } Error macho2yaml(raw_ostream &Out, const object::MachOObjectFile &Obj) { MachODumper Dumper(Obj); - Expected<std::unique_ptr<MachOYAML::Object> > YAML = Dumper.dump(); + Expected<std::unique_ptr<MachOYAML::Object>> YAML = Dumper.dump(); if (!YAML) return YAML.takeError(); diff --git a/llvm/tools/yaml2obj/yaml2macho.cpp b/llvm/tools/yaml2obj/yaml2macho.cpp index 8437475a411..ed243a2cdd9 100644 --- a/llvm/tools/yaml2obj/yaml2macho.cpp +++ b/llvm/tools/yaml2obj/yaml2macho.cpp @@ -40,8 +40,9 @@ public: private: Error writeHeader(raw_ostream &OS); + Error writeLoadCommands(raw_ostream &OS); - MachOYAML::Object Obj; + MachOYAML::Object &Obj; bool is64Bit; union { @@ -53,6 +54,8 @@ private: Error MachOWriter::writeMachO(raw_ostream &OS) { if (auto Err = writeHeader(OS)) return Err; + if (auto Err = writeLoadCommands(OS)) + return Err; return Error::success(); } @@ -66,15 +69,32 @@ Error MachOWriter::writeHeader(raw_ostream &OS) { Header.flags = Obj.Header.flags; Header64.reserved = Obj.Header.reserved; - if (is64Bit) { + if (is64Bit) OS.write((const char *)&Header64, sizeof(MachO::mach_header_64)); - } else OS.write((const char *)&Header, sizeof(MachO::mach_header)); return Error::success(); } +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) { + // 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); + } + } + return Error::success(); +} + } // end anonymous namespace int yaml2macho(yaml::Input &YIn, raw_ostream &Out) { |