From 3dd728914163cdf3ed9c4e16f99a441721077f4b Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Thu, 31 Oct 2019 22:31:03 -0700 Subject: [PATCH] Infer -target and --driver-mode from argv[0] Fix #511 --- src/clang_tu.cc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/clang_tu.cc b/src/clang_tu.cc index b153a8e0..ee99c4d6 100644 --- a/src/clang_tu.cc +++ b/src/clang_tu.cc @@ -7,6 +7,7 @@ #include "platform.hh" #include +#include #include #include @@ -79,6 +80,19 @@ buildCompilerInvocation(const std::string &main, std::vector args, IntrusiveRefCntPtr diags( CompilerInstance::createDiagnostics(new DiagnosticOptions, new IgnoringDiagConsumer, true)); + + // Similar to clang/tools/driver/driver.cpp:insertTargetAndModeArgs but don't + // require llvm::InitializeAllTargetInfos(). + driver::Driver d(args[0], llvm::sys::getDefaultTargetTriple(), *diags); + auto target_and_mode = + driver::ToolChain::getTargetAndModeFromProgramName(args[0]); + if (target_and_mode.DriverMode) + args.insert(args.begin() + 1, target_and_mode.DriverMode); + if (!target_and_mode.TargetPrefix.empty()) { + const char *arr[] = {"-target", target_and_mode.TargetPrefix.c_str()}; + args.insert(args.begin() + 1, std::begin(arr), std::end(arr)); + } + std::unique_ptr ci = createInvocationFromCommandLine(args, diags, vfs); if (ci) {