<div dir="ltr">I agree, I think you want to do the second thing, where we hook into the existing variable lookup mechanism and replace it with an immediate operand.</div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Mar 27, 2017 at 3:44 AM, Haroush, Matan <span dir="ltr"><<a href="mailto:matan.haroush@intel.com" target="_blank">matan.haroush@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="blue" vlink="purple">
<div class="m_8612784699958933591WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">ping<u></u><u></u></span></p>
<p class="MsoNormal"><a name="m_8612784699958933591__MailEndCompose"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></a></p>
<div>
<div style="border:none;border-top:solid #e1e1e1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Haroush, Matan
<br>
<b>Sent:</b> Tuesday, March 21, 2017 11:02<br>
<b>To:</b> Reid Kleckner <<a href="mailto:rnk@google.com" target="_blank">rnk@google.com</a>><br>
<b>Cc:</b> <a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<b>Subject:</b> RE: [cfe-dev] [CLANG][X86][inline-asm]Clang support for inline assembly MS style<u></u><u></u></span></p>
</div>
</div><div><div class="h5">
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">After further investigation we have 2 viable locations to be considered for the final design as described below,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">I’d would like to bring this up for debate, any insight you may have to offer regarding the recommended approach would be appreciated.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph"><u></u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><span>1.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><u></u><span dir="LTR"></span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Handle before
<i>buildMSAsmString</i> takes the <i>AsmTokens</i> vector (the tokens are parsed by clang fe,
<i>buildMSAsmString</i> is called to create the string buffer on which the <i>AsmParser</i> is called).
<u></u><u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">In this approach we can iterate over
<i>AsmTokens</i>, look up each identifier token and replace tokens which refer to
<i>ConstEnumDecl</i> with their constant value.<u></u><u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:72.0pt">
<u></u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><span>a.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><u></u><span dir="LTR"></span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">This is target independent.<u></u><u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:72.0pt">
<u></u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><span>b.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><u></u><span dir="LTR"></span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Handling is similar handle to macro constants.<u></u><u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:72.0pt">
<u></u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><span>c.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><u></u><span dir="LTR"></span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">We can reuse
<i>ParseMSAsmIdentifier</i><u></u><u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:144.0pt">
<u></u><span style="font-size:11.0pt;font-family:Symbol;color:#1f497d"><span>·<span style="font:7.0pt "Times New Roman"">        
</span></span></span><u></u><span dir="LTR"></span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">We also effectively parse the assembly string twice, thus we need to ignore any possible duplicate diagnostics (i.e. turn off
 temporarily).<u></u><u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:144.0pt">
<u></u><span style="font-size:11.0pt;font-family:Symbol;color:#1f497d"><span>·<span style="font:7.0pt "Times New Roman"">        
</span></span></span><u></u><span dir="LTR"></span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">This solution was able to pass lit tests.<u></u><u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:72.0pt">
<u></u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><span>d.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><u></u><span dir="LTR"></span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">However this forces us to check each and every identifier in
<i>AsmToks</i> vector, since clang does not know how to differentiate operands from instructions or any other identifier tokens.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph"><u></u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><span>2.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><u></u><span dir="LTR"></span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Handle in X86AsmParser - when the target parser iterates over each of the instructions in the asm string and construct the IR
 inline asm string.<u></u><u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:72.0pt">
<u></u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><span>a.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><u></u><span dir="LTR"></span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">This is target dependent<u></u><u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:72.0pt">
<u></u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><span>b.<span style="font:7.0pt "Times New Roman"">     
</span></span></span><u></u><span dir="LTR"></span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Handling is similar to variable operands, we can exercise one of two options:<u></u><u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:108.0pt">
<u></u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><span><span style="font:7.0pt "Times New Roman"">                              <wbr>                              <wbr>  
</span>i.<span style="font:7.0pt "Times New Roman"">      </span></span></span><u></u><span dir="LTR"></span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Adding an input attribute to the IR string (i32 <const_val>) paired
 with replacing the identifier with $<reference_number>  similarly to how GCC extended asm works.<u></u><u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:108.0pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">GCC extended asm In ATT dialect is transformed as follows:<u></u><u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:108.0pt"><i><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">asm("movl %0 + 1*3,%%eax" : :"i"(A)) ---- > call void asm sideeffect "movl $0 + 1*3,%eax", "i,~{dirflag},~{fpsr},~{flags}<wbr>"(i32
 12)….” // where A is an enum constant with val =12<u></u><u></u></span></i></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:108.0pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:108.0pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">For MS style inline asm we would want to generate:
<u></u><u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:108.0pt"><i><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">asm("mov eax ,A + 1*3") ---- > call void asm sideeffect inteldialect " mov eax ,$0 + 1*3 ", "i,~{dirflag},~{fpsr},~{flags}<wbr>"(i32
 12)….”<u></u><u></u></span></i></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:108.0pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:108.0pt">
<u></u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><span><span style="font:7.0pt "Times New Roman"">                              <wbr>                              
</span>ii.<span style="font:7.0pt "Times New Roman"">      </span></span></span><u></u><span dir="LTR"></span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Using the AsmRewrite mechanism to replace the identifier directly
 w/o folding the expression.<u></u><u></u></span></p>
<p class="MsoNormal" style="margin-left:72.0pt;text-indent:36.0pt"><i><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">asm("mov eax ,A + 1*3") ---- > call void asm sideeffect inteldialect " mov eax ,$12 + 1*3 ", "~{dirflag},~{fpsr},~{flags}"…<wbr>.”<u></u><u></u></span></i></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:108.0pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:108.0pt"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="m_8612784699958933591MsoListParagraph" style="margin-left:72.0pt">
<u></u><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><span>c.<span style="font:7.0pt "Times New Roman"">      
</span></span></span><u></u><span dir="LTR"></span><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Normally the second pass of the X86AsmParser compress any remaining arithmetic expressions into a canonical form resulting in
 a legal instruction.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">From my perspective it seems that the second option is slightly more natural despite being target specific, since it seems like the general design behaves in
 a similar fashion.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">Feel free to contact me if any clarification is needed.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d">since this is where identifiers for variables are resolved and transformed.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1f497d"><u></u> <u></u></span></p>
<p class="MsoNormal"><a name="m_8612784699958933591______replyseparator"></a><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Reid Kleckner [<a href="mailto:rnk@google.com" target="_blank">mailto:rnk@google.com</a>]
<br>
<b>Sent:</b> Wednesday, December 07, 2016 19:03<br>
<b>To:</b> Haroush, Matan <<a href="mailto:matan.haroush@intel.com" target="_blank">matan.haroush@intel.com</a>><br>
<b>Cc:</b> <a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<b>Subject:</b> Re: [cfe-dev] [CLANG][X86][inline-asm]Clang support for inline assembly MS style<u></u><u></u></span></p>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">We should probably rewrite enums in the frontend into integer constants. I guess the fix would live in buildMSAsmString.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">2016-12-05 7:38 GMT-08:00 Haroush, Matan via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>>:<u></u><u></u></p>
<blockquote style="border:none;border-left:solid #cccccc 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5.0pt">
<div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Hey
<u></u><u></u></p>
<p class="MsoNormal">I’m working on adding support for inline asm to LLVM.org.<u></u><u></u></p>
<p class="MsoNormal">I am trying to determine what is the best place to insert code to enable use of enumerated constants<u></u><u></u></p>
<p class="MsoNormal">when using Microsoft style inline asm in a similar fashion to the way macros are used.<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">EXAMPLE:<u></u><u></u></p>
<p class="MsoNormal">##############################<wbr>##############################<wbr>##############################<wbr>##############<u></u><u></u></p>
<p class="MsoNormal">C code:<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">int test_inline_asm_enum() {<u></u><u></u></p>
<p class="MsoNormal">    enum { A = 12, B};                        // can also be declared globally<u></u><u></u></p>
<p class="MsoNormal">                __asm mov ax, A<u></u><u></u></p>
<p class="MsoNormal">    return B;<u></u><u></u></p>
<p class="MsoNormal">}<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Generated LLVM IR:<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">define i32 @test_inline_asm_enum() #0 {<u></u><u></u></p>
<p class="MsoNormal">entry: 
<u></u><u></u></p>
<p class="MsoNormal">call void asm sideeffect inteldialect                                                        <wbr>                  \<u></u><u></u></p>
<p class="MsoNormal">"mov ax,
<b>qword ptr </b>A",   "~{dirflag},~{fpsr},~{<wbr>flags}"() #1, !srcloc !1           <u></u>
<u></u></p>
<p class="MsoNormal">ret i32 13<u></u><u></u></p>
<p class="MsoNormal">}<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">COMPILE LINE:<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Clang -cc1 -fasm-blocks -O0 -emit-llvm <codefile.c> -o -<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">* without –emit-llvm flag the compiler will crash as it tries to handles A like a variable.<u></u><u></u></p>
<p class="MsoNormal">** note the absence of an allocation of A before the function call, this is because enums are
<u></u><u></u></p>
<p class="MsoNormal">not emitted to IR but treated as integer constants.<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">##############################<wbr>##############################<wbr>##############################<wbr>##############<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">After some investigation I narrowed the scope to two locations in clang which are reasonable candidates:<u></u><u></u></p>
<p class="m_8612784699958933591m-915247507686494msolistparagraph">1.<span style="font-size:7.0pt">      
</span>buildMsAsmString – where macros are handled<u></u><u></u></p>
<p class="m_8612784699958933591m-915247507686494msolistparagraph">2.<span style="font-size:7.0pt">      
</span>asmParser/X86 AsmParser which handles the assembly semantics and emits the IR.<u></u><u></u></p>
<p class="m_8612784699958933591m-915247507686494msolistparagraph"> <u></u><u></u></p>
<p class="MsoNormal">My main issue though is to determine if the token/identifier belongs to an EnumConstDecl/Expr.<u></u><u></u></p>
<p class="MsoNormal">I’ve noticed the code in this area uses a lookup method which is called via parser->semaCallback.<u></u><u></u></p>
<p class="MsoNormal">However I don’t really understand yet how to create an instance of such a handler in order to lookup<u></u><u></u></p>
<p class="MsoNormal">previously declared labels(particularly EnumConstantDecls).<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">I was hoping that someone may have some insight to share regarding the problem or on lookup usage in general.<u></u><u></u></p>
<p class="MsoNormal">Please let me know if you need any clarifications and feel free to contact me via mail.<u></u><u></u></p>
<p class="MsoNormal">Thanks,<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Matan Haroush<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<p>------------------------------<wbr>------------------------------<wbr>---------<br>
Intel Israel (74) Limited<u></u><u></u></p>
<p>This e-mail and any attachments may contain confidential material for<br>
the sole use of the intended recipient(s). Any review or distribution<br>
by others is strictly prohibited. If you are not the intended<br>
recipient, please contact the sender and delete all copies.<u></u><u></u></p>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
______________________________<wbr>_________________<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" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a><u></u><u></u></p>
</blockquote>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div></div></div><div><div class="h5">
<p>------------------------------<wbr>------------------------------<wbr>---------<br>
Intel Israel (74) Limited</p>

<p>This e-mail and any attachments may contain confidential material for<br>
the sole use of the intended recipient(s). Any review or distribution<br>
by others is strictly prohibited. If you are not the intended<br>
recipient, please contact the sender and delete all copies.</p></div></div></div>

</blockquote></div><br></div>