<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Dear Dr. Northover,</div><div><br></div><div></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
You've still got to access that symbol, and it's not obvious how a<br>
block that's moving around in memory could do that. The same arguments<br>
that it can't use %rip relative addressing for a local BB would seem<br>
to apply to any other entity.<br>
</blockquote><div><br></div><div>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. <br></div><div><br></div><div>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. <br></div><div><br></div><div>So far I have the first instruction working:</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
    movq func@GOTPCREL(%rip), %rax<br></blockquote><div><div><br></div><div>const Module *M = MF.getMMI().getModule();<br>/* movq func@GOTPCREL(%rip), %rax */<br>BuildMI(MBB, MBIt, DL, TII->get(X86::MOV64rm))<br>                      .addReg(X86::RAX)         //dest<br>                      .addReg(X86::RIP)         //base<br>                      .addImm(0x1)              //scale<br>                      .addReg(0x0)              //index<br>                      .addGlobalAddress(M->getNamedValue(MF.getName())) //Disp<br>                      .addReg(0x0);             //seg</div></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
    addq (.LBB0_0-func), %rax</blockquote><div> </div><div> /* addq (.LBB0_0-func), %rax ???? */<br>BuildMI(MBB, MBIt, DL, TII->get(X86::ADD64ri32))<br>                      .addReg(X86:RAX)          //destination<br>                      .addReg(X86::RAX)         //base<br>                      .addImm(0x1)              //scale<br>                      .addReg(0x0)              //index<br></div><div>                   .addImm(<<<< I assume expression is related to displacement and goes here >>>>>>>)<br></div><div>                      .addReg(0x0);             //segment<br></div><div><br></div><div>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.<br></div><div>$ llvm-mc -show-inst asm.s</div><div>foo:</div><div>.LBB0_0:<br>    movq    2099957(%rip), %rax     # <MCInst #1810 MOV64rm<br>                                        #  <MCOperand Reg:35><br>                                        #  <MCOperand Reg:41><br>                                        #  <MCOperand Imm:1><br>                                        #  <MCOperand Reg:0><br>                                        #  <MCOperand Imm:2099957><br>                                        #  <MCOperand Reg:0>><br>    addq   (.LBB0_0  - foo) , %rax          # <MCInst #202 ADD64rm<br>                                        #  <MCOperand Reg:35><br>                                        #  <MCOperand Reg:35><br>                                        #  <MCOperand Reg:0><br>                                        #  <MCOperand Imm:1><br>                                        #  <MCOperand Reg:0><br>                                        #  <MCOperand Expr:(.LBB0_0-foo)><br>                                        #  <MCOperand Reg:0>><br>    retq                            # <MCInst #2601 RETQ><br><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
> 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)??<br>
If you go that route you can probably add entries to the<br>
MachineConstantPool with a MachineModule pass. The same addressing<br>
concerns seem to apply though.<br></blockquote><div><br></div><div>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. :)</div><div>Thanks again for your reply!</div><div><br></div>Sincerely,</div><div class="gmail_quote"><br></div><div class="gmail_quote">K Jelesnianski<br></div></div></div></div></div></div></div></div>