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