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(std::string(TargetName), Error) == 107 &Target) { 108 return std::string(TargetName); 109 } 110 } 111 return ""; 112 } 113 114 } // end namespace clang 115