16da90771SNick Lewycky //===--- Types.cpp - Driver input & temporary type information ------------===//
21a873893SDaniel Dunbar //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61a873893SDaniel Dunbar //
71a873893SDaniel Dunbar //===----------------------------------------------------------------------===//
81a873893SDaniel Dunbar 
91a873893SDaniel Dunbar #include "clang/Driver/Types.h"
10e5ade767SPuyan Lotfi #include "clang/Driver/Driver.h"
11e5ade767SPuyan Lotfi #include "clang/Driver/DriverDiagnostic.h"
12e5ade767SPuyan Lotfi #include "clang/Driver/Options.h"
13e5ce831cSCraig Topper #include "llvm/ADT/STLExtras.h"
14298a1ed4SPuyan Lotfi #include "llvm/ADT/SmallVector.h"
15e5ade767SPuyan Lotfi #include "llvm/ADT/StringSwitch.h"
16e5ade767SPuyan Lotfi #include "llvm/Option/Arg.h"
171a873893SDaniel Dunbar #include <cassert>
18298a1ed4SPuyan Lotfi #include <cstring>
191a873893SDaniel Dunbar 
201a873893SDaniel Dunbar using namespace clang::driver;
211a873893SDaniel Dunbar using namespace clang::driver::types;
221a873893SDaniel Dunbar 
23a76762c9SDaniel Dunbar struct TypeInfo {
241a873893SDaniel Dunbar   const char *Name;
251a873893SDaniel Dunbar   const char *TempSuffix;
261a873893SDaniel Dunbar   ID PreprocessedType;
275a098086SBenjamin Kramer   class PhasesBitSet {
285a098086SBenjamin Kramer     unsigned Bits = 0;
295a098086SBenjamin Kramer 
305a098086SBenjamin Kramer   public:
PhasesBitSet(std::initializer_list<phases::ID> Phases)3127e0077dSBenjamin Kramer     constexpr PhasesBitSet(std::initializer_list<phases::ID> Phases) {
325a098086SBenjamin Kramer       for (auto Id : Phases)
335a098086SBenjamin Kramer         Bits |= 1 << Id;
345a098086SBenjamin Kramer     }
contains(phases::ID Id) const355a098086SBenjamin Kramer     bool contains(phases::ID Id) const { return Bits & (1 << Id); }
365a098086SBenjamin Kramer   } Phases;
371a873893SDaniel Dunbar };
381a873893SDaniel Dunbar 
395a098086SBenjamin Kramer static constexpr TypeInfo TypeInfos[] = {
4061b6b0ebSPuyan Lotfi #define TYPE(NAME, ID, PP_TYPE, TEMP_SUFFIX, ...) \
4161b6b0ebSPuyan Lotfi   { NAME, TEMP_SUFFIX, TY_##PP_TYPE, { __VA_ARGS__ }, },
421a873893SDaniel Dunbar #include "clang/Driver/Types.def"
431a873893SDaniel Dunbar #undef TYPE
441a873893SDaniel Dunbar };
45f15014ffSBenjamin Kramer static const unsigned numTypes = llvm::array_lengthof(TypeInfos);
461a873893SDaniel Dunbar 
getInfo(unsigned id)47221c1fd6SNuno Lopes static const TypeInfo &getInfo(unsigned id) {
481a873893SDaniel Dunbar   assert(id > 0 && id - 1 < numTypes && "Invalid Type ID.");
491a873893SDaniel Dunbar   return TypeInfos[id - 1];
501a873893SDaniel Dunbar }
511a873893SDaniel Dunbar 
getTypeName(ID Id)521a873893SDaniel Dunbar const char *types::getTypeName(ID Id) {
531a873893SDaniel Dunbar   return getInfo(Id).Name;
541a873893SDaniel Dunbar }
551a873893SDaniel Dunbar 
getPreprocessedType(ID Id)561a873893SDaniel Dunbar types::ID types::getPreprocessedType(ID Id) {
57c07c83b1SPuyan Lotfi   ID PPT = getInfo(Id).PreprocessedType;
585a098086SBenjamin Kramer   assert((getInfo(Id).Phases.contains(phases::Preprocess) !=
59c07c83b1SPuyan Lotfi           (PPT == TY_INVALID)) &&
60c07c83b1SPuyan Lotfi          "Unexpected Preprocess Type.");
61c07c83b1SPuyan Lotfi   return PPT;
62c07c83b1SPuyan Lotfi }
63c07c83b1SPuyan Lotfi 
isPreprocessedModuleType(ID Id)645a098086SBenjamin Kramer static bool isPreprocessedModuleType(ID Id) {
65c07c83b1SPuyan Lotfi   return Id == TY_CXXModule || Id == TY_PP_CXXModule;
661a873893SDaniel Dunbar }
671a873893SDaniel Dunbar 
isPreprocessedHeaderUnitType(ID Id)685c6a1464SIain Sandoe static bool isPreprocessedHeaderUnitType(ID Id) {
695c6a1464SIain Sandoe   return Id == TY_CXXSHeader || Id == TY_CXXUHeader || Id == TY_CXXHUHeader ||
705c6a1464SIain Sandoe          Id == TY_PP_CXXHeaderUnit;
715c6a1464SIain Sandoe }
725c6a1464SIain Sandoe 
getPrecompiledType(ID Id)73dd4ad3d2SRichard Smith types::ID types::getPrecompiledType(ID Id) {
745a098086SBenjamin Kramer   if (isPreprocessedModuleType(Id))
75dd4ad3d2SRichard Smith     return TY_ModuleFile;
765c6a1464SIain Sandoe   if (isPreprocessedHeaderUnitType(Id))
775c6a1464SIain Sandoe     return TY_HeaderUnit;
78dd4ad3d2SRichard Smith   if (onlyPrecompileType(Id))
79dd4ad3d2SRichard Smith     return TY_PCH;
80dd4ad3d2SRichard Smith   return TY_INVALID;
81dd4ad3d2SRichard Smith }
82dd4ad3d2SRichard Smith 
getTypeTempSuffix(ID Id,bool CLMode)830a0faa98SHans Wennborg const char *types::getTypeTempSuffix(ID Id, bool CLMode) {
8426228e30SHans Wennborg   if (CLMode) {
8526228e30SHans Wennborg     switch (Id) {
8626228e30SHans Wennborg     case TY_Object:
8726228e30SHans Wennborg     case TY_LTO_BC:
880a0faa98SHans Wennborg       return "obj";
8926228e30SHans Wennborg     case TY_Image:
90207fcf0eSHans Wennborg       return "exe";
9126228e30SHans Wennborg     case TY_PP_Asm:
922c21f74fSHans Wennborg       return "asm";
9326228e30SHans Wennborg     default:
9426228e30SHans Wennborg       break;
9526228e30SHans Wennborg     }
9626228e30SHans Wennborg   }
971a873893SDaniel Dunbar   return getInfo(Id).TempSuffix;
981a873893SDaniel Dunbar }
991a873893SDaniel Dunbar 
onlyPrecompileType(ID Id)1001a873893SDaniel Dunbar bool types::onlyPrecompileType(ID Id) {
1015a098086SBenjamin Kramer   return getInfo(Id).Phases.contains(phases::Precompile) &&
1025a098086SBenjamin Kramer          !isPreprocessedModuleType(Id);
1031a873893SDaniel Dunbar }
1041a873893SDaniel Dunbar 
canTypeBeUserSpecified(ID Id)1051a873893SDaniel Dunbar bool types::canTypeBeUserSpecified(ID Id) {
10661b6b0ebSPuyan Lotfi   static const clang::driver::types::ID kStaticLangageTypes[] = {
10761b6b0ebSPuyan Lotfi       TY_CUDA_DEVICE,   TY_HIP_DEVICE,    TY_PP_CHeader,
10861b6b0ebSPuyan Lotfi       TY_PP_ObjCHeader, TY_PP_CXXHeader,  TY_PP_ObjCXXHeader,
10961b6b0ebSPuyan Lotfi       TY_PP_CXXModule,  TY_LTO_IR,        TY_LTO_BC,
11061b6b0ebSPuyan Lotfi       TY_Plist,         TY_RewrittenObjC, TY_RewrittenLegacyObjC,
11161b6b0ebSPuyan Lotfi       TY_Remap,         TY_PCH,           TY_Object,
11261b6b0ebSPuyan Lotfi       TY_Image,         TY_dSYM,          TY_Dependencies,
11361b6b0ebSPuyan Lotfi       TY_CUDA_FATBIN,   TY_HIP_FATBIN};
11461b6b0ebSPuyan Lotfi   return !llvm::is_contained(kStaticLangageTypes, Id);
1151a873893SDaniel Dunbar }
1161a873893SDaniel Dunbar 
appendSuffixForType(ID Id)1171a873893SDaniel Dunbar bool types::appendSuffixForType(ID Id) {
118c07c83b1SPuyan Lotfi   return Id == TY_PCH || Id == TY_dSYM || Id == TY_CUDA_FATBIN ||
119c07c83b1SPuyan Lotfi          Id == TY_HIP_FATBIN;
1201a873893SDaniel Dunbar }
1211a873893SDaniel Dunbar 
canLipoType(ID Id)122208f0269SDaniel Dunbar bool types::canLipoType(ID Id) {
123208f0269SDaniel Dunbar   return (Id == TY_Nothing ||
124208f0269SDaniel Dunbar           Id == TY_Image ||
125637ecd20SChad Rosier           Id == TY_Object ||
126637ecd20SChad Rosier           Id == TY_LTO_BC);
127208f0269SDaniel Dunbar }
128208f0269SDaniel Dunbar 
isAcceptedByClang(ID Id)1295cc9ebb7SNick Lewycky bool types::isAcceptedByClang(ID Id) {
1305cc9ebb7SNick Lewycky   switch (Id) {
1315cc9ebb7SNick Lewycky   default:
1325cc9ebb7SNick Lewycky     return false;
1335cc9ebb7SNick Lewycky 
1345cc9ebb7SNick Lewycky   case TY_Asm:
1355cc9ebb7SNick Lewycky   case TY_C: case TY_PP_C:
136d1c8a151SAnastasia Stulova   case TY_CL: case TY_CLCXX:
13783a6dcc4SArtem Belevich   case TY_CUDA: case TY_PP_CUDA:
1380ff05cd1SArtem Belevich   case TY_CUDA_DEVICE:
1399809db70SYaxun Liu   case TY_HIP:
1409809db70SYaxun Liu   case TY_PP_HIP:
1419809db70SYaxun Liu   case TY_HIP_DEVICE:
1425cc9ebb7SNick Lewycky   case TY_ObjC: case TY_PP_ObjC: case TY_PP_ObjC_Alias:
1435cc9ebb7SNick Lewycky   case TY_CXX: case TY_PP_CXX:
1445cc9ebb7SNick Lewycky   case TY_ObjCXX: case TY_PP_ObjCXX: case TY_PP_ObjCXX_Alias:
1455cc9ebb7SNick Lewycky   case TY_CHeader: case TY_PP_CHeader:
1465cc9ebb7SNick Lewycky   case TY_CLHeader:
1475cc9ebb7SNick Lewycky   case TY_ObjCHeader: case TY_PP_ObjCHeader:
1485cc9ebb7SNick Lewycky   case TY_CXXHeader: case TY_PP_CXXHeader:
1495c6a1464SIain Sandoe   case TY_CXXSHeader:
1505c6a1464SIain Sandoe   case TY_CXXUHeader:
1515c6a1464SIain Sandoe   case TY_CXXHUHeader:
1525c6a1464SIain Sandoe   case TY_PP_CXXHeaderUnit:
1535cc9ebb7SNick Lewycky   case TY_ObjCXXHeader: case TY_PP_ObjCXXHeader:
154dd4ad3d2SRichard Smith   case TY_CXXModule: case TY_PP_CXXModule:
1553895466eSLuboš Luňák   case TY_AST: case TY_ModuleFile: case TY_PCH:
1565cc9ebb7SNick Lewycky   case TY_LLVM_IR: case TY_LLVM_BC:
157b1d946cbSZixu Wang   case TY_API_INFO:
1585cc9ebb7SNick Lewycky     return true;
1595cc9ebb7SNick Lewycky   }
1605cc9ebb7SNick Lewycky }
1615cc9ebb7SNick Lewycky 
isAcceptedByFlang(ID Id)162*b9f3b7f8SAndrzej Warzynski bool types::isAcceptedByFlang(ID Id) {
163*b9f3b7f8SAndrzej Warzynski   switch (Id) {
164*b9f3b7f8SAndrzej Warzynski   default:
165*b9f3b7f8SAndrzej Warzynski     return false;
166*b9f3b7f8SAndrzej Warzynski 
167*b9f3b7f8SAndrzej Warzynski   case TY_Fortran:
168*b9f3b7f8SAndrzej Warzynski   case TY_PP_Fortran:
169*b9f3b7f8SAndrzej Warzynski     return true;
170*b9f3b7f8SAndrzej Warzynski   case TY_LLVM_IR:
171*b9f3b7f8SAndrzej Warzynski   case TY_LLVM_BC:
172*b9f3b7f8SAndrzej Warzynski     return true;
173*b9f3b7f8SAndrzej Warzynski   }
174*b9f3b7f8SAndrzej Warzynski }
175*b9f3b7f8SAndrzej Warzynski 
isDerivedFromC(ID Id)176ae6b4000SMichael Kruse bool types::isDerivedFromC(ID Id) {
177ae6b4000SMichael Kruse   switch (Id) {
178ae6b4000SMichael Kruse   default:
179ae6b4000SMichael Kruse     return false;
180ae6b4000SMichael Kruse 
181ae6b4000SMichael Kruse   case TY_PP_C:
182ae6b4000SMichael Kruse   case TY_C:
183ae6b4000SMichael Kruse   case TY_CL:
184ae6b4000SMichael Kruse   case TY_CLCXX:
185ae6b4000SMichael Kruse   case TY_PP_CUDA:
186ae6b4000SMichael Kruse   case TY_CUDA:
187ae6b4000SMichael Kruse   case TY_CUDA_DEVICE:
188ae6b4000SMichael Kruse   case TY_PP_HIP:
189ae6b4000SMichael Kruse   case TY_HIP:
190ae6b4000SMichael Kruse   case TY_HIP_DEVICE:
191ae6b4000SMichael Kruse   case TY_PP_ObjC:
192ae6b4000SMichael Kruse   case TY_PP_ObjC_Alias:
193ae6b4000SMichael Kruse   case TY_ObjC:
194ae6b4000SMichael Kruse   case TY_PP_CXX:
195ae6b4000SMichael Kruse   case TY_CXX:
196ae6b4000SMichael Kruse   case TY_PP_ObjCXX:
197ae6b4000SMichael Kruse   case TY_PP_ObjCXX_Alias:
198ae6b4000SMichael Kruse   case TY_ObjCXX:
199ae6b4000SMichael Kruse   case TY_RenderScript:
200ae6b4000SMichael Kruse   case TY_PP_CHeader:
201ae6b4000SMichael Kruse   case TY_CHeader:
202ae6b4000SMichael Kruse   case TY_CLHeader:
203ae6b4000SMichael Kruse   case TY_PP_ObjCHeader:
204ae6b4000SMichael Kruse   case TY_ObjCHeader:
205ae6b4000SMichael Kruse   case TY_PP_CXXHeader:
206ae6b4000SMichael Kruse   case TY_CXXHeader:
207ae6b4000SMichael Kruse   case TY_PP_ObjCXXHeader:
208ae6b4000SMichael Kruse   case TY_ObjCXXHeader:
209ae6b4000SMichael Kruse   case TY_CXXModule:
210ae6b4000SMichael Kruse   case TY_PP_CXXModule:
211ae6b4000SMichael Kruse     return true;
212ae6b4000SMichael Kruse   }
213ae6b4000SMichael Kruse }
214ae6b4000SMichael Kruse 
isObjC(ID Id)215f408303aSDaniel Dunbar bool types::isObjC(ID Id) {
216f408303aSDaniel Dunbar   switch (Id) {
217f408303aSDaniel Dunbar   default:
218f408303aSDaniel Dunbar     return false;
219f408303aSDaniel Dunbar 
220ed8080cbSNico Weber   case TY_ObjC: case TY_PP_ObjC: case TY_PP_ObjC_Alias:
221f408303aSDaniel Dunbar   case TY_ObjCXX: case TY_PP_ObjCXX:
222f408303aSDaniel Dunbar   case TY_ObjCHeader: case TY_PP_ObjCHeader:
223ed8080cbSNico Weber   case TY_ObjCXXHeader: case TY_PP_ObjCXXHeader: case TY_PP_ObjCXX_Alias:
224f408303aSDaniel Dunbar     return true;
225f408303aSDaniel Dunbar   }
226f408303aSDaniel Dunbar }
227f408303aSDaniel Dunbar 
isOpenCL(ID Id)228d1c8a151SAnastasia Stulova bool types::isOpenCL(ID Id) { return Id == TY_CL || Id == TY_CLCXX; }
229cf3ef15aSAnastasia Stulova 
isCXX(ID Id)2301bb3b2ccSDaniel Dunbar bool types::isCXX(ID Id) {
2311bb3b2ccSDaniel Dunbar   switch (Id) {
2321bb3b2ccSDaniel Dunbar   default:
2331bb3b2ccSDaniel Dunbar     return false;
2341bb3b2ccSDaniel Dunbar 
2351bb3b2ccSDaniel Dunbar   case TY_CXX: case TY_PP_CXX:
236808baaf2SChad Rosier   case TY_ObjCXX: case TY_PP_ObjCXX: case TY_PP_ObjCXX_Alias:
2371bb3b2ccSDaniel Dunbar   case TY_CXXHeader: case TY_PP_CXXHeader:
2385c6a1464SIain Sandoe   case TY_CXXSHeader:
2395c6a1464SIain Sandoe   case TY_CXXUHeader:
2405c6a1464SIain Sandoe   case TY_CXXHUHeader:
2415c6a1464SIain Sandoe   case TY_PP_CXXHeaderUnit:
2421bb3b2ccSDaniel Dunbar   case TY_ObjCXXHeader: case TY_PP_ObjCXXHeader:
243dd4ad3d2SRichard Smith   case TY_CXXModule: case TY_PP_CXXModule:
2440ff05cd1SArtem Belevich   case TY_CUDA: case TY_PP_CUDA: case TY_CUDA_DEVICE:
2459809db70SYaxun Liu   case TY_HIP:
2469809db70SYaxun Liu   case TY_PP_HIP:
2479809db70SYaxun Liu   case TY_HIP_DEVICE:
2480ff05cd1SArtem Belevich     return true;
2490ff05cd1SArtem Belevich   }
2500ff05cd1SArtem Belevich }
2510ff05cd1SArtem Belevich 
isLLVMIR(ID Id)252aff22327STeresa Johnson bool types::isLLVMIR(ID Id) {
253aff22327STeresa Johnson   switch (Id) {
254aff22327STeresa Johnson   default:
255aff22327STeresa Johnson     return false;
256aff22327STeresa Johnson 
257aff22327STeresa Johnson   case TY_LLVM_IR:
258aff22327STeresa Johnson   case TY_LLVM_BC:
259aff22327STeresa Johnson   case TY_LTO_IR:
260aff22327STeresa Johnson   case TY_LTO_BC:
261aff22327STeresa Johnson     return true;
262aff22327STeresa Johnson   }
263aff22327STeresa Johnson }
264aff22327STeresa Johnson 
isCuda(ID Id)2650ff05cd1SArtem Belevich bool types::isCuda(ID Id) {
2660ff05cd1SArtem Belevich   switch (Id) {
2670ff05cd1SArtem Belevich   default:
2680ff05cd1SArtem Belevich     return false;
2690ff05cd1SArtem Belevich 
2700ff05cd1SArtem Belevich   case TY_CUDA:
2710ff05cd1SArtem Belevich   case TY_PP_CUDA:
2720ff05cd1SArtem Belevich   case TY_CUDA_DEVICE:
273f5a6b96cSYaxun Liu     return true;
274f5a6b96cSYaxun Liu   }
275f5a6b96cSYaxun Liu }
276f5a6b96cSYaxun Liu 
isHIP(ID Id)277f5a6b96cSYaxun Liu bool types::isHIP(ID Id) {
278f5a6b96cSYaxun Liu   switch (Id) {
279f5a6b96cSYaxun Liu   default:
280f5a6b96cSYaxun Liu     return false;
281f5a6b96cSYaxun Liu 
2829809db70SYaxun Liu   case TY_HIP:
2839809db70SYaxun Liu   case TY_PP_HIP:
2849809db70SYaxun Liu   case TY_HIP_DEVICE:
2851bb3b2ccSDaniel Dunbar     return true;
2861bb3b2ccSDaniel Dunbar   }
2871bb3b2ccSDaniel Dunbar }
2881bb3b2ccSDaniel Dunbar 
isSrcFile(ID Id)289fab4f37eSSamuel Antao bool types::isSrcFile(ID Id) {
290fab4f37eSSamuel Antao   return Id != TY_Object && getPreprocessedType(Id) != TY_INVALID;
291fab4f37eSSamuel Antao }
292fab4f37eSSamuel Antao 
lookupTypeForExtension(llvm::StringRef Ext)2936fcd4eb9SMehdi Amini types::ID types::lookupTypeForExtension(llvm::StringRef Ext) {
294f7b87cb5SDouglas Gregor   return llvm::StringSwitch<types::ID>(Ext)
295f7b87cb5SDouglas Gregor            .Case("c", TY_C)
29603e8e60eSRichard Smith            .Case("C", TY_CXX)
29703e8e60eSRichard Smith            .Case("F", TY_Fortran)
29803e8e60eSRichard Smith            .Case("f", TY_PP_Fortran)
29903e8e60eSRichard Smith            .Case("h", TY_CHeader)
30003e8e60eSRichard Smith            .Case("H", TY_CXXHeader)
301f7b87cb5SDouglas Gregor            .Case("i", TY_PP_C)
302f7b87cb5SDouglas Gregor            .Case("m", TY_ObjC)
303f7b87cb5SDouglas Gregor            .Case("M", TY_ObjCXX)
3044bc3de40SChad Rosier            .Case("o", TY_Object)
30503e8e60eSRichard Smith            .Case("S", TY_Asm)
30603e8e60eSRichard Smith            .Case("s", TY_PP_Asm)
30724e52992SDaniel Dunbar            .Case("bc", TY_LLVM_BC)
308f7b87cb5SDouglas Gregor            .Case("cc", TY_CXX)
309f7b87cb5SDouglas Gregor            .Case("CC", TY_CXX)
3100e1a625fSNate Begeman            .Case("cl", TY_CL)
311d1c8a151SAnastasia Stulova            .Case("clcpp", TY_CLCXX)
312f7b87cb5SDouglas Gregor            .Case("cp", TY_CXX)
31362089b82SPeter Collingbourne            .Case("cu", TY_CUDA)
314f7b87cb5SDouglas Gregor            .Case("hh", TY_CXXHeader)
31503e8e60eSRichard Smith            .Case("ii", TY_PP_CXX)
31624e52992SDaniel Dunbar            .Case("ll", TY_LLVM_IR)
31703e8e60eSRichard Smith            .Case("mi", TY_PP_ObjC)
31803e8e60eSRichard Smith            .Case("mm", TY_ObjCXX)
31903e8e60eSRichard Smith            .Case("rs", TY_RenderScript)
320f7b87cb5SDouglas Gregor            .Case("adb", TY_Ada)
32103e8e60eSRichard Smith            .Case("ads", TY_Ada)
32203e8e60eSRichard Smith            .Case("asm", TY_PP_Asm)
323f7b87cb5SDouglas Gregor            .Case("ast", TY_AST)
324dd4ad3d2SRichard Smith            .Case("ccm", TY_CXXModule)
325f7b87cb5SDouglas Gregor            .Case("cpp", TY_CXX)
326f7b87cb5SDouglas Gregor            .Case("CPP", TY_CXX)
32703e8e60eSRichard Smith            .Case("c++", TY_CXX)
32803e8e60eSRichard Smith            .Case("C++", TY_CXX)
32903e8e60eSRichard Smith            .Case("cui", TY_PP_CUDA)
33003e8e60eSRichard Smith            .Case("cxx", TY_CXX)
331f7b87cb5SDouglas Gregor            .Case("CXX", TY_CXX)
33203e8e60eSRichard Smith            .Case("F90", TY_Fortran)
33303e8e60eSRichard Smith            .Case("f90", TY_PP_Fortran)
33403e8e60eSRichard Smith            .Case("F95", TY_Fortran)
33503e8e60eSRichard Smith            .Case("f95", TY_PP_Fortran)
336f7b87cb5SDouglas Gregor            .Case("for", TY_PP_Fortran)
337f7b87cb5SDouglas Gregor            .Case("FOR", TY_PP_Fortran)
338f7b87cb5SDouglas Gregor            .Case("fpp", TY_Fortran)
339f7b87cb5SDouglas Gregor            .Case("FPP", TY_Fortran)
3402cb4a78fSBen Langmuir            .Case("gch", TY_PCH)
341f5a6b96cSYaxun Liu            .Case("hip", TY_HIP)
34203e8e60eSRichard Smith            .Case("hpp", TY_CXXHeader)
3439c390955SSam McCall            .Case("hxx", TY_CXXHeader)
344dd4ad3d2SRichard Smith            .Case("iim", TY_PP_CXXModule)
3455c6a1464SIain Sandoe            .Case("iih", TY_PP_CXXHeaderUnit)
34603e8e60eSRichard Smith            .Case("lib", TY_Object)
34703e8e60eSRichard Smith            .Case("mii", TY_PP_ObjCXX)
34803e8e60eSRichard Smith            .Case("obj", TY_Object)
349c382d03cSPuyan Lotfi            .Case("ifs", TY_IFS)
35003e8e60eSRichard Smith            .Case("pch", TY_PCH)
35103e8e60eSRichard Smith            .Case("pcm", TY_ModuleFile)
352dd4ad3d2SRichard Smith            .Case("c++m", TY_CXXModule)
353dd4ad3d2SRichard Smith            .Case("cppm", TY_CXXModule)
354dd4ad3d2SRichard Smith            .Case("cxxm", TY_CXXModule)
355721651beSXiang Li            .Case("hlsl", TY_HLSL)
356f7b87cb5SDouglas Gregor            .Default(TY_INVALID);
3571a873893SDaniel Dunbar }
3581a873893SDaniel Dunbar 
lookupTypeForTypeSpecifier(const char * Name)3591a873893SDaniel Dunbar types::ID types::lookupTypeForTypeSpecifier(const char *Name) {
3601a873893SDaniel Dunbar   for (unsigned i=0; i<numTypes; ++i) {
3611a873893SDaniel Dunbar     types::ID Id = (types::ID) (i + 1);
3621a873893SDaniel Dunbar     if (canTypeBeUserSpecified(Id) &&
36300eef441SEvgeniy Stepanov         strcmp(Name, getInfo(Id).Name) == 0)
3641a873893SDaniel Dunbar       return Id;
3651a873893SDaniel Dunbar   }
3666ed88afdSADRA   // Accept "cu" as an alias for "cuda" for NVCC compatibility
3676ed88afdSADRA   if (strcmp(Name, "cu") == 0) {
3686ed88afdSADRA     return types::TY_CUDA;
3696ed88afdSADRA   }
3701a873893SDaniel Dunbar   return TY_INVALID;
3711a873893SDaniel Dunbar }
372e71b9640SDaniel Dunbar 
37302e35832SBenjamin Kramer llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases>
getCompilationPhases(ID Id,phases::ID LastPhase)37402e35832SBenjamin Kramer types::getCompilationPhases(ID Id, phases::ID LastPhase) {
37502e35832SBenjamin Kramer   llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases> P;
3765a098086SBenjamin Kramer   const auto &Info = getInfo(Id);
37702e35832SBenjamin Kramer   for (int I = 0; I <= LastPhase; ++I)
3785a098086SBenjamin Kramer     if (Info.Phases.contains(static_cast<phases::ID>(I)))
3795a098086SBenjamin Kramer       P.push_back(static_cast<phases::ID>(I));
3807ab8b2b2SMatthew Curtis   assert(P.size() <= phases::MaxNumberOfPhases && "Too many phases in list");
38102e35832SBenjamin Kramer   return P;
382e71b9640SDaniel Dunbar }
3830ac94450SDaniel Dunbar 
38402e35832SBenjamin Kramer llvm::SmallVector<phases::ID, phases::MaxNumberOfPhases>
getCompilationPhases(const clang::driver::Driver & Driver,llvm::opt::DerivedArgList & DAL,ID Id)38502e35832SBenjamin Kramer types::getCompilationPhases(const clang::driver::Driver &Driver,
38602e35832SBenjamin Kramer                             llvm::opt::DerivedArgList &DAL, ID Id) {
387fa32fd3bSNico Weber   return types::getCompilationPhases(Id, Driver.getFinalPhase(DAL));
388e5ade767SPuyan Lotfi }
389e5ade767SPuyan Lotfi 
lookupCXXTypeForCType(ID Id)3900ac94450SDaniel Dunbar ID types::lookupCXXTypeForCType(ID Id) {
3910ac94450SDaniel Dunbar   switch (Id) {
3920ac94450SDaniel Dunbar   default:
3930ac94450SDaniel Dunbar     return Id;
3940ac94450SDaniel Dunbar 
3950ac94450SDaniel Dunbar   case types::TY_C:
3960ac94450SDaniel Dunbar     return types::TY_CXX;
3970ac94450SDaniel Dunbar   case types::TY_PP_C:
3980ac94450SDaniel Dunbar     return types::TY_PP_CXX;
3990ac94450SDaniel Dunbar   case types::TY_CHeader:
4000ac94450SDaniel Dunbar     return types::TY_CXXHeader;
4010ac94450SDaniel Dunbar   case types::TY_PP_CHeader:
4020ac94450SDaniel Dunbar     return types::TY_PP_CXXHeader;
4030ac94450SDaniel Dunbar   }
4040ac94450SDaniel Dunbar }
4058cd452d4SRichard Smith 
lookupHeaderTypeForSourceType(ID Id)4068cd452d4SRichard Smith ID types::lookupHeaderTypeForSourceType(ID Id) {
4078cd452d4SRichard Smith   switch (Id) {
4088cd452d4SRichard Smith   default:
4098cd452d4SRichard Smith     return Id;
4108cd452d4SRichard Smith 
411cd35eff3SRichard Smith   // FIXME: Handle preprocessed input types.
4128cd452d4SRichard Smith   case types::TY_C:
4138cd452d4SRichard Smith     return types::TY_CHeader;
4148cd452d4SRichard Smith   case types::TY_CXX:
415cd35eff3SRichard Smith   case types::TY_CXXModule:
4168cd452d4SRichard Smith     return types::TY_CXXHeader;
4178cd452d4SRichard Smith   case types::TY_ObjC:
4188cd452d4SRichard Smith     return types::TY_ObjCHeader;
4198cd452d4SRichard Smith   case types::TY_ObjCXX:
4208cd452d4SRichard Smith     return types::TY_ObjCXXHeader;
4218cd452d4SRichard Smith   case types::TY_CL:
422d1c8a151SAnastasia Stulova   case types::TY_CLCXX:
4238cd452d4SRichard Smith     return types::TY_CLHeader;
4248cd452d4SRichard Smith   }
4258cd452d4SRichard Smith }
426