<div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Tue, Oct 9, 2018 at 11:42 PM Friedman, Eli <<a href="mailto:efriedma@codeaurora.org">efriedma@codeaurora.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div text="#000000" bgcolor="#FFFFFF">
    <div class="m_-3403561980851300129moz-cite-prefix">On 10/9/2018 1:03 PM, Gleb Popov wrote:<br>
    </div>
    <blockquote type="cite">
      
      <div dir="ltr"><br>
        <br>
        <div class="gmail_quote">
          <div dir="ltr">On Tue, Oct 9, 2018 at 10:39 PM Friedman, Eli
            <<a href="mailto:efriedma@codeaurora.org" target="_blank">efriedma@codeaurora.org</a>>
            wrote:<br>
          </div>
          <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div text="#000000" bgcolor="#FFFFFF">
              <div class="m_-3403561980851300129m_4919720555699682535moz-cite-prefix">On
                10/9/2018 11:58 AM, Gleb Popov wrote:<br>
              </div>
              <blockquote type="cite">
                <div dir="ltr">
                  <div dir="ltr">
                    <div dir="ltr">
                      <div dir="ltr"><br>
                        <br>
                        <div class="gmail_quote">
                          <div dir="ltr">On Tue, Oct 9, 2018 at 9:39 PM
                            Friedman, Eli <<a href="mailto:efriedma@codeaurora.org" target="_blank">efriedma@codeaurora.org</a>>
                            wrote:<br>
                          </div>
                          <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On
                            10/9/2018 11:31 AM, Gleb Popov via llvm-dev
                            wrote:<br>
                            > Hello LLVM Devs.<br>
                            ><br>
                            > In my compiler I attach some arbitrary
                            data to functions by creating <br>
                            > BBs with inline assembly. However,
                            these blocks are "unused" from LLVM <br>
                            > point of view and get erased from the
                            function.<br>
                            ><br>
                            > To counter that I started adding checks
                            for conditions that are <br>
                            > guaranteed to be true or false. I ended
                            up with calling <br>
                            > @llvm.returnaddress(i32 0) intrinsic
                            and comparing the result with 0. <br>
                            > It worked well until in one function I
                            had two such calls and SROA <br>
                            > replaced one of checks with constant 1
                            and erased the BB.<br>
                            ><br>
                            > I should probably stop trying to fool
                            LLVM and "do it right", but <br>
                            > don't have any idea how. Note that I
                            can't use global variables for a <br>
                            > reason, so the data has to be encoded
                            in a BB using inline assembly. <br>
                            > All I need is just prevent
                            optimizations from erasing it.<br>
                            <br>
                            A reachable inline asm won't be erased if
                            LLVM thinks it has some <br>
                            side-effect.  The simplest way to do this is
                            the "sideeffect" marking <br>
                            (in C++, it's a parameter to
                            InlineAsm::get()).  See <br>
                            <a href="http://llvm.org/docs/LangRef.html#inline-assembler-expressions" rel="noreferrer" target="_blank">http://llvm.org/docs/LangRef.html#inline-assembler-expressions</a>
                            .<br>
                          </blockquote>
                          <div><br>
                          </div>
                          <div>The problem is exactly reachability. Here
                            is a simple example:</div>
                          <div><br>
                          </div>
                          <div>define void @foo() {<br>
                            entry:</div>
                          <div>  ...</div>
                          <div>  ret void</div>
                          <div>data:</div>
                          <div>  call void asm sideeffect inteldialect
                            ".byte 0xB2",
                            "~{dirflag},~{fpsr},~{flags}"()</div>
                          <div>  call void asm sideeffect inteldialect
                            ".byte 0xB9",
                            "~{dirflag},~{fpsr},~{flags}"()</div>
                          <div>  ...<br>
                          </div>
                          <div>}</div>
                          <div><br>
                          </div>
                          <div>To make "data" reachable I change entry's
                            terminator to br %tobool, label %exit, label
                            %data, where %tobool is a result of icmp eq
                            that is always true. However, I can't come
                            up with such a condition that didn't get
                            erased by SROA.</div>
                        </div>
                      </div>
                    </div>
                  </div>
                </div>
              </blockquote>
              <br>
              Even if you manage to trick LLVM into emitting the inline
              asm, it won't be in a predictable location in the emitted
              assembly; some LLVM transforms will rearrange the code in
              a function.<br>
            </div>
          </blockquote>
          <div><br>
          </div>
          <div>Won't @llvm.returnaddress() always get me correct
            location of my inline asm block?</div>
        </div>
      </div>
    </blockquote>
    <br>
    I'm very confused... how could you possibly use @llvm.returnaddress
    to return the address of a block of code that's never executed?<br></div></blockquote><div><br></div><div>Sorry, it is a typo. I meant blockaddress constant, not @llvm.returnaddress intrinsic.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div text="#000000" bgcolor="#FFFFFF">
    <br>
    -Eli<br>
    <pre class="m_-3403561980851300129moz-signature" cols="72">-- 
Employee of Qualcomm Innovation Center, Inc.
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project</pre>
  </div>

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