[cfe-commits] r87066 - in /cfe/trunk: include/clang/Frontend/FrontendOptions.h lib/Frontend/CMakeLists.txt lib/Frontend/FrontendOptions.cpp tools/clang-cc/Options.cpp tools/clang-cc/Options.h tools/clang-cc/clang-cc.cpp
Daniel Dunbar
daniel at zuster.org
Thu Nov 12 18:06:13 PST 2009
Author: ddunbar
Date: Thu Nov 12 20:06:12 2009
New Revision: 87066
URL: http://llvm.org/viewvc/llvm-project?rev=87066&view=rev
Log:
Move input kind identification (-x) into FrontendOptions.
Added:
cfe/trunk/lib/Frontend/FrontendOptions.cpp
Modified:
cfe/trunk/include/clang/Frontend/FrontendOptions.h
cfe/trunk/lib/Frontend/CMakeLists.txt
cfe/trunk/tools/clang-cc/Options.cpp
cfe/trunk/tools/clang-cc/Options.h
cfe/trunk/tools/clang-cc/clang-cc.cpp
Modified: cfe/trunk/include/clang/Frontend/FrontendOptions.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/FrontendOptions.h?rev=87066&r1=87065&r2=87066&view=diff
==============================================================================
--- cfe/trunk/include/clang/Frontend/FrontendOptions.h (original)
+++ cfe/trunk/include/clang/Frontend/FrontendOptions.h Thu Nov 12 20:06:12 2009
@@ -11,6 +11,7 @@
#define LLVM_CLANG_FRONTEND_FRONTENDOPTIONS_H
#include "clang/Frontend/CommandLineSourceLoc.h"
+#include "llvm/ADT/StringRef.h"
#include <string>
#include <vector>
@@ -19,6 +20,21 @@
/// FrontendOptions - Options for controlling the behavior of the frontend.
class FrontendOptions {
public:
+ enum InputKind {
+ IK_None,
+ IK_Asm,
+ IK_C,
+ IK_CXX,
+ IK_ObjC,
+ IK_ObjCXX,
+ IK_PreprocessedC,
+ IK_PreprocessedCXX,
+ IK_PreprocessedObjC,
+ IK_PreprocessedObjCXX,
+ IK_OpenCL,
+ IK_AST
+ };
+
unsigned DebugCodeCompletionPrinter : 1; ///< Use the debug printer for code
/// completion results.
unsigned DisableFree : 1; ///< Disable memory freeing on exit.
@@ -44,8 +60,8 @@
/// If given, the name of the target ABI to use.
std::string TargetABI;
- /// The input files.
- std::vector<std::string> InputFilenames;
+ /// The input files and their types.
+ std::vector<std::pair<InputKind, std::string> > Inputs;
/// The output file, if any.
std::string OutputFile;
@@ -70,6 +86,13 @@
ShowStats = 0;
ShowTimers = 0;
}
+
+ /// getInputKindForExtension - Return the appropriate input kind for a file
+ /// extension. For example, "c" would return IK_C.
+ ///
+ /// \return The input kind for the extension, or IK_None if the extension is
+ /// not recognized.
+ static InputKind getInputKindForExtension(llvm::StringRef Extension);
};
} // end namespace clang
Modified: cfe/trunk/lib/Frontend/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CMakeLists.txt?rev=87066&r1=87065&r2=87066&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/CMakeLists.txt (original)
+++ cfe/trunk/lib/Frontend/CMakeLists.txt Thu Nov 12 20:06:12 2009
@@ -11,6 +11,7 @@
DiagChecker.cpp
DocumentXML.cpp
FixItRewriter.cpp
+ FrontendOptions.cpp
GeneratePCH.cpp
HTMLDiagnostics.cpp
HTMLPrint.cpp
Added: cfe/trunk/lib/Frontend/FrontendOptions.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendOptions.cpp?rev=87066&view=auto
==============================================================================
--- cfe/trunk/lib/Frontend/FrontendOptions.cpp (added)
+++ cfe/trunk/lib/Frontend/FrontendOptions.cpp Thu Nov 12 20:06:12 2009
@@ -0,0 +1,31 @@
+//===--- FrontendOptions.cpp ----------------------------------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/Frontend/FrontendOptions.h"
+#include "llvm/ADT/StringSwitch.h"
+using namespace clang;
+
+FrontendOptions::InputKind
+FrontendOptions::getInputKindForExtension(llvm::StringRef Extension) {
+ return llvm::StringSwitch<InputKind>(Extension)
+ .Case("ast", IK_AST)
+ .Case("c", IK_C)
+ .Cases("S", "s", IK_Asm)
+ .Case("i", IK_PreprocessedC)
+ .Case("ii", IK_PreprocessedCXX)
+ .Case("m", IK_ObjC)
+ .Case("mi", IK_PreprocessedObjC)
+ .Cases("mm", "M", IK_ObjCXX)
+ .Case("mii", IK_PreprocessedObjCXX)
+ .Case("C", IK_CXX)
+ .Cases("C", "cc", "cp", IK_CXX)
+ .Cases("cpp", "CPP", "c++", "cxx", IK_CXX)
+ .Case("cl", IK_OpenCL)
+ .Default(IK_C);
+}
Modified: cfe/trunk/tools/clang-cc/Options.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-cc/Options.cpp?rev=87066&r1=87065&r2=87066&view=diff
==============================================================================
--- cfe/trunk/tools/clang-cc/Options.cpp (original)
+++ cfe/trunk/tools/clang-cc/Options.cpp Thu Nov 12 20:06:12 2009
@@ -321,6 +321,44 @@
EmptyInputOnly("empty-input-only",
llvm::cl::desc("Force running on an empty input file"));
+static llvm::cl::opt<FrontendOptions::InputKind>
+InputType("x", llvm::cl::desc("Input language type"),
+ llvm::cl::init(FrontendOptions::IK_None),
+ llvm::cl::values(clEnumValN(FrontendOptions::IK_C, "c", "C"),
+ clEnumValN(FrontendOptions::IK_OpenCL, "cl", "OpenCL C"),
+ clEnumValN(FrontendOptions::IK_CXX, "c++", "C++"),
+ clEnumValN(FrontendOptions::IK_ObjC, "objective-c",
+ "Objective C"),
+ clEnumValN(FrontendOptions::IK_ObjCXX, "objective-c++",
+ "Objective C++"),
+ clEnumValN(FrontendOptions::IK_PreprocessedC,
+ "cpp-output",
+ "Preprocessed C"),
+ clEnumValN(FrontendOptions::IK_Asm,
+ "assembler-with-cpp",
+ "Assembly Source Codde"),
+ clEnumValN(FrontendOptions::IK_PreprocessedCXX,
+ "c++-cpp-output",
+ "Preprocessed C++"),
+ clEnumValN(FrontendOptions::IK_PreprocessedObjC,
+ "objective-c-cpp-output",
+ "Preprocessed Objective C"),
+ clEnumValN(FrontendOptions::IK_PreprocessedObjCXX,
+ "objective-c++-cpp-output",
+ "Preprocessed Objective C++"),
+ clEnumValN(FrontendOptions::IK_C, "c-header",
+ "C header"),
+ clEnumValN(FrontendOptions::IK_ObjC, "objective-c-header",
+ "Objective-C header"),
+ clEnumValN(FrontendOptions::IK_CXX, "c++-header",
+ "C++ header"),
+ clEnumValN(FrontendOptions::IK_ObjCXX,
+ "objective-c++-header",
+ "Objective-C++ header"),
+ clEnumValN(FrontendOptions::IK_AST, "ast",
+ "Clang AST"),
+ clEnumValEnd));
+
static llvm::cl::list<std::string>
InputFilenames(llvm::cl::Positional, llvm::cl::desc("<input files>"));
@@ -791,7 +829,6 @@
Opts.EmptyInputOnly = EmptyInputOnly;
Opts.FixItAll = FixItAll;
Opts.FixItLocations = FixItAtLocations;
- Opts.InputFilenames = InputFilenames;
Opts.OutputFile = OutputFile;
Opts.RelocatablePCH = RelocatablePCH;
Opts.ShowMacrosInCodeCompletion = CodeCompletionWantsMacros;
@@ -802,8 +839,21 @@
Opts.ViewClassInheritance = InheritanceViewCls;
// '-' is the default input if none is given.
- if (Opts.InputFilenames.empty())
- Opts.InputFilenames.push_back("-");
+ if (InputFilenames.empty()) {
+ FrontendOptions::InputKind IK = InputType;
+ if (IK == FrontendOptions::IK_None) IK = FrontendOptions::IK_C;
+ Opts.Inputs.push_back(std::make_pair(IK, "-"));
+ } else {
+ for (unsigned i = 0, e = InputFilenames.size(); i != e; ++i) {
+ FrontendOptions::InputKind IK = InputType;
+ llvm::StringRef Ext =
+ llvm::StringRef(InputFilenames[i]).rsplit('.').second;
+ if (IK == FrontendOptions::IK_None)
+ IK = FrontendOptions::getInputKindForExtension(Ext);
+ Opts.Inputs.push_back(std::make_pair(IK, InputFilenames[i]));
+
+ }
+ }
}
void clang::InitializeHeaderSearchOptions(HeaderSearchOptions &Opts,
@@ -972,44 +1022,47 @@
Opts.addInclude(*OrderedPaths[i].second);
}
-void clang::InitializeLangOptions(LangOptions &Options, LangKind LK,
+void clang::InitializeLangOptions(LangOptions &Options,
+ FrontendOptions::InputKind IK,
TargetInfo &Target,
const CodeGenOptions &CodeGenOpts) {
using namespace langoptions;
bool NoPreprocess = false;
- switch (LK) {
- default: assert(0 && "Unknown language kind!");
- case langkind_asm_cpp:
+ switch (IK) {
+ case FrontendOptions::IK_None:
+ case FrontendOptions::IK_AST:
+ assert(0 && "Invalid input kind!");
+ case FrontendOptions::IK_Asm:
Options.AsmPreprocessor = 1;
// FALLTHROUGH
- case langkind_c_cpp:
+ case FrontendOptions::IK_PreprocessedC:
NoPreprocess = true;
// FALLTHROUGH
- case langkind_c:
+ case FrontendOptions::IK_C:
// Do nothing.
break;
- case langkind_cxx_cpp:
+ case FrontendOptions::IK_PreprocessedCXX:
NoPreprocess = true;
// FALLTHROUGH
- case langkind_cxx:
+ case FrontendOptions::IK_CXX:
Options.CPlusPlus = 1;
break;
- case langkind_objc_cpp:
+ case FrontendOptions::IK_PreprocessedObjC:
NoPreprocess = true;
// FALLTHROUGH
- case langkind_objc:
+ case FrontendOptions::IK_ObjC:
Options.ObjC1 = Options.ObjC2 = 1;
break;
- case langkind_objcxx_cpp:
+ case FrontendOptions::IK_PreprocessedObjCXX:
NoPreprocess = true;
// FALLTHROUGH
- case langkind_objcxx:
+ case FrontendOptions::IK_ObjCXX:
Options.ObjC1 = Options.ObjC2 = 1;
Options.CPlusPlus = 1;
break;
- case langkind_ocl:
+ case FrontendOptions::IK_OpenCL:
Options.OpenCL = 1;
Options.AltiVec = 1;
Options.CXXOperatorNames = 1;
@@ -1044,23 +1097,24 @@
if (LangStd == lang_unspecified) {
// Based on the base language, pick one.
- switch (LK) {
- case langkind_ast: assert(0 && "Invalid call for AST inputs");
- case lang_unspecified: assert(0 && "Unknown base language");
- case langkind_ocl:
+ switch (IK) {
+ case FrontendOptions::IK_None:
+ case FrontendOptions::IK_AST:
+ assert(0 && "Invalid input kind!");
+ case FrontendOptions::IK_OpenCL:
LangStd = lang_c99;
break;
- case langkind_c:
- case langkind_asm_cpp:
- case langkind_c_cpp:
- case langkind_objc:
- case langkind_objc_cpp:
+ case FrontendOptions::IK_Asm:
+ case FrontendOptions::IK_C:
+ case FrontendOptions::IK_PreprocessedC:
+ case FrontendOptions::IK_ObjC:
+ case FrontendOptions::IK_PreprocessedObjC:
LangStd = lang_gnu99;
break;
- case langkind_cxx:
- case langkind_cxx_cpp:
- case langkind_objcxx:
- case langkind_objcxx_cpp:
+ case FrontendOptions::IK_CXX:
+ case FrontendOptions::IK_PreprocessedCXX:
+ case FrontendOptions::IK_ObjCXX:
+ case FrontendOptions::IK_PreprocessedObjCXX:
LangStd = lang_gnucxx98;
break;
}
@@ -1139,7 +1193,7 @@
// Default to not accepting '$' in identifiers when preprocessing assembler,
// but do accept when preprocessing C. FIXME: these defaults are right for
// darwin, are they right everywhere?
- Options.DollarIdents = LK != langkind_asm_cpp;
+ Options.DollarIdents = IK != FrontendOptions::IK_Asm;
if (DollarsInIdents.getPosition()) // Explicit setting overrides default.
Options.DollarIdents = DollarsInIdents;
Modified: cfe/trunk/tools/clang-cc/Options.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-cc/Options.h?rev=87066&r1=87065&r2=87066&view=diff
==============================================================================
--- cfe/trunk/tools/clang-cc/Options.h (original)
+++ cfe/trunk/tools/clang-cc/Options.h Thu Nov 12 20:06:12 2009
@@ -10,6 +10,7 @@
#ifndef LLVM_CLANGCC_OPTIONS_H
#define LLVM_CLANGCC_OPTIONS_H
+#include "clang/Frontend/FrontendOptions.h"
#include "llvm/ADT/StringRef.h"
namespace clang {
@@ -25,21 +26,6 @@
class PreprocessorOutputOptions;
class TargetInfo;
-enum LangKind {
- langkind_unspecified,
- langkind_c,
- langkind_c_cpp,
- langkind_asm_cpp,
- langkind_cxx,
- langkind_cxx_cpp,
- langkind_objc,
- langkind_objc_cpp,
- langkind_objcxx,
- langkind_objcxx_cpp,
- langkind_ocl,
- langkind_ast
-};
-
void InitializeAnalyzerOptions(AnalyzerOptions &Opts);
void InitializeDependencyOutputOptions(DependencyOutputOptions &Opts);
@@ -55,7 +41,8 @@
llvm::StringRef BuiltinIncludePath,
const LangOptions &Lang);
-void InitializeLangOptions(LangOptions &Options, LangKind LK,
+void InitializeLangOptions(LangOptions &Options,
+ FrontendOptions::InputKind LK,
TargetInfo &Target,
const CodeGenOptions &CodeGenOpts);
Modified: cfe/trunk/tools/clang-cc/clang-cc.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-cc/clang-cc.cpp?rev=87066&r1=87065&r2=87066&view=diff
==============================================================================
--- cfe/trunk/tools/clang-cc/clang-cc.cpp (original)
+++ cfe/trunk/tools/clang-cc/clang-cc.cpp Thu Nov 12 20:06:12 2009
@@ -53,7 +53,6 @@
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringMap.h"
-#include "llvm/ADT/StringSwitch.h"
#include "llvm/Config/config.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ErrorHandling.h"
@@ -166,40 +165,6 @@
clEnumValEnd));
//===----------------------------------------------------------------------===//
-// Language Options
-//===----------------------------------------------------------------------===//
-
-static llvm::cl::opt<LangKind>
-BaseLang("x", llvm::cl::desc("Base language to compile"),
- llvm::cl::init(langkind_unspecified),
- llvm::cl::values(clEnumValN(langkind_c, "c", "C"),
- clEnumValN(langkind_ocl, "cl", "OpenCL C"),
- clEnumValN(langkind_cxx, "c++", "C++"),
- clEnumValN(langkind_objc, "objective-c", "Objective C"),
- clEnumValN(langkind_objcxx,"objective-c++","Objective C++"),
- clEnumValN(langkind_c_cpp, "cpp-output",
- "Preprocessed C"),
- clEnumValN(langkind_asm_cpp, "assembler-with-cpp",
- "Preprocessed asm"),
- clEnumValN(langkind_cxx_cpp, "c++-cpp-output",
- "Preprocessed C++"),
- clEnumValN(langkind_objc_cpp, "objective-c-cpp-output",
- "Preprocessed Objective C"),
- clEnumValN(langkind_objcxx_cpp, "objective-c++-cpp-output",
- "Preprocessed Objective C++"),
- clEnumValN(langkind_c, "c-header",
- "C header"),
- clEnumValN(langkind_objc, "objective-c-header",
- "Objective-C header"),
- clEnumValN(langkind_cxx, "c++-header",
- "C++ header"),
- clEnumValN(langkind_objcxx, "objective-c++-header",
- "Objective-C++ header"),
- clEnumValN(langkind_ast, "ast",
- "Clang AST"),
- clEnumValEnd));
-
-//===----------------------------------------------------------------------===//
// Utility Methods
//===----------------------------------------------------------------------===//
@@ -860,43 +825,6 @@
exit(1);
}
-static LangKind GetLanguage(const std::vector<std::string> &Inputs) {
- // If -x was given, that's the language.
- if (BaseLang != langkind_unspecified)
- return BaseLang;
-
- // Otherwise guess it from the input filenames;
- LangKind LK = langkind_unspecified;
- for (unsigned i = 0, e = Inputs.size(); i != e; ++i) {
- llvm::StringRef Name(Inputs[i]);
- LangKind ThisKind = llvm::StringSwitch<LangKind>(Name.rsplit('.').second)
- .Case("ast", langkind_ast)
- .Case("c", langkind_c)
- .Cases("S", "s", langkind_asm_cpp)
- .Case("i", langkind_c_cpp)
- .Case("ii", langkind_cxx_cpp)
- .Case("m", langkind_objc)
- .Case("mi", langkind_objc_cpp)
- .Cases("mm", "M", langkind_objcxx)
- .Case("mii", langkind_objcxx_cpp)
- .Case("C", langkind_cxx)
- .Cases("C", "cc", "cp", langkind_cxx)
- .Cases("cpp", "CPP", "c++", "cxx", langkind_cxx)
- .Case("cl", langkind_ocl)
- .Default(langkind_c);
-
- if (LK != langkind_unspecified && ThisKind != LK) {
- llvm::errs() << "error: cannot have multiple input files of distinct "
- << "language kinds without -x\n";
- exit(1);
- }
-
- LK = ThisKind;
- }
-
- return LK;
-}
-
static TargetInfo *
ConstructCompilerInvocation(CompilerInvocation &Opts, Diagnostic &Diags,
const char *Argv0,
@@ -931,14 +859,23 @@
// options.
InitializeCodeGenOptions(Opts.getCodeGenOpts(), *Target);
+ // Determine the input language, we currently require all files to match.
+ FrontendOptions::InputKind IK = Opts.getFrontendOpts().Inputs[0].first;
+ for (unsigned i = 1, e = Opts.getFrontendOpts().Inputs.size(); i != e; ++i) {
+ if (Opts.getFrontendOpts().Inputs[i].first != IK) {
+ llvm::errs() << "error: cannot have multiple input files of distinct "
+ << "language kinds without -x\n";
+ return 0;
+ }
+ }
+
// Initialize language options.
//
// FIXME: These aren't used during operations on ASTs. Split onto a separate
// code path to make this obvious.
- LangKind LK = GetLanguage(Opts.getFrontendOpts().InputFilenames);
- IsAST = LK == langkind_ast;
+ IsAST = (IK == FrontendOptions::IK_AST);
if (!IsAST)
- InitializeLangOptions(Opts.getLangOpts(), LK, *Target,
+ InitializeLangOptions(Opts.getLangOpts(), IK, *Target,
Opts.getCodeGenOpts());
// Initialize the static analyzer options.
@@ -1043,7 +980,7 @@
ClangFrontendTimer = new llvm::Timer("Clang front-end time");
if (CompOpts.getDiagnosticOpts().VerifyDiagnostics &&
- CompOpts.getFrontendOpts().InputFilenames.size() > 1) {
+ CompOpts.getFrontendOpts().Inputs.size() > 1) {
fprintf(stderr, "-verify only works on single input files.\n");
return 1;
}
@@ -1058,9 +995,9 @@
// Create a file manager object to provide access to and cache the filesystem.
FileManager FileMgr;
- for (unsigned i = 0, e = CompOpts.getFrontendOpts().InputFilenames.size();
+ for (unsigned i = 0, e = CompOpts.getFrontendOpts().Inputs.size();
i != e; ++i) {
- const std::string &InFile = CompOpts.getFrontendOpts().InputFilenames[i];
+ const std::string &InFile = CompOpts.getFrontendOpts().Inputs[i].second;
// AST inputs are handled specially.
if (IsAST) {
More information about the cfe-commits
mailing list