Re: RFA: Update copyright for libobjc
OK. Thanks On 3 Feb 2013, at 10:33, Richard Sandiford wrote: Update the copyright notices for libobjc. Tested on x86_64-linux-gnu. OK to install? Richard libbjc/ Update copyright years. Index: libobjc/Makefile.in === --- libobjc/Makefile.in 2013-02-02 21:33:00.727873787 + +++ libobjc/Makefile.in 2013-02-03 10:31:00.272954078 + @@ -1,6 +1,5 @@ # Makefile for GNU Objective C runtime library. -# Copyright 1993, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, -# 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. +# Copyright (C) 1993-2013 Free Software Foundation, Inc. #This file is part of GCC. Index: libobjc/NXConstStr.m === --- libobjc/NXConstStr.m 2013-02-02 21:33:00.724873765 + +++ libobjc/NXConstStr.m 2013-02-03 10:31:00.225953831 + @@ -1,5 +1,5 @@ /* Implementation of the NXConstantString class for Objective-C. - Copyright (C) 1995, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 1995-2013 Free Software Foundation, Inc. Contributed by Pieter J. Schoenmakers ti...@es.ele.tue.nl This file is part of GCC. Index: libobjc/Object.m === --- libobjc/Object.m 2013-02-02 21:33:00.728873795 + +++ libobjc/Object.m 2013-02-03 10:31:00.226953836 + @@ -1,6 +1,5 @@ /* The implementation of class Object for Objective-C. - Copyright (C) 1993, 1994, 1995, 1997, 2002, 2009, 2010, 2011 - Free Software Foundation, Inc. + Copyright (C) 1993-2013 Free Software Foundation, Inc. This file is part of GCC. Index: libobjc/Protocol.m === --- libobjc/Protocol.m2013-02-02 21:33:00.724873765 + +++ libobjc/Protocol.m2013-02-03 10:31:00.243953925 + @@ -1,5 +1,5 @@ /* This file contains the implementation of class Protocol. - Copyright (C) 1993, 2004, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 1993-2013 Free Software Foundation, Inc. This file is part of GCC. Index: libobjc/accessors.m === --- libobjc/accessors.m 2013-02-02 21:33:00.725873772 + +++ libobjc/accessors.m 2013-02-03 10:31:00.272954078 + @@ -1,5 +1,5 @@ /* GNU Objective C Runtime accessors functions - Copyright (C) 2010 Free Software Foundation, Inc. + Copyright (C) 2010-2013 Free Software Foundation, Inc. Contributed by Nicola Pero This file is part of GCC. Index: libobjc/acinclude.m4 === --- libobjc/acinclude.m4 2013-02-02 21:33:00.723873757 + +++ libobjc/acinclude.m4 2013-02-03 10:31:00.244953931 + @@ -1,5 +1,4 @@ -dnl Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2010 -dnl Free Software Foundation, Inc. +dnl Copyright (C) 1994-2013 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. Index: libobjc/class.c === --- libobjc/class.c 2013-02-02 21:33:00.728873795 + +++ libobjc/class.c 2013-02-03 10:31:00.251953967 + @@ -1,6 +1,5 @@ /* GNU Objective C Runtime class related functions - Copyright (C) 1993, 1995, 1996, 1997, 2001, 2002, 2009, 2010, 2011 - Free Software Foundation, Inc. + Copyright (C) 1993-2013 Free Software Foundation, Inc. Contributed by Kresten Krab Thorup and Dennis Glatting. Lock-free class table code designed and written from scratch by Index: libobjc/configure.ac === --- libobjc/configure.ac 2013-02-02 21:33:00.728873795 + +++ libobjc/configure.ac 2013-02-03 10:31:00.252953972 + @@ -1,6 +1,5 @@ # Process this file with autoconf to produce a configure script. -# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004 -# 2005, 2006, 2009, 2011, 2012 Free Software Foundation, Inc. +# Copyright (C) 1994-2013 Free Software Foundation, Inc. # Originally contributed by Dave Love (d.l...@dl.ac.uk). # #This file is part of GCC. Index: libobjc/encoding.c === --- libobjc/encoding.c2013-02-02 21:33:00.727873787 + +++ libobjc/encoding.c2013-02-03 10:31:00.252953972 + @@ -1,6 +1,5 @@ /* Encoding of types for Objective C. - Copyright (C) 1993, 1995, 1996, 1997, 1998, 2000, 2002, 2004, 2009, 2010 - Free Software Foundation, Inc. + Copyright (C) 1993-2013 Free Software Foundation, Inc. Contributed by Kresten Krab
Re: [PATCH] fix -Wsign-compare error in objc-act.c (PR objc/50743)
(I don't have svn write access so I'll need someone else to commit it if it's approved.) I can apply it for you. But ... do you have a copyright assignment in place for contributions to GCC ? The patch looks small and trivial enough that I think I can apply it without a signed copyright assignment form, but if you plan on contributing more, it would make sense to sign one. :-) Thanks
Re: [patch] C6X unwinding/exception handling
I checked the attached patch, test results at http://gcc.gnu.org/ml/gcc-testresults/2011-10/msg01377.html which are the same as with my suggested patch. Ok for the trunk? I probably don't have authority to approve this, but looks OK to me. The libobjc bits are Ok for trunk. Thanks
libobjc/50002: Applied fix to 4.6 branch as well
I applied the following patch to the 4.6 branch to backport the fix for libobjc/50002. It makes sense to backport it to 4.6.x so that it appears in 4.6.2. It really is quite a bug, and the fix is simple/safe (and, the ObjFW guys were particularly keen on it). Thanks Index: class.c === --- class.c (revision 179967) +++ class.c (working copy) @@ -850,35 +850,57 @@ __objc_update_classes_with_methods (struct objc_me while (node != NULL) { - /* Iterate over all methods in the class. */ - Class class = node-pointer; - struct objc_method_list * method_list = class-methods; + /* We execute this loop twice: the first time, we iterate +over all methods in the class (instance methods), while +the second time we iterate over all methods in the meta +class (class methods). */ + Class class = Nil; + BOOL done = NO; - while (method_list) + while (done == NO) { - int i; + struct objc_method_list * method_list; - for (i = 0; i method_list-method_count; ++i) + if (class == Nil) { - struct objc_method *method = method_list-method_list[i]; + /* The first time, we work on the class. */ + class = node-pointer; + } + else + { + /* The second time, we work on the meta class. */ + class = class-class_pointer; + done = YES; + } - /* If the method is one of the ones we are looking -for, update the implementation. */ - if (method == method_a) - sarray_at_put_safe (class-dtable, - (sidx) method_a-method_name-sel_id, - method_a-method_imp); + method_list = class-methods; - if (method == method_b) + while (method_list) + { + int i; + + for (i = 0; i method_list-method_count; ++i) { - if (method_b != NULL) + struct objc_method *method = method_list-method_list[i]; + + /* If the method is one of the ones we are +looking for, update the implementation. */ + if (method == method_a) sarray_at_put_safe (class-dtable, - (sidx) method_b-method_name-sel_id, - method_b-method_imp); + (sidx) method_a-method_name-sel_id, + method_a-method_imp); + + if (method == method_b) + { + if (method_b != NULL) + sarray_at_put_safe (class-dtable, + (sidx) method_b-method_name-sel_id, + method_b-method_imp); + } } + + method_list = method_list-method_next; } - - method_list = method_list-method_next; } node = node-next; } Index: ChangeLog === --- ChangeLog (revision 179967) +++ ChangeLog (working copy) @@ -1,3 +1,13 @@ +2011-10-14 Nicola Pero nicola.p...@meta-innovation.com + + Backport from mainline + 2011-08-06 Nicola Pero nicola.p...@meta-innovation.com + + PR libobjc/50002 + * class.c (__objc_update_classes_with_methods): Iterate over meta + classes as well as normal classes when refreshing the method + implementations. This fixes replacing class methods. + 2011-06-27 Release Manager * GCC 4.6.1 released.
libobjc/49883: Applied fix to 4.6 branch as well
I applied the following patch to backport the fix for libobjc/49883 to GCC 4.6 so that it appears in 4.6.2. This is the clang-related problem that was recently discussed. Again, it's an important fix, but safe, with users (the ObjFW guys) asking for it in 4.6.2, which made total sense, so I backported the fix and committed it to the 4.6 branch. Thanks Index: init.c === --- init.c (revision 179967) +++ init.c (working copy) @@ -643,6 +643,15 @@ 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; Index: ChangeLog === --- ChangeLog (revision 179996) +++ ChangeLog (working copy) @@ -1,6 +1,19 @@ 2011-10-14 Nicola Pero nicola.p...@meta-innovation.com Backport from mainline + 2011-10-09 Nicola Pero nicola.p...@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-14 Nicola Pero nicola.p...@meta-innovation.com + + Backport from mainline 2011-08-06 Nicola Pero nicola.p...@meta-innovation.com PR libobjc/50002
Re: Fix for PR obj-c++/48275 (getter=namespace failing with .mm)
Can I apply this fix to the 4.6 branch as well ? Some users are asking for it to be backported to the 4.6 branch. It's not a regression, because the property implementation is new in GCC 4.6, but it is still a serious bug if you're trying to use properties with ObjC++, as you can't use namespace as a getter name. It's a simple fix, quite obvious, and very limited in scope (even if it was wrong, it can't really do much harm other than breaking property declarations in ObjC++ which are already broken without the patch), so I'd go for it. OK to commit to the 4.6 branch ? Thanks On 6 Jun 2011, at 20:22, Nicola Pero wrote: This patch fixes PR obj-c++/48275. It's a routine parser ingenuity. OK to commit ? Thanks Index: testsuite/ChangeLog === --- testsuite/ChangeLog (revision 174657) +++ testsuite/ChangeLog (working copy) @@ -1,3 +1,9 @@ +2011-06-06 Nicola Pero nicola.p...@meta-innovation.com + + PR objc-++/48275 + * obj-c++.dg/property/cxx-property-1.mm: New. + * obj-c++.dg/property/cxx-property-2.mm: New. + 2011-06-05 Nicola Pero nicola.p...@meta-innovation.com PR testsuite/49287 Index: testsuite/obj-c++.dg/property/cxx-property-2.mm === --- testsuite/obj-c++.dg/property/cxx-property-2.mm (revision 0) +++ testsuite/obj-c++.dg/property/cxx-property-2.mm (revision 0) @@ -0,0 +1,22 @@ +/* { dg-do compile } */ + +/* All these C++ keywords are acceptable in ObjC method names, hence + should be accepted for property getters and setters. */ + +@interface Test +{ + Class isa; +} +@property (getter=namespace) int p0; +@property (setter=namespace:) int p1; +@property (getter=and) int p2; +@property (setter=and:) int p3; +@property (getter=class) int p4; +@property (setter=class:) int p5; +@property (getter=new) int p6; +@property (setter=new:) int p7; +@property (getter=delete) int p8; +@property (setter=delete:) int p9; +@property (getter=delete) int p10; +@property (setter=delete:) int p11; +@end Index: testsuite/obj-c++.dg/property/cxx-property-1.mm === --- testsuite/obj-c++.dg/property/cxx-property-1.mm (revision 0) +++ testsuite/obj-c++.dg/property/cxx-property-1.mm (revision 0) @@ -0,0 +1,10 @@ +/* Testcase from PR obj-c++/48275. */ +/* { dg-do compile } */ + +@interface Test +{ +int ns; +} +@property (getter=namespace) int ns; + +@end Index: cp/ChangeLog === --- cp/ChangeLog(revision 174656) +++ cp/ChangeLog(working copy) @@ -1,3 +1,9 @@ +2011-06-06 Nicola Pero nicola.p...@meta-innovation.com, + + PR obj-c++/48275 + * parser.c (cp_parser_objc_at_property_declaration): Allow setter + and getter names to use all the allowed method names. + 2011-06-04 Jonathan Wakely jwakely@gmail.com * init.c (build_delete): Warn when deleting type with non-virtual Index: cp/parser.c === --- cp/parser.c (revision 174656) +++ cp/parser.c (working copy) @@ -23187,7 +23187,7 @@ cp_parser_objc_at_property_declaration (cp_parser break; } cp_lexer_consume_token (parser-lexer); /* eat the = */ - if (cp_lexer_next_token_is_not (parser-lexer, CPP_NAME)) + if (!cp_parser_objc_selector_p (cp_lexer_peek_token (parser-lexer)-type)) { cp_parser_error (parser, expected identifier); syntax_error = true; @@ -23196,10 +23196,12 @@ cp_parser_objc_at_property_declaration (cp_parser if (keyword == RID_SETTER) { if (property_setter_ident != NULL_TREE) - cp_parser_error (parser, the %setter% attribute may only be specified once); + { + cp_parser_error (parser, the %setter% attribute may only be specified once); + cp_lexer_consume_token (parser-lexer); + } else - property_setter_ident = cp_lexer_peek_token (parser-lexer)-u.value; - cp_lexer_consume_token (parser-lexer); + property_setter_ident = cp_parser_objc_selector (parser); if (cp_lexer_next_token_is_not (parser-lexer, CPP_COLON)) cp_parser_error (parser, setter name must terminate with %:%); else @@ -23208,10 +23210,12 @@ cp_parser_objc_at_property_declaration (cp_parser else { if (property_getter_ident != NULL_TREE) - cp_parser_error (parser, the %getter% attribute may only be specified once
ObjC/ObjC++ Patch: rewrite objc/objc++ frontend hashtables
This patch finally rewrites the hashtables used by the ObjC (and ObjC++) frontend. The new code speeds up the compiler by about 4% when compiling the standard GNUstep ObjC system headers with -fsyntax-only. That's quite good for a change that does nothing but swap a hashtable implementation with another one. PS: This also supersedes the two small ObjC hashtable patches that I sent in the past 12 months or so and that were never applied. The hashtable implemented by the current patch is polished and fast. Bootstrapped and regtested on gnu-linux i686. Ok to commit ? Thanks Index: gcc/objc/ChangeLog === --- gcc/objc/ChangeLog (revision 179864) +++ gcc/objc/ChangeLog (working copy) @@ -1,3 +1,54 @@ +2011-10-14 Nicola Pero nicola.p...@meta-innovation.com + + * objc-map.h: New file. + * objc-map.c: New file. + * config-lang.in (gtfiles): Added objc-map.h. + * Make-lang.in (OBJC_OBJS): Added objc-map.o. + (objc/objc-map.o): New rule. + (objc/objc-act.o): Depend on objc/objc-map.h. + * objc-next-runtime-abi-02.c: Added a TODO comment. + * objc-act.c: Include objc-map.h. + (nst_method_hash_list, cls_method_hash_list): Removed. + (instance_method_map, class_method_map): New. + (cls_name_hash_list, als_name_hash_list): Removed. + (class_name_map, alias_name_map): Removed. + (ivar_offset_hash_list): Removed. + (hash_class_name_enter, hash_class_name_lookup, hash_enter, + hash_lookup, hash_add_attr, add_method_to_hash_list): Removed. + (interface_hash_init): New. + (objc_init): Call interface_hash_init. + (objc_write_global_declarations): Iterate over class_method_map + and instance_method_map instead of cls_method_hash_list and + nst_method_hash_list. + (objc_declare_alias): Use alias_name_map instead of + cls_name_hash_list. + (objc_is_class_name): Use class_name_map and alias_name_map + instead of cls_name_hash_list and als_name_hash_list. + (interface_tuple, interface_htab, hash_interface, eq_interface): + Removed. + (interface_map): New. + (add_class): Renamed to add_interface. Use interface_map instead + of interface_htab. + (lookup_interface): Use interface_map instead of interface_htab. + (check_duplicates): Changed first argument to be a tree, + potentially a TREE_VEC, instead of a hash. Changed implementation + to match. + (lookup_method_in_hash_lists): Use class_method_map and + instance_method_map instead of cls_method_hash_list and + nst_method_hash_list. + (objc_build_selector_expr): Likewise. + (hash_func): Removed. + (hash_init): Create instance_method_map, class_method_map, + class_name_map, and alias_name_map. Do not create + nst_method_hash_list, cls_method_hash_list, cls_name_hash_list, + als_name_hash_list, and ivar_offset_hash_list. + (insert_method_into_method_map): New. + (objc_add_method): Use insert_method_into_method_map instead of + add_method_to_hash_list. + (start_class): Call add_interface instead of add_class. + * objc-act.h (cls_name_hash_list, als_name_hash_list, + nst_method_hash_list, cls_method_hash_list): Removed. + 2011-10-11 Michael Meissner meiss...@linux.vnet.ibm.com * objc-next-runtime-abi-01.c (objc_build_exc_ptr): Delete old Index: gcc/objc/config-lang.in === --- gcc/objc/config-lang.in (revision 179864) +++ gcc/objc/config-lang.in (working copy) @@ -36,4 +36,4 @@ lang_requires=c # Order is important. If you change this list, make sure you test # building without C++ as well; that is, remove the gcc/cp directory, # and build with --enable-languages=c,objc. -gtfiles=\$(srcdir)/c-family/c-objc.h \$(srcdir)/objc/objc-act.h \$(srcdir)/objc/objc-act.c \$(srcdir)/objc/objc-runtime-shared-support.c \$(srcdir)/objc/objc-gnu-runtime-abi-01.c \$(srcdir)/objc/objc-next-runtime-abi-01.c \$(srcdir)/objc/objc-next-runtime-abi-02.c \$(srcdir)/c-parser.c \$(srcdir)/c-tree.h \$(srcdir)/c-decl.c \$(srcdir)/c-lang.h \$(srcdir)/c-objc-common.c \$(srcdir)/c-family/c-common.c \$(srcdir)/c-family/c-common.h \$(srcdir)/c-family/c-cppbuiltin.c \$(srcdir)/c-family/c-pragma.h \$(srcdir)/c-family/c-pragma.c +gtfiles=\$(srcdir)/objc/objc-map.h \$(srcdir)/c-family/c-objc.h \$(srcdir)/objc/objc-act.h \$(srcdir)/objc/objc-act.c \$(srcdir)/objc/objc-runtime-shared-support.c \$(srcdir)/objc/objc-gnu-runtime-abi-01.c \$(srcdir)/objc/objc-next-runtime-abi-01.c \$(srcdir)/objc/objc-next-runtime-abi-02.c \$(srcdir)/c-parser.c \$(srcdir)/c-tree.h \$(srcdir)/c-decl.c \$(srcdir)/c-lang.h \$(srcdir)/c-objc-common.c \$(srcdir)/c-family/c-common.c \$(srcdir)/c-family/c-common.h \$(srcdir)/c-family/c-cppbuiltin.c \$(srcdir)/c-family/c-pragma.h
RE: ObjC/ObjC++ Patch: rewrite objc/objc++ frontend hashtables
I actually forgot to post a tiny bit that is required to support the additional objc/objc-map.h and objc/objc-map.c files. It's part of the same patch. Apologies. Thanks Index: gengtype.c === --- gengtype.c (revision 179947) +++ gengtype.c (working copy) @@ -1817,6 +1817,11 @@ struct file_rule_st files_rules[] = { REG_EXTENDED, NULL_REGEX, gt-objc-objc-act.h, objc/objc-act.c, NULL_FRULACT }, + /* objc/objc-map.h gives gt-objc-objc-map.h for objc/objc-map.c ! */ + { DIR_PREFIX_REGEX objc/objc-map\\.h$, +REG_EXTENDED, NULL_REGEX, +gt-objc-objc-map.h, objc/objc-map.c, NULL_FRULACT }, + /* General cases. For header *.h and source *.c files, we need * special actions to handle the language. */ Index: ChangeLog === --- ChangeLog (revision 179947) +++ ChangeLog (working copy) @@ -1,3 +1,8 @@ +2011-10-14 Nicola Pero nicola.p...@meta-innovation.com + + * gengtype.c (files_rules): Added rules for objc/objc-map.h and + objc/objc-map.c. + 2011-10-13 Jakub Jelinek ja...@redhat.com * config/i386/sse.md (vec_setmode): Change V_128 iterator mode
Re: Fix for PR libobjc/49883 (clang + gcc 4.6 runtime = broken) and a small related clang fix
Unfortunately, the report was correct in that clang is producing incorrect code and abusing the higher bits of the class-info field to store some other information. The clang folks are pretty responsive. I'd always give them a chance to `fix' thier code, before putting hack-arounds in our code in general. That discussion did happen in private. It wasn't pleasant. They won't change their code. In fact, I just want to fix things and not get into more discussions. Anyhow, summarizing, the traditional GNU runtime ABI has the values 0x1L or 0x2L in the class-info field. But there is no formal definition document for the ABI, so all we can say is that GCC has always set that field to either 0x1L or 0x2L. By the way, the lack of a formal definition document is a problem, and if, at some point, I get to implement a new ABI for the GNU Objective-C runtime (which I want to do) I will produce a formal document describing it - so that anyone can implement a compatible compiler or runtime. But, for the existing ABI, there is no document describing it, hence all that can be said is that GCC only stores the values 0x1L or 0x2L in the class-field. The GNU runtime then uses some of the other bits to store information on the class at runtime - eg. when the class is +initialized it sets a bit, when it is resolved it sets another, etc. clang started abusing a higher bit of that field to store information not normally present in the ABI. That worked with older versions of the GNU runtime, because (by sheer chance in my view) the higher bit they set was not being used. The fact that it was not being used was an implementation accident (in my view) since other higher bits were actually used. The new GNU runtime included in GCC 4.6.x and higher has classes in construction (part of the new Objective-C API) and so the next available bit in the class-info field was used to keep track of the fact that a class is in construction. That was just the next available bit, but (unknown to me) it is precisely the bit that clang was (ab)using. As a consequence, code compiled with clang no longer works with the GNU runtime from GCC 4.6.x. As there is no formal definition document for the ABI, while it seems obvious to me that they broke the ABI (since they produce object files with some reserved bits set that no version of GCC would ever produce), they claim they didn't because their hack worked with GCC up to 4.5.x and the GNU runtime ignored whether that bit was set or not - up until 4.5.x. It's a standoff because they use that higher bit to basically produce a richer ABI, so they can't easily get rid of it now, and they won't. The hack-around I added clears this higher bit, unlocks the standoff and gets things to work again. Let's hope there are no more such issues, and if we introduce a new GNU Objective-C runtime ABI, we need to make sure it is well documented so that it is possible to easily ensure compatibility between different compilers and runtimes. Thanks
Re: Fix for PR libobjc/49883 (clang + gcc 4.6 runtime = broken) and a small related clang fix
It isn't a standoff, we can choose to just fix the issue and be compatible, if we want. I guess you're right and I'm probably using the wrong word - English is not my first language. ;-) But I meant that they could have made the same choice to be compatible (by fixing the issue in their compiler and making their GCC-compatible ABI output actually compatible with GCC; they already have other, clang-only, GCC-incompatible ABIs in there, so why not make the GCC-compatible one actually compatible with GCC ?), but they didn't. Anyhow I completely agree with you that life is too short and we spent already way too much time discussing this. It's fixed and let's move on. :-) Thanks
Fix for PR libobjc/49883 (clang + gcc 4.6 runtime = broken) and a small related clang fix
This patch fixes PR libobjc/49883. To fix it, I installed clang and tried out what happens if you compile Objective-C code using clang and targetting the GCC runtime. Unfortunately, the report was correct in that clang is producing incorrect code and abusing the higher bits of the class-info field to store some other information. On the good side, the fix I proposed in the discussion of PR libobjc/49883 actually works. :-) So, I applied that fix. I also found that clang still emits calls to the objc_lookup_class() function, so this patch also adds that function back into the runtime to get code compiled with clang work. Committed to trunk. Thanks PS: In case anyone wonders, I do want the GNU Objective-C Runtime to be usable with free, non-GCC Objective-C compilers. It should obviously work perfectly with GCC, the GNU compiler, which is its natural partner, but some people would like to use it with other free compilers and that seems a reasonable request. Refusing that request just provides an incentive to write and support other Objective-C runtimes, which is a waste of time and resources. ;-) Index: init.c === --- init.c (revision 179711) +++ init.c (working copy) @@ -643,6 +643,15 @@ 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; Index: class.c === --- class.c (revision 179711) +++ class.c (working copy) @@ -764,6 +764,15 @@ 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 Index: ChangeLog === --- ChangeLog (revision 179711) +++ ChangeLog (working copy) @@ -1,3 +1,18 @@ +2011-10-09 Nicola Pero nicola.p...@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.p...@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 r...@gnu.org Nicola Pero nicola.p...@meta-innovation.com
Patch for PR libobjc/50428 (Consider changing semantics of +initialize so that it is inherited)
This patch implements the change discussed in libobjc/50428. Traditionally, the Apple runtime inherits +initialize, meaning that if a class doesn't implement it, but the superclass does, the superclass's implementation gets executed the first time a method of the class is invoked. Instead, the GNU runtime traditionally doesn't inherit +initialize, meaning in that situation, no +initialize is executed. The idea is that with the GNU runtime you wouldn't have to worry about protecting your +initialize against multiple executions. But, in practice, people seem to protect +initialize methods all the same even with the GNU runtime, and they supply the following two explanations of why: * It is generally considered good practice to protect +initialize methods against multiple exclusions because it allows the code to run without changes with the Apple/NeXT runtime. * The runtime doesn't prevent programmers from invoking +initialize directly. You are not supposed to do it, but some beginners do, which is why a number of frameworks (including GNUstep) protect all +initialize methods against multiple executions all the same even when using the GNU runtime and even ignoring the existence of the Apple/NeXT runtime (!!). Because of these two reasons, it seems that everyone's really protecting their +initialize methods against multiple executions all the same! So the difference in behaviour between the GNU runtime and the Apple/NeXT one is not really helping anyone; but it makes it harder to port code written for the Apple/NeXT runtime to the GNU runtime. Programmers writing code for the Apple/NeXT runtime assume that +initialize methods are inherited, so they may write code which expects such methods to be called multiple times, once per subclass. That code would compile on the GNU runtime but not work. Fixing the code so that it works with both runtimes is not necessarily trivial in some situations, for example if the classes are dynamically created at runtime. So the difference in behaviour is not really helping anyone, but it's making life hard for some people who are porting software to run on the GNU runtime. This patch (originally submitted by Richard Frith-Macdonald in a private email, and revised by me) changes the behaviour of the GNU runtime to match the one of the Apple/NeXT one. This makes it easier to port software to use the GNU runtime. A testcase is included; I tested the patch on an Apple Mac OS X 10.6.8, making sure that the testcase behaves in the same way with the Apple/NeXT and GNU runtimes. Committed to trunk. Thanks PS: This change absolutely deserves a mention in the GCC 4.7 release notes. But I'll work on the release notes separately, once we are in stage 2 or so. :-) Index: gcc/doc/objc.texi === --- gcc/doc/objc.texi (revision 179710) +++ gcc/doc/objc.texi (working copy) @@ -635,7 +635,8 @@ following class does this: + (void)initialize @{ - class_ivar_set_gcinvisible (self, weakPointer, YES); + if (self == objc_lookUpClass (WeakPointer)) +class_ivar_set_gcinvisible (self, weakPointer, YES); @} - initWithPointer:(const void*)p Index: gcc/ChangeLog === --- gcc/ChangeLog (revision 179710) +++ gcc/ChangeLog (working copy) @@ -1,3 +1,9 @@ +2011-10-08 Nicola Pero nicola.p...@meta-innovation.com + + PR libobjc/50428 + * doc/objc.texi (Garbage Collection): Updated example to protect + +initialize against execution in subclasses. + 2011-10-07 Richard Henderson r...@redhat.com * doc/extend.texi (__builtin_shuffle): Improve the description to Index: gcc/testsuite/ChangeLog === --- gcc/testsuite/ChangeLog (revision 179710) +++ gcc/testsuite/ChangeLog (working copy) @@ -1,3 +1,8 @@ +2011-10-08 Nicola Pero nicola.p...@meta-innovation.com + + PR libobjc/50428 + * objc/execute/initialize-1.m: New test. + 2011-10-08 Paul Thomas pa...@gcc.gnu.org PR fortran/47844 Index: gcc/testsuite/objc/execute/initialize-1.m === --- gcc/testsuite/objc/execute/initialize-1.m (revision 0) +++ gcc/testsuite/objc/execute/initialize-1.m (revision 0) @@ -0,0 +1,47 @@ +/* Contributed by Nicola Pero - Sat 8 Oct 2011 16:47:48 BST */ +#include objc/objc.h + +/* Test that if a class has no +initialize method, the superclass + implementation is called. */ + +static int class_variable = 0; + +@interface TestClass +{ + Class isa; +} ++ (void) initialize; ++ (int) classVariable; +@end + +@implementation TestClass ++ (void) initialize +{ + class_variable++; +} ++ (int) classVariable +{ + return class_variable; +} +@end + +@interface TestSubClass : TestClass +@end + +@implementation TestSubClass +@end + +int main (void
libobjc: Fix PR libobjc/50002 (class_replaceMethod does not work on class methods)
This patch fixes PR libobjc/50002. The problem was that replacing an existing class method wouldn't work because the messaging tables weren't being refreshed for class methods when a method was replaced. This patch also includes three other related changes: * a new couple of comprehensive testcases, gnu-api-2-class-meta.m and gnu-api-2-class-meta.mm, covering calling various runtime functions with a meta class (as opposed to a normal class) as argument. This tests the above-mentioned fix for libobjc/50002, but also a variety of other similar functions and situations (this is mostly for peace of mind - I wanted to be sure that there aren't other problems similar to libobjc/50002). * a fix for a small issue with class_getSuperclass() (when used on a meta class in construction), which was identified by the testcases above. The actual problem is actually related to libobjc/49882 - which I fixed this morning. * synchronizes the ObjC++ testsuite with the ObjC one. In particular, when fixing libobjc/49882 this morning I added an ObjC testcase but forgot to add an ObjC++ one. This patch includes it. Tested with GNU and Apple runtime. Committed to trunk. Thanks Index: libobjc/ChangeLog === --- libobjc/ChangeLog (revision 177506) +++ libobjc/ChangeLog (working copy) @@ -1,5 +1,17 @@ 2011-08-06 Nicola Pero nicola.p...@meta-innovation.com + PR libobjc/50002 + * class.c (__objc_update_classes_with_methods): Iterate over meta + classes as well as normal classes when refreshing the method + implementations. This fixes replacing class methods. + +2011-08-06 Nicola Pero nicola.p...@meta-innovation.com + + * class.c (class_getSuperclass): Fixed to work with meta classes + still in construction too. + +2011-08-06 Nicola Pero nicola.p...@meta-innovation.com + * class.c (class_getSuperclass): Fixed typo in comment. 2011-08-06 Nicola Pero nicola.p...@meta-innovation.com Index: libobjc/class.c === --- libobjc/class.c (revision 177506) +++ libobjc/class.c (working copy) @@ -781,35 +781,57 @@ __objc_update_classes_with_methods (struct objc_me while (node != NULL) { - /* Iterate over all methods in the class. */ - Class class = node-pointer; - struct objc_method_list * method_list = class-methods; + /* We execute this loop twice: the first time, we iterate +over all methods in the class (instance methods), while +the second time we iterate over all methods in the meta +class (class methods). */ + Class class = Nil; + BOOL done = NO; - while (method_list) + while (done == NO) { - int i; + struct objc_method_list * method_list; - for (i = 0; i method_list-method_count; ++i) + if (class == Nil) { - struct objc_method *method = method_list-method_list[i]; + /* The first time, we work on the class. */ + class = node-pointer; + } + else + { + /* The second time, we work on the meta class. */ + class = class-class_pointer; + done = YES; + } - /* If the method is one of the ones we are looking -for, update the implementation. */ - if (method == method_a) - sarray_at_put_safe (class-dtable, - (sidx) method_a-method_name-sel_id, - method_a-method_imp); + method_list = class-methods; - if (method == method_b) + while (method_list) + { + int i; + + for (i = 0; i method_list-method_count; ++i) { - if (method_b != NULL) + struct objc_method *method = method_list-method_list[i]; + + /* If the method is one of the ones we are +looking for, update the implementation. */ + if (method == method_a) sarray_at_put_safe (class-dtable, - (sidx) method_b-method_name-sel_id, - method_b-method_imp); + (sidx) method_a-method_name-sel_id, + method_a-method_imp); + + if (method == method_b) + { + if (method_b != NULL) + sarray_at_put_safe (class-dtable
ObjC: hide encoding obstacks inside objc-encoding.c
This Objective-C patch does an obvious cleanup of the encoding code internal API, by hiding the obstacks used to create the encoding strings inside objc-encoding.c. This provides a cleaner, simpler API, and improves code modularity. In practice, the patch makes the following changes: * have objc-act.c use the new objc_encoding_init() instead of setting up the obstacks directly; * improve encode_field_decl() to take only the field_decl as argument, and return the encoding string as identifier instead of requiring callers to access and manipulate the obstacks directly. * consequent cleanups, including removing dependency of various files from obstack.h. Ok to commit ? Thanks Index: objc/objc-encoding.c === --- objc/objc-encoding.c(revision 176090) +++ objc/objc-encoding.c(working copy) @@ -53,18 +53,24 @@ along with GCC; see the file COPYING3. If not see /* Set up for use of obstacks. */ #include obstack.h -/* This obstack is used to accumulate the encoding of a data type. - TODO: Make this static. */ -struct obstack util_obstack; +/* This obstack is used to accumulate the encoding of a data type. */ +static struct obstack util_obstack; /* This points to the beginning of obstack contents, so we can free - the whole contents. TODO: Make this static. */ -char *util_firstobj; + the whole contents. */ +static char *util_firstobj; +void objc_encoding_init (void) +{ + gcc_obstack_init (util_obstack); + util_firstobj = (char *) obstack_finish (util_obstack); +} + int generating_instance_variables = 0; static void encode_type_qualifiers (tree); static void encode_type (tree, int, int); +static void encode_field (tree field_decl, int curtype, int format); static tree objc_method_parm_type (tree type) @@ -470,7 +476,7 @@ encode_aggregate_fields (tree type, bool pointed_t obstack_1grow (util_obstack, ''); } - encode_field_decl (field, curtype, format); + encode_field (field, curtype, format); } } @@ -802,8 +808,8 @@ encode_gnu_bitfield (int position, tree type, int obstack_grow (util_obstack, buffer, strlen (buffer)); } -void -encode_field_decl (tree field_decl, int curtype, int format) +static void +encode_field (tree field_decl, int curtype, int format) { #ifdef OBJCPLUS /* C++ static members, and things that are not fields at all, @@ -828,6 +834,25 @@ encode_gnu_bitfield (int position, tree type, int encode_type (TREE_TYPE (field_decl), curtype, format); } +tree +encode_field_decl (tree field_decl) +{ + tree result; + + encode_field (field_decl, + obstack_object_size (util_obstack), + OBJC_ENCODE_DONT_INLINE_DEFS); + + /* Null terminate string. */ + obstack_1grow (util_obstack, 0); + + /* Get identifier for the string. */ + result = get_identifier (XOBFINISH (util_obstack, char *)); + obstack_free (util_obstack, util_firstobj); + + return result; +} + /* This routine encodes the attribute of the input PROPERTY according to following formula: Index: objc/ChangeLog === --- objc/ChangeLog (revision 176090) +++ objc/ChangeLog (working copy) @@ -1,3 +1,30 @@ +2011-07-10 Nicola Pero nicola.p...@meta-innovation.com + + * objc-encoding.h (obstack.h): Do not include. + (util_obstack, util_firstobj): Do not declare. + (encode_field_decl): Updated prototype to return a tree and take a + single tree argument. Updated comments. + * objc-encoding.c (util_obstack, util_firstobj): Made static. + (objc_encoding_init): New. + (encode_field_decl): Existing function renamed to encode_field and + made static. New encode_field_decl wrapper function added. + (encode_aggregate_fields): Update call to encode_field_decl to + call encode_field. + * objc-next-runtime-abi-02.c (obstack.h): Do not include. + (util_obstack, util_firstobj): Do not declare. + (build_v2_ivar_list_initializer): Updated call to + encode_field_decl. + * objc-runtime-shared-support.c (obstack.h): Do not include. + (util_obstack, util_firstobj): Do not declare. + (build_ivar_list_initializer): Updated call to encode_field_decl. + * objc-act.c (objc_init): Use objc_encoding_init. + * Make-lang.in (objc/objc-runtime-shared-support.o): Do not depend + on OBSTACK_H. + (objc/objc-gnu-runtime-abi-01.o): Likewise. + (objc/objc-next-runtime-abi-01.o): Likewise. + (objc/objc-next-runtime-abi-02.o): Likewise. + (objc/objc-act.o): Likewise. + 2011-07-04 Nicola Pero nicola.p...@meta-innovation.com Refactored encoding code into objc-encoding.h and objc-encoding.c. Index: objc/objc-encoding.h === --- objc/objc-encoding.h(revision 176090
Rename attribs.c to attributes.c
This patch renames attribs.c to attributes.c. I can only imagine the short attribs.c name was picked many years ago due to filename restrictions on certain systems ? Nowadays, it seems that we already have plenty of long filenames inside GCC, so there is no reason to use cryptic, newbie-unfriendly, shortened names for files. ;-) Bootstrapped with c,c++,objc,obj-c++,lto,java,fortran,ada,go on Linux i686. OK to commit ? Thanks In gcc/: 2011-06-22 Nicola Pero nicola.p...@meta-innovation.com * attribs.c: Renamed to attributes.c. * Makefile.in: Changed all occurrences of attribs.c and attribs.o to attributes.c and attributes.o. * langhooks.h: Updated comments to refer to attributes.c instead of attribs.c. * plugin.h: Likewise. * tree.h: Likewise. In gcc/ada/: 2011-06-22 Nicola Pero nicola.p...@meta-innovation.com * gcc-interface/Make-lang.in (ADA_BACKEND): Renamed attribs.o to attributes.o. In gcc/cp/: 2011-06-22 Nicola Pero nicola.p...@meta-innovation.com * Make-lang.in (CXX_C_OBJS): Renamed attribs.o to attributes.o. In gcc/fortran/: 2011-06-22 Nicola Pero nicola.p...@meta-innovation.com * Make-lang.in (f951$(exeext)): Replaced attribs.o with attributes.o. In gcc/go/: 2011-06-22 Nicola Pero nicola.p...@meta-innovation.com * Make-lang.in (go1$(exeext)): Rename attribs.o to attributes.o. In gcc/java/: 2011-06-22 Nicola Pero nicola.p...@meta-innovation.com * Make-lang.in (jc1$(exeext)): Renamed attribs.o to attributes.o. In gcc/lto/: 2011-06-22 Nicola Pero nicola.p...@meta-innovation.com * Make-lang.in (LTO_OBJS): Renamed attribs.o to attributes.o Index: gcc/attribs.c === --- gcc/attribs.c (revision 175285) +++ gcc/attribs.c (working copy) @@ -1,485 +0,0 @@ -/* Functions dealing with attribute handling, used by most front ends. - Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, - 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010 - Free Software Foundation, Inc. - -This file is part of GCC. - -GCC is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free -Software Foundation; either version 3, or (at your option) any later -version. - -GCC is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with GCC; see the file COPYING3. If not see -http://www.gnu.org/licenses/. */ - -#include config.h -#include system.h -#include coretypes.h -#include tm.h -#include tree.h -#include flags.h -#include diagnostic-core.h -#include ggc.h -#include tm_p.h -#include cpplib.h -#include target.h -#include langhooks.h -#include hashtab.h -#include plugin.h - -static void init_attributes (void); - -/* Table of the tables of attributes (common, language, format, machine) - searched. */ -static const struct attribute_spec *attribute_tables[4]; - -/* Hashtable mapping names (represented as substrings) to attribute specs. */ -static htab_t attribute_hash; - -/* Substring representation. */ - -struct substring -{ - const char *str; - int length; -}; - -static bool attributes_initialized = false; - -/* Default empty table of attributes. */ - -static const struct attribute_spec empty_attribute_table[] = -{ - { NULL, 0, 0, false, false, false, NULL, false } -}; - -/* Return base name of the attribute. Ie '__attr__' is turned into 'attr'. - To avoid need for copying, we simply return length of the string. */ - -static void -extract_attribute_substring (struct substring *str) -{ - if (str-length 4 str-str[0] == '_' str-str[1] == '_' - str-str[str-length - 1] == '_' str-str[str-length - 2] == '_') -{ - str-length -= 4; - str-str += 2; -} -} - -/* Simple hash function to avoid need to scan whole string. */ - -static inline hashval_t -substring_hash (const char *str, int l) -{ - return str[0] + str[l - 1] * 256 + l * 65536; -} - -/* Used for attribute_hash. */ - -static hashval_t -hash_attr (const void *p) -{ - const struct attribute_spec *const spec = (const struct attribute_spec *) p; - const int l = strlen (spec-name); - - return substring_hash (spec-name, l); -} - -/* Used for attribute_hash. */ - -static int -eq_attr (const void *p, const void *q) -{ - const struct attribute_spec *const spec = (const struct attribute_spec *) p; - const struct substring *const str = (const struct substring *) q; - - return (!strncmp (spec-name, str-str, str-length) !spec-name[str-length]); -} - -/* Initialize attribute tables, and make some sanity checks - if --enable-checking. */ - -static void -init_attributes (void) -{ - size_t i
Re: Rename attribs.c to attributes.c
Huh, I see no reason for this rename. It'll just make patches across releases harder. Sure. But any change will make patches across releases harder ... does it mean we can't make any changes - not even in phase 1 ? :-( The reason I'd like to change the name is that attribs.c is meaningless. I never realized it contained code to deal with attributes until I opened the file and read the code inside. I always thought it contained some sort of mysterious internal GCC data structure or pass. Isn't that a good enough reason to rename it ? :-) Anyhow, if you want to keep the ugly name as it is, let's keep it that way. My next step was going to be to add an attributes.h file, moving into it the attributes functions (lookup_attribute(), is_attribute_p(), merge_attributes(), etc) from tree.h (and moving the corresponding implementations into attributes.c). The idea was to eventually have all the code dealing with attribute lists in these two files, so that it's easy to change the internal representation. And, there are few files actually accessing or manipulating attributes; only these files would include attributes.h, while the other ones - which include tree.h - wouldn't include or depend on the attribute functions. Can I go ahead with this or is it a waste of time as the patch will be rejected ? Presumably the new header file would need to be named attribs.h, and I can't name it attributes.h ? Ouch. Thanks
Re: Patch: speed up compiler a little bit by optimizing lookup_attribute() and is_attribute_p()
is a string constant, and the compiler ! will optimize the strlen() away. */ ! return private_is_attribute_p (attr_name, strlen (attr_name), ident); ! } /* Remove any instances of attribute ATTR_NAME in LIST and return the !modified list. ATTR_NAME must be in the form 'text' (not !'__text__'). */ extern tree remove_attribute (const char *, tree); Index: ChangeLog === *** ChangeLog (revision 175269) --- ChangeLog (working copy) *** *** 1,3 --- 1,32 + 2011-06-21 Nicola Pero nicola.p...@meta-innovation.com + + * attribs.c (register_attribute): Added assert to check that all + attribute specs are registered with a name that is not empty and + does not start with '_'. + (decl_attributes): Avoid the lookup of the naked attribute spec + if the function has no attributes. + * tree.c (is_attribute_with_length_p): Removed. + (is_attribute_p): Removed. + (private_is_attribute_p): New. + (private_lookup_attribute): New. + (lookup_attribute): Removed. + (lookup_ident_attribute): New. + (remove_attribute): Require the first argument to be in the form + 'text', not '__text__'. Updated asserts. + (merge_attributes): Use lookup_ident_attributes instead of + lookup_attribute. + (merge_dllimport_decl_attributes): Use remove_attribute. + (attribute_list_contained): Likewise. + (attribute_list_equal): Immediately return 1 if the arguments are + identical pointers. + * tree.h (is_attribute_p): Made inline. Return a 'bool', not an + 'int'. Require the first argument to be in the form 'text', not + '__text__'. Require the second argument to be an identifier. + (lookup_attribute): Made inline. Require the first argument to be + in the form 'text', not '__text__'. + (private_is_attribute_p, private_lookup_attribute): New. + Updated comments. + 2011-06-21 Georg-Johann Lay a...@gjlay.de PR target/33049
Patch: speed up compiler a little bit by optimizing lookup_attribute() and is_attribute_p()
This patch speeds up the C/C++/ObjC/ObjC++ compiler a little bit by optimizing lookup_attribute() and is_attribute_p(). The main change is that these functions are now inline. Benchmarking the C compiler (--enable-checking=release) compiling postgresql from source shows that total compilation times are reduced by about 0.4% with this patch (saving about 1 second over an average compilation time of 167 seconds). Benchmarking the C++ compiler compiling gold from source shows a similar speedup (about 0.5%). Not a huge speedup, but a real one. The original version of the patch was meant to speed up the Objective-C compiler and used preprocessor macros and some hacks to get a similar performance benefit in an uglier way. I prefer this new version because inline functions make the code neat and easy to read/understand, while providing similar performance benefits. The patch contains the following changes: * a tiny tweak in attribs.c to avoid looking up the attribute specs for the naked attribute for each and every function. If the function has no attributes whatsoever, the lookup is pointless. * a tiny tweak in tree.c to speed up attribute_list_equal() which is almost always called with two identical pointers. * inling of lookup_attribute() and is_attribute_p(). Most of the speedup (at least for the C/ObjC compiler, I haven't really studied the C++ one; it's probably the same) comes from the inling of lookup_attribute(). The reason inlining these functions is a winner is not just because we save a function call each time they are used, but also because the inlining allows further optimizations to be applied; in particular, the first argument (the attribute name) is almost always a fixed string (eg, lookup_attribute (visibility, attrs)) and inlining allows the compiler to optimize the strlen() of the first argument. In the case of lookup_attribute(), the attribute list argument is also almost always NULL; before this patch, even with a NULL attribute argument, you'd still perform at least the function call to lookup_attribute() and then the strlen() of the first argument. With this patch, if the attribute list argument is NULL and the first argument is a string constant, which is the most likely case, nothing (expensive) should usually happen. * changes to lookup_attribute(), is_attribute_p() and remove_attribute() to require the first const char* argument to be in the form text, disallowing the form __text__ (the form __text__ is still allowed in the attribute list; changing that is another simplification I'd like to make, but requires another wave of work). The only place in the compiler where the form __text__ was required was inside tree.c, precisely inside functions that are comparing/merging attribute lists. There I replaced lookup_attribute() with a new static lookup_ident_attribute() which closely matches what is required there. I couldn't find any other place in the compiler where the form __text__ would be required for the first argument, so it seemed pointless to allow it (particularly as, with the inlining, it would now bloat the code). I did document this change, and added asserts to catch cases that may have been missed (and, of course, it all still bootstraps with checking enabled, and works fine for me after the change). I also added an assert in attribs.c where attribute specs are registered to make sure that the names do not start with _. * some tidyups in tree.c (in particular, the removal of is_attribute_with_length_p(), and the addition of lookup_ident_attribute(), which are internal details, consequences of the changes above). OK to commit ? Thanks PS: The next steps would be: - move all the attribute list functions from tree.h/tree.c (ie, lookup_attribute(), remove_attribute(), merge_attributes(), etc) into a separate .h/.c file ? Presumably attribs.h/attribs.c ? - see if we can manage to normalize attributes (eg, from '__text__' to 'text') when storing them in attribute lists; this would simplify/speedup the lookup_attribute() inline call. I expect that would result in faster compilation, but obviously would need to benchmark. I'll submit these as separate patches if I work on them; this one is big enough. PS2: While doing benchmarks, I accidentally benchmarked an older trunk and couldn't but notice that compiling gold with the C++ compiler regressed, in terms of performance, by 1.5% from 2011-05-19 to 2011-06-20. Index: ChangeLog === --- ChangeLog (revision 173917) +++ ChangeLog (working copy) @@ -1,3 +1,24 @@ +2011-06-19 Nicola Pero nicola.p...@meta-innovation.com + + * attribs.c (register_attribute): Added assert to check that all + attribute specs are registered with a name that is not empty and + does not start
Re: libobjc: Remove Traditional Objective-C runtime API
This patch completes the removal of the public part of the Traditional Objective-C runtime API from libobjc. From now on, the only supported API is the Modern API. :-) If you are removing exported functions from libobjc.so, you should bump VERSION= in libobjc/configure.ac. Yes, sure ... shall I do that now ? I'm not done with changes yet. ;-) I suppose we'll bump VERSION only once between 4.6.0 and 4.7.0 ? Or do we want to keep bumping it at every change ? Thanks
Re: libobjc: Remove Traditional Objective-C runtime API
This patch completes the removal of the public part of the Traditional Objective-C runtime API from libobjc. From now on, the only supported API is the Modern API. :-) If you are removing exported functions from libobjc.so, you should bump VERSION= in libobjc/configure.ac. Yes, sure ... shall I do that now ? I'm not done with changes yet. ;-) But - you're right that we should bump it, so I bumped it :-) I suppose we could bump it again when we get into phase 3, when we're finished with the changes. Thanks Index: configure === --- configure (revision 174797) +++ configure (working copy) @@ -2274,7 +2274,7 @@ # We need the following definitions because AC_PROG_LIBTOOL relies on them PACKAGE=libobjc # Version is pulled out to make it a bit easier to change using sed. -VERSION=3:0:0 +VERSION=4:0:0 # This works around the fact that libtool configuration may change LD Index: configure.ac === --- configure.ac(revision 174797) +++ configure.ac(working copy) @@ -27,7 +27,7 @@ # We need the following definitions because AC_PROG_LIBTOOL relies on them PACKAGE=libobjc # Version is pulled out to make it a bit easier to change using sed. -VERSION=3:0:0 +VERSION=4:0:0 AC_SUBST(VERSION) # This works around the fact that libtool configuration may change LD Index: ChangeLog === --- ChangeLog (revision 174797) +++ ChangeLog (working copy) @@ -1,5 +1,10 @@ 2011-06-08 Nicola Pero nicola.p...@meta-innovation.com + * configure.ac (VERSION): Bumped to 4:0:0. + * configure (VERSION): Likewise. + +2011-06-08 Nicola Pero nicola.p...@meta-innovation.com + * objc/README: Updated. * objc-private/selector.h: Updated comments.
Re: libobjc: Remove Traditional Objective-C runtime API
I also bumped the API version #define marker. Committed to trunk. Thanks Index: ChangeLog === --- ChangeLog (revision 174798) +++ ChangeLog (working copy) @@ -1,5 +1,9 @@ 2011-06-08 Nicola Pero nicola.p...@meta-innovation.com + * objc/objc.h (__GNU_LIBOBJC__): Bumped to 20110608. + +2011-06-08 Nicola Pero nicola.p...@meta-innovation.com + * configure.ac (VERSION): Bumped to 4:0:0. * configure (VERSION): Likewise. Index: objc/objc.h === --- objc/objc.h (revision 174797) +++ objc/objc.h (working copy) @@ -43,7 +43,7 @@ release). This macro is only defined starting with the GNU Objective-C Runtime shipped with GCC 4.6.0. If it is not defined, it is either an older version of the runtime, or another runtime. */ -#define __GNU_LIBOBJC__ 20100911 +#define __GNU_LIBOBJC__ 20110608 /* Definition of the boolean type.
Re: libobjc: Remove Traditional Objective-C runtime API
No. The next number is for the next release, and ideally, we want to sit on it for another 10 years or so. We offer no compatibility before the RM says, done with the release. Up until then, you can twiddle, after that, no more changes to the abi, though, you can bug fix it. Sounds good. That was my original understanding - one ABI version per release. For GCC 4.6.0 we bumped the version number after the end of phase 1, which made sense to me, so I was expecting we'd do the same for GCC 4.7.0. But, as Jakub seemed to urge me to bump the version number right now, I got confused about whether there was an expectation of more than one bump per release; maybe to distinguish snapshots from one another or something like that ? Anyhow, we have done the bumping well in advance of the 4.7.0 release and we all seem to agree on what we should be doing (one bump per release), so it's all good. ;-) Thanks
ObjC/ObjC++/testsuite: Remove unused method_get_* functions from next-encode-assist files
This patch removes a number of functions from the ObjC/ObjC++ testsuite next-encode-assist files which are never used in the testsuite ... and will never be, since they have been removed from the GNU runtime. ;-) The next-encode-assist provides a compatible implementation for the NeXT runtime of some special GNU runtime functions. There is obviously no point in providing an implementation of functions that have been removed and are never used. OK to commit ? Thanks Index: ChangeLog === --- ChangeLog (revision 174812) +++ ChangeLog (working copy) @@ -1,3 +1,21 @@ +2011-06-08 Nicola Pero nicola.p...@meta-innovation.com + + * objc-obj-c++-shared/objc-test-suite-next-encode-assist.h + (PMETH, arglist_t): Removed. + (method_get_number_of_arguments): Removed. + (method_get_nth_argument): Removed. + (method_get_first_argument): Removed. + (method_get_next_argument): Removed. + (method_get_sizeof_arguments): Removed. + * objc-obj-c++-shared/objc-test-suite-next-encode-assist-impl.h + (PMETH): Removed. + (method_get_number_of_arguments): Removed. + (method_get_nth_argument): Removed. + (method_get_first_argument): Removed. + (method_get_next_argument): Removed. + (method_get_sizeof_arguments): Removed. + * objc-obj-c++-shared/objc-test-suite-types.h (PMETH): Removed. + 2011-06-08 Rainer Orth r...@cebitec.uni-bielefeld.de PR middle-end/21953 Index: objc-obj-c++-shared/objc-test-suite-next-encode-assist-impl.h === --- objc-obj-c++-shared/objc-test-suite-next-encode-assist-impl.h (revision 174812) +++ objc-obj-c++-shared/objc-test-suite-next-encode-assist-impl.h (working copy) @@ -7,10 +7,8 @@ #include next-abi.h #ifdef NEXT_OBJC_USE_NEW_INTERFACE #include objc/runtime.h -typedef void * PMETH; #else #include objc/objc-runtime.h -typedef struct objc_method * PMETH; #endif /* */ @@ -486,136 +484,7 @@ objc_skip_argspec (const char *type) type = objc_skip_offset (type); return type; } -/* - Return the number of arguments that the method MTH expects. - Note that all methods need two implicit arguments `self' and - `_cmd'. -*/ -int -method_get_number_of_arguments (PMETH mth) -{ - int i = 0; -#ifdef NEXT_OBJC_USE_NEW_INTERFACE - const char *type = method_getTypeEncoding((Method)mth); -#else - const char *type = mth-method_types; -#endif - while (*type) -{ - type = objc_skip_argspec (type); - i += 1; -} - return i - 1; -} -/* - Return the size of the argument block needed on the stack to invoke - the method MTH. This may be zero, if all arguments are passed in - registers. -*/ - -int -method_get_sizeof_arguments (PMETH mth) -{ -#ifdef NEXT_OBJC_USE_NEW_INTERFACE - const char *type = objc_skip_typespec (method_getTypeEncoding((Method)mth)); -#else - const char *type = objc_skip_typespec (mth-method_types); -#endif - return atoi (type); -} - -/* - Return a pointer to the next argument of ARGFRAME. type points to - the last argument. Typical use of this look like: - - { -char *datum, *type; -for (datum = method_get_first_argument (method, argframe, type); - datum; datum = method_get_next_argument (argframe, type)) - { -unsigned flags = objc_get_type_qualifiers (type); -type = objc_skip_type_qualifiers (type); - if (*type != _C_PTR) - [portal encodeData: datum ofType: type]; - else - { - if ((flags _F_IN) == _F_IN) - [portal encodeData: *(char **) datum ofType: ++type]; - } - } - } -*/ - -char * -method_get_next_argument (arglist_t argframe, const char **type) -{ - const char *t = objc_skip_argspec (*type); - - if (*t == '\0') -return 0; - - *type = t; - t = objc_skip_typespec (t); - - if (*t == '+') -return argframe-arg_regs + atoi (++t); - else -return argframe-arg_ptr + atoi (t); -} - -/* - Return a pointer to the value of the first argument of the method - described in M with the given argumentframe ARGFRAME. The type - is returned in TYPE. type must be passed to successive calls of - method_get_next_argument. -*/ -char * -method_get_first_argument (PMETH m, - arglist_t argframe, - const char **type) -{ -#ifdef NEXT_OBJC_USE_NEW_INTERFACE - *type = method_getTypeEncoding((Method)m); -#else - *type = m-method_types; -#endif - - return method_get_next_argument (argframe, type); -} - -/* - Return a pointer to the ARGth argument of the method - M from the frame ARGFRAME. The type of the argument - is returned in the value-result argument TYPE -*/ - -char * -method_get_nth_argument (PMETH m, -arglist_t argframe, int arg, -const char **type) -{ -#ifdef
libobjc: updated documentation for removal of traditional API
This patch (trivially) updates the libobjc documentation to state that the Traditional Objective-C runtime API is no longer available. Committed to trunk. Thanks Index: ChangeLog === --- ChangeLog (revision 174821) +++ ChangeLog (working copy) @@ -1,3 +1,8 @@ +2011-06-09 Nicola Pero nicola.p...@meta-innovation.com + + * doc/objc.texi (Traditional GNU Objective-C runtime API): + Updated. + 2011-06-08 Alexandre Oliva aol...@redhat.com * tree-flow-inline.h (op_iter_init): Reject GIMPLE_PHI stmts. Index: doc/objc.texi === --- doc/objc.texi (revision 174821) +++ doc/objc.texi (working copy) @@ -121,25 +121,9 @@ different naming convention, such as @code{class_g API). Software using this API includes the file @file{objc/objc-api.h} where it is declared. -The traditional API is deprecated but it is still supported in this -release of the runtime; you can access it as usual by including -@file{objc/objc-api.h}. +Starting with GCC 4.7.0, the traditional GNU runtime API is no longer +available. -If you are using the traditional API you are urged to upgrade your -software to use the modern API because the traditional API requires -access to private runtime internals to do anything serious with it; -for this reason, there is no guarantee that future releases of the GNU -Objective-C runtime library will be able to provide a fully compatible -@file{objc/objc-api.h} as the private runtime internals change. It is -expected that the next release will hide a number of runtime internals -making the traditional API nominally supported but fairly useless -beyond very simple use cases. - -Finally, you can not include both @file{objc/objc-api.h} and -@file{objc/runtime.h} at the same time. The traditional and modern -APIs unfortunately have some conflicting declarations (such as the one -for @code{Method}) and can not be used at the same time. - @c = @node Executing code before main @section @code{+load}: Executing code before main
Re: objc/objc++: switch all testcases to Modern Objective-C runtime API
I checked on i686-darwin9 with both m32 and m32/abi=1 the only difference I see is the XPASSes for m64 torture/forward-1.m for gnu runtime. That is very comforting; I have committed the (revised) patch. Thanks a lot for your help testing and reviewing. :-) I will try to test on darwin8 during the week - but time v. limited. I expect there will be a few issues with darwin8; it's all supposed to work there, but software never works until you test it, and I haven't tested it. ;-) If you try, please send me the logs of the failures and I'll fix them. Thanks
objc/objc++: fix most testsuite failures on darwin8
This patch (prepared by me and Iain) fixes almost all failures of the testsuite on Darwin 8 caused by the large testsuite changes I committed yesterday. The patch fixes all the failures but 2. These two require a different small fix that is being developed/tested and will be submitted separately. Thanks Iain for the help! :-) OK to commit ? Thanks Index: ChangeLog === --- ChangeLog (revision 174760) +++ ChangeLog (working copy) @@ -1,3 +1,10 @@ +2011-06-07 Nicola Pero nicola.p...@meta-innovation.com + Iain Sandoe ia...@gcc.gnu.org + + * objc-obj-c++-shared/TestsuiteObject.h ([-free]): Return 'id'. + * objc-obj-c++-shared/TestsuiteObject.m ([-free]): Return 'id'. + Added cast. + 2011-06-07 Rainer Orth r...@cebitec.uni-bielefeld.de gcc/testsuite: Index: objc-obj-c++-shared/TestsuiteObject.h === --- objc-obj-c++-shared/TestsuiteObject.h (revision 174760) +++ objc-obj-c++-shared/TestsuiteObject.h (working copy) @@ -35,7 +35,7 @@ along with GCC; see the file COPYING3. If not see + (id) new; + (id) alloc; - (id) init; -- (void) free; +- (id) free; /* Auxiliary methods. */ + (Class) class; Index: objc-obj-c++-shared/TestsuiteObject.m === --- objc-obj-c++-shared/TestsuiteObject.m (revision 174760) +++ objc-obj-c++-shared/TestsuiteObject.m (working copy) @@ -41,9 +41,14 @@ along with GCC; see the file COPYING3. If not see { return self; } -- (void) free +/* We return 'id' to have the same signature as [Object -free] in + older runtimes and avoid warnings about conflicting signatures. */ +- (id) free { - object_dispose (self); + /* Cast 'self' to 'id' because the NeXT runtime in darwin8 (Apple + Mac OS X 10.4) declares object_dispose to take an Object * + argument. */ + return object_dispose ((id)self); } + (Class) class {
Re: objc/objc++: fix most testsuite failures on darwin8
This patch (written with Iain) fixes all the testsuite failiures on Darwin8. It includes the previous one. OK to commit ? Thanks Index: ChangeLog === --- ChangeLog (revision 174760) +++ ChangeLog (working copy) @@ -1,3 +1,18 @@ +2011-06-07 Nicola Pero nicola.p...@meta-innovation.com + Iain Sandoe ia...@gcc.gnu.org + + * objc-obj-c++-shared/runtime.h (protocol_getMethodDescription): + Added code to deal with the case when [Protocol + -descriptionForInstanceMethod:] or [Protocol + -descriptionForClassMethod:] returns NULL. + +2011-06-07 Nicola Pero nicola.p...@meta-innovation.com + Iain Sandoe ia...@gcc.gnu.org + + * objc-obj-c++-shared/TestsuiteObject.h ([-free]): Return 'id'. + * objc-obj-c++-shared/TestsuiteObject.m ([-free]): Return 'id'. + Added cast. + 2011-06-07 Rainer Orth r...@cebitec.uni-bielefeld.de gcc/testsuite: Index: objc-obj-c++-shared/TestsuiteObject.h === --- objc-obj-c++-shared/TestsuiteObject.h (revision 174761) +++ objc-obj-c++-shared/TestsuiteObject.h (working copy) @@ -35,7 +35,7 @@ along with GCC; see the file COPYING3. If not see + (id) new; + (id) alloc; - (id) init; -- (void) free; +- (id) free; /* Auxiliary methods. */ + (Class) class; Index: objc-obj-c++-shared/runtime.h === --- objc-obj-c++-shared/runtime.h (revision 174761) +++ objc-obj-c++-shared/runtime.h (working copy) @@ -93,14 +93,16 @@ struct objc_method_description protocol_getMethodD struct objc_method_description result; if (instanceMethod) -{ - tmp = [protocol descriptionForInstanceMethod: selector]; - result = *tmp; -} +tmp = [protocol descriptionForInstanceMethod: selector]; else +tmp = [protocol descriptionForClassMethod: selector]; + + if (tmp) +result = *tmp; + else { - tmp = [protocol descriptionForClassMethod: selector]; - result = *tmp; + result.name = (SEL)0; + result.types = (char *)0; } return result; Index: objc-obj-c++-shared/TestsuiteObject.m === --- objc-obj-c++-shared/TestsuiteObject.m (revision 174761) +++ objc-obj-c++-shared/TestsuiteObject.m (working copy) @@ -41,9 +41,14 @@ along with GCC; see the file COPYING3. If not see { return self; } -- (void) free +/* We return 'id' to have the same signature as [Object -free] in + older runtimes and avoid warnings about conflicting signatures. */ +- (id) free { - object_dispose (self); + /* Cast 'self' to 'id' because the NeXT runtime in darwin8 (Apple + Mac OS X 10.4) declares object_dispose to take an Object * + argument. */ + return object_dispose ((id)self); } + (Class) class {
libobjc: remove unused code (patch 1)
-sibling_class = 0; -CLASSOF (impostor)-sibling_class = 0; - } - - /* Check relationship of impostor and super_class is kept. */ - assert (impostor-super_class == super_class); - assert (CLASSOF (impostor)-super_class == CLASSOF (super_class)); - - /* This is how to update the lookup table. Regardless of what the - keys of the hashtable is, change all values that are superclass - into impostor. */ - - objc_mutex_lock (__objc_runtime_mutex); - - class_table_replace (super_class, impostor); - - objc_mutex_unlock (__objc_runtime_mutex); - - /* Next, we update the dispatch tables... */ - __objc_update_dispatch_table_for_class (CLASSOF (impostor)); - __objc_update_dispatch_table_for_class (impostor); - - return impostor; -} Index: ChangeLog === --- ChangeLog (revision 174766) +++ ChangeLog (working copy) @@ -1,5 +1,13 @@ 2011-06-07 Nicola Pero nicola.p...@meta-innovation.com + * class.c (objc_next_class): Removed. + (class_pose_as): Removed. + (CLASSOF): Removed. + (class_table_replace): Removed. + (objc_lookup_class): Removed. + +2011-06-07 Nicola Pero nicola.p...@meta-innovation.com + Removed the Traditional Objective-C runtime public API. * Makefile.in (OBJC_DEPRECATED_H): Variable removed. (install-headers): Do not create the objc/deprecated directory and
libobjc: Remove unused code (patch 2)
Removed more code in libobjc that is no longer used anywhere. Committed to trunk. Thanks Index: encoding.c === --- encoding.c (revision 174766) +++ encoding.c (working copy) @@ -993,22 +993,6 @@ method_getNumberOfArguments (struct objc_method *m } } -int -method_get_number_of_arguments (struct objc_method *mth) -{ - return method_getNumberOfArguments (mth); -} - -/* Return the size of the argument block needed on the stack to invoke - the method MTH. This may be zero, if all arguments are passed in - registers. */ -int -method_get_sizeof_arguments (struct objc_method *mth) -{ - const char *type = objc_skip_typespec (mth-method_types); - return atoi (type); -} - unsigned objc_get_type_qualifiers (const char *type) { Index: ChangeLog === --- ChangeLog (revision 174767) +++ ChangeLog (working copy) @@ -1,5 +1,10 @@ 2011-06-07 Nicola Pero nicola.p...@meta-innovation.com + * encoding.c (method_get_number_of_arguments): Removed. + (method_get_sizeof_arguments): Removed. + +2011-06-07 Nicola Pero nicola.p...@meta-innovation.com + * class.c (objc_next_class): Removed. (class_pose_as): Removed. (CLASSOF): Removed.
libobjc: Remove unused code (patch 3)
prototypes for - malloc, free, etc. on some platforms. It is unclear if we still - need it, but it can't hurt. */ -#define __USE_FIXED_PROTOTYPES__ #include stdlib.h #include stdio.h #include stdarg.h Index: objects.c === --- objects.c (revision 174766) +++ objects.c (working copy) @@ -67,12 +67,6 @@ class_createInstance (Class class, size_t extraByt /* Traditional GNU Objective-C Runtime API. */ id -class_create_instance (Class class) -{ - return class_createInstance (class, 0); -} - -id object_copy (id object, size_t extraBytes) { if ((object != nil) CLS_ISCLASS (object-class_pointer)) @@ -122,4 +116,3 @@ object_setClass (id object, Class class_) return old_class; } } - Index: ChangeLog === --- ChangeLog (revision 174768) +++ ChangeLog (working copy) @@ -1,5 +1,21 @@ 2011-06-07 Nicola Pero nicola.p...@meta-innovation.com + * objc-private/module-abi-8.h (class_get_instance_size): Removed. + * objects.c (class_create_instance): Removed. + * error.c (__USE_FIXED_PROTOTYPES__): Removed. + * gc.c (__objc_generate_gc_type_description): Use + class_getInstanceSize() instead of class_get_instance_size(). + * selector.c (sel_types_match): Made static. + (sel_get_typed_uid): Removed. + (sel_get_any_typed_uid): Removed. + (sel_get_name): Removed. + (sel_get_type): Removed. + (sel_register_name): Removed. + (sel_register_typed_name): Removed. + (sel_get_uid): Removed. + +2011-06-07 Nicola Pero nicola.p...@meta-innovation.com + * encoding.c (method_get_number_of_arguments): Removed. (method_get_sizeof_arguments): Removed. Index: gc.c === --- gc.c(revision 174766) +++ gc.c(working copy) @@ -304,7 +304,7 @@ __objc_generate_gc_type_description (Class class) /* The number of bits in the mask is the size of an instance in bytes divided by the size of a pointer. */ - bits_no = (ROUND (class_get_instance_size (class), sizeof (void *)) + bits_no = (ROUND (class_getInstanceSize (class), sizeof (void *)) / sizeof (void *)); size = ROUND (bits_no, BITS_PER_WORD) / BITS_PER_WORD; mask = objc_atomic_malloc (size * sizeof (int));
libobjc: Remove unused code (patch 4)
Another cleanup patch. Committed to trunk. Thanks Index: sendmsg.c === --- sendmsg.c (revision 174766) +++ sendmsg.c (working copy) @@ -62,7 +62,9 @@ see the files COPYING3 and COPYING.RUNTIME respect #define INVISIBLE_STRUCT_RETURN 0 #endif -/* The uninstalled dispatch table. */ +/* The uninstalled dispatch table. If a class' dispatch table points + to __objc_uninstalled_dtable then that means it needs its dispatch + table to be installed. */ struct sarray *__objc_uninstalled_dtable = 0; /* !T:MUTEX */ /* Two hooks for method forwarding. If either is set, it is invoked to @@ -469,9 +471,6 @@ objc_msg_lookup_super (struct objc_super *super, S return (IMP)nil_method; } -struct objc_method * -class_get_instance_method (Class class, SEL op); - void __objc_init_dispatch_tables () { @@ -645,18 +644,6 @@ class_add_method_list (Class class, struct objc_me } struct objc_method * -class_get_instance_method (Class class, SEL op) -{ - return search_for_method_in_hierarchy (class, op); -} - -struct objc_method * -class_get_class_method (Class class, SEL op) -{ - return search_for_method_in_hierarchy (class, op); -} - -struct objc_method * class_getInstanceMethod (Class class_, SEL selector) { struct objc_method *m; @@ -1001,15 +988,6 @@ __objc_print_dtable_stats (void) objc_mutex_unlock (__objc_runtime_mutex); } -/* Returns the uninstalled dispatch table indicator. If a class' - dispatch table points to __objc_uninstalled_dtable then that means - it needs its dispatch table to be installed. */ -struct sarray * -objc_get_uninstalled_dtable (void) -{ - return __objc_uninstalled_dtable; -} - static cache_ptr prepared_dtable_table = 0; /* This function is called by: objc_msg_lookup, get_imp and Index: ChangeLog === --- ChangeLog (revision 174773) +++ ChangeLog (working copy) @@ -1,5 +1,11 @@ 2011-06-07 Nicola Pero nicola.p...@meta-innovation.com + * sendmsg.c (class_get_instance_method): Removed. + (class_get_class_method): Removed. + (objc_get_uninstalled_dtable): Removed. + +2011-06-07 Nicola Pero nicola.p...@meta-innovation.com + * objc-private/module-abi-8.h (class_get_instance_size): Removed. * objects.c (class_create_instance): Removed. * error.c (__USE_FIXED_PROTOTYPES__): Removed.
libobjc: updated some comments
Committed to trunk. Thanks Index: objc-private/selector.h === --- objc-private/selector.h (revision 174789) +++ objc-private/selector.h (working copy) @@ -28,16 +28,15 @@ see the files COPYING3 and COPYING.RUNTIME respect /* Private runtime functions that may go away or be rewritten or replaced. */ -/* -** Definition of a selector. Selectors themselves are not unique, but -** the sel_id is a unique identifier. -*/ +/* Definition of a selector. Selectors themselves are not unique, but + the sel_id is a unique identifier. */ struct objc_selector { void *sel_id; const char *sel_types; }; +/* An inline, fast version of sel_isEqual(). */ inline static BOOL sel_eq (SEL s1, SEL s2) { Index: ChangeLog === --- ChangeLog (revision 174789) +++ ChangeLog (working copy) @@ -1,3 +1,8 @@ +2011-06-08 Nicola Pero nicola.p...@meta-innovation.com + + * objc/README: Updated. + * objc-private/selector.h: Updated comments. + 2011-06-07 Nicola Pero nicola.p...@meta-innovation.com * sendmsg.c (class_get_instance_method): Removed. Index: objc/README === --- objc/README (revision 174789) +++ objc/README (working copy) @@ -1,13 +1,2 @@ This directory contains the public headers that are installed when libobjc is installed. - -Deprecated parts of the API should be moved into objc/deprecated and -then included by public headers until they are finally removed. For -example, if objc-api.h contains an _objc_unexpected_exception variable -which is then deprecated, it should be moved into a header in -objc/deprecated. This header is then included into objc-api.h. - -The result is that all the deprecated parts of the API are clearly -separated in objc/deprecated, while objc/ retains only the current public -API. -
Fix for PR obj-c++/48275 (getter=namespace failing with .mm)
This patch fixes PR obj-c++/48275. It's a routine parser ingenuity. OK to commit ? Thanks Index: testsuite/ChangeLog === --- testsuite/ChangeLog (revision 174657) +++ testsuite/ChangeLog (working copy) @@ -1,3 +1,9 @@ +2011-06-06 Nicola Pero nicola.p...@meta-innovation.com + + PR objc-++/48275 + * obj-c++.dg/property/cxx-property-1.mm: New. + * obj-c++.dg/property/cxx-property-2.mm: New. + 2011-06-05 Nicola Pero nicola.p...@meta-innovation.com PR testsuite/49287 Index: testsuite/obj-c++.dg/property/cxx-property-2.mm === --- testsuite/obj-c++.dg/property/cxx-property-2.mm (revision 0) +++ testsuite/obj-c++.dg/property/cxx-property-2.mm (revision 0) @@ -0,0 +1,22 @@ +/* { dg-do compile } */ + +/* All these C++ keywords are acceptable in ObjC method names, hence + should be accepted for property getters and setters. */ + +@interface Test +{ + Class isa; +} +@property (getter=namespace) int p0; +@property (setter=namespace:) int p1; +@property (getter=and) int p2; +@property (setter=and:) int p3; +@property (getter=class) int p4; +@property (setter=class:) int p5; +@property (getter=new) int p6; +@property (setter=new:) int p7; +@property (getter=delete) int p8; +@property (setter=delete:) int p9; +@property (getter=delete) int p10; +@property (setter=delete:) int p11; +@end Index: testsuite/obj-c++.dg/property/cxx-property-1.mm === --- testsuite/obj-c++.dg/property/cxx-property-1.mm (revision 0) +++ testsuite/obj-c++.dg/property/cxx-property-1.mm (revision 0) @@ -0,0 +1,10 @@ +/* Testcase from PR obj-c++/48275. */ +/* { dg-do compile } */ + +@interface Test +{ +int ns; +} +@property (getter=namespace) int ns; + +@end Index: cp/ChangeLog === --- cp/ChangeLog(revision 174656) +++ cp/ChangeLog(working copy) @@ -1,3 +1,9 @@ +2011-06-06 Nicola Pero nicola.p...@meta-innovation.com, + + PR obj-c++/48275 + * parser.c (cp_parser_objc_at_property_declaration): Allow setter + and getter names to use all the allowed method names. + 2011-06-04 Jonathan Wakely jwakely@gmail.com * init.c (build_delete): Warn when deleting type with non-virtual Index: cp/parser.c === --- cp/parser.c (revision 174656) +++ cp/parser.c (working copy) @@ -23187,7 +23187,7 @@ cp_parser_objc_at_property_declaration (cp_parser break; } cp_lexer_consume_token (parser-lexer); /* eat the = */ - if (cp_lexer_next_token_is_not (parser-lexer, CPP_NAME)) + if (!cp_parser_objc_selector_p (cp_lexer_peek_token (parser-lexer)-type)) { cp_parser_error (parser, expected identifier); syntax_error = true; @@ -23196,10 +23196,12 @@ cp_parser_objc_at_property_declaration (cp_parser if (keyword == RID_SETTER) { if (property_setter_ident != NULL_TREE) - cp_parser_error (parser, the %setter% attribute may only be specified once); + { + cp_parser_error (parser, the %setter% attribute may only be specified once); + cp_lexer_consume_token (parser-lexer); + } else - property_setter_ident = cp_lexer_peek_token (parser-lexer)-u.value; - cp_lexer_consume_token (parser-lexer); + property_setter_ident = cp_parser_objc_selector (parser); if (cp_lexer_next_token_is_not (parser-lexer, CPP_COLON)) cp_parser_error (parser, setter name must terminate with %:%); else @@ -23208,10 +23210,12 @@ cp_parser_objc_at_property_declaration (cp_parser else { if (property_getter_ident != NULL_TREE) - cp_parser_error (parser, the %getter% attribute may only be specified once); + { + cp_parser_error (parser, the %getter% attribute may only be specified once); + cp_lexer_consume_token (parser-lexer); + } else - property_getter_ident = cp_lexer_peek_token (parser-lexer)-u.value; - cp_lexer_consume_token (parser-lexer); + property_getter_ident = cp_parser_objc_selector (parser); } break; default:
libobjc: remove deprecated API (patch 4)
This patch removes -forward:: from Object. I was planning to do this later, but the previous patch (patch 3) removed -doesNotRecognize:, which was used in the default implementation of -forward::, which generates some ugly warnings when compiling. Removing -forward:: removes the warnings. Please note that at this stage the runtime may still invoke -forward:: if you have it implemented in your own class, and have not installed a custom forwarding routine. There are testcases in the GCC testsuite that test this. This will all go away later, and will require removing the testcases, but at the same time I'd like to add new testcases for __objc_msg_forward and __objc_msg_forward2, which are the actual hooks used in practice by users of libobjc, but which currently are not really tested. For now, this patch just removes [Object -forward::], which is deprecated, and makes libobjc compile again without warnings. Committed to trunk. Thanks Index: sendmsg.c === --- sendmsg.c (revision 174593) +++ sendmsg.c (working copy) @@ -936,9 +936,12 @@ __objc_block_forward (id rcv, SEL op, ...) } -/* This function is installed in the dispatch table for all methods - which are not implemented. Thus, it is called when a selector is - not recognized. */ +/* This function is called for methods which are not implemented, + unless a custom forwarding routine has been installed. Please note + that most serious users of libobjc (eg, GNUstep base) do install + their own forwarding routines, and hence this is never actually + used. But, if no custom forwarding routine is installed, this is + called when a selector is not recognized. */ static retval_t __objc_forward (id object, SEL sel, arglist_t args) { Index: ChangeLog === --- ChangeLog (revision 174594) +++ ChangeLog (working copy) @@ -1,5 +1,11 @@ 2011-06-03 Nicola Pero nicola.p...@meta-innovation.com + * Object.m ([-forward::]): Removed. + * objc/deprecated/Object.h ([-forward::]): Removed. + * sendmsg.c (__objc_forward): Updated comments. + +2011-06-03 Nicola Pero nicola.p...@meta-innovation.com + * Makefile.in (OBJC_H): Removed objc-list.h. (OBJC_DEPRECATED_H): Removed objc-list.h. * objc/objc-list.h: File removed. Index: Object.m === --- Object.m(revision 174593) +++ Object.m(working copy) @@ -248,12 +248,6 @@ see the files COPYING3 and COPYING.RUNTIME respect :class_get_class_method(self-isa, aSel))); } -- (retval_t)forward:(SEL)aSel :(arglist_t)argFrame -{ - (void) argFrame; /* UNUSED */ - return (retval_t)[self doesNotRecognize: aSel]; -} - - (retval_t)performv:(SEL)aSel :(arglist_t)argFrame { return objc_msg_sendv(self, aSel, argFrame); Index: objc/deprecated/Object.h === --- objc/deprecated/Object.h(revision 174593) +++ objc/deprecated/Object.h(working copy) @@ -49,7 +49,6 @@ - (struct objc_method_description *)descriptionForMethod:(SEL)aSel; /* Forwarding */ -- (retval_t)forward:(SEL)aSel :(arglist_t)argFrame; - (retval_t)performv:(SEL)aSel :(arglist_t)argFrame; /* Posing */
libobjc: remove deprecated API (patch 5)
This patch removes objc/hash.h and objc/sarray.h, which had been deprecated in GCC 4.6.0. Of course, libobjc still has its own private versions, but they are (finally!) private so we have made another step towards being able to change the libobjc internals at will without having to change the public API. :-) Committed to trunk. Thanks Index: libobjc/Makefile.in === --- libobjc/Makefile.in (revision 174594) +++ libobjc/Makefile.in (working copy) @@ -122,10 +122,7 @@ OBJC_H = \ objc-api.h \ objc-decls.h \ runtime.h \ - thr.h \ - \ - hash.h \ - sarray.h + thr.h # User-visible header files containing deprecated APIs, from the # objc/deprecated directory @@ -135,14 +132,12 @@ OBJC_DEPRECATED_H = \ Object.h \ Protocol.h \ STR.h \ - hash.h \ objc_get_uninstalled_dtable.h \ objc_malloc.h \ objc_msg_sendv.h \ objc_object_alloc.h \ objc_unexpected_exception.h \ objc_valloc.h \ - sarray.h \ struct_objc_category.h \ struct_objc_class.h \ struct_objc_ivar.h \ Index: libobjc/objc-private/common.h === --- libobjc/objc-private/common.h (revision 174593) +++ libobjc/objc-private/common.h (working copy) @@ -28,11 +28,6 @@ see the files COPYING3 and COPYING.RUNTIME respect /* This file contains definitions that should be included by all .c and .m files in libobjc. */ -/* This variable allows the public headers to determine when they are - being included by a file inside libobjc itself, or when they are - being included by an external file. */ -#define GNU_LIBOBJC_COMPILING_LIBOBJC_ITSELF 1 - /* When debugging libobjc, add #define DEBUG 1 Index: libobjc/libobjc.def === --- libobjc/libobjc.def (revision 174593) +++ libobjc/libobjc.def (working copy) @@ -23,8 +23,6 @@ LIBRARY libobjc EXPORTS search_for_method_in_list objc_get_uninstalled_dtable -objc_hash_is_key_in_hash -hash_is_key_in_hash _objc_load_callback objc_malloc objc_atomic_malloc @@ -106,22 +104,3 @@ objc_get_class objc_get_meta_class objc_lookup_class objc_next_class -sarray_at_put -sarray_at_put_safe -sarray_free -sarray_lazy_copy -sarray_new -sarray_realloc -sarray_remove_garbage -objc_hash_add -hash_add -objc_hash_delete -hash_delete -objc_hash_new -hash_new -objc_hash_next -hash_next -objc_hash_remove -hash_remove -objc_hash_value_for_key -hash_value_for_key Index: libobjc/ChangeLog === --- libobjc/ChangeLog (revision 174607) +++ libobjc/ChangeLog (working copy) @@ -1,5 +1,25 @@ 2011-06-03 Nicola Pero nicola.p...@meta-innovation.com + * Makefile.in (OBJC_H): Removed hash.h and sarray.h. + (OBJC_DEPRECATED_H): Likewise. + * libobjc.def (objc_hash_new, objc_hash_delete, objc_hash_add, + objc_hash_remove, objc_hash_next, objc_hash_value_for_key, + objc_hash_is_key_in_hash, hash_add, hash_delete, hash_new, + hash_next, hash_remove, hash_value_for_key, hash_is_key_in_hash, + sarray_at_put, sarray_at_put_safe, sarray_free, sarray_lazy_copy, + sarray_new, sarray_realloc, sarray_remove_garbage): Removed. + * objc/sarray.h: Removed. + * objc/hash.h: Removed. + * objc/deprecated/sarray.h: Removed. + * objc/deprecated/hash.h: Removed. + * objc/Object.h: Do not include objc/deprecated/hash.h + * Object.m: Include string.h. + * objc/objc-api.h: Do not include objc/deprecated/hash.h. + * objc-private/common.h (GNU_LIBOBJC_COMPILING_LIBOBJC_ITSELF): + Removed. + +2011-06-03 Nicola Pero nicola.p...@meta-innovation.com + * Object.m ([-forward::]): Removed. * objc/deprecated/Object.h ([-forward::]): Removed. * sendmsg.c (__objc_forward): Updated comments. Index: libobjc/Object.m === --- libobjc/Object.m(revision 174607) +++ libobjc/Object.m(working copy) @@ -25,6 +25,7 @@ see the files COPYING3 and COPYING.RUNTIME respect #include objc-private/common.h #include stdarg.h +#include string.h /* For strcmp. */ #include errno.h #include objc/Object.h #include objc/Protocol.h Index: libobjc/objc/sarray.h === --- libobjc/objc/sarray.h (revision 174593) +++ libobjc/objc/sarray.h (working copy) @@ -1,2 +0,0 @@ -#include deprecated/sarray.h - Index: libobjc/objc/Object.h === --- libobjc/objc/Object.h (revision 174593) +++ libobjc/objc/Object.h (working copy) @@ -57,7 +57,6 @@ extern C { /* All of the following includes were deprecated in GCC 4.6 and will be removed in the next release. */ -#include deprecated/hash.h #include deprecated/Object.h #ifdef
libobjc: remove deprecate API (patch 6)
This trivial patch removes the deprecated definition of STR. Committed to trunk. Thanks Index: Makefile.in === --- Makefile.in (revision 174610) +++ Makefile.in (working copy) @@ -131,7 +131,6 @@ MetaClass.h \ Object.h \ Protocol.h \ - STR.h \ objc_get_uninstalled_dtable.h \ objc_malloc.h \ objc_msg_sendv.h \ Index: ChangeLog === --- ChangeLog (revision 174610) +++ ChangeLog (working copy) @@ -1,5 +1,11 @@ 2011-06-03 Nicola Pero nicola.p...@meta-innovation.com + * objc/objc.h: Do not include deprecated/STR.h. + * objc/deprecated/STR.h: Removed. + * Makefile.in (OBJC_DEPRECATED_H): removed STR.h. + +2011-06-03 Nicola Pero nicola.p...@meta-innovation.com + * Makefile.in (OBJC_H): Removed hash.h and sarray.h. (OBJC_DEPRECATED_H): Likewise. * libobjc.def (objc_hash_new, objc_hash_delete, objc_hash_add, Index: objc/deprecated/STR.h === --- objc/deprecated/STR.h (revision 174593) +++ objc/deprecated/STR.h (working copy) @@ -1,2 +0,0 @@ -/* Incredibly obsolete. */ -typedef char *STR; /* String alias */ Index: objc/objc.h === --- objc/objc.h (revision 174593) +++ objc/objc.h (working copy) @@ -125,8 +125,6 @@ compiler to do some type-checking. */ #define Nil (Class)0 -#include deprecated/STR.h - /* TODO: Move the 'Protocol' declaration into objc/runtime.h. A Protocol is simply an object, not a basic Objective-C type. The Apple runtime defines Protocol in objc/runtime.h too, so it's good
libobjc: remove deprecated API (patch 8)
This patch removes the deprecated definition of METHOD_NULL. Committed to trunk. Thanks Index: Makefile.in === --- Makefile.in (revision 174615) +++ Makefile.in (working copy) @@ -127,7 +127,6 @@ OBJC_H = \ # User-visible header files containing deprecated APIs, from the # objc/deprecated directory OBJC_DEPRECATED_H = \ - METHOD_NULL.h \ MetaClass.h \ Object.h \ Protocol.h \ Index: ChangeLog === --- ChangeLog (revision 174615) +++ ChangeLog (working copy) @@ -1,5 +1,11 @@ 2011-06-03 Nicola Pero nicola.p...@meta-innovation.com + * Makefile.in (OBJC_DEPRECATED_H): Removed METHOD_NULL.h. + * objc/objc-api.h: Do not include deprecated/METHOD_NULL.h. + * objc/deprecated/METHOD_NULL.h: Removed. + +2011-06-03 Nicola Pero nicola.p...@meta-innovation.com + * Makefile.in (OBJC_DEPRECATED_H): Removed objc_valloc.h, objc_malloc.h and objc_unexpected_exception.h. (exception.lo): Do not use -Wno-deprecated-declarations. Index: objc/deprecated/METHOD_NULL.h === --- objc/deprecated/METHOD_NULL.h (revision 174593) +++ objc/deprecated/METHOD_NULL.h (working copy) @@ -1,2 +0,0 @@ -/* For functions which return Method_t */ -#define METHOD_NULL(Method_t)0 Index: objc/objc-api.h === --- objc/objc-api.h (revision 174615) +++ objc/objc-api.h (working copy) @@ -58,8 +58,6 @@ see the files COPYING3 and COPYING.RUNTIME respect extern C { #endif /* __cplusplus */ -#include deprecated/METHOD_NULL.h - /* Method descriptor returned by introspective Object methods. This is really just the first part of the more complete objc_method structure defined below and used internally by the runtime. */
libobjc: remove deprecated API (patch 9)
This patch removes more deprecated and obsolete hooks/functions from libobjc. Committed to trunk. Thanks Index: Makefile.in === --- Makefile.in (revision 174616) +++ Makefile.in (working copy) @@ -132,7 +132,6 @@ OBJC_DEPRECATED_H = \ Protocol.h \ objc_get_uninstalled_dtable.h \ objc_msg_sendv.h \ - objc_object_alloc.h \ struct_objc_category.h \ struct_objc_class.h \ struct_objc_ivar.h \ Index: libobjc.def === --- libobjc.def (revision 174615) +++ libobjc.def (working copy) @@ -48,9 +48,6 @@ objc_thread_remove __objc_class_name_Object __objc_class_name_Protocol __objc_class_name_NXConstantString -__objc_object_alloc -__objc_object_copy -__objc_object_dispose class_create_instance object_copy object_dispose Index: objects.c === --- objects.c (revision 174593) +++ objects.c (working copy) @@ -123,8 +123,3 @@ object_setClass (id object, Class class_) } } -/* Hook functions for memory allocation and disposal. Deprecated and - currently unused. */ -id (*_objc_object_alloc) (Class) = 0; -id (*_objc_object_dispose) (id)= 0; -id (*_objc_object_copy) (id) = 0; Index: ChangeLog === --- ChangeLog (revision 174616) +++ ChangeLog (working copy) @@ -1,5 +1,15 @@ 2011-06-03 Nicola Pero nicola.p...@meta-innovation.com + * Makefile.in (OBJC_DEPRECATED_H): Removed objc_object_alloc.h. + * objc/deprecated/objc_object_alloc.h: Removed. + * objc/objc-api.h: Do not include deprecated/objc_object_alloc.h. + * objects.c (_objc_object_alloc, _objc_object_dispose, + _objc_object_copy): Removed. + * libobjc.def (__objc_object_alloc, __objc_object_copy, + __objc_object_dispose): Removed. + +2011-06-03 Nicola Pero nicola.p...@meta-innovation.com + * Makefile.in (OBJC_DEPRECATED_H): Removed METHOD_NULL.h. * objc/objc-api.h: Do not include deprecated/METHOD_NULL.h. * objc/deprecated/METHOD_NULL.h: Removed. Index: objc/deprecated/objc_object_alloc.h === --- objc/deprecated/objc_object_alloc.h (revision 174593) +++ objc/deprecated/objc_object_alloc.h (working copy) @@ -1,8 +0,0 @@ -/* These functions are deprecated and currently ignored. */ -/* -** Hook functions for allocating, copying and disposing of instances -*/ -objc_EXPORT id (*_objc_object_alloc)(Class _class);Index: objc/objc-api.h === --- objc/objc-api.h (revision 174616) +++ objc/objc-api.h (working copy) @@ -191,8 +191,6 @@ objc_EXPORT Class (*_objc_lookup_class)(const char */ objc_EXPORT void (*_objc_load_callback)(Class _class, Category* category); -#include deprecated/objc_object_alloc.h - /* Standard functions for memory allocation and disposal. Users should use these functions in their ObjC programs so that they work so that -objc_EXPORT id (*_objc_object_copy)(id object); -objc_EXPORT id (*_objc_object_dispose)(id object); -
libobjc: remove deprecated API (patch 10)
This patch removes another couple of deprecated header fragments. Note that this starts to remove pieces of the Traditional API, which will be entirely removed in GCC 4.7.0. Of course, that requires switching all testcases to use the Modern API when compiling for the GNU runtime, but we'll get there. ;-) Committed to trunk. Thanks Index: Makefile.in === --- Makefile.in (revision 174617) +++ Makefile.in (working copy) @@ -130,7 +130,6 @@ MetaClass.h \ Object.h \ Protocol.h \ - objc_get_uninstalled_dtable.h \ objc_msg_sendv.h \ struct_objc_category.h \ struct_objc_class.h \ @@ -142,7 +141,6 @@ struct_objc_protocol.h \ struct_objc_protocol_list.h \ struct_objc_selector.h \ - struct_objc_static_instances.h \ struct_objc_symtab.h # Objective-C source files to compile Index: ChangeLog === --- ChangeLog (revision 174617) +++ ChangeLog (working copy) @@ -1,5 +1,14 @@ 2011-06-03 Nicola Pero nicola.p...@meta-innovation.com + * Makefile.in (OBJC_DEPRECATED_H): Removed struct_objc_static_instances.h + and objc_get_uninstalled_dtable.h. + * objc/deprecated/struct_objc_static_instances.h: Removed. + * objc/deprecated/objc_get_uninstalled_dtable.h: Removed. + * objc/objc-api.h: Do not include deprecated/objc_static_instances.h + and deprecated/objc_get_uninstalled_dtable.h. + +2011-06-03 Nicola Pero nicola.p...@meta-innovation.com + * Makefile.in (OBJC_DEPRECATED_H): Removed objc_object_alloc.h. * objc/deprecated/objc_object_alloc.h: Removed. * objc/objc-api.h: Do not include deprecated/objc_object_alloc.h. Index: objc/deprecated/objc_get_uninstalled_dtable.h === --- objc/deprecated/objc_get_uninstalled_dtable.h (revision 174593) +++ objc/deprecated/objc_get_uninstalled_dtable.h (working copy) @@ -1,2 +0,0 @@ -objc_EXPORT struct sarray* -objc_get_uninstalled_dtable(void); Index: objc/deprecated/struct_objc_static_instances.h === --- objc/deprecated/struct_objc_static_instances.h (revision 174593) +++ objc/deprecated/struct_objc_static_instances.h (working copy) @@ -1,14 +0,0 @@ -/* For every class which happens to have statically allocated instances in - this module, one OBJC_STATIC_INSTANCES is allocated by the compiler. - INSTANCES is NULL terminated and points to all statically allocated - instances of this class. */ -struct objc_static_instances -{ - char *class_name; -#ifdef __cplusplus - id instances[1]; -#else - id instances[0]; -#endif -}; - Index: objc/objc-api.h === --- objc/objc-api.h (revision 174617) +++ objc/objc-api.h (working copy) @@ -104,7 +104,6 @@ equivalent to *. */ #define _C_ATOM '%' -#include deprecated/struct_objc_static_instances.h #include deprecated/struct_objc_symtab.h #include deprecated/struct_objc_module.h #include deprecated/struct_objc_ivar.h @@ -385,8 +384,6 @@ !object_is_class (object)); } -#include deprecated/objc_get_uninstalled_dtable.h - #ifdef __cplusplus } #endif /* __cplusplus */
Fix for PR objc/48539 (Missing warning when messaging a forward-declared class)
’ not found [enabled by default] which I hope is clear and to the point (and the action expected from the programmer, which is adding or including the @interface, is hopefully evident). As a comparison, clang has the warning method-lookup-1.m:42:4: warning: receiver 'NotKnown' is a forward class and corresponding @interface may not exist which I find confusing and hard to read (and react to) for various reasons. -- I added testcases with enumerations of cases and combinations to make sure I was covering the various complications. I did add a fair amount of comments to the code as well. :-) Ok to commit to trunk ? Thanks Index: objc/ChangeLog === --- objc/ChangeLog (revision 174551) +++ objc/ChangeLog (working copy) @@ -1,3 +1,12 @@ +2011-06-02 Nicola Pero nicola.p...@meta-innovation.com + + PR objc/48539 + * objc-act.c (objc_finish_message_expr): Warn if messaging a class + that was only declared using @class without an @interface. Warn + if messaging an instance of a class that was only declared using + @class without an @interface, unless the receiver was also typed + with a protocol list. + 2011-06-01 Nicola Pero nicola.p...@meta-innovation.com * objc-act.c (objc_decl_method_attributes): Implement nonnull Index: objc/objc-act.c === --- objc/objc-act.c (revision 174551) +++ objc/objc-act.c (working copy) @@ -5432,15 +5432,21 @@ objc_finish_message_expr (tree receiver, tree sel_ from the implementation context). */ rtype = receiver; while (TREE_CODE (rtype) == COMPOUND_EXPR - || TREE_CODE (rtype) == MODIFY_EXPR - || CONVERT_EXPR_P (rtype) - || TREE_CODE (rtype) == COMPONENT_REF) +|| TREE_CODE (rtype) == MODIFY_EXPR +|| CONVERT_EXPR_P (rtype) +|| TREE_CODE (rtype) == COMPONENT_REF) rtype = TREE_OPERAND (rtype, 0); + /* self is 1 if this is a message to self, 0 otherwise */ self = (rtype == self_decl); + + /* super is 1 if this is a message to super, 0 otherwise. */ super = (rtype == UOBJC_SUPER_decl); + + /* rtype is the type of the receiver. */ rtype = TREE_TYPE (receiver); + /* have_cast is 1 if the receiver is casted. */ have_cast = (TREE_CODE (receiver) == NOP_EXPR || (TREE_CODE (receiver) == COMPOUND_EXPR !IS_SUPER (rtype))); @@ -5450,7 +5456,10 @@ objc_finish_message_expr (tree receiver, tree sel_ should_call_super_dealloc = 0; /* If the receiver is a class object, retrieve the corresponding - @interface, if one exists. */ + @interface, if one exists. class_tree is the class name + identifier, or NULL_TREE if this is not a class method or the + class name could not be determined (as in the case Class c; [c + method];). */ class_tree = receiver_is_class_object (receiver, self, super); /* Now determine the receiver type (if an explicit cast has not been @@ -5458,7 +5467,27 @@ objc_finish_message_expr (tree receiver, tree sel_ if (!have_cast) { if (class_tree) - rtype = lookup_interface (class_tree); + { + /* We are here when we have no cast, and we have a class +name. So, this is a plain method to a class object, as +in [NSObject alloc]. Find the interface corresponding to +the class name. */ + rtype = lookup_interface (class_tree); + + if (rtype == NULL_TREE) + { + /* If 'rtype' is NULL_TREE at this point it means that +we have seen no @interface corresponding to that +class name, only a @class declaration. So, we have a +class name (class_tree) but no actual details of the +class methods. We won't be able to check that the +class responds to the method, and we will have to +guess the method prototype. Emit a warning, then +keep going (this will use any method with a matching +name, as if the receiver was of type 'Class'). */ + warning (0, @interface of class %qE not found, class_tree); + } + } /* Handle `self' and `super'. */ else if (super) { @@ -5474,28 +5503,41 @@ objc_finish_message_expr (tree receiver, tree sel_ rtype = lookup_interface (CLASS_NAME (implementation_template)); } - /* If receiver is of type `id' or `Class' (or if the @interface for a - class is not visible), we shall be satisfied with the existence of - any instance or class method. */ if (objc_is_id (rtype)) { + /* The receiver is of type 'id' or 'Class' (with or without some +protocols attached to it). */ + + /* We set class_tree to the identifier for 'Class' if this is a +class method
libobjc: remove deprecated API (patch 1)
This patch removes a number of deprecated libobjc functions and methods, which are part of the Traditional Objective-C API that was deprecated in GCC 4.6.x and are to be removed in GCC 4.7.0. It's the first of a long sequence of patches that does this removal one bit at a time. This one removes the deprecated objc_error(), objc_verror() and objc_set_error_handler() functions, and all the deprecated Object methods whose implementation used to use these functions. Unfortunately, all of our testcases use the Traditional Objective-C API when testing the GNU runtime and they will need to be updated to use the Modern Objective-C API because the Traditional Objective-C API is simply going away. I'll update the relevant testcases with each patch. This first patch requires only a tiny update of a single testcase. Committed to trunk. Thanks Index: libobjc/sendmsg.c === --- libobjc/sendmsg.c (revision 174585) +++ libobjc/sendmsg.c (working copy) @@ -977,16 +977,8 @@ __objc_forward (id object, SEL sel, arglist_t args : instance ), object-class_pointer-name, sel_getName (sel)); -/* TODO: support for error: is surely deprecated ? */ -err_sel = sel_get_any_uid (error:); -if (__objc_responds_to (object, err_sel)) - { - imp = get_implementation (object, object-class_pointer, err_sel); - return (*imp) (object, sel_get_any_uid (error:), msg); - } - -/* The object doesn't respond to doesNotRecognize: or error:; - Therefore, a default action is taken. */ +/* The object doesn't respond to doesNotRecognize:. Therefore, a + default action is taken. */ _objc_abort (%s\n, msg); return 0; Index: libobjc/Makefile.in === --- libobjc/Makefile.in (revision 174585) +++ libobjc/Makefile.in (working copy) @@ -139,7 +139,6 @@ OBJC_DEPRECATED_H = \ STR.h \ hash.h \ objc-list.h \ - objc_error.h \ objc_get_uninstalled_dtable.h \ objc_malloc.h \ objc_msg_sendv.h \ Index: libobjc/libobjc.def === --- libobjc/libobjc.def (revision 174585) +++ libobjc/libobjc.def (working copy) @@ -25,7 +25,6 @@ search_for_method_in_list objc_get_uninstalled_dtable objc_hash_is_key_in_hash hash_is_key_in_hash -objc_verror _objc_load_callback objc_malloc objc_atomic_malloc @@ -53,7 +52,6 @@ objc_thread_remove __objc_class_name_Object __objc_class_name_Protocol __objc_class_name_NXConstantString -objc_error __objc_object_alloc __objc_object_copy __objc_object_dispose Index: libobjc/error.c === --- libobjc/error.c (revision 174585) +++ libobjc/error.c (working copy) @@ -45,53 +45,3 @@ _objc_abort (const char *fmt, ...) abort (); va_end (ap); } - -/* The rest of the file is deprecated. */ -#include objc/objc-api.h /* For objc_error_handler. */ - -/* -** Error handler function -** NULL so that default is to just print to stderr -*/ -static objc_error_handler _objc_error_handler = NULL; - -/* Trigger an objc error */ -void -objc_error (id object, int code, const char *fmt, ...) -{ - va_list ap; - - va_start (ap, fmt); - objc_verror (object, code, fmt, ap); - va_end (ap); -} - -/* Trigger an objc error */ -void -objc_verror (id object, int code, const char *fmt, va_list ap) -{ - BOOL result = NO; - - /* Call the error handler if its there - Otherwise print to stderr */ - if (_objc_error_handler) -result = (*_objc_error_handler) (object, code, fmt, ap); - else -vfprintf (stderr, fmt, ap); - - /* Continue if the error handler says its ok - Otherwise abort the program */ - if (result) -return; - else -abort (); -} - -/* Set the error handler */ -objc_error_handler -objc_set_error_handler (objc_error_handler func) -{ - objc_error_handler temp = _objc_error_handler; - _objc_error_handler = func; - return temp; -} Index: libobjc/ChangeLog === --- libobjc/ChangeLog (revision 174585) +++ libobjc/ChangeLog (working copy) @@ -1,3 +1,19 @@ +2011-06-02 Nicola Pero nicola.p...@meta-innovation.com + + * Makefile.in (OBJC_DEPRECATED_H): Removed objc_error.h. + * objc/deprecated/objc_error.h: Removed. + * objc/objc-api.h: Do not include deprecated/objc_error.h. + * libobjc.def (objc_error, objc_verror): Removed. + * error.c (_objc_error_handler, objc_error, objc_verror, + objc_set_error_handler): Removed. + * Object.m ([-error:], [-perform:], [-perform:with:], + [-perform:with:with], [-subclassResponsibility:], + [-notImplemented:], [-shouldNotImplement:], [-doesNotRecognize:]): + Removed. + * objc/deprecated/Object.h: Removed the same methods. + * sendmsg.c (__objc_forward): Do not try
ObjC/ObjC++: Add support for nonnull attribute for ObjC methods
This patch adds support for the nonnull attribute for Objective-C methods (clang has it too). The implementation follows the existing framework and is very similar to the format attribute one. Testcases included. Ok to commit ? Thanks PS: There is a small unsatisfactory issue with the generated warnings, which are too correct :-) in that they say something like xxx.m:89:3: warning: null argument where non-null required (argument 3) [-Wnonnull] and the argument 3 index includes the 2 hidden Objective-C method arguments (self and _cmd). I'd rather it didn't, and I'd rather that the warning said argument 1 instead. Note that the format attribute, as implemented, already has this problem, but you never notice because the warnings it generates never mention the argument index ;-) But, changing the warnings requires refactoring and more radical changes (including changes to c-family), which I'd rather leave for a separate patch. I added a FIXME in the code about the issue. Index: objc/ChangeLog === --- objc/ChangeLog (revision 174335) +++ objc/ChangeLog (working copy) @@ -1,3 +1,8 @@ +2011-05-27 Nicola Pero nicola.p...@meta-innovation.com + + * objc-act.c (objc_decl_method_attributes): Implement nonnull + attribute for Objective-C methods. + 2011-05-21 Nicola Pero nicola.p...@meta-innovation.com * config-lang.in (gtfiles): Updated order of files to fix building Index: objc/objc-act.c === --- objc/objc-act.c (revision 174335) +++ objc/objc-act.c (working copy) @@ -5042,6 +5042,48 @@ objc_decl_method_attributes (tree *node, tree attr filtered_attributes = chainon (filtered_attributes, new_attribute); } + else if (is_attribute_p (nonnull, name)) + { + /* We need to fixup all the argument indexes by adding 2 +for the two hidden arguments of an Objective-C method +invocation, similat to what we do above for the +format attribute. */ + /* FIXME: This works great in terms of implementing the +functionality, but the warnings that are produced by +nonnull do mention the argument index (while the +format ones don't). For example, you could get +warning: null argument where non-null required +(argument 3). Now in that message, argument 3 +includes the 2 hidden arguments; it would be much +more friendly to call it argument 1, as that would +be consistent with __attribute__ ((nonnnull (1))). +To do this, we'd need to have the C family code that +checks the arguments know about adding/removing 2 to +the argument index ... or alternatively we could +maybe store the printable argument index in +addition to the actual argument index ? Some +refactoring is needed to do this elegantly. */ + tree new_attribute = copy_node (attribute); + tree argument = TREE_VALUE (attribute); + while (argument != NULL_TREE) + { + /* Get the value of the argument and add 2. */ + tree number = TREE_VALUE (argument); + if (number + TREE_CODE (number) == INTEGER_CST + TREE_INT_CST_HIGH (number) == 0 + TREE_INT_CST_LOW (number) != 0) + { + TREE_VALUE (argument) + = build_int_cst (integer_type_node, +TREE_INT_CST_LOW (number) + 2); + } + argument = TREE_CHAIN (argument); + } + + filtered_attributes = chainon (filtered_attributes, +new_attribute); + } else warning (OPT_Wattributes, %qE attribute directive ignored, name); } Index: testsuite/ChangeLog === --- testsuite/ChangeLog (revision 174335) +++ testsuite/ChangeLog (working copy) @@ -1,3 +1,8 @@ +2011-05-27 Nicola Pero nicola.p...@meta-innovation.com + + * objc.dg/attributes/method-nonnull-1.m: New test. + * obj-c++.dg/attributes/method-nonnull-1.mm: New test. + 2011-05-27 Richard Guenther rguent...@suse.de * gcc.c-torture/execute/920711-1.x: Add -fwrapv. Index: testsuite/objc.dg/attributes/method-nonnull-1.m === --- testsuite/objc.dg/attributes/method-nonnull-1.m (revision 0) +++ testsuite/objc.dg/attributes/method-nonnull-1.m (revision 0) @@ -0,0 +1,46
Remove dependency of all-target-libobjc on maybe-all-target-libiberty
This patch removes the (maybe) dependency of libobjc from target libiberty from the makefiles. I don't know of any reasons why libobjc would need target libiberty; I also looked around and couldn't spot anything. Most other target libraries don't depend on libiberty; I'm not sure why libobjc would need to. I think the dependency is bogus, probably exists for historical reasons and the fact that nobody reviewed that piece of code for a long time, and should go away. :-) It wouldn't matter much, but I saw that some people are keen to remove the target libiberty completely, and I wouldn't want them to spend time trying to figure out why libobjc needs it. It doesn't. ;-) Ok to commit ? Thanks Index: Makefile.in === --- Makefile.in (revision 174141) +++ Makefile.in (working copy) @@ -43412,7 +43412,6 @@ all-target-libjava: maybe-all-target-boehm-gc all-target-libjava: maybe-all-target-libffi configure-target-libobjc: maybe-configure-target-boehm-gc -all-target-libobjc: maybe-all-target-libiberty all-target-libobjc: maybe-all-target-boehm-gc all-target-libstdc++-v3: maybe-all-target-libiberty configure-target-libstdc++-v3: maybe-configure-target-libgomp Index: ChangeLog === --- ChangeLog (revision 174141) +++ ChangeLog (working copy) @@ -1,3 +1,8 @@ +2011-05-27 Nicola Pero nicola.p...@meta-innovation.com + + * Makefile.in (all-target-libobjc): Do not depend on + maybe-all-target-libiberty. + 2011-05-11 Paul Pluzhnikov ppluzhni...@google.com * MAINTAINERS (Write After Approval): Add myself.
Fix missing function declaration warnings in yesterday's libobjc patch
This patch fixes a problem with the patch from Richard/David that was committed yesterday; presumably since the patch was originally written before the new libobjc API revamp, it was still using objc_lookup_class(), which is not part of the Modern API, hence currently undeclared in sendmsg.c. I replaced it with the Modern API counter-part, which is objc_getClass(), fixing the compiler warnings, and providing the compiler with the correct function declaration. Applied to trunk. Thanks Index: sendmsg.c === --- sendmsg.c (revision 174267) +++ sendmsg.c (working copy) @@ -,7 +,7 @@ else { /* Retreive the class from the meta class. */ - Class c = objc_lookup_class (cls-name); + Class c = objc_getClass (cls-name); assert (CLS_ISMETA (cls)); assert (c); __objc_send_initialize (c); Index: ChangeLog === --- ChangeLog (revision 174267) +++ ChangeLog (working copy) @@ -1,3 +1,8 @@ +2011-05-26 Nicola Pero nicola.p...@meta-innovation.com + + * sendmsg.c (__objc_install_dtable_for_class): Use objc_getClass, + not objc_lookupClass. + 2011-05-25 Richard Frith-Macdonald r...@gnu.org David Ayers ay...@fsfe.org
libobjc - indentation patch for sendmsg.c
Applied to trunk. Thanks Index: ChangeLog === --- ChangeLog (revision 174268) +++ ChangeLog (working copy) @@ -1,5 +1,10 @@ 2011-05-26 Nicola Pero nicola.p...@meta-innovation.com + * sendmsg.c: Reindented part of the file. No non-trivial changes + in code. + +2011-05-26 Nicola Pero nicola.p...@meta-innovation.com + * sendmsg.c (__objc_install_dtable_for_class): Use objc_getClass, not objc_lookupClass. Index: sendmsg.c === --- sendmsg.c (revision 174268) +++ sendmsg.c (working copy) @@ -263,29 +263,26 @@ get_implementation (id receiver, Class class, SEL /* Double-checked locking pattern: Check __objc_uninstalled_dtable again in case another thread -installed the dtable while we were waiting for the lock -to be released. */ +installed the dtable while we were waiting for the lock to be +released. */ if (class-dtable == __objc_uninstalled_dtable) - { - __objc_install_dtable_for_class (class); - } + __objc_install_dtable_for_class (class); - /* If the dispatch table is not yet installed, - we are still in the process of executing +initialize. - But the implementation pointer should be available - in the prepared ispatch table if it exists at all. */ + /* If the dispatch table is not yet installed, we are still in +the process of executing +initialize. But the implementation +pointer should be available in the prepared ispatch table if +it exists at all. */ if (class-dtable == __objc_uninstalled_dtable) { assert (__objc_prepared_dtable_for_class (class) != 0); res = __objc_get_prepared_imp (class, sel); } else - { - res = 0; - } + res = 0; + objc_mutex_unlock (__objc_runtime_mutex); - /* Call ourselves with the installed dispatch table and get -the real method. */ + /* Call ourselves with the installed dispatch table and get the +real method. */ if (!res) res = get_implementation (receiver, class, sel); } @@ -295,9 +292,9 @@ get_implementation (id receiver, Class class, SEL res = sarray_get_safe (class-dtable, (size_t) sel-sel_id); if (res == 0) { - /* The dispatch table has been installed, and the method -is not in the dispatch table. So the method just -doesn't exist for the class. */ + /* The dispatch table has been installed, and the method is +not in the dispatch table. So the method just doesn't +exist for the class. */ /* Try going through the +resolveClassMethod: or +resolveInstanceMethod: process. */ @@ -305,9 +302,9 @@ get_implementation (id receiver, Class class, SEL { /* We have the meta class, but we need to invoke the +resolveClassMethod: method on the class. So, we -need to obtain the class from the meta class, -which we do using the fact that both the class -and the meta-class have the same name. */ +need to obtain the class from the meta class, which +we do using the fact that both the class and the +meta-class have the same name. */ Class realClass = objc_lookUpClass (class-name); if (realClass) res = __objc_resolve_class_method (realClass, sel); @@ -316,9 +313,7 @@ get_implementation (id receiver, Class class, SEL res = __objc_resolve_instance_method (class, sel); if (res == 0) - { - res = __objc_get_forward_imp (receiver, sel); - } + res = __objc_get_forward_imp (receiver, sel); } } return res; @@ -365,10 +360,9 @@ method_get_imp (struct objc_method * method) /* Query if an object can respond to a selector, returns YES if the object implements the selector otherwise NO. Does not check if the - method can be forwarded. - Since this requires the dispatch table to installed, this function - will implicitly invoke +initialize for the class of OBJECT if it - hasn't been invoked yet. */ + method can be forwarded. Since this requires the dispatch table to + installed, this function will implicitly invoke +initialize for the + class of OBJECT if it hasn't been invoked yet. */ inline BOOL __objc_responds_to (id object, SEL sel) @@ -384,9 +378,9 @@ __objc_responds_to (id object, SEL sel) if (object-class_pointer-dtable == __objc_uninstalled_dtable) __objc_install_dtable_for_class (object-class_pointer); - /* If the dispatch table is not yet installed, - we are still in the process of executing +initialize. - Yet
Re: Fix for libobjc/48177. Can I apply it to 4.6 as well ?
This patch fixes libobjc/48177. I applied it to trunk. I'd like to apply this patch to the 4.6 branch too. Do I need permission from a Release Manager ? They are always welcome to chime in, though, in this case the libobjc maintainer can approve it. Thanks Mike I browsed the archives of gcc-patches for a while and as far as I can see, you are right and other maintainers do approve patches for the 4.6 branch (in their own areas) without waiting for a Release Manager to double-approve each patch (and it makes sense). So I applied it to the 4.6 branch too. :-) Thanks
Patch for libobjc/38307
get_implementation instead of get_imp. + (prepared_dtable_table): New. + (__objc_prepare_dtable_for_class): New. + (__objc_prepared_dtable_for_class): New. + (__objc_get_prepared_imp): New. + (__objc_install_prepared_dtable_for_class): New. + 2011-05-24 Nicola Pero nicola.p...@meta-innovation.com PR libobjc/48177
Patch fixing PR objc/48187
This routine patch fixes PR objc/48187. The problem is that the following code @interface A { ] } @end would cause the ObjC parser to enter into an infinite loop. The parser fails to parse ] as an instance variable, but then when it tries to skip to the next semicolon to resume parsing from the next instance variable, the standard c_parser_skip_until_found() doesn't skip the ] because it's a special token that reduces the nesting level. So, the parser tries to parse ] again as an instance variable, and then again and again, failing to ever make any progress ;-) The fix adds an explicit branch to deal with the parsing failure, and carefully skips to the next semicolon (or '}) even in the case of ']' or ')'. -- As I was looking at that chunk of code, I also noticed the error message saying extra semicolon in struct or union specified for an extra semicolon found in a list of ObjC instance variables. I think it's incorrect or at least confusing as a list of ObjC instance variables isn't a struct or union. ;-) I changed it to simply say extra semicolon as I like short and clear error messages. But I'm happy to change it to something else (eg, extra semicolon specified in list of Objective-C instance variables) if other people disagree. -- I added testcases. -- Finally, I also updated the ObjC++ parser so that it would survive the same testcases (previously they would crash the compiler). Ok to commit ? Thanks Index: ChangeLog === --- ChangeLog (revision 174112) +++ ChangeLog (working copy) @@ -1,3 +1,11 @@ +2011-05-24 Nicola Pero nicola.p...@meta-innovation.com + + PR objc/48187 + * c-parser.c (c_parser_objc_class_instance_variables): More robust + parsing of syntax error in ObjC instance variable lists. In + particular, avoid an infinite loop if there is a stray ']'. + Updated error message. + 2011-05-24 Joseph Myers jos...@codesourcery.com * Makefile.in (GCC_OBJS): Remove opts-common.o and options.o. Index: testsuite/ChangeLog === --- testsuite/ChangeLog (revision 174112) +++ testsuite/ChangeLog (working copy) @@ -1,3 +1,10 @@ +2011-05-24 Nicola Pero nicola.p...@meta-innovation.com + + PR objc/48187 + * objc.dg/pr48187.m: New testcase. + * obj-c++.dg/pr48187.mm: New testcase. + * objc.dg/ivar-extra-semicolon.m: New testcase. + 2011-05-24 Tom de Vries t...@codesourcery.com PR tree-optimization/49121 Index: testsuite/objc.dg/ivar-extra-semicolon.m === --- testsuite/objc.dg/ivar-extra-semicolon.m(revision 0) +++ testsuite/objc.dg/ivar-extra-semicolon.m(revision 0) @@ -0,0 +1,15 @@ +/* Contributed by Nicola Pero nicola.p...@meta-innovation.com, May 2011. */ +/* { dg-do compile } */ +/* { dg-options -pedantic } */ + +#include objc/objc.h + +@interface MyClass +{ + ; /* { dg-warning extra semicolon } */ + int a; + ; /* { dg-warning extra semicolon } */ + int b; + ; /* { dg-warning extra semicolon } */ +} +@end Index: testsuite/objc.dg/pr48187.m === --- testsuite/objc.dg/pr48187.m (revision 0) +++ testsuite/objc.dg/pr48187.m (revision 0) @@ -0,0 +1,39 @@ +/* { dg-do compile } */ + +@interface A +{ + ] /* { dg-error xpected } */ +} +@end + +@interface B +{ + ]; /* { dg-error xpected } */ +} +@end + +@interface C +{ + ]; /* { dg-error xpected } */ + int x; +} +@end + +@interface D +{ + ) /* { dg-error xpected } */ +} +@end + +@interface E +{ + ); /* { dg-error xpected } */ +} +@end + +@interface F +{ + ); /* { dg-error xpected } */ + int x; +} +@end Index: testsuite/obj-c++.dg/pr48187.mm === --- testsuite/obj-c++.dg/pr48187.mm (revision 0) +++ testsuite/obj-c++.dg/pr48187.mm (revision 0) @@ -0,0 +1,39 @@ +/* { dg-do compile } */ + +@interface A +{ + ] /* { dg-error xpected } */ +} +@end + +@interface B +{ + ]; /* { dg-error xpected } */ +} +@end + +@interface C +{ + ]; /* { dg-error xpected } */ + int x; +} +@end + +@interface D +{ + ( +} /* { dg-error xpected } */ +@end + +@interface E +{ + (; /* { dg-error xpected } */ +} +@end + +@interface F +{ + (; /* { dg-error xpected } */ + int x; +} +@end Index: cp/ChangeLog === --- cp/ChangeLog(revision 174112) +++ cp/ChangeLog(working copy) @@ -1,3 +1,8 @@ +2011-05-24 Nicola Pero nicola.p...@meta-innovation.com, + + * parser.c (cp_parser_objc_class_ivars): Deal gracefully with a + syntax error in declaring an ObjC instance variable. + 2011-05-24 Joseph Myers jos...@codesourcery.com * Make-lang.in (GXX_OBJS): Remove prefix.o. Index: cp/parser.c
Tiny documentation update in diagnostic.c
Ok to commit ? Thanks Index: ChangeLog === --- ChangeLog (revision 174112) +++ ChangeLog (working copy) @@ -1,3 +1,15 @@ +2011-05-24 Nicola Pero nicola.p...@meta-innovation.com + + * diagnostic.c (pedwarn): Updated comment. + Index: diagnostic.c === --- diagnostic.c(revision 174112) +++ diagnostic.c(working copy) @@ -701,8 +701,9 @@ Note that these diagnostics are issued independent of the setting of the -pedantic command-line switch. To get a warning enabled only with that switch, use either if (pedantic) pedwarn - (OPT_pedantic,...) or just pedwarn (OPT_pedantic,..). To get a - pedwarn independently of the -pedantic switch use pedwarn (0,...). + (,OPT_pedantic,...) or just pedwarn (,OPT_pedantic,..). To get + a pedwarn independently of the -pedantic switch use pedwarn + (,0,...). Returns true if the warning was printed, false if it was inhibited. */
Fix for libobjc/48177. Can I apply it to 4.6 as well ?
This patch fixes libobjc/48177. I applied it to trunk. I'd like to apply this patch to the 4.6 branch too. Do I need permission from a Release Manager ? Can I get it ? :-) It is a fairly obvious fix as selector types should generally be compared using sel_types_match() and not strcmp(). But note that this bug has been in libobjc forever; it never mattered much because the traditional API (the only one available before GCC 4.6) had a number of different functions for dealing with typed selectors, and gnustep-base (the main user of this API) was using some other function to do this and the problem wasn't visible. The modern API (recommended from GCC 4.6.0 onwards) has a more limited, and elegant, set of functions, and the code in gnustep-base would be massively simplified ... if only this bug wasn't in the way! :-( Due to this bug, gnustep-base actually has to forcefully use the traditional API in the middle of the modern API, which it does by copying some declarations from the traditional API and it's all quite horrible. Ideally, we'd fix this bug in trunk and in 4.6.1, so that once 4.6.1 is released, gnustep-base can remove the horrible hacks, simply use the Modern API, and just tell everyone running 4.6.0 to upgrade to 4.6.1 to get the fix. :-) So, OK to commit to the 4.6 branch too ? Thanks Index: libobjc/ChangeLog === --- libobjc/ChangeLog (revision 174141) +++ libobjc/ChangeLog (working copy) @@ -1,3 +1,10 @@ +2011-05-24 Nicola Pero nicola.p...@meta-innovation.com + + PR libobjc/48177 + * selector.c (__sel_register_typed_name): Use sel_types_match() + instead of strcmp() to compare selector types (Suggestion by + Richard Frith-Macdonald r...@gnu.org). + 2011-04-15 Rainer Orth r...@cebitec.uni-bielefeld.de PR libobjc/32037 Index: libobjc/selector.c === --- libobjc/selector.c (revision 174138) +++ libobjc/selector.c (working copy) @@ -597,7 +597,7 @@ __sel_register_typed_name (const char *name, const return s; } } - else if (! strcmp (s-sel_types, types)) + else if (sel_types_match (s-sel_types, types)) { if (orig) { Index: gcc/testsuite/ChangeLog === --- gcc/testsuite/ChangeLog (revision 174142) +++ gcc/testsuite/ChangeLog (working copy) @@ -1,5 +1,10 @@ 2011-05-24 Nicola Pero nicola.p...@meta-innovation.com + PR libobjc/48177 + * objc.dg/pr48177.m: New testcase. + +2011-05-24 Nicola Pero nicola.p...@meta-innovation.com + PR objc/48187 * objc.dg/pr48187.m: New testcase. * obj-c++.dg/pr48187.mm: New testcase. Index: gcc/testsuite/objc.dg/pr48177.m === --- gcc/testsuite/objc.dg/pr48177.m (revision 0) +++ gcc/testsuite/objc.dg/pr48177.m (revision 0) @@ -0,0 +1,35 @@ +/* Contributed by Nicola Pero nicola.p...@meta-innovation.com, May 2011. */ +/* { dg-do run } */ +/* { dg-skip-if No API#2 pre-Darwin9 { *-*-darwin[5-8]* } { -fnext-runtime } { } } */ + +#include objc/runtime.h +#include stdlib.h + +int main(int argc, void **args) +{ +#ifdef __GNU_LIBOBJC__ + /* This special test tests that, if you have a selector already + registered in the runtime with full type information, you can use + sel_registerTypedName() to get it even if you specify the type + with incorrect argframe information. This is helpful as + selectors generated by the compiler (which have correct argframe + information) are usually registered before hand-written ones + (which often have incorrect argframe information, but need the + correct one). + + Note that in this hand-written test, even the type information of + the first selector may be wrong (on this machine); but that's OK + as we'll never actually use the selectors. */ + SEL selector1 = sel_registerTypedName (testMethod, i8@0:4); + SEL selector2 = sel_registerTypedName (testMethod, i8@8:8); + + /* We compare the selectors using ==, not using sel_isEqual(). This + is because we are testing internals of the runtime and we know + that in the current implementation they should be identical if + the stuff is to work as expected. Don't do this at home. */ + if (selector1 != selector2) +abort (); +#endif + + return 0; +}
Re: Remove separate tarballs (was: Re: objc patch (was Re: Problem to install GCC 4.6.0 with Objective-C language))
Maybe we can offer an additional compression format like lzma .xz which brings down 4.5.3 compressed size from 66MB bz2 to 52MB (with -7). But that can be decided separately. Yes ... on the other hand, this does not address the other issue, which is the amount of disk space that you need to actually uncompress the tarballs :-( Unpacking gcc-4.6.0.tar.xx requires about 600 MB. Unpacking gcc- core-4.6.0.tar.xx requires about 150 MB. It's a big difference. Compiling a few languages (eg, the C ones) may produce object/build files for about 400 MB or so, meaning if you download gcc-4.6.0 to get a C compiler you'll likely need a minimum of 1 GB of disk space. If you download gcc-core-4.6.0 you may get away with about 550 MB (and get the same compiler). Maybe you could reduce the number of tarballs, but without going to the extreme of having just one. Eg, you could keep the testsuite (expands to approx 150MB) as a separate tarball, and probably Java (due to its size, again expands to approx 150MB) as a separate tarball too, while merging everything else into a single tarball (expanding to approx 300 MB). It may a reasonable compromise. But I'm not sure, just mentioning the idea. The testsuite seems particularly suitable for being kept separate, as most end-users want to just use the software as opposed to test it; moreover testing requires DejaGNU, which (depending on the platform) may require lot more dependencies and work to install - unpacking an additional tarball would be the least of your troubles. And some users may appreciate saving 150 MB of disk space. :-) But I don't have a strong opinion either way. I was just contributing some thoughts. I'm fine with whatever you decide. :-) I generally like the idea of reducing the exposure to untested configurations with missing directories. Thanks
objc patch (was Re: Problem to install GCC 4.6.0 with Objective-C language)
I get the error (this time the objc language is detected): /bin/bash ../../gcc-4.6.0/gcc/../move-if-change tmp-gi.list gtyp-input.list echo timestamp s-gtyp-input build/gengtype \ -S ../../gcc-4.6.0/gcc -I gtyp-input.list -w gtype.state ../../gcc-4.6.0/gcc/objc/objc-act.h:280: unidentified type `objc_ivar_visibility_kind' make[3]: *** [s-gtype] Error 1 Thanks German ... I could reproduce it. You found a bug! :-) Apologies for the bug, and thanks for sticking with us. ;-) (you can ignore the following, it's for gcc-patc...@gnu.org) It's easy to reproduce the bug by simply deleting the gcc/cp directory from a GCC checkout, then trying to compile with the c,objc languages enabled. It fails with the error above, because gengtype then reads objc/objc-act.h before c-family/c-common-objc.h. The problem is in how the list of language-specific gtfiles is produced. It is produced in configure.ac, which: * will iterate over all the ${srcdir}/*/config-lang.in; * will source config-lang.in for all of them, regardless of whether they are enabled or not, and add $gtfiles to the list of gtfiles; * adds the C language last. As a consequence, GTFILES is different depending on whether ${srcdir}/gcc/cp/ exists or not. If it exists, usually the cp gtfiles come before the objc ones (due to alphabetical ordering by the shell, I'd guess ?), and the cp gtfiles contain c-family/c-common-objc.h, which is then processed before objc/objc-act.h. If it doesn't exist, that doesn't happen, and it stops working. :-( Here is a patch to fix it. It just moves c-family/c-objc.h at the beginning of the objc gtfiles list, to make it independent of cp's gtfiles list; with this, I can build c,objc with or without the gcc/cp directory. :-) Ok to commit ? Thanks PS: In my view this fix is a candidate for backporting to 4.6.x; without it, the gcc-objc-4.6.x tarballs are unusable. Index: ChangeLog === --- ChangeLog (revision 173994) +++ ChangeLog (working copy) @@ -1,3 +1,9 @@ +2011-05-21 Nicola Pero nicola.p...@meta-innovation.com + + * config-lang.in (gtfiles): Updated order of files to fix building + when the gcc/cp directory is missing, as in the case of some + release tarballs. + 2011-05-20 Nathan Froyd froy...@codesourcery.com * objc-act.c (objc_compare_types): Use function_args_iterator Index: config-lang.in === --- config-lang.in (revision 173994) +++ config-lang.in (working copy) @@ -33,4 +33,7 @@ # Most of the object files for cc1obj actually come from C. lang_requires=c -gtfiles=\$(srcdir)/objc/objc-act.h \$(srcdir)/objc/objc-act.c \$(srcdir)/objc/objc-runtime-shared-support.c \$(srcdir)/objc/objc-gnu-runtime-abi-01.c \$(srcdir)/objc/objc-next-runtime-abi-01.c \$(srcdir)/objc/objc-next-runtime-abi-02.c \$(srcdir)/c-parser.c \$(srcdir)/c-tree.h \$(srcdir)/c-decl.c \$(srcdir)/c-lang.h \$(srcdir)/c-objc-common.c \$(srcdir)/c-family/c-common.c \$(srcdir)/c-family/c-common.h \$(srcdir)/c-family/c-objc.h \$(srcdir)/c-family/c-cppbuiltin.c \$(srcdir)/c-family/c-pragma.h \$(srcdir)/c-family/c-pragma.c +# Order is important. If you change this list, make sure you test +# building without C++ as well; that is, remove the gcc/cp directory, +# and build with --enable-languages=c,objc. +gtfiles=\$(srcdir)/c-family/c-objc.h \$(srcdir)/objc/objc-act.h \$(srcdir)/objc/objc-act.c \$(srcdir)/objc/objc-runtime-shared-support.c \$(srcdir)/objc/objc-gnu-runtime-abi-01.c \$(srcdir)/objc/objc-next-runtime-abi-01.c \$(srcdir)/objc/objc-next-runtime-abi-02.c \$(srcdir)/c-parser.c \$(srcdir)/c-tree.h \$(srcdir)/c-decl.c \$(srcdir)/c-lang.h \$(srcdir)/c-objc-common.c \$(srcdir)/c-family/c-common.c \$(srcdir)/c-family/c-common.h \$(srcdir)/c-family/c-cppbuiltin.c \$(srcdir)/c-family/c-pragma.h \$(srcdir)/c-family/c-pragma.c
Re: Patch: New GTY ((atomic)) option
However, did you check that the atomic qualifier is correctly written re-read in the state (I believe you did, otherwise it probably won't work). This is needed for plugins using it, or using atomic qualified fields of existing (or future) structures. Yes. String options are written as they are, no particular changes are needed. ;-) I'd like to show you a testcase, but, as you discuss in your other email, we can't really write GTY testcases at this stage. So here is a walked tour of how to test the new atomic option -- * apply the GTY ((atomic)) patch (obviously) * add the GTY ((atomic)) option to field 'su' of struct 'function' in function.h (that field is atomic, so you can mark it atomic and it should work) * rebuild everything from scratch (bootstrap the compiler) * gtype.state now contains, some time after (!pair su, the lines (!srcfileloc function.h 516) (!options (!option atomic string ) ) btw, we should probably improve gtype.state; indentation would be nice :-) ... * gtype-desc.c now contains void gt_ggc_mx_function (void *x_p) { struct function * const x = (struct function *)x_p; if (ggc_test_and_set_mark (x)) { gt_ggc_m_9eh_status ((*x).eh); gt_ggc_m_18control_flow_graph ((*x).cfg); gt_ggc_m_12gimple_seq_d ((*x).gimple_body); gt_ggc_m_9gimple_df ((*x).gimple_df); gt_ggc_m_5loops ((*x).x_current_loops); if ((*x).su != NULL) { ggc_mark ((*x).su); } gt_ggc_m_9tree_node ((*x).decl); gt_ggc_m_9tree_node ((*x).static_chain_decl); gt_ggc_m_9tree_node ((*x).nonlocal_goto_save_area); gt_ggc_m_11VEC_tree_gc ((*x).local_decls); gt_ggc_m_16machine_function ((*x).machine); gt_ggc_m_17language_function ((*x).language); gt_ggc_m_P9tree_node4htab ((*x).used_types_hash); } } as you notice, the su field is only marked, but not followed. Normally that same marking function would be void gt_ggc_mx_function (void *x_p) { struct function * const x = (struct function *)x_p; if (ggc_test_and_set_mark (x)) { gt_ggc_m_9eh_status ((*x).eh); gt_ggc_m_18control_flow_graph ((*x).cfg); gt_ggc_m_12gimple_seq_d ((*x).gimple_body); gt_ggc_m_9gimple_df ((*x).gimple_df); gt_ggc_m_5loops ((*x).x_current_loops); gt_ggc_m_11stack_usage ((*x).su); gt_ggc_m_9tree_node ((*x).decl); gt_ggc_m_9tree_node ((*x).static_chain_decl); gt_ggc_m_9tree_node ((*x).nonlocal_goto_save_area); gt_ggc_m_11VEC_tree_gc ((*x).local_decls); gt_ggc_m_16machine_function ((*x).machine); gt_ggc_m_17language_function ((*x).language); gt_ggc_m_P9tree_node4htab ((*x).used_types_hash); } } which would call the gt_ggc_mx_stack_usage() function, which does nothing but mark the pointer in this case (since the field actually is atomic), but would in other cases mark the children as well. So, in this case marking the field as atomic results in a small optimization when doing the GC marking stage. In other cases, when gengtype doesn't know how to inspect the memory pointed to (eg, unsigned int *), then it would make it possible to use GC for the pointer. PCH traversing is similar. To test that the GC marking actually works, I mostly bootstrap the compiler first, then test compiling a few testcases using --param ggc-min-expand=0 --param ggc-min-heapsize=0. This is by no means a full test; if you or Laurynas have any suggestions on how to test better, they'd be welcome. :-) Thanks
Re: Patch: New GTY ((atomic)) option
* gengtype.c (walk_type): Implemented atomic GTY option. * doc/gty.texi (GTY Options): Document atomic GTY option. The patch is OK, with difference between skip and atomic options documented. (Can be done as a follow-up patch). Thanks for the quick review. Here's an updated patch with revised documentation. Ok to go ? Thanks Index: gcc/doc/gty.texi === --- gcc/doc/gty.texi(revision 173917) +++ gcc/doc/gty.texi(working copy) @@ -383,6 +383,51 @@ size_t size = sizeof (struct sorted_fields_type) + n * sizeof (tree); @end smallexample +@findex atomic +@item atomic + +The @code{atomic} option can only be used with pointers. It informs +the GC machinery that the memory that the pointer points to does not +contain any pointers, and hence it should be treated by the GC and PCH +machinery as an ``atomic'' block of memory that does not need to be +examined when scanning memory for pointers. In particular, the +machinery will not scan that memory for pointers to mark them as +reachable (when marking pointers for GC) or to relocate them (when +writing a PCH file). + +The @code{atomic} option differs from the @code{skip} option. +@code{atomic} keeps the memory under Garbage Collection, but makes the +GC ignore the contents of the memory. @code{skip} is more drastic in +that it causes the pointer and the memory to be completely ignored by +the Garbage Collector. So, memory marked as @code{atomic} is +automatically freed when no longer reachable, while memory marked as +@code{skip} is not. + +The @code{atomic} option must be used with great care, because all +sorts of problem can occur if used incorrectly, that is, if the memory +the pointer points to does actually contain a pointer. + +Here is an example of how to use it: +@smallexample +struct GTY(()) my_struct @{ + int number_of_elements; + unsigned int GTY ((atomic)) * elements; +@}; +@end smallexample +In this case, @code{elements} is a pointer under GC, and the memory it +points to needs to be allocated using the Garbage Collector, and will +be freed automatically by the Garbage Collector when it is no longer +referenced. But the memory that the pointer points to is an array of +@code{unsigned int} elements, and the GC must not try to scan it to +find pointers to mark or relocate, which is why it is marked with the +@code{atomic} option. + +Note that, currently, global variables can not be marked with +@code{atomic}; only fields of a struct can. This is a known +limitation. It would be useful to be able to mark global pointers +with @code{atomic} to make the PCH machinery aware of them so that +they are saved and restored correctly to PCH files. + @findex special @item special (@var{name}) Index: gcc/gengtype.c === --- gcc/gengtype.c (revision 173917) +++ gcc/gengtype.c (working copy) @@ -2386,6 +2386,7 @@ int maybe_undef_p = 0; int use_param_num = -1; int use_params_p = 0; + int atomic_p = 0; options_p oo; const struct nested_ptr_data *nested_ptr_d = NULL; @@ -2415,6 +2416,8 @@ ; else if (strcmp (oo-name, skip) == 0) ; +else if (strcmp (oo-name, atomic) == 0) + atomic_p = 1; else if (strcmp (oo-name, default) == 0) ; else if (strcmp (oo-name, param_is) == 0) @@ -2480,6 +2483,12 @@ return; } + if (atomic_p (t-kind != TYPE_POINTER)) +{ + error_at_line (d-line, field `%s' has invalid option `atomic'\n, d-val); + return; +} + switch (t-kind) { case TYPE_SCALAR: @@ -2495,6 +2504,25 @@ break; } + /* If a pointer type is marked as atomic, we process the + field itself, but we don't walk the data that they point to. + + There are two main cases where we walk types: to mark + pointers that are reachable, and to relocate pointers when + writing a PCH file. In both cases, an atomic pointer is + itself marked or relocated, but the memory that it points + to is left untouched. In the case of PCH, that memory will + be read/written unchanged to the PCH file. */ + if (atomic_p) + { + oprintf (d-of, %*sif (%s != NULL) {\n, d-indent, , d-val); + d-indent += 2; + d-process_field (t, d); + d-indent -= 2; + oprintf (d-of, %*s}\n, d-indent, ); + break; + } + if (!length) { if (!UNION_OR_STRUCT_P (t-u.p) Index: gcc/ChangeLog === --- gcc/ChangeLog (revision 173917) +++ gcc/ChangeLog (working copy) @@ -1,3 +1,8 @@ +2011-05-20 Nicola Pero nicola.p...@meta-innovation.com + + * gengtype.c (walk_type): Implemented atomic GTY option. + * doc/gty.texi (GTY Options): Document atomic GTY option
Re: Patch: New GTY ((atomic)) option
This patch adds a new GTY option, atomic, which is similar to the identical option you have with Boehm GC and which can be used with pointers to inform the GC/PCH machinery that they point to an area of memory that [...] This patch basically implements it, but at this stage requires you to explicitly tell gengtype that the pointer is atomic (and that is safe for gengtype to ignore the memory it points to). then should you not name the attribute ignore? Or even the existing attribute skip? skip is different. With skip, the pointer is completely ignored by GC/PCH. In this case, we don't want to skip the pointer; we want the pointer itself to be managed by GC/PCH, but the memory *it points to* to not be scanned for pointers. ;-) In the example I gave, struct GTY(()) my_struct { ... unsigned int * GTY((atomic)) some_ints; size_t count; ... }; you'd allocate some_ints using, for example, ggc_alloc_atomic_stat(), which already exists in the GC (even if at the moment there seems to be no particular support for atomic allocation other than the name of that function, which allocates memory in the same way as for non-atomic allocation), and which would put the pointer under control of the GC; so it is freed when the GC decides that it is no longer referenced; you don't free it manually. That is different from skip, which would make then pointer simply invisible to GC (you'd allocate it using malloc()), and you'd have to free it manually (or to never free it). In practice, when the GC is doing its marking pass, and is marking a structure of type my_struct, if the some_ints pointer has the option skip, the GC would not mark it at all; it's ignored. The option atomic would cause the GC to mark the pointer but ignore what it points to. The default behaviour is yet different; it is to examine the memory it points to, mark any pointers in there, and then mark the pointer itself too. But because gengtype does not know, at the moment, how to examine unsigned ints (you don't examine them, because the pointer is atomic!), it will print a error saying that the pointer type is uninmplemented, and abort (a further step, after introducing the atomic option, would be to have the GC automatically mark such pointers as atomic, as explained in the original post). To clarify, I didn't invent the word atomic - AFAIK it is the standard GC naming convention for memory that contains no pointers. It's the name used for this in Boehm GC (the most popular C/C++ GC), where the function is called GC_MALLOC_ATOMIC(), and it is also the name for it in the GCC GC, presumably, since there already is a function ggc_alloc_atomic_stat() which presumably is meant to allocate atomic memory (hard to say in the absence of documentation and given that the implementation is identical to the other memory allocation at the moment, but it's a safe guess). What is the problem with atomic ? I guess you find it confusing because it makes you think of atomic access to memory ? You are right that there is that potential for confusion. :-( We could rename it, but then we'd want to rename the GCC ggc_alloc_atomic_stat() function too, and I'm not entirely sure it would make anything clearer ... as atomic is the standard word for that. I think the best we can do is provide good documentation. So, I guess what I take from your comments is that I should update the documentation in my patch to include a short discussion of how atomic differs from skip, since it doesn't seem to be that obvious for people. :-) But please let me know if I'm missing something. Thanks
Re: (build) Patch to fix cp/cfns.gperf building issues
Alexandre thanks for the review :-) -pedantic review: how about outputting to a temporary file (say cp/cfns.hT) and only renaming to the intended name on success, so that, if gperf crashes or we reboot part-way through it, we don't end up with a partially-generated file that will seem to be up to date? It's a good suggestion. On the other hand, now that the rule is maintainer-only, and considering it's used once every few years, I wouldn't personally want to spend more time on it. ;-) Thanks
Re: (build) Patch to fix cp/cfns.gperf building issues
Ok? Ping? PS: For the maintainer who will (eventually) review this patch, the latest version, tested and with all the comments and contributions from Joseph and Mike merged in, is -- http://gcc.gnu.org/ml/gcc-patches/2011-04/msg01930.html So, that's the one to review.
Re: (build) Patch to fix cp/cfns.gperf building issues
Additionally, contrib/gcc_update --touch can be used to to fix the time stamps until such time as someone changes the gperf rule to be under maintainer mode. Thanks Mike, good to know. :-) So, only the dependency should go away under a maintainer rules, as in the below, not the entire rule. What is the reason to keep the rule without the dependency ? Is it so that even with --disable-maintainer-mode you can force the file to be recreated by manually deleting it ? That would make sense ... it sounds like a good idea, so here is yet another refinement of the patch with that refinement added too :-) Ok to commit ? Thanks Index: ChangeLog === --- ChangeLog (revision 172860) +++ ChangeLog (working copy) @@ -1,3 +1,7 @@ +2011-04-22 Nicola Pero nicola.p...@meta-innovation.com + + * Makefile.in (ENABLE_MAINTAINER_RULES): New. + 2011-04-22 Jakub Jelinek ja...@redhat.com PR c/48716 Index: cp/Make-lang.in === --- cp/Make-lang.in (revision 172860) +++ cp/Make-lang.in (working copy) @@ -104,10 +104,20 @@ cc1plus$(exeext): $(CXX_OBJS) cc1plus-checksum.o $ +$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBS) $(BACKENDLIBS) -# Special build rules. +ifeq ($(ENABLE_MAINTAINER_RULES), true) +# Special build rule. This is a maintainer rule, that is only +# available when GCC is configured with --enable-maintainer-mode. In +# other cases, it is not available to avoid triggering rebuilds if a +# user has the source checked out with unusual timestamps. $(srcdir)/cp/cfns.h: $(srcdir)/cp/cfns.gperf +else +# We keep the rule so that you can still force a rebuild, even if you +# didn't configure GCC with --enable-maintainer-mode, by manually +# deleting the $(srcdir)/cp/cfns.h file. +$(srcdir)/cp/cfns.h: +endif gperf -o -C -E -k '1-6,$$' -j1 -D -N 'libc_name_p' -L ANSI-C \ - $(srcdir)/cp/cfns.gperf $(srcdir)/cp/cfns.h + $(srcdir)/cp/cfns.gperf --output-file $(srcdir)/cp/cfns.h #^L # Build hooks: Index: cp/ChangeLog === --- cp/ChangeLog(revision 172860) +++ cp/ChangeLog(working copy) @@ -1,3 +1,11 @@ +2011-04-23 Nicola Pero nicola.p...@meta-innovation.com, + Mike Stump mikest...@comcast.net + + * Make-lang.in ($(srcdir)/cp/cfns.h): Enable the dependency only + in maintainer mode. Use the --output-file option of gperf instead + of to prevent creating an empty cp/cfns.h when gperf is not + available. + 2011-04-20 Jason Merrill ja...@redhat.com * semantics.c (finish_compound_literal): Don't put an array Index: Makefile.in === --- Makefile.in (revision 172860) +++ Makefile.in (working copy) @@ -165,8 +165,19 @@ C_STRICT_WARN = @c_strict_warn@ NOCOMMON_FLAG = @nocommon_flag@ # This is set by --disable-maintainer-mode (default) to # +# FIXME: 'MAINT' will always be set to an empty string, no matter if +# --disable-maintainer-mode is used or not. This is because the +# following will expand to MAINT := in maintainer mode, and to +# MAINT := # in non-maintainer mode, but because '#' starts a comment, +# they mean exactly the same thing for make. MAINT := @MAINT@ +# The following provides the variable ENABLE_MAINTAINER_RULES that can +# be used in language Make-lang.in makefile fragments to enable +# maintainer rules. So, ENABLE_MAINTAINER_RULES is 'true' in +# maintainer mode, and '' otherwise. +@MAINT@ ENABLE_MAINTAINER_RULES = true + # These are set by --enable-checking=valgrind. RUN_GEN = @valgrind_command@ VALGRIND_DRIVER_DEFINES = @valgrind_path_defines@
(build) Patch to fix cp/cfns.gperf building issues
This patch fixes a building annoyance that I had when building on a new machine (an x86_64 gnu/linux box). The building failed. It was down to two problems: * due to how I got a copy of the GCC source code on the machine, the timestamp of each source file was the timestamp of when it was copied to the machine (ie, a random timestamp from the point of view of the building system). This caused the build system to decide that $(srcdir)/cp/cfns.h needed to be rebuilt from $(srcdir)/cp/cfns.gperf (it didn't, obviously; the source code was trunk with no changes). * when the automated rebuild failed because gperf was not there, it also created an empty cp/cfns.h, basically corrupting my source tree. Further attempts to rebuild (with or without gperf) would then fail due to a missing definition of libc_name_p (because cp/cfns.h now existed, and was newer than cp/cfns.gperf, it wouldn't be rebuilt, and I was stuck with the empty cp/cfns.h). Searching on the internet, I found that a number of people got stuck at this stage and couldn't finish their build. So, rather than just manually fixing my source tree, I'm posting a patch that will remove the problems at the root. This patch fixes both problems, making the build more robust: * it only rebuilds cp/cfns.h when a specific command (make rebuild-cp-cfns) is used. According to the ChangeLogs, cp/cfns.gperf was edited about 5 times in 10 years, so it does not seem unreasonable to require developers/maintainers to use an explicit command to rebuild cp/cfns.h from cp/cfns.gperf for the once-every-two-years occasion when it is changed. I documented the process clearly in cfns.gperf itself. This makes the build more robust for end users, who are not bugged by timestamp issues in the source tree causing unexpected rebuilds or complications requiring gperf. In general, I personally feel that the building system should not depend on the relative timestamps of source files unless it's doing something in maintainer mode where it's being explicitly asked to rebuild one source file from the other. The average user who downloads the GCC source code to build it should not be expected to keep the timestamps of each source file religiously unchanged! Timestamps may change as the source code is moved around by users and the building system should not have a problem with that. * it fails gracefully when the rebuild is triggered and gperf is not available. Instead of creating en empty cp/cfns.h file, it creates no file at all, so that if you then install gperf, it will rebuild cp/cfns.h correctly, and if you don't, you'll keep getting the error the gperf is not available (not an error about libc_name_p not being defined), which is the correct one. Ok to commit ? Thanks Index: cfns.gperf === --- cfns.gperf (revision 172858) +++ cfns.gperf (working copy) @@ -15,7 +15,18 @@ for more details. You should have received a copy of the GNU General Public License along with GCC; see the file COPYING3. If not see -http://www.gnu.org/licenses/. */ +http://www.gnu.org/licenses/. + +You need to use gperf to generate cfns.h from cfns.gperf. This is +the process: + + have a GCC source/build tree already checked out + edit cfns.gperf + cd $(buildir)/gcc + make rebuild-cp-cfns + +Alternatively, just look into cp/Make-lang.in and run the gperf +command in the rebuild-cp-cfns rule manually. */ #ifdef __GNUC__ __inline #endif Index: Make-lang.in === --- Make-lang.in(revision 172858) +++ Make-lang.in(working copy) @@ -104,11 +104,19 @@ cc1plus$(exeext): $(CXX_OBJS) cc1plus-checksum.o $ +$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBS) $(BACKENDLIBS) -# Special build rules. -$(srcdir)/cp/cfns.h: $(srcdir)/cp/cfns.gperf +# Special build rule. This is a maintainer rule, that needs to be +# invoked manually (as in cd $(builddir)/gcc; make rebuild-cp-cfns) +# to rebuild cfns.h from cfns.gperf any time that cfns.gperf is +# edited. We don't trigger it automatically when +# $(srcdir)/cp/cfns.gperf is newer than $(srcdir)/cp/cfns.h because we +# don't want to depend on users getting the source code with +# particular timestamps. +rebuild-cp-cfns: gperf -o -C -E -k '1-6,$$' -j1 -D -N 'libc_name_p' -L ANSI-C \ - $(srcdir)/cp/cfns.gperf $(srcdir)/cp/cfns.h + $(srcdir)/cp/cfns.gperf --output-file $(srcdir)/cp/cfns.h +.PHONY: rebuild-cp-cfns + #^L # Build hooks: Index: ChangeLog === --- ChangeLog (revision 172858) +++ ChangeLog (working copy) @@ -1,3 +1,13 @@ +2011-04-22 Nicola Pero nicola.p...@meta-innovation.com + + * Make-lang.in (rebuild-cp-cfns): New rule replacing the one
Re: (build) Patch to fix cp/cfns.gperf building issues
We have a --enable-maintainer-mode configure option. Thanks - I had missed that option. It's an excellent suggestion - here is a new patch that uses it. :-) Ok to commit ? Thanks PS: Regarding how I detect --enable-maintainer-mode in this new patch, cp/Make-lang.in is used at it is, without going through configure, so I can't use @MAINT@ in it. I can't use MAINT either, because it's always empty. I added a FIXME as the intention in the code was probably different. I could actually fix MAINT to end up being exactly '#' when --disable-maintainer-mode is used, but why would we want that ? It would be a literal value, which you can't use to comment out bits of code in the same way as you can with @MAINT@. Of course, people may still try, and waste time trying to figure out why it doesn't work. It just doesn't make sense; you can't comment out make code by putting a variable with a value of '#' in front of something. If you ask me, I'd just remove the MAINT variable altogether - it's a bad idea and would/will confuse people. I added a new readable variable instead, ENABLE_MAINTAINER_RULES, which is 'true' or empty, so you can do ifeq ($(ENABLE_MAINTAINER_RULES), true) ... maintainer rules ... endif which is readable, expressive, simple and robust. Index: ChangeLog === --- ChangeLog (revision 172860) +++ ChangeLog (working copy) @@ -1,3 +1,7 @@ +2011-04-22 Nicola Pero nicola.p...@meta-innovation.com + + * Makefile.in (ENABLE_MAINTAINER_RULES): New. + 2011-04-22 Jakub Jelinek ja...@redhat.com PR c/48716 Index: cp/Make-lang.in === --- cp/Make-lang.in (revision 172860) +++ cp/Make-lang.in (working copy) @@ -104,10 +104,15 @@ cc1plus$(exeext): $(CXX_OBJS) cc1plus-checksum.o $ +$(LINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(LIBS) $(BACKENDLIBS) -# Special build rules. +ifeq ($(ENABLE_MAINTAINER_RULES), true) +# Special build rule. This is a maintainer rule, that is only +# available when GCC is configured with --enable-maintainer-mode. In +# other cases, it is not available to avoid triggering rebuilds if a +# user has the source checked out with unusual timestamps. $(srcdir)/cp/cfns.h: $(srcdir)/cp/cfns.gperf gperf -o -C -E -k '1-6,$$' -j1 -D -N 'libc_name_p' -L ANSI-C \ - $(srcdir)/cp/cfns.gperf $(srcdir)/cp/cfns.h + $(srcdir)/cp/cfns.gperf --output-file $(srcdir)/cp/cfns.h +endif #^L # Build hooks: Index: cp/ChangeLog === --- cp/ChangeLog(revision 172860) +++ cp/ChangeLog(working copy) @@ -1,3 +1,10 @@ +2011-04-23 Nicola Pero nicola.p...@meta-innovation.com + + * Make-lang.in ($(srcdir)/cp/cfns.h): Enable the rule only in + maintainer mode. Use the --output-file option of gperf instead of +to prevent creating an empty cp/cfns.h when gperf is not + available. + 2011-04-20 Jason Merrill ja...@redhat.com * semantics.c (finish_compound_literal): Don't put an array Index: Makefile.in === --- Makefile.in (revision 172860) +++ Makefile.in (working copy) @@ -165,8 +165,19 @@ C_STRICT_WARN = @c_strict_warn@ NOCOMMON_FLAG = @nocommon_flag@ # This is set by --disable-maintainer-mode (default) to # +# FIXME: 'MAINT' will always be set to an empty string, no matter if +# --disable-maintainer-mode is used or not. This is because the +# following will expand to MAINT := in maintainer mode, and to +# MAINT := # in non-maintainer mode, but because '#' starts a comment, +# they mean exactly the same thing for make. MAINT := @MAINT@ +# The following provides the variable ENABLE_MAINTAINER_RULES that can +# be used in language Make-lang.in makefile fragments to enable +# maintainer rules. So, ENABLE_MAINTAINER_RULES is 'true' in +# maintainer mode, and '' otherwise. +@MAINT@ ENABLE_MAINTAINER_RULES = true + # These are set by --enable-checking=valgrind. RUN_GEN = @valgrind_command@ VALGRIND_DRIVER_DEFINES = @valgrind_path_defines@
Fix gengtype-state string hashtable
While reading GCC code, I noticed that in gengtype-state.c the equality function in a string hashtable is set to strcmp. But that returns 0 (ie, false for hashtable.c) when the strings are equal! I can't see how that hashtable would ever work. Do we have any tests for gengtype-state ? Am I missing something ? :-) Else, Ok to commit the following patch ? Thanks Index: gengtype-state.c === --- gengtype-state.c(revision 172522) +++ gengtype-state.c(working copy) @@ -2385,7 +2385,16 @@ equals_type_number (const void *ty1, const void *t return type1-state_number == type2-state_number; } +static int +string_eq (const void *a, const void *b) +{ + const char *a0 = (const char *)a; + const char *b0 = (const char *)b; + return (strcmp (a0, b0) == 0); +} + + /* The function reading the state, called by main from gengtype.c. */ void read_state (const char *path) @@ -2408,7 +2417,7 @@ read_state (const char *path) state_seen_types = htab_create (2017, hash_type_number, equals_type_number, NULL); state_ident_tab = -htab_create (4027, htab_hash_string, (htab_eq) strcmp, NULL); +htab_create (4027, htab_hash_string, string_eq, NULL); read_state_version (version_string); read_state_srcdir (); read_state_languages (); Index: ChangeLog === --- ChangeLog (revision 172522) +++ ChangeLog (working copy) @@ -1,3 +1,9 @@ +2011-04-17 Nicola Pero nicola.p...@meta-innovation.com + + * gengtype-state.c (string_eq): New. + (read_state): Use string_eq instead of strcmp when creating the + state_ident_tab. + 2011-04-15 Pat Haugen pthau...@us.ibm.com * config/rs6000/rs6000.c (call_ABI_of_interest): Call
ObjC: rewritten checks for duplicate instance variables (for improved speed and improved error messages)
This patch rewrites the check for duplicate instance variables done by the Objective-C (and Objective-C++) compiler. The new code has many advantages: * it avoids copying all the instance variables into a temporary tree chain in the way that the all code was doing (according to some notes from benchmarks and profiling I did a few months ago, this should save about 5k allocations per compilation when compiling a typical ObjC GNUstep file, giving an approx 0.25% order of magnitude speedup with -fsyntax-only); * it provides better error messages by providing the informative message previous declaration of ... when a duplicate declaration is found; * it avoids producing duplicate errors if a class with duplicate instance variables is subclassed. The existing code always built a copy of the full list of instance variables for the class (including superclass ones) and then would look for duplicates. This means if you have a class with a duplicate, and subclass it 10 times, you'll get the same error message 11 times! The new code avoids this mistake, which also reduces the number of checks required (for the standard case without a hashtable, I'll explain in a minute). * it removes the special, ad-hoc field duplicate check implementation for ObjC++ and has it use the same code as the ObjC codebase. The new code does the checks for duplicates directly, by just iterating and comparing, unless the number of checks to do is very large, in which case it falls back to a hashtable. This is similar to what the C code does for structs, but here the check is more specific as we are only checking the instance variables in the current class against the other instance variables in the class and the superclass, so it's all more specific and optimized for the situation. Updated existing testcases (to check for the new previous declaration of ... messages), and added more testcases. Ok to commit ? Thanks Index: c-family/c-objc.h === --- c-family/c-objc.h (revision 172444) +++ c-family/c-objc.h (working copy) @@ -62,7 +62,7 @@ extern tree objc_build_string_object (tree); extern tree objc_get_protocol_qualified_type (tree, tree); extern tree objc_get_class_reference (tree); extern tree objc_get_class_ivars (tree); -extern tree objc_get_interface_ivars (tree); +extern bool objc_detect_field_duplicates (bool); extern void objc_start_class_interface (tree, tree, tree, tree); extern void objc_start_category_interface (tree, tree, tree, tree); extern void objc_start_protocol (tree, tree, tree); Index: c-family/ChangeLog === --- c-family/ChangeLog (revision 172444) +++ c-family/ChangeLog (working copy) @@ -1,3 +1,9 @@ +2011-04-15 Nicola Pero nicola.p...@meta-innovation.com + + * c-objc.h (objc_get_interface_ivars): Removed. + (objc_detect_field_duplicates): New. + * stub-objc.c: Likewise. + 2011-04-14 Nicola Pero nicola.p...@meta-innovation.com * stub-objc.c (objc_declare_protocols): Renamed to Index: c-family/stub-objc.c === --- c-family/stub-objc.c(revision 172444) +++ c-family/stub-objc.c(working copy) @@ -275,10 +275,10 @@ objc_get_class_reference (tree ARG_UNUSED (name)) return 0; } -tree -objc_get_interface_ivars (tree ARG_UNUSED (fieldlist)) +bool +objc_detect_field_duplicates (bool ARG_UNUSED (check_superclasses_only)) { - return 0; + return false; } tree Index: objc/ChangeLog === --- objc/ChangeLog (revision 172444) +++ objc/ChangeLog (working copy) @@ -1,3 +1,10 @@ +2011-04-15 Nicola Pero nicola.p...@meta-innovation.com + + * objc-act.c (objc_get_interface_ivars): Removed. + (objc_detect_field_duplicates): New. + (hash_instance_variable): New. + (eq_instance_variable): New. + 2011-04-14 Nicola Pero nicola.p...@meta-innovation.com * objc-act.c (objc_declare_protocols): Renamed to Index: objc/objc-act.c === --- objc/objc-act.c (revision 172444) +++ objc/objc-act.c (working copy) @@ -3813,6 +3813,8 @@ lookup_interface (tree ident) } } + + /* Implement @defs (classname) within struct bodies. */ tree @@ -3829,19 +3831,242 @@ objc_get_class_ivars (tree class_name) return error_mark_node; } + +/* Functions used by the hashtable for field duplicates in + objc_detect_field_duplicates(). Ideally, we'd use a standard + key-value dictionary hashtable , and store as keys the field names, + and as values the actual declarations (used to print nice error + messages with the locations). But, the hashtable we are using only + allows us to store keys in the hashtable, without values (it looks
ObjC: get rid of another unnecessary, temporary copy of instance variables
This patch for the Objective-C compiler gets rid of another case where we'd create a temporary tree chain with a copy of all the instance variables of a class just to do a simple check on them. The check is the one to check the scope of the instance variable that is being accessed; without this patch, the check requires copying all the instance variables for the class on a temporary tree chain. With this patch, the check is done (as you'd expect) on the instance variables themselves, without copying them. This is obviously faster; on the other hand, the typical GNUstep-based ObjC file has classes with few instance variables (maybe 10 or 20) and only accesses instance variables up to a few hundred times per file, so the speedup is only of the order of 0.1% to 0.2% even with -fsyntax-only. Of course, in unusual cases (ie, classes with many instance variables, and a big file accessing instance variables lots of times) the speedup may be bigger. Ok to commit ? Thanks Index: ChangeLog === --- ChangeLog (revision 172511) +++ ChangeLog (working copy) @@ -1,5 +1,10 @@ 2011-04-15 Nicola Pero nicola.p...@meta-innovation.com + * objc-act.c (ivar_of_class): New. + (objc_is_public): Use ivar_of_class. + +2011-04-15 Nicola Pero nicola.p...@meta-innovation.com + * objc-act.c (objc_get_interface_ivars): Removed. (objc_detect_field_duplicates): New. (hash_instance_variable): New. Index: objc-act.c === --- objc-act.c (revision 172511) +++ objc-act.c (working copy) @@ -6367,6 +6367,35 @@ is_private (tree decl) DECL_NAME (decl))); } +/* Searches all the instance variables of 'klass' and of its + superclasses for an instance variable whose name (identifier) is + 'ivar_name_ident'. Return the declaration (DECL) of the instance + variable, if found, or NULL_TREE, if not found. */ +static inline tree +ivar_of_class (tree klass, tree ivar_name_ident) +{ + /* First, look up the ivar in CLASS_RAW_IVARS. */ + tree decl_chain = CLASS_RAW_IVARS (klass); + + for ( ; decl_chain; decl_chain = DECL_CHAIN (decl_chain)) +if (DECL_NAME (decl_chain) == ivar_name_ident) + return decl_chain; + + /* If not found, search up the class hierarchy. */ + while (CLASS_SUPER_NAME (klass)) +{ + klass = lookup_interface (CLASS_SUPER_NAME (klass)); + + decl_chain = CLASS_RAW_IVARS (klass); + + for ( ; decl_chain; decl_chain = DECL_CHAIN (decl_chain)) + if (DECL_NAME (decl_chain) == ivar_name_ident) + return decl_chain; +} + + return NULL_TREE; +} + /* We have an instance variable reference;, check to see if it is public. */ int @@ -6397,7 +6426,7 @@ objc_is_public (tree expr, tree identifier) return 0; } - if ((decl = is_ivar (get_class_ivars (klass, true), identifier))) + if ((decl = ivar_of_class (klass, identifier))) { if (TREE_PUBLIC (decl)) return 1;
RE: [build] Allow building libobjc_gc on Tru64 UNIX, Darwin
I recently tried to build with --enable-libobjc-gc. While this worked out of the box on Solaris, I ran intro trouble on both Tru64 UNIX and Darwin. [...] The following patch fixes both issues. [...] Ok for mainline if both pass? Yes. [and by the way, I think you're fixing PR libobjc/32037 in the process. :-)] Btw., it would be considerably easier if --enable-libobjc-gc could be enabled automatically if boehm-gc is configured. Yes. Besides, it seems that libobjc_gc isn't tested anywhere. Yes. Thanks!
ObjC: remove temporary tree list used when calling objc_declare_protocols()
This patch cleans up objc_declare_protocols() to avoid having to create temporary tree chains just to perform the function call (in the same way as my other patch cleaned up objc_declare_class()). Ok to commit ? Thanks PS: This patch has no measurable effect on compilation speed in my tests because the GNUstep codebase almost never uses the protocol forward-declaration syntax @protocol X;. Another codebase that use it extensively may see some tiny benefit. Index: gcc/c-family/c-objc.h === --- gcc/c-family/c-objc.h (revision 172399) +++ gcc/c-family/c-objc.h (working copy) @@ -52,7 +52,7 @@ extern int objc_is_public (tree, tree); extern tree objc_is_id (tree); extern void objc_declare_alias (tree, tree); extern void objc_declare_class (tree); -extern void objc_declare_protocols (tree, tree); +extern void objc_declare_protocol (tree, tree); extern tree objc_build_message_expr (tree, tree); extern tree objc_finish_message_expr (tree, tree, tree, tree*); extern tree objc_build_selector_expr (location_t, tree); Index: gcc/c-family/ChangeLog === --- gcc/c-family/ChangeLog (revision 172399) +++ gcc/c-family/ChangeLog (working copy) @@ -1,3 +1,9 @@ +2011-04-13 Nicola Pero nicola.p...@meta-innovation.com + + * stub-objc.c (objc_declare_protocols): Renamed to + objc_declare_protocol. + * c-objc.h: Likewise. + 2011-04-12 Nathan Froyd froy...@codesourcery.com * c-common.h (c_common_init_ts): Declare. Index: gcc/c-family/stub-objc.c === --- gcc/c-family/stub-objc.c(revision 172399) +++ gcc/c-family/stub-objc.c(working copy) @@ -115,7 +115,7 @@ objc_declare_class (tree ARG_UNUSED (list)) } void -objc_declare_protocols (tree ARG_UNUSED (list), tree ARG_UNUSED (attributes)) +objc_declare_protocol (tree ARG_UNUSED (name), tree ARG_UNUSED (attributes)) { } Index: gcc/objc/ChangeLog === --- gcc/objc/ChangeLog (revision 172399) +++ gcc/objc/ChangeLog (working copy) @@ -1,5 +1,12 @@ 2011-04-13 Nicola Pero nicola.p...@meta-innovation.com + * objc-act.c (objc_declare_protocols): Renamed to + objc_declare_protocol. Changed first argument to be an identifier + instead of a tree chain of identifiers, so that callers don't have + to create a temporary tree chain. + +2011-04-13 Nicola Pero nicola.p...@meta-innovation.com + * objc-act.c (build_keyword_selector): Use get_identifier_with_length instead of get_identifier. Index: gcc/objc/objc-act.c === --- gcc/objc/objc-act.c (revision 172399) +++ gcc/objc/objc-act.c (working copy) @@ -7869,9 +7869,8 @@ lookup_protocol (tree ident, bool warn_if_deprecat they are already declared or defined, the function has no effect. */ void -objc_declare_protocols (tree names, tree attributes) +objc_declare_protocol (tree name, tree attributes) { - tree list; bool deprecated = false; #ifdef OBJCPLUS @@ -7896,29 +7895,25 @@ void } } - for (list = names; list; list = TREE_CHAIN (list)) + if (lookup_protocol (name, /* warn if deprecated */ false, + /* definition_required */ false) == NULL_TREE) { - tree name = TREE_VALUE (list); - - if (lookup_protocol (name, /* warn if deprecated */ false, - /* definition_required */ false) == NULL_TREE) + tree protocol = make_node (PROTOCOL_INTERFACE_TYPE); + + TYPE_LANG_SLOT_1 (protocol) + = make_tree_vec (PROTOCOL_LANG_SLOT_ELTS); + PROTOCOL_NAME (protocol) = name; + PROTOCOL_LIST (protocol) = NULL_TREE; + add_protocol (protocol); + PROTOCOL_DEFINED (protocol) = 0; + PROTOCOL_FORWARD_DECL (protocol) = NULL_TREE; + + if (attributes) { - tree protocol = make_node (PROTOCOL_INTERFACE_TYPE); - - TYPE_LANG_SLOT_1 (protocol) - = make_tree_vec (PROTOCOL_LANG_SLOT_ELTS); - PROTOCOL_NAME (protocol) = name; - PROTOCOL_LIST (protocol) = NULL_TREE; - add_protocol (protocol); - PROTOCOL_DEFINED (protocol) = 0; - PROTOCOL_FORWARD_DECL (protocol) = NULL_TREE; - - if (attributes) - { - TYPE_ATTRIBUTES (protocol) = attributes; - if (deprecated) - TREE_DEPRECATED (protocol) = 1; - } + /* TODO: Do we need to store the attributes here ? */ + TYPE_ATTRIBUTES (protocol) = attributes; + if (deprecated) + TREE_DEPRECATED (protocol) = 1; } } } Index: gcc/ChangeLog === --- gcc/ChangeLog (revision 172399) +++ gcc/ChangeLog
ObjC: avoid creating temporary nodes just to compare method signatures
This patch fixes another inefficiency in the Objective-C compiler. When it was comparing method signatures, it would copy all the argument types into some temporary node chains, and then compare these copies. The copies are then thrown away. It all seems really pointless (since you can just access the argument types and compare them directly, as this patch does), but the inefficiency was hidden by the usage of get_arg_type_list() which looked like a very innocent and professionally looking API, while it does a very expensive copy of everything into a newly allocated chain of nodes. This patch saves about 10k node allocations when compiling a file that includes the Objective-C GNUstep system frameworks. With -fsyntax-only, that gives about a 0.5% speedup. Ok to commit ? Thanks Index: ChangeLog === --- ChangeLog (revision 172328) +++ ChangeLog (working copy) @@ -1,5 +1,12 @@ 2011-04-12 Nicola Pero nicola.p...@meta-innovation.com + * objc-act.c (comp_proto_with_proto): Do not create and use + inefficient temporary argument lists. Compare the arguments + directly. (match_proto_with_proto): Removed; incorporated into + comp_proto_with_proto (). + +2011-04-12 Nicola Pero nicola.p...@meta-innovation.com + * objc-act.c (printable_ivar_name): New. (add_instance_variable): Call printable_ivar_name() when an error message needs to be printed. Do not prepare the instance variable Index: objc-act.c === --- objc-act.c (revision 172328) +++ objc-act.c (working copy) @@ -147,7 +147,6 @@ static void objc_gen_property_data (tree, tree); static void objc_synthesize_getter (tree, tree, tree); static void objc_synthesize_setter (tree, tree, tree); static char *objc_build_property_setter_name (tree); -static int match_proto_with_proto (tree, tree, int); static tree lookup_property (tree, tree); static tree lookup_property_in_list (tree, tree); static tree lookup_property_in_protocol_list (tree, tree); @@ -4836,13 +4835,13 @@ objc_method_decl (enum tree_code opcode) return opcode == INSTANCE_METHOD_DECL || opcode == CLASS_METHOD_DECL; } -/* Used by `build_objc_method_call' and `comp_proto_with_proto'. Return - an argument list for method METH. CONTEXT is either METHOD_DEF or - METHOD_REF, saying whether we are trying to define a method or call - one. SUPERFLAG says this is for a send to super; this makes a - difference for the NeXT calling sequence in which the lookup and - the method call are done together. If METH is null, user-defined - arguments (i.e., beyond self and _cmd) shall be represented by `...'. */ +/* Used by `build_objc_method_call'. Return an argument list for + method METH. CONTEXT is either METHOD_DEF or METHOD_REF, saying + whether we are trying to define a method or call one. SUPERFLAG + says this is for a send to super; this makes a difference for the + NeXT calling sequence in which the lookup and the method call are + done together. If METH is null, user-defined arguments (i.e., + beyond self and _cmd) shall be represented by `...'. */ tree get_arg_type_list (tree meth, int context, int superflag) @@ -8241,19 +8240,13 @@ objc_types_share_size_and_alignment (tree type1, t static int comp_proto_with_proto (tree proto1, tree proto2, int strict) { + tree type1, type2; + /* The following test is needed in case there are hashing collisions. */ if (METHOD_SEL_NAME (proto1) != METHOD_SEL_NAME (proto2)) return 0; - return match_proto_with_proto (proto1, proto2, strict); -} - -static int -match_proto_with_proto (tree proto1, tree proto2, int strict) -{ - tree type1, type2; - /* Compare return types. */ type1 = TREE_VALUE (TREE_TYPE (proto1)); type2 = TREE_VALUE (TREE_TYPE (proto2)); @@ -8263,19 +8256,75 @@ comp_proto_with_proto (tree proto1, tree proto2, i return 0; /* Compare argument types. */ - for (type1 = get_arg_type_list (proto1, METHOD_REF, 0), - type2 = get_arg_type_list (proto2, METHOD_REF, 0); - type1 type2; - type1 = TREE_CHAIN (type1), type2 = TREE_CHAIN (type2)) -{ - if (!objc_types_are_equivalent (TREE_VALUE (type1), TREE_VALUE (type2)) - (strict - || !objc_types_share_size_and_alignment (TREE_VALUE (type1), - TREE_VALUE (type2 - return 0; -} - return (!type1 !type2); + /* The first argument (objc_object_type) is always the same, no need + to compare. */ + + /* The second argument (objc_selector_type) is always the same, no + need to compare. */ + + /* Compare the other arguments. */ + { +tree arg1, arg2; + +/* Compare METHOD_SEL_ARGS. */ +for (arg1 = METHOD_SEL_ARGS (proto1), arg2 = METHOD_SEL_ARGS (proto2); +arg1 arg2; +arg1 = DECL_CHAIN
ObjC: get rid of temporary tree list when compiling a method
This fixes another small inefficiency in the Objective-C compiler. When a method invocation is found, and the parser calls objc_build_method_expr() to compile it, it used to invoke it as in objc_build_message_expr (build_tree_list (rec, args)); this (trivial) patch removes the need to create the temporary tree list, so that the call becomes objc_build_message_expr (rec, args); it's also easier to understand, not just more efficient. The speedup is tiny, as it saves just one allocation per method invocation. It's more about cleaning up the codebase and migrating it from Lisp to C. Ok to commit ? Thanks Index: c-family/c-objc.h === --- c-family/c-objc.h (revision 172328) +++ c-family/c-objc.h (working copy) @@ -53,7 +53,7 @@ extern tree objc_is_id (tree); extern void objc_declare_alias (tree, tree); extern void objc_declare_class (tree); extern void objc_declare_protocols (tree, tree); -extern tree objc_build_message_expr (tree); +extern tree objc_build_message_expr (tree, tree); extern tree objc_finish_message_expr (tree, tree, tree, tree*); extern tree objc_build_selector_expr (location_t, tree); extern tree objc_build_protocol_expr (tree); Index: ChangeLog === --- ChangeLog (revision 172334) +++ ChangeLog (working copy) @@ -1,3 +1,8 @@ +2011-04-12 Nicola Pero nicola.p...@meta-innovation.com + + * c-objc.h (objc_build_message_expr): Updated prototype. + * stub-objc.c (objc_build_message_expr): Likewise. + 2011-04-12 Martin Jambor mjam...@suse.cz * c-gimplify.c (c_genericize): Call cgraph_get_create_node instead Index: c-family/stub-objc.c === --- c-family/stub-objc.c(revision 172328) +++ c-family/stub-objc.c(working copy) @@ -258,7 +258,7 @@ objc_build_selector_expr (location_t ARG_UNUSED (l } tree -objc_build_message_expr (tree ARG_UNUSED (expr)) +objc_build_message_expr (tree ARG_UNUSED (receiver), tree ARG_UNUSED (args)) { return 0; } Index: objc/ChangeLog === --- objc/ChangeLog (revision 172328) +++ objc/ChangeLog (working copy) @@ -1,5 +1,11 @@ 2011-04-12 Nicola Pero nicola.p...@meta-innovation.com + * objc-act.c (objc_build_message_expr): Accept two arguments + instead of one so that callers can simply pass the arguments + without having to create a temporary chain to hold them. + +2011-04-12 Nicola Pero nicola.p...@meta-innovation.com + * objc-act.c (printable_ivar_name): New. (add_instance_variable): Call printable_ivar_name() when an error message needs to be printed. Do not prepare the instance variable Index: objc/objc-act.c === --- objc/objc-act.c (revision 172328) +++ objc/objc-act.c (working copy) @@ -5027,14 +5027,13 @@ objc_message_selector (void) (*(abstract_decl(*)())_msgSuper)(receiver, selTransTbl[n], ...); */ tree -objc_build_message_expr (tree mess) +objc_build_message_expr (tree receiver, tree message_args) { - tree receiver = TREE_PURPOSE (mess); tree sel_name; #ifdef OBJCPLUS - tree args = TREE_PURPOSE (TREE_VALUE (mess)); + tree args = TREE_PURPOSE (message_args); #else - tree args = TREE_VALUE (mess); + tree args = message_args; #endif tree method_params = NULL_TREE; @@ -5058,7 +5057,7 @@ tree /* Build the parameter list to give to the method. */ if (TREE_CODE (args) == TREE_LIST) #ifdef OBJCPLUS -method_params = chainon (args, TREE_VALUE (TREE_VALUE (mess))); +method_params = chainon (args, TREE_VALUE (message_args)); #else { tree chain = args, prev = NULL_TREE; Index: ChangeLog === --- ChangeLog (revision 172328) +++ ChangeLog (working copy) @@ -1,5 +1,11 @@ 2011-04-12 Nicola Pero nicola.p...@meta-innovation.com + * c-parser.c (c_parser_initelt): Updated call to + objc_build_message_expr. + (c_parser_postfix_expression): Likewise. + +2011-04-12 Nicola Pero nicola.p...@meta-innovation.com + * c-parser.c (c_lex_one_token): Rewritten conditional used when compiling Objective-C to be more efficient. Index: cp/ChangeLog === --- cp/ChangeLog(revision 172328) +++ cp/ChangeLog(working copy) @@ -1,3 +1,8 @@ +2011-04-12 Nicola Pero nicola.p...@meta-innovation.com + + * parser.c (cp_parser_objc_message_expression): Updated call + to objc_build_message_expr. + 2011-04-12 Martin Jambor mjam...@suse.cz * class.c (cp_fold_obj_type_ref): Call cgraph_get_node instead of Index: cp/parser.c
ObjC: another tiny performance tidyup
This saves a few thousands strlen() calls per compilation by reusing the length of selector strings instead of calculating it again. Ok to commit ? Thanks PS: I'll come back to hashtables later, as they do deserve some discussion. I want to get all the other obvious tiny changes in first. Index: ChangeLog === --- ChangeLog (revision 172338) +++ ChangeLog (working copy) @@ -1,5 +1,10 @@ 2011-04-12 Nicola Pero nicola.p...@meta-innovation.com + * objc-act.c (build_keyword_selector): Use get_identifier_with_length + instead of get_identifier. + +2011-04-12 Nicola Pero nicola.p...@meta-innovation.com + * objc-act.c (objc_build_message_expr): Accept two arguments instead of one so that callers can simply pass the arguments without having to create a temporary chain to hold them. Index: objc-act.c === --- objc-act.c (revision 172338) +++ objc-act.c (working copy) @@ -4668,7 +4668,7 @@ build_keyword_selector (tree selector) strcat (buf, :); } - return get_identifier (buf); + return get_identifier_with_length (buf, len); } /* Used for declarations and definitions. */
ObjC: some minor optimizations
This patch removes some very minor inefficiencies in the ObjC compiler code. Ok to commit ? Thanks Index: gcc/objc/ChangeLog === --- gcc/objc/ChangeLog (revision 172239) +++ gcc/objc/ChangeLog (working copy) @@ -1,3 +1,8 @@ +2011-04-10 Nicola Pero nicola.p...@meta-innovation.com + + * objc-act.c (objc_is_class_name, objc_is_id): For efficiency, + avoid calling identifier_global_value() multiple times. + 2011-04-06 Joseph Myers jos...@codesourcery.com * objc-act.c: Include c-target.h instead of target.h. Index: gcc/objc/objc-act.c === --- gcc/objc/objc-act.c (revision 172239) +++ gcc/objc/objc-act.c (working copy) @@ -3411,9 +3411,13 @@ objc_is_class_name (tree ident) { hash target; - if (ident TREE_CODE (ident) == IDENTIFIER_NODE - identifier_global_value (ident)) -ident = identifier_global_value (ident); + if (ident TREE_CODE (ident) == IDENTIFIER_NODE) +{ + tree t = identifier_global_value (ident); + if (t) + ident = t; +} + while (ident TREE_CODE (ident) == TYPE_DECL DECL_ORIGINAL_TYPE (ident)) ident = OBJC_TYPE_NAME (DECL_ORIGINAL_TYPE (ident)); @@ -3453,9 +3457,12 @@ objc_is_class_name (tree ident) tree objc_is_id (tree type) { - if (type TREE_CODE (type) == IDENTIFIER_NODE - identifier_global_value (type)) -type = identifier_global_value (type); + if (type TREE_CODE (type) == IDENTIFIER_NODE) +{ + tree t = identifier_global_value (type); + if (t) + type = t; +} if (type TREE_CODE (type) == TYPE_DECL) type = TREE_TYPE (type); Index: gcc/ChangeLog === --- gcc/ChangeLog (revision 172239) +++ gcc/ChangeLog (working copy) @@ -1,3 +1,8 @@ +2011-04-10 Nicola Pero nicola.p...@meta-innovation.com + + * c-parser.c (c_lex_one_token): Rewritten conditional used when + compiling Objective-C to be more efficient. + 2011-04-09 Anatoly Sokolov ae...@post.ru * expr.c (expand_expr_real_1): Use add_to_hard_reg_set function Index: gcc/c-parser.c === --- gcc/c-parser.c (revision 172239) +++ gcc/c-parser.c (working copy) @@ -334,8 +334,7 @@ c_lex_one_token (c_parser *parser, c_token *token) variables and typedefs, and hence are shadowed by local declarations. */ if (objc_interface_decl -(global_bindings_p () - || (!objc_force_identifier !decl))) + (!objc_force_identifier || global_bindings_p ())) { token-value = objc_interface_decl; token-id_kind = C_ID_CLASSNAME;
ObjC: do not prepare instance variables for output unless there is an actual error message to print
This is another very small optimization. Whenever the ObjC compiler found an instance variable, it was preparing it for printing it in error messages. Of course, in the typical ObjC compilation run with Foundation and AppKit the compiler will see about 1.5k instance variables, none of which will generate any error message (in most cases), so this patch changes the compiler to only do the work for pretty printing when there is an actual error message to print. The speedup is tiny. Ok to commit ? Thanks Index: ChangeLog === --- ChangeLog (revision 172254) +++ ChangeLog (working copy) @@ -1,3 +1,10 @@ +2011-04-11 Nicola Pero nicola.p...@meta-innovation.com + + * objc-act.c (printable_ivar_name): New. + (add_instance_variable): Call printable_ivar_name() when an error + message needs to be printed. Do not prepare the instance variable + for printing unless there is an actual error. + 2011-04-06 Joseph Myers jos...@codesourcery.com * objc-act.c: Include c-target.h instead of target.h. Index: objc-act.c === --- objc-act.c (revision 172254) +++ objc-act.c (working copy) @@ -5974,6 +5974,17 @@ flexible_array_type_p (tree type) } #endif +/* Produce a printable version of an ivar name. This is only used + inside add_instance_variable. */ +static const char * +printable_ivar_name (tree field_decl) +{ + if (DECL_NAME (field_decl)) +return identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (field_decl))); + else +return _(unnamed); +} + /* Called after parsing each instance variable declaration. Necessary to preserve typedefs and implement public/private... @@ -5984,15 +5995,12 @@ add_instance_variable (tree klass, objc_ivar_visib tree field_decl) { tree field_type = TREE_TYPE (field_decl); - const char *ivar_name = DECL_NAME (field_decl) - ? identifier_to_locale (IDENTIFIER_POINTER (DECL_NAME (field_decl))) - : _(unnamed); #ifdef OBJCPLUS if (TREE_CODE (field_type) == REFERENCE_TYPE) { error (illegal reference type specified for instance variable %qs, -ivar_name); +printable_ivar_name (field_decl)); /* Return class as is without adding this ivar. */ return klass; } @@ -6002,7 +6010,8 @@ add_instance_variable (tree klass, objc_ivar_visib || TYPE_SIZE (field_type) == error_mark_node) /* 'type[0]' is allowed, but 'type[]' is not! */ { - error (instance variable %qs has unknown size, ivar_name); + error (instance variable %qs has unknown size, +printable_ivar_name (field_decl)); /* Return class as is without adding this ivar. */ return klass; } @@ -6022,7 +6031,8 @@ add_instance_variable (tree klass, objc_ivar_visib to calculate the offset of the next instance variable. */ if (flexible_array_type_p (field_type)) { - error (instance variable %qs uses flexible array member, ivar_name); + error (instance variable %qs uses flexible array member, +printable_ivar_name (field_decl)); /* Return class as is without adding this ivar. */ return klass; } @@ -6069,7 +6079,7 @@ add_instance_variable (tree klass, objc_ivar_visib error (type %qE has virtual member functions, type_name); error (illegal aggregate type %qE specified for instance variable %qs, -type_name, ivar_name); +type_name, printable_ivar_name (field_decl)); /* Return class as is without adding this ivar. */ return klass; }
ObjC: interface hashtable rewritten for speed and simplicity
This patch rewrites the ObjC interface hashtable for speed, saving in excess of 100k function calls per typical compilation run in my benchmarks. I did extensively benchmark this solution (and other solutions) while developing it a few months ago. trunk has changed substantially in the meanwhile, so those results do not necessarily apply, and I now just want to get the changes into trunk without having to rebenchmark everything, but to give an idea, I'd expect this change to speed up the compiler by about 1% to 2% when compiling real code with -fsyntax-only in release mode. Anyhow, the new data structure is really simple and obvious, it is exactly designed for the task, it is (clearly) lot more efficient as all the function calls that used to be required to do anything are gone, and the hashtable size has been tuned. Ok to commit ? Thanks Index: ChangeLog === --- ChangeLog (revision 172255) +++ ChangeLog (working copy) @@ -1,3 +1,15 @@ +2011-04-11 Nicola Pero nicola.p...@meta-innovation.com + + Rewritten the hashtable holding interfaces for speed. + * objc-act.h (INTERFACE_HASHTABLE_SIZE, interface_hashtable_entry, + interface_hash, interface_hashtable): New. + (interface_chain, OCTI_INF_CHAIN): Removed. + * objc-act.c (interface_tuple, interface_htab, hash_interface, + eq_interface): Removed. + (lookup_interface): Rewritten. + (add_class): Renamed to add_interface, reimplemented. + (interface_hashtable): New. + 2011-04-06 Joseph Myers jos...@codesourcery.com * objc-act.c: Include c-target.h instead of target.h. Index: objc-act.c === --- objc-act.c (revision 172255) +++ objc-act.c (working copy) @@ -187,7 +187,11 @@ static hash hash_lookup (hash *, tree); static tree lookup_method (tree, tree); static tree lookup_method_static (tree, tree, int); -static tree add_class (tree, tree); +/* Hashtable with all the interfaces. You can look things up in it by + using lookup_interface(). */ +interface_hash *interface_hashtable = 0; +static void add_interface (tree, tree); + static void add_category (tree, tree); static inline tree lookup_category (tree, tree); @@ -3764,27 +3768,6 @@ objc_generate_write_barrier (tree lhs, enum tree_c return result; } -struct GTY(()) interface_tuple { - tree id; - tree class_name; -}; - -static GTY ((param_is (struct interface_tuple))) htab_t interface_htab; - -static hashval_t -hash_interface (const void *p) -{ - const struct interface_tuple *d = (const struct interface_tuple *) p; - return IDENTIFIER_HASH_VALUE (d-id); -} - -static int -eq_interface (const void *p1, const void *p2) -{ - const struct interface_tuple *d = (const struct interface_tuple *) p1; - return d-id == p2; -} - tree lookup_interface (tree ident) { @@ -3797,19 +3780,19 @@ lookup_interface (tree ident) return NULL_TREE; { -struct interface_tuple **slot; -tree i = NULL_TREE; +interface_hash target; + +target = interface_hashtable[IDENTIFIER_HASH_VALUE (ident) % INTERFACE_HASHTABLE_SIZE]; -if (interface_htab) +while (target) { - slot = (struct interface_tuple **) - htab_find_slot_with_hash (interface_htab, ident, - IDENTIFIER_HASH_VALUE (ident), - NO_INSERT); - if (slot *slot) - i = (*slot)-class_name; + if (ident == target-ident) + return target-class_name; + + target = target-next; } -return i; + +return NULL_TREE; } } @@ -5507,6 +5490,8 @@ hash_init (void) ivar_offset_hash_list = ggc_alloc_cleared_vec_hash (SIZEHASHTABLE); + interface_hashtable = ggc_alloc_cleared_vec_interface_hash (INTERFACE_HASHTABLE_SIZE); + /* Initialize the hash table used to hold the constant string objects. */ string_htab = htab_create_ggc (31, string_hash, string_eq, NULL); @@ -5878,29 +5863,16 @@ objc_add_method (tree klass, tree method, int is_c return method; } -static tree -add_class (tree class_name, tree name) +static void +add_interface (tree class_name, tree name) { - struct interface_tuple **slot; - - /* Put interfaces on list in reverse order. */ - TREE_CHAIN (class_name) = interface_chain; - interface_chain = class_name; - - if (interface_htab == NULL) -interface_htab = htab_create_ggc (31, hash_interface, eq_interface, NULL); - slot = (struct interface_tuple **) -htab_find_slot_with_hash (interface_htab, name, - IDENTIFIER_HASH_VALUE (name), - INSERT); - if (!*slot) -{ - *slot = ggc_alloc_cleared_interface_tuple (); - (*slot)-id = name; -} - (*slot)-class_name = class_name; - - return interface_chain; + int slot = IDENTIFIER_HASH_VALUE (name
RE: [objc++] RFH: PR 48167 gengtype failure (issue4291054)
The Obj-C++ FE is kind of weird as it shares files from cp/ and objc/, so I'm missing some other connection I need to make to fix this. Any ideas? As far as I can see, the problem is that header files (such as cp/parser.h) generate GC stuff that gets put into gtype-{lang}.h, where {lang} is determined by looking at the directory where the file is (eg, if it's in the cp/ directory, then {lang} is cp) ... unless you override this with a custom hardcoded rule in gengtype.c. It seems that all files that are shared between ObjC or C++ and ObjC++ have custom hardcoded rules in gengtype.c. The cp/parser.h file you added didn't, and without it, every time it is processed, the results are stored in gtype-cp.h even if the file is processed for ObjC++. :-( This all looks ugly. Anyhow, until someone refactors everything, the following patch fixes ObjC++ bootstrap in trunk by processing cp/parser.h in the same way as the other C++ headers are processed. :-) Ok to commit ? Thanks Index: gcc/gengtype.c === --- gcc/gengtype.c (revision 171155) +++ gcc/gengtype.c (working copy) @@ -1761,6 +1761,12 @@ matters, so change with extreme care! */ struct file_rule_st files_rules[] = { + /* The general rule assumes that files in subdirectories belong to a + particular front-end, and files not in subdirectories are shared. + The following rules deal with exceptions - files that are in + subdirectories and yet are shared, and files that are top-level, + but are not shared. */ + /* the c-family/ source directory is special. */ { DIR_PREFIX_REGEX c-family/([[:alnum:]_-]*)\\.c$, REG_EXTENDED, NULL_REGEX, @@ -1792,7 +1798,12 @@ REG_EXTENDED, NULL_REGEX, gt-cp-name-lookup.h, cp/name-lookup.c, NULL_FRULACT }, - /* objc/objc-act.h fives gt-objc-objc-act.h for objc/objc-act.c ! */ + /* cp/parser.h gives gt-cp-parser.h for cp/parser.c ! */ + { DIR_PREFIX_REGEX cp/parser\\.h$, +REG_EXTENDED, NULL_REGEX, +gt-cp-parser.h, cp/parser.c, NULL_FRULACT }, + + /* objc/objc-act.h gives gt-objc-objc-act.h for objc/objc-act.c ! */ { DIR_PREFIX_REGEX objc/objc-act\\.h$, REG_EXTENDED, NULL_REGEX, gt-objc-objc-act.h, objc/objc-act.c, NULL_FRULACT }, Index: gcc/ChangeLog === --- gcc/ChangeLog (revision 171155) +++ gcc/ChangeLog (working copy) @@ -1,3 +1,7 @@ +2011-03-18 Nicola Pero nicola.p...@meta-innovation.com + + * gengtype.c (files_rules): Added rule for cp/parser.h. + 2011-03-18 Maxim Kuvyrkov ma...@codesourcery.com PR rtl-optimization/48170 Index: gcc/objcp/Make-lang.in === --- gcc/objcp/Make-lang.in (revision 171155) +++ gcc/objcp/Make-lang.in (working copy) @@ -45,7 +45,7 @@ .PHONY: obj-c++ START_HDRS = $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(CXX_TREE_H) \ - langhooks.h c-family/c-objc.h objc/objc-act.h + $(CXX_PARSER_H) $(CXX_PRETTY_PRINT_H) langhooks.h c-family/c-objc.h objc/objc-act.h # Use maximal warnings for this front end. Also, make ObjC and C++ # headers accessible. @@ -78,7 +78,7 @@ objcp/objcp-lang.o : objcp/objcp-lang.c $(START_HDRS) \ $(C_COMMON_H) $(LANGHOOKS_DEF_H) cp/cp-objcp-common.h \ - $(TARGET_H) gtype-objcp.h + $(TARGET_H) gtype-objcp.h objcp/objcp-decl.o : objcp/objcp-decl.c \ $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(CXX_TREE_H) \ Index: gcc/objcp/ChangeLog === --- gcc/objcp/ChangeLog (revision 171155) +++ gcc/objcp/ChangeLog (working copy) @@ -1,3 +1,11 @@ +2011-03-17 Nicola Pero nicola.p...@meta-innovation.com + + * Make-lang.in (START_HDRS): Added CXX_PARSER_H and + CXX_PRETTY_PRINT_H. + * config-lang.in (gtfiles): Added cp/parser.h and reorganized list + so that it is more obvious that it is identical to the C++ one + with the addition of some files at the end. + 2011-03-06 Joseph Myers jos...@codesourcery.com * lang-specs.h: Match -save-temps* instead of -save-temps. Index: gcc/objcp/config-lang.in === --- gcc/objcp/config-lang.in(revision 171155) +++ gcc/objcp/config-lang.in(working copy) @@ -37,5 +37,14 @@ lang_requires=objc c++ subdir_requires=objc cp -gtfiles=\$(srcdir)/objc/objc-act.h \$(srcdir)/objc/objc-act.c \$(srcdir)/objc/objc-runtime-shared-support.c \$(srcdir)/objc/objc-gnu-runtime-abi-01.c \$(srcdir)/objc/objc-next-runtime-abi-01.c \$(srcdir)/objc/objc-next-runtime-abi-02.c \$(srcdir)/cp/call.c \$(srcdir)/cp/class.c \$(srcdir)/cp/cp-tree.h \$(srcdir)/cp/decl.c \$(srcdir)/cp/decl2.c \$(srcdir)/cp/mangle.c \$(srcdir)/cp/method.c \$(srcdir)/cp/name-lookup.h \$(srcdir)/cp/name-lookup.c \$(srcdir)/cp/cp-objcp-common.c
Re: [objc++] RFH: PR 48167 gengtype failure (issue4291054)
+ /* cp/parser.h gives gt-cp-parser.h for cp/parser.c ! */ + { DIR_PREFIX_REGEX cp/parser\\.h$, + REG_EXTENDED, NULL_REGEX, + gt-cp-parser.h, cp/parser.c, NULL_FRULACT }, But cp/parser.c also gets its own gt-cp-parser.h. Won't they conflict? Doesn't this mean that cp/parser.h should be renamed to something else? (say cp/cp-parser.h). My understanding is that, with that rule, GC generated code from cp-parser.h will end up into gt-cp-parser.h, together with the code generated from cp-parser.c. gengtype basically runs once for all files, so has no problem putting GC generated code from multiple input files into the same output file. In practical terms, cp/decl.c and cp/decl.h (or cp/name-lookup.c and cp/name-lookup.h) are in a similar situation, and work fine with similar gengtype.c rules. :-) Thanks
Re: ObjC/ObjC++: Fix property encoding on Apple
On 4 Mar 2011, at 16:41, Dominique Dhumieres wrote: Nicola, obj-c++.dg/property/property-encoding-1.mm fails to compile with: [...] You need to use the right C++ incantations, [...] Apologies. I now did the obvious changes that should make it work in both the ObjC and ObjC++ testsuites, and committed them as obvious. Please let me know if it still doesn't work! Thanks Index: ChangeLog === --- ChangeLog (revision 170682) +++ ChangeLog (working copy) @@ -1,5 +1,10 @@ 2011-03-04 Nicola Pero nicola.p...@meta-innovation.com + * objc.dg/property/property-encoding-1.m: Tidied up testcase. + * obj-c++.dg/property/property-encoding-1.mm: Likewise. + +2011-03-04 Nicola Pero nicola.p...@meta-innovation.com + * objc.dg/gnu-api-2-property.m: Added tests for property_getName() and property_getAttributes() if __OBJC2__. * obj-c++.dg/gnu-api-2-property.mm: Likewise. Index: objc.dg/property/property-encoding-1.m === --- objc.dg/property/property-encoding-1.m (revision 170682) +++ objc.dg/property/property-encoding-1.m (working copy) @@ -89,22 +89,21 @@ void error (objc_property_t p) } /* Concatenate 3 strings and return the result. */ -char *concat (char *a, char *b, char *c) +char *concat (const char *a, const char *b, const char *c) { /* We happily leak memory here. This is a test. */ - char *x = malloc (sizeof (char) * 128); + char *x = (char *)malloc (sizeof (char) * 128); snprintf (x, 128, %s%s%s, a, b, c); return x; } #endif -int main(int argc, void **args) +int main (void) { #ifdef __OBJC2__ Class c = objc_getClass (MySubClass); objc_property_t p; - const char *expected_result; p = class_getProperty (c, char_property); /* Usually we expect Tc,Vchar_property, but if a char is of Index: obj-c++.dg/property/property-encoding-1.mm === --- obj-c++.dg/property/property-encoding-1.mm (revision 170682) +++ obj-c++.dg/property/property-encoding-1.mm (working copy) @@ -89,22 +89,21 @@ void error (objc_property_t p) } /* Concatenate 3 strings and return the result. */ -char *concat (char *a, char *b, char *c) +char *concat (const char *a, const char *b, const char *c) { /* We happily leak memory here. This is a test. */ - char *x = malloc (sizeof (char) * 128); + char *x = (char *)malloc (sizeof (char) * 128); snprintf (x, 128, %s%s%s, a, b, c); return x; } #endif -int main(int argc, char **args) +int main (void) { #ifdef __OBJC2__ Class c = objc_getClass (MySubClass); objc_property_t p; - const char *expected_result; p = class_getProperty (c, char_property); /* Usually we expect Tc,Vchar_property, but if a char is of