<div class="gmail_quote">On Tue, Jul 31, 2012 at 6:56 AM, Manuel Klimek <span dir="ltr"><<a href="mailto:klimek@google.com" target="_blank">klimek@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: klimek<br>
Date: Tue Jul 31 08:56:54 2012<br>
New Revision: 161047<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=161047&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=161047&view=rev</a><br>
Log:<br>
Fixes a segfault in Tooling when using pch's:<br>
Clear the FileManager's stat cache in between running<br>
translation units, as the stat cache loaded from a pch<br>
is only valid for one compiler invocation.<br>
<br>
<br>
Added:<br>
    cfe/trunk/test/Tooling/Inputs/<br>
    cfe/trunk/test/Tooling/Inputs/lit.local.cfg<br>
    cfe/trunk/test/Tooling/Inputs/pch-fail.h<br>
    cfe/trunk/test/Tooling/Inputs/pch.cpp<br>
    cfe/trunk/test/Tooling/Inputs/pch.h<br>
    cfe/trunk/test/Tooling/pch.cpp<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/FileManager.h<br>
    cfe/trunk/lib/Basic/FileManager.cpp<br>
    cfe/trunk/lib/Tooling/Tooling.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Basic/FileManager.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/FileManager.h?rev=161047&r1=161046&r2=161047&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/FileManager.h?rev=161047&r1=161046&r2=161047&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Basic/FileManager.h (original)<br>
+++ cfe/trunk/include/clang/Basic/FileManager.h Tue Jul 31 08:56:54 2012<br>
@@ -186,6 +186,9 @@<br>
   /// \brief Removes the specified FileSystemStatCache object from the manager.<br>
   void removeStatCache(FileSystemStatCache *statCache);<br>
<br>
+  /// \brief Removes all FileSystemStatCache objects from the manager.<br>
+  void clearStatCaches();<br>
+<br>
   /// \brief Lookup, cache, and verify the specified directory (real or<br>
   /// virtual).<br>
   ///<br>
<br>
Modified: cfe/trunk/lib/Basic/FileManager.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/FileManager.cpp?rev=161047&r1=161046&r2=161047&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/FileManager.cpp?rev=161047&r1=161046&r2=161047&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Basic/FileManager.cpp (original)<br>
+++ cfe/trunk/lib/Basic/FileManager.cpp Tue Jul 31 08:56:54 2012<br>
@@ -223,6 +223,10 @@<br>
   PrevCache->setNextStatCache(statCache->getNextStatCache());<br>
 }<br>
<br>
+void FileManager::clearStatCaches() {<br>
+  StatCache.reset(0);<br>
+}<br>
+<br>
 /// \brief Retrieve the directory that the given file name resides in.<br>
 /// Filename can point to either a real file or a virtual file.<br>
 static const DirectoryEntry *getDirectoryFromFile(FileManager &FileMgr,<br>
<br>
Modified: cfe/trunk/lib/Tooling/Tooling.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/Tooling.cpp?rev=161047&r1=161046&r2=161047&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/Tooling.cpp?rev=161047&r1=161046&r2=161047&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Tooling/Tooling.cpp (original)<br>
+++ cfe/trunk/lib/Tooling/Tooling.cpp Tue Jul 31 08:56:54 2012<br>
@@ -212,6 +212,7 @@<br>
   const bool Success = Compiler.ExecuteAction(*ScopedToolAction);<br>
<br>
   Compiler.resetAndLeakFileManager();<br>
+  Files->clearStatCaches();<br>
   return Success;<br>
 }<br>
<br>
<br>
Added: cfe/trunk/test/Tooling/Inputs/lit.local.cfg<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/Inputs/lit.local.cfg?rev=161047&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/Inputs/lit.local.cfg?rev=161047&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/Tooling/Inputs/lit.local.cfg (added)<br>
+++ cfe/trunk/test/Tooling/Inputs/lit.local.cfg Tue Jul 31 08:56:54 2012<br>
@@ -0,0 +1 @@<br>
+config.suffixes = []<br>
<br>
Added: cfe/trunk/test/Tooling/Inputs/pch-fail.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/Inputs/pch-fail.h?rev=161047&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/Inputs/pch-fail.h?rev=161047&view=auto</a><br>

==============================================================================<br>
    (empty)<br>
<br>
Added: cfe/trunk/test/Tooling/Inputs/pch.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/Inputs/pch.cpp?rev=161047&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/Inputs/pch.cpp?rev=161047&view=auto</a><br>

==============================================================================<br>
    (empty)<br>
<br>
Added: cfe/trunk/test/Tooling/Inputs/pch.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/Inputs/pch.h?rev=161047&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/Inputs/pch.h?rev=161047&view=auto</a><br>

==============================================================================<br>
    (empty)<br>
<br>
Added: cfe/trunk/test/Tooling/pch.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/pch.cpp?rev=161047&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Tooling/pch.cpp?rev=161047&view=auto</a><br>

==============================================================================<br>
--- cfe/trunk/test/Tooling/pch.cpp (added)<br>
+++ cfe/trunk/test/Tooling/pch.cpp Tue Jul 31 08:56:54 2012<br>
@@ -0,0 +1,21 @@<br>
+// This is a regression test for handling of stat caches within the tooling<br>
+// infrastructure. This test reproduces the problem under valgrind:<br>
+<br>
+// First, create a pch that we can later load. Loading the pch will insert<br>
+// a stat cache into the FileManager:<br>
+// RUN: %clang -x c++-header %S/Inputs/pch.h -o %t1<br>
+<br>
+// Use the generated pch and enforce a subsequent stat miss by by using<br></blockquote><div><br></div><div>Typo: "by by" :)</div></div>