diff options
-rw-r--r-- | include/clang/Frontend/HeaderSearchOptions.h | 19 | ||||
-rw-r--r-- | include/clang/Frontend/InitHeaderSearch.h | 96 | ||||
-rw-r--r-- | include/clang/Frontend/Utils.h | 8 | ||||
-rw-r--r-- | lib/Frontend/InitHeaderSearch.cpp | 63 | ||||
-rw-r--r-- | tools/clang-cc/clang-cc.cpp | 19 |
5 files changed, 92 insertions, 113 deletions
diff --git a/include/clang/Frontend/HeaderSearchOptions.h b/include/clang/Frontend/HeaderSearchOptions.h index c0bd1a98ac..ee8c60e8b0 100644 --- a/include/clang/Frontend/HeaderSearchOptions.h +++ b/include/clang/Frontend/HeaderSearchOptions.h @@ -10,25 +10,34 @@ #ifndef LLVM_CLANG_FRONTEND_HEADERSEARCHOPTIONS_H #define LLVM_CLANG_FRONTEND_HEADERSEARCHOPTIONS_H -// FIXME: Drop this dependency. -#include "clang/Frontend/InitHeaderSearch.h" #include "llvm/ADT/StringRef.h" namespace clang { +namespace frontend { + /// IncludeDirGroup - Identifiers the group a include entry belongs to, which + /// represents its relative positive in the search list. + enum IncludeDirGroup { + Quoted = 0, ///< `#include ""` paths. Thing `gcc -iquote`. + Angled, ///< Paths for both `#include ""` and `#include <>`. (`-I`) + System, ///< Like Angled, but marks system directories. + After ///< Like System, but searched after the system directories. + }; +} + /// HeaderSearchOptions - Helper class for storing options related to the /// initialization of the HeaderSearch object. class HeaderSearchOptions { public: struct Entry { std::string Path; - InitHeaderSearch::IncludeDirGroup Group; + frontend::IncludeDirGroup Group; unsigned IsCXXAware : 1; unsigned IsUserSupplied : 1; unsigned IsFramework : 1; unsigned IgnoreSysRoot : 1; - Entry(llvm::StringRef _Path, InitHeaderSearch::IncludeDirGroup _Group, + Entry(llvm::StringRef _Path, frontend::IncludeDirGroup _Group, bool _IsCXXAware, bool _IsUserSupplied, bool _IsFramework, bool _IgnoreSysRoot) : Path(_Path), Group(_Group), IsCXXAware(_IsCXXAware), @@ -70,7 +79,7 @@ public: : Sysroot(_Sysroot), UseStandardIncludes(true) {} /// AddPath - Add the \arg Path path to the specified \arg Group list. - void AddPath(llvm::StringRef Path, InitHeaderSearch::IncludeDirGroup Group, + void AddPath(llvm::StringRef Path, frontend::IncludeDirGroup Group, bool IsCXXAware, bool IsUserSupplied, bool IsFramework, bool IgnoreSysRoot = false) { UserEntries.push_back(Entry(Path, Group, IsCXXAware, IsUserSupplied, diff --git a/include/clang/Frontend/InitHeaderSearch.h b/include/clang/Frontend/InitHeaderSearch.h deleted file mode 100644 index 7900253d84..0000000000 --- a/include/clang/Frontend/InitHeaderSearch.h +++ /dev/null @@ -1,96 +0,0 @@ -//===--- InitHeaderSearch.h - Initialize header search paths ----*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file defines the InitHeaderSearch class. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_FRONTEND_INIT_HEADER_SEARCH_H_ -#define LLVM_CLANG_FRONTEND_INIT_HEADER_SEARCH_H_ - -#include "clang/Lex/DirectoryLookup.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/ADT/Triple.h" -#include <string> -#include <vector> - -namespace clang { - -class HeaderSearch; -class HeaderSearchOptions; -class LangOptions; - -/// InitHeaderSearch - This class makes it easier to set the search paths of -/// a HeaderSearch object. InitHeaderSearch stores several search path lists -/// internally, which can be sent to a HeaderSearch object in one swoop. -class InitHeaderSearch { - std::vector<DirectoryLookup> IncludeGroup[4]; - HeaderSearch& Headers; - bool Verbose; - std::string isysroot; - -public: - /// IncludeDirGroup - Identifies the several search path - /// lists stored internally. - enum IncludeDirGroup { - Quoted = 0, ///< `#include ""` paths. Thing `gcc -iquote`. - Angled, ///< Paths for both `#include ""` and `#include <>`. (`-I`) - System, ///< Like Angled, but marks system directories. - After ///< Like System, but searched after the system directories. - }; - - InitHeaderSearch(HeaderSearch &HS, - bool verbose = false, const std::string &iSysroot = "") - : Headers(HS), Verbose(verbose), isysroot(iSysroot) {} - - /// AddPath - Add the specified path to the specified group list. - void AddPath(const llvm::StringRef &Path, IncludeDirGroup Group, - bool isCXXAware, bool isUserSupplied, - bool isFramework, bool IgnoreSysRoot = false); - - /// AddGnuCPlusPlusIncludePaths - Add the necessary paths to suport a gnu - /// libstdc++. - void AddGnuCPlusPlusIncludePaths(const std::string &Base, const char *Dir32, - const char *Dir64, - const llvm::Triple &triple); - - /// AddMinGWCPlusPlusIncludePaths - Add the necessary paths to suport a MinGW - /// libstdc++. - void AddMinGWCPlusPlusIncludePaths(const std::string &Base, - const char *Arch, - const char *Version); - - /// AddDelimitedPaths - Add a list of paths delimited by the system PATH - /// separator. The processing follows that of the CPATH variable for gcc. - void AddDelimitedPaths(const char *String); - - // AddDefaultCIncludePaths - Add paths that should always be searched. - void AddDefaultCIncludePaths(const llvm::Triple &triple); - - // AddDefaultCPlusPlusIncludePaths - Add paths that should be searched when - // compiling c++. - void AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple); - - /// AddDefaultSystemIncludePaths - Adds the default system include paths so - /// that e.g. stdio.h is found. - void AddDefaultSystemIncludePaths(const LangOptions &Lang, - const llvm::Triple &triple); - - /// Realize - Merges all search path lists into one list and send it to - /// HeaderSearch. - void Realize(); -}; - -void ApplyHeaderSearchOptions(const HeaderSearchOptions &HSOpts, - HeaderSearch &HS, const LangOptions &Lang, - const llvm::Triple &triple); - -} // end namespace clang - -#endif diff --git a/include/clang/Frontend/Utils.h b/include/clang/Frontend/Utils.h index 480e46ab72..f0d61c7ae2 100644 --- a/include/clang/Frontend/Utils.h +++ b/include/clang/Frontend/Utils.h @@ -18,6 +18,7 @@ #include <string> namespace llvm { +class Triple; class raw_ostream; class raw_fd_ostream; } @@ -26,6 +27,8 @@ namespace clang { class ASTConsumer; class Decl; class Diagnostic; +class HeaderSearch; +class HeaderSearchOptions; class IdentifierTable; class LangOptions; class MinimalAction; @@ -35,6 +38,11 @@ class SourceManager; class Stmt; class TargetInfo; +/// Apply the header search options to get given HeaderSearch object. +void ApplyHeaderSearchOptions(const HeaderSearchOptions &HSOpts, + HeaderSearch &HS, const LangOptions &Lang, + const llvm::Triple &triple); + /// InitializePreprocessor - Initialize the preprocessor getting it and the /// environment ready to process a single file. /// diff --git a/lib/Frontend/InitHeaderSearch.cpp b/lib/Frontend/InitHeaderSearch.cpp index f9ccb8a72f..0e120e87ac 100644 --- a/lib/Frontend/InitHeaderSearch.cpp +++ b/lib/Frontend/InitHeaderSearch.cpp @@ -11,13 +11,14 @@ // //===----------------------------------------------------------------------===// -#include "clang/Frontend/InitHeaderSearch.h" +#include "clang/Frontend/Utils.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/LangOptions.h" #include "clang/Frontend/HeaderSearchOptions.h" #include "clang/Lex/HeaderSearch.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/SmallPtrSet.h" +#include "llvm/ADT/Triple.h" #include "llvm/Support/raw_ostream.h" #include "llvm/System/Path.h" #include "llvm/Config/config.h" @@ -27,6 +28,64 @@ #include <windows.h> #endif using namespace clang; +using namespace clang::frontend; + +namespace { + +/// InitHeaderSearch - This class makes it easier to set the search paths of +/// a HeaderSearch object. InitHeaderSearch stores several search path lists +/// internally, which can be sent to a HeaderSearch object in one swoop. +class InitHeaderSearch { + std::vector<DirectoryLookup> IncludeGroup[4]; + HeaderSearch& Headers; + bool Verbose; + std::string isysroot; + +public: + + InitHeaderSearch(HeaderSearch &HS, + bool verbose = false, const std::string &iSysroot = "") + : Headers(HS), Verbose(verbose), isysroot(iSysroot) {} + + /// AddPath - Add the specified path to the specified group list. + void AddPath(const llvm::StringRef &Path, IncludeDirGroup Group, + bool isCXXAware, bool isUserSupplied, + bool isFramework, bool IgnoreSysRoot = false); + + /// AddGnuCPlusPlusIncludePaths - Add the necessary paths to suport a gnu + /// libstdc++. + void AddGnuCPlusPlusIncludePaths(const std::string &Base, const char *Dir32, + const char *Dir64, + const llvm::Triple &triple); + + /// AddMinGWCPlusPlusIncludePaths - Add the necessary paths to suport a MinGW + /// libstdc++. + void AddMinGWCPlusPlusIncludePaths(const std::string &Base, + const char *Arch, + const char *Version); + + /// AddDelimitedPaths - Add a list of paths delimited by the system PATH + /// separator. The processing follows that of the CPATH variable for gcc. + void AddDelimitedPaths(const char *String); + + // AddDefaultCIncludePaths - Add paths that should always be searched. + void AddDefaultCIncludePaths(const llvm::Triple &triple); + + // AddDefaultCPlusPlusIncludePaths - Add paths that should be searched when + // compiling c++. + void AddDefaultCPlusPlusIncludePaths(const llvm::Triple &triple); + + /// AddDefaultSystemIncludePaths - Adds the default system include paths so + /// that e.g. stdio.h is found. + void AddDefaultSystemIncludePaths(const LangOptions &Lang, + const llvm::Triple &triple); + + /// Realize - Merges all search path lists into one list and send it to + /// HeaderSearch. + void Realize(); +}; + +} void InitHeaderSearch::AddPath(const llvm::StringRef &Path, IncludeDirGroup Group, bool isCXXAware, @@ -601,7 +660,7 @@ void clang::ApplyHeaderSearchOptions(const HeaderSearchOptions &HSOpts, if (!HSOpts.BuiltinIncludePath.empty()) { // Ignore the sys root, we *always* look for clang headers relative to // supplied path. - Init.AddPath(HSOpts.BuiltinIncludePath, InitHeaderSearch::System, + Init.AddPath(HSOpts.BuiltinIncludePath, System, false, false, false, /*IgnoreSysRoot=*/ true); } diff --git a/tools/clang-cc/clang-cc.cpp b/tools/clang-cc/clang-cc.cpp index 40f8161ebf..e4bfee697e 100644 --- a/tools/clang-cc/clang-cc.cpp +++ b/tools/clang-cc/clang-cc.cpp @@ -31,7 +31,6 @@ #include "clang/Frontend/FixItRewriter.h" #include "clang/Frontend/FrontendDiagnostic.h" #include "clang/Frontend/HeaderSearchOptions.h" -#include "clang/Frontend/InitHeaderSearch.h" #include "clang/Frontend/PCHReader.h" #include "clang/Frontend/PathDiagnosticClients.h" #include "clang/Frontend/PreprocessorOptions.h" @@ -1051,32 +1050,32 @@ static void InitializeIncludePaths(HeaderSearchOptions &Opts, unsigned Iidx = 0, Fidx = 0; while (Iidx < I_dirs.size() && Fidx < F_dirs.size()) { if (I_dirs.getPosition(Iidx) < F_dirs.getPosition(Fidx)) { - Opts.AddPath(I_dirs[Iidx], InitHeaderSearch::Angled, false, true, false); + Opts.AddPath(I_dirs[Iidx], frontend::Angled, false, true, false); ++Iidx; } else { - Opts.AddPath(F_dirs[Fidx], InitHeaderSearch::Angled, false, true, true); + Opts.AddPath(F_dirs[Fidx], frontend::Angled, false, true, true); ++Fidx; } } // Consume what's left from whatever list was longer. for (; Iidx != I_dirs.size(); ++Iidx) - Opts.AddPath(I_dirs[Iidx], InitHeaderSearch::Angled, false, true, false); + Opts.AddPath(I_dirs[Iidx], frontend::Angled, false, true, false); for (; Fidx != F_dirs.size(); ++Fidx) - Opts.AddPath(F_dirs[Fidx], InitHeaderSearch::Angled, false, true, true); + Opts.AddPath(F_dirs[Fidx], frontend::Angled, false, true, true); // Handle -idirafter... options. for (unsigned i = 0, e = idirafter_dirs.size(); i != e; ++i) - Opts.AddPath(idirafter_dirs[i], InitHeaderSearch::After, + Opts.AddPath(idirafter_dirs[i], frontend::After, false, true, false); // Handle -iquote... options. for (unsigned i = 0, e = iquote_dirs.size(); i != e; ++i) - Opts.AddPath(iquote_dirs[i], InitHeaderSearch::Quoted, false, true, false); + Opts.AddPath(iquote_dirs[i], frontend::Quoted, false, true, false); // Handle -isystem... options. for (unsigned i = 0, e = isystem_dirs.size(); i != e; ++i) - Opts.AddPath(isystem_dirs[i], InitHeaderSearch::System, false, true, false); + Opts.AddPath(isystem_dirs[i], frontend::System, false, true, false); // Walk the -iprefix/-iwithprefix/-iwithprefixbefore argument lists in // parallel, processing the values in order of occurance to get the right @@ -1105,12 +1104,12 @@ static void InitializeIncludePaths(HeaderSearchOptions &Opts, iwithprefix_vals.getPosition(iwithprefix_idx) < iwithprefixbefore_vals.getPosition(iwithprefixbefore_idx))) { Opts.AddPath(Prefix+iwithprefix_vals[iwithprefix_idx], - InitHeaderSearch::System, false, false, false); + frontend::System, false, false, false); ++iwithprefix_idx; iwithprefix_done = iwithprefix_idx == iwithprefix_vals.size(); } else { Opts.AddPath(Prefix+iwithprefixbefore_vals[iwithprefixbefore_idx], - InitHeaderSearch::Angled, false, false, false); + frontend::Angled, false, false, false); ++iwithprefixbefore_idx; iwithprefixbefore_done = iwithprefixbefore_idx == iwithprefixbefore_vals.size(); |