Hi All, I just implemented an often-requested feature: the ability to delete machine code out of the JIT's code buffer (the ExecutionEngine::freeMachineCodeForFunction(F) method). The implementation uses a very general free-list mechanism for tracking free ranges in the buffer, and it works perfectly in my simple test cases designed to cover all of the code paths. However, I don't have any good "real world" way to test this thoroughly. If you have an application for this API, please try it out. Remember that, once deleted, the memory for a function can be reused for other functions. This means you should only call this method if you *know* that execution could never reach this function again. As a sanity check, in debug builds, I memset the freed buffer with garbage to try to make it obvious if the buffer is called into. 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. I'm happy to answer any questions about this functionality, as usual. -Chris -- http://nondot.org/sabre/ http://llvm.org/
Hi Chris,> 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? A quick look suggests the x86 takes five bytes, PowerPC 16, and the Alpha's implementation is an assert(0) but if it did call its EmitBranchToAt() then that would be 76. Could the original machine code be smaller? Cheers, Ralph.
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/