Hello, I am currently working with PPC64 JIT support for LLVM. So far I could make function calls work by adding function descriptors in 'lib/Target/PowerPC/PPCJITInfo.h' and adding a virtual method at 'LLVM::TargetJITInfo' that is called within 'JITEmitter::finishFunction' just after 'sys::Memory::InvalidateInstructionCache' to update the Global Mapping with function descriptor instead of the function address. The JIT function descriptor is loaded correctly in 'JIT::runFunction', instead of assuming the JIT function code is an ODP. Now I'm trying to make the relocation work properly. Using the testcase '2003-01-04-ArgumentBug' the assembly generated for main functions is the following: .L.main: # BB#0: mflr 0 std 0, 16(1) stdu 1, -112(1) lis 3, .LCPI1_0 at ha li 4, 1 lfs 1, .LCPI1_0 at l(3) li 3, 0 bl foo nop addi 1, 1, 112 ld 0, 16(1) mtlr 0 blr Which is correct, however for the JIT one generated in memory the relocations generate some issues. First the 'lis 3, .LCPI1_0 at ha' can possible overflow which will generate an wrong relocation. Since the const data will be place just before the function code in JIT generation, my first approach was to point the functions descriptor TOC to the JIT function base, so the 'lis' relocation could be rewritten as 'addis 3,2,.LCPI1 at TOC@ha'. And there where I could use some help: is it the best approach? Where is the best place to make this kind of analysis? Is there another way to make code adjustments for JIT? At fist I though to put the logic at 'lib/Target/PowerPC/PPCJITInfo.cpp', but from what I could understand the 'relocate' function method is indeed just to operate on the relocation addresses, not to change the upcode. Any advices/tips/suggestion would be appreciated. -- Adhemerval Zanella Netto Software Engineer Linux Technology Center Brazil Toolchain / GLIBC on Power Architecture azanella at linux.vnet.ibm.com / azanella at br.ibm.com +55 61 8642-9890
Hi Adhemerval Zanella, the old JIT infrastructure is going away, to be replaced by "MC-JIT" (try passing -use-mcjit to lli). It sounds like you are working on the old JIT, so I suggest you work instead on getting MC-JIT working on powerpc. Ciao, Duncan.> I am currently working with PPC64 JIT support for LLVM. So far I could make function calls > work by adding function descriptors in 'lib/Target/PowerPC/PPCJITInfo.h' and adding a > virtual method at 'LLVM::TargetJITInfo' that is called within 'JITEmitter::finishFunction' > just after 'sys::Memory::InvalidateInstructionCache' to update the Global Mapping with > function descriptor instead of the function address. The JIT function descriptor is > loaded correctly in 'JIT::runFunction', instead of assuming the JIT function code is > an ODP. > > Now I'm trying to make the relocation work properly. Using the testcase '2003-01-04-ArgumentBug' > the assembly generated for main functions is the following: > > .L.main: > # BB#0: > mflr 0 > std 0, 16(1) > stdu 1, -112(1) > lis 3, .LCPI1_0 at ha > li 4, 1 > lfs 1, .LCPI1_0 at l(3) > li 3, 0 > bl foo > nop > addi 1, 1, 112 > ld 0, 16(1) > mtlr 0 > blr > > Which is correct, however for the JIT one generated in memory the relocations generate some issues. > > First the 'lis 3, .LCPI1_0 at ha' can possible overflow which will generate an wrong relocation. > Since the const data will be place just before the function code in JIT generation, my first > approach was to point the functions descriptor TOC to the JIT function base, so the 'lis' relocation > could be rewritten as 'addis 3,2,.LCPI1 at TOC@ha'. > > And there where I could use some help: is it the best approach? Where is the best place to make this > kind of analysis? Is there another way to make code adjustments for JIT? > > At fist I though to put the logic at 'lib/Target/PowerPC/PPCJITInfo.cpp', but from what I could > understand the 'relocate' function method is indeed just to operate on the relocation > addresses, not to change the upcode. > > Any advices/tips/suggestion would be appreciated. >
On Fri, 2012-07-20 at 08:36 +0200, Duncan Sands wrote:> Hi Adhemerval Zanella, the old JIT infrastructure is going away, to be replaced > by "MC-JIT" (try passing -use-mcjit to lli). It sounds like you are working on > the old JIT, so I suggest you work instead on getting MC-JIT working on powerpc.Hi Duncan, Thanks for the pointers. We hadn't stumbled across the MC-JIT refs in our digging so far. (LLVM GettingStarted.html doesn't mention it, and (FIXME: T.B.D.) under llvm/lib/mc, so I suppose the MC jit is fairly recent?) Are we safe to assume the old JIT infrastructure will be completely replaced, or are there likely to be 'users' that may still need functionality? I imagine since the old jit is where Adhemerval was focused, the build/test steps must still be referencing it. Thanks, -Will> > Ciao, Duncan. > > I am currently working with PPC64 JIT support for LLVM. So far I could make function calls > > work by adding function descriptors in 'lib/Target/PowerPC/PPCJITInfo.h' and adding a > > virtual method at 'LLVM::TargetJITInfo' that is called within 'JITEmitter::finishFunction' > > just after 'sys::Memory::InvalidateInstructionCache' to update the Global Mapping with > > function descriptor instead of the function address. The JIT function descriptor is > > loaded correctly in 'JIT::runFunction', instead of assuming the JIT function code is > > an ODP. > > > > Now I'm trying to make the relocation work properly. Using the testcase '2003-01-04-ArgumentBug' > > the assembly generated for main functions is the following: > > > > .L.main: > > # BB#0: > > mflr 0 > > std 0, 16(1) > > stdu 1, -112(1) > > lis 3, .LCPI1_0 at ha > > li 4, 1 > > lfs 1, .LCPI1_0 at l(3) > > li 3, 0 > > bl foo > > nop > > addi 1, 1, 112 > > ld 0, 16(1) > > mtlr 0 > > blr > > > > Which is correct, however for the JIT one generated in memory the relocations generate some issues. > > > > First the 'lis 3, .LCPI1_0 at ha' can possible overflow which will generate an wrong relocation. > > Since the const data will be place just before the function code in JIT generation, my first > > approach was to point the functions descriptor TOC to the JIT function base, so the 'lis' relocation > > could be rewritten as 'addis 3,2,.LCPI1 at TOC@ha'. > > > > And there where I could use some help: is it the best approach? Where is the best place to make this > > kind of analysis? Is there another way to make code adjustments for JIT? > > > > At fist I though to put the logic at 'lib/Target/PowerPC/PPCJITInfo.cpp', but from what I could > > understand the 'relocate' function method is indeed just to operate on the relocation > > addresses, not to change the upcode. > > > > Any advices/tips/suggestion would be appreciated. > > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >