summaryrefslogtreecommitdiff
path: root/libobjc/init.c
diff options
context:
space:
mode:
authornicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>2011-10-09 10:29:50 +0000
committernicola <nicola@138bc75d-0d04-0410-961f-82ee72b054a4>2011-10-09 10:29:50 +0000
commit7859870cdfc8c5083993fb078e8007bda45270f1 (patch)
tree52323cadfeff71297cb073de42a81990ba9f9e54 /libobjc/init.c
parent11d79063da416f34d6371a5f957ea6a13732bc05 (diff)
downloadgcc-7859870cdfc8c5083993fb078e8007bda45270f1.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@179721 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libobjc/init.c')
-rw-r--r--libobjc/init.c9
1 files changed, 9 insertions, 0 deletions
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;