diff options
Diffstat (limited to 'llvm/tools/obj2yaml')
-rw-r--r-- | llvm/tools/obj2yaml/macho2yaml.cpp | 39 | ||||
-rw-r--r-- | llvm/tools/obj2yaml/obj2yaml.cpp | 6 | ||||
-rw-r--r-- | llvm/tools/obj2yaml/obj2yaml.h | 2 |
3 files changed, 39 insertions, 8 deletions
diff --git a/llvm/tools/obj2yaml/macho2yaml.cpp b/llvm/tools/obj2yaml/macho2yaml.cpp index 24bd6a60da4..060a2b82726 100644 --- a/llvm/tools/obj2yaml/macho2yaml.cpp +++ b/llvm/tools/obj2yaml/macho2yaml.cpp @@ -473,23 +473,52 @@ Error macho2yaml(raw_ostream &Out, const object::MachOObjectFile &Obj) { } Error macho2yaml(raw_ostream &Out, const object::MachOUniversalBinary &Obj) { - return make_error<Obj2YamlError>(obj2yaml_error::not_implemented); + MachOYAML::MachFile YAMLFile; + YAMLFile.isFat = true; + MachOYAML::UniversalBinary &YAML = YAMLFile.FatFile; + YAML.Header.magic = Obj.getMagic(); + YAML.Header.nfat_arch = Obj.getNumberOfObjects(); + + for (auto Slice : Obj.objects()) { + MachOYAML::FatArch arch; + arch.cputype = Slice.getCPUType(); + arch.cpusubtype = Slice.getCPUSubType(); + arch.offset = Slice.getOffset(); + arch.size = Slice.getSize(); + arch.align = Slice.getAlign(); + arch.reserved = Slice.getReserved(); + YAML.FatArchs.push_back(arch); + + auto SliceObj = Slice.getAsObjectFile(); + if (!SliceObj) + return SliceObj.takeError(); + + MachODumper Dumper(*SliceObj.get()); + Expected<std::unique_ptr<MachOYAML::Object>> YAMLObj = Dumper.dump(); + if (!YAMLObj) + return YAMLObj.takeError(); + YAML.Slices.push_back(*YAMLObj.get()); + } + + yaml::Output Yout(Out); + Yout << YAML; + return Error::success(); } -std::error_code macho2yaml(raw_ostream &Out, const object::ObjectFile &Obj) { - if (const auto *MachOObj = dyn_cast<object::MachOUniversalBinary>(&Obj)) { +std::error_code macho2yaml(raw_ostream &Out, const object::Binary &Binary) { + if (const auto *MachOObj = dyn_cast<object::MachOUniversalBinary>(&Binary)) { if (auto Err = macho2yaml(Out, *MachOObj)) { return errorToErrorCode(std::move(Err)); } return obj2yaml_error::success; } - if (const auto *MachOObj = dyn_cast<object::MachOObjectFile>(&Obj)) { + if (const auto *MachOObj = dyn_cast<object::MachOObjectFile>(&Binary)) { if (auto Err = macho2yaml(Out, *MachOObj)) { return errorToErrorCode(std::move(Err)); } return obj2yaml_error::success; } - + return obj2yaml_error::unsupported_obj_file_format; } diff --git a/llvm/tools/obj2yaml/obj2yaml.cpp b/llvm/tools/obj2yaml/obj2yaml.cpp index e243f2d843a..3f9373ee17e 100644 --- a/llvm/tools/obj2yaml/obj2yaml.cpp +++ b/llvm/tools/obj2yaml/obj2yaml.cpp @@ -24,8 +24,6 @@ static std::error_code dumpObject(const ObjectFile &Obj) { return coff2yaml(outs(), cast<COFFObjectFile>(Obj)); if (Obj.isELF()) return elf2yaml(outs(), Obj); - if (Obj.isMachO() || Obj.isMachOUniversalBinary()) - return macho2yaml(outs(), Obj); return obj2yaml_error::unsupported_obj_file_format; } @@ -36,6 +34,10 @@ static std::error_code dumpInput(StringRef File) { return errorToErrorCode(BinaryOrErr.takeError()); Binary &Binary = *BinaryOrErr.get().getBinary(); + // Universal MachO is not a subclass of ObjectFile, so it needs to be handled + // here with the other binary types. + if (Binary.isMachO() || Binary.isMachOUniversalBinary()) + return macho2yaml(outs(), Binary); // TODO: If this is an archive, then burst it and dump each entry if (ObjectFile *Obj = dyn_cast<ObjectFile>(&Binary)) return dumpObject(*Obj); diff --git a/llvm/tools/obj2yaml/obj2yaml.h b/llvm/tools/obj2yaml/obj2yaml.h index c17b7d1642c..28c74751c0d 100644 --- a/llvm/tools/obj2yaml/obj2yaml.h +++ b/llvm/tools/obj2yaml/obj2yaml.h @@ -22,6 +22,6 @@ std::error_code coff2yaml(llvm::raw_ostream &Out, std::error_code elf2yaml(llvm::raw_ostream &Out, const llvm::object::ObjectFile &Obj); std::error_code macho2yaml(llvm::raw_ostream &Out, - const llvm::object::ObjectFile &Obj); + const llvm::object::Binary &Obj); #endif |