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 10*ba592977SSimon 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; 20*ba592977SSimon Atanasyan using namespace llvm::object; 2118192896SChandler Carruth 22*ba592977SSimon Atanasyan static error_code dumpObject(const ObjectFile &Obj) { 23*ba592977SSimon Atanasyan if (Obj.isCOFF()) 24*ba592977SSimon Atanasyan return coff2yaml(outs(), cast<COFFObjectFile>(Obj)); 25*ba592977SSimon Atanasyan 26*ba592977SSimon Atanasyan return obj2yaml_error::unsupported_obj_file_format; 2718192896SChandler Carruth } 2887a02909SRafael Espindola 29*ba592977SSimon Atanasyan static error_code dumpInput(StringRef File) { 30*ba592977SSimon Atanasyan if (File != "-" && !sys::fs::exists(File)) 31*ba592977SSimon Atanasyan return obj2yaml_error::file_not_found; 32*ba592977SSimon Atanasyan 33*ba592977SSimon Atanasyan ErrorOr<Binary *> BinaryOrErr = createBinary(File); 34*ba592977SSimon Atanasyan if (error_code EC = BinaryOrErr.getError()) 35*ba592977SSimon Atanasyan return EC; 36*ba592977SSimon Atanasyan 37*ba592977SSimon Atanasyan std::unique_ptr<Binary> Binary(BinaryOrErr.get()); 38*ba592977SSimon Atanasyan // TODO: If this is an archive, then burst it and dump each entry 39*ba592977SSimon Atanasyan if (ObjectFile *Obj = dyn_cast<ObjectFile>(Binary.get())) 40*ba592977SSimon Atanasyan return dumpObject(*Obj); 41*ba592977SSimon Atanasyan 42*ba592977SSimon Atanasyan return obj2yaml_error::unrecognized_file_format; 43*ba592977SSimon Atanasyan } 4487a02909SRafael Espindola 45c224e25dSChandler Carruth cl::opt<std::string> InputFilename(cl::Positional, cl::desc("<input file>"), 46c224e25dSChandler Carruth cl::init("-")); 4787a02909SRafael Espindola 4887a02909SRafael Espindola int main(int argc, char *argv[]) { 4987a02909SRafael Espindola cl::ParseCommandLineOptions(argc, argv); 5087a02909SRafael Espindola sys::PrintStackTraceOnErrorSignal(); 5187a02909SRafael Espindola PrettyStackTraceProgram X(argc, argv); 5287a02909SRafael Espindola llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 5387a02909SRafael Espindola 54*ba592977SSimon Atanasyan if (error_code EC = dumpInput(InputFilename)) { 55*ba592977SSimon Atanasyan errs() << "Error: '" << EC.message() << "'\n"; 56*ba592977SSimon Atanasyan return 1; 5787a02909SRafael Espindola } 5887a02909SRafael Espindola 5987a02909SRafael Espindola return 0; 6087a02909SRafael Espindola } 61