[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