diff options
-rw-r--r-- | include/clang/Frontend/PreprocessorOptions.h | 3 | ||||
-rw-r--r-- | tools/clang-cc/Options.cpp | 87 | ||||
-rw-r--r-- | tools/clang-cc/Options.h | 5 | ||||
-rw-r--r-- | tools/clang-cc/clang-cc.cpp | 78 |
4 files changed, 94 insertions, 79 deletions
diff --git a/include/clang/Frontend/PreprocessorOptions.h b/include/clang/Frontend/PreprocessorOptions.h index fc400faa10..b918a744a2 100644 --- a/include/clang/Frontend/PreprocessorOptions.h +++ b/include/clang/Frontend/PreprocessorOptions.h @@ -11,6 +11,7 @@ #define LLVM_CLANG_FRONTEND_PREPROCESSOROPTIONS_H_ #include "llvm/ADT/StringRef.h" +#include <cassert> #include <string> #include <vector> @@ -71,7 +72,7 @@ public: void addInclude(llvm::StringRef Name) { Includes.push_back(Name); } - void addMacroInclude(const std::string &Name) { + void addMacroInclude(llvm::StringRef Name) { MacroIncludes.push_back(Name); } diff --git a/tools/clang-cc/Options.cpp b/tools/clang-cc/Options.cpp index 4f06ff5a6f..8105875d22 100644 --- a/tools/clang-cc/Options.cpp +++ b/tools/clang-cc/Options.cpp @@ -13,8 +13,11 @@ #include "Options.h" #include "clang/Frontend/CompileOptions.h" +#include "clang/Frontend/PCHReader.h" +#include "clang/Frontend/PreprocessorOptions.h" #include "clang/Basic/LangOptions.h" #include "clang/Basic/TargetInfo.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringMap.h" #include "llvm/Support/CommandLine.h" #include <stdio.h> @@ -83,6 +86,41 @@ TargetFeatures("target-feature", llvm::cl::desc("Target specific attributes")); } //===----------------------------------------------------------------------===// +// General Preprocessor Options +//===----------------------------------------------------------------------===// + +namespace preprocessoroptions { + +static llvm::cl::list<std::string> +D_macros("D", llvm::cl::value_desc("macro"), llvm::cl::Prefix, + llvm::cl::desc("Predefine the specified macro")); + +static llvm::cl::list<std::string> +ImplicitIncludes("include", llvm::cl::value_desc("file"), + llvm::cl::desc("Include file before parsing")); +static llvm::cl::list<std::string> +ImplicitMacroIncludes("imacros", llvm::cl::value_desc("file"), + llvm::cl::desc("Include macros from file before parsing")); + +static llvm::cl::opt<std::string> +ImplicitIncludePCH("include-pch", llvm::cl::value_desc("file"), + llvm::cl::desc("Include precompiled header file")); + +static llvm::cl::opt<std::string> +ImplicitIncludePTH("include-pth", llvm::cl::value_desc("file"), + llvm::cl::desc("Include file before parsing")); + +static llvm::cl::list<std::string> +U_macros("U", llvm::cl::value_desc("macro"), llvm::cl::Prefix, + llvm::cl::desc("Undefine the specified macro")); + +static llvm::cl::opt<bool> +UndefMacros("undef", llvm::cl::value_desc("macro"), + llvm::cl::desc("undef all system defines")); + +} + +//===----------------------------------------------------------------------===// // Option Object Construction //===----------------------------------------------------------------------===// @@ -155,3 +193,52 @@ void clang::InitializeCompileOptions(CompileOptions &Opts, Opts.MergeAllConstants = !NoMergeConstants; } + +void clang::InitializePreprocessorOptions(PreprocessorOptions &Opts) { + using namespace preprocessoroptions; + + Opts.setImplicitPCHInclude(ImplicitIncludePCH); + Opts.setImplicitPTHInclude(ImplicitIncludePTH); + + // Use predefines? + Opts.setUsePredefines(!UndefMacros); + + // Add macros from the command line. + unsigned d = 0, D = D_macros.size(); + unsigned u = 0, U = U_macros.size(); + while (d < D || u < U) { + if (u == U || (d < D && D_macros.getPosition(d) < U_macros.getPosition(u))) + Opts.addMacroDef(D_macros[d++]); + else + Opts.addMacroUndef(U_macros[u++]); + } + + // If -imacros are specified, include them now. These are processed before + // any -include directives. + for (unsigned i = 0, e = ImplicitMacroIncludes.size(); i != e; ++i) + Opts.addMacroInclude(ImplicitMacroIncludes[i]); + + // Add the ordered list of -includes, sorting in the implicit include options + // at the appropriate location. + llvm::SmallVector<std::pair<unsigned, std::string*>, 8> OrderedPaths; + std::string OriginalFile; + + if (!ImplicitIncludePTH.empty()) + OrderedPaths.push_back(std::make_pair(ImplicitIncludePTH.getPosition(), + &ImplicitIncludePTH)); + if (!ImplicitIncludePCH.empty()) { + OriginalFile = PCHReader::getOriginalSourceFile(ImplicitIncludePCH); + // FIXME: Don't fail like this. + if (OriginalFile.empty()) + exit(1); + OrderedPaths.push_back(std::make_pair(ImplicitIncludePCH.getPosition(), + &OriginalFile)); + } + for (unsigned i = 0, e = ImplicitIncludes.size(); i != e; ++i) + OrderedPaths.push_back(std::make_pair(ImplicitIncludes.getPosition(i), + &ImplicitIncludes[i])); + llvm::array_pod_sort(OrderedPaths.begin(), OrderedPaths.end()); + + for (unsigned i = 0, e = OrderedPaths.size(); i != e; ++i) + Opts.addInclude(*OrderedPaths[i].second); +} diff --git a/tools/clang-cc/Options.h b/tools/clang-cc/Options.h index 088029f4ad..ac9e4a58f9 100644 --- a/tools/clang-cc/Options.h +++ b/tools/clang-cc/Options.h @@ -16,13 +16,18 @@ namespace clang { class CompileOptions; class LangOptions; +class PreprocessorOptions; class TargetInfo; +// FIXME: This can be sunk into InitializeCompileOptions now that that happens +// before language initialization? void ComputeFeatureMap(TargetInfo &Target, llvm::StringMap<bool> &Features); void InitializeCompileOptions(CompileOptions &Opts, const llvm::StringMap<bool> &Features); +void InitializePreprocessorOptions(PreprocessorOptions &Opts); + } // end namespace clang #endif diff --git a/tools/clang-cc/clang-cc.cpp b/tools/clang-cc/clang-cc.cpp index 8bf02f748f..cf1fde97c2 100644 --- a/tools/clang-cc/clang-cc.cpp +++ b/tools/clang-cc/clang-cc.cpp @@ -53,7 +53,6 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringSwitch.h" -#include "llvm/ADT/STLExtras.h" #include "llvm/Config/config.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ErrorHandling.h" @@ -883,32 +882,6 @@ static bool InitializeSourceManager(Preprocessor &PP, //===----------------------------------------------------------------------===// static llvm::cl::opt<bool> -UndefMacros("undef", llvm::cl::value_desc("macro"), - llvm::cl::desc("undef all system defines")); - -static llvm::cl::list<std::string> -D_macros("D", llvm::cl::value_desc("macro"), llvm::cl::Prefix, - llvm::cl::desc("Predefine the specified macro")); -static llvm::cl::list<std::string> -U_macros("U", llvm::cl::value_desc("macro"), llvm::cl::Prefix, - llvm::cl::desc("Undefine the specified macro")); - -static llvm::cl::list<std::string> -ImplicitIncludes("include", llvm::cl::value_desc("file"), - llvm::cl::desc("Include file before parsing")); -static llvm::cl::list<std::string> -ImplicitMacroIncludes("imacros", llvm::cl::value_desc("file"), - llvm::cl::desc("Include macros from file before parsing")); - -static llvm::cl::opt<std::string> -ImplicitIncludePCH("include-pch", llvm::cl::value_desc("file"), - llvm::cl::desc("Include precompiled header file")); - -static llvm::cl::opt<std::string> -ImplicitIncludePTH("include-pth", llvm::cl::value_desc("file"), - llvm::cl::desc("Include file before parsing")); - -static llvm::cl::opt<bool> RelocatablePCH("relocatable-pch", llvm::cl::desc("Whether to build a relocatable precompiled " "header")); @@ -1087,57 +1060,6 @@ static void InitializeIncludePaths(HeaderSearchOptions &Opts, Opts.UseStandardIncludes = !nostdinc; } -static void InitializePreprocessorOptions(PreprocessorOptions &InitOpts) { - InitOpts.setImplicitPCHInclude(ImplicitIncludePCH); - InitOpts.setImplicitPTHInclude(ImplicitIncludePTH); - - // Use predefines? - InitOpts.setUsePredefines(!UndefMacros); - - // Add macros from the command line. - unsigned d = 0, D = D_macros.size(); - unsigned u = 0, U = U_macros.size(); - while (d < D || u < U) { - if (u == U || (d < D && D_macros.getPosition(d) < U_macros.getPosition(u))) - InitOpts.addMacroDef(D_macros[d++]); - else - InitOpts.addMacroUndef(U_macros[u++]); - } - - // If -imacros are specified, include them now. These are processed before - // any -include directives. - for (unsigned i = 0, e = ImplicitMacroIncludes.size(); i != e; ++i) - InitOpts.addMacroInclude(ImplicitMacroIncludes[i]); - - if (!ImplicitIncludePTH.empty() || !ImplicitIncludes.empty() || - !ImplicitIncludePCH.empty()) { - // We want to add these paths to the predefines buffer in order, make a - // temporary vector to sort by their occurrence. - llvm::SmallVector<std::pair<unsigned, std::string*>, 8> OrderedPaths; - std::string OriginalFile; // For use by -implicit-include-pch. - - if (!ImplicitIncludePTH.empty()) - OrderedPaths.push_back(std::make_pair(ImplicitIncludePTH.getPosition(), - &ImplicitIncludePTH)); - if (!ImplicitIncludePCH.empty()) { - OriginalFile = PCHReader::getOriginalSourceFile(ImplicitIncludePCH); - // FIXME: Don't fail like this. - if (OriginalFile.empty()) - exit(1); - OrderedPaths.push_back(std::make_pair(ImplicitIncludePCH.getPosition(), - &OriginalFile)); - } - for (unsigned i = 0, e = ImplicitIncludes.size(); i != e; ++i) - OrderedPaths.push_back(std::make_pair(ImplicitIncludes.getPosition(i), - &ImplicitIncludes[i])); - llvm::array_pod_sort(OrderedPaths.begin(), OrderedPaths.end()); - - // Now that they are ordered by position, add to the predefines buffer. - for (unsigned i = 0, e = OrderedPaths.size(); i != e; ++i) - InitOpts.addInclude(*OrderedPaths[i].second); - } -} - //===----------------------------------------------------------------------===// // Preprocessor construction //===----------------------------------------------------------------------===// |