10e265e31SDmitri Gribenko //===--- CommandLineArgs.cpp ----------------------------------------------===// 20e265e31SDmitri Gribenko // 30e265e31SDmitri Gribenko // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40e265e31SDmitri Gribenko // See https://llvm.org/LICENSE.txt for license information. 50e265e31SDmitri Gribenko // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60e265e31SDmitri Gribenko // 70e265e31SDmitri Gribenko //===----------------------------------------------------------------------===// 80e265e31SDmitri Gribenko 90e265e31SDmitri Gribenko #include "clang/Testing/CommandLineArgs.h" 10d60d3455SDmitry Polukhin #include "llvm/MC/TargetRegistry.h" 110e265e31SDmitri Gribenko #include "llvm/Support/ErrorHandling.h" 120e265e31SDmitri Gribenko 130e265e31SDmitri Gribenko namespace clang { 14*7dfdca19SJulian Schmidt std::vector<TestLanguage> getCOrLater(const int MinimumStd) { 15*7dfdca19SJulian Schmidt std::vector<TestLanguage> Result{}; 16*7dfdca19SJulian Schmidt 17*7dfdca19SJulian Schmidt #define TESTLANGUAGE_C(lang, version, std_flag, version_index) \ 18*7dfdca19SJulian Schmidt if (version >= MinimumStd) \ 19*7dfdca19SJulian Schmidt Result.push_back(Lang_##lang##version); 20*7dfdca19SJulian Schmidt #include "clang/Testing/TestLanguage.def" 21*7dfdca19SJulian Schmidt 22*7dfdca19SJulian Schmidt return Result; 23*7dfdca19SJulian Schmidt } 24*7dfdca19SJulian Schmidt std::vector<TestLanguage> getCXXOrLater(const int MinimumStd) { 25*7dfdca19SJulian Schmidt std::vector<TestLanguage> Result{}; 26*7dfdca19SJulian Schmidt 27*7dfdca19SJulian Schmidt #define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \ 28*7dfdca19SJulian Schmidt if (version >= MinimumStd) \ 29*7dfdca19SJulian Schmidt Result.push_back(Lang_##lang##version); 30*7dfdca19SJulian Schmidt #include "clang/Testing/TestLanguage.def" 31*7dfdca19SJulian Schmidt 32*7dfdca19SJulian Schmidt return Result; 33*7dfdca19SJulian Schmidt } 340e265e31SDmitri Gribenko 350e265e31SDmitri Gribenko std::vector<std::string> getCommandLineArgsForTesting(TestLanguage Lang) { 360e265e31SDmitri Gribenko // Test with basic arguments. 370e265e31SDmitri Gribenko switch (Lang) { 38*7dfdca19SJulian Schmidt #define TESTLANGUAGE_C(lang, version, std_flag, version_index) \ 39*7dfdca19SJulian Schmidt case Lang_##lang##version: \ 40*7dfdca19SJulian Schmidt return { "-x", "c", "-std=" #std_flag }; 41*7dfdca19SJulian Schmidt #define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \ 42*7dfdca19SJulian Schmidt case Lang_##lang##version: \ 43*7dfdca19SJulian Schmidt return { "-std=" #std_flag, "-frtti" }; 44*7dfdca19SJulian Schmidt #include "clang/Testing/TestLanguage.def" 45*7dfdca19SJulian Schmidt 464604db94SVolodymyr Sapsai case Lang_OBJC: 47*7dfdca19SJulian Schmidt return {"-x", "objective-c", "-frtti", "-fobjc-nonfragile-abi"}; 480e265e31SDmitri Gribenko case Lang_OBJCXX: 49*7dfdca19SJulian Schmidt return {"-x", "objective-c++", "-frtti"}; 500e265e31SDmitri Gribenko case Lang_OpenCL: 51*7dfdca19SJulian Schmidt llvm_unreachable("Unhandled TestLanguage enum"); 520e265e31SDmitri Gribenko } 53*7dfdca19SJulian Schmidt llvm_unreachable("Unhandled TestLanguage enum"); 540e265e31SDmitri Gribenko } 550e265e31SDmitri Gribenko 56a7691deeSSam McCall std::vector<std::string> getCC1ArgsForTesting(TestLanguage Lang) { 57a7691deeSSam McCall switch (Lang) { 58*7dfdca19SJulian Schmidt #define TESTLANGUAGE_C(lang, version, std_flag, version_index) \ 59*7dfdca19SJulian Schmidt case Lang_##lang##version: \ 60*7dfdca19SJulian Schmidt return { "-xc", "-std=" #std_flag }; 61*7dfdca19SJulian Schmidt #define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \ 62*7dfdca19SJulian Schmidt case Lang_##lang##version: \ 63*7dfdca19SJulian Schmidt return { "-std=" #std_flag }; 64*7dfdca19SJulian Schmidt #include "clang/Testing/TestLanguage.def" 65*7dfdca19SJulian Schmidt 66a7f9f2feSVolodymyr Sapsai case Lang_OBJC: 67*7dfdca19SJulian Schmidt return {"-xobjective-c"}; 68a7f9f2feSVolodymyr Sapsai break; 69a7691deeSSam McCall case Lang_OBJCXX: 70*7dfdca19SJulian Schmidt return {"-xobjective-c++"}; 71a7691deeSSam McCall break; 72a7691deeSSam McCall case Lang_OpenCL: 73*7dfdca19SJulian Schmidt llvm_unreachable("Unhandled TestLanguage enum"); 74a7691deeSSam McCall } 75*7dfdca19SJulian Schmidt llvm_unreachable("Unhandled TestLanguage enum"); 76a7691deeSSam McCall } 77a7691deeSSam McCall 78b5fc1debSDmitri Gribenko StringRef getFilenameForTesting(TestLanguage Lang) { 79b5fc1debSDmitri Gribenko switch (Lang) { 80*7dfdca19SJulian Schmidt #define TESTLANGUAGE_C(lang, version, std_flag, version_index) \ 81*7dfdca19SJulian Schmidt case Lang_##lang##version: \ 82b5fc1debSDmitri Gribenko return "input.c"; 83*7dfdca19SJulian Schmidt #define TESTLANGUAGE_CXX(lang, version, std_flag, version_index) \ 84*7dfdca19SJulian Schmidt case Lang_##lang##version: \ 85b5fc1debSDmitri Gribenko return "input.cc"; 86*7dfdca19SJulian Schmidt #include "clang/Testing/TestLanguage.def" 87b5fc1debSDmitri Gribenko 88b5fc1debSDmitri Gribenko case Lang_OpenCL: 89b5fc1debSDmitri Gribenko return "input.cl"; 90b5fc1debSDmitri Gribenko 914604db94SVolodymyr Sapsai case Lang_OBJC: 924604db94SVolodymyr Sapsai return "input.m"; 934604db94SVolodymyr Sapsai 94b5fc1debSDmitri Gribenko case Lang_OBJCXX: 95b5fc1debSDmitri Gribenko return "input.mm"; 96b5fc1debSDmitri Gribenko } 97a30b5c5aSSimon Pilgrim llvm_unreachable("Unhandled TestLanguage enum"); 98b5fc1debSDmitri Gribenko } 99b5fc1debSDmitri Gribenko 100d60d3455SDmitry Polukhin std::string getAnyTargetForTesting() { 101d60d3455SDmitry Polukhin for (const auto &Target : llvm::TargetRegistry::targets()) { 102d60d3455SDmitry Polukhin std::string Error; 103d60d3455SDmitry Polukhin StringRef TargetName(Target.getName()); 104d60d3455SDmitry Polukhin if (TargetName == "x86-64") 105d60d3455SDmitry Polukhin TargetName = "x86_64"; 106d60d3455SDmitry Polukhin if (llvm::TargetRegistry::lookupTarget(std::string(TargetName), Error) == 107d60d3455SDmitry Polukhin &Target) { 108d60d3455SDmitry Polukhin return std::string(TargetName); 109d60d3455SDmitry Polukhin } 110d60d3455SDmitry Polukhin } 111d60d3455SDmitry Polukhin return ""; 112d60d3455SDmitry Polukhin } 113d60d3455SDmitry Polukhin 1140e265e31SDmitri Gribenko } // end namespace clang 115