[llvm-commits] Enable exceptions in JIT for Darwin
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Thu Aug 21 01:20:10 PDT 2008
Hi Evan,
New patch with new un-gcc documentation :)
Thanks for reviewing!
Nicolas
Evan Cheng wrote:
> Hi Nicolas,
>
> Comments in line.
>
> On Aug 19, 2008, at 8:04 AM, Nicolas Geoffray wrote:
>
>
>> Dear all,
>>
>> Here's a patch that enables exception handling on Darwin with the
>> JIT. It's really ugly, it's a workaround to work with libgcc which
>> is doing crazy stuff when unwinding the stack. The __register_frame
>> function was sufficient enough for Linux, but unfortunately, the
>> code for darwin erases by default the registered frames. In a
>> perfect world, I think libgcc should be modified....
>>
>>
>> I'd be totally OK if you don't want this patch in, as it's an ugly
>> workaround. I can move the patch to vmkit, and that would be fine by
>> me. However, this makes lli work out of the box with exceptions and
>> darwin, so it's still an improvement.
>>
>> Nicolas
>> Index: lib/ExecutionEngine/JIT/JIT.cpp
>> ===================================================================
>> --- lib/ExecutionEngine/JIT/JIT.cpp (revision 54920)
>> +++ lib/ExecutionEngine/JIT/JIT.cpp (working copy)
>> @@ -64,10 +64,73 @@
>> }
>> }
>>
>> +
>> #if defined (__GNUC__)
>> extern "C" void __register_frame(void*);
>> -#endif
>>
>> +#if defined (__APPLE__)
>> +struct object {
>> + void *pc_begin;
>> + void *tbase;
>> + void *dbase;
>> + void* real_begin;
>> +
>> + union {
>> + struct {
>> + unsigned long sorted : 1;
>> + unsigned long from_array : 1;
>> + unsigned long mixed_encoding : 1;
>> + unsigned long encoding : 8;
>> + unsigned long count : 21;
>> + } b;
>> + size_t i;
>> + } s;
>>
>
> Please pick more descriptive names than object, etc. Also, please try
> to match the naming convention used in the file. Some documentation is
> definitely welcome. :-)
>
>> +
>> + // Be pessimistic, include this field even if GCC
>> + // may not have it.
>> + char *fde_end;
>> +
>> + struct object *next;
>> +};
>> +
>> +extern "C" void _keymgr_set_and_unlock_processwide_ptr (int, void *);
>> +extern "C" void *_keymgr_get_and_lock_processwide_ptr (int);
>> +#define KEYMGR_GCC3_DW2_OBJ_LIST 302 /* Dwarf2 object
>> list */
>> +
>> +struct km_object_info {
>> + struct object* seen_objects;
>> + struct object* unseen_objects;
>> + unsigned spare[2];
>> +};
>> +
>> +extern "C" void darwin_register_frame(void* begin) {
>> + struct km_object_info* the_obj_info = (struct km_object_info*)
>> + _keymgr_get_and_lock_processwide_ptr (KEYMGR_GCC3_DW2_OBJ_LIST);
>> +
>> + struct object* ob = (struct object*)malloc(sizeof(struct object));
>>
>
> Who frees this?
>
>
>> + ob->pc_begin = (void *)-1;
>> + ob->tbase = 0;
>> + ob->dbase = 0;
>> + ob->real_begin = begin;
>> + ob->s.i = 0;
>> + //ob->s.b.encoding = DW_EH_PE_omit;
>>
>
> Why is this commented out?
>
>
>> + ob->s.b.encoding = 0xff;
>> +
>> + // Put the info on both places, as libgcc uses the first or the
>> + // the second field.
>> + ob->fde_end = (char*)the_obj_info->unseen_objects;
>> + ob->next = (struct object*)the_obj_info->unseen_objects;
>>
>
> Are the casting necessary? Why not just define the types correctly.
>
>
>> +
>> + the_obj_info->unseen_objects = ob;
>> +
>> + _keymgr_set_and_unlock_processwide_ptr (KEYMGR_GCC3_DW2_OBJ_LIST,
>> + the_obj_info);
>> +
>> +}
>>
>
> Function level documentation please.
>
> Thanks!
>
> Evan
>
>
>> +
>> +#endif // __APPLE__
>> +#endif // __GNUC__
>> +
>> /// createJIT - This is the factory method for creating a JIT for
>> the current
>> /// machine, it does not fall back to the interpreter. This takes
>> ownership
>> /// of the module provider.
>> @@ -108,8 +171,20 @@
>>
>> // Register routine for informing unwinding runtime about new EH
>> frames
>> #if defined(__GNUC__)
>> +#if defined(__APPLE__)
>> + struct km_object_info* the_obj_info = (struct km_object_info*)
>> + _keymgr_get_and_lock_processwide_ptr (KEYMGR_GCC3_DW2_OBJ_LIST);
>> +
>> + if (!the_obj_info) {
>> + the_obj_info = (km_object_info*)malloc(sizeof(struct
>> km_object_info));
>> + _keymgr_set_and_unlock_processwide_ptr (KEYMGR_GCC3_DW2_OBJ_LIST,
>> + the_obj_info);
>> + }
>> + InstallExceptionTableRegister(darwin_register_frame);
>> +#else
>> InstallExceptionTableRegister(__register_frame);
>> -#endif
>> +#endif // __APPLE__
>> +#endif // __GNUC__
>>
>>
>> // Initialize passes.
>> PM.doInitialization();
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: jit-darwin-exceptions.patch
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20080821/7d3a3df1/attachment.ksh>
More information about the llvm-commits
mailing list