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 15 std::vector<std::string> getCommandLineArgsForTesting(TestLanguage Lang) { 16 std::vector<std::string> Args; 17 // Test with basic arguments. 18 switch (Lang) { 19 case Lang_C89: 20 Args = {"-x", "c", "-std=c89"}; 21 break; 22 case Lang_C99: 23 Args = {"-x", "c", "-std=c99"}; 24 break; 25 case Lang_CXX03: 26 Args = {"-std=c++03", "-frtti"}; 27 break; 28 case Lang_CXX11: 29 Args = {"-std=c++11", "-frtti"}; 30 break; 31 case Lang_CXX14: 32 Args = {"-std=c++14", "-frtti"}; 33 break; 34 case Lang_CXX17: 35 Args = {"-std=c++17", "-frtti"}; 36 break; 37 case Lang_CXX20: 38 Args = {"-std=c++20", "-frtti"}; 39 break; 40 case Lang_CXX23: 41 Args = {"-std=c++23", "-frtti"}; 42 break; 43 case Lang_OBJC: 44 Args = {"-x", "objective-c", "-frtti", "-fobjc-nonfragile-abi"}; 45 break; 46 case Lang_OBJCXX: 47 Args = {"-x", "objective-c++", "-frtti"}; 48 break; 49 case Lang_OpenCL: 50 llvm_unreachable("Not implemented yet!"); 51 } 52 return Args; 53 } 54 55 std::vector<std::string> getCC1ArgsForTesting(TestLanguage Lang) { 56 std::vector<std::string> Args; 57 switch (Lang) { 58 case Lang_C89: 59 Args = {"-xc", "-std=c89"}; 60 break; 61 case Lang_C99: 62 Args = {"-xc", "-std=c99"}; 63 break; 64 case Lang_CXX03: 65 Args = {"-std=c++03"}; 66 break; 67 case Lang_CXX11: 68 Args = {"-std=c++11"}; 69 break; 70 case Lang_CXX14: 71 Args = {"-std=c++14"}; 72 break; 73 case Lang_CXX17: 74 Args = {"-std=c++17"}; 75 break; 76 case Lang_CXX20: 77 Args = {"-std=c++20"}; 78 break; 79 case Lang_CXX23: 80 Args = {"-std=c++23"}; 81 break; 82 case Lang_OBJC: 83 Args = {"-xobjective-c"}; 84 break; 85 case Lang_OBJCXX: 86 Args = {"-xobjective-c++"}; 87 break; 88 case Lang_OpenCL: 89 llvm_unreachable("Not implemented yet!"); 90 } 91 return Args; 92 } 93 94 StringRef getFilenameForTesting(TestLanguage Lang) { 95 switch (Lang) { 96 case Lang_C89: 97 case Lang_C99: 98 return "input.c"; 99 100 case Lang_CXX03: 101 case Lang_CXX11: 102 case Lang_CXX14: 103 case Lang_CXX17: 104 case Lang_CXX20: 105 case Lang_CXX23: 106 return "input.cc"; 107 108 case Lang_OpenCL: 109 return "input.cl"; 110 111 case Lang_OBJC: 112 return "input.m"; 113 114 case Lang_OBJCXX: 115 return "input.mm"; 116 } 117 llvm_unreachable("Unhandled TestLanguage enum"); 118 } 119 120 std::string getAnyTargetForTesting() { 121 for (const auto &Target : llvm::TargetRegistry::targets()) { 122 std::string Error; 123 StringRef TargetName(Target.getName()); 124 if (TargetName == "x86-64") 125 TargetName = "x86_64"; 126 if (llvm::TargetRegistry::lookupTarget(std::string(TargetName), Error) == 127 &Target) { 128 return std::string(TargetName); 129 } 130 } 131 return ""; 132 } 133 134 } // end namespace clang 135