diff options
author | Alex Lorenz <arphaman@gmail.com> | 2017-12-05 02:30:43 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2017-12-05 02:30:43 +0000 |
commit | 99ba11f395fafcc2fd32b623cdc556115b08a693 (patch) | |
tree | eaa6704413ce4145a33d2576fe1825eeecb7916b /tools | |
parent | 25b45aa81854313486df891985cdd7ef1ec09780 (diff) |
[libclang] Store unsaved file hashes when recording parsing invocations
Storing the contents of unsaved files is too expensive.
Instead a hash is stored with a record invocation. When a reproducer is
generated, Clang will compare the stored hashes to the new hashes to determine
if the contents of a file has changed. This way we'll know when a reproducer was
generated for a different source to the one that triggered the original crash.
rdar://35322543
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@319729 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools')
-rw-r--r-- | tools/libclang/CIndex.cpp | 3 | ||||
-rw-r--r-- | tools/libclang/CIndexer.cpp | 22 | ||||
-rw-r--r-- | tools/libclang/CIndexer.h | 3 |
3 files changed, 24 insertions, 4 deletions
diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index b642014c43..b2edd42cb0 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -3438,10 +3438,9 @@ clang_parseTranslationUnit_Impl(CXIndex CIdx, const char *source_filename, unsigned PrecompilePreambleAfterNParses = !PrecompilePreamble ? 0 : 2 - CreatePreambleOnFirstParse; - // FIXME: Record the hash of the unsaved files. LibclangInvocationReporter InvocationReporter( *CXXIdx, LibclangInvocationReporter::OperationKind::ParseOperation, - options, llvm::makeArrayRef(*Args)); + options, llvm::makeArrayRef(*Args), unsaved_files); std::unique_ptr<ASTUnit> Unit(ASTUnit::LoadFromCommandLine( Args->data(), Args->data() + Args->size(), CXXIdx->getPCHContainerOperations(), Diags, diff --git a/tools/libclang/CIndexer.cpp b/tools/libclang/CIndexer.cpp index 13774bd8b7..b705016251 100644 --- a/tools/libclang/CIndexer.cpp +++ b/tools/libclang/CIndexer.cpp @@ -12,11 +12,13 @@ //===----------------------------------------------------------------------===// #include "CIndexer.h" +#include "CXString.h" #include "clang/Basic/LLVM.h" #include "clang/Basic/Version.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallString.h" #include "llvm/Config/llvm-config.h" +#include "llvm/Support/MD5.h" #include "llvm/Support/MutexGuard.h" #include "llvm/Support/Path.h" #include "llvm/Support/Program.h" @@ -90,7 +92,8 @@ StringRef CIndexer::getClangToolchainPath() { LibclangInvocationReporter::LibclangInvocationReporter( CIndexer &Idx, OperationKind Op, unsigned ParseOptions, - llvm::ArrayRef<const char *> Args) { + llvm::ArrayRef<const char *> Args, + llvm::ArrayRef<CXUnsavedFile> UnsavedFiles) { StringRef Path = Idx.getInvocationEmissionPath(); if (Path.empty()) return; @@ -124,6 +127,23 @@ LibclangInvocationReporter::LibclangInvocationReporter( OS << ','; OS << '"' << I.value() << '"'; } + if (!UnsavedFiles.empty()) { + OS << R"(],"unsaved_file_hashes":[)"; + for (const auto &UF : llvm::enumerate(UnsavedFiles)) { + if (UF.index()) + OS << ','; + OS << '{'; + WriteStringKey("name", UF.value().Filename); + OS << ','; + llvm::MD5 Hash; + Hash.update(getContents(UF.value())); + llvm::MD5::MD5Result Result; + Hash.final(Result); + SmallString<32> Digest = Result.digest(); + WriteStringKey("md5", Digest); + OS << '}'; + } + } OS << "]}"; } diff --git a/tools/libclang/CIndexer.h b/tools/libclang/CIndexer.h index b3346cd955..dafbb08cfa 100644 --- a/tools/libclang/CIndexer.h +++ b/tools/libclang/CIndexer.h @@ -94,7 +94,8 @@ public: LibclangInvocationReporter(CIndexer &Idx, OperationKind Op, unsigned ParseOptions, - llvm::ArrayRef<const char *> Args); + llvm::ArrayRef<const char *> Args, + llvm::ArrayRef<CXUnsavedFile> UnsavedFiles); ~LibclangInvocationReporter(); private: |