@@ -321,6 +321,44 @@ static llvm::cl::opt<bool>
321
321
EmptyInputOnly (" empty-input-only" ,
322
322
llvm::cl::desc (" Force running on an empty input file" ));
323
323
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
+
324
362
static llvm::cl::list<std::string>
325
363
InputFilenames (llvm::cl::Positional, llvm::cl::desc(" <input files>" ));
326
364
@@ -791,7 +829,6 @@ void clang::InitializeFrontendOptions(FrontendOptions &Opts) {
791
829
Opts.EmptyInputOnly = EmptyInputOnly;
792
830
Opts.FixItAll = FixItAll;
793
831
Opts.FixItLocations = FixItAtLocations;
794
- Opts.InputFilenames = InputFilenames;
795
832
Opts.OutputFile = OutputFile;
796
833
Opts.RelocatablePCH = RelocatablePCH;
797
834
Opts.ShowMacrosInCodeCompletion = CodeCompletionWantsMacros;
@@ -802,8 +839,21 @@ void clang::InitializeFrontendOptions(FrontendOptions &Opts) {
802
839
Opts.ViewClassInheritance = InheritanceViewCls;
803
840
804
841
// '-' 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
+ }
807
857
}
808
858
809
859
void clang::InitializeHeaderSearchOptions (HeaderSearchOptions &Opts,
@@ -972,44 +1022,47 @@ void clang::InitializePreprocessorOptions(PreprocessorOptions &Opts) {
972
1022
Opts.addInclude (*OrderedPaths[i].second );
973
1023
}
974
1024
975
- void clang::InitializeLangOptions (LangOptions &Options, LangKind LK,
1025
+ void clang::InitializeLangOptions (LangOptions &Options,
1026
+ FrontendOptions::InputKind IK,
976
1027
TargetInfo &Target,
977
1028
const CodeGenOptions &CodeGenOpts) {
978
1029
using namespace langoptions ;
979
1030
980
1031
bool NoPreprocess = false ;
981
1032
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:
985
1038
Options.AsmPreprocessor = 1 ;
986
1039
// FALLTHROUGH
987
- case langkind_c_cpp :
1040
+ case FrontendOptions::IK_PreprocessedC :
988
1041
NoPreprocess = true ;
989
1042
// FALLTHROUGH
990
- case langkind_c :
1043
+ case FrontendOptions::IK_C :
991
1044
// Do nothing.
992
1045
break ;
993
- case langkind_cxx_cpp :
1046
+ case FrontendOptions::IK_PreprocessedCXX :
994
1047
NoPreprocess = true ;
995
1048
// FALLTHROUGH
996
- case langkind_cxx :
1049
+ case FrontendOptions::IK_CXX :
997
1050
Options.CPlusPlus = 1 ;
998
1051
break ;
999
- case langkind_objc_cpp :
1052
+ case FrontendOptions::IK_PreprocessedObjC :
1000
1053
NoPreprocess = true ;
1001
1054
// FALLTHROUGH
1002
- case langkind_objc :
1055
+ case FrontendOptions::IK_ObjC :
1003
1056
Options.ObjC1 = Options.ObjC2 = 1 ;
1004
1057
break ;
1005
- case langkind_objcxx_cpp :
1058
+ case FrontendOptions::IK_PreprocessedObjCXX :
1006
1059
NoPreprocess = true ;
1007
1060
// FALLTHROUGH
1008
- case langkind_objcxx :
1061
+ case FrontendOptions::IK_ObjCXX :
1009
1062
Options.ObjC1 = Options.ObjC2 = 1 ;
1010
1063
Options.CPlusPlus = 1 ;
1011
1064
break ;
1012
- case langkind_ocl :
1065
+ case FrontendOptions::IK_OpenCL :
1013
1066
Options.OpenCL = 1 ;
1014
1067
Options.AltiVec = 1 ;
1015
1068
Options.CXXOperatorNames = 1 ;
@@ -1044,23 +1097,24 @@ void clang::InitializeLangOptions(LangOptions &Options, LangKind LK,
1044
1097
1045
1098
if (LangStd == lang_unspecified) {
1046
1099
// 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:
1051
1105
LangStd = lang_c99;
1052
1106
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 :
1058
1112
LangStd = lang_gnu99;
1059
1113
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 :
1064
1118
LangStd = lang_gnucxx98;
1065
1119
break ;
1066
1120
}
@@ -1139,7 +1193,7 @@ void clang::InitializeLangOptions(LangOptions &Options, LangKind LK,
1139
1193
// Default to not accepting '$' in identifiers when preprocessing assembler,
1140
1194
// but do accept when preprocessing C. FIXME: these defaults are right for
1141
1195
// darwin, are they right everywhere?
1142
- Options.DollarIdents = LK != langkind_asm_cpp ;
1196
+ Options.DollarIdents = IK != FrontendOptions::IK_Asm ;
1143
1197
if (DollarsInIdents.getPosition ()) // Explicit setting overrides default.
1144
1198
Options.DollarIdents = DollarsInIdents;
1145
1199
0 commit comments