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