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

Vassil Vassilev vvasilev at cern.ch
Tue Aug 12 13:11:23 PDT 2014


On 12/08/14 21:47, Bogdan Tabacaru wrote:
> 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!
https://github.com/vgvassilev/clad/tree/master/tools

I hope it helps.
Vassil
>
> 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> <mailto: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> <mailto: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> 
>> <mailto: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> <mailto: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> <mailto: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  <mailto: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/d7980360/attachment.html>


More information about the cfe-dev mailing list