From: Ziemowit Laski Date: Wed, 29 Jun 2005 21:01:29 +0000 (+0000) Subject: darwin.c (machopic_select_section): constant ObjC string objects now always have... X-Git-Tag: misc/cutover-cvs2svn~2064 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c64de75f40ec7f27630860a2950da995fff3771a;p=thirdparty%2Fgcc.git darwin.c (machopic_select_section): constant ObjC string objects now always have type "__builtin_ObjCString". [gcc/ChangeLog] 2005-06-29 Ziemowit Laski * config/darwin.c (machopic_select_section): constant ObjC string objects now always have type "__builtin_ObjCString". [gcc/objc/ChangeLog] 2005-06-29 Ziemowit Laski * objc-act.c (objc_build_internal_const_str_type): New function. (check_string_class_template): Use objc_get_class_ivars() instead of TYPE_FIELDS() to retrieve ivar list. (AT_LEAST_AS_LARGE_AS): Check the size of each field's type rather than the field itself. (objc_build_string_object): Synthesize a "__builtin_ObjCString" type and use it to lay out compile-time string objects. * objc-act.h (OCTI_INTERNAL_CNST_STR_TYPE, internal_const_str_type): New. [gcc/testsuite/ChangeLog] 2005-06-29 Ziemowit Laski * obj-c++.dg/const-str-1[0-1].mm: New. * objc.dg/const-str-1[0-1].m: New. From-SVN: r101437 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9bf9bc22cd0d..ed408afbd1a1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2005-06-29 Ziemowit Laski + + * config/darwin.c (machopic_select_section): constant ObjC string + objects now always have type "__builtin_ObjCString". + 2005-06-29 Richard Henderson * config/alpha/alpha.md (vec_shl_, vec_shr_): New. diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c index 13de45f74a57..cac61e403c9a 100644 --- a/gcc/config/darwin.c +++ b/gcc/config/darwin.c @@ -1048,10 +1048,14 @@ machopic_select_section (tree exp, int reloc, tree name = TYPE_NAME (TREE_TYPE (exp)); if (TREE_CODE (name) == TYPE_DECL) name = DECL_NAME (name); - if (!strcmp (IDENTIFIER_POINTER (name), "NSConstantString")) - objc_constant_string_object_section (); - else if (!strcmp (IDENTIFIER_POINTER (name), "NXConstantString")) - objc_string_object_section (); + + if (!strcmp (IDENTIFIER_POINTER (name), "__builtin_ObjCString")) + { + if (flag_next_runtime) + objc_constant_string_object_section (); + else + objc_string_object_section (); + } else base_function (); } diff --git a/gcc/objc/ChangeLog b/gcc/objc/ChangeLog index 52325f4b70ab..a11966ea7afe 100644 --- a/gcc/objc/ChangeLog +++ b/gcc/objc/ChangeLog @@ -1,3 +1,15 @@ +2005-06-29 Ziemowit Laski + + * objc-act.c (objc_build_internal_const_str_type): New function. + (check_string_class_template): Use objc_get_class_ivars() instead + of TYPE_FIELDS() to retrieve ivar list. + (AT_LEAST_AS_LARGE_AS): Check the size of each field's type rather + than the field itself. + (objc_build_string_object): Synthesize a "__builtin_ObjCString" + type and use it to lay out compile-time string objects. + * objc-act.h (OCTI_INTERNAL_CNST_STR_TYPE, internal_const_str_type): + New. + 2005-06-28 Paul Brook * objc-act.c (objc_init_exceptions): Call diff --git a/gcc/objc/objc-act.c b/gcc/objc/objc-act.c index d4c20a87ec9f..b522b8ddba63 100644 --- a/gcc/objc/objc-act.c +++ b/gcc/objc/objc-act.c @@ -814,9 +814,9 @@ objc_build_struct (tree name, tree fields, tree super_name) && TREE_CODE (TREE_CHAIN (field)) == FIELD_DECL) field = TREE_CHAIN (field); - /* For ObjC ABI purposes, the "packed" size of a base class is - the the sum of the offset and the size (in bits) of the last - field in the class. */ + /* For ObjC ABI purposes, the "packed" size of a base class is the + the sum of the offset and the size (in bits) of the last field + in the class. */ DECL_SIZE (base) = (field && TREE_CODE (field) == FIELD_DECL ? size_binop (PLUS_EXPR, @@ -1707,11 +1707,11 @@ synth_module_prologue (void) static int check_string_class_template (void) { - tree field_decl = TYPE_FIELDS (constant_string_type); + tree field_decl = objc_get_class_ivars (constant_string_id); #define AT_LEAST_AS_LARGE_AS(F, T) \ (F && TREE_CODE (F) == FIELD_DECL \ - && (TREE_INT_CST_LOW (DECL_SIZE (F)) \ + && (TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (F))) \ >= TREE_INT_CST_LOW (TYPE_SIZE (T)))) if (!AT_LEAST_AS_LARGE_AS (field_decl, ptr_type_node)) @@ -1730,6 +1730,27 @@ check_string_class_template (void) /* Avoid calling `check_string_class_template ()' more than once. */ static GTY(()) int string_layout_checked; +/* Construct an internal string layout to be used as a template for + creating NSConstantString/NXConstantString instances. */ + +static tree +objc_build_internal_const_str_type (void) +{ + tree type = (*lang_hooks.types.make_type) (RECORD_TYPE); + tree fields = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node); + tree field = build_decl (FIELD_DECL, NULL_TREE, ptr_type_node); + + TREE_CHAIN (field) = fields; fields = field; + field = build_decl (FIELD_DECL, NULL_TREE, unsigned_type_node); + TREE_CHAIN (field) = fields; fields = field; + /* NB: The finish_builtin_struct() routine expects FIELD_DECLs in + reverse order! */ + finish_builtin_struct (type, "__builtin_ObjCString", + fields, NULL_TREE); + + return type; +} + /* Custom build_string which sets TREE_TYPE! */ static tree @@ -1802,6 +1823,7 @@ objc_build_string_object (tree string) { string_layout_checked = -1; constant_string_class = lookup_interface (constant_string_id); + internal_const_str_type = objc_build_internal_const_str_type (); if (!constant_string_class || !(constant_string_type @@ -1838,9 +1860,9 @@ objc_build_string_object (tree string) *loc = desc = ggc_alloc (sizeof (*desc)); desc->literal = string; - /* GNU: & ((NXConstantString) { NULL, string, length }) */ - /* NeXT: & ((NSConstantString) { isa, string, length }) */ - fields = TYPE_FIELDS (constant_string_type); + /* GNU: (NXConstantString *) & ((__builtin_ObjCString) { NULL, string, length }) */ + /* NeXT: (NSConstantString *) & ((__builtin_ObjCString) { isa, string, length }) */ + fields = TYPE_FIELDS (internal_const_str_type); initlist = build_tree_list (fields, flag_next_runtime @@ -1852,13 +1874,13 @@ objc_build_string_object (tree string) fields = TREE_CHAIN (fields); initlist = tree_cons (fields, build_int_cst (NULL_TREE, length), initlist); - constructor = objc_build_constructor (constant_string_type, + constructor = objc_build_constructor (internal_const_str_type, nreverse (initlist)); TREE_INVARIANT (constructor) = true; if (!flag_next_runtime) constructor - = objc_add_static_instance (constructor, constant_string_type); + = objc_add_static_instance (constructor, internal_const_str_type); else { var = build_decl (CONST_DECL, NULL, TREE_TYPE (constructor)); @@ -1870,7 +1892,8 @@ objc_build_string_object (tree string) desc->constructor = constructor; } - addr = build_unary_op (ADDR_EXPR, desc->constructor, 1); + addr = convert (build_pointer_type (constant_string_type), + build_unary_op (ADDR_EXPR, desc->constructor, 1)); return addr; } diff --git a/gcc/objc/objc-act.h b/gcc/objc/objc-act.h index 8d32e962109e..dc62862673a5 100644 --- a/gcc/objc/objc-act.h +++ b/gcc/objc/objc-act.h @@ -263,6 +263,7 @@ enum objc_tree_index OCTI_CNST_STR_TYPE, OCTI_CNST_STR_GLOB_ID, OCTI_STRING_CLASS_DECL, + OCTI_INTERNAL_CNST_STR_TYPE, OCTI_SUPER_DECL, OCTI_UMSG_NONNIL_DECL, OCTI_UMSG_NONNIL_STRET_DECL, @@ -450,6 +451,7 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX]; #define constant_string_global_id \ objc_global_trees[OCTI_CNST_STR_GLOB_ID] #define string_class_decl objc_global_trees[OCTI_STRING_CLASS_DECL] +#define internal_const_str_type objc_global_trees[OCTI_INTERNAL_CNST_STR_TYPE] #define UOBJC_SUPER_decl objc_global_trees[OCTI_SUPER_DECL] #endif /* GCC_OBJC_ACT_H */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0c5663fdf6eb..0ba3b14ba23e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-06-29 Ziemowit Laski + + * obj-c++.dg/const-str-1[0-1].mm: New. + * objc.dg/const-str-1[0-1].m: New. + 2005-05-29 Richard Henderson * lib/target-supports.exp (check_effective_target_vect_no_int_max): diff --git a/gcc/testsuite/obj-c++.dg/const-str-10.mm b/gcc/testsuite/obj-c++.dg/const-str-10.mm new file mode 100644 index 000000000000..4efe044c13e3 --- /dev/null +++ b/gcc/testsuite/obj-c++.dg/const-str-10.mm @@ -0,0 +1,28 @@ +/* Test if ObjC constant string layout is checked properly, regardless of how + constant string classes get derived. */ +/* Contributed by Ziemowit Laski */ + +/* { dg-options "-fnext-runtime" } */ +/* { dg-do compile { target *-*-darwin* } } */ + +#include + +@interface NSString: Object +@end + +@interface NSSimpleCString : NSString { +@protected + char *bytes; + unsigned int numBytes; +} +@end + +@interface NSConstantString : NSSimpleCString +@end + +extern struct objc_class _NSConstantStringClassReference; + +const NSConstantString *appKey = @"MyApp"; + +/* { dg-final { scan-assembler ".section __OBJC, __cstring_object" } } */ +/* { dg-final { scan-assembler ".long\t__NSConstantStringClassReference\n\t.long\t.*\n\t.long\t5\n\t.data" } } */ diff --git a/gcc/testsuite/obj-c++.dg/const-str-11.mm b/gcc/testsuite/obj-c++.dg/const-str-11.mm new file mode 100644 index 000000000000..3b7ec7ad51f5 --- /dev/null +++ b/gcc/testsuite/obj-c++.dg/const-str-11.mm @@ -0,0 +1,27 @@ +/* Test if ObjC constant string layout is checked properly, regardless of how + constant string classes get derived. */ +/* Contributed by Ziemowit Laski */ + +/* { dg-options "-fnext-runtime -fconstant-string-class=XStr" } */ +/* { dg-do compile { target *-*-darwin* } } */ + +#include + +@interface XString: Object { +@protected + char *bytes; +} +@end + +@interface XStr : XString { +@public + unsigned int len; +} +@end + +extern struct objc_class _XStrClassReference; + +const XStr *appKey = @"MyApp"; + +/* { dg-final { scan-assembler ".section __OBJC, __cstring_object" } } */ +/* { dg-final { scan-assembler ".long\t__XStrClassReference\n\t.long\t.*\n\t.long\t5\n\t.data" } } */ diff --git a/gcc/testsuite/objc.dg/const-str-10.m b/gcc/testsuite/objc.dg/const-str-10.m new file mode 100644 index 000000000000..4efe044c13e3 --- /dev/null +++ b/gcc/testsuite/objc.dg/const-str-10.m @@ -0,0 +1,28 @@ +/* Test if ObjC constant string layout is checked properly, regardless of how + constant string classes get derived. */ +/* Contributed by Ziemowit Laski */ + +/* { dg-options "-fnext-runtime" } */ +/* { dg-do compile { target *-*-darwin* } } */ + +#include + +@interface NSString: Object +@end + +@interface NSSimpleCString : NSString { +@protected + char *bytes; + unsigned int numBytes; +} +@end + +@interface NSConstantString : NSSimpleCString +@end + +extern struct objc_class _NSConstantStringClassReference; + +const NSConstantString *appKey = @"MyApp"; + +/* { dg-final { scan-assembler ".section __OBJC, __cstring_object" } } */ +/* { dg-final { scan-assembler ".long\t__NSConstantStringClassReference\n\t.long\t.*\n\t.long\t5\n\t.data" } } */ diff --git a/gcc/testsuite/objc.dg/const-str-11.m b/gcc/testsuite/objc.dg/const-str-11.m new file mode 100644 index 000000000000..3b7ec7ad51f5 --- /dev/null +++ b/gcc/testsuite/objc.dg/const-str-11.m @@ -0,0 +1,27 @@ +/* Test if ObjC constant string layout is checked properly, regardless of how + constant string classes get derived. */ +/* Contributed by Ziemowit Laski */ + +/* { dg-options "-fnext-runtime -fconstant-string-class=XStr" } */ +/* { dg-do compile { target *-*-darwin* } } */ + +#include + +@interface XString: Object { +@protected + char *bytes; +} +@end + +@interface XStr : XString { +@public + unsigned int len; +} +@end + +extern struct objc_class _XStrClassReference; + +const XStr *appKey = @"MyApp"; + +/* { dg-final { scan-assembler ".section __OBJC, __cstring_object" } } */ +/* { dg-final { scan-assembler ".long\t__XStrClassReference\n\t.long\t.*\n\t.long\t5\n\t.data" } } */