X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FLinker%2FLinkArchives.cpp;h=551cc8c390d86594de9813ec264ef9b488b5a5b7;hb=f45a82890e34984ad1e1e259f8fb902caddfb0b1;hp=d00e1f2467a7e48b61c687a97356418a46a87700;hpb=5cbf985dcbc89fba3208e7baf8b6f488b06d3ec9;p=oota-llvm.git diff --git a/lib/Linker/LinkArchives.cpp b/lib/Linker/LinkArchives.cpp index d00e1f2467a..551cc8c390d 100644 --- a/lib/Linker/LinkArchives.cpp +++ b/lib/Linker/LinkArchives.cpp @@ -2,12 +2,12 @@ // // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // -// This file contains routines to handle linking together LLVM bytecode files, +// This file contains routines to handle linking together LLVM bitcode files, // and to handle annoying things like static libraries. // //===----------------------------------------------------------------------===// @@ -16,8 +16,7 @@ #include "llvm/Module.h" #include "llvm/ModuleProvider.h" #include "llvm/ADT/SetOperations.h" -#include "llvm/Bytecode/Reader.h" -#include "llvm/Bytecode/Archive.h" +#include "llvm/Bitcode/Archive.h" #include "llvm/Config/config.h" #include #include @@ -43,7 +42,7 @@ GetAllUndefinedSymbols(Module *M, std::set &UndefinedSymbols) { // If the program doesn't define a main, try pulling one in from a .a file. // This is needed for programs where the main function is defined in an // archive, such f2c'd programs. - Function *Main = M->getMainFunction(); + Function *Main = M->getFunction("main"); if (Main == 0 || Main->isDeclaration()) UndefinedSymbols.insert("main"); @@ -51,24 +50,30 @@ GetAllUndefinedSymbols(Module *M, std::set &UndefinedSymbols) { if (I->hasName()) { if (I->isDeclaration()) UndefinedSymbols.insert(I->getName()); - else if (!I->hasInternalLinkage()) { + else if (!I->hasLocalLinkage()) { assert(!I->hasDLLImportLinkage() && "Found dllimported non-external symbol!"); DefinedSymbols.insert(I->getName()); } } + for (Module::global_iterator I = M->global_begin(), E = M->global_end(); I != E; ++I) if (I->hasName()) { if (I->isDeclaration()) UndefinedSymbols.insert(I->getName()); - else if (!I->hasInternalLinkage()) { + else if (!I->hasLocalLinkage()) { assert(!I->hasDLLImportLinkage() && "Found dllimported non-external symbol!"); DefinedSymbols.insert(I->getName()); } } + for (Module::alias_iterator I = M->alias_begin(), E = M->alias_end(); + I != E; ++I) + if (I->hasName()) + DefinedSymbols.insert(I->getName()); + // Prune out any defined symbols from the undefined symbols set... for (std::set::iterator I = UndefinedSymbols.begin(); I != UndefinedSymbols.end(); ) @@ -88,8 +93,7 @@ GetAllUndefinedSymbols(Module *M, std::set &UndefinedSymbols) { /// TRUE - An error occurred. /// FALSE - No errors. bool -Linker::LinkInArchive(const sys::Path &Filename) { - +Linker::LinkInArchive(const sys::Path &Filename, bool &is_native) { // Make sure this is an archive file we're dealing with if (!Filename.isArchive()) return error("File '" + Filename.toString() + "' is not an archive."); @@ -97,7 +101,7 @@ Linker::LinkInArchive(const sys::Path &Filename) { // Open the archive file verbose("Linking archive file '" + Filename.toString() + "'"); - // Find all of the symbols currently undefined in the bytecode program. + // Find all of the symbols currently undefined in the bitcode program. // If all the symbols are defined, the program is complete, and there is // no reason to link in any archive files. std::set UndefinedSymbols; @@ -118,6 +122,11 @@ Linker::LinkInArchive(const sys::Path &Filename) { if (!arch) return error("Cannot read archive '" + Filename.toString() + "': " + ErrMsg); + if (!arch->isBitcodeArchive()) { + is_native = true; + return false; + } + is_native = false; // Save a set of symbols that are not defined by the archive. Since we're // entering a loop, there's no point searching for these multiple times. This @@ -155,6 +164,9 @@ Linker::LinkInArchive(const sys::Path &Filename) { // Get the module we must link in. std::string moduleErrorMsg; std::auto_ptr AutoModule((*I)->releaseModule( &moduleErrorMsg )); + if (!moduleErrorMsg.empty()) + return error("Could not load a module: " + moduleErrorMsg); + Module* aModule = AutoModule.get(); if (aModule != NULL) {