summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorReid Spencer <rspencer@reidspencer.com>2004-11-23 23:45:49 +0000
committerReid Spencer <rspencer@reidspencer.com>2004-11-23 23:45:49 +0000
commit0b3c7d084cd0d07d84b9024fcca9a50128383004 (patch)
treebca60b4710b6d2f402e7b8b04691d2b6feea48d3 /tools
parent2d3ee4e2eb3a8d6860b7fbdd8d5b33b67e1c9d74 (diff)
downloadllvm-0b3c7d084cd0d07d84b9024fcca9a50128383004.tar.gz
llvm-0b3c7d084cd0d07d84b9024fcca9a50128383004.tar.bz2
llvm-0b3c7d084cd0d07d84b9024fcca9a50128383004.tar.xz
* Don't pass empty arguments to ExecuteAndWait because it can cause the
sub-tool to start reading its standard input instead of the specified input. * Clean up ouput of path names on error. * Extend GetPathForLinkageItem to always search the LibraryPaths and thus make it suitable for an interface function (required by llvmc.cpp). * Implement support for language-specific default library paths. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18188 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools')
-rw-r--r--tools/llvmc/CompilerDriver.cpp97
1 files changed, 56 insertions, 41 deletions
diff --git a/tools/llvmc/CompilerDriver.cpp b/tools/llvmc/CompilerDriver.cpp
index 26e4ceeb39..5f7bc4524b 100644
--- a/tools/llvmc/CompilerDriver.cpp
+++ b/tools/llvmc/CompilerDriver.cpp
@@ -176,6 +176,7 @@ public:
virtual void setWPassThrough(const StringVector& WOpts) {
WOptions = WOpts;
}
+
/// @}
/// @name Functions
/// @{
@@ -261,8 +262,9 @@ private:
break;
case 'f':
if (*PI == "%fOpts%") {
- action->args.insert(action->args.end(), fOptions.begin(),
- fOptions.end());
+ if (!fOptions.empty())
+ action->args.insert(action->args.end(), fOptions.begin(),
+ fOptions.end());
} else
found = false;
break;
@@ -331,16 +333,19 @@ private:
found = false;
break;
case 'M':
- if (*PI == "%Mopts") {
- action->args.insert(action->args.end(), MOptions.begin(),
- MOptions.end());
+ if (*PI == "%Mopts%") {
+ if (!MOptions.empty())
+ action->args.insert(action->args.end(), MOptions.begin(),
+ MOptions.end());
} else
found = false;
break;
case 'W':
- if (*PI == "%Wopts") {
- action->args.insert(action->args.end(), WOptions.begin(),
- WOptions.end());
+ if (*PI == "%Wopts%") {
+ for (StringVector::iterator I = WOptions.begin(),
+ E = WOptions.end(); I != E ; ++I ) {
+ action->args.push_back( std::string("-W") + *I );
+ }
} else
found = false;
break;
@@ -354,12 +359,12 @@ private:
(*PI)[PI->length()-1] == '%') {
throw std::string("Invalid substitution token: '") + *PI +
"' for command '" + pat->program.get() + "'";
- } else {
+ } else if (!PI->empty()) {
// It's not a legal substitution, just pass it through
action->args.push_back(*PI);
}
}
- } else {
+ } else if (!PI->empty()) {
// Its not a substitution, just put it in the action
action->args.push_back(*PI);
}
@@ -378,11 +383,12 @@ private:
sys::Path progpath = sys::Program::FindProgramByName(
action->program.get());
if (progpath.isEmpty())
- throw std::string("Can't find program '"+progpath.get()+"'");
+ throw std::string("Can't find program '"+action->program.get()+"'");
else if (progpath.executable())
action->program = progpath;
else
- throw std::string("Program '"+progpath.get()+"' is not executable.");
+ throw std::string("Program '"+action->program.get()+
+ "' is not executable.");
// Invoke the program
if (isSet(TIME_ACTIONS_FLAG)) {
@@ -403,31 +409,39 @@ private:
/// This method tries various variants of a linkage item's file
/// name to see if it can find an appropriate file to link with
- /// in the directory specified.
+ /// in the directories of the LibraryPaths.
llvm::sys::Path GetPathForLinkageItem(const std::string& link_item,
- const sys::Path& dir,
bool native = false) {
- sys::Path fullpath(dir);
- fullpath.appendFile(link_item);
- if (native) {
- fullpath.appendSuffix("a");
- } else {
- fullpath.appendSuffix("bc");
- if (fullpath.readable())
- return fullpath;
- fullpath.elideSuffix();
- fullpath.appendSuffix("o");
- if (fullpath.readable())
- return fullpath;
- fullpath = dir;
- fullpath.appendFile(std::string("lib") + link_item);
- fullpath.appendSuffix("a");
- if (fullpath.readable())
- return fullpath;
- fullpath.elideSuffix();
- fullpath.appendSuffix("so");
+ sys::Path fullpath;
+ fullpath.setFile(link_item);
+ if (fullpath.readable())
+ return fullpath;
+ for (PathVector::iterator PI = LibraryPaths.begin(),
+ PE = LibraryPaths.end(); PI != PE; ++PI) {
+ fullpath.setDirectory(PI->get());
+ fullpath.appendFile(link_item);
if (fullpath.readable())
return fullpath;
+ if (native) {
+ fullpath.appendSuffix("a");
+ } else {
+ fullpath.appendSuffix("bc");
+ if (fullpath.readable())
+ return fullpath;
+ fullpath.elideSuffix();
+ fullpath.appendSuffix("o");
+ if (fullpath.readable())
+ return fullpath;
+ fullpath = *PI;
+ fullpath.appendFile(std::string("lib") + link_item);
+ fullpath.appendSuffix("a");
+ if (fullpath.readable())
+ return fullpath;
+ fullpath.elideSuffix();
+ fullpath.appendSuffix("so");
+ if (fullpath.readable())
+ return fullpath;
+ }
}
// Didn't find one.
@@ -446,17 +460,12 @@ private:
// we must track down the file in the lib search path.
sys::Path fullpath;
if (!link_item.readable()) {
- // First, look for the library using the -L arguments specified
+ // look for the library using the -L arguments specified
// on the command line.
- PathVector::iterator PI = LibraryPaths.begin();
- PathVector::iterator PE = LibraryPaths.end();
- while (PI != PE && fullpath.isEmpty()) {
- fullpath = GetPathForLinkageItem(link_item.get(),*PI);
- ++PI;
- }
+ fullpath = GetPathForLinkageItem(link_item.get());
// If we didn't find the file in any of the library search paths
- // so we have to bail. No where else to look.
+ // we have to bail. No where else to look.
if (fullpath.isEmpty()) {
err =
std::string("Can't find linkage item '") + link_item.get() + "'";
@@ -584,6 +593,12 @@ public:
if (isSet(DEBUG_FLAG))
DumpConfigData(cd,I->second);
+ // Add the config data's library paths to the end of the list
+ for (StringVector::iterator LPI = cd->libpaths.begin(),
+ LPE = cd->libpaths.end(); LPI != LPE; ++LPI){
+ LibraryPaths.push_back(sys::Path(*LPI));
+ }
+
// Initialize the input and output files
sys::Path InFile(I->first);
sys::Path OutFile(I->first.getBasename());