[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