<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"Segoe UI";
        panose-1:2 11 5 2 4 2 4 2 2 3;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal>I’m having difficulty adding PPCallbacks to the preprocessor.  Only the EndOfMainFile() callback is being invoked by Clang.  The others are not invoked.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I created a struct that derives from clang::PPCallbacks, and overrides MacroExpands(), MacroDefined(), FileChanged(), and EndOfMainFile() as follows:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>struct PPActions : public clang::PPCallbacks {<o:p></o:p></p><p class=MsoNormal>  static int nextSN; // Next serial number<o:p></o:p></p><p class=MsoNormal>  int sn;            // this s/n<o:p></o:p></p><p class=MsoNormal>  PPActions() { <o:p></o:p></p><p class=MsoNormal>    sn = nextSN++;<o:p></o:p></p><p class=MsoNormal>    std::cout << "Default PPActions C'tor - instance #" << sn << std::endl;<o:p></o:p></p><p class=MsoNormal>  }<o:p></o:p></p><p class=MsoNormal>  void MacroExpands(const Token &MacroNameTok, const MacroDefinition &MD, <o:p></o:p></p><p class=MsoNormal>                    SourceRange Range, const MacroArgs *Args) override {<o:p></o:p></p><p class=MsoNormal>    using std::cout; using std::endl;<o:p></o:p></p><p class=MsoNormal>    cout << "PPActions::MacroExpands() called!" << endl;<o:p></o:p></p><p class=MsoNormal>  }<o:p></o:p></p><p class=MsoNormal>  void MacroDefined(const Token &MacroNameTok, <o:p></o:p></p><p class=MsoNormal>                    const MacroDirective *MD) override {<o:p></o:p></p><p class=MsoNormal>    using std::cout; using std::endl;<o:p></o:p></p><p class=MsoNormal>    cout << "PPActions::MacroDefined() called" << endl;<o:p></o:p></p><p class=MsoNormal>  }<o:p></o:p></p><p class=MsoNormal>  void FileChanged(SourceLocation Loc, FileChangeReason Reason,<o:p></o:p></p><p class=MsoNormal>                    SrcMgr::CharacteristicKind FileType, FileID PrevFID) <o:p></o:p></p><p class=MsoNormal>                    override {<o:p></o:p></p><p class=MsoNormal>    using std::cout; using std::endl;<o:p></o:p></p><p class=MsoNormal>    cout << "PPActions::FileChanged() called" << endl;<o:p></o:p></p><p class=MsoNormal>  }<o:p></o:p></p><p class=MsoNormal>  // This is the only Callback actually being called.<o:p></o:p></p><p class=MsoNormal>  void EndOfMainFile()  override {<o:p></o:p></p><p class=MsoNormal>    using std::cout; using std::endl;<o:p></o:p></p><p class=MsoNormal>    cout << "PPActions::EndOfMainFile() called, instance #" << sn << endl;<o:p></o:p></p><p class=MsoNormal>  }<o:p></o:p></p><p class=MsoNormal>};<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I created a class derived from clang:: PreprocessorFrontendAction with the following ExecuteAction() function.<o:p></o:p></p><p class=MsoNormal>  void ExecuteAction() {<o:p></o:p></p><p class=MsoNormal>    using std::cout; using std::endl;<o:p></o:p></p><p class=MsoNormal>    cout << "ToolCppAction::ExecuteAction() called" << endl;<o:p></o:p></p><p class=MsoNormal>    if (compiler->hasPreprocessor()) {<o:p></o:p></p><p class=MsoNormal>      cout << "CompilerInstance has a preprocessor" << endl;<o:p></o:p></p><p class=MsoNormal>      Preprocessor& cpp = compiler->getPreprocessor();<o:p></o:p></p><p class=MsoNormal>      cout << "Installing PPCallbacks..." << endl;<o:p></o:p></p><p class=MsoNormal>      cpp.addPPCallbacks(std::make_unique<PPActions>() );<o:p></o:p></p><p class=MsoNormal>    }<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I’ve also tried installing the callbacks in the BeginSourceFileAction().  The output of that version shows two instances of the callback struct created, and the EndOfMainFile() of both being invoked (but none of the other callbacks).<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The problem I’m working involves code analysis on programs using a library whose API consists mostly of macros, so being able to examine macros and their arguments is extremely important.<o:p></o:p></p><p class=MsoNormal>Any help or insight into this issue would be appreciated.<o:p></o:p></p><p class=MsoNormal style='margin-top:7.5pt;background:white'><span style='font-size:9.5pt;font-family:"Segoe UI",sans-serif;color:#172B4D'>Best regards,<o:p></o:p></span></p><p class=MsoNormal style='margin-top:7.5pt;background:white'><b><span style='font-size:9.5pt;font-family:"Segoe UI",sans-serif;color:#172B4D'>David Hammer</span></b><b><span style='font-size:10.5pt;font-family:"Segoe UI",sans-serif;color:#172B4D'><br></span></b><span style='font-size:7.5pt;font-family:"Segoe UI",sans-serif;color:#172B4D'>Principal Developer I<br>O: 937.433.0477 ext. 140 | M: 937.520.2936 <o:p></o:p></span></p><p class=MsoNormal><span style='font-size:7.5pt'><img width=171 height=53 style='width:1.7812in;height:.552in' id="Picture_x0020_2" src="cid:image001.png@01D590B9.B249ACE0" alt=emailLogo><o:p></o:p></span></p><p class=MsoNormal style='background:white'><span style='font-size:7.5pt;font-family:"Times New Roman",serif;color:#222222'>CONFIDENTIALITY NOTICE: The information transmitted is intended only for the person or entity to which it is addressed and may contain company proprietary and/or privileged material. Any review, retransmission, dissemination or other use of, or taking of any action in reliance upon, this information by persons or entities other than the intended recipient is prohibited. If you received this in error, please contact the sender and destroy any copies of this document.</span><span style='font-size:7.5pt;font-family:"Arial",sans-serif;color:#222222'><o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>