Andrew Haley
2008-Dec-17 18:23 UTC
[LLVMdev] Getting the start and end address of JITted code
Here's my problem, which I raised on IRC: JIT::getPointerToFunction gets the address of the start of a function. But how do I find out where the end of the function is? I need this to register the function for profiling. varth said: aph, you need to intercept the "endFunctionBody" call on the memory manager, it will tell you the start pointer and the end pointer But how can I do this? The obvious way would be for me to inherit from DefaultMemoryManager and pass an instance of my class to ExecutionEngine::createJIT. But DefaultMemoryManager isn't public so I can't inherit from it. It's not at all obvious to me how I'm supposed to intercept endFunctionBody. Thanks, Andrew.
Andrew Haley
2008-Dec-17 21:48 UTC
[LLVMdev] Getting the start and end address of JITted code
Nicolas Geoffray wrote:> Hi Andrew, > > Andrew Haley wrote: >> Here's my problem, which I raised on IRC: >> >> JIT::getPointerToFunction gets the address of the start of a function. >> But how do I find out where the end of the function is? I need this >> to register the function for profiling. >> >> varth said: aph, you need to intercept the "endFunctionBody" call on >> the memory manager, it will tell you the start pointer and the end >> pointer >> > > Yep, that's what I said :) > >> But how can I do this? The obvious way would be for me to inherit >> from DefaultMemoryManager and pass an instance of my class to >> ExecutionEngine::createJIT. > > Correct. > >> But DefaultMemoryManager isn't public so >> I can't inherit from it. > > You should inherit from JITMemoryManager. >> It's not at all obvious to me how I'm >> supposed to intercept endFunctionBody. > > Here's how vmkit does it: > > class MvmMemoryManager : public JITMemoryManager { > > /// realMemoryManager - The real allocator > JITMemoryManager* realMemoryManager; > > public: > > MvmMemoryManager() : JITMemoryManager() { > realMemoryManager = JITMemoryManager::CreateDefaultMemManager(); > } > > > And MvmMemoryManager redefines all the virtual functions to call the > real memory manager. For endFunctionBody, it inserts in a map the start > and end pointers.So I have to define *all* the virtual functions and wrap the memory manager just in order to intercept endFunctionBody? !! Sheesh. Thanks, Andrew.