[cfe-dev] Handling multiple translation units

Douglas Gregor dgregor at apple.com
Fri Oct 23 11:19:50 PDT 2009


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.

	- Doug
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20091023/7300691a/attachment.html>


More information about the cfe-dev mailing list