Commit c64de75f by Ziemowit Laski Committed by Ziemowit Laski

darwin.c (machopic_select_section): constant ObjC string objects now always have…

darwin.c (machopic_select_section): constant ObjC string objects now always have type "__builtin_ObjCString".

[gcc/ChangeLog]
2005-06-29  Ziemowit Laski  <zlaski@apple.com>

        * config/darwin.c (machopic_select_section): constant ObjC string
        objects now always have type "__builtin_ObjCString".

[gcc/objc/ChangeLog]
2005-06-29  Ziemowit Laski  <zlaski@apple.com>

        * 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  <zlaski@apple.com>

        * obj-c++.dg/const-str-1[0-1].mm: New.
        * objc.dg/const-str-1[0-1].m: New.

From-SVN: r101437
parent d5dfe0b8
2005-06-29 Ziemowit Laski <zlaski@apple.com>
* config/darwin.c (machopic_select_section): constant ObjC string
objects now always have type "__builtin_ObjCString".
2005-06-29 Richard Henderson <rth@redhat.com> 2005-06-29 Richard Henderson <rth@redhat.com>
* config/alpha/alpha.md (vec_shl_<VEC>, vec_shr_<VEC>): New. * config/alpha/alpha.md (vec_shl_<VEC>, vec_shr_<VEC>): New.
......
...@@ -1048,10 +1048,14 @@ machopic_select_section (tree exp, int reloc, ...@@ -1048,10 +1048,14 @@ machopic_select_section (tree exp, int reloc,
tree name = TYPE_NAME (TREE_TYPE (exp)); tree name = TYPE_NAME (TREE_TYPE (exp));
if (TREE_CODE (name) == TYPE_DECL) if (TREE_CODE (name) == TYPE_DECL)
name = DECL_NAME (name); name = DECL_NAME (name);
if (!strcmp (IDENTIFIER_POINTER (name), "NSConstantString"))
objc_constant_string_object_section (); if (!strcmp (IDENTIFIER_POINTER (name), "__builtin_ObjCString"))
else if (!strcmp (IDENTIFIER_POINTER (name), "NXConstantString")) {
objc_string_object_section (); if (flag_next_runtime)
objc_constant_string_object_section ();
else
objc_string_object_section ();
}
else else
base_function (); base_function ();
} }
......
2005-06-29 Ziemowit Laski <zlaski@apple.com>
* 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 <paul@codesourcery.com> 2005-06-28 Paul Brook <paul@codesourcery.com>
* objc-act.c (objc_init_exceptions): Call * objc-act.c (objc_init_exceptions): Call
......
...@@ -814,9 +814,9 @@ objc_build_struct (tree name, tree fields, tree super_name) ...@@ -814,9 +814,9 @@ objc_build_struct (tree name, tree fields, tree super_name)
&& TREE_CODE (TREE_CHAIN (field)) == FIELD_DECL) && TREE_CODE (TREE_CHAIN (field)) == FIELD_DECL)
field = TREE_CHAIN (field); field = TREE_CHAIN (field);
/* For ObjC ABI purposes, the "packed" size of a base class is /* For ObjC ABI purposes, the "packed" size of a base class is the
the the sum of the offset and the size (in bits) of the last the sum of the offset and the size (in bits) of the last field
field in the class. */ in the class. */
DECL_SIZE (base) DECL_SIZE (base)
= (field && TREE_CODE (field) == FIELD_DECL = (field && TREE_CODE (field) == FIELD_DECL
? size_binop (PLUS_EXPR, ? size_binop (PLUS_EXPR,
...@@ -1707,11 +1707,11 @@ synth_module_prologue (void) ...@@ -1707,11 +1707,11 @@ synth_module_prologue (void)
static int static int
check_string_class_template (void) 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) \ #define AT_LEAST_AS_LARGE_AS(F, T) \
(F && TREE_CODE (F) == FIELD_DECL \ (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)))) >= TREE_INT_CST_LOW (TYPE_SIZE (T))))
if (!AT_LEAST_AS_LARGE_AS (field_decl, ptr_type_node)) if (!AT_LEAST_AS_LARGE_AS (field_decl, ptr_type_node))
...@@ -1730,6 +1730,27 @@ check_string_class_template (void) ...@@ -1730,6 +1730,27 @@ check_string_class_template (void)
/* Avoid calling `check_string_class_template ()' more than once. */ /* Avoid calling `check_string_class_template ()' more than once. */
static GTY(()) int string_layout_checked; 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! */ /* Custom build_string which sets TREE_TYPE! */
static tree static tree
...@@ -1802,6 +1823,7 @@ objc_build_string_object (tree string) ...@@ -1802,6 +1823,7 @@ objc_build_string_object (tree string)
{ {
string_layout_checked = -1; string_layout_checked = -1;
constant_string_class = lookup_interface (constant_string_id); constant_string_class = lookup_interface (constant_string_id);
internal_const_str_type = objc_build_internal_const_str_type ();
if (!constant_string_class if (!constant_string_class
|| !(constant_string_type || !(constant_string_type
...@@ -1838,9 +1860,9 @@ objc_build_string_object (tree string) ...@@ -1838,9 +1860,9 @@ objc_build_string_object (tree string)
*loc = desc = ggc_alloc (sizeof (*desc)); *loc = desc = ggc_alloc (sizeof (*desc));
desc->literal = string; desc->literal = string;
/* GNU: & ((NXConstantString) { NULL, string, length }) */ /* GNU: (NXConstantString *) & ((__builtin_ObjCString) { NULL, string, length }) */
/* NeXT: & ((NSConstantString) { isa, string, length }) */ /* NeXT: (NSConstantString *) & ((__builtin_ObjCString) { isa, string, length }) */
fields = TYPE_FIELDS (constant_string_type); fields = TYPE_FIELDS (internal_const_str_type);
initlist initlist
= build_tree_list (fields, = build_tree_list (fields,
flag_next_runtime flag_next_runtime
...@@ -1852,13 +1874,13 @@ objc_build_string_object (tree string) ...@@ -1852,13 +1874,13 @@ objc_build_string_object (tree string)
fields = TREE_CHAIN (fields); fields = TREE_CHAIN (fields);
initlist = tree_cons (fields, build_int_cst (NULL_TREE, length), initlist = tree_cons (fields, build_int_cst (NULL_TREE, length),
initlist); initlist);
constructor = objc_build_constructor (constant_string_type, constructor = objc_build_constructor (internal_const_str_type,
nreverse (initlist)); nreverse (initlist));
TREE_INVARIANT (constructor) = true; TREE_INVARIANT (constructor) = true;
if (!flag_next_runtime) if (!flag_next_runtime)
constructor constructor
= objc_add_static_instance (constructor, constant_string_type); = objc_add_static_instance (constructor, internal_const_str_type);
else else
{ {
var = build_decl (CONST_DECL, NULL, TREE_TYPE (constructor)); var = build_decl (CONST_DECL, NULL, TREE_TYPE (constructor));
...@@ -1870,7 +1892,8 @@ objc_build_string_object (tree string) ...@@ -1870,7 +1892,8 @@ objc_build_string_object (tree string)
desc->constructor = constructor; 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; return addr;
} }
......
...@@ -263,6 +263,7 @@ enum objc_tree_index ...@@ -263,6 +263,7 @@ enum objc_tree_index
OCTI_CNST_STR_TYPE, OCTI_CNST_STR_TYPE,
OCTI_CNST_STR_GLOB_ID, OCTI_CNST_STR_GLOB_ID,
OCTI_STRING_CLASS_DECL, OCTI_STRING_CLASS_DECL,
OCTI_INTERNAL_CNST_STR_TYPE,
OCTI_SUPER_DECL, OCTI_SUPER_DECL,
OCTI_UMSG_NONNIL_DECL, OCTI_UMSG_NONNIL_DECL,
OCTI_UMSG_NONNIL_STRET_DECL, OCTI_UMSG_NONNIL_STRET_DECL,
...@@ -450,6 +451,7 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX]; ...@@ -450,6 +451,7 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX];
#define constant_string_global_id \ #define constant_string_global_id \
objc_global_trees[OCTI_CNST_STR_GLOB_ID] objc_global_trees[OCTI_CNST_STR_GLOB_ID]
#define string_class_decl objc_global_trees[OCTI_STRING_CLASS_DECL] #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] #define UOBJC_SUPER_decl objc_global_trees[OCTI_SUPER_DECL]
#endif /* GCC_OBJC_ACT_H */ #endif /* GCC_OBJC_ACT_H */
2005-06-29 Ziemowit Laski <zlaski@apple.com>
* obj-c++.dg/const-str-1[0-1].mm: New.
* objc.dg/const-str-1[0-1].m: New.
2005-05-29 Richard Henderson <rth@redhat.com> 2005-05-29 Richard Henderson <rth@redhat.com>
* lib/target-supports.exp (check_effective_target_vect_no_int_max): * lib/target-supports.exp (check_effective_target_vect_no_int_max):
......
/* Test if ObjC constant string layout is checked properly, regardless of how
constant string classes get derived. */
/* Contributed by Ziemowit Laski <zlaski@apple.com> */
/* { dg-options "-fnext-runtime" } */
/* { dg-do compile { target *-*-darwin* } } */
#include <objc/Object.h>
@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" } } */
/* Test if ObjC constant string layout is checked properly, regardless of how
constant string classes get derived. */
/* Contributed by Ziemowit Laski <zlaski@apple.com> */
/* { dg-options "-fnext-runtime -fconstant-string-class=XStr" } */
/* { dg-do compile { target *-*-darwin* } } */
#include <objc/Object.h>
@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" } } */
/* Test if ObjC constant string layout is checked properly, regardless of how
constant string classes get derived. */
/* Contributed by Ziemowit Laski <zlaski@apple.com> */
/* { dg-options "-fnext-runtime" } */
/* { dg-do compile { target *-*-darwin* } } */
#include <objc/Object.h>
@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" } } */
/* Test if ObjC constant string layout is checked properly, regardless of how
constant string classes get derived. */
/* Contributed by Ziemowit Laski <zlaski@apple.com> */
/* { dg-options "-fnext-runtime -fconstant-string-class=XStr" } */
/* { dg-do compile { target *-*-darwin* } } */
#include <objc/Object.h>
@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" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment