X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Fllvm-link%2Fllvm-link.cpp;h=369f3477fe5c99434cd1ce74d1c3b40ba6cf7292;hb=60dbe0fd0dbb5f52411a399480b2b8066839de37;hp=828b9bb8ef7016c7971585e330293e72ef3cbc80;hpb=0660f174cfea90586a2ef3cab733431e2365d018;p=oota-llvm.git diff --git a/tools/llvm-link/llvm-link.cpp b/tools/llvm-link/llvm-link.cpp index 828b9bb8ef7..369f3477fe5 100644 --- a/tools/llvm-link/llvm-link.cpp +++ b/tools/llvm-link/llvm-link.cpp @@ -13,7 +13,9 @@ //===----------------------------------------------------------------------===// #include "llvm/Linker/Linker.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/Bitcode/ReaderWriter.h" +#include "llvm/IR/AutoUpgrade.h" #include "llvm/IR/DiagnosticInfo.h" #include "llvm/IR/DiagnosticPrinter.h" #include "llvm/IR/LLVMContext.h" @@ -36,6 +38,11 @@ static cl::list InputFilenames(cl::Positional, cl::OneOrMore, cl::desc("")); +static cl::list OverridingInputs( + "override", cl::ZeroOrMore, cl::value_desc("filename"), + cl::desc( + "input bitcode file which can override previously defined symbol(s)")); + static cl::opt OutputFilename("o", cl::desc("Override output filename"), cl::init("-"), cl::value_desc("filename")); @@ -57,6 +64,16 @@ static cl::opt SuppressWarnings("suppress-warnings", cl::desc("Suppress all linking warnings"), cl::init(false)); +static cl::opt PreserveBitcodeUseListOrder( + "preserve-bc-uselistorder", + cl::desc("Preserve use-list order when writing LLVM bitcode."), + cl::init(true), cl::Hidden); + +static cl::opt PreserveAssemblyUseListOrder( + "preserve-ll-uselistorder", + cl::desc("Preserve use-list order when writing LLVM assembly."), + cl::init(false), cl::Hidden); + // Read the specified bitcode file in and return it. This routine searches the // link path for the specified file to try to find it... // @@ -68,6 +85,9 @@ loadFile(const char *argv0, const std::string &FN, LLVMContext &Context) { if (!Result) Err.print(argv0, errs()); + Result->materializeMetadata(); + UpgradeDebugInfo(*Result); + return Result; } @@ -92,6 +112,31 @@ static void diagnosticHandler(const DiagnosticInfo &DI) { errs() << '\n'; } +static bool linkFiles(const char *argv0, LLVMContext &Context, Linker &L, + const cl::list &Files, + bool OverrideDuplicateSymbols) { + for (const auto &File : Files) { + std::unique_ptr M = loadFile(argv0, File, Context); + if (!M.get()) { + errs() << argv0 << ": error loading file '" << File << "'\n"; + return false; + } + + if (verifyModule(*M, &errs())) { + errs() << argv0 << ": " << File << ": error: input module is broken!\n"; + return false; + } + + if (Verbose) + errs() << "Linking in '" << File << "'\n"; + + if (L.linkInModule(M.get(), OverrideDuplicateSymbols)) + return false; + } + + return true; +} + int main(int argc, char **argv) { // Print a stack trace if we signal out. sys::PrintStackTraceOnErrorSignal(); @@ -104,18 +149,13 @@ int main(int argc, char **argv) { auto Composite = make_unique("llvm-link", Context); Linker L(Composite.get(), diagnosticHandler); - for (unsigned i = 0; i < InputFilenames.size(); ++i) { - std::unique_ptr M = loadFile(argv[0], InputFilenames[i], Context); - if (!M.get()) { - errs() << argv[0] << ": error loading file '" <print(Out.os(), nullptr, PreserveAssemblyUseListOrder); } else if (Force || !CheckBitcodeOutputToConsole(Out.os(), true)) - WriteBitcodeToFile(Composite.get(), Out.os()); + WriteBitcodeToFile(Composite.get(), Out.os(), PreserveBitcodeUseListOrder); // Declare success. Out.keep();