Initial exception support for the GNU runtime

Hi Everyone,

This patch is a first pass at adding support for exceptions for the GNU runtime. There are a few limitations at present:

- @synchronized() is not yet supported at all. gcc currently emits calls to runtime library functions that don't exist for this directive.

- Only id @catch statements are currently working. This is enough for NS_DURING and friends, but I need to spend more time reading the output from gcc -S to work out how it finds the class pointer to make arbitrary class type catch statements work.

- I've tested it with a few common cases[1] and the clang test suite (which doesn't test exceptions for the GNU runtime, but shows I haven't broken anything else), but there are probably a lot of cases I've missed.

David

[1] Simple test program:
#import <objc/Object.h>
#include <stdio.h>

void objc_exception_throw(id);
id e;
void foo(void)
{
     e = [Object new];
     @throw e;
}
void nest(void)
{
     @try {
         foo();
     }
     @finally {
         printf("finally 1\n");
     }
}
int main(void)
{
     @try {
         printf("try.\n");
         nest();
         printf("fail.\n");
     }
     @catch(id b) {
         printf("Caught id %d.\n", e == b);
         }
     @finally {
         printf("finally\n");
     }
     return 0;
}

clang.diff (9.55 KB)

Thanks David, applied here:
http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20090504/016987.html

-Chris

Turns out it's easy - the GNU runtime uses class names, not class pointers. I was missing an objc_get_class() reading the code.

Attached diff fixes this, should fix it on 64-bit platforms (untested - I don't have a machine to try it on), and removes two FIXMEs that I forgot to remove before sending the last patch.

David

clang.diff (3.11 KB)

Thanks David, applied:
http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20090504/017007.html

-Chris