mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-11-23 16:19:52 +00:00
For PR521:
With these patches we implement the ability for the Linker library to keep track of which libraries were actually bytecode files (not archives) and cause their users to remove such files from the list of libraries to pass to the native linker. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25169 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -158,7 +158,8 @@ class Linker {
|
|||||||
/// @see getLastError
|
/// @see getLastError
|
||||||
/// @throws nothing
|
/// @throws nothing
|
||||||
bool LinkInItems (
|
bool LinkInItems (
|
||||||
const ItemList& Items // Set of libraries/files to link in
|
const ItemList& Items, ///< Set of libraries/files to link in
|
||||||
|
ItemList& NativeItems ///< Output list of native files/libs
|
||||||
);
|
);
|
||||||
|
|
||||||
/// This function links the bytecode \p Files into the composite module.
|
/// This function links the bytecode \p Files into the composite module.
|
||||||
@@ -210,7 +211,8 @@ class Linker {
|
|||||||
/// @returns true if an error occurs, false otherwise
|
/// @returns true if an error occurs, false otherwise
|
||||||
/// @brief Link one library into the module
|
/// @brief Link one library into the module
|
||||||
bool LinkInLibrary (
|
bool LinkInLibrary (
|
||||||
const std::string& Library ///< The library to link in
|
const std::string& Library, ///< The library to link in
|
||||||
|
bool& is_file ///< Indicates if lib is really a bc file
|
||||||
);
|
);
|
||||||
|
|
||||||
/// This function links one bytecode archive, \p Filename, into the module.
|
/// This function links one bytecode archive, \p Filename, into the module.
|
||||||
|
|||||||
@@ -17,17 +17,28 @@
|
|||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
// LinkItems - preserve link order for an arbitrary set of linkage items.
|
// LinkItems - This function is the main entry point into linking. It takes a
|
||||||
|
// list of LinkItem which indicates the order the files should be linked and
|
||||||
|
// how each file should be treated (plain file or with library search). The
|
||||||
|
// function only links bytecode and produces a result list of items that are
|
||||||
|
// native objects.
|
||||||
bool
|
bool
|
||||||
Linker::LinkInItems(const ItemList& Items) {
|
Linker::LinkInItems(const ItemList& Items, ItemList& NativeItems) {
|
||||||
|
// Clear the NativeItems just in case
|
||||||
|
NativeItems.clear();
|
||||||
|
|
||||||
// For each linkage item ...
|
// For each linkage item ...
|
||||||
for (ItemList::const_iterator I = Items.begin(), E = Items.end();
|
for (ItemList::const_iterator I = Items.begin(), E = Items.end();
|
||||||
I != E; ++I) {
|
I != E; ++I) {
|
||||||
if (I->second) {
|
if (I->second) {
|
||||||
// Link in the library suggested.
|
// Link in the library suggested.
|
||||||
if (LinkInLibrary(I->first))
|
bool is_file = true;
|
||||||
|
if (LinkInLibrary(I->first,is_file))
|
||||||
return true;
|
return true;
|
||||||
|
if (!is_file)
|
||||||
|
NativeItems.push_back(*I);
|
||||||
} else {
|
} else {
|
||||||
|
// Link in the file suggested
|
||||||
if (LinkInFile(sys::Path(I->first)))
|
if (LinkInFile(sys::Path(I->first)))
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -38,9 +49,10 @@ Linker::LinkInItems(const ItemList& Items) {
|
|||||||
// that module should also be aggregated with duplicates eliminated. This is
|
// that module should also be aggregated with duplicates eliminated. This is
|
||||||
// now the time to process the dependent libraries to resolve any remaining
|
// now the time to process the dependent libraries to resolve any remaining
|
||||||
// symbols.
|
// symbols.
|
||||||
|
bool is_bytecode;
|
||||||
for (Module::lib_iterator I = Composite->lib_begin(),
|
for (Module::lib_iterator I = Composite->lib_begin(),
|
||||||
E = Composite->lib_end(); I != E; ++I)
|
E = Composite->lib_end(); I != E; ++I)
|
||||||
if(LinkInLibrary(*I))
|
if(LinkInLibrary(*I, is_bytecode))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -49,24 +61,29 @@ Linker::LinkInItems(const ItemList& Items) {
|
|||||||
|
|
||||||
/// LinkInLibrary - links one library into the HeadModule.
|
/// LinkInLibrary - links one library into the HeadModule.
|
||||||
///
|
///
|
||||||
bool Linker::LinkInLibrary(const std::string& Lib) {
|
bool Linker::LinkInLibrary(const std::string& Lib, bool& is_file) {
|
||||||
|
is_file = false;
|
||||||
// Determine where this library lives.
|
// Determine where this library lives.
|
||||||
sys::Path Pathname = FindLib(Lib);
|
sys::Path Pathname = FindLib(Lib);
|
||||||
if (Pathname.isEmpty())
|
if (Pathname.isEmpty())
|
||||||
return warning("Cannot find library '" + Lib + "'");
|
return warning("Cannot find library '" + Lib + "'");
|
||||||
|
|
||||||
// If its an archive, try to link it in
|
// If its an archive, try to link it in
|
||||||
if (Pathname.isArchive()) {
|
std::string Magic;
|
||||||
if (LinkInArchive(Pathname))
|
Pathname.getMagicNumber(Magic, 64);
|
||||||
return error("Cannot link archive '" + Pathname.toString() + "'");
|
switch (sys::IdentifyFileType(Magic.c_str(), 64)) {
|
||||||
} else if (Pathname.isBytecodeFile()) {
|
case sys::BytecodeFileType:
|
||||||
|
case sys::CompressedBytecodeFileType:
|
||||||
// LLVM ".so" file.
|
// LLVM ".so" file.
|
||||||
if (LinkInFile(Pathname))
|
if (LinkInFile(Pathname))
|
||||||
return error("Cannot link file '" + Pathname.toString() + "'");
|
return error("Cannot link file '" + Pathname.toString() + "'");
|
||||||
|
is_file = true;
|
||||||
} else if (Pathname.isDynamicLibrary()) {
|
break;
|
||||||
return warning("Library '" + Lib + "' is a native dynamic library.");
|
case sys::ArchiveFileType:
|
||||||
} else {
|
if (LinkInArchive(Pathname))
|
||||||
|
return error("Cannot link archive '" + Pathname.toString() + "'");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
return warning("Supposed library '" + Lib + "' isn't a library.");
|
return warning("Supposed library '" + Lib + "' isn't a library.");
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -85,8 +102,9 @@ bool Linker::LinkInLibrary(const std::string& Lib) {
|
|||||||
bool Linker::LinkInLibraries(const std::vector<std::string> &Libraries) {
|
bool Linker::LinkInLibraries(const std::vector<std::string> &Libraries) {
|
||||||
|
|
||||||
// Process the set of libraries we've been provided.
|
// Process the set of libraries we've been provided.
|
||||||
|
bool is_bytecode;
|
||||||
for (unsigned i = 0; i < Libraries.size(); ++i)
|
for (unsigned i = 0; i < Libraries.size(); ++i)
|
||||||
if (LinkInLibrary(Libraries[i]))
|
if (LinkInLibrary(Libraries[i], is_bytecode))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// At this point we have processed all the libraries provided to us. Since
|
// At this point we have processed all the libraries provided to us. Since
|
||||||
@@ -97,7 +115,7 @@ bool Linker::LinkInLibraries(const std::vector<std::string> &Libraries) {
|
|||||||
const Module::LibraryListType& DepLibs = Composite->getLibraries();
|
const Module::LibraryListType& DepLibs = Composite->getLibraries();
|
||||||
for (Module::LibraryListType::const_iterator I = DepLibs.begin(),
|
for (Module::LibraryListType::const_iterator I = DepLibs.begin(),
|
||||||
E = DepLibs.end(); I != E; ++I)
|
E = DepLibs.end(); I != E; ++I)
|
||||||
if (LinkInLibrary(*I))
|
if (LinkInLibrary(*I, is_bytecode))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -243,11 +243,23 @@ int main(int argc, char **argv, char **envp ) {
|
|||||||
} else {
|
} else {
|
||||||
// Build a list of the items from our command line
|
// Build a list of the items from our command line
|
||||||
Linker::ItemList Items;
|
Linker::ItemList Items;
|
||||||
|
Linker::ItemList NativeItems;
|
||||||
BuildLinkItems(Items, InputFilenames, Libraries);
|
BuildLinkItems(Items, InputFilenames, Libraries);
|
||||||
|
|
||||||
// Link all the items together
|
// Link all the items together
|
||||||
if (TheLinker.LinkInItems(Items))
|
if (TheLinker.LinkInItems(Items,NativeItems))
|
||||||
return 1; // Error already printed
|
return 1; // Error already printed
|
||||||
|
|
||||||
|
// Revise the Libraries based on the remaining (native) libraries that
|
||||||
|
// were not linked in to the bytecode. This ensures that we don't attempt
|
||||||
|
// to pass a bytecode library to the native linker
|
||||||
|
Libraries.clear(); // we've consumed the libraries except for native
|
||||||
|
if ((Native || NativeCBE) && !NativeItems.empty()) {
|
||||||
|
for (Linker::ItemList::const_iterator I = NativeItems.begin(),
|
||||||
|
E = NativeItems.end(); I != E; ++I) {
|
||||||
|
Libraries.push_back(I->first);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We're done with the Linker, so tell it to release its module
|
// We're done with the Linker, so tell it to release its module
|
||||||
|
|||||||
@@ -434,10 +434,11 @@ int main(int argc, char **argv, char **envp) {
|
|||||||
} else {
|
} else {
|
||||||
// Build a list of the items from our command line
|
// Build a list of the items from our command line
|
||||||
Linker::ItemList Items;
|
Linker::ItemList Items;
|
||||||
|
Linker::ItemList NativeItems;
|
||||||
BuildLinkItems(Items, InputFilenames, Libraries);
|
BuildLinkItems(Items, InputFilenames, Libraries);
|
||||||
|
|
||||||
// Link all the items together
|
// Link all the items together
|
||||||
if (TheLinker.LinkInItems(Items) )
|
if (TheLinker.LinkInItems(Items,NativeItems) )
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user