diff options
Diffstat (limited to 'contrib/llvm/tools/llvm-link/llvm-link.cpp')
-rw-r--r-- | contrib/llvm/tools/llvm-link/llvm-link.cpp | 69 |
1 files changed, 39 insertions, 30 deletions
diff --git a/contrib/llvm/tools/llvm-link/llvm-link.cpp b/contrib/llvm/tools/llvm-link/llvm-link.cpp index ed8c06e..828b9bb 100644 --- a/contrib/llvm/tools/llvm-link/llvm-link.cpp +++ b/contrib/llvm/tools/llvm-link/llvm-link.cpp @@ -14,6 +14,8 @@ #include "llvm/Linker/Linker.h" #include "llvm/Bitcode/ReaderWriter.h" +#include "llvm/IR/DiagnosticInfo.h" +#include "llvm/IR/DiagnosticPrinter.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" #include "llvm/IR/Verifier.h" @@ -55,20 +57,39 @@ static cl::opt<bool> SuppressWarnings("suppress-warnings", cl::desc("Suppress all linking warnings"), cl::init(false)); -// LoadFile - Read the specified bitcode file in and return it. This routine -// searches the link path for the specified file to try to find it... +// Read the specified bitcode file in and return it. This routine searches the +// link path for the specified file to try to find it... // -static inline Module *LoadFile(const char *argv0, const std::string &FN, - LLVMContext& Context) { +static std::unique_ptr<Module> +loadFile(const char *argv0, const std::string &FN, LLVMContext &Context) { SMDiagnostic Err; if (Verbose) errs() << "Loading '" << FN << "'\n"; - Module* Result = nullptr; + std::unique_ptr<Module> Result = getLazyIRFileModule(FN, Err, Context); + if (!Result) + Err.print(argv0, errs()); - Result = ParseIRFile(FN, Err, Context); - if (Result) return Result; // Load successful! + return Result; +} + +static void diagnosticHandler(const DiagnosticInfo &DI) { + unsigned Severity = DI.getSeverity(); + switch (Severity) { + case DS_Error: + errs() << "ERROR: "; + break; + case DS_Warning: + if (SuppressWarnings) + return; + errs() << "WARNING: "; + break; + case DS_Remark: + case DS_Note: + llvm_unreachable("Only expecting warnings and errors"); + } - Err.print(argv0, errs()); - return nullptr; + DiagnosticPrinterRawOStream DP(errs()); + DI.print(DP); + errs() << '\n'; } int main(int argc, char **argv) { @@ -80,20 +101,11 @@ int main(int argc, char **argv) { llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. cl::ParseCommandLineOptions(argc, argv, "llvm linker\n"); - unsigned BaseArg = 0; - std::string ErrorMessage; + auto Composite = make_unique<Module>("llvm-link", Context); + Linker L(Composite.get(), diagnosticHandler); - std::unique_ptr<Module> Composite( - LoadFile(argv[0], InputFilenames[BaseArg], Context)); - if (!Composite.get()) { - errs() << argv[0] << ": error loading file '" - << InputFilenames[BaseArg] << "'\n"; - return 1; - } - - Linker L(Composite.get(), SuppressWarnings); - for (unsigned i = BaseArg+1; i < InputFilenames.size(); ++i) { - std::unique_ptr<Module> M(LoadFile(argv[0], InputFilenames[i], Context)); + for (unsigned i = 0; i < InputFilenames.size(); ++i) { + std::unique_ptr<Module> M = loadFile(argv[0], InputFilenames[i], Context); if (!M.get()) { errs() << argv[0] << ": error loading file '" <<InputFilenames[i]<< "'\n"; return 1; @@ -101,19 +113,16 @@ int main(int argc, char **argv) { if (Verbose) errs() << "Linking in '" << InputFilenames[i] << "'\n"; - if (L.linkInModule(M.get(), &ErrorMessage)) { - errs() << argv[0] << ": link error in '" << InputFilenames[i] - << "': " << ErrorMessage << "\n"; + if (L.linkInModule(M.get())) return 1; - } } if (DumpAsm) errs() << "Here's the assembly:\n" << *Composite; - std::string ErrorInfo; - tool_output_file Out(OutputFilename.c_str(), ErrorInfo, sys::fs::F_None); - if (!ErrorInfo.empty()) { - errs() << ErrorInfo << '\n'; + std::error_code EC; + tool_output_file Out(OutputFilename, EC, sys::fs::F_None); + if (EC) { + errs() << EC.message() << '\n'; return 1; } |