<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">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_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><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>
Please take a step back and explain what you're trying to do;
there's probably a better approach.<br>
<br>
-Eli<br>
<pre class="m_4919720555699682535moz-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>