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) {