xref: /freebsd-src/contrib/llvm-project/clang/lib/Testing/CommandLineArgs.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
15ffd83dbSDimitry Andric //===--- CommandLineArgs.cpp ----------------------------------------------===//
25ffd83dbSDimitry Andric //
35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65ffd83dbSDimitry Andric //
75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
85ffd83dbSDimitry Andric 
95ffd83dbSDimitry Andric #include "clang/Testing/CommandLineArgs.h"
1006c3fb27SDimitry Andric #include "llvm/MC/TargetRegistry.h"
115ffd83dbSDimitry Andric #include "llvm/Support/ErrorHandling.h"
125ffd83dbSDimitry Andric 
135ffd83dbSDimitry Andric namespace clang {
145ffd83dbSDimitry Andric 
155ffd83dbSDimitry Andric std::vector<std::string> getCommandLineArgsForTesting(TestLanguage Lang) {
165ffd83dbSDimitry Andric   std::vector<std::string> Args;
175ffd83dbSDimitry Andric   // Test with basic arguments.
185ffd83dbSDimitry Andric   switch (Lang) {
195ffd83dbSDimitry Andric   case Lang_C89:
205ffd83dbSDimitry Andric     Args = {"-x", "c", "-std=c89"};
215ffd83dbSDimitry Andric     break;
225ffd83dbSDimitry Andric   case Lang_C99:
235ffd83dbSDimitry Andric     Args = {"-x", "c", "-std=c99"};
245ffd83dbSDimitry Andric     break;
255ffd83dbSDimitry Andric   case Lang_CXX03:
265ffd83dbSDimitry Andric     Args = {"-std=c++03", "-frtti"};
275ffd83dbSDimitry Andric     break;
285ffd83dbSDimitry Andric   case Lang_CXX11:
295ffd83dbSDimitry Andric     Args = {"-std=c++11", "-frtti"};
305ffd83dbSDimitry Andric     break;
315ffd83dbSDimitry Andric   case Lang_CXX14:
325ffd83dbSDimitry Andric     Args = {"-std=c++14", "-frtti"};
335ffd83dbSDimitry Andric     break;
345ffd83dbSDimitry Andric   case Lang_CXX17:
355ffd83dbSDimitry Andric     Args = {"-std=c++17", "-frtti"};
365ffd83dbSDimitry Andric     break;
375ffd83dbSDimitry Andric   case Lang_CXX20:
385ffd83dbSDimitry Andric     Args = {"-std=c++20", "-frtti"};
395ffd83dbSDimitry Andric     break;
40*0fca6ea1SDimitry Andric   case Lang_CXX23:
41*0fca6ea1SDimitry Andric     Args = {"-std=c++23", "-frtti"};
42*0fca6ea1SDimitry Andric     break;
4381ad6265SDimitry Andric   case Lang_OBJC:
4481ad6265SDimitry Andric     Args = {"-x", "objective-c", "-frtti", "-fobjc-nonfragile-abi"};
4581ad6265SDimitry Andric     break;
465ffd83dbSDimitry Andric   case Lang_OBJCXX:
475ffd83dbSDimitry Andric     Args = {"-x", "objective-c++", "-frtti"};
485ffd83dbSDimitry Andric     break;
495ffd83dbSDimitry Andric   case Lang_OpenCL:
505ffd83dbSDimitry Andric     llvm_unreachable("Not implemented yet!");
515ffd83dbSDimitry Andric   }
525ffd83dbSDimitry Andric   return Args;
535ffd83dbSDimitry Andric }
545ffd83dbSDimitry Andric 
5581ad6265SDimitry Andric std::vector<std::string> getCC1ArgsForTesting(TestLanguage Lang) {
5681ad6265SDimitry Andric   std::vector<std::string> Args;
5781ad6265SDimitry Andric   switch (Lang) {
5881ad6265SDimitry Andric   case Lang_C89:
5981ad6265SDimitry Andric     Args = {"-xc", "-std=c89"};
6081ad6265SDimitry Andric     break;
6181ad6265SDimitry Andric   case Lang_C99:
6281ad6265SDimitry Andric     Args = {"-xc", "-std=c99"};
6381ad6265SDimitry Andric     break;
6481ad6265SDimitry Andric   case Lang_CXX03:
6581ad6265SDimitry Andric     Args = {"-std=c++03"};
6681ad6265SDimitry Andric     break;
6781ad6265SDimitry Andric   case Lang_CXX11:
6881ad6265SDimitry Andric     Args = {"-std=c++11"};
6981ad6265SDimitry Andric     break;
7081ad6265SDimitry Andric   case Lang_CXX14:
7181ad6265SDimitry Andric     Args = {"-std=c++14"};
7281ad6265SDimitry Andric     break;
7381ad6265SDimitry Andric   case Lang_CXX17:
7481ad6265SDimitry Andric     Args = {"-std=c++17"};
7581ad6265SDimitry Andric     break;
7681ad6265SDimitry Andric   case Lang_CXX20:
7781ad6265SDimitry Andric     Args = {"-std=c++20"};
7881ad6265SDimitry Andric     break;
79*0fca6ea1SDimitry Andric   case Lang_CXX23:
80*0fca6ea1SDimitry Andric     Args = {"-std=c++23"};
81*0fca6ea1SDimitry Andric     break;
8281ad6265SDimitry Andric   case Lang_OBJC:
8381ad6265SDimitry Andric     Args = {"-xobjective-c"};
8481ad6265SDimitry Andric     break;
8581ad6265SDimitry Andric   case Lang_OBJCXX:
8681ad6265SDimitry Andric     Args = {"-xobjective-c++"};
8781ad6265SDimitry Andric     break;
8881ad6265SDimitry Andric   case Lang_OpenCL:
8981ad6265SDimitry Andric     llvm_unreachable("Not implemented yet!");
9081ad6265SDimitry Andric   }
9181ad6265SDimitry Andric   return Args;
9281ad6265SDimitry Andric }
9381ad6265SDimitry Andric 
945ffd83dbSDimitry Andric StringRef getFilenameForTesting(TestLanguage Lang) {
955ffd83dbSDimitry Andric   switch (Lang) {
965ffd83dbSDimitry Andric   case Lang_C89:
975ffd83dbSDimitry Andric   case Lang_C99:
985ffd83dbSDimitry Andric     return "input.c";
995ffd83dbSDimitry Andric 
1005ffd83dbSDimitry Andric   case Lang_CXX03:
1015ffd83dbSDimitry Andric   case Lang_CXX11:
1025ffd83dbSDimitry Andric   case Lang_CXX14:
1035ffd83dbSDimitry Andric   case Lang_CXX17:
1045ffd83dbSDimitry Andric   case Lang_CXX20:
105*0fca6ea1SDimitry Andric   case Lang_CXX23:
1065ffd83dbSDimitry Andric     return "input.cc";
1075ffd83dbSDimitry Andric 
1085ffd83dbSDimitry Andric   case Lang_OpenCL:
1095ffd83dbSDimitry Andric     return "input.cl";
1105ffd83dbSDimitry Andric 
11181ad6265SDimitry Andric   case Lang_OBJC:
11281ad6265SDimitry Andric     return "input.m";
11381ad6265SDimitry Andric 
1145ffd83dbSDimitry Andric   case Lang_OBJCXX:
1155ffd83dbSDimitry Andric     return "input.mm";
1165ffd83dbSDimitry Andric   }
1175ffd83dbSDimitry Andric   llvm_unreachable("Unhandled TestLanguage enum");
1185ffd83dbSDimitry Andric }
1195ffd83dbSDimitry Andric 
12006c3fb27SDimitry Andric std::string getAnyTargetForTesting() {
12106c3fb27SDimitry Andric   for (const auto &Target : llvm::TargetRegistry::targets()) {
12206c3fb27SDimitry Andric     std::string Error;
12306c3fb27SDimitry Andric     StringRef TargetName(Target.getName());
12406c3fb27SDimitry Andric     if (TargetName == "x86-64")
12506c3fb27SDimitry Andric       TargetName = "x86_64";
12606c3fb27SDimitry Andric     if (llvm::TargetRegistry::lookupTarget(std::string(TargetName), Error) ==
12706c3fb27SDimitry Andric         &Target) {
12806c3fb27SDimitry Andric       return std::string(TargetName);
12906c3fb27SDimitry Andric     }
13006c3fb27SDimitry Andric   }
13106c3fb27SDimitry Andric   return "";
13206c3fb27SDimitry Andric }
13306c3fb27SDimitry Andric 
1345ffd83dbSDimitry Andric } // end namespace clang
135