[cfe-dev] Creating single AST for multiple files

Manuel Klimek klimek at google.com
Tue Jan 20 05:43:25 PST 2015


On Sat Jan 17 2015 at 10:32:07 PM Deepak Rajendrakumaran <deepak3 at vt.edu>
wrote:

> James,
>
> Thank you for answering my query.
>
> I might have misunderstood the issues. We have been using 'Rose', which is
> another source to source compiler. Rose generates a single AST. I expected
> something similar which is why I was looking for a way to generate a single
> AST. But having gone through some some documentation, it seems like it is
> indeed possible to implement this using multiple ASTs. But my problem is I
> will need to revisit each AST multiple times and make incremental changes
> on source files. Is 'clang-apply-replacements' a solution to this?
>

Yes. Generally, you'll want to run over all TUs, and create replacements,
and then apply them in one step in the end.

I am also confused as to if I should be using LibClang or LibTooling
> keeping in mind I'll need to make significant changes to my source code. Is
> there any functionality constraint on LibClang/LibTooling which I can use
> to make up my mind??
>

libclang currently doesn't have refactoring support, so if you want to
rewrite code, you'll want to use libtooling...


>
> Regards,
> Deepak
>
> On Thu, Jan 15, 2015 at 4:11 PM, James Dennett <james.dennett at gmail.com>
> wrote:
>
>> On Thu, Jan 15, 2015 at 12:51 PM, Deepak Rajendrakumaran <deepak3 at vt.edu>
>> wrote:
>>
>>> Hello,
>>>
>>> I am new to Clang and so I am having some problem figuring out how to
>>> create AST for a program with multiple files .
>>>
>>>
>>> What I am trying to do:
>>> - In an application containing multiple .cpp/.c and .h files, parse
>>> through all the files and identify all instances of a particular function
>>> -Move the function definition to a new file with a changed name(changed
>>> function name)
>>> -Find all instances where the particular function is called and change
>>> the function name to the new name
>>>
>>> (I am ignoring the other dependencies like nested functions/headers etc
>>> so that I can focus on my actual question. So assume this works:))
>>>
>>> I have been reading up on Clang/libtooling inorder to figure out a way
>>> to do the same. From what I understand, the steps to do this would be
>>> - Compile and create ASTs for the entire source code(assuming it
>>> includes multiple .cpp and .h files)
>>> -Somehow traverse these ASTs(RecursiveASTVisitor)  to figure out where
>>> all this the particular function I am interested in exists(ASTMatchers??)
>>> -First write the function definition to a new file
>>> -Now use the rewriter to write the original file without the function
>>> definition and replace all the places where a call to this function exists
>>> with its new name
>>> (I have tried to simplify the problem statement so that I can pinpoint
>>> my issue better. I'll ofcourse have to manipulate the ASTs and the source
>>> code more to get a working program )
>>>
>>> First of all, I need to have ASTs of all TUs and not just one AST. Is
>>> there any way in libtooling to obtain a single AST for multiple TUs? If not
>>> is there any standard practice for the same incase anyone has faced the
>>> same problem?
>>>
>>>
>> I'm not sure that I understand.  Standard practice is to process one AST
>> per TU.  I've not found it to be a problem, but maybe it is for you for
>> some reason -- in which case it might help to say what that reason is.
>> There may well be solutions.
>>
>> -- James
>>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150120/25472cc1/attachment.html>


More information about the cfe-dev mailing list