[cfe-commits] r139358 - /cfe/trunk/lib/Serialization/ASTReader.cpp
Douglas Gregor
dgregor at apple.com
Fri Sep 9 10:30:13 PDT 2011
On Sep 9, 2011, at 10:28 AM, Argyrios Kyrtzidis wrote:
> On Sep 9, 2011, at 9:55 AM, Douglas Gregor wrote:
>
>>
>> On Sep 9, 2011, at 9:44 AM, Argyrios Kyrtzidis wrote:
>>
>>>
>>> On Sep 9, 2011, at 9:12 AM, Douglas Gregor wrote:
>>>
>>>>
>>>> On Sep 9, 2011, at 9:05 AM, Argyrios Kyrtzidis wrote:
>>>>
>>>>> On Sep 9, 2011, at 8:15 AM, Douglas Gregor wrote:
>>>>>
>>>>>>
>>>>>> On Sep 8, 2011, at 11:44 PM, Argyrios Kyrtzidis wrote:
>>>>>>
>>>>>>> Author: akirtzidis
>>>>>>> Date: Fri Sep 9 01:44:17 2011
>>>>>>> New Revision: 139358
>>>>>>>
>>>>>>> URL: http://llvm.org/viewvc/llvm-project?rev=139358&view=rev
>>>>>>> Log:
>>>>>>> [PCH] When loading the decls linked to an identifier, also make them visible
>>>>>>> in the translation unit.
>>>>>>>
>>>>>>> Modified:
>>>>>>> cfe/trunk/lib/Serialization/ASTReader.cpp
>>>>>>>
>>>>>>> Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
>>>>>>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=139358&r1=139357&r2=139358&view=diff
>>>>>>> ==============================================================================
>>>>>>> --- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
>>>>>>> +++ cfe/trunk/lib/Serialization/ASTReader.cpp Fri Sep 9 01:44:17 2011
>>>>>>> @@ -4841,8 +4841,16 @@
>>>>>>> return;
>>>>>>> }
>>>>>>>
>>>>>>> + ASTContext &Ctx = *getContext();
>>>>>>> for (unsigned I = 0, N = DeclIDs.size(); I != N; ++I) {
>>>>>>> NamedDecl *D = cast<NamedDecl>(GetDecl(DeclIDs[I]));
>>>>>>> +
>>>>>>> + // In C++, translation unit's visible decls map gets emitted in the AST
>>>>>>> + // file, but not on C; make the decl visible so it can be looked up.
>>>>>>> + if (!Ctx.getLangOptions().CPlusPlus)
>>>>>>> + SetExternalVisibleDeclsForName(Ctx.getTranslationUnitDecl(),
>>>>>>> + DeclarationName(II), D);
>>>>>>> +
>>>>>>>
>>>>>>
>>>>>> This is a bit unfortunate. Creating the lookup table in the translation unit forces the AST to continually maintain that lookup table (e.g., adding entries to it every time a visible declaration is added to the translation unit), which is a cost we'd like to avoid in C. I presume that you only made this change to support the new lookup used in r139359? I have an alternative suggestion for that...
>>>>>
>>>>> But adding entries always updated the lookup table, or the lookup in r139359 would not work in non-PCH mode, right ?
>>>>> In general I'd find it bad for the AST usefulness if you could not do a lookup in translation unit unless it is on C++.
>>>>
>>>>
>>>> It's more subtle than that. The lookup table for a DeclContext is constructed lazily, when one performs the first lookup, by walking the declarations lexically in that context and populating the table. Once a table is there, it is maintained as declarations are added to the DeclContext.
>>>
>>> I see the error of my ways now. Note however that, outside of this fix, it's very unfortunate that lookup does not work on a loaded C AST.
>>
>>
>> I think it should work, but it's super-inefficient because it will deserialize the whole translation unit.
>
> Once a declaration is loaded through the identifier it can be found in lexical decls linked list right ? It's only of matter then to figure out that if no result is returned from looking up at the external ast source, it doesn't mean that no decl with that name exists, but that the source didn't store a map; in which case we recreate the map with only the lexical decls that were already loaded (and subsequent loaded-through-identifier decls will get added to the existing map)
Ahhh, you are correct. Which means this is already broken :(
Perhaps we should just take the performance hit when building an AST file for a C translation unit, generating the lookup table for the translation unit as AST writing time so we can serialize it.
- Doug
More information about the cfe-commits
mailing list