зеркало из https://github.com/microsoft/clang-1.git
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
This commit is contained in:
Родитель
1e69fe3a9f
Коммит
869824e879
|
@ -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);
|
||||
};
|
||||
|
|
|
@ -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<const char *, 16> 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<driver::Compilation> 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);
|
||||
|
|
|
@ -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 <cstdio>
|
||||
#include <vector>
|
||||
|
@ -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/<version>/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<ASTUnit> Unit(
|
||||
ASTUnit::LoadFromCommandLine(Args.data(), Args.data() + Args.size(),
|
||||
CXXIdx->getDiags(), "<clang>", MainAddr,
|
||||
CXXIdx->getDiags(),
|
||||
CXXIdx->getClangResourcesPath(),
|
||||
CXXIdx->getOnlyLocalDecls(),
|
||||
/* UseBumpAllocator = */ true));
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче