Skip to content
This repository was archived by the owner on Nov 1, 2021. It is now read-only.

Commit fbe2faf

Browse files
committed
Move input kind identification (-x) into FrontendOptions.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@87066 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent f0d8fff commit fbe2faf

File tree

6 files changed

+159
-126
lines changed

6 files changed

+159
-126
lines changed

include/clang/Frontend/FrontendOptions.h

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#define LLVM_CLANG_FRONTEND_FRONTENDOPTIONS_H
1212

1313
#include "clang/Frontend/CommandLineSourceLoc.h"
14+
#include "llvm/ADT/StringRef.h"
1415
#include <string>
1516
#include <vector>
1617

@@ -19,6 +20,21 @@ namespace clang {
1920
/// FrontendOptions - Options for controlling the behavior of the frontend.
2021
class FrontendOptions {
2122
public:
23+
enum InputKind {
24+
IK_None,
25+
IK_Asm,
26+
IK_C,
27+
IK_CXX,
28+
IK_ObjC,
29+
IK_ObjCXX,
30+
IK_PreprocessedC,
31+
IK_PreprocessedCXX,
32+
IK_PreprocessedObjC,
33+
IK_PreprocessedObjCXX,
34+
IK_OpenCL,
35+
IK_AST
36+
};
37+
2238
unsigned DebugCodeCompletionPrinter : 1; ///< Use the debug printer for code
2339
/// completion results.
2440
unsigned DisableFree : 1; ///< Disable memory freeing on exit.
@@ -44,8 +60,8 @@ class FrontendOptions {
4460
/// If given, the name of the target ABI to use.
4561
std::string TargetABI;
4662

47-
/// The input files.
48-
std::vector<std::string> InputFilenames;
63+
/// The input files and their types.
64+
std::vector<std::pair<InputKind, std::string> > Inputs;
4965

5066
/// The output file, if any.
5167
std::string OutputFile;
@@ -70,6 +86,13 @@ class FrontendOptions {
7086
ShowStats = 0;
7187
ShowTimers = 0;
7288
}
89+
90+
/// getInputKindForExtension - Return the appropriate input kind for a file
91+
/// extension. For example, "c" would return IK_C.
92+
///
93+
/// \return The input kind for the extension, or IK_None if the extension is
94+
/// not recognized.
95+
static InputKind getInputKindForExtension(llvm::StringRef Extension);
7396
};
7497

7598
} // end namespace clang

lib/Frontend/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ add_clang_library(clangFrontend
1111
DiagChecker.cpp
1212
DocumentXML.cpp
1313
FixItRewriter.cpp
14+
FrontendOptions.cpp
1415
GeneratePCH.cpp
1516
HTMLDiagnostics.cpp
1617
HTMLPrint.cpp

lib/Frontend/FrontendOptions.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//===--- FrontendOptions.cpp ----------------------------------------------===//
2+
//
3+
// The LLVM Compiler Infrastructure
4+
//
5+
// This file is distributed under the University of Illinois Open Source
6+
// License. See LICENSE.TXT for details.
7+
//
8+
//===----------------------------------------------------------------------===//
9+
10+
#include "clang/Frontend/FrontendOptions.h"
11+
#include "llvm/ADT/StringSwitch.h"
12+
using namespace clang;
13+
14+
FrontendOptions::InputKind
15+
FrontendOptions::getInputKindForExtension(llvm::StringRef Extension) {
16+
return llvm::StringSwitch<InputKind>(Extension)
17+
.Case("ast", IK_AST)
18+
.Case("c", IK_C)
19+
.Cases("S", "s", IK_Asm)
20+
.Case("i", IK_PreprocessedC)
21+
.Case("ii", IK_PreprocessedCXX)
22+
.Case("m", IK_ObjC)
23+
.Case("mi", IK_PreprocessedObjC)
24+
.Cases("mm", "M", IK_ObjCXX)
25+
.Case("mii", IK_PreprocessedObjCXX)
26+
.Case("C", IK_CXX)
27+
.Cases("C", "cc", "cp", IK_CXX)
28+
.Cases("cpp", "CPP", "c++", "cxx", IK_CXX)
29+
.Case("cl", IK_OpenCL)
30+
.Default(IK_C);
31+
}

tools/clang-cc/Options.cpp

Lines changed: 84 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,44 @@ static llvm::cl::opt<bool>
321321
EmptyInputOnly("empty-input-only",
322322
llvm::cl::desc("Force running on an empty input file"));
323323

324+
static llvm::cl::opt<FrontendOptions::InputKind>
325+
InputType("x", llvm::cl::desc("Input language type"),
326+
llvm::cl::init(FrontendOptions::IK_None),
327+
llvm::cl::values(clEnumValN(FrontendOptions::IK_C, "c", "C"),
328+
clEnumValN(FrontendOptions::IK_OpenCL, "cl", "OpenCL C"),
329+
clEnumValN(FrontendOptions::IK_CXX, "c++", "C++"),
330+
clEnumValN(FrontendOptions::IK_ObjC, "objective-c",
331+
"Objective C"),
332+
clEnumValN(FrontendOptions::IK_ObjCXX, "objective-c++",
333+
"Objective C++"),
334+
clEnumValN(FrontendOptions::IK_PreprocessedC,
335+
"cpp-output",
336+
"Preprocessed C"),
337+
clEnumValN(FrontendOptions::IK_Asm,
338+
"assembler-with-cpp",
339+
"Assembly Source Codde"),
340+
clEnumValN(FrontendOptions::IK_PreprocessedCXX,
341+
"c++-cpp-output",
342+
"Preprocessed C++"),
343+
clEnumValN(FrontendOptions::IK_PreprocessedObjC,
344+
"objective-c-cpp-output",
345+
"Preprocessed Objective C"),
346+
clEnumValN(FrontendOptions::IK_PreprocessedObjCXX,
347+
"objective-c++-cpp-output",
348+
"Preprocessed Objective C++"),
349+
clEnumValN(FrontendOptions::IK_C, "c-header",
350+
"C header"),
351+
clEnumValN(FrontendOptions::IK_ObjC, "objective-c-header",
352+
"Objective-C header"),
353+
clEnumValN(FrontendOptions::IK_CXX, "c++-header",
354+
"C++ header"),
355+
clEnumValN(FrontendOptions::IK_ObjCXX,
356+
"objective-c++-header",
357+
"Objective-C++ header"),
358+
clEnumValN(FrontendOptions::IK_AST, "ast",
359+
"Clang AST"),
360+
clEnumValEnd));
361+
324362
static llvm::cl::list<std::string>
325363
InputFilenames(llvm::cl::Positional, llvm::cl::desc("<input files>"));
326364

@@ -791,7 +829,6 @@ void clang::InitializeFrontendOptions(FrontendOptions &Opts) {
791829
Opts.EmptyInputOnly = EmptyInputOnly;
792830
Opts.FixItAll = FixItAll;
793831
Opts.FixItLocations = FixItAtLocations;
794-
Opts.InputFilenames = InputFilenames;
795832
Opts.OutputFile = OutputFile;
796833
Opts.RelocatablePCH = RelocatablePCH;
797834
Opts.ShowMacrosInCodeCompletion = CodeCompletionWantsMacros;
@@ -802,8 +839,21 @@ void clang::InitializeFrontendOptions(FrontendOptions &Opts) {
802839
Opts.ViewClassInheritance = InheritanceViewCls;
803840

804841
// '-' is the default input if none is given.
805-
if (Opts.InputFilenames.empty())
806-
Opts.InputFilenames.push_back("-");
842+
if (InputFilenames.empty()) {
843+
FrontendOptions::InputKind IK = InputType;
844+
if (IK == FrontendOptions::IK_None) IK = FrontendOptions::IK_C;
845+
Opts.Inputs.push_back(std::make_pair(IK, "-"));
846+
} else {
847+
for (unsigned i = 0, e = InputFilenames.size(); i != e; ++i) {
848+
FrontendOptions::InputKind IK = InputType;
849+
llvm::StringRef Ext =
850+
llvm::StringRef(InputFilenames[i]).rsplit('.').second;
851+
if (IK == FrontendOptions::IK_None)
852+
IK = FrontendOptions::getInputKindForExtension(Ext);
853+
Opts.Inputs.push_back(std::make_pair(IK, InputFilenames[i]));
854+
855+
}
856+
}
807857
}
808858

809859
void clang::InitializeHeaderSearchOptions(HeaderSearchOptions &Opts,
@@ -972,44 +1022,47 @@ void clang::InitializePreprocessorOptions(PreprocessorOptions &Opts) {
9721022
Opts.addInclude(*OrderedPaths[i].second);
9731023
}
9741024

975-
void clang::InitializeLangOptions(LangOptions &Options, LangKind LK,
1025+
void clang::InitializeLangOptions(LangOptions &Options,
1026+
FrontendOptions::InputKind IK,
9761027
TargetInfo &Target,
9771028
const CodeGenOptions &CodeGenOpts) {
9781029
using namespace langoptions;
9791030

9801031
bool NoPreprocess = false;
9811032

982-
switch (LK) {
983-
default: assert(0 && "Unknown language kind!");
984-
case langkind_asm_cpp:
1033+
switch (IK) {
1034+
case FrontendOptions::IK_None:
1035+
case FrontendOptions::IK_AST:
1036+
assert(0 && "Invalid input kind!");
1037+
case FrontendOptions::IK_Asm:
9851038
Options.AsmPreprocessor = 1;
9861039
// FALLTHROUGH
987-
case langkind_c_cpp:
1040+
case FrontendOptions::IK_PreprocessedC:
9881041
NoPreprocess = true;
9891042
// FALLTHROUGH
990-
case langkind_c:
1043+
case FrontendOptions::IK_C:
9911044
// Do nothing.
9921045
break;
993-
case langkind_cxx_cpp:
1046+
case FrontendOptions::IK_PreprocessedCXX:
9941047
NoPreprocess = true;
9951048
// FALLTHROUGH
996-
case langkind_cxx:
1049+
case FrontendOptions::IK_CXX:
9971050
Options.CPlusPlus = 1;
9981051
break;
999-
case langkind_objc_cpp:
1052+
case FrontendOptions::IK_PreprocessedObjC:
10001053
NoPreprocess = true;
10011054
// FALLTHROUGH
1002-
case langkind_objc:
1055+
case FrontendOptions::IK_ObjC:
10031056
Options.ObjC1 = Options.ObjC2 = 1;
10041057
break;
1005-
case langkind_objcxx_cpp:
1058+
case FrontendOptions::IK_PreprocessedObjCXX:
10061059
NoPreprocess = true;
10071060
// FALLTHROUGH
1008-
case langkind_objcxx:
1061+
case FrontendOptions::IK_ObjCXX:
10091062
Options.ObjC1 = Options.ObjC2 = 1;
10101063
Options.CPlusPlus = 1;
10111064
break;
1012-
case langkind_ocl:
1065+
case FrontendOptions::IK_OpenCL:
10131066
Options.OpenCL = 1;
10141067
Options.AltiVec = 1;
10151068
Options.CXXOperatorNames = 1;
@@ -1044,23 +1097,24 @@ void clang::InitializeLangOptions(LangOptions &Options, LangKind LK,
10441097

10451098
if (LangStd == lang_unspecified) {
10461099
// Based on the base language, pick one.
1047-
switch (LK) {
1048-
case langkind_ast: assert(0 && "Invalid call for AST inputs");
1049-
case lang_unspecified: assert(0 && "Unknown base language");
1050-
case langkind_ocl:
1100+
switch (IK) {
1101+
case FrontendOptions::IK_None:
1102+
case FrontendOptions::IK_AST:
1103+
assert(0 && "Invalid input kind!");
1104+
case FrontendOptions::IK_OpenCL:
10511105
LangStd = lang_c99;
10521106
break;
1053-
case langkind_c:
1054-
case langkind_asm_cpp:
1055-
case langkind_c_cpp:
1056-
case langkind_objc:
1057-
case langkind_objc_cpp:
1107+
case FrontendOptions::IK_Asm:
1108+
case FrontendOptions::IK_C:
1109+
case FrontendOptions::IK_PreprocessedC:
1110+
case FrontendOptions::IK_ObjC:
1111+
case FrontendOptions::IK_PreprocessedObjC:
10581112
LangStd = lang_gnu99;
10591113
break;
1060-
case langkind_cxx:
1061-
case langkind_cxx_cpp:
1062-
case langkind_objcxx:
1063-
case langkind_objcxx_cpp:
1114+
case FrontendOptions::IK_CXX:
1115+
case FrontendOptions::IK_PreprocessedCXX:
1116+
case FrontendOptions::IK_ObjCXX:
1117+
case FrontendOptions::IK_PreprocessedObjCXX:
10641118
LangStd = lang_gnucxx98;
10651119
break;
10661120
}
@@ -1139,7 +1193,7 @@ void clang::InitializeLangOptions(LangOptions &Options, LangKind LK,
11391193
// Default to not accepting '$' in identifiers when preprocessing assembler,
11401194
// but do accept when preprocessing C. FIXME: these defaults are right for
11411195
// darwin, are they right everywhere?
1142-
Options.DollarIdents = LK != langkind_asm_cpp;
1196+
Options.DollarIdents = IK != FrontendOptions::IK_Asm;
11431197
if (DollarsInIdents.getPosition()) // Explicit setting overrides default.
11441198
Options.DollarIdents = DollarsInIdents;
11451199

tools/clang-cc/Options.h

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#ifndef LLVM_CLANGCC_OPTIONS_H
1111
#define LLVM_CLANGCC_OPTIONS_H
1212

13+
#include "clang/Frontend/FrontendOptions.h"
1314
#include "llvm/ADT/StringRef.h"
1415

1516
namespace clang {
@@ -25,21 +26,6 @@ class PreprocessorOptions;
2526
class PreprocessorOutputOptions;
2627
class TargetInfo;
2728

28-
enum LangKind {
29-
langkind_unspecified,
30-
langkind_c,
31-
langkind_c_cpp,
32-
langkind_asm_cpp,
33-
langkind_cxx,
34-
langkind_cxx_cpp,
35-
langkind_objc,
36-
langkind_objc_cpp,
37-
langkind_objcxx,
38-
langkind_objcxx_cpp,
39-
langkind_ocl,
40-
langkind_ast
41-
};
42-
4329
void InitializeAnalyzerOptions(AnalyzerOptions &Opts);
4430

4531
void InitializeDependencyOutputOptions(DependencyOutputOptions &Opts);
@@ -55,7 +41,8 @@ void InitializeHeaderSearchOptions(HeaderSearchOptions &Opts,
5541
llvm::StringRef BuiltinIncludePath,
5642
const LangOptions &Lang);
5743

58-
void InitializeLangOptions(LangOptions &Options, LangKind LK,
44+
void InitializeLangOptions(LangOptions &Options,
45+
FrontendOptions::InputKind LK,
5946
TargetInfo &Target,
6047
const CodeGenOptions &CodeGenOpts);
6148

0 commit comments

Comments
 (0)