[cfe-dev] questions regarding using addPPCallbacks

Eric Liu via cfe-dev cfe-dev at lists.llvm.org
Thu Dec 8 03:45:29 PST 2016


Did you #include "clang/Lex/Preprocessor.h"?

On Thu, Dec 8, 2016 at 12:44 PM Farzad Sadeghi <thabogre at gmail.com> wrote:

> using CI.getPreprocessor().addCallbacks(...) also gets me the same
> error. it says i'm accessing an incomplete type.
> I looked at clang-move. I'm using the exact same methods but im still
> having problems with forward declaration of Preprocessor. could this
> problem be cause by the fact that I'm putting everything in a cpp file
> and i have no header?
>
> On 12/8/16, Farzad Sadeghi <thabogre at gmail.com> wrote:
> > yes, InclusionDirective is implemented in PPInclusion.
> > ok, thank you.
> >
> > On 12/8/16, Eric Liu <ioeric at google.com> wrote:
> >> You could do: CI.getPreprocessor().addCallbacks(...) instead. BTW, have
> >> you
> >> implemented InclusionDirective in PPInclusion?
> >>
> >> This is how clang-move handles it:
> >>
> https://github.com/llvm-mirror/clang-tools-extra/blob/master/clang-move/ClangMove.cpp#L401
> >>
> >> On Thu, Dec 8, 2016 at 12:51 AM Farzad Sadeghi via cfe-dev <
> >> cfe-dev at lists.llvm.org> wrote:
> >>
> >>> Lets say I want to add a PP callback every time the PP runs into an
> >>> InclusionDirective.
> >>> going through the docs, I find that clang::PPCallbacks has the virtual
> >>> member functions for me implement to do just that. So far so good.
> >>> Now, how to tell the PP to use my callbacks?
> >>> I came across addPPCallbacks in clang::Preprocessor.
> >>> The code already has a class that derives from ASTConsumer to add and
> >>> run the matchers.
> >>> There is also a class that derives from ASTFrontendAction that is
> >>> passed to newFrontendActionFactory to create an instance of, to be
> >>> passed to a ClangTool instance to run the action.
> >>> Now the questions:
> >>> Do i need to cerate a new FrontendAction for the PPCallbacks? If yes,
> >>> then does that mean that the inputs get lexed and parsed twice?
> >>>
> >>> There is only one preprocessor instance used for each
> >>> frontendaction,right?
> >>> So i need to get a hold of that instance and add my PPCallbacks there.
> >>> I went through the docs again and found that I could do that with a
> >>> clang::CompilerInstace.
> >>> Now in my class that derives from ASTFrontendAction, I figured I'm
> >>> getting the CompilerInstance, so maybe i can get the preprocessor
> >>> there:
> >>>   std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
> >>> StringRef file) override
> >>> {
> >>>     Preprocessor &PP = CI.getPreprocessor();
> >>>     PP.addCallbacks(std::unique_ptr<PPCallback> PPInclusion)
> >>>
> >>>     TheRewriter.setSourceMgr(CI.getSourceManager(), CI.getLangOpts());
> >>>     return llvm::make_unique<MyASTConsumer>(TheRewriter);
> >>>  }
> >>>
> >>> PPInclusio is the class that derives from clang::PPCallbacks.
> >>> But the compiler tells me "error: member access into incomplete type"
> >>> which basically means that the Preprocessor i got from
> >>> CompilerInstance is a forward declaration.
> >>> How can I actually add a preprocessor callback then?
> >>>
> >>>
> >>> --
> >>> Farzad Sadeghi
> >>> _______________________________________________
> >>> cfe-dev mailing list
> >>> cfe-dev at lists.llvm.org
> >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
> >>>
> >>
> >
> >
> > --
> > Farzad Sadeghi
> >
>
>
> --
> Farzad Sadeghi
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20161208/9c3917b6/attachment.html>


More information about the cfe-dev mailing list