<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Mon, Oct 5, 2015 at 6:05 PM Zsolt Parragi via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><u></u><div><div style="font-size:10pt;font-family:Verdana,Arial,Helvetica,sans-serif"><div>Hello<br></div><div><br></div><div>There was an email on this list about my question earlier in January:<br></div><div><br></div><div><a href="http://lists.llvm.org/pipermail/cfe-dev/2015-January/040760.html" target="_blank">http://lists.llvm.org/pipermail/cfe-dev/2015-January/040760.html</a><br></div><div><br></div><div>But it contained no specific information about how to do it, and I couldn't figure it out based on the docs.<br></div><div><br></div><div>My problem is:<br><br>I have a source-to-source transformation tool, built using AstMatchers/Rewriter. It's perfect when I want to compile something with gcc (I can transform the source with it, and run gcc on the modified source), and also works with clang, but I thought it could be integrated with it even better: a clang plugin, which rewrites the source, but instead of saving it to a file, clang just could reparse the modifications from the memory buffer and compile it...<br><br>So I have a PluginASTAction, and a Rewriter member, containing everything I modified. <br><br> * I tried the solution used by tracer (link found in the same conversation), saving the modification to the DefaultOutputFile. That overwrites the original file on the disk, and doesn't reload it - the modification will be only visible during the next execution<br> * I also found ASTUnit::Reparse, which is accessible from any FrontendAction, but I only succeeded in causing segmentation faults with it - the function itself isn't used by clang itself, and I found no plugins / projects using it with google<br> * I could write a standalone program which transforms the source, saves it to a temporary file, runs clang with it, and deletes the temporary file... but I hope it can be solved in a better way.<br></div></div></div></blockquote><div><br></div><div>You could use two ClangTools / ToolInvocations. You'll definitely need to create a new instance, as you'll want a new SourceManager.</div><div>Generally, this is possible, but not really a common use case; most of the time, people want to rewrite things in headers, where this approach quickly leads to ODR violations</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div style="font-size:10pt;font-family:Verdana,Arial,Helvetica,sans-serif"><div><br>(I read that the recommended way is just adding attributes to the AST and changing the IR, but that would require creating and maintaining two version of my tool)<br><br>My questions:<br> * is this possible at all, with a plugin?<br> * If it is, the solution is Reparse and I'm just doing something wrong, or something entirely different?</div><div><br></div></div></div>_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
</blockquote></div></div>