Index: clang-tools-extra/clang-tidy/ClangTidy.h =================================================================== --- clang-tools-extra/clang-tidy/ClangTidy.h +++ clang-tools-extra/clang-tidy/ClangTidy.h @@ -80,6 +80,7 @@ ArrayRef InputFiles, llvm::IntrusiveRefCntPtr BaseFS, bool ApplyAnyFix, bool EnableCheckProfile = false, + const std::string &TargetTriple = "", llvm::StringRef StoreCheckProfile = StringRef()); /// Controls what kind of fixes clang-tidy is allowed to apply. Index: clang-tools-extra/clang-tidy/ClangTidy.cpp =================================================================== --- clang-tools-extra/clang-tidy/ClangTidy.cpp +++ clang-tools-extra/clang-tidy/ClangTidy.cpp @@ -509,21 +509,23 @@ return Factory.getCheckOptions(); } -std::vector -runClangTidy(clang::tidy::ClangTidyContext &Context, - const CompilationDatabase &Compilations, - ArrayRef InputFiles, - llvm::IntrusiveRefCntPtr BaseFS, - bool ApplyAnyFix, bool EnableCheckProfile, - llvm::StringRef StoreCheckProfile) { +std::vector runClangTidy( + clang::tidy::ClangTidyContext &Context, + const CompilationDatabase &Compilations, ArrayRef InputFiles, + llvm::IntrusiveRefCntPtr BaseFS, + bool ApplyAnyFix, bool EnableCheckProfile, const std::string &TargetTriple, + llvm::StringRef StoreCheckProfile) { ClangTool Tool(Compilations, InputFiles, std::make_shared(), BaseFS); // Add extra arguments passed by the clang-tidy command-line. ArgumentsAdjuster PerFileExtraArgumentsInserter = - [&Context](const CommandLineArguments &Args, StringRef Filename) { + [&Context, &TargetTriple](const CommandLineArguments &Args, + StringRef Filename) { ClangTidyOptions Opts = Context.getOptionsForFile(Filename); CommandLineArguments AdjustedArgs = Args; + if (!TargetTriple.empty()) + AdjustedArgs.push_back("--target=" + TargetTriple); if (Opts.ExtraArgsBefore) { auto I = AdjustedArgs.begin(); if (I != AdjustedArgs.end() && !StringRef(*I).startswith("-")) Index: clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp =================================================================== --- clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp +++ clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp @@ -256,6 +256,12 @@ )"), cl::init(false), cl::cat(ClangTidyCategory)); +static cl::opt TargetTriple("target", cl::desc(R"( +Override target triple for clang-tidy. If not set, the host target will be +used.)"), + cl::init(""), + cl::cat(ClangTidyCategory)); + namespace clang { namespace tidy { @@ -488,11 +494,20 @@ llvm::InitializeAllTargetMCs(); llvm::InitializeAllAsmParsers(); + if (!TargetTriple.empty()) { + TargetTriple = Triple::normalize(TargetTriple); + auto T = Triple(TargetTriple); + if (T.getArch() == Triple::UnknownArch) { + llvm::errs() << "Error: unknown target triple '" << TargetTriple << "'\n"; + return 1; + } + } + ClangTidyContext Context(std::move(OwningOptionsProvider), AllowEnablingAnalyzerAlphaCheckers); std::vector Errors = runClangTidy(Context, OptionsParser->getCompilations(), PathList, BaseFS, - FixNotes, EnableCheckProfile, ProfilePrefix); + FixNotes, EnableCheckProfile, TargetTriple, ProfilePrefix); bool FoundErrors = llvm::find_if(Errors, [](const ClangTidyError &E) { return E.DiagLevel == ClangTidyError::Error; }) != Errors.end(); Index: clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-type-vararg-ms.cpp =================================================================== --- clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-type-vararg-ms.cpp +++ clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines-pro-type-vararg-ms.cpp @@ -2,9 +2,7 @@ // Ensure that the 'cppcoreguidelines-pro-type-vararg' check works with the // built-in va_list on Windows systems. -// REQUIRES: system-windows - -// RUN: %check_clang_tidy %s cppcoreguidelines-pro-type-vararg %t +// RUN: %check_clang_tidy -target="x86_64-windows" %s cppcoreguidelines-pro-type-vararg %t void test_ms_va_list(int a, ...) { __builtin_ms_va_list ap;