11 #include "llvm/ADT/STLExtras.h"
12 #include "llvm/ADT/StringSwitch.h"
16 using namespace clang::driver;
17 using namespace clang::driver::types;
27 #define TYPE(NAME, ID, PP_TYPE, TEMP_SUFFIX, FLAGS) \
28 { NAME, FLAGS, TEMP_SUFFIX, TY_##PP_TYPE, },
29 #include "clang/Driver/Types.def"
35 assert(
id > 0 &&
id - 1 <
numTypes &&
"Invalid Type ID.");
48 if (Id == TY_Object && CLMode)
50 if (Id == TY_Image && CLMode)
52 if (Id == TY_PP_Asm && CLMode)
58 return strchr(
getInfo(Id).Flags,
'a');
62 return strchr(
getInfo(Id).Flags,
'p');
66 return strchr(
getInfo(Id).Flags,
'u');
70 return strchr(
getInfo(Id).Flags,
'A');
74 return (Id == TY_Nothing ||
86 case TY_C:
case TY_PP_C:
88 case TY_CUDA:
case TY_PP_CUDA:
90 case TY_ObjC:
case TY_PP_ObjC:
case TY_PP_ObjC_Alias:
91 case TY_CXX:
case TY_PP_CXX:
92 case TY_ObjCXX:
case TY_PP_ObjCXX:
case TY_PP_ObjCXX_Alias:
93 case TY_CHeader:
case TY_PP_CHeader:
95 case TY_ObjCHeader:
case TY_PP_ObjCHeader:
96 case TY_CXXHeader:
case TY_PP_CXXHeader:
97 case TY_ObjCXXHeader:
case TY_PP_ObjCXXHeader:
98 case TY_AST:
case TY_ModuleFile:
99 case TY_LLVM_IR:
case TY_LLVM_BC:
109 case TY_ObjC:
case TY_PP_ObjC:
case TY_PP_ObjC_Alias:
110 case TY_ObjCXX:
case TY_PP_ObjCXX:
111 case TY_ObjCHeader:
case TY_PP_ObjCHeader:
112 case TY_ObjCXXHeader:
case TY_PP_ObjCXXHeader:
case TY_PP_ObjCXX_Alias:
122 case TY_CXX:
case TY_PP_CXX:
123 case TY_ObjCXX:
case TY_PP_ObjCXX:
case TY_PP_ObjCXX_Alias:
124 case TY_CXXHeader:
case TY_PP_CXXHeader:
125 case TY_ObjCXXHeader:
case TY_PP_ObjCXXHeader:
126 case TY_CUDA:
case TY_PP_CUDA:
case TY_CUDA_DEVICE:
144 return llvm::StringSwitch<types::ID>(Ext)
148 .Case(
"M", TY_ObjCXX)
149 .Case(
"h", TY_CHeader)
151 .Case(
"H", TY_CXXHeader)
152 .Case(
"f", TY_PP_Fortran)
153 .Case(
"F", TY_Fortran)
154 .Case(
"s", TY_PP_Asm)
155 .Case(
"asm", TY_PP_Asm)
157 .Case(
"o", TY_Object)
158 .Case(
"obj", TY_Object)
159 .Case(
"lib", TY_Object)
160 .Case(
"ii", TY_PP_CXX)
161 .Case(
"mi", TY_PP_ObjC)
162 .Case(
"mm", TY_ObjCXX)
163 .Case(
"bc", TY_LLVM_BC)
169 .Case(
"cui", TY_PP_CUDA)
170 .Case(
"hh", TY_CXXHeader)
171 .Case(
"ll", TY_LLVM_IR)
172 .Case(
"hpp", TY_CXXHeader)
182 .Case(
"for", TY_PP_Fortran)
183 .Case(
"FOR", TY_PP_Fortran)
184 .Case(
"fpp", TY_Fortran)
185 .Case(
"FPP", TY_Fortran)
186 .Case(
"f90", TY_PP_Fortran)
187 .Case(
"f95", TY_PP_Fortran)
188 .Case(
"F90", TY_Fortran)
189 .Case(
"F95", TY_Fortran)
190 .Case(
"mii", TY_PP_ObjCXX)
191 .Case(
"pcm", TY_ModuleFile)
198 for (
unsigned i=0; i<
numTypes; ++i) {
201 strcmp(Name,
getInfo(Id).Name) == 0)
210 if (Id != TY_Object) {
222 if (Id != TY_CUDA_DEVICE)
230 assert(0 < P.size() &&
"Not enough phases in list");
241 return types::TY_CXX;
243 return types::TY_PP_CXX;
244 case types::TY_CHeader:
245 return types::TY_CXXHeader;
246 case types::TY_PP_CHeader:
247 return types::TY_PP_CXXHeader;
ID lookupTypeForExtension(const char *Ext)
const char * getTypeTempSuffix(ID Id, bool CLMode=false)
bool onlyAssembleType(ID Id)
onlyAssembleType - Should this type only be assembled.
bool canTypeBeUserSpecified(ID Id)
ID lookupCXXTypeForCType(ID Id)
static const unsigned numTypes
ID getPreprocessedType(ID Id)
static const TypeInfo TypeInfos[]
const char * getTypeName(ID Id)
getTypeName - Return the name of the type for Id.
void getCompilationPhases(ID Id, llvm::SmallVectorImpl< phases::ID > &Phases)
bool isCuda(ID Id)
isCuda - Is this a CUDA input.
bool isAcceptedByClang(ID Id)
isAcceptedByClang - Can clang handle this input type.
static const TypeInfo & getInfo(unsigned id)
bool isCXX(ID Id)
isCXX - Is this a "C++" input (C++ and Obj-C++ sources and headers).
bool onlyPrecompileType(ID Id)
onlyPrecompileType - Should this type only be precompiled.
bool appendSuffixForType(ID Id)
ID lookupTypeForTypeSpecifier(const char *Name)
bool isObjC(ID Id)
isObjC - Is this an "ObjC" input (Obj-C and Obj-C++ sources and headers).