On Fri, 12 May 2006, Ralph Corderoy wrote:>> If you don't *know* that all (e.g.) function pointers to this code are >> dead (which means that execution could come back to the function), you >> should use the ExecutionEngine::recompileAndRelinkFunction(F) method. > > recompileAndRelinkFunction() overwrites the old machine code with a > branch to the new. Is it always guaranteed that there's space to write > the new branch instructions?Yes.> A quick look suggests the x86 takes five > bytes, PowerPC 16,PPC should be 4 bytes in the normal case. It is up to the backend to implement this API correctly... if it doesn't, that's a bug: please report it! -Chris -- http://nondot.org/sabre/ http://llvm.org/
Hi Chris,> On Fri, 12 May 2006, Ralph Corderoy wrote: > > recompileAndRelinkFunction() overwrites the old machine code with a > > branch to the new. Is it always guaranteed that there's space to > > write the new branch instructions? > > Yes.OK.> > A quick look suggests the x86 takes five bytes, PowerPC 16, > > PPC should be 4 bytes in the normal case. It is up to the backend to > implement this API correctly... if it doesn't, that's a bug: please > report it!No, EmitBranchToAt() always emits 16 bytes. AtI[0] = BUILD_LIS(12, Addr >> 16); // lis r12, hi16(address) AtI[1] = BUILD_ORI(12, 12, Addr); // ori r12, r12, low16(address) AtI[2] = BUILD_MTCTR(12); // mtctr r12 AtI[3] = BUILD_BCTR(isCall); // bctr/bctrl but I understand now how startFunctionStub() is given StubSize and on PowerPC it's 16 so there's no problem. Cheers, Ralph.
On Sun, 14 May 2006, Ralph Corderoy wrote:>> PPC should be 4 bytes in the normal case. It is up to the backend to >> implement this API correctly... if it doesn't, that's a bug: please >> report it! > > No, EmitBranchToAt() always emits 16 bytes. > > AtI[0] = BUILD_LIS(12, Addr >> 16); // lis r12, hi16(address) > AtI[1] = BUILD_ORI(12, 12, Addr); // ori r12, r12, low16(address) > AtI[2] = BUILD_MTCTR(12); // mtctr r12 > AtI[3] = BUILD_BCTR(isCall); // bctr/bctrl > > but I understand now how startFunctionStub() is given StubSize and on > PowerPC it's 16 so there's no problem.Ah, that's silly. If the source and target are within range (as they should almost always be), a simple unconditional branch should be used. Patches welcome :) -Chris -- http://nondot.org/sabre/ http://llvm.org/