X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=tools%2Fllvm-link%2Fllvm-link.cpp;fp=tools%2Fllvm-link%2Fllvm-link.cpp;h=369f3477fe5c99434cd1ce74d1c3b40ba6cf7292;hp=9f287e4fdb6141e0e3904cc8bc4a9e085ea10ee6;hb=fae374b95efd9f07a7bcb9fae374c10b02b9283d;hpb=d9443d717dbb3ec01ae8441dd70c2a077a7b5c09 diff --git a/tools/llvm-link/llvm-link.cpp b/tools/llvm-link/llvm-link.cpp index 9f287e4fdb6..369f3477fe5 100644 --- a/tools/llvm-link/llvm-link.cpp +++ b/tools/llvm-link/llvm-link.cpp @@ -38,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")); @@ -108,7 +113,8 @@ static void diagnosticHandler(const DiagnosticInfo &DI) { } static bool linkFiles(const char *argv0, LLVMContext &Context, Linker &L, - const cl::list &Files) { + const cl::list &Files, + bool OverrideDuplicateSymbols) { for (const auto &File : Files) { std::unique_ptr M = loadFile(argv0, File, Context); if (!M.get()) { @@ -124,7 +130,7 @@ static bool linkFiles(const char *argv0, LLVMContext &Context, Linker &L, if (Verbose) errs() << "Linking in '" << File << "'\n"; - if (L.linkInModule(M.get())) + if (L.linkInModule(M.get(), OverrideDuplicateSymbols)) return false; } @@ -143,7 +149,12 @@ int main(int argc, char **argv) { auto Composite = make_unique("llvm-link", Context); Linker L(Composite.get(), diagnosticHandler); - if (!linkFiles(argv[0], Context, L, InputFilenames)) + // First add all the regular input files + if (!linkFiles(argv[0], Context, L, InputFilenames, false)) + return 1; + + // Next the -override ones. + if (!linkFiles(argv[0], Context, L, OverridingInputs, true)) return 1; if (DumpAsm) errs() << "Here's the assembly:\n" << *Composite;