mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-18 12:29:21 +00:00
Search LLVM_LIB_SEARCH_PATH for objects to allow it to find crtend.o
Implement minor library linking optimization. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6181 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0ec3590664
commit
7cb77e188f
@ -79,12 +79,20 @@ static inline bool FileExists(const std::string &FN) {
|
|||||||
|
|
||||||
// LoadObject - Read the specified "object file", which should not search the
|
// LoadObject - Read the specified "object file", which should not search the
|
||||||
// library path to find it.
|
// library path to find it.
|
||||||
static inline std::auto_ptr<Module> LoadObject(const std::string &FN,
|
static inline std::auto_ptr<Module> LoadObject(std::string FN,
|
||||||
std::string &OutErrorMessage) {
|
std::string &OutErrorMessage) {
|
||||||
if (Verbose) std::cerr << "Loading '" << FN << "'\n";
|
if (Verbose) std::cerr << "Loading '" << FN << "'\n";
|
||||||
if (!FileExists(FN)) {
|
if (!FileExists(FN)) {
|
||||||
OutErrorMessage = "could not find input file '" + FN + "'!";
|
// Attempt to load from the LLVM_LIB_SEARCH_PATH directory... if we would
|
||||||
return std::auto_ptr<Module>();
|
// otherwise fail. This is used to locate objects like crtend.o.
|
||||||
|
//
|
||||||
|
char *SearchPath = getenv("LLVM_LIB_SEARCH_PATH");
|
||||||
|
if (SearchPath && FileExists(std::string(SearchPath)+"/"+FN))
|
||||||
|
FN = std::string(SearchPath)+"/"+FN;
|
||||||
|
else {
|
||||||
|
OutErrorMessage = "could not find input file '" + FN + "'!";
|
||||||
|
return std::auto_ptr<Module>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ErrorMessage;
|
std::string ErrorMessage;
|
||||||
@ -224,6 +232,13 @@ static void GetAllUndefinedSymbols(Module *M,
|
|||||||
|
|
||||||
static bool LinkLibrary(Module *M, const std::string &LibName,
|
static bool LinkLibrary(Module *M, const std::string &LibName,
|
||||||
std::string &ErrorMessage) {
|
std::string &ErrorMessage) {
|
||||||
|
std::set<std::string> UndefinedSymbols;
|
||||||
|
GetAllUndefinedSymbols(M, UndefinedSymbols);
|
||||||
|
if (UndefinedSymbols.empty()) {
|
||||||
|
if (Verbose) std::cerr << " No symbols undefined, don't link library!\n";
|
||||||
|
return false; // No need to link anything in!
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<Module*> Objects;
|
std::vector<Module*> Objects;
|
||||||
bool isArchive;
|
bool isArchive;
|
||||||
if (LoadLibrary(LibName, Objects, isArchive, ErrorMessage)) return true;
|
if (LoadLibrary(LibName, Objects, isArchive, ErrorMessage)) return true;
|
||||||
@ -234,9 +249,6 @@ static bool LinkLibrary(Module *M, const std::string &LibName,
|
|||||||
for (unsigned i = 0; i != Objects.size(); ++i)
|
for (unsigned i = 0; i != Objects.size(); ++i)
|
||||||
GetAllDefinedSymbols(Objects[i], DefinedSymbols[i]);
|
GetAllDefinedSymbols(Objects[i], DefinedSymbols[i]);
|
||||||
|
|
||||||
std::set<std::string> UndefinedSymbols;
|
|
||||||
GetAllUndefinedSymbols(M, UndefinedSymbols);
|
|
||||||
|
|
||||||
bool Linked = true;
|
bool Linked = true;
|
||||||
while (Linked) { // While we are linking in object files, loop.
|
while (Linked) { // While we are linking in object files, loop.
|
||||||
Linked = false;
|
Linked = false;
|
||||||
|
Loading…
Reference in New Issue
Block a user