1 | //===--- CommandLineArgs.cpp ----------------------------------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "clang/Testing/CommandLineArgs.h" |
10 | #include "llvm/MC/TargetRegistry.h" |
11 | #include "llvm/Support/ErrorHandling.h" |
12 | |
13 | namespace clang { |
14 | std::vector<TestLanguage> getCOrLater(const int MinimumStd) { |
15 | std::vector<TestLanguage> Result{}; |
16 | |
17 | #define TESTLANGUAGE_C(lang, version, std_flag, version_index) \ |
18 | if (version >= MinimumStd) \ |
19 | Result.push_back(Lang_##lang##version); |
20 | #include "clang/Testing/TestLanguage.def" |
21 | |
22 | return Result; |
23 | } |
24 | std::vector<TestLanguage> getCXXOrLater(const int MinimumStd) { |
25 | std::vector<TestLanguage> Result{}; |
26 | |
27 | #define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \ |
28 | if (version >= MinimumStd) \ |
29 | Result.push_back(Lang_##lang##version); |
30 | #include "clang/Testing/TestLanguage.def" |
31 | |
32 | return Result; |
33 | } |
34 | |
35 | std::vector<std::string> getCommandLineArgsForTesting(TestLanguage Lang) { |
36 | // Test with basic arguments. |
37 | switch (Lang) { |
38 | #define TESTLANGUAGE_C(lang, version, std_flag, version_index) \ |
39 | case Lang_##lang##version: \ |
40 | return { "-x", "c", "-std=" #std_flag }; |
41 | #define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \ |
42 | case Lang_##lang##version: \ |
43 | return { "-std=" #std_flag, "-frtti" }; |
44 | #include "clang/Testing/TestLanguage.def" |
45 | |
46 | case Lang_OBJC: |
47 | return {"-x" , "objective-c" , "-frtti" , "-fobjc-nonfragile-abi" }; |
48 | case Lang_OBJCXX: |
49 | return {"-x" , "objective-c++" , "-frtti" }; |
50 | case Lang_OpenCL: |
51 | llvm_unreachable("Unhandled TestLanguage enum" ); |
52 | } |
53 | llvm_unreachable("Unhandled TestLanguage enum" ); |
54 | } |
55 | |
56 | std::vector<std::string> getCC1ArgsForTesting(TestLanguage Lang) { |
57 | switch (Lang) { |
58 | #define TESTLANGUAGE_C(lang, version, std_flag, version_index) \ |
59 | case Lang_##lang##version: \ |
60 | return { "-xc", "-std=" #std_flag }; |
61 | #define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \ |
62 | case Lang_##lang##version: \ |
63 | return { "-std=" #std_flag }; |
64 | #include "clang/Testing/TestLanguage.def" |
65 | |
66 | case Lang_OBJC: |
67 | return {"-xobjective-c" }; |
68 | break; |
69 | case Lang_OBJCXX: |
70 | return {"-xobjective-c++" }; |
71 | break; |
72 | case Lang_OpenCL: |
73 | llvm_unreachable("Unhandled TestLanguage enum" ); |
74 | } |
75 | llvm_unreachable("Unhandled TestLanguage enum" ); |
76 | } |
77 | |
78 | StringRef getFilenameForTesting(TestLanguage Lang) { |
79 | switch (Lang) { |
80 | #define TESTLANGUAGE_C(lang, version, std_flag, version_index) \ |
81 | case Lang_##lang##version: \ |
82 | return "input.c"; |
83 | #define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \ |
84 | case Lang_##lang##version: \ |
85 | return "input.cc"; |
86 | #include "clang/Testing/TestLanguage.def" |
87 | |
88 | case Lang_OpenCL: |
89 | return "input.cl" ; |
90 | |
91 | case Lang_OBJC: |
92 | return "input.m" ; |
93 | |
94 | case Lang_OBJCXX: |
95 | return "input.mm" ; |
96 | } |
97 | llvm_unreachable("Unhandled TestLanguage enum" ); |
98 | } |
99 | |
100 | std::string getAnyTargetForTesting() { |
101 | for (const auto &Target : llvm::TargetRegistry::targets()) { |
102 | std::string Error; |
103 | StringRef TargetName(Target.getName()); |
104 | if (TargetName == "x86-64" ) |
105 | TargetName = "x86_64" ; |
106 | if (llvm::TargetRegistry::lookupTarget(TripleStr: TargetName, Error) == &Target) { |
107 | return std::string(TargetName); |
108 | } |
109 | } |
110 | return "" ; |
111 | } |
112 | |
113 | } // end namespace clang |
114 | |