[LLVMdev] Dynamically adding exception frames in the macintosh OS X
jacob navia
jacob at jacob.remcomp.fr
Mon Jul 27 09:29:44 PDT 2015
Hi
I am porting a JIT compiler to the Macintosh. This software runs under
windows and Linux. In both systems there is an interface for adding
exception frames dynamically when you add code compiled on the fly.
Under linux the (not documented) gcc function __register_frame_info does
the trick. Under windows, Microsoft has added an official API for this,
that works without problems.
The Macintosh environment however is really a nightmare. There are two
"recommended" methods if you would believe the published source code.
Method 1:
/// darwin_register_frame - Since __register_frame does not work with
darwin's
/// libgcc,we provide our own function, which "tricks" libgcc by
modifying the
/// "Dwarf2 object list" key.
void DarwinRegisterFrame(object *ob) {
// Get the key.
LibgccObjectInfo* LOI = (struct LibgccObjectInfo*)
_keymgr_get_and_lock_processwide_ptr(KEYMGR_GCC3_DW2_OBJ_LIST);
...
}
This code is taken from the official Apple open source site. There is a
little problem however...
_keymgr_get_and_lock_processwide_ptr returns ALWAYS ZERO!
I did a loop
179 for (int i=0; i<30000; i++) {
180 void *p=_keymgr_get_and_lock_processwide_ptr(i);
181 if (p) printf("%d %p\n",i,p);
182 }
IT ALWAYS returns zero.
Method 2:
Try to use __register_frame_info anyway. There is a function with that
name in several dynamic librairies.
The problem is that this function does NOTHING! It consists of a SINGLE
return STATEMENT, nothing else. After several days of work I had the
patience to go with gdb in disassembly mode and I saw that that function
does absolutely nothing. It is there to satisfy the linker and make you
loose time.
HOW then, are we supposed to add the frame information into a running
program?
Thanks in advance for any help on this issue.
jacob navia
More information about the llvm-dev
mailing list