summaryrefslogtreecommitdiff
path: root/libobjc
diff options
context:
space:
mode:
Diffstat (limited to 'libobjc')
-rw-r--r--libobjc/ChangeLog15
-rw-r--r--libobjc/class.c9
-rw-r--r--libobjc/init.c9
3 files changed, 33 insertions, 0 deletions
diff --git a/libobjc/ChangeLog b/libobjc/ChangeLog
index f88f2f45cdf..dbc70f190bb 100644
--- a/libobjc/ChangeLog
+++ b/libobjc/ChangeLog
@@ -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>
Nicola Pero <nicola.pero@meta-innovation.com>
diff --git a/libobjc/class.c b/libobjc/class.c
index edc56aa9ec4..3b750829f3b 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 d4475b3b787..23ba41ba128 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;