Add very limited support for GCC's '-B' flag. This allows us to support unusual

toolchain configurations and is a small step toward FreeBSD support.

llvm-svn: 99159
This commit is contained in:
Chandler Carruth 2010-03-22 01:52:07 +00:00
parent 77eede5776
commit 8455924303
3 changed files with 27 additions and 1 deletions

View File

@ -64,6 +64,12 @@ public:
/// The path to the compiler resource directory.
std::string ResourceDir;
/// A prefix directory used to emulated a limited subset of GCC's '-Bprefix'
/// functionality.
/// FIXME: This type of customization should be removed in favor of the
/// universal driver when it is ready.
std::string PrefixDir;
/// Default host triple.
std::string DefaultHostTriple;

View File

@ -118,7 +118,7 @@ def ccc_ : Joined<"-ccc-">, Group<ccc_Group>, Flags<[Unsupported]>;
def _HASH_HASH_HASH : Flag<"-###">, Flags<[DriverOption]>,
HelpText<"Print the commands to run for this compilation">;
def A : JoinedOrSeparate<"-A">;
def B : JoinedOrSeparate<"-B">, Flags<[Unsupported]>;
def B : JoinedOrSeparate<"-B">;
def CC : Flag<"-CC">;
def C : Flag<"-C">;
def D : JoinedOrSeparate<"-D">, Group<CompileOnly_Group>;

View File

@ -172,6 +172,8 @@ Compilation *Driver::BuildCompilation(int argc, const char **argv) {
HostTriple = A->getValue(*Args);
if (const Arg *A = Args->getLastArg(options::OPT_ccc_install_dir))
Dir = A->getValue(*Args);
if (const Arg *A = Args->getLastArg(options::OPT_B))
PrefixDir = A->getValue(*Args);
Host = GetHostInfo(HostTriple);
@ -1088,6 +1090,15 @@ const char *Driver::GetNamedOutputPath(Compilation &C,
}
std::string Driver::GetFilePath(const char *Name, const ToolChain &TC) const {
// Respect a limited subset of the '-Bprefix' functionality in GCC by
// attempting to use this prefix when lokup up program paths.
if (!PrefixDir.empty()) {
llvm::sys::Path P(PrefixDir);
P.appendComponent(Name);
if (P.exists())
return P.str();
}
const ToolChain::path_list &List = TC.getFilePaths();
for (ToolChain::path_list::const_iterator
it = List.begin(), ie = List.end(); it != ie; ++it) {
@ -1102,6 +1113,15 @@ std::string Driver::GetFilePath(const char *Name, const ToolChain &TC) const {
std::string Driver::GetProgramPath(const char *Name, const ToolChain &TC,
bool WantFile) const {
// Respect a limited subset of the '-Bprefix' functionality in GCC by
// attempting to use this prefix when lokup up program paths.
if (!PrefixDir.empty()) {
llvm::sys::Path P(PrefixDir);
P.appendComponent(Name);
if (WantFile ? P.exists() : P.canExecute())
return P.str();
}
const ToolChain::path_list &List = TC.getProgramPaths();
for (ToolChain::path_list::const_iterator
it = List.begin(), ie = List.end(); it != ie; ++it) {