2009/11/25 Rafael Espindola <[email protected]>:
> Now with the patch!
Attached an updated one for today's head.
Cheers,
--
Rafael Ávila de Espíndola
diff --git a/include/clang/Frontend/HeaderSearchOptions.h b/include/clang/Frontend/HeaderSearchOptions.h
index 6712977..ab989c6 100644
--- a/include/clang/Frontend/HeaderSearchOptions.h
+++ b/include/clang/Frontend/HeaderSearchOptions.h
@@ -61,13 +61,16 @@ public:
std::string CXXEnvIncPath;
std::string ObjCXXEnvIncPath;
- /// If non-empty, the path to the compiler builtin include directory, which
- /// will be searched following the user and environment includes.
- std::string BuiltinIncludePath;
+ /// The directory where clang was installed.
+ std::string ToolDir;
/// Include the system standard include search directories.
unsigned UseStandardIncludes : 1;
+ /// Include the system builtin include directories, which
+ /// will be searched following the user and environment includes.
+ unsigned UseBuiltinIncludes : 1;
+
/// Whether header search information should be output as for -v.
unsigned Verbose : 1;
diff --git a/lib/Driver/CC1Options.cpp b/lib/Driver/CC1Options.cpp
index e65d3dc..aed55b5 100644
--- a/lib/Driver/CC1Options.cpp
+++ b/lib/Driver/CC1Options.cpp
@@ -359,9 +359,9 @@ static void ParseHeaderSearchArgs(HeaderSearchOptions &Opts, ArgList &Args) {
Opts.Sysroot = getLastArgValue(Args, OPT_isysroot, "/");
Opts.Verbose = Args.hasArg(OPT_v);
Opts.UseStandardIncludes = !Args.hasArg(OPT_nostdinc);
- Opts.BuiltinIncludePath = "";
+ Opts.ToolDir = "";
if (!Args.hasArg(OPT_nobuiltininc))
- Opts.BuiltinIncludePath = "FIXME"; // FIXME: Get builtin include path!
+ Opts.ToolDir = "FIXME"; // FIXME: Get tooldir!
// Add -I... and -F... options in order.
for (arg_iterator it = Args.filtered_begin(OPT_I, OPT_F),
diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp
index be9bab1..37e1518 100644
--- a/lib/Frontend/CompilerInvocation.cpp
+++ b/lib/Frontend/CompilerInvocation.cpp
@@ -344,11 +344,13 @@ static void HeaderSearchOptsToArgs(const HeaderSearchOptions &Opts,
// FIXME: Provide an option for this, and move env detection to driver.
llvm::llvm_report_error("Not yet implemented!");
}
- if (!Opts.BuiltinIncludePath.empty()) {
+ if (!Opts.ToolDir.empty()) {
// FIXME: Provide an option for this, and move to driver.
}
if (!Opts.UseStandardIncludes)
Res.push_back("-nostdinc");
+ if (!Opts.UseBuiltinIncludes)
+ Res.push_back("-nobuiltininc");
if (Opts.Verbose)
Res.push_back("-v");
}
diff --git a/lib/Frontend/InitHeaderSearch.cpp b/lib/Frontend/InitHeaderSearch.cpp
index a40a569..ea0ce6d 100644
--- a/lib/Frontend/InitHeaderSearch.cpp
+++ b/lib/Frontend/InitHeaderSearch.cpp
@@ -14,6 +14,7 @@
#include "clang/Frontend/Utils.h"
#include "clang/Basic/FileManager.h"
#include "clang/Basic/LangOptions.h"
+#include "clang/Basic/Version.h"
#include "clang/Frontend/HeaderSearchOptions.h"
#include "clang/Lex/HeaderSearch.h"
#include "llvm/ADT/SmallString.h"
@@ -42,12 +43,15 @@ class InitHeaderSearch {
HeaderSearch& Headers;
bool Verbose;
std::string isysroot;
+ std::string ToolDir;
public:
InitHeaderSearch(HeaderSearch &HS,
- bool verbose = false, const std::string &iSysroot = "")
- : Headers(HS), Verbose(verbose), isysroot(iSysroot) {}
+ const std::string &toolDir, bool verbose = false,
+ const std::string &iSysroot = "")
+ : Headers(HS), Verbose(verbose), isysroot(iSysroot),
+ ToolDir(toolDir) {}
/// AddPath - Add the specified path to the specified group list.
void AddPath(const llvm::StringRef &Path, IncludeDirGroup Group,
@@ -441,6 +445,10 @@ void InitHeaderSearch::AddDefaultCPlusPlusIncludePaths(const llvm::Triple &tripl
llvm::Triple::OSType os = triple.getOS();
llvm::StringRef CxxIncludeRoot(CXX_INCLUDE_ROOT);
if (CxxIncludeRoot != "") {
+ if (!llvm::sys::Path::isAbsolute(CxxIncludeRoot.data(),
+ CxxIncludeRoot.size()))
+ CxxIncludeRoot = ToolDir + "/" + CxxIncludeRoot.str();
+
llvm::StringRef CxxIncludeArch(CXX_INCLUDE_ARCH);
if (CxxIncludeArch == "")
AddGnuCPlusPlusIncludePaths(CxxIncludeRoot, triple.str().c_str(),
@@ -705,7 +713,8 @@ void clang::ApplyHeaderSearchOptions(HeaderSearch &HS,
const HeaderSearchOptions &HSOpts,
const LangOptions &Lang,
const llvm::Triple &Triple) {
- InitHeaderSearch Init(HS, HSOpts.Verbose, HSOpts.Sysroot);
+ InitHeaderSearch Init(HS, HSOpts.ToolDir, HSOpts.Verbose,
+ HSOpts.Sysroot);
// Add the user defined entries.
for (unsigned i = 0, e = HSOpts.UserEntries.size(); i != e; ++i) {
@@ -725,10 +734,17 @@ void clang::ApplyHeaderSearchOptions(HeaderSearch &HS,
else
Init.AddDelimitedPaths(HSOpts.CEnvIncPath.c_str());
- if (!HSOpts.BuiltinIncludePath.empty()) {
+ if (HSOpts.UseBuiltinIncludes) {
+ llvm::sys::Path P(HSOpts.ToolDir);
+ // Get tooldir/lib/clang/<version>/include
+ P.appendComponent("lib");
+ P.appendComponent("clang");
+ P.appendComponent(CLANG_VERSION_STRING);
+ P.appendComponent("include");
+
// Ignore the sys root, we *always* look for clang headers relative to
// supplied path.
- Init.AddPath(HSOpts.BuiltinIncludePath, System,
+ Init.AddPath(P.str(), System,
false, false, false, /*IgnoreSysRoot=*/ true);
}
diff --git a/tools/clang-cc/Options.cpp b/tools/clang-cc/Options.cpp
index 34d7f40..b1ec557 100644
--- a/tools/clang-cc/Options.cpp
+++ b/tools/clang-cc/Options.cpp
@@ -868,7 +868,7 @@ void clang::InitializeFrontendOptions(FrontendOptions &Opts) {
}
void clang::InitializeHeaderSearchOptions(HeaderSearchOptions &Opts,
- llvm::StringRef BuiltinIncludePath) {
+ llvm::StringRef ToolDir) {
using namespace headersearchoptions;
if (isysroot.getPosition())
@@ -959,9 +959,8 @@ void clang::InitializeHeaderSearchOptions(HeaderSearchOptions &Opts,
if (const char *Env = getenv("C_INCLUDE_PATH"))
Opts.CEnvIncPath = Env;
- if (!nobuiltininc)
- Opts.BuiltinIncludePath = BuiltinIncludePath;
-
+ Opts.UseBuiltinIncludes = !nobuiltininc;
+ Opts.ToolDir = ToolDir;
Opts.UseStandardIncludes = !nostdinc;
}
diff --git a/tools/clang-cc/Options.h b/tools/clang-cc/Options.h
index 8367223..70a98b3 100644
--- a/tools/clang-cc/Options.h
+++ b/tools/clang-cc/Options.h
@@ -40,7 +40,7 @@ void InitializeDiagnosticOptions(DiagnosticOptions &Opts);
void InitializeFrontendOptions(FrontendOptions &Opts);
void InitializeHeaderSearchOptions(HeaderSearchOptions &Opts,
- llvm::StringRef BuiltinIncludePath);
+ llvm::StringRef ToolDir);
void InitializeLangOptions(LangOptions &Options, FrontendOptions::InputKind LK);
diff --git a/tools/clang-cc/clang-cc.cpp b/tools/clang-cc/clang-cc.cpp
index 02eddc8..b79e52f 100644
--- a/tools/clang-cc/clang-cc.cpp
+++ b/tools/clang-cc/clang-cc.cpp
@@ -46,20 +46,14 @@ using namespace clang;
// Main driver
//===----------------------------------------------------------------------===//
-std::string GetBuiltinIncludePath(const char *Argv0) {
+std::string GetToolDir(const char *Argv0) {
llvm::sys::Path P =
llvm::sys::Path::GetMainExecutable(Argv0,
- (void*)(intptr_t) GetBuiltinIncludePath);
+ (void*)(intptr_t) GetToolDir);
if (!P.isEmpty()) {
P.eraseComponent(); // Remove /clang from foo/bin/clang
P.eraseComponent(); // Remove /bin from foo/bin
-
- // Get foo/lib/clang/<version>/include
- P.appendComponent("lib");
- P.appendComponent("clang");
- P.appendComponent(CLANG_VERSION_STRING);
- P.appendComponent("include");
}
return P.str();
@@ -173,9 +167,10 @@ static bool ConstructCompilerInvocation(CompilerInvocation &Opts,
// Initialize the dependency output options (-M...).
InitializeDependencyOutputOptions(Opts.getDependencyOutputOpts());
+ const std::string &ToolDir = GetToolDir(Argv0);
// Initialize the header search options.
InitializeHeaderSearchOptions(Opts.getHeaderSearchOpts(),
- GetBuiltinIncludePath(Argv0));
+ ToolDir);
// Initialize the other preprocessor options.
InitializePreprocessorOptions(Opts.getPreprocessorOpts());
@@ -311,4 +306,3 @@ int main(int argc, char **argv) {
return (Clang.getDiagnostics().getNumErrors() != 0);
}
-
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits