[cfe-dev] Plugin: Rewriter does not work?

Marcel Schaible via cfe-dev cfe-dev at lists.llvm.org
Thu Jul 20 03:27:48 PDT 2017


Good point. I'll changed it, but  I think the Rewriter will not change 
the AST and therefore my changes are ignored by further compiler stages.

Is there a mechanism to rebuild the AST from RewriteBuffer?

Thanks

Marcel


Am 20.07.2017 um 11:36 schrieb John Brawn:
>  From a quick look at your code MyInstrumentation::getActionType is
> returning AddAfterMainAction which means it's getting run after code
> generation. To run it before code generation change that to
> AddBeforeMainAction, which should hopefully make it do what you want.
>
> John
>
>> -----Original Message-----
>> From: cfe-dev [mailto:cfe-dev-bounces at lists.llvm.org] On Behalf Of
>> Marcel Schaible via cfe-dev
>> Sent: 19 July 2017 20:26
>> To: cfe-dev at lists.llvm.org
>> Subject: Re: [cfe-dev] Plugin: Rewriter does not work?
>>
>> Hi,
>>
>> I need some advice. I want to create a plugin for clang which for e.g.
>> alters the argument list of specific functions and insert valid c
>> statements at certain points in the translation unit.
>>
>> The Rewriter class is changing the source code as expected and I can
>> write it to a temporary file and start the clang  compiler without my
>> plugin again.
>>
>> Is there a better solution like calling clang with my plugin and apply
>> my changes on the fly?
>>
>>   From my current understanding it is not possible to alter the AST in a
>> plugin. Is this correct?
>>
>> Thanks
>>
>> Marcel
>>
>>
>> Am 19.07.2017 um 14:28 schrieb Marcel Schaible via cfe-dev:
>>> Hi,
>>>
>>> in my clang plugin I want to rewrite certain parts of the translation
>>> unit. In the MyVisitor I'll setup a rewriter and try to replace for
>>> e.g. the name of a function decl:
>>>
>>> TheRewriter.ReplaceText(funcDecl->getLocation(), funcName.length(),
>>> "myreturn");
>>>
>>> This code is excecuted but the change is not visible in the generated
>>> assembler file.
>>>
>>> Any idea what I am doing wrong?
>>>
>>> Thanks
>>>
>>> Marcel
>>>
>>> <---snippet--->
>>>
>>> Rewriter    TheRewriter;
>>>
>>> namespace {
>>>
>>>      class MyVisitor : public RecursiveASTVisitor<MyVisitor> {
>>>      private:
>>>          ASTContext *astContext;
>>>
>>>      public:
>>>          explicit MyVisitor(CompilerInstance *CI) :
>>> m_diag(CI->getDiagnostics()),
>>>              astContext(&(CI->getASTContext()))
>>>          {
>>> TheRewriter.setSourceMgr(astContext->getSourceManager(),
>>> astContext->getLangOpts());
>>>          }
>>>
>>>          bool VisitFunctionDecl(const FunctionDecl *funcDecl) {
>>>              string funcName =
>>> funcDecl->getNameInfo().getName().getAsString();
>>>              if (funcName == "return_fourtytwo") {
>>> TheRewriter.ReplaceText(funcDecl->getLocation(), funcName.length(),
>>> "myreturn");
>>>                  errs() << "Rewrote function def: " << funcName <<
>> "\n";
>>>              }
>>>
>>>      private:
>>>          DiagnosticsEngine &m_diag;
>>>      };
>>>
>>>      class FuncDeclConsumer : public ASTConsumer {
>>>      public:
>>>          explicit FuncDeclConsumer(CompilerInstance *CI)
>>>              : m_visitor(MyVisitor(CI)) {}
>>>
>>>          // Called by the parser for each top-level declaration group.
>>>          // Returns true to continue parsing, or false to abort
>> parsing.
>>>          virtual bool HandleTopLevelDecl(DeclGroupRef dg) override {
>>>              for (Decl *decl : dg) {
>>>                  m_visitor.TraverseDecl(decl);
>>>              }
>>>              return true;
>>>          }
>>>
>>>      private:
>>>          MyVisitor m_visitor;
>>>      };
>>>
>>>      class MyInstrumentation : public PluginASTAction {
>>>      protected:
>>>          std::unique_ptr<ASTConsumer>
>>> CreateASTConsumer(CompilerInstance &ci,
>>>              llvm::StringRef) override {
>>>              return llvm::make_unique<FuncDeclConsumer>(&ci);
>>>          }
>>>
>>>          PluginASTAction::ActionType getActionType() override {
>>>              return AddAfterMainAction;
>>>          }
>>>      };
>>> } // end namespace
>>>
>>> static FrontendPluginRegistry::Add<MyInstrumentation>
>>> X("check-parameter-names", "check for parameter names mismatch");
>>>
>>> _______________________________________________
>>> cfe-dev mailing list
>>> cfe-dev at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev




More information about the cfe-dev mailing list