<html 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=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<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:"American Typewriter";
        panose-1:2 9 6 4 2 0 4 2 3 4;}
@font-face
        {font-family:"Cousine for Powerline";
        panose-1:2 7 4 9 2 2 5 2 4 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
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;}
/* List Definitions */
@list l0
        {mso-list-id:603150939;
        mso-list-type:hybrid;
        mso-list-template-ids:-468183426 67698703 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style>
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">Greetings.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I’m building a source-to-source tool with clang. What I want to do is instrument stores made with the binary = operator. Currently, I’m running into problems with rewriting expressions that contain macro invocations. I’ve done some digging
 around, and I found some info  that helped with my understanding (e.g. <a href="https://stackoverflow.com/questions/24062989/clang-fails-replacing-a-statement-if-it-contains-a-macro">
https://stackoverflow.com/questions/24062989/clang-fails-replacing-a-statement-if-it-contains-a-macro</a>). But I’m still not sure how to solve this problem.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Concretely, suppose you have:<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">#define a(x) ((x) * 10 + 1)<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
<p class="MsoNormal" style="margin-left:.5in">class my_class {<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">    int x;<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
<p class="MsoNormal" style="margin-left:.5in">public:<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">    int my_function() {<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">        x = a(0);<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">        return x;<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">    }<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">};<o:p></o:p></p>
<p class="MsoNormal"><span style="font-family:"American Typewriter",serif"><o:p> </o:p></span></p>
<p class="MsoNormal">I want to rewrite this into something like this:<span style="font-size:10.0pt;font-family:"Cousine for Powerline";color:#F2F2F2">
<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:.5in">#ifndef _instrument_noclash<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">#define _instrument_noclash(name, expr, instance_no)                               \<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">    (*({                                                                                                                         \<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">        typeof(expr) *_t_instrument_no_clash##instance_no = &(expr);        \<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">        _t_instrument_no_clash##instance_no;                                                    \<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">        }))<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">#endif<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
<p class="MsoNormal" style="margin-left:.5in">#define a(x) ((x) * 10 + 1)<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
<p class="MsoNormal" style="margin-left:.5in">class my_class {<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">        int x;<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">public:<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">        int my_function() {<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">                _instrument_noclash("x",(this->x=((0) * 10 + 1)),0);<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">                return x;<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">        }<o:p></o:p></p>
<p class="MsoNormal" style="margin-left:.5in">};<o:p></o:p></p>
<p class="MsoNormal"><span style="font-family:"American Typewriter",serif"><o:p> </o:p></span></p>
<p class="MsoNormal">The problem (to me) is simple: <b>how do I determine the physical location of the ending of the expression on the right hand sign of the = operator?
</b>Without this knowledge, I end up overwriting the end of the statement. Scanning the APIs, it seems like there isn’t a simple way to do this. I’ve tried several ways to get the ending source location:<o:p></o:p></p>
<ol style="margin-top:0in" start="1" type="1">
<li class="MsoListParagraph" style="margin-left:0in;mso-list:l0 level1 lfo1">op->getEndLoc(), where op is an instance of BinaryOperator. This doesn’t work, because the ending location in the AST is not the same as the physical end location of the expression,
 due to macro expansion.<o:p></o:p></li><li class="MsoListParagraph" style="margin-left:0in;mso-list:l0 level1 lfo1">sm.getSpellingLoc(op->getEndLoc()), where sm is the source manager. This just returns op->getEndLoc().<o:p></o:p></li><li class="MsoListParagraph" style="margin-left:0in;mso-list:l0 level1 lfo1">sm.getExpansionLoc(op->getEndLoc()). This is close, but the location returned is the end of the macro name, so the macro arguments are not removed.<o:p></o:p></li></ol>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Any suggestions (or easier way to achieve this same goal) are appreciated.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-Max<o:p></o:p></p>
</div>
</body>
</html>