In libobjc/: 2011-10-09 Nicola Pero <nicola.pero@meta-innovation.com>
In libobjc/: 2011-10-09 Nicola Pero <nicola.pero@meta-innovation.com> 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 <nicola.pero@meta-innovation.com> * class.c (objc_lookup_class): Added back for compatibility with clang which seems to emit calls to it. From-SVN: r179721
This commit is contained in:
parent
68e291ec19
commit
b4a50e4336
@ -1,3 +1,18 @@
|
|||||||
|
2011-10-09 Nicola Pero <nicola.pero@meta-innovation.com>
|
||||||
|
|
||||||
|
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 <nicola.pero@meta-innovation.com>
|
||||||
|
|
||||||
|
* class.c (objc_lookup_class): Added back for compatibility with
|
||||||
|
clang which seems to emit calls to it.
|
||||||
|
|
||||||
2011-10-08 Richard Frith-Macdonald <rfm@gnu.org>
|
2011-10-08 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
Nicola Pero <nicola.pero@meta-innovation.com>
|
Nicola Pero <nicola.pero@meta-innovation.com>
|
||||||
|
|
||||||
|
@ -764,6 +764,15 @@ objc_get_meta_class (const char *name)
|
|||||||
return objc_get_class (name)->class_pointer;
|
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
|
/* This is used when the implementation of a method changes. It goes
|
||||||
through all classes, looking for the ones that have these methods
|
through all classes, looking for the ones that have these methods
|
||||||
(either method_a or method_b; method_b can be NULL), and reloads
|
(either method_a or method_b; method_b can be NULL), and reloads
|
||||||
|
@ -643,6 +643,15 @@ __objc_exec_class (struct objc_module *module)
|
|||||||
assert (CLS_ISMETA (class->class_pointer));
|
assert (CLS_ISMETA (class->class_pointer));
|
||||||
DEBUG_PRINTF (" installing class '%s'\n", class->name);
|
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
|
/* Initialize the subclass list to be NULL. In some cases it
|
||||||
isn't and this crashes the program. */
|
isn't and this crashes the program. */
|
||||||
class->subclass_list = NULL;
|
class->subclass_list = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user