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:
Nicola Pero 2011-10-09 10:29:50 +00:00 committed by Nicola Pero
parent 68e291ec19
commit b4a50e4336
3 changed files with 33 additions and 0 deletions

View File

@ -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>

View File

@ -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

View File

@ -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;