From 24347f7cdaa9ca95c599b9495104317ce4a7cbca Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Mon, 16 Nov 2009 22:38:40 +0000 Subject: [PATCH] Store more information in HeaderSearchOptions so that its initialization is not language dependent. llvm-svn: 88981 --- .../clang/Frontend/HeaderSearchOptions.h | 10 ++++---- clang/lib/Frontend/InitHeaderSearch.cpp | 9 ++++++- clang/tools/clang-cc/Options.cpp | 24 +++++++----------- clang/tools/clang-cc/Options.h | 3 +-- clang/tools/clang-cc/clang-cc.cpp | 25 ++++++++----------- 5 files changed, 33 insertions(+), 38 deletions(-) diff --git a/clang/include/clang/Frontend/HeaderSearchOptions.h b/clang/include/clang/Frontend/HeaderSearchOptions.h index 967f9067caf8..500663b82c70 100644 --- a/clang/include/clang/Frontend/HeaderSearchOptions.h +++ b/clang/include/clang/Frontend/HeaderSearchOptions.h @@ -59,11 +59,11 @@ public: /// environment variable for gcc. std::string EnvIncPath; - /// A (system-path) delimited list of include paths to be added from the - /// environment following the user specified includes and the \see EnvIncPath - /// includes (but prior to builtin and standard includes). This is parsed in - /// the same manner as the CPATH environment variable for gcc. - std::string LangEnvIncPath; + /// Per-language environmental include paths, see \see EnvIncPath. + std::string CEnvIncPath; + std::string ObjCEnvIncPath; + 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. diff --git a/clang/lib/Frontend/InitHeaderSearch.cpp b/clang/lib/Frontend/InitHeaderSearch.cpp index 70f0b2175a48..5964a26debec 100644 --- a/clang/lib/Frontend/InitHeaderSearch.cpp +++ b/clang/lib/Frontend/InitHeaderSearch.cpp @@ -636,7 +636,14 @@ void clang::ApplyHeaderSearchOptions(HeaderSearch &HS, // Add entries from CPATH and friends. Init.AddDelimitedPaths(HSOpts.EnvIncPath.c_str()); - Init.AddDelimitedPaths(HSOpts.LangEnvIncPath.c_str()); + if (Lang.CPlusPlus && Lang.ObjC1) + Init.AddDelimitedPaths(HSOpts.ObjCXXEnvIncPath.c_str()); + else if (Lang.CPlusPlus) + Init.AddDelimitedPaths(HSOpts.CXXEnvIncPath.c_str()); + else if (Lang.ObjC1) + Init.AddDelimitedPaths(HSOpts.ObjCEnvIncPath.c_str()); + else + Init.AddDelimitedPaths(HSOpts.CEnvIncPath.c_str()); if (!HSOpts.BuiltinIncludePath.empty()) { // Ignore the sys root, we *always* look for clang headers relative to diff --git a/clang/tools/clang-cc/Options.cpp b/clang/tools/clang-cc/Options.cpp index 174143d39c8f..1dccafd5260f 100644 --- a/clang/tools/clang-cc/Options.cpp +++ b/clang/tools/clang-cc/Options.cpp @@ -910,8 +910,7 @@ void clang::InitializeFrontendOptions(FrontendOptions &Opts) { } void clang::InitializeHeaderSearchOptions(HeaderSearchOptions &Opts, - llvm::StringRef BuiltinIncludePath, - const LangOptions &Lang) { + llvm::StringRef BuiltinIncludePath) { using namespace headersearchoptions; Opts.Sysroot = isysroot; @@ -993,19 +992,14 @@ void clang::InitializeHeaderSearchOptions(HeaderSearchOptions &Opts, Opts.EnvIncPath = Env; // Add language specific environment paths. - if (Lang.CPlusPlus && Lang.ObjC1) { - if (const char *Env = getenv("OBJCPLUS_INCLUDE_PATH")) - Opts.LangEnvIncPath = Env; - } else if (Lang.CPlusPlus) { - if (const char *Env = getenv("CPLUS_INCLUDE_PATH")) - Opts.LangEnvIncPath = Env; - } else if (Lang.ObjC1) { - if (const char *Env = getenv("OBJC_INCLUDE_PATH")) - Opts.LangEnvIncPath = Env; - } else { - if (const char *Env = getenv("C_INCLUDE_PATH")) - Opts.LangEnvIncPath = Env; - } + if (const char *Env = getenv("OBJCPLUS_INCLUDE_PATH")) + Opts.ObjCXXEnvIncPath = Env; + if (const char *Env = getenv("CPLUS_INCLUDE_PATH")) + Opts.CXXEnvIncPath = Env; + if (const char *Env = getenv("OBJC_INCLUDE_PATH")) + Opts.CEnvIncPath = Env; + if (const char *Env = getenv("C_INCLUDE_PATH")) + Opts.CEnvIncPath = Env; if (!nobuiltininc) Opts.BuiltinIncludePath = BuiltinIncludePath; diff --git a/clang/tools/clang-cc/Options.h b/clang/tools/clang-cc/Options.h index 0b67da3594c0..9a2fd9d59a16 100644 --- a/clang/tools/clang-cc/Options.h +++ b/clang/tools/clang-cc/Options.h @@ -40,8 +40,7 @@ void InitializeDiagnosticOptions(DiagnosticOptions &Opts); void InitializeFrontendOptions(FrontendOptions &Opts); void InitializeHeaderSearchOptions(HeaderSearchOptions &Opts, - llvm::StringRef BuiltinIncludePath, - const LangOptions &Lang); + llvm::StringRef BuiltinIncludePath); void InitializeLangOptions(LangOptions &Options, FrontendOptions::InputKind LK, diff --git a/clang/tools/clang-cc/clang-cc.cpp b/clang/tools/clang-cc/clang-cc.cpp index aea97744208c..fb397d5e7413 100644 --- a/clang/tools/clang-cc/clang-cc.cpp +++ b/clang/tools/clang-cc/clang-cc.cpp @@ -52,7 +52,7 @@ using namespace clang; //===----------------------------------------------------------------------===// -// Utility Methods +// Main driver //===----------------------------------------------------------------------===// std::string GetBuiltinIncludePath(const char *Argv0) { @@ -74,9 +74,14 @@ std::string GetBuiltinIncludePath(const char *Argv0) { return P.str(); } -//===----------------------------------------------------------------------===// -// Main driver -//===----------------------------------------------------------------------===// +static void LLVMErrorHandler(void *UserData, const std::string &Message) { + Diagnostic &Diags = *static_cast(UserData); + + Diags.Report(diag::err_fe_error_backend) << Message; + + // We cannot recover from llvm errors. + exit(1); +} /// ClangFrontendTimer - The front-end activities should charge time to it with /// TimeRegion. The -ftime-report option controls whether this will do @@ -144,15 +149,6 @@ static FrontendAction *CreateFrontendAction(CompilerInstance &CI) { } } -static void LLVMErrorHandler(void *UserData, const std::string &Message) { - Diagnostic &Diags = *static_cast(UserData); - - Diags.Report(diag::err_fe_error_backend) << Message; - - // We cannot recover from llvm errors. - exit(1); -} - static TargetInfo * ConstructCompilerInvocation(CompilerInvocation &Opts, Diagnostic &Diags, const char *Argv0, bool &IsAST) { @@ -194,8 +190,7 @@ ConstructCompilerInvocation(CompilerInvocation &Opts, Diagnostic &Diags, // Initialize the header search options. InitializeHeaderSearchOptions(Opts.getHeaderSearchOpts(), - GetBuiltinIncludePath(Argv0), - Opts.getLangOpts()); + GetBuiltinIncludePath(Argv0)); // Initialize the other preprocessor options. InitializePreprocessorOptions(Opts.getPreprocessorOpts());