From: Daniel Dunbar Date: Sun, 13 Dec 2009 03:46:13 +0000 (+0000) Subject: Lift builtin-include-path logic out of ASTUnit::LoadFromCommandLine and fix CIndex... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=869824e87940f97b87064db2df2861e82e08a8c6;p=clang Lift builtin-include-path logic out of ASTUnit::LoadFromCommandLine and fix CIndex to pass in the right directory (previously it was using the path to the main executable, which generally is wrong). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91238 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Frontend/ASTUnit.h b/include/clang/Frontend/ASTUnit.h index 29d7b1aa2f..f18972ab34 100644 --- a/include/clang/Frontend/ASTUnit.h +++ b/include/clang/Frontend/ASTUnit.h @@ -149,19 +149,14 @@ public: /// \param Diags - The diagnostics engine to use for reporting errors; its /// lifetime is expected to extend past that of the returned ASTUnit. /// - /// \param Argv0 - The program path (from argv[0]), for finding the builtin - /// compiler path. - /// - /// \param MainAddr - The address of main (or some other function in the main - /// executable), for finding the builtin compiler path. + /// \param ResourceFilesPath - The path to the compiler resource files. // // FIXME: Move OnlyLocalDecls, UseBumpAllocator to setters on the ASTUnit, we // shouldn't need to specify them at construction time. static ASTUnit *LoadFromCommandLine(const char **ArgBegin, const char **ArgEnd, Diagnostic &Diags, - const char *Arg0, - void *MainAddr, + llvm::StringRef ResourceFilesPath, bool OnlyLocalDecls = false, bool UseBumpAllocator = false); }; diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index 16d2ea93d8..f6cb1704f6 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/lib/Frontend/ASTUnit.cpp @@ -287,8 +287,7 @@ error: ASTUnit *ASTUnit::LoadFromCommandLine(const char **ArgBegin, const char **ArgEnd, Diagnostic &Diags, - const char *Argv0, - void *MainAddr, + llvm::StringRef ResourceFilesPath, bool OnlyLocalDecls, bool UseBumpAllocator) { llvm::SmallVector Args; @@ -299,9 +298,8 @@ ASTUnit *ASTUnit::LoadFromCommandLine(const char **ArgBegin, // also want to force it to use clang. Args.push_back("-fsyntax-only"); - llvm::sys::Path Path = llvm::sys::Path::GetMainExecutable(Argv0, MainAddr); - driver::Driver TheDriver(Path.getBasename(), Path.getDirname(), - llvm::sys::getHostTriple(), + // FIXME: We shouldn't have to pass in the path info. + driver::Driver TheDriver("clang", "/", llvm::sys::getHostTriple(), "a.out", false, Diags); llvm::OwningPtr C( TheDriver.BuildCompilation(Args.size(), Args.data())); @@ -329,11 +327,10 @@ ASTUnit *ASTUnit::LoadFromCommandLine(const char **ArgBegin, (const char**) CCArgs.data()+CCArgs.size(), Diags); - // Infer the builtin include path if unspecified. - if (CI.getHeaderSearchOpts().UseBuiltinIncludes && - CI.getHeaderSearchOpts().BuiltinIncludePath.empty()) - CI.getHeaderSearchOpts().BuiltinIncludePath = - CompilerInvocation::GetBuiltinIncludePath(Argv0, MainAddr); + // Set the builtin include path. + llvm::sys::Path P(ResourceFilesPath); + P.appendComponent("include"); + CI.getHeaderSearchOpts().BuiltinIncludePath = P.str(); CI.getFrontendOpts().DisableFree = UseBumpAllocator; return LoadFromCompilerInvocation(CI, Diags, OnlyLocalDecls); diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp index 5c9fb3adf6..fe3aa37694 100644 --- a/tools/CIndex/CIndex.cpp +++ b/tools/CIndex/CIndex.cpp @@ -12,25 +12,26 @@ //===----------------------------------------------------------------------===// #include "clang-c/Index.h" -#include "clang/Index/Program.h" -#include "clang/Index/Indexer.h" -#include "clang/Index/ASTLocation.h" -#include "clang/Index/Utils.h" -#include "clang/Sema/CodeCompleteConsumer.h" +#include "clang/AST/Decl.h" #include "clang/AST/DeclVisitor.h" #include "clang/AST/StmtVisitor.h" -#include "clang/AST/Decl.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/SourceManager.h" +#include "clang/Basic/Version.h" #include "clang/Frontend/ASTUnit.h" #include "clang/Frontend/CompilerInstance.h" +#include "clang/Index/ASTLocation.h" +#include "clang/Index/Indexer.h" +#include "clang/Index/Program.h" +#include "clang/Index/Utils.h" +#include "clang/Sema/CodeCompleteConsumer.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Config/config.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/raw_ostream.h" #include "llvm/System/Path.h" #include "llvm/System/Program.h" -#include "llvm/Support/raw_ostream.h" #include #include @@ -336,6 +337,9 @@ public: /// \brief Get the path of the clang binary. const llvm::sys::Path& getClangPath(); + + /// \brief Get the path of the clang resource files. + std::string getClangResourcesPath(); }; const llvm::sys::Path& CIndexer::getClangPath() { @@ -377,6 +381,22 @@ const llvm::sys::Path& CIndexer::getClangPath() { return ClangPath; } +std::string CIndexer::getClangResourcesPath() { + llvm::sys::Path P = getClangPath(); + + if (!P.empty()) { + P.eraseComponent(); // Remove /clang from foo/bin/clang + P.eraseComponent(); // Remove /bin from foo/bin + + // Get foo/lib/clang//include + P.appendComponent("lib"); + P.appendComponent("clang"); + P.appendComponent(CLANG_VERSION_STRING); + } + + return P.str(); +} + } static SourceLocation getLocationFromCursor(CXCursor C, @@ -508,12 +528,11 @@ clang_createTranslationUnitFromSourceFile(CXIndex CIdx, Args.insert(Args.end(), command_line_args, command_line_args + num_command_line_args); - void *MainAddr = (void *)(uintptr_t)clang_createTranslationUnit; - unsigned NumErrors = CXXIdx->getDiags().getNumErrors(); llvm::OwningPtr Unit( ASTUnit::LoadFromCommandLine(Args.data(), Args.data() + Args.size(), - CXXIdx->getDiags(), "", MainAddr, + CXXIdx->getDiags(), + CXXIdx->getClangResourcesPath(), CXXIdx->getOnlyLocalDecls(), /* UseBumpAllocator = */ true)); diff --git a/tools/index-test/index-test.cpp b/tools/index-test/index-test.cpp index 0b1971f797..8b12c0ba8c 100644 --- a/tools/index-test/index-test.cpp +++ b/tools/index-test/index-test.cpp @@ -223,9 +223,12 @@ ASTUnit *CreateFromSource(const std::string &Filename, Diagnostic &Diags, for (unsigned i = 0, e = CompilerArgs.size(); i != e; ++i) Args.push_back(CompilerArgs[i].c_str()); + void *MainAddr = (void*) (intptr_t) CreateFromSource; + llvm::sys::Path ResourcesPath( + CompilerInvocation::GetBuiltinIncludePath(Argv0, MainAddr)); + ResourcesPath.eraseComponent(); return ASTUnit::LoadFromCommandLine(Args.data(), Args.data() + Args.size(), - Diags, Argv0, - (void*) (intptr_t) CreateFromSource); + Diags, ResourcesPath.str()); } int main(int argc, char **argv) {