xref: /src/contrib/llvm-project/clang/lib/Testing/CommandLineArgs.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1cfca06d7SDimitry Andric //===--- CommandLineArgs.cpp ----------------------------------------------===//
2cfca06d7SDimitry Andric //
3cfca06d7SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4cfca06d7SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5cfca06d7SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6cfca06d7SDimitry Andric //
7cfca06d7SDimitry Andric //===----------------------------------------------------------------------===//
8cfca06d7SDimitry Andric 
9cfca06d7SDimitry Andric #include "clang/Testing/CommandLineArgs.h"
107fa27ce4SDimitry Andric #include "llvm/MC/TargetRegistry.h"
11cfca06d7SDimitry Andric #include "llvm/Support/ErrorHandling.h"
12cfca06d7SDimitry Andric 
13cfca06d7SDimitry Andric namespace clang {
14cfca06d7SDimitry Andric 
getCommandLineArgsForTesting(TestLanguage Lang)15cfca06d7SDimitry Andric std::vector<std::string> getCommandLineArgsForTesting(TestLanguage Lang) {
16cfca06d7SDimitry Andric   std::vector<std::string> Args;
17cfca06d7SDimitry Andric   // Test with basic arguments.
18cfca06d7SDimitry Andric   switch (Lang) {
19cfca06d7SDimitry Andric   case Lang_C89:
20cfca06d7SDimitry Andric     Args = {"-x", "c", "-std=c89"};
21cfca06d7SDimitry Andric     break;
22cfca06d7SDimitry Andric   case Lang_C99:
23cfca06d7SDimitry Andric     Args = {"-x", "c", "-std=c99"};
24cfca06d7SDimitry Andric     break;
25cfca06d7SDimitry Andric   case Lang_CXX03:
26cfca06d7SDimitry Andric     Args = {"-std=c++03", "-frtti"};
27cfca06d7SDimitry Andric     break;
28cfca06d7SDimitry Andric   case Lang_CXX11:
29cfca06d7SDimitry Andric     Args = {"-std=c++11", "-frtti"};
30cfca06d7SDimitry Andric     break;
31cfca06d7SDimitry Andric   case Lang_CXX14:
32cfca06d7SDimitry Andric     Args = {"-std=c++14", "-frtti"};
33cfca06d7SDimitry Andric     break;
34cfca06d7SDimitry Andric   case Lang_CXX17:
35cfca06d7SDimitry Andric     Args = {"-std=c++17", "-frtti"};
36cfca06d7SDimitry Andric     break;
37cfca06d7SDimitry Andric   case Lang_CXX20:
38cfca06d7SDimitry Andric     Args = {"-std=c++20", "-frtti"};
39cfca06d7SDimitry Andric     break;
40ac9a064cSDimitry Andric   case Lang_CXX23:
41ac9a064cSDimitry Andric     Args = {"-std=c++23", "-frtti"};
42ac9a064cSDimitry Andric     break;
43145449b1SDimitry Andric   case Lang_OBJC:
44145449b1SDimitry Andric     Args = {"-x", "objective-c", "-frtti", "-fobjc-nonfragile-abi"};
45145449b1SDimitry Andric     break;
46cfca06d7SDimitry Andric   case Lang_OBJCXX:
47cfca06d7SDimitry Andric     Args = {"-x", "objective-c++", "-frtti"};
48cfca06d7SDimitry Andric     break;
49cfca06d7SDimitry Andric   case Lang_OpenCL:
50cfca06d7SDimitry Andric     llvm_unreachable("Not implemented yet!");
51cfca06d7SDimitry Andric   }
52cfca06d7SDimitry Andric   return Args;
53cfca06d7SDimitry Andric }
54cfca06d7SDimitry Andric 
getCC1ArgsForTesting(TestLanguage Lang)55145449b1SDimitry Andric std::vector<std::string> getCC1ArgsForTesting(TestLanguage Lang) {
56145449b1SDimitry Andric   std::vector<std::string> Args;
57145449b1SDimitry Andric   switch (Lang) {
58145449b1SDimitry Andric   case Lang_C89:
59145449b1SDimitry Andric     Args = {"-xc", "-std=c89"};
60145449b1SDimitry Andric     break;
61145449b1SDimitry Andric   case Lang_C99:
62145449b1SDimitry Andric     Args = {"-xc", "-std=c99"};
63145449b1SDimitry Andric     break;
64145449b1SDimitry Andric   case Lang_CXX03:
65145449b1SDimitry Andric     Args = {"-std=c++03"};
66145449b1SDimitry Andric     break;
67145449b1SDimitry Andric   case Lang_CXX11:
68145449b1SDimitry Andric     Args = {"-std=c++11"};
69145449b1SDimitry Andric     break;
70145449b1SDimitry Andric   case Lang_CXX14:
71145449b1SDimitry Andric     Args = {"-std=c++14"};
72145449b1SDimitry Andric     break;
73145449b1SDimitry Andric   case Lang_CXX17:
74145449b1SDimitry Andric     Args = {"-std=c++17"};
75145449b1SDimitry Andric     break;
76145449b1SDimitry Andric   case Lang_CXX20:
77145449b1SDimitry Andric     Args = {"-std=c++20"};
78145449b1SDimitry Andric     break;
79ac9a064cSDimitry Andric   case Lang_CXX23:
80ac9a064cSDimitry Andric     Args = {"-std=c++23"};
81ac9a064cSDimitry Andric     break;
82145449b1SDimitry Andric   case Lang_OBJC:
83145449b1SDimitry Andric     Args = {"-xobjective-c"};
84145449b1SDimitry Andric     break;
85145449b1SDimitry Andric   case Lang_OBJCXX:
86145449b1SDimitry Andric     Args = {"-xobjective-c++"};
87145449b1SDimitry Andric     break;
88145449b1SDimitry Andric   case Lang_OpenCL:
89145449b1SDimitry Andric     llvm_unreachable("Not implemented yet!");
90145449b1SDimitry Andric   }
91145449b1SDimitry Andric   return Args;
92145449b1SDimitry Andric }
93145449b1SDimitry Andric 
getFilenameForTesting(TestLanguage Lang)94cfca06d7SDimitry Andric StringRef getFilenameForTesting(TestLanguage Lang) {
95cfca06d7SDimitry Andric   switch (Lang) {
96cfca06d7SDimitry Andric   case Lang_C89:
97cfca06d7SDimitry Andric   case Lang_C99:
98cfca06d7SDimitry Andric     return "input.c";
99cfca06d7SDimitry Andric 
100cfca06d7SDimitry Andric   case Lang_CXX03:
101cfca06d7SDimitry Andric   case Lang_CXX11:
102cfca06d7SDimitry Andric   case Lang_CXX14:
103cfca06d7SDimitry Andric   case Lang_CXX17:
104cfca06d7SDimitry Andric   case Lang_CXX20:
105ac9a064cSDimitry Andric   case Lang_CXX23:
106cfca06d7SDimitry Andric     return "input.cc";
107cfca06d7SDimitry Andric 
108cfca06d7SDimitry Andric   case Lang_OpenCL:
109cfca06d7SDimitry Andric     return "input.cl";
110cfca06d7SDimitry Andric 
111145449b1SDimitry Andric   case Lang_OBJC:
112145449b1SDimitry Andric     return "input.m";
113145449b1SDimitry Andric 
114cfca06d7SDimitry Andric   case Lang_OBJCXX:
115cfca06d7SDimitry Andric     return "input.mm";
116cfca06d7SDimitry Andric   }
117cfca06d7SDimitry Andric   llvm_unreachable("Unhandled TestLanguage enum");
118cfca06d7SDimitry Andric }
119cfca06d7SDimitry Andric 
getAnyTargetForTesting()1207fa27ce4SDimitry Andric std::string getAnyTargetForTesting() {
1217fa27ce4SDimitry Andric   for (const auto &Target : llvm::TargetRegistry::targets()) {
1227fa27ce4SDimitry Andric     std::string Error;
1237fa27ce4SDimitry Andric     StringRef TargetName(Target.getName());
1247fa27ce4SDimitry Andric     if (TargetName == "x86-64")
1257fa27ce4SDimitry Andric       TargetName = "x86_64";
1267fa27ce4SDimitry Andric     if (llvm::TargetRegistry::lookupTarget(std::string(TargetName), Error) ==
1277fa27ce4SDimitry Andric         &Target) {
1287fa27ce4SDimitry Andric       return std::string(TargetName);
1297fa27ce4SDimitry Andric     }
1307fa27ce4SDimitry Andric   }
1317fa27ce4SDimitry Andric   return "";
1327fa27ce4SDimitry Andric }
1337fa27ce4SDimitry Andric 
134cfca06d7SDimitry Andric } // end namespace clang
135