<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Oct 28, 2014 at 1:55 PM, Rinaldini Julien <span dir="ltr"><<a href="mailto:julien.rinaldini@heig-vd.ch" target="_blank">julien.rinaldini@heig-vd.ch</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Hi,<br>
<br>
<br>
I'm still having problems implementing my custom inserter in the X86 backend.<br>
<br>
I found a solution to my last problem (<a href="http://lists.cs.uiuc.edu/pipermail/llvmdev/2014-October/078296.html" target="_blank">http://lists.cs.uiuc.edu/pipermail/llvmdev/2014-October/078296.html</a>), by using a virtual register.<br>
<br>
<br>
The binary works when it's compiled in -O0, but not in -O1,-O2,...<br>
<br>
I really can't figure what I'm doing wrong... Any idea?<br>
<br>
<br>
Here is the code of my custom inserter... The goal of this code is to erase the stack in the epilogue of a function:<br>
<br>
MachineBasicBlock *<br>
X86TargetLowering::EmitBURNSTACKWithCustomInserter(<br>
MachineInstr *MI,<br>
MachineBasicBlock *MBB) const {<br>
MBB->getParent()->dump();<br>
DebugLoc db = MI->getDebugLoc();<br>
const TargetInstrInfo *TII = getTargetMachine().getInstrInfo();<br>
const BasicBlock *LLVM_BB = MBB->getBasicBlock();<br>
MachineFunction *F = MBB->getParent();<br>
// Create all the basicblocks<br>
MachineBasicBlock *MBB_cond = F->CreateMachineBasicBlock(LLVM_BB);<br>
MachineBasicBlock *MBB_erase = F->CreateMachineBasicBlock(LLVM_BB);<br>
MachineBasicBlock *MBB_end = F->CreateMachineBasicBlock(LLVM_BB);<br>
// Insert the new basicblocks<br>
F->insert(MBB, MBB_cond);<br>
F->insert(MBB, MBB_erase);<br>
F->insert(MBB, MBB_end);<br>
// Split the last MBB in two<br>
MBB_end->splice(MBB_end->begin(), MBB, next(MachineBasicBlock::iterator(MI)), MBB->end());<br>
MBB_end->transferSuccessorsAndUpdatePHIs(MBB);<br>
// Move MBB at the right place<br>
MBB_end->moveAfter(MBB);<br>
MBB_erase->moveAfter(MBB);<br>
MBB_cond->moveAfter(MBB);<br>
// Set the new successors<br>
MBB->addSuccessor(MBB_cond);<br>
MBB_erase->addSuccessor(MBB_cond);<br>
MBB_cond->addSuccessor(MBB_end);<br>
MBB_cond->addSuccessor(MBB_erase);<br>
MachineRegisterInfo &MRI = MBB->getParent()->getRegInfo();<br>
const TargetRegisterClass *AddrRegClass = getRegClassFor(MVT::i64);<br>
unsigned reg = MRI.createVirtualRegister(AddrRegClass);<br>
// Set the indice<br>
BuildMI(*MBB, MI, db, TII->get(X86::MOV64rr)).addReg(reg).addReg(X86::RSP);<br>
// Create the for loop condition<br>
BuildMI(*MBB_cond, MBB_cond->end(), db, TII->get(X86::CMP64rr)).addReg(reg).addReg(X86::RBP);<br>
BuildMI(*MBB_cond, MBB_cond->end(), db, TII->get(X86::JE_4)).addMBB(MBB_end);<br>
// Update phi node<br>
BuildMI(*MBB_erase, MBB_erase->end(), db, TII->get(X86::PHI), reg).addReg(reg).addMBB(MBB).addReg(reg).addMBB(MBB_erase);<br>
// Erase content of stack<br>
BuildMI(*MBB_erase, MBB_erase->end(), db, TII->get(X86::MOV32mi))<br>
.addReg(reg).addImm(1).addReg(0).addImm(0).addReg(0)<br>
.addImm(0);<br>
// Increment loop variable and jmp<br>
BuildMI(*MBB_erase, MBB_erase->end(), db, TII->get(X86::ADD64ri32), reg).addReg(reg).addImm(8);<br></blockquote><div><br></div><div><span style="font-family:arial,sans-serif;font-size:13px">It looks like this instruction is defining virtual register "reg" the second time.</span></div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
BuildMI(*MBB_erase, MBB_erase->end(), db, TII->get(X86::JMP_4)).addMBB(MBB_cond);<br>
// Erase intrinsic<br>
MI->eraseFromParent();<br>
MBB->getParent()->dump();<br>
return MBB_cond;<br>
}<br>
<br>
Here is the dump of the original function before my custom inserter (it's basically a main function with a printf and a return inside it):<br>
<br>
# Machine code for function main: SSA<br>
BB#0: derived from LLVM BB %entry<br>
ADJCALLSTACKDOWN64 0, %RSP<imp-def,dead>, %EFLAGS<imp-def,dead>, %RSP<imp-use><br>
%vreg2<def> = MOV32ri64 <ga:@str>; GR32:%vreg2<br>
%vreg3<def> = SUBREG_TO_REG 0, %vreg2<kill>, 4; GR64:%vreg3 GR32:%vreg2<br>
%RDI<def> = COPY %vreg3; GR64:%vreg3<br>
CALL64pcrel32 <ga:@puts>, <regmask>, %RSP<imp-use>, %RDI<imp-use>, %RSP<imp-def>, %EAX<imp-def><br>
ADJCALLSTACKUP64 0, 0, %RSP<imp-def,dead>, %EFLAGS<imp-def,dead>, %RSP<imp-use><br>
%vreg4<def> = COPY %EAX; GR32:%vreg4<br>
BURNSTACK %EFLAGS<imp-def,dead><br>
%vreg5<def> = MOV32r0 %EFLAGS<imp-def,dead>; GR32:%vreg5<br>
%EAX<def> = COPY %vreg5; GR32:%vreg5<br>
RETQ %EAX<br>
# End machine code for function main.<br>
<br>
<br>
Here is the dump after my custom inserter (with the stacktrace):<br>
<br>
# Machine code for function main: SSA<br>
BB#0: derived from LLVM BB %entry<br>
ADJCALLSTACKDOWN64 0, %RSP<imp-def,dead>, %EFLAGS<imp-def,dead>, %RSP<imp-use><br>
%vreg2<def> = MOV32ri64 <ga:@str>; GR32:%vreg2<br>
%vreg3<def> = SUBREG_TO_REG 0, %vreg2<kill>, 4; GR64:%vreg3 GR32:%vreg2<br>
%RDI<def> = COPY %vreg3; GR64:%vreg3<br>
CALL64pcrel32 <ga:@puts>, <regmask>, %RSP<imp-use>, %RDI<imp-use>, %RSP<imp-def>, %EAX<imp-def><br>
ADJCALLSTACKUP64 0, 0, %RSP<imp-def,dead>, %EFLAGS<imp-def,dead>, %RSP<imp-use><br>
%vreg4<def> = COPY %EAX; GR32:%vreg4<br>
MOV64rr %vreg6, %RSP; GR64:%vreg6<br>
Successors according to CFG: BB#1<br>
BB#1: derived from LLVM BB %entry<br>
Predecessors according to CFG: BB#0 BB#2<br>
CMP64rr %vreg6, %RBP, %EFLAGS<imp-def>; GR64:%vreg6<br>
JE_4 <BB#3>, %EFLAGS<imp-use><br>
Successors according to CFG: BB#3 BB#2<br>
BB#2: derived from LLVM BB %entry<br>
Predecessors according to CFG: BB#1<br>
%vreg6<def> = PHI %vreg6, <BB#0>, %vreg6, <BB#2>; GR64:%vreg6<br>
MOV32mi %vreg6, 1, %noreg, 0, %noreg, 0; GR64:%vreg6<br>
%vreg6<def,tied1> = ADD64ri32 %vreg6<tied0>, 8, %EFLAGS<imp-def>; GR64:%vreg6<br>
JMP_4 <BB#1><br>
Successors according to CFG: BB#1<br>
BB#3: derived from LLVM BB %entry<br>
Predecessors according to CFG: BB#1<br>
%vreg5<def> = MOV32r0 %EFLAGS<imp-def,dead>; GR32:%vreg5<br>
%EAX<def> = COPY %vreg5; GR32:%vreg5<br>
RETQ %EAX<br>
# End machine code for function main.<br>
clang: /home/pyknite/work/ollvm/obfuscator-llvm/lib/CodeGen/MachineRegisterInfo.cpp:305: llvm::MachineInstr *llvm::MachineRegisterInfo::getVRegDef(unsigned int) const: Assertion `(I.atEnd() || std::next(I) == def_instr_end()) && "getVRegDef assumes a single definition or no definition"' failed.<br>
0 clang 0x00000000027c3645 llvm::sys::PrintStackTrace(_IO_FILE*) + 37<br>
1 clang 0x00000000027c3e33<br>
2 libpthread.so.0 0x00007fba6de1b200<br>
3 libc.so.6 0x00007fba6cbcc967 gsignal + 55<br>
4 libc.so.6 0x00007fba6cbcdd3a abort + 362<br>
5 libc.so.6 0x00007fba6cbc58ad<br>
6 libc.so.6 0x00007fba6cbc5962<br>
7 clang 0x00000000021a6a06 llvm::MachineRegisterInfo::getVRegDef(unsigned int) const + 118<br>
8 clang 0x0000000002194ddc<br>
9 clang 0x0000000002191986<br>
10 clang 0x000000000218396c llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 124<br>
11 clang 0x00000000026f8f3b llvm::FPPassManager::runOnFunction(llvm::Function&) + 539<br>
12 clang 0x00000000026f91ab llvm::FPPassManager::runOnModule(llvm::Module&) + 43<br>
13 clang 0x00000000026f9727 llvm::legacy::PassManagerImpl::run(llvm::Module&) + 967<br>
14 clang 0x00000000008e461d clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::raw_ostream*) + 7293<br>
15 clang 0x00000000008e1b4a<br>
16 clang 0x0000000000ace263 clang::ParseAST(clang::Sema&, bool, bool) + 467<br>
17 clang 0x0000000000700cde clang::FrontendAction::Execute() + 62<br>
18 clang 0x00000000006d5e13 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 851<br>
19 clang 0x00000000006b7e60 clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 3104<br>
20 clang 0x00000000006aebe9 cc1_main(char const**, char const**, char const*, void*) + 665<br>
21 clang 0x00000000006b538a main + 8154<br>
22 libc.so.6 0x00007fba6cbb9040 __libc_start_main + 240<br>
23 clang 0x00000000006ae87d<br>
<br>
Cheers<br>
<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</blockquote></div><br></div></div>