From b4a50e4336a0d62a41e56b7e785211727543a1b3 Mon Sep 17 00:00:00 2001 From: Nicola Pero Date: Sun, 9 Oct 2011 10:29:50 +0000 Subject: [PATCH] In libobjc/: 2011-10-09 Nicola Pero In libobjc/: 2011-10-09 Nicola Pero PR libobjc/49883 * init.c (__objc_exec_class): Work around a bug in clang's code generation. Clang sets the class->info field to values different from 0x1 or 0x2 (the only allowed values in the traditional GNU Objective-C runtime ABI) to store some additional information, but this breaks backwards compatibility. Wipe out all the bits in the fields other than the first two upon loading a class. 2011-10-09 Nicola Pero * class.c (objc_lookup_class): Added back for compatibility with clang which seems to emit calls to it. From-SVN: r179721 --- libobjc/ChangeLog | 15 +++++++++++++++ libobjc/class.c | 9 +++++++++ libobjc/init.c | 9 +++++++++ 3 files changed, 33 insertions(+) diff --git a/libobjc/ChangeLog b/libobjc/ChangeLog index f88f2f45cdf6..dbc70f190bb0 100644 --- a/libobjc/ChangeLog +++ b/libobjc/ChangeLog @@ -1,3 +1,18 @@ +2011-10-09 Nicola Pero + + PR libobjc/49883 + * init.c (__objc_exec_class): Work around a bug in clang's code + generation. Clang sets the class->info field to values different + from 0x1 or 0x2 (the only allowed values in the traditional GNU + Objective-C runtime ABI) to store some additional information, but + this breaks backwards compatibility. Wipe out all the bits in the + fields other than the first two upon loading a class. + +2011-10-09 Nicola Pero + + * class.c (objc_lookup_class): Added back for compatibility with + clang which seems to emit calls to it. + 2011-10-08 Richard Frith-Macdonald Nicola Pero diff --git a/libobjc/class.c b/libobjc/class.c index edc56aa9ec4d..3b750829f3bc 100644 --- a/libobjc/class.c +++ b/libobjc/class.c @@ -764,6 +764,15 @@ objc_get_meta_class (const char *name) return objc_get_class (name)->class_pointer; } +/* This is not used by GCC, but the clang compiler seems to use it + when targetting the GNU runtime. That's wrong, but we have it to + be compatible. */ +Class +objc_lookup_class (const char *name) +{ + return objc_getClass (name); +} + /* This is used when the implementation of a method changes. It goes through all classes, looking for the ones that have these methods (either method_a or method_b; method_b can be NULL), and reloads diff --git a/libobjc/init.c b/libobjc/init.c index d4475b3b787a..23ba41ba128b 100644 --- a/libobjc/init.c +++ b/libobjc/init.c @@ -643,6 +643,15 @@ __objc_exec_class (struct objc_module *module) assert (CLS_ISMETA (class->class_pointer)); DEBUG_PRINTF (" installing class '%s'\n", class->name); + /* Workaround for a bug in clang: Clang may set flags other than + _CLS_CLASS and _CLS_META even when compiling for the + traditional ABI (version 8), confusing our runtime. Try to + wipe these flags out. */ + if (CLS_ISCLASS (class)) + __CLS_INFO (class) = _CLS_CLASS; + else + __CLS_INFO (class) = _CLS_META; + /* Initialize the subclass list to be NULL. In some cases it isn't and this crashes the program. */ class->subclass_list = NULL;