Store more information in HeaderSearchOptions so that its initialization is not

language dependent.

llvm-svn: 88981
This commit is contained in:
Daniel Dunbar 2009-11-16 22:38:40 +00:00
parent 77a9d2b3ec
commit 24347f7cda
5 changed files with 33 additions and 38 deletions

View File

@ -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.

View File

@ -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

View File

@ -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;

View File

@ -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,

View File

@ -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<Diagnostic*>(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<Diagnostic*>(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());