<div dir="ltr">The <span style="text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">SUB32ri can't instruction can't operate on segment registers. It operates on EAX/EBX/EDX/ECX/EBP, etc. When it gets encoded only 3 or 4 bits of the register value make it into the binary encoding. Objdump just extracts those 3 or 4 bits back out and prints one of the EAX/EBX/EDX/ECX/EBP registers that those bits correspond to.</span><div><br clear="all"><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Sat, Jun 23, 2018 at 5:28 PM K Jelesnianski via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Dear All,<br>
<br>
Currently I am trying to inject custom x86-64 assembly into a<br>
functions entry basic block. More specifically, I am trying to build<br>
assembly in a machine function pass from scratch.<br>
<br>
While the dumped machine function instruction info displays that %gs<br>
will be used, when I perform objdump -d on my executable I am see that<br>
%gs is replaced by %ebp? Why is this happening?<br>
<br>
I know it probably has something to do with me not specifying operands<br>
properly, but I cannot find enough documentation on this besides<br>
looking through code comments such as X86BaseInfo.cpp. I feel there<br>
isn't enough for me to be able to connect the dots.<br>
<br>
Below I have sample code: %gs holds a base address to a memory<br>
location where I am trying to store information. I am trying to update<br>
the %gs register pointer location before saving more values, etc.<br>
<br>
LLVM C++ codeMachine Function pass code:<br>
MachineInstrBuilder sss = BuildMI(MBB, MBB.begin(), DL,<br>
TII->get(X86::SUB32ri),X86::GS)<br>
                    .addReg(X86::GS)<br>
                    .addImm(0x8);<br>
<br>
machine function pass dump:<br>
 %gs = SUB32ri %gs, 8, implicit-def %eflags<br>
<br>
Objdump -d assembly from executable<br>
  400510:   81 ed 04 00 00 00       sub    $0x8,%ebp<br>
<br>
<br>
TLDR: I am trying to create custom assembly via BuildMI() and manipulate segment<br>
registers via a MachineFunctionPass.<br>
<br>
I have looked at LLVMs safestack implementation, but they are taking a<br>
fairly complicated hybrid approach between an IR Function pass with<br>
Backend support. I would like to stay as a single machinefunction<br>
pass.<br>
<br>
Believe me I would do this at the IR level if I didnt need to<br>
specifically use the segment registers.<br>
<br>
Thanks for the help in advance!<br>
<br>
Sincerely,<br>
<br>
Christopher Jelesnianski<br>
Graduate Research Assistant<br>
Virginia Tech<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>