diff --git a/clang/lib/Tooling/CMakeLists.txt b/clang/lib/Tooling/CMakeLists.txt --- a/clang/lib/Tooling/CMakeLists.txt +++ b/clang/lib/Tooling/CMakeLists.txt @@ -62,10 +62,6 @@ set(skip_expensive_processing $,$>>) - file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ASTTU.cpp - CONTENT " -#include -") set(implicitDirs) foreach(implicitDir ${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}) @@ -75,12 +71,11 @@ add_custom_command( COMMENT Generate ASTNodeAPI.json OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ASTNodeAPI.json - DEPENDS clang-ast-dump clang-resource-headers ${CMAKE_CURRENT_BINARY_DIR}/ASTTU.cpp + DEPENDS clang-ast-dump clang-resource-headers COMMAND $ # Skip this in debug mode because parsing AST.h is too slow --skip-processing=${skip_expensive_processing} - --astheader=${CMAKE_CURRENT_BINARY_DIR}/ASTTU.cpp -I ${CMAKE_BINARY_DIR}/lib/clang/${CLANG_VERSION}/include -I ${CMAKE_SOURCE_DIR}/../clang/include -I ${CMAKE_BINARY_DIR}/tools/clang/include diff --git a/clang/lib/Tooling/DumpTool/ClangSrcLocDump.cpp b/clang/lib/Tooling/DumpTool/ClangSrcLocDump.cpp --- a/clang/lib/Tooling/DumpTool/ClangSrcLocDump.cpp +++ b/clang/lib/Tooling/DumpTool/ClangSrcLocDump.cpp @@ -14,6 +14,7 @@ #include "clang/Driver/Tool.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Frontend/TextDiagnosticPrinter.h" +#include "clang/Lex/PreprocessorOptions.h" #include "clang/Tooling/Tooling.h" #include "llvm/Option/ArgList.h" #include "llvm/Support/CommandLine.h" @@ -30,10 +31,6 @@ "I", cl::desc("Include directories to use while compiling"), cl::value_desc("directory"), cl::Required, cl::OneOrMore, cl::Prefix); -static cl::opt - AstHeaderFile("astheader", cl::desc("AST header to parse API from"), - cl::Required, cl::value_desc("AST header file")); - static cl::opt SkipProcessing("skip-processing", cl::desc("Avoid processing the AST header file"), @@ -86,7 +83,7 @@ [](const std::string &IncDir) { return "-I" + IncDir; }); Args.push_back("-fsyntax-only"); - Args.push_back(AstHeaderFile); + Args.push_back("ASTTU.cpp"); std::vector Argv(Args.size(), nullptr); llvm::transform(Args, Argv.begin(), @@ -102,9 +99,7 @@ // Don't output diagnostics, because common scenarios such as // cross-compiling fail with diagnostics. This is not fatal, but // just causes attempts to use the introspection API to return no data. - std::string Str; - llvm::raw_string_ostream OS(Str); - TextDiagnosticPrinter DiagnosticPrinter(OS, &*DiagOpts); + TextDiagnosticPrinter DiagnosticPrinter(llvm::nulls(), &*DiagOpts); DiagnosticsEngine Diagnostics( IntrusiveRefCntPtr(new DiagnosticIDs()), &*DiagOpts, &DiagnosticPrinter, false); @@ -133,6 +128,9 @@ auto Invocation = std::make_unique(); CompilerInvocation::CreateFromArgs(*Invocation, CC1Args, Diagnostics); + Invocation->getPreprocessorOpts().addRemappedFile( + "ASTTU.cpp", + MemoryBuffer::getMemBuffer("#include \"clang/AST/AST.h\"\n").release()); CompilerInstance Compiler(std::make_shared()); Compiler.setInvocation(std::move(Invocation));