187a02909SRafael Espindola //===------ utils/obj2yaml.cpp - obj2yaml conversion tool -------*- C++ -*-===// 287a02909SRafael Espindola // 387a02909SRafael Espindola // The LLVM Compiler Infrastructure 487a02909SRafael Espindola // 587a02909SRafael Espindola // This file is distributed under the University of Illinois Open Source 687a02909SRafael Espindola // License. See LICENSE.TXT for details. 787a02909SRafael Espindola // 887a02909SRafael Espindola //===----------------------------------------------------------------------===// 987a02909SRafael Espindola 10ba592977SSimon Atanasyan #include "Error.h" 1187a02909SRafael Espindola #include "obj2yaml.h" 1287a02909SRafael Espindola #include "llvm/Object/Archive.h" 1387a02909SRafael Espindola #include "llvm/Object/COFF.h" 1487a02909SRafael Espindola #include "llvm/Support/CommandLine.h" 1587a02909SRafael Espindola #include "llvm/Support/ManagedStatic.h" 1687a02909SRafael Espindola #include "llvm/Support/PrettyStackTrace.h" 1787a02909SRafael Espindola #include "llvm/Support/Signals.h" 1887a02909SRafael Espindola 1918192896SChandler Carruth using namespace llvm; 20ba592977SSimon Atanasyan using namespace llvm::object; 2118192896SChandler Carruth 224453e429SRafael Espindola static std::error_code dumpObject(const ObjectFile &Obj) { 23ba592977SSimon Atanasyan if (Obj.isCOFF()) 24ba592977SSimon Atanasyan return coff2yaml(outs(), cast<COFFObjectFile>(Obj)); 25ae6bb33aSSimon Atanasyan if (Obj.isELF()) 26ae6bb33aSSimon Atanasyan return elf2yaml(outs(), Obj); 27*d3d84fddSDerek Schuff if (Obj.isWasm()) 28*d3d84fddSDerek Schuff return wasm2yaml(outs(), cast<WasmObjectFile>(Obj)); 29ba592977SSimon Atanasyan 30ba592977SSimon Atanasyan return obj2yaml_error::unsupported_obj_file_format; 3118192896SChandler Carruth } 3287a02909SRafael Espindola 334453e429SRafael Espindola static std::error_code dumpInput(StringRef File) { 343fcdf6aeSKevin Enderby Expected<OwningBinary<Binary>> BinaryOrErr = createBinary(File); 353fcdf6aeSKevin Enderby if (!BinaryOrErr) 363fcdf6aeSKevin Enderby return errorToErrorCode(BinaryOrErr.takeError()); 37ba592977SSimon Atanasyan 3848af1c2aSRafael Espindola Binary &Binary = *BinaryOrErr.get().getBinary(); 3993e71193SChris Bieneman // Universal MachO is not a subclass of ObjectFile, so it needs to be handled 4093e71193SChris Bieneman // here with the other binary types. 4193e71193SChris Bieneman if (Binary.isMachO() || Binary.isMachOUniversalBinary()) 4293e71193SChris Bieneman return macho2yaml(outs(), Binary); 43ba592977SSimon Atanasyan // TODO: If this is an archive, then burst it and dump each entry 443f6481d0SRafael Espindola if (ObjectFile *Obj = dyn_cast<ObjectFile>(&Binary)) 45ba592977SSimon Atanasyan return dumpObject(*Obj); 46ba592977SSimon Atanasyan 47ba592977SSimon Atanasyan return obj2yaml_error::unrecognized_file_format; 48ba592977SSimon Atanasyan } 4987a02909SRafael Espindola 50c224e25dSChandler Carruth cl::opt<std::string> InputFilename(cl::Positional, cl::desc("<input file>"), 51c224e25dSChandler Carruth cl::init("-")); 5287a02909SRafael Espindola 5387a02909SRafael Espindola int main(int argc, char *argv[]) { 5487a02909SRafael Espindola cl::ParseCommandLineOptions(argc, argv); 552ad6d48bSRichard Smith sys::PrintStackTraceOnErrorSignal(argv[0]); 5687a02909SRafael Espindola PrettyStackTraceProgram X(argc, argv); 5787a02909SRafael Espindola llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 5887a02909SRafael Espindola 594453e429SRafael Espindola if (std::error_code EC = dumpInput(InputFilename)) { 60ba592977SSimon Atanasyan errs() << "Error: '" << EC.message() << "'\n"; 61ba592977SSimon Atanasyan return 1; 6287a02909SRafael Espindola } 6387a02909SRafael Espindola 6487a02909SRafael Espindola return 0; 6587a02909SRafael Espindola } 66