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

Vassil Vassilev vvasilev at cern.ch
Tue Aug 12 12:41:18 PDT 2014


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> <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/7a203779/attachment.html>


More information about the cfe-dev mailing list