xref: /llvm-project/clang/lib/Testing/CommandLineArgs.cpp (revision 7dfdca1961aadc75ca397818bfb9bd32f1879248)
10e265e31SDmitri Gribenko //===--- CommandLineArgs.cpp ----------------------------------------------===//
20e265e31SDmitri Gribenko //
30e265e31SDmitri Gribenko // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40e265e31SDmitri Gribenko // See https://llvm.org/LICENSE.txt for license information.
50e265e31SDmitri Gribenko // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60e265e31SDmitri Gribenko //
70e265e31SDmitri Gribenko //===----------------------------------------------------------------------===//
80e265e31SDmitri Gribenko 
90e265e31SDmitri Gribenko #include "clang/Testing/CommandLineArgs.h"
10d60d3455SDmitry Polukhin #include "llvm/MC/TargetRegistry.h"
110e265e31SDmitri Gribenko #include "llvm/Support/ErrorHandling.h"
120e265e31SDmitri Gribenko 
130e265e31SDmitri Gribenko namespace clang {
14*7dfdca19SJulian Schmidt std::vector<TestLanguage> getCOrLater(const int MinimumStd) {
15*7dfdca19SJulian Schmidt   std::vector<TestLanguage> Result{};
16*7dfdca19SJulian Schmidt 
17*7dfdca19SJulian Schmidt #define TESTLANGUAGE_C(lang, version, std_flag, version_index)                 \
18*7dfdca19SJulian Schmidt   if (version >= MinimumStd)                                                   \
19*7dfdca19SJulian Schmidt     Result.push_back(Lang_##lang##version);
20*7dfdca19SJulian Schmidt #include "clang/Testing/TestLanguage.def"
21*7dfdca19SJulian Schmidt 
22*7dfdca19SJulian Schmidt   return Result;
23*7dfdca19SJulian Schmidt }
24*7dfdca19SJulian Schmidt std::vector<TestLanguage> getCXXOrLater(const int MinimumStd) {
25*7dfdca19SJulian Schmidt   std::vector<TestLanguage> Result{};
26*7dfdca19SJulian Schmidt 
27*7dfdca19SJulian Schmidt #define TESTLANGUAGE_CXX(lang, version, std_flag, version_index)               \
28*7dfdca19SJulian Schmidt   if (version >= MinimumStd)                                                   \
29*7dfdca19SJulian Schmidt     Result.push_back(Lang_##lang##version);
30*7dfdca19SJulian Schmidt #include "clang/Testing/TestLanguage.def"
31*7dfdca19SJulian Schmidt 
32*7dfdca19SJulian Schmidt   return Result;
33*7dfdca19SJulian Schmidt }
340e265e31SDmitri Gribenko 
350e265e31SDmitri Gribenko std::vector<std::string> getCommandLineArgsForTesting(TestLanguage Lang) {
360e265e31SDmitri Gribenko   // Test with basic arguments.
370e265e31SDmitri Gribenko   switch (Lang) {
38*7dfdca19SJulian Schmidt #define TESTLANGUAGE_C(lang, version, std_flag, version_index)                 \
39*7dfdca19SJulian Schmidt   case Lang_##lang##version:                                                   \
40*7dfdca19SJulian Schmidt     return { "-x", "c", "-std=" #std_flag };
41*7dfdca19SJulian Schmidt #define TESTLANGUAGE_CXX(lang, version, std_flag, version_index)               \
42*7dfdca19SJulian Schmidt   case Lang_##lang##version:                                                   \
43*7dfdca19SJulian Schmidt     return { "-std=" #std_flag, "-frtti" };
44*7dfdca19SJulian Schmidt #include "clang/Testing/TestLanguage.def"
45*7dfdca19SJulian Schmidt 
464604db94SVolodymyr Sapsai   case Lang_OBJC:
47*7dfdca19SJulian Schmidt     return {"-x", "objective-c", "-frtti", "-fobjc-nonfragile-abi"};
480e265e31SDmitri Gribenko   case Lang_OBJCXX:
49*7dfdca19SJulian Schmidt     return {"-x", "objective-c++", "-frtti"};
500e265e31SDmitri Gribenko   case Lang_OpenCL:
51*7dfdca19SJulian Schmidt     llvm_unreachable("Unhandled TestLanguage enum");
520e265e31SDmitri Gribenko   }
53*7dfdca19SJulian Schmidt   llvm_unreachable("Unhandled TestLanguage enum");
540e265e31SDmitri Gribenko }
550e265e31SDmitri Gribenko 
56a7691deeSSam McCall std::vector<std::string> getCC1ArgsForTesting(TestLanguage Lang) {
57a7691deeSSam McCall   switch (Lang) {
58*7dfdca19SJulian Schmidt #define TESTLANGUAGE_C(lang, version, std_flag, version_index)                 \
59*7dfdca19SJulian Schmidt   case Lang_##lang##version:                                                   \
60*7dfdca19SJulian Schmidt     return { "-xc", "-std=" #std_flag };
61*7dfdca19SJulian Schmidt #define TESTLANGUAGE_CXX(lang, version, std_flag, version_index)               \
62*7dfdca19SJulian Schmidt   case Lang_##lang##version:                                                   \
63*7dfdca19SJulian Schmidt     return { "-std=" #std_flag };
64*7dfdca19SJulian Schmidt #include "clang/Testing/TestLanguage.def"
65*7dfdca19SJulian Schmidt 
66a7f9f2feSVolodymyr Sapsai   case Lang_OBJC:
67*7dfdca19SJulian Schmidt     return {"-xobjective-c"};
68a7f9f2feSVolodymyr Sapsai     break;
69a7691deeSSam McCall   case Lang_OBJCXX:
70*7dfdca19SJulian Schmidt     return {"-xobjective-c++"};
71a7691deeSSam McCall     break;
72a7691deeSSam McCall   case Lang_OpenCL:
73*7dfdca19SJulian Schmidt     llvm_unreachable("Unhandled TestLanguage enum");
74a7691deeSSam McCall   }
75*7dfdca19SJulian Schmidt   llvm_unreachable("Unhandled TestLanguage enum");
76a7691deeSSam McCall }
77a7691deeSSam McCall 
78b5fc1debSDmitri Gribenko StringRef getFilenameForTesting(TestLanguage Lang) {
79b5fc1debSDmitri Gribenko   switch (Lang) {
80*7dfdca19SJulian Schmidt #define TESTLANGUAGE_C(lang, version, std_flag, version_index)                 \
81*7dfdca19SJulian Schmidt   case Lang_##lang##version:                                                   \
82b5fc1debSDmitri Gribenko     return "input.c";
83*7dfdca19SJulian Schmidt #define TESTLANGUAGE_CXX(lang, version, std_flag, version_index)               \
84*7dfdca19SJulian Schmidt   case Lang_##lang##version:                                                   \
85b5fc1debSDmitri Gribenko     return "input.cc";
86*7dfdca19SJulian Schmidt #include "clang/Testing/TestLanguage.def"
87b5fc1debSDmitri Gribenko 
88b5fc1debSDmitri Gribenko   case Lang_OpenCL:
89b5fc1debSDmitri Gribenko     return "input.cl";
90b5fc1debSDmitri Gribenko 
914604db94SVolodymyr Sapsai   case Lang_OBJC:
924604db94SVolodymyr Sapsai     return "input.m";
934604db94SVolodymyr Sapsai 
94b5fc1debSDmitri Gribenko   case Lang_OBJCXX:
95b5fc1debSDmitri Gribenko     return "input.mm";
96b5fc1debSDmitri Gribenko   }
97a30b5c5aSSimon Pilgrim   llvm_unreachable("Unhandled TestLanguage enum");
98b5fc1debSDmitri Gribenko }
99b5fc1debSDmitri Gribenko 
100d60d3455SDmitry Polukhin std::string getAnyTargetForTesting() {
101d60d3455SDmitry Polukhin   for (const auto &Target : llvm::TargetRegistry::targets()) {
102d60d3455SDmitry Polukhin     std::string Error;
103d60d3455SDmitry Polukhin     StringRef TargetName(Target.getName());
104d60d3455SDmitry Polukhin     if (TargetName == "x86-64")
105d60d3455SDmitry Polukhin       TargetName = "x86_64";
106d60d3455SDmitry Polukhin     if (llvm::TargetRegistry::lookupTarget(std::string(TargetName), Error) ==
107d60d3455SDmitry Polukhin         &Target) {
108d60d3455SDmitry Polukhin       return std::string(TargetName);
109d60d3455SDmitry Polukhin     }
110d60d3455SDmitry Polukhin   }
111d60d3455SDmitry Polukhin   return "";
112d60d3455SDmitry Polukhin }
113d60d3455SDmitry Polukhin 
1140e265e31SDmitri Gribenko } // end namespace clang
115