[cfe-dev] Announcing "clang-ctags"

Manuel Klimek klimek at google.com
Wed Jul 25 10:55:24 PDT 2012


On Wed, Jul 25, 2012 at 7:52 PM, Douglas Gregor <dgregor at apple.com> wrote:
>
> 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

Perfect. Thanks!




More information about the cfe-dev mailing list