187a02909SRafael Espindola //===------ utils/obj2yaml.cpp - obj2yaml conversion tool -------*- C++ -*-===// 287a02909SRafael Espindola // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 687a02909SRafael Espindola // 787a02909SRafael Espindola //===----------------------------------------------------------------------===// 887a02909SRafael Espindola 987a02909SRafael Espindola #include "obj2yaml.h" 10197194b6SRui Ueyama #include "Error.h" 1187a02909SRafael Espindola #include "llvm/Object/Archive.h" 1287a02909SRafael Espindola #include "llvm/Object/COFF.h" 133cee663eSPavel Labath #include "llvm/Object/Minidump.h" 1487a02909SRafael Espindola #include "llvm/Support/CommandLine.h" 15197194b6SRui Ueyama #include "llvm/Support/InitLLVM.h" 1687a02909SRafael Espindola 1718192896SChandler Carruth using namespace llvm; 18ba592977SSimon Atanasyan using namespace llvm::object; 1918192896SChandler Carruth 20*309246e4SGeorge Rimar static Error dumpObject(const ObjectFile &Obj) { 21ba592977SSimon Atanasyan if (Obj.isCOFF()) 22*309246e4SGeorge Rimar return errorCodeToError(coff2yaml(outs(), cast<COFFObjectFile>(Obj))); 23ab2eb2bfSHubert Tong 24ab2eb2bfSHubert Tong if (Obj.isXCOFF()) 25*309246e4SGeorge Rimar return errorCodeToError(xcoff2yaml(outs(), cast<XCOFFObjectFile>(Obj))); 26ab2eb2bfSHubert Tong 27ae6bb33aSSimon Atanasyan if (Obj.isELF()) 28ae6bb33aSSimon Atanasyan return elf2yaml(outs(), Obj); 29ba592977SSimon Atanasyan 30*309246e4SGeorge Rimar if (Obj.isWasm()) 31*309246e4SGeorge Rimar return errorCodeToError(wasm2yaml(outs(), cast<WasmObjectFile>(Obj))); 32*309246e4SGeorge Rimar 33*309246e4SGeorge Rimar return errorCodeToError(obj2yaml_error::unsupported_obj_file_format); 3418192896SChandler Carruth } 3587a02909SRafael Espindola 3620c7d432SSam Clegg static Error dumpInput(StringRef File) { 373fcdf6aeSKevin Enderby Expected<OwningBinary<Binary>> BinaryOrErr = createBinary(File); 383fcdf6aeSKevin Enderby if (!BinaryOrErr) 3920c7d432SSam Clegg return BinaryOrErr.takeError(); 40ba592977SSimon Atanasyan 4148af1c2aSRafael Espindola Binary &Binary = *BinaryOrErr.get().getBinary(); 4293e71193SChris Bieneman // Universal MachO is not a subclass of ObjectFile, so it needs to be handled 4393e71193SChris Bieneman // here with the other binary types. 4493e71193SChris Bieneman if (Binary.isMachO() || Binary.isMachOUniversalBinary()) 4520c7d432SSam Clegg return errorCodeToError(macho2yaml(outs(), Binary)); 46ba592977SSimon Atanasyan // TODO: If this is an archive, then burst it and dump each entry 473f6481d0SRafael Espindola if (ObjectFile *Obj = dyn_cast<ObjectFile>(&Binary)) 48*309246e4SGeorge Rimar return dumpObject(*Obj); 493cee663eSPavel Labath if (MinidumpFile *Minidump = dyn_cast<MinidumpFile>(&Binary)) 503cee663eSPavel Labath return minidump2yaml(outs(), *Minidump); 51ba592977SSimon Atanasyan 5220c7d432SSam Clegg return Error::success(); 5320c7d432SSam Clegg } 5420c7d432SSam Clegg 5520c7d432SSam Clegg static void reportError(StringRef Input, Error Err) { 5620c7d432SSam Clegg if (Input == "-") 5720c7d432SSam Clegg Input = "<stdin>"; 5820c7d432SSam Clegg std::string ErrMsg; 5920c7d432SSam Clegg raw_string_ostream OS(ErrMsg); 6045eb84f3SJonas Devlieghere logAllUnhandledErrors(std::move(Err), OS); 6120c7d432SSam Clegg OS.flush(); 6220c7d432SSam Clegg errs() << "Error reading file: " << Input << ": " << ErrMsg; 6320c7d432SSam Clegg errs().flush(); 64ba592977SSimon Atanasyan } 6587a02909SRafael Espindola 66c224e25dSChandler Carruth cl::opt<std::string> InputFilename(cl::Positional, cl::desc("<input file>"), 67c224e25dSChandler Carruth cl::init("-")); 6887a02909SRafael Espindola 6987a02909SRafael Espindola int main(int argc, char *argv[]) { 70197194b6SRui Ueyama InitLLVM X(argc, argv); 7187a02909SRafael Espindola cl::ParseCommandLineOptions(argc, argv); 7287a02909SRafael Espindola 7320c7d432SSam Clegg if (Error Err = dumpInput(InputFilename)) { 7420c7d432SSam Clegg reportError(InputFilename, std::move(Err)); 75ba592977SSimon Atanasyan return 1; 7687a02909SRafael Espindola } 7787a02909SRafael Espindola 7887a02909SRafael Espindola return 0; 7987a02909SRafael Espindola } 80