xref: /freebsd-src/contrib/llvm-project/clang/lib/Testing/CommandLineArgs.cpp (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
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"
10*06c3fb27SDimitry 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;
4081ad6265SDimitry Andric   case Lang_OBJC:
4181ad6265SDimitry Andric     Args = {"-x", "objective-c", "-frtti", "-fobjc-nonfragile-abi"};
4281ad6265SDimitry Andric     break;
435ffd83dbSDimitry Andric   case Lang_OBJCXX:
445ffd83dbSDimitry Andric     Args = {"-x", "objective-c++", "-frtti"};
455ffd83dbSDimitry Andric     break;
465ffd83dbSDimitry Andric   case Lang_OpenCL:
475ffd83dbSDimitry Andric     llvm_unreachable("Not implemented yet!");
485ffd83dbSDimitry Andric   }
495ffd83dbSDimitry Andric   return Args;
505ffd83dbSDimitry Andric }
515ffd83dbSDimitry Andric 
5281ad6265SDimitry Andric std::vector<std::string> getCC1ArgsForTesting(TestLanguage Lang) {
5381ad6265SDimitry Andric   std::vector<std::string> Args;
5481ad6265SDimitry Andric   switch (Lang) {
5581ad6265SDimitry Andric   case Lang_C89:
5681ad6265SDimitry Andric     Args = {"-xc", "-std=c89"};
5781ad6265SDimitry Andric     break;
5881ad6265SDimitry Andric   case Lang_C99:
5981ad6265SDimitry Andric     Args = {"-xc", "-std=c99"};
6081ad6265SDimitry Andric     break;
6181ad6265SDimitry Andric   case Lang_CXX03:
6281ad6265SDimitry Andric     Args = {"-std=c++03"};
6381ad6265SDimitry Andric     break;
6481ad6265SDimitry Andric   case Lang_CXX11:
6581ad6265SDimitry Andric     Args = {"-std=c++11"};
6681ad6265SDimitry Andric     break;
6781ad6265SDimitry Andric   case Lang_CXX14:
6881ad6265SDimitry Andric     Args = {"-std=c++14"};
6981ad6265SDimitry Andric     break;
7081ad6265SDimitry Andric   case Lang_CXX17:
7181ad6265SDimitry Andric     Args = {"-std=c++17"};
7281ad6265SDimitry Andric     break;
7381ad6265SDimitry Andric   case Lang_CXX20:
7481ad6265SDimitry Andric     Args = {"-std=c++20"};
7581ad6265SDimitry Andric     break;
7681ad6265SDimitry Andric   case Lang_OBJC:
7781ad6265SDimitry Andric     Args = {"-xobjective-c"};
7881ad6265SDimitry Andric     break;
7981ad6265SDimitry Andric   case Lang_OBJCXX:
8081ad6265SDimitry Andric     Args = {"-xobjective-c++"};
8181ad6265SDimitry Andric     break;
8281ad6265SDimitry Andric   case Lang_OpenCL:
8381ad6265SDimitry Andric     llvm_unreachable("Not implemented yet!");
8481ad6265SDimitry Andric   }
8581ad6265SDimitry Andric   return Args;
8681ad6265SDimitry Andric }
8781ad6265SDimitry Andric 
885ffd83dbSDimitry Andric StringRef getFilenameForTesting(TestLanguage Lang) {
895ffd83dbSDimitry Andric   switch (Lang) {
905ffd83dbSDimitry Andric   case Lang_C89:
915ffd83dbSDimitry Andric   case Lang_C99:
925ffd83dbSDimitry Andric     return "input.c";
935ffd83dbSDimitry Andric 
945ffd83dbSDimitry Andric   case Lang_CXX03:
955ffd83dbSDimitry Andric   case Lang_CXX11:
965ffd83dbSDimitry Andric   case Lang_CXX14:
975ffd83dbSDimitry Andric   case Lang_CXX17:
985ffd83dbSDimitry Andric   case Lang_CXX20:
995ffd83dbSDimitry Andric     return "input.cc";
1005ffd83dbSDimitry Andric 
1015ffd83dbSDimitry Andric   case Lang_OpenCL:
1025ffd83dbSDimitry Andric     return "input.cl";
1035ffd83dbSDimitry Andric 
10481ad6265SDimitry Andric   case Lang_OBJC:
10581ad6265SDimitry Andric     return "input.m";
10681ad6265SDimitry Andric 
1075ffd83dbSDimitry Andric   case Lang_OBJCXX:
1085ffd83dbSDimitry Andric     return "input.mm";
1095ffd83dbSDimitry Andric   }
1105ffd83dbSDimitry Andric   llvm_unreachable("Unhandled TestLanguage enum");
1115ffd83dbSDimitry Andric }
1125ffd83dbSDimitry Andric 
113*06c3fb27SDimitry Andric std::string getAnyTargetForTesting() {
114*06c3fb27SDimitry Andric   for (const auto &Target : llvm::TargetRegistry::targets()) {
115*06c3fb27SDimitry Andric     std::string Error;
116*06c3fb27SDimitry Andric     StringRef TargetName(Target.getName());
117*06c3fb27SDimitry Andric     if (TargetName == "x86-64")
118*06c3fb27SDimitry Andric       TargetName = "x86_64";
119*06c3fb27SDimitry Andric     if (llvm::TargetRegistry::lookupTarget(std::string(TargetName), Error) ==
120*06c3fb27SDimitry Andric         &Target) {
121*06c3fb27SDimitry Andric       return std::string(TargetName);
122*06c3fb27SDimitry Andric     }
123*06c3fb27SDimitry Andric   }
124*06c3fb27SDimitry Andric   return "";
125*06c3fb27SDimitry Andric }
126*06c3fb27SDimitry Andric 
1275ffd83dbSDimitry Andric } // end namespace clang
128