[llvm-dev] Quick question: How to BuildMI mov64mi32 arbitrary MMB address to memory
K Jelesnianski via llvm-dev
llvm-dev at lists.llvm.org
Mon Sep 24 16:28:43 PDT 2018
Dear Dr. Northover,
You've still got to access that symbol, and it's not obvious how a
> block that's moving around in memory could do that. The same arguments
> that it can't use %rip relative addressing for a local BB would seem
> to apply to any other entity.
>
Agreed, for now I will probably perform need to perform load-time analysis,
grab some info, and patch the binary to get around this. I have gone ahead
and begun implementing your proposed work around.
My question now is how would you create the BuildMI for the second assembly
instr (addq (LBB0_0 - func), %rax) you proposed? I know I can get the
global address of the MF we are currently in with
.addGlobalAddress(M->getNamedValue(MF.getName())) but how do we take that
and make an expression out of it. I am not sure the MBB object gives us any
way to get its address and perform the given subtraction expression of
LBB0_0 - func.
So far I have the first instruction working:
movq func at GOTPCREL(%rip), %rax
>
const Module *M = MF.getMMI().getModule();
/* movq func at GOTPCREL(%rip), %rax */
BuildMI(MBB, MBIt, DL, TII->get(X86::MOV64rm))
.addReg(X86::RAX) //dest
.addReg(X86::RIP) //base
.addImm(0x1) //scale
.addReg(0x0) //index
.addGlobalAddress(M->getNamedValue(MF.getName()))
//Disp
.addReg(0x0); //seg
> addq (.LBB0_0-func), %rax
/* addq (.LBB0_0-func), %rax ???? */
BuildMI(MBB, MBIt, DL, TII->get(X86::ADD64ri32))
.addReg(X86:RAX) //destination
.addReg(X86::RAX) //base
.addImm(0x1) //scale
.addReg(0x0) //index
.addImm(<<<< I assume expression is related to
displacement and goes here >>>>>>>)
.addReg(0x0); //segment
If I try to put a simple asm.s into llvm-mc -show-inst, it tells me to use
MCExpr, but I am not sure that is correct (shown below). There does exist
.addExpr but it only valid for MCInstBuilder, not
MachineInstrBuilder::BuildMI.
$ llvm-mc -show-inst asm.s
foo:
.LBB0_0:
movq 2099957(%rip), %rax # <MCInst #1810 MOV64rm
# <MCOperand Reg:35>
# <MCOperand Reg:41>
# <MCOperand Imm:1>
# <MCOperand Reg:0>
# <MCOperand Imm:2099957>
# <MCOperand Reg:0>>
addq (.LBB0_0 - foo) , %rax # <MCInst #202 ADD64rm
# <MCOperand Reg:35>
# <MCOperand Reg:35>
# <MCOperand Reg:0>
# <MCOperand Imm:1>
# <MCOperand Reg:0>
# <MCOperand Expr:(.LBB0_0-foo)>
# <MCOperand Reg:0>>
retq # <MCInst #2601 RETQ>
> Do I need to make these symbols for the trampoline BBs as an IR opt pass,
> can I get away with it using a MachineModule Pass to add the trampolines
> per module (file) (so far I have only created BasicBlock,
> MachineBasicBlock, and MachineFunction passes)??
> If you go that route you can probably add entries to the
> MachineConstantPool with a MachineModule pass. The same addressing
> concerns seem to apply though.
>
I actually forgot about this constraint, we already have experienced some
unintended side-effects when attempting to reference .rodata information
(e.g. printf printing garbage). So that is something to look fix in the
near future once this part is done. :)
Thanks again for your reply!
Sincerely,
K Jelesnianski
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20180924/48694343/attachment.html>
More information about the llvm-dev
mailing list