[cfe-dev] Announcing "clang-ctags"

Douglas Gregor dgregor at apple.com
Wed Jul 25 10:52:27 PDT 2012


On Jul 25, 2012, at 10:25 AM, Manuel Klimek <klimek at google.com> wrote:

> On Wed, Jul 25, 2012 at 7:06 PM, Douglas Gregor <dgregor at apple.com> wrote:
>> 
>> On Jul 25, 2012, at 2:41 AM, Manuel Klimek <klimek at google.com> wrote:
>> 
>>> On Wed, Jul 25, 2012 at 12:14 AM, Sean Silva <silvas at purdue.edu> wrote:
>>>> I saw the bug report, but that gives only memory addresses and
>>>> instruction offsets for what the offending code is (`0x1048b50b1 in
>>>> (anonymous namespace)::ASTStatCache::getStat(char const*,
>>>> stat&, int*) (in clang-tags) + 977`); given the size of `getStat` and
>>>> a brief perusal of the source, it seems like at least one level of
>>>> inlining is involved. It would be immensely helpful if you could tie
>>>> that address back to the statement/expression which causes the
>>>> reference.
>>> 
>>> Also, as noted on the bug, the Tooling should never pull in
>>> ASTStatCache. Any pointers to how that might be instantiated would be
>>> of great help.
>> 
>> 
>> I suspect this is what is happening:
>> 
>>  - Clang is loading a precompiled header, which wires a stat cache into the FileManager. That stat cache points into the mmap'd memory for the precompiled header.
>>  - That instance of the compiler completes, and everything goes away *except* the stat cache, since the FileManager is reused. We now have a stat cache in the FileManager that points at the location of previously-mmap'd memory for the precompiled header.
>>  - Later instances of the compiler wire more stat caches into the FileManager, and most lookups hit those earlier caches, so the problem doesn't reproduce easily
>>  - Eventually, we have a cache miss in a later instance of the compiler, and the dangling pointer into the previously-mmap'd precompiled header ends up getter used after those addresses have been reused, and BOOM!
>> 
>> Solution: clear out the stat caches attached to the FileManager when re-using that file manager.
> 
> Thx for solving the mystery :) Do you have a pointer (example test or
> something) on what's the best way to create a precompiled header for a
> small test?


There are a bunch of tests in test/PCH that do this, but they're based on clang -cc1, which tooling is not. Instead, just use the driver-level options:

	clang -x c++-header foo.h -o foo.h.pch

to create the PCH and

	clang -include foo.h foo.cpp

to use that PCH file


	- Doug



More information about the cfe-dev mailing list