diff options
-rw-r--r-- | include/llvm/Module.h | 33 | ||||
-rw-r--r-- | lib/AsmParser/Parser.cpp | 11 | ||||
-rw-r--r-- | lib/Bitcode/Reader/BitcodeReader.cpp | 4 | ||||
-rw-r--r-- | lib/Bitcode/Writer/BitcodeWriter.cpp | 3 | ||||
-rw-r--r-- | lib/Linker/LinkItems.cpp | 28 | ||||
-rw-r--r-- | lib/Linker/LinkModules.cpp | 15 | ||||
-rw-r--r-- | lib/Transforms/Utils/CloneModule.cpp | 6 | ||||
-rw-r--r-- | lib/VMCore/AsmWriter.cpp | 1 | ||||
-rw-r--r-- | lib/VMCore/Module.cpp | 63 | ||||
-rw-r--r-- | tools/llc/llc.cpp | 6 | ||||
-rw-r--r-- | tools/lto/LTOCodeGenerator.cpp | 3 | ||||
-rw-r--r-- | tools/pso-stub/pso-stub.cpp | 3 |
12 files changed, 153 insertions, 23 deletions
diff --git a/include/llvm/Module.h b/include/llvm/Module.h index bf9ac51693..ae66edc5a6 100644 --- a/include/llvm/Module.h +++ b/include/llvm/Module.h @@ -21,6 +21,7 @@ #include "llvm/GlobalVariable.h" #include "llvm/Metadata.h" #include "llvm/Support/DataTypes.h" +#include <vector> // @LOCALMOD namespace llvm { @@ -120,7 +121,10 @@ public: typedef iplist<GlobalAlias> AliasListType; /// The type for the list of named metadata. typedef ilist<NamedMDNode> NamedMDListType; - + // @LOCALMOD-BEGIN + /// The type for the list of dependent libraries. + typedef std::vector<std::string> LibraryListType; + // @LOCALMOD-END /// The Global Variable iterator. typedef GlobalListType::iterator global_iterator; /// The Global Variable constant iterator. @@ -140,7 +144,10 @@ public: typedef NamedMDListType::iterator named_metadata_iterator; /// The named metadata constant interators. typedef NamedMDListType::const_iterator const_named_metadata_iterator; - + // @LOCALMOD-BEGIN + /// The Library list iterator. + typedef LibraryListType::const_iterator lib_iterator; + // @LOCALMOD-END /// An enumeration for describing the endianess of the target machine. enum Endianness { AnyEndianness, LittleEndian, BigEndian }; @@ -205,6 +212,8 @@ private: GlobalListType GlobalList; ///< The Global Variables in the module FunctionListType FunctionList; ///< The Functions in the module AliasListType AliasList; ///< The Aliases in the module + // @LOCALMOD + LibraryListType LibraryList; ///< The Libraries needed by the module NamedMDListType NamedMDList; ///< The named metadata in the module std::string GlobalScopeAsm; ///< Inline Asm at global scope. ValueSymbolTable *ValSymTab; ///< Symbol table for values @@ -567,8 +576,28 @@ public: const_iterator end () const { return FunctionList.end(); } size_t size() const { return FunctionList.size(); } bool empty() const { return FunctionList.empty(); } + // @LOCALMOD-BEGIN +/// @} +/// @name Dependent Library Iteration +/// @{ + + /// @brief Get a constant iterator to beginning of dependent library list. + inline lib_iterator lib_begin() const { return LibraryList.begin(); } + /// @brief Get a constant iterator to end of dependent library list. + inline lib_iterator lib_end() const { return LibraryList.end(); } + /// @brief Returns the number of items in the list of libraries. + inline size_t lib_size() const { return LibraryList.size(); } + void convertMetadataToLibraryList(); + void convertLibraryListToMetadata() const; + /// @brief Add a library to the list of dependent libraries + void addLibrary(StringRef Lib); + /// @brief Remove a library from the list of dependent libraries + void removeLibrary(StringRef Lib); + /// @brief Get all the libraries + inline const LibraryListType& getLibraries() const { return LibraryList; } /// @} + // @LOCALMOD-END /// @name Alias Iteration /// @{ diff --git a/lib/AsmParser/Parser.cpp b/lib/AsmParser/Parser.cpp index a473e6b713..57b4b64895 100644 --- a/lib/AsmParser/Parser.cpp +++ b/lib/AsmParser/Parser.cpp @@ -31,12 +31,21 @@ Module *llvm::ParseAssembly(MemoryBuffer *F, // If we are parsing into an existing module, do it. if (M) - return LLParser(F, SM, Err, M).Run() ? 0 : M; + // @LOCALMOD-BEGIN + if (LLParser(F, SM, Err, M).Run()) { + return 0; + } + else { + M->convertMetadataToLibraryList(); + return M; + } + // @LOCALMOD-END // Otherwise create a new module. OwningPtr<Module> M2(new Module(F->getBufferIdentifier(), Context)); if (LLParser(F, SM, Err, M2.get()).Run()) return 0; + M2->convertMetadataToLibraryList(); // @LOCALMOD return M2.take(); } diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 6098c1d61c..95650c5260 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -2999,6 +2999,8 @@ Module *llvm::getLazyBitcodeModule(MemoryBuffer *Buffer, R->materializeForwardReferencedFunctions(); + M->convertMetadataToLibraryList(); // @LOCALMOD + return M; } @@ -3020,6 +3022,8 @@ Module *llvm::getStreamedBitcodeModule(const std::string &name, R->materializeForwardReferencedFunctions(); + M->convertMetadataToLibraryList(); // @LOCALMOD + return M; } diff --git a/lib/Bitcode/Writer/BitcodeWriter.cpp b/lib/Bitcode/Writer/BitcodeWriter.cpp index ffe95d8f27..4ee63c486e 100644 --- a/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -1942,6 +1942,9 @@ void llvm::WriteBitcodeToFile(const Module *M, raw_ostream &Out) { SmallVector<char, 0> Buffer; Buffer.reserve(256*1024); + // Convert Deplib info to metadata + M->convertLibraryListToMetadata(); // @LOCALMOD + // If this is darwin or another generic macho target, reserve space for the // header. Triple TT(M->getTargetTriple()); diff --git a/lib/Linker/LinkItems.cpp b/lib/Linker/LinkItems.cpp index 124e5e4e4d..c3e55976bc 100644 --- a/lib/Linker/LinkItems.cpp +++ b/lib/Linker/LinkItems.cpp @@ -51,6 +51,21 @@ Linker::LinkInItems(const ItemList& Items, ItemList& NativeItems) { } } + // @LOCALMOD-BEGIN + // At this point we have processed all the link items provided to us. Since + // we have an aggregated module at this point, the dependent libraries in + // that module should also be aggregated with duplicates eliminated. This is + // now the time to process the dependent libraries to resolve any remaining + // symbols. + bool is_native; + for (Module::lib_iterator I = Composite->lib_begin(), + E = Composite->lib_end(); I != E; ++I) { + if(LinkInLibrary(*I, is_native)) + return true; + if (is_native) + NativeItems.push_back(std::make_pair(*I, true)); + } + // @LOCALMOD-END return false; } @@ -113,7 +128,18 @@ bool Linker::LinkInLibraries(const std::vector<std::string> &Libraries) { for (unsigned i = 0; i < Libraries.size(); ++i) if (LinkInLibrary(Libraries[i], is_native)) return true; - + // @LOCALMOD-BEGIN + // At this point we have processed all the libraries provided to us. Since + // we have an aggregated module at this point, the dependent libraries in + // that module should also be aggregated with duplicates eliminated. This is + // now the time to process the dependent libraries to resolve any remaining + // symbols. + const Module::LibraryListType& DepLibs = Composite->getLibraries(); + for (Module::LibraryListType::const_iterator I = DepLibs.begin(), + E = DepLibs.end(); I != E; ++I) + if (LinkInLibrary(*I, is_native)) + return true; + // @LOCALMOD-END return false; } diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index 6554d9c429..d2aad0859d 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -1206,7 +1206,20 @@ bool ModuleLinker::run() { DstM->setModuleInlineAsm(DstM->getModuleInlineAsm()+"\n"+ SrcM->getModuleInlineAsm()); } - + // @LOCALMOD-BEGIN + // Update the destination module's dependent libraries list with the libraries + // from the source module. There's no opportunity for duplicates here as the + // Module ensures that duplicate insertions are discarded. + for (Module::lib_iterator SI = SrcM->lib_begin(), SE = SrcM->lib_end(); + SI != SE; ++SI) + DstM->addLibrary(*SI); + + // If the source library's module id is in the dependent library list of the + // destination library, remove it since that module is now linked in. + StringRef ModuleId = SrcM->getModuleIdentifier(); + if (!ModuleId.empty()) + DstM->removeLibrary(sys::path::stem(ModuleId)); + // @LOCALMOD-END // Loop over all of the linked values to compute type mappings. computeTypeMapping(); diff --git a/lib/Transforms/Utils/CloneModule.cpp b/lib/Transforms/Utils/CloneModule.cpp index 114babd101..29ab5a72c4 100644 --- a/lib/Transforms/Utils/CloneModule.cpp +++ b/lib/Transforms/Utils/CloneModule.cpp @@ -37,7 +37,11 @@ Module *llvm::CloneModule(const Module *M, ValueToValueMapTy &VMap) { New->setDataLayout(M->getDataLayout()); New->setTargetTriple(M->getTargetTriple()); New->setModuleInlineAsm(M->getModuleInlineAsm()); - + // @LOCALMOD-BEGIN + // Copy all of the dependent libraries over. + for (Module::lib_iterator I = M->lib_begin(), E = M->lib_end(); I != E; ++I) + New->addLibrary(*I); + // @LOCALMOD-END // Loop over all of the global variables, making corresponding globals in the // new module. Here we add them to the VMap and to the new Module. We // don't worry about attributes or initializers, they will come later. diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp index 4ad08ff8a2..7268e4b684 100644 --- a/lib/VMCore/AsmWriter.cpp +++ b/lib/VMCore/AsmWriter.cpp @@ -2073,6 +2073,7 @@ void Module::print(raw_ostream &ROS, AssemblyAnnotationWriter *AAW) const { SlotTracker SlotTable(this); formatted_raw_ostream OS(ROS); AssemblyWriter W(OS, SlotTable, this, AAW); + convertLibraryListToMetadata(); // @LOCALMOD W.printModule(this); } diff --git a/lib/VMCore/Module.cpp b/lib/VMCore/Module.cpp index e6e7d99afb..206445ee13 100644 --- a/lib/VMCore/Module.cpp +++ b/lib/VMCore/Module.cpp @@ -56,6 +56,7 @@ Module::~Module() { GlobalList.clear(); FunctionList.clear(); AliasList.clear(); + LibraryList.clear(); // @LOCALMOD NamedMDList.clear(); delete ValSymTab; delete static_cast<StringMap<NamedMDNode *> *>(NamedMDSymTab); @@ -451,12 +452,59 @@ void Module::dropAllReferences() { I->dropAllReferences(); } - // @LOCALMOD-BEGIN -// TODO(pdox): -// If possible, use actual bitcode records instead of NamedMetadata. -// This is contingent upon whether we can get these changes upstreamed -// immediately, to avoid creating incompatibilities in the bitcode format. +void Module::convertMetadataToLibraryList() { + LibraryList.clear(); + // Get the DepLib node + NamedMDNode *Node = getNamedMetadata("DepLibs"); + if (!Node) + return; + for (unsigned i = 0; i < Node->getNumOperands(); i++) { + MDString* Mds = dyn_cast_or_null<MDString>( + Node->getOperand(i)->getOperand(0)); + assert(Mds && "Bad NamedMetadata operand"); + LibraryList.push_back(Mds->getString()); + } + // Clear the metadata so the linker won't try to merge it + Node->dropAllReferences(); +} + +void Module::convertLibraryListToMetadata() const { + if (LibraryList.size() == 0) + return; + // Get the DepLib node + NamedMDNode *Node = getNamedMetadata("DepLibs"); + assert(Node && "DepLibs metadata node missing"); + // Erase all existing operands + Node->dropAllReferences(); + // Add all libraries from the library list + for (Module::lib_iterator I = lib_begin(), E = lib_end(); I != E; ++I) { + MDString *value = MDString::get(getContext(), *I); + Node->addOperand(MDNode::get(getContext(), + makeArrayRef(static_cast<Value*>(value)))); + } +} + +void Module::addLibrary(StringRef Lib) { + for (Module::lib_iterator I = lib_begin(), E = lib_end(); I != E; ++I) + if (*I == Lib) + return; + LibraryList.push_back(Lib); + // If the module previously had no deplibs, it may not have the metadata node. + // Ensure it exists now, so that we don't have to create it in + // convertLibraryListToMetadata (which is const) + getOrInsertNamedMetadata("DepLibs"); +} + +void Module::removeLibrary(StringRef Lib) { + LibraryListType::iterator I = LibraryList.begin(); + LibraryListType::iterator E = LibraryList.end(); + for (;I != E; ++I) + if (*I == Lib) { + LibraryList.erase(I); + return; + } +} static std::string ModuleMetaGet(const Module *module, StringRef MetaName) { @@ -559,12 +607,11 @@ Module::dumpMeta(raw_ostream &OS) const { } OS << "\n"; OS << "SOName: " << getSOName() << "\n"; - /* Commented out until we put lib_iterator back for (Module::lib_iterator L = lib_begin(), E = lib_end(); L != E; ++L) { OS << "NeedsLibrary: " << (*L) << "\n"; - }*/ + } std::vector<NeededRecord> NList; getNeededRecords(&NList); for (unsigned i = 0; i < NList.size(); ++i) { @@ -622,12 +669,10 @@ static void getNeededRecordFor(const Module *M, // Place the complete list of needed records in NeededOut. void Module::getNeededRecords(std::vector<NeededRecord> *NeededOut) const { // Iterate through the libraries needed, grabbing each NeededRecord. - /* commented out until we pub lib_iterator back for (lib_iterator I = lib_begin(), E = lib_end(); I != E; ++I) { NeededRecord NR; getNeededRecordFor(this, *I, &NR); NeededOut->push_back(NR); } - */ } // @LOCALMOD-END diff --git a/tools/llc/llc.cpp b/tools/llc/llc.cpp index 0f03483fa0..e4294d7a04 100644 --- a/tools/llc/llc.cpp +++ b/tools/llc/llc.cpp @@ -216,12 +216,11 @@ void RecordMetadataForSrpc(const Module &mod) { bool is_shared = (mod.getOutputFormat() == Module::SharedOutputFormat); std::string soname = mod.getSOName(); NaClRecordObjectInformation(is_shared, soname); - /* TEMPORARY LOCALMOD until we put back lib_iterator for (Module::lib_iterator L = mod.lib_begin(), E = mod.lib_end(); L != E; ++L) { NaClRecordSharedLibraryDependency(*L); - } */ + } } #endif // defined(__native_client__) && defined(NACL_SRPC) // @LOCALMOD-END @@ -368,10 +367,9 @@ static int compileModule(char **argv, LLVMContext &Context) { } // Also set PIC_ for dynamic executables: // BUG= http://code.google.com/p/nativeclient/issues/detail?id=2351 - /* TEMPORARY LOCALMOD until we put back lib_iterator if (mod->lib_size() > 0) { RelocModel = Reloc::PIC_; - } */ + } #endif // defined(__native_client__) && defined(NACL_SRPC) // @LOCALMOD-END diff --git a/tools/lto/LTOCodeGenerator.cpp b/tools/lto/LTOCodeGenerator.cpp index da9b90eff1..70ede89629 100644 --- a/tools/lto/LTOCodeGenerator.cpp +++ b/tools/lto/LTOCodeGenerator.cpp @@ -219,8 +219,7 @@ void LTOCodeGenerator::setMergedModuleSOName(const char *soname) void LTOCodeGenerator::addLibraryDep(const char *lib) { Module *mergedModule = _linker.getModule(); - // TEMPORARY: make it compile until we add back addLibrary - //mergedModule->addLibrary(lib); + mergedModule->addLibrary(lib); } void LTOCodeGenerator::wrapSymbol(const char *sym) diff --git a/tools/pso-stub/pso-stub.cpp b/tools/pso-stub/pso-stub.cpp index fc6e184866..1fdc868499 100644 --- a/tools/pso-stub/pso-stub.cpp +++ b/tools/pso-stub/pso-stub.cpp @@ -162,8 +162,7 @@ void TransferLibrariesNeeded(Module *M, const ObjectFile *obj) { StringRef path; it->getPath(path); outs() << "Adding library " << path << "\n"; - // TEMPORARY LOCALMOD - // make it compile until we add back addLibrary M->addLibrary(path); + M->addLibrary(path); } } |