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@ha
li 4, 1
lfs 1, .LCPI1_0@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@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@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.