[cfe-dev] Handling multiple translation units
Simone Pellegrini
spellegrini at dps.uibk.ac.at
Sun Oct 25 02:44:22 PDT 2009
Douglas Gregor wrote:
>
> On Oct 23, 2009, at 10:19 AM, Simone Pellegrini wrote:
>
>> Dear all,
>> I need to perform code transformations based on inter-procedural
>> analysis done on multiple translation units.
>>
>> In order to do that I need to keep the AST generated for each
>> translation unit in memory, do my analysis and then restart rewriting
>> part of the AST I need to modify. Conceptually is not difficult my I
>> am experiencing a weird behavior of Clang and maybe you can help me.
>>
>> basically that's what I am doing:
>>
>> vector<ASTContext*> ctxs;
>> for each input file{
>> Preprocessor PP(...);
>> InitializePreprocessor(PP);
>> ctxs.push_back( new ASTContext(...., false, 0) );
>> ParseAST(PP, *ctxs.back(),...);
>> }
>
> You will need to make sure that the SourceManager is also retained,
> since the ASTContext stores a reference to its SourceManager. The same
> is true for TargetInfo, IdentifierTable, SelectorTable, etc.
>
>> // Now do ANALYSIS (e.g. building a clang::CallGraph )
>> for each context in ctxs{
>> DeclContext *DC=ctxs[i];
>> for each decl{
>> if decl is a func{
>> FuncDecl* FD = ();
>> cout << FD->getNameAsString() << endl; <--- ERROR
>> }
>> }
>> }
>>
>> As you can see from the code, every time I try to access the
>> information of the ASTContext it looks like everything is gone. why?
>
> Well, getNameAsString() is going to try to look at an IdentifierInfo
> that may have been deallocated when the IdentifierTable is destroyed.
> Your best bet would be to keep the whole Preprocessor alive for each
> ASTContext.
Thanks Doug,
it works as expected now... no more strange error messages because of
corrupted memory!
cheers bye
>
> - Doug
More information about the cfe-dev
mailing list