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

Bogdan Tabacaru bogdan.tabacaru88 at yahoo.com
Tue Aug 12 01:53:56 PDT 2014


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/88b1fc09/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: rewriter_ex.tar.gz
Type: application/gzip
Size: 3487 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20140812/88b1fc09/attachment.bin>


More information about the cfe-dev mailing list