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
This commit is contained in:
parent
d5dfe0b8c2
commit
c64de75f40
10 changed files with 176 additions and 15 deletions
|
@ -1,3 +1,8 @@
|
|||
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>
|
||||
|
||||
* config/alpha/alpha.md (vec_shl_<VEC>, vec_shr_<VEC>): New.
|
||||
|
|
|
@ -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 ();
|
||||
}
|
||||
|
|
|
@ -1,3 +1,15 @@
|
|||
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>
|
||||
|
||||
* objc-act.c (objc_init_exceptions): Call
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
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>
|
||||
|
||||
* lib/target-supports.exp (check_effective_target_vect_no_int_max):
|
||||
|
|
28
gcc/testsuite/obj-c++.dg/const-str-10.mm
Normal file
28
gcc/testsuite/obj-c++.dg/const-str-10.mm
Normal file
|
@ -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 <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" } } */
|
27
gcc/testsuite/obj-c++.dg/const-str-11.mm
Normal file
27
gcc/testsuite/obj-c++.dg/const-str-11.mm
Normal file
|
@ -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 <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" } } */
|
28
gcc/testsuite/objc.dg/const-str-10.m
Normal file
28
gcc/testsuite/objc.dg/const-str-10.m
Normal file
|
@ -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 <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" } } */
|
27
gcc/testsuite/objc.dg/const-str-11.m
Normal file
27
gcc/testsuite/objc.dg/const-str-11.m
Normal file
|
@ -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 <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" } } */
|
Loading…
Add table
Reference in a new issue