[cfe-dev] How to make clang compile the data from the RewriteBuffer

Bogdan Tabacaru bogdan.tabacaru88 at yahoo.com
Tue Aug 12 12:47:49 PDT 2014


Do you happen to have a simple out of the box example which works for you?
It might still be something that I am doing wrong and it might not be related to the Consumers.

I would appreciate it very much! Thank you!

Bogdan


On Tuesday, August 12, 2014 9:41 PM, Vassil Vassilev <vvasilev at cern.ch> wrote:
 


On 12/08/14 21:18, Bogdan Tabacaru wrote:

Hi Vassil,

I really wasn't expecting this to work, but I tried it out anyway. Sadly, it still did not change anything.
With or without the Visitor, calling the HandleTopLevelDecl instead of HandleTranslationUnit did not give me the desired effect.
From my side I think the problem resides in how the Rewriter affects the AST. I have the strange feeling that it doesn't really do anything to actually change the original AST, but instead it just buffers the user changes (as per the class' name). With respect to that, I have not found a way it (if possible) to pass the buffer to the CodeGenerator AST Consumer. Is this at all possible?
I don't know. I haven't used the Rewriter in such scenario. We transform the AST with regular Stmt or Decl Visitors.

Vassil


>
>Cheers,
>Bogdan
>On Tuesday, August 12, 2014 7:19 PM, Vassil Vassilev <vvasilev at cern.ch> wrote:
> 
>
>
>Hi Bogdan,
>  It seems that your visitor is called too
                              late, i.e on HandleTranslationUnit. You
                              should override HandleTopLevelDecl
                              instead.
>Cheers,
>Vassil
>On 12/08/14 10:53, Bogdan Tabacaru wrote:
>
>Hi Vassil,
>
>
>I have attempted to debug the Rewriter and CodeGenerator myself and see what happens when compiling, but the amount of code is rather massive and will take some time.
>
>
>Here is an running simplified example of what I am doing. Would mind running it and telling me whether it worked for you or not?
>
>
>Cheers,
>Bogdan
>
>
>
>On Monday, August 11, 2014 11:18 AM, Bogdan Tabacaru <bogdan.tabacaru88 at yahoo.com> wrote:
> 
>
>
>That is a good question.
>
>
>I have written a libTool with the same visitor and consumer.
>I called my_Rewriter.ReplaceText() to make my AST-transformations.
>I have output the RewriteBuffer to a new file and then I compiled it.
>When I run the transformed source, it gives me the expected behavior. However, this requires me to explicitly create a new file with the changes.
>
>
>If I do the same thing with the PluginASTAction (with or without re-ordering the Consumers), I only get the behavior from the original source file.
>
>
>
>
>
>On Monday, August 11, 2014 9:59 AM, Vassil Vassilev <vasil.georgiev.vasilev at cern.ch> wrote:
> 
>
>
>On 08/10/2014 11:02 AM, Bogdan Tabacaru wrote:
>
>Hi Vassil,
>
>
>thanks for the example and the patch!
>
>
>I have applied both of them successfully, but somehow, re-ordering the consumers still did not give me the expected results. This means, when I call the plugin it executes correctly, but CodeGen still only uses the original file (without the changes made by the plugin).
>
>
>Is there another step which I may have forgotten?
>
>
  If you reorder the consumers in the initialization, it should work. Are you sure you have the right tests to check for the desired behaviour? I.e are you sure you are making a valid AST-transformation? 
>
>Vassil
>
>Cheers,
>>Bogdan
>>
>>
>>
>>On Sunday, August 10, 2014 12:22 AM, Vassil Vassilev <vvasilev at cern.ch> wrote:
>> 
>>
>>
>>Hi Bogdan,
>>  After
                                                          applying the
                                                          attached
                                                          patch, I can
                                                          do:
>>
>>void
                                                          MyPlugin::Initialize(ASTContext&
                                                          Context) {
>>  
>>// We need to reorder the consumers in the MultiplexConsumer.
>>MultiplexConsumer&

                                                          multiplex
>>=
                                                          static_cast<MultiplexConsumer&>(m_CI.getASTConsumer());
>>std::vector<ASTConsumer*>&

                                                          consumers =
                                                          multiplex.getConsumers();
>>ASTConsumer*
                                                          lastConsumer =
consumers.back();
>>consumers.pop_back();
>>consumers.insert(consumers.begin(),

                                                          lastConsumer);
>>}
>>
>>This allows me
                                                          to hook
                                                          MyPlugin
                                                          before clang's
                                                          codegen.
>>
>>Vassil
>>On 09/08/14
                                                          21:24, Bogdan
                                                          Tabacaru
                                                          wrote:
>>
>>Hi Vassil,
>>
>>
>>Is the patch available for the 3.4.2 version of LLVM or must I migrate to the "current" version ?
>>
>>
>>Cheers,
>>Bogdan
>>
>>
>>
>>On Friday, August 8, 2014 6:16 PM, Vassil Vassilev <vvasilev at cern.ch> wrote:
>> 
>>
>>
>>Hi,
>>  There is a
                                                          pending patch
                                                          on cfe-commits
                                                          about this
                                                          "[PATCH]
                                                          clang/Frontend/MultiplexConsumer.h".
                                                          With it you
                                                          could reorder
                                                          the
                                                          ASTConsumers
                                                          in clang and
                                                          get yours
                                                          before
                                                          codegen.
>>Vassil
>>On 08/08/14
                                                          16:48, Bogdan
                                                          Tabacaru
                                                          wrote:
>>
>>Hi everyone,
>>
>>
>>I want to create a plugin that makes some changes on the parsed AST and that directly compiles the changes made on the AST. It is important that I do not generate a new file with the changes on the AST.
>>So, in other words, I want to change the AST in place, and then compile it in the same run, using a Clang Plugin.
>>
>>
>>I am using llvm 3.4.2.
>>
>>
>>By following the RecursiveASTVisitor example, I have written a clang plugin which modifies the parsed AST.
>>
>>
>>I am using the Rewriter class to ReplaceText inside the buffer.
>>
>>
>>I am also using the -add-plugin command (instead the "standard" -plugin command) when calling the plugin.
>>
>>
>>The rewriting part works excellently. However, when I continue the compilation, clang only compiles the original file, instead of the original file + changes.
>>Is there a way to tell clang/llvm to compile what I have written in the AST (using the Rewriter) without creating an intermediate file?
>>
>>
>>Thanks a lot for your help,
>>Bogdan
>>
>>
>>
>>
>>
>>
>>_______________________________________________
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/20140812/d89bb013/attachment.html>


More information about the cfe-dev mailing list