Added support for the 64-bit Apple Objective-C runtime

From-SVN: r170260
This commit is contained in:
Iain Sandoe 2011-02-18 00:07:38 +00:00 committed by Nicola Pero
parent 0a8134cace
commit d764a8e6bd
70 changed files with 12198 additions and 4766 deletions

View File

@ -1,3 +1,23 @@
2011-02-17 Iain Sandoe <iains@gcc.gnu.org>
* config/darwin-c.c (darwin_cpp_builtins): Define __OBJC2__ for
objc_abi == 2.
* config/darwin.c (output_objc_section_asm_op): Added support for
ABI v1 and v2.
(is_objc_metadata): New.
(darwin_objc2_section): New.
(darwin_objc1_section): New.
(machopic_select_section): Added support for ABI v1 and v2.
(darwin_emit_objc_zeroed): New.
(darwin_output_aligned_bss): Detect objc metadata and treat it
appropriately.
(darwin_asm_output_aligned_decl_common): Same.
(darwin_asm_output_aligned_decl_local): Same.
* config/darwin-sections.def: Updated for ABI v1 and v2.
* config/darwin.h (SUBTARGET_C_COMMON_OVERRIDE_OPTIONS): When
compiling Objective-C code for the NeXT runtime, default to using
ABI version 0 for 32-bit, and version 2 for 64-bit.
2011-02-17 Joseph Myers <joseph@codesourcery.com>
* common.opt (optimize_fast): New Variable.

View File

@ -629,6 +629,9 @@ darwin_cpp_builtins (cpp_reader *pfile)
builtin_define ("__strong=");
builtin_define ("__weak=");
}
if (flag_objc_abi == 2)
builtin_define ("__OBJC2__");
}
/* Handle C family front-end options. */

View File

@ -94,7 +94,7 @@ DEF_SECTION (mod_term_section, 0, ".mod_term_func", 0)
DEF_SECTION (constructor_section, 0, ".constructor", 0)
DEF_SECTION (destructor_section, 0, ".destructor", 0)
/* Objective-C (V1) sections. */
/* Objective-C ABI=0 (Original version) sections. */
DEF_SECTION (objc_class_section, 0, ".objc_class", 1)
DEF_SECTION (objc_meta_class_section, 0, ".objc_meta_class", 1)
DEF_SECTION (objc_category_section, 0, ".objc_category", 1)
@ -112,7 +112,7 @@ DEF_SECTION (objc_module_info_section, 0, ".objc_module_info", 1)
DEF_SECTION (objc_protocol_section, 0, ".objc_protocol", 1)
DEF_SECTION (objc_string_object_section, 0, ".objc_string_object", 1)
DEF_SECTION (objc_constant_string_object_section, 0,
".section __OBJC, __cstring_object, regular, no_dead_strip", 1)
".section __OBJC, __cstring_object, regular, no_dead_strip", 0)
/* Fix-and-Continue image marker. */
DEF_SECTION (objc_image_info_section, 0,
@ -156,3 +156,40 @@ DEF_SECTION (darwin_exception_section, SECTION_NO_ANCHOR,
DEF_SECTION (darwin_eh_frame_section, SECTION_NO_ANCHOR,
".section " EH_FRAME_SECTION_NAME ",__eh_frame"
EH_FRAME_SECTION_ATTR, 0)
/* Sections for ObjC ABI=1 (ObjC 'V1' extensions) */
DEF_SECTION (objc1_class_ext_section, 0,
".section __OBJC, __class_ext, regular, no_dead_strip", 1)
DEF_SECTION (objc1_prop_list_section, 0,
".section __OBJC, __property, regular, no_dead_strip", 1)
DEF_SECTION (objc1_protocol_ext_section, 0,
".section __OBJC, __protocol_ext, regular, no_dead_strip", 1)
/* Sections for ObjC ABI=2 (m64). */
DEF_SECTION (objc2_message_refs_section, 0,
".section __DATA, __objc_msgrefs, regular, no_dead_strip", 1)
DEF_SECTION (objc2_classdefs_section, 0, ".section __DATA, __objc_data", 1)
DEF_SECTION (objc2_metadata_section, 0, ".section __DATA, __objc_const", 1)
DEF_SECTION (objc2_classrefs_section, 0,
".section __DATA, __objc_classrefs, regular, no_dead_strip", 1)
DEF_SECTION (objc2_classlist_section, 0,
".section __DATA, __objc_classlist, regular, no_dead_strip", 1)
DEF_SECTION (objc2_categorylist_section, 0,
".section __DATA, __objc_catlist, regular, no_dead_strip", 1)
DEF_SECTION (objc2_selector_refs_section, 0,
".section __DATA, __objc_selrefs, literal_pointers, no_dead_strip", 1)
DEF_SECTION (objc2_nonlazy_class_section, 0,
".section __DATA, __objc_nlclslist, regular, no_dead_strip", 1)
DEF_SECTION (objc2_nonlazy_category_section, 0,
".section __DATA, __objc_nlcatlist, regular, no_dead_strip", 1)
DEF_SECTION (objc2_protocollist_section, 0,
".section __DATA, __objc_protolist, regular, no_dead_strip", 1)
DEF_SECTION (objc2_protocolrefs_section, 0,
".section __DATA, __objc_protorefs, regular, no_dead_strip", 1)
DEF_SECTION (objc2_super_classrefs_section, 0,
".section __DATA, __objc_superrefs, regular, no_dead_strip", 1)
DEF_SECTION (objc2_image_info_section, 0,
".section __DATA, __objc_imageinfo, regular, no_dead_strip", 1)
DEF_SECTION (objc2_constant_string_object_section, 0,
".section __DATA, __objc_stringobj, regular, no_dead_strip", 1)

View File

@ -148,13 +148,48 @@ output_objc_section_asm_op (const void *directive)
objc_class_vars_section,
objc_instance_vars_section,
objc_module_info_section,
objc_symbols_section
objc_symbols_section,
};
/* ABI=1 */
static const enum darwin_section_enum tomarkv1[] =
{
objc1_protocol_ext_section,
objc1_class_ext_section,
objc1_prop_list_section
} ;
/* ABI=2 */
static const enum darwin_section_enum tomarkv2[] =
{
objc2_message_refs_section,
objc2_classdefs_section,
objc2_metadata_section,
objc2_classrefs_section,
objc2_classlist_section,
objc2_categorylist_section,
objc2_selector_refs_section,
objc2_nonlazy_class_section,
objc2_nonlazy_category_section,
objc2_protocollist_section,
objc2_protocolrefs_section,
objc2_super_classrefs_section,
objc2_image_info_section,
objc2_constant_string_object_section
} ;
size_t i;
been_here = true;
for (i = 0; i < ARRAY_SIZE (tomark); i++)
switch_to_section (darwin_sections[tomark[i]]);
if (flag_objc_abi < 2)
{
for (i = 0; i < ARRAY_SIZE (tomark); i++)
switch_to_section (darwin_sections[tomark[i]]);
if (flag_objc_abi == 1)
for (i = 0; i < ARRAY_SIZE (tomarkv1); i++)
switch_to_section (darwin_sections[tomarkv1[i]]);
}
else
for (i = 0; i < ARRAY_SIZE (tomarkv2); i++)
switch_to_section (darwin_sections[tomarkv2[i]]);
/* Make sure we don't get varasm.c out of sync with us. */
switch_to_section (saved_in_section);
}
output_section_asm_op (directive);
@ -277,7 +312,6 @@ indirect_data (rtx sym_ref)
return ! lprefix;
}
static int
machopic_data_defined_p (rtx sym_ref)
{
@ -1233,6 +1267,177 @@ machopic_reloc_rw_mask (void)
return MACHOPIC_INDIRECT ? 3 : 0;
}
/* We have to deal with ObjC/C++ metadata section placement in the common
code, since it will also be called from LTO.
Return metadata attributes, if present (searching for ABI=2 first)
Return NULL_TREE if no such attributes are found. */
static tree
is_objc_metadata (tree decl)
{
if (DECL_P (decl)
&& (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == CONST_DECL)
&& DECL_ATTRIBUTES (decl))
{
tree meta = lookup_attribute ("OBJC2META", DECL_ATTRIBUTES (decl));
if (meta)
return meta;
meta = lookup_attribute ("OBJC1META", DECL_ATTRIBUTES (decl));
if (meta)
return meta;
}
return NULL_TREE;
}
/* Return the section required for Objective C ABI 2 metadata. */
static section *
darwin_objc2_section (tree decl ATTRIBUTE_UNUSED, tree meta, section * base)
{
const char *p;
tree ident = TREE_VALUE (meta);
gcc_assert (TREE_CODE (ident) == IDENTIFIER_NODE);
p = IDENTIFIER_POINTER (ident);
/* If we are in LTO, then we don't know the state of flag_next_runtime
or flag_objc_abi when the code was generated. We set these from the
meta-data - which is needed to deal with const string constructors. */
flag_next_runtime = 1;
flag_objc_abi = 2;
if (base == data_section)
base = darwin_sections[objc2_metadata_section];
/* Most of the OBJC2 META-data end up in the base section, so check it
first. */
if (!strncmp (p, "V2_BASE", 7))
return base;
else if (!strncmp (p, "V2_STRG", 7))
return darwin_sections[cstring_section];
else if (!strncmp (p, "G2_META", 7) || !strncmp (p, "G2_CLAS", 7))
return darwin_sections[objc2_classdefs_section];
else if (!strncmp (p, "V2_MREF", 7))
return darwin_sections[objc2_message_refs_section];
else if (!strncmp (p, "V2_CLRF", 7))
return darwin_sections[objc2_classrefs_section];
else if (!strncmp (p, "V2_SURF", 7))
return darwin_sections[objc2_super_classrefs_section];
else if (!strncmp (p, "V2_NLCL", 7))
return darwin_sections[objc2_nonlazy_class_section];
else if (!strncmp (p, "V2_CLAB", 7))
return darwin_sections[objc2_classlist_section];
else if (!strncmp (p, "V2_SRFS", 7))
return darwin_sections[objc2_selector_refs_section];
else if (!strncmp (p, "V2_NLCA", 7))
return darwin_sections[objc2_nonlazy_category_section];
else if (!strncmp (p, "V2_CALA", 7))
return darwin_sections[objc2_categorylist_section];
else if (!strncmp (p, "V2_PLST", 7))
return darwin_sections[objc2_protocollist_section];
else if (!strncmp (p, "V2_PRFS", 7))
return darwin_sections[objc2_protocolrefs_section];
else if (!strncmp (p, "V2_INFO", 7))
return darwin_sections[objc2_image_info_section];
else if (!strncmp (p, "V2_EHTY", 7))
return darwin_sections[data_coal_section];
else if (!strncmp (p, "V2_CSTR", 7))
return darwin_sections[objc2_constant_string_object_section];
/* Not recognized, default. */
return base;
}
/* Return the section required for Objective C ABI 0/1 metadata. */
static section *
darwin_objc1_section (tree decl ATTRIBUTE_UNUSED, tree meta, section * base)
{
const char *p;
tree ident = TREE_VALUE (meta);
gcc_assert (TREE_CODE (ident) == IDENTIFIER_NODE);
p = IDENTIFIER_POINTER (ident);
/* If we are in LTO, then we don't know the state of flag_next_runtime
or flag_objc_abi when the code was generated. We set these from the
meta-data - which is needed to deal with const string constructors. */
flag_next_runtime = 1;
if (!global_options_set.x_flag_objc_abi)
flag_objc_abi = 1;
/* String sections first, cos there are lots of strings. */
if (!strncmp (p, "V1_STRG", 7))
return darwin_sections[cstring_section];
else if (!strncmp (p, "V1_CLSN", 7))
return darwin_sections[objc_class_names_section];
else if (!strncmp (p, "V1_METN", 7))
return darwin_sections[objc_meth_var_names_section];
else if (!strncmp (p, "V1_METT", 7))
return darwin_sections[objc_meth_var_types_section];
else if (!strncmp (p, "V1_CLAS", 7))
return darwin_sections[objc_class_section];
else if (!strncmp (p, "V1_META", 7))
return darwin_sections[objc_meta_class_section];
else if (!strncmp (p, "V1_CATG", 7))
return darwin_sections[objc_category_section];
else if (!strncmp (p, "V1_PROT", 7))
return darwin_sections[objc_protocol_section];
else if (!strncmp (p, "V1_CLCV", 7))
return darwin_sections[objc_class_vars_section];
else if (!strncmp (p, "V1_CLIV", 7))
return darwin_sections[objc_instance_vars_section];
else if (!strncmp (p, "V1_CLCM", 7))
return darwin_sections[objc_cls_meth_section];
else if (!strncmp (p, "V1_CLIM", 7))
return darwin_sections[objc_inst_meth_section];
else if (!strncmp (p, "V1_CACM", 7))
return darwin_sections[objc_cat_cls_meth_section];
else if (!strncmp (p, "V1_CAIM", 7))
return darwin_sections[objc_cat_inst_meth_section];
else if (!strncmp (p, "V1_PNSM", 7))
return darwin_sections[objc_cat_inst_meth_section];
else if (!strncmp (p, "V1_PCLM", 7))
return darwin_sections[objc_cat_cls_meth_section];
else if (!strncmp (p, "V1_CLPR", 7))
return darwin_sections[objc_cat_cls_meth_section];
else if (!strncmp (p, "V1_CAPR", 7))
return darwin_sections[objc_category_section]; /* ??? CHECK me. */
else if (!strncmp (p, "V1_PRFS", 7))
return darwin_sections[objc_cat_cls_meth_section];
else if (!strncmp (p, "V1_CLRF", 7))
return darwin_sections[objc_cls_refs_section];
else if (!strncmp (p, "V1_SRFS", 7))
return darwin_sections[objc_selector_refs_section];
else if (!strncmp (p, "V1_MODU", 7))
return darwin_sections[objc_module_info_section];
else if (!strncmp (p, "V1_SYMT", 7))
return darwin_sections[objc_symbols_section];
else if (!strncmp (p, "V1_INFO", 7))
return darwin_sections[objc_image_info_section];
else if (!strncmp (p, "V1_PLST", 7))
return darwin_sections[objc1_prop_list_section];
else if (!strncmp (p, "V1_PEXT", 7))
return darwin_sections[objc1_protocol_ext_section];
else if (!strncmp (p, "V1_CEXT", 7))
return darwin_sections[objc1_class_ext_section];
else if (!strncmp (p, "V2_CSTR", 7))
return darwin_sections[objc_constant_string_object_section];
return base;
}
section *
machopic_select_section (tree decl,
int reloc,
@ -1331,7 +1536,25 @@ machopic_select_section (tree decl,
gcc_unreachable ();
}
/* Darwin weird special cases. */
/* Darwin weird special cases.
a) OBJC Meta-data. */
if (DECL_P (decl)
&& (TREE_CODE (decl) == VAR_DECL
|| TREE_CODE (decl) == CONST_DECL)
&& DECL_ATTRIBUTES (decl))
{
tree meta = lookup_attribute ("OBJC2META", DECL_ATTRIBUTES (decl));
if (meta)
return darwin_objc2_section (decl, meta, base_section);
meta = lookup_attribute ("OBJC1META", DECL_ATTRIBUTES (decl));
if (meta)
return darwin_objc1_section (decl, meta, base_section);
meta = lookup_attribute ("OBJC1METG", DECL_ATTRIBUTES (decl));
if (meta)
return base_section; /* GNU runtime is happy with it all in one pot. */
}
/* b) Constant string objects. */
if (TREE_CODE (decl) == CONSTRUCTOR
&& TREE_TYPE (decl)
&& TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
@ -1341,29 +1564,53 @@ machopic_select_section (tree decl,
if (TREE_CODE (name) == TYPE_DECL)
name = DECL_NAME (name);
/* FIXME: This is unsatisfactory for LTO, since it relies on other
metadata determining the source FE. */
if (!strcmp (IDENTIFIER_POINTER (name), "__builtin_ObjCString"))
{
if (flag_next_runtime)
return darwin_sections[objc_constant_string_object_section];
else
return darwin_sections[objc_string_object_section];
}
{
if (flag_next_runtime)
{
if (flag_objc_abi == 2)
return darwin_sections[objc2_constant_string_object_section];
else
return darwin_sections[objc_constant_string_object_section];
}
else
return darwin_sections[objc_string_object_section];
}
else if (!strcmp (IDENTIFIER_POINTER (name), "__builtin_CFString"))
return darwin_sections[cfstring_constant_object_section];
else
return base_section;
return base_section;
}
/* c) legacy meta-data selection. */
else if (TREE_CODE (decl) == VAR_DECL
&& DECL_NAME (decl)
&& TREE_CODE (DECL_NAME (decl)) == IDENTIFIER_NODE
&& IDENTIFIER_POINTER (DECL_NAME (decl))
&& flag_next_runtime
&& !strncmp (IDENTIFIER_POINTER (DECL_NAME (decl)), "_OBJC_", 6))
{
const char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
static bool warned_objc_46 = false;
/* We shall assert that zero-sized objects are an error in ObjC
meta-data. */
gcc_assert (tree_low_cst (DECL_SIZE_UNIT (decl), 1) != 0);
/* ??? This mechanism for determining the metadata section is
broken when LTO is in use, since the frontend that generated
the data is not identified. We will keep the capability for
the short term - in case any non-Objective-C programs are using
it to place data in specified sections. */
if (!warned_objc_46)
{
location_t loc = DECL_SOURCE_LOCATION (decl);
warning_at (loc, 0, "the use of _OBJC_-prefixed variable names"
" to select meta-data sections is deprecated at 4.6"
" and will be removed in 4.7");
warned_objc_46 = true;
}
if (!strncmp (name, "_OBJC_CLASS_METHODS_", 20))
return darwin_sections[objc_cls_meth_section];
else if (!strncmp (name, "_OBJC_INSTANCE_METHODS_", 23))
@ -1911,6 +2158,30 @@ darwin_emit_weak_or_comdat (FILE *fp, tree decl, const char *name,
assemble_zeros (size);
}
/* Emit a chunk of data for ObjC meta-data that got placed in BSS erroneously. */
static void
darwin_emit_objc_zeroed (FILE *fp, tree decl, const char *name,
unsigned HOST_WIDE_INT size,
unsigned int align, tree meta)
{
section *ocs = data_section;
if (TREE_PURPOSE (meta) == get_identifier("OBJC2META"))
ocs = darwin_objc2_section (decl, meta, ocs);
else
ocs = darwin_objc1_section (decl, meta, ocs);
switch_to_section (ocs);
/* We shall declare that zero-sized meta-data are not valid (yet). */
gcc_assert (size);
fprintf (fp, "\t.align\t%d\n", floor_log2 (align / BITS_PER_UNIT));
/* ... and we let it deal with outputting one byte of zero for them too. */
darwin_asm_declare_object_name (fp, name, decl);
assemble_zeros (size);
}
/* This routine emits 'local' storage:
When Section Anchors are off this routine emits .zerofill commands in
@ -2042,6 +2313,7 @@ darwin_output_aligned_bss (FILE *fp, tree decl, const char *name,
{
unsigned int l2align;
bool one, pub, weak;
tree meta;
pub = TREE_PUBLIC (decl);
one = DECL_ONE_ONLY (decl);
@ -2058,6 +2330,14 @@ fprintf (fp, "# albss: %s (%lld,%d) ro %d cst %d stat %d com %d"
pub, weak, one, (unsigned long)DECL_INITIAL (decl));
#endif
/* ObjC metadata can get put in BSS because varasm.c decides it's BSS
before the target has a chance to comment. */
if ((meta = is_objc_metadata (decl)))
{
darwin_emit_objc_zeroed (fp, decl, name, size, DECL_ALIGN (decl), meta);
return;
}
/* Check that any initializer is valid. */
gcc_assert ((DECL_INITIAL (decl) == NULL)
|| (DECL_INITIAL (decl) == error_mark_node)
@ -2152,6 +2432,8 @@ darwin_asm_output_aligned_decl_common (FILE *fp, tree decl, const char *name,
{
unsigned int l2align;
bool one, weak;
tree meta;
/* No corresponding var. */
if (decl==NULL)
{
@ -2176,6 +2458,14 @@ fprintf (fp, "# adcom: %s (%lld,%d) ro %d cst %d stat %d com %d pub %d"
TREE_PUBLIC (decl), weak, one, (unsigned long)DECL_INITIAL (decl));
#endif
/* ObjC metadata can get put in BSS because varasm.c decides it's BSS
before the target has a chance to comment. */
if ((meta = is_objc_metadata (decl)))
{
darwin_emit_objc_zeroed (fp, decl, name, size, DECL_ALIGN (decl), meta);
return;
}
/* We shouldn't be messing with this if the decl has a section name. */
gcc_assert (DECL_SECTION_NAME (decl) == NULL);
@ -2222,6 +2512,7 @@ darwin_asm_output_aligned_decl_local (FILE *fp, tree decl, const char *name,
{
unsigned long l2align;
bool one, weak;
tree meta;
one = DECL_ONE_ONLY (decl);
weak = (DECL_P (decl)
@ -2237,6 +2528,14 @@ fprintf (fp, "# adloc: %s (%lld,%d) ro %d cst %d stat %d one %d pub %d"
weak , (unsigned long)DECL_INITIAL (decl));
#endif
/* ObjC metadata can get put in BSS because varasm.c decides it's BSS
before the target has a chance to comment. */
if ((meta = is_objc_metadata (decl)))
{
darwin_emit_objc_zeroed (fp, decl, name, size, DECL_ALIGN (decl), meta);
return;
}
/* We shouldn't be messing with this if the decl has a section name. */
gcc_assert (DECL_SECTION_NAME (decl) == NULL);

View File

@ -140,6 +140,16 @@ extern GTY(()) int darwin_ms_struct;
} while (0)
#define SUBTARGET_C_COMMON_OVERRIDE_OPTIONS do { \
/* Unless set, force ABI=2 for NeXT and m64, 0 otherwise. */ \
if (!global_options_set.x_flag_objc_abi) \
global_options.x_flag_objc_abi \
= (flag_next_runtime && TARGET_64BIT) ? 2 : 0; \
/* Objective-C family ABI 2 is only valid for next/m64 at present. */ \
if (global_options_set.x_flag_objc_abi && flag_next_runtime) \
if (TARGET_64BIT && global_options.x_flag_objc_abi < 2) \
error_at (UNKNOWN_LOCATION, "%<-fobjc-abi-version%> >= 2 is only" \
" supported on %<-m64%> targets for" \
" %<-fnext-runtime%>"); \
/* Sort out ObjC exceptions: If the runtime is NeXT we default to \
sjlj for m32 only. */ \
if (!global_options_set.x_flag_objc_sjlj_exceptions) \
@ -599,7 +609,7 @@ int darwin_label_is_anonymous_local_objc_name (const char *name);
} \
else if (xname[0] == '+' || xname[0] == '-') \
fprintf (FILE, "\"%s\"", xname); \
else if (darwin_label_is_anonymous_local_objc_name (xname)) \
else if (darwin_label_is_anonymous_local_objc_name (xname)) \
fprintf (FILE, "L%s", xname); \
else if (!strncmp (xname, ".objc_class_name_", 17)) \
fprintf (FILE, "%s", xname); \

View File

@ -1,3 +1,106 @@
2011-02-17 Iain Sandoe <iains@gcc.gnu.org>
* config-lang.in (gtfiles): Updated.
* Make-lang.in (START_HDRS): New.
(OBJC_OBJS): Added new object files.
(objc/objc-act.o): Updated prerequisites.
(objc/objc-lang.o): Updated prerequisites.
(objc/objc-runtime-shared-support.o): New.
(objc/objc-gnu-runtime-abi-01.o): New.
(objc/objc-next-runtime-abi-01.o): New.
(objc/objc-next-runtime-abi-02.o): New.
* objc-runtime-hooks.h: New.
* objc-runtime-shared-support.h: New.
* objc-runtime-shared-support.c: New.
* objc-gnu-runtime-abi-01.c: New.
* objc-next-metadata-tags.h: New.
* objc-next-runtime-abi-01.c: New.
* objc-next-runtime-abi-02.c: New.
* objc-lang.c: Include c-lang.h.
(LANG_HOOKS_EH_PERSONALITY): Removed.
* objc-act.h: Moved many declarations and code from objc-act.c
into objc-act.h to make them available outside objc-act.c.
(objc_eh_runtime_type): Removed.
(objc_eh_personality): Removed.
(CLASS_HAS_EXCEPTION_ATTR): New.
(OCTI_SUPER_SUPERFIELD_ID): New.
(OCTI_V1_PROP_LIST_TEMPL): New.
(OCTI_V1_PROP_NAME_ATTR_CHAIN): New.
(super_superclassfield_id): New.
(objc_prop_list_ptr): New.
(prop_names_attr_chain): New.
* objc-act.c: Include new runtime headers. Moved many #defines
and declarations into objc-act.h and
objc-runtime-shared-support.h. Made some corresponding functions
non-static, and moved some others into
objc-runtime-shared-support.c. Moved metadata generation code
into the new runtime hook files.
(ivar_offset_hash_list): New.
(objc_init): Call generate_struct_value_by_array() before doing
any runtime initialization. Create the appropriate runtime hook
structures.
(init_objc): Removed. Code moved directly into objc_init.
(finish_objc): Removed. Code moved directly into
objc_write_global_declarations.
(objc_write_global_declarations): Do the warn_selector checks
before emitting metadata. Use a runtime hook to emit the
metadata. Do not emit the metadata or do -gen-decls processing if
-fsyntax-only or we are producing a PCH.
(build_objc_exception_stuff): Renamed to
build_common_objc_exception_stuff. Remove TREE_NOTHROW flag from
objc_exception_throw_decl.
(synth_module_prologue): Call runtime initialize hook instead of
building runtime declarations here. Use the
default_constant_string_class_name runtime hook to set the
constant string class name.
(objc_build_string_object): Call the setup_const_string_class_decl
runtime hook instead of setup_string_decl. Call the
build_const_string_constructor runtime hook instead of building
the string object here.
(get_objc_string_decl): Added prop_names_attr case. Removed
gcc_unreachable() at the end.
(objc_begin_catch_clause): Distinguish between @catch (...) and
@catch (id x). Call the begin_catch runtime hook instead of
building the CATCH_EXPR here.
(objc_finish_catch_clause): Call the finish_catch runtime hook
instead of adding the catch here.
(objc_finish_try_stmt): Call the finish_try_stmt runtime hook
instead of doing it here.
(objc_build_throw_stmt): Bail out early for error_mark_node. Call
the build_exc_ptr runtime hook instead of objc_build_exc_ptr.
Call the build_throw_stmt runtime hook instead of building the
throw call here.
(objc_generate_cxx_cdtors): Set has_cxx_cdtors for the GNU runtime
as well.
(get_arg_type_list): Call the get_arg_type_list_base runtime hook
instead of building the list of arguments here.
(receiver_is_class_object): Call the receiver_is_class_object
runtime hook instead of doing the check here. Call the
tag_getclass runtime hook instead of using TAG_GETCLASS.
(objc_finish_message_expr): Call the build_objc_method_call
runtime hook.
(objc_build_protocol_expr): Call the get_protocol_reference
runtime hook.
(objc_build_selector_expr): Call the build_selector_reference
runtime hook.
(build_ivar_reference): Call the build_ivar_reference runtime
hook.
(hash_init): Set up ivar_offset_hash_list.
(start_class): Recognize the objc_exception attribute and store
it.
(continue_class): Use the class_decl and metaclass_decl runtime
hooks.
(build_objc_property_accessor_helpers): Renamed to
build_common_objc_property_accessor_helpers. Do not build
objc_copyStruct_decl, objc_getPropertyStruct_decl and
objc_setPropertyStruct_decl.
(objc_synthesize_getter): Check what struct setter/getter helper
is available instead of checking the type of runtime.
(get_super_receiver): Use the super_superclassfield_ident runtime
hook. Added assert. Use the get_class_super_ref and
get_category_super_ref runtime hooks.
(objc_v2_encode_prop_attr): New.
2011-01-17 Nicola Pero <nicola.pero@meta-innovation.com>
PR objc/47314

View File

@ -1,6 +1,6 @@
# Top level -*- makefile -*- fragment for GNU Objective-C
# Copyright (C) 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2007,
# 2008, 2009, 2010 Free Software Foundation, Inc.
# 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
#This file is part of GCC.
@ -43,11 +43,18 @@ objc: cc1obj$(exeext)
# Tell GNU make to ignore these if they exist.
.PHONY: objc
START_HDRS = $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(C_TREE_H) \
c-lang.h langhooks.h c-family/c-objc.h objc/objc-act.h
# Use maximal warnings for this front end.
objc-warn = $(STRICT_WARN)
# Language-specific object files for Objective C.
OBJC_OBJS = objc/objc-lang.o objc/objc-act.o
OBJC_OBJS = objc/objc-lang.o objc/objc-act.o \
objc/objc-runtime-shared-support.o \
objc/objc-gnu-runtime-abi-01.o \
objc/objc-next-runtime-abi-01.o \
objc/objc-next-runtime-abi-02.o \
objc_OBJS = $(OBJC_OBJS) cc1obj-checksum.o
@ -66,17 +73,32 @@ cc1obj$(exeext): $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o $(BACKEND) $(
# Objective C language specific files.
objc/objc-lang.o : objc/objc-lang.c \
$(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(C_TREE_H) \
$(GGC_H) langhooks.h $(LANGHOOKS_DEF_H) $(C_COMMON_H) gtype-objc.h \
c-objc-common.h c-family/c-objc.h objc/objc-act.h
objc/objc-lang.o : objc/objc-lang.c $(START_HDRS) \
$(GGC_H) $(LANGHOOKS_DEF_H) $(C_COMMON_H) gtype-objc.h \
c-objc-common.h
objc/objc-act.o : objc/objc-act.c \
$(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
$(TARGET_H) $(C_TREE_H) $(DIAGNOSTIC_CORE_H) toplev.h $(FLAGS_H) \
objc/objc-act.h input.h $(FUNCTION_H) output.h debug.h langhooks.h \
$(LANGHOOKS_DEF_H) $(HASHTAB_H) $(C_PRAGMA_H) gt-objc-objc-act.h \
$(GIMPLE_H) c-lang.h c-family/c-objc.h
objc/objc-runtime-shared-support.o : objc/objc-runtime-shared-support.c \
$(START_HDRS) objc/objc-runtime-shared-support.h $(OBSTACK_H) \
objc/objc-next-metadata-tags.h gt-objc-objc-runtime-shared-support.h
objc/objc-gnu-runtime-abi-01.o: objc/objc-gnu-runtime-abi-01.c $(START_HDRS) \
objc/objc-runtime-hooks.h $(GGC_H) \
objc/objc-runtime-shared-support.h gt-objc-objc-gnu-runtime-abi-01.h toplev.h
objc/objc-next-runtime-abi-01.o: objc/objc-next-runtime-abi-01.c $(START_HDRS) \
$(GGC_H) objc/objc-runtime-hooks.h \
objc/objc-next-metadata-tags.h gt-objc-objc-next-runtime-abi-01.h output.h \
objc/objc-runtime-shared-support.h $(TARGET_H)
objc/objc-next-runtime-abi-02.o: objc/objc-next-runtime-abi-02.c $(START_HDRS) \
$(GGC_H) objc/objc-runtime-hooks.h \
objc/objc-next-metadata-tags.h gt-objc-objc-next-runtime-abi-02.h $(TARGET_H) \
objc/objc-runtime-shared-support.h $(OBSTACK_H)
objc/objc-act.o : objc/objc-act.c $(START_HDRS) $(GGC_H) \
$(DIAGNOSTIC_CORE_H) toplev.h $(FLAGS_H) input.h $(FUNCTION_H) output.h debug.h \
$(LANGHOOKS_DEF_H) $(HASHTAB_H) $(C_PRAGMA_H) gt-objc-objc-act.h $(OBSTACK_H) \
$(GIMPLE_H) objc/objc-runtime-shared-support.h objc/objc-runtime-hooks.h
objc.srcextra:

View File

@ -1,6 +1,6 @@
# Top level configure fragment for GNU Objective-C
# Copyright (C) 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2010
# Free Software Foundation, Inc.
# Copyright (C) 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2010,
# 2011 Free Software Foundation, Inc.
#This file is part of GCC.
@ -33,4 +33,4 @@ target_libs=target-libobjc
# Most of the object files for cc1obj actually come from C.
lang_requires="c"
gtfiles="\$(srcdir)/objc/objc-act.h \$(srcdir)/c-parser.c \$(srcdir)/c-tree.h \$(srcdir)/c-decl.c \$(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 \$(srcdir)/objc/objc-act.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"

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
/* Declarations for objc-act.c.
Copyright (C) 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009,
2010 Free Software Foundation, Inc.
2010, 2011 Free Software Foundation, Inc.
This file is part of GCC.
@ -28,8 +28,6 @@ bool objc_init (void);
const char *objc_printable_name (tree, int);
tree objc_fold_obj_type_ref (tree, tree);
int objc_gimplify_expr (tree *, gimple_seq *, gimple_seq *);
tree objc_eh_runtime_type (tree);
tree objc_eh_personality (void);
/* NB: The remaining public functions are prototyped in c-common.h, for the
benefit of stub-objc.c and objc-act.c. */
@ -167,6 +165,8 @@ typedef enum objc_property_assign_semantics {
#define CLASS_PROTOCOL_LIST(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 4)
#define TOTAL_CLASS_RAW_IVARS(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 5)
#define CLASS_HAS_EXCEPTION_ATTR(CLASS) ((CLASS)->type.lang_flag_0)
#define PROTOCOL_NAME(CLASS) ((CLASS)->type.name)
#define PROTOCOL_LIST(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 0)
#define PROTOCOL_NST_METHODS(CLASS) ((CLASS)->type.minval)
@ -176,7 +176,6 @@ typedef enum objc_property_assign_semantics {
#define PROTOCOL_OPTIONAL_CLS_METHODS(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 2)
#define PROTOCOL_OPTIONAL_NST_METHODS(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 3)
/* For CATEGORY_INTERFACE_TYPE, CLASS_INTERFACE_TYPE or PROTOCOL_INTERFACE_TYPE */
#define CLASS_PROPERTY_DECL(CLASS) TREE_VEC_ELT (TYPE_LANG_SLOT_1 (CLASS), 6)
/* For CLASS_IMPLEMENTATION_TYPE or CATEGORY_IMPLEMENTATION_TYPE. */
@ -215,6 +214,7 @@ typedef enum objc_property_assign_semantics {
= make_tree_vec (OBJC_INFO_SLOT_ELTS); \
} \
while (0)
#define DUP_TYPE_OBJC_INFO(DST, SRC) \
do \
{ \
@ -244,20 +244,21 @@ struct GTY(()) hashed_attribute {
attr next;
tree value;
};
struct GTY(()) hashed_entry {
attr list;
hash next;
tree key;
};
#define SIZEHASHTABLE 257
extern GTY ((length ("SIZEHASHTABLE"))) hash *nst_method_hash_list;
extern GTY ((length ("SIZEHASHTABLE"))) hash *cls_method_hash_list;
extern GTY ((length ("SIZEHASHTABLE"))) hash *cls_name_hash_list;
extern GTY ((length ("SIZEHASHTABLE"))) hash *als_name_hash_list;
#define SIZEHASHTABLE 257
/* An array of all the local variables in the current function that
need to be marked as volatile. */
extern GTY(()) VEC(tree,gc) *local_variables_to_volatilize;
@ -268,8 +269,8 @@ struct GTY(()) imp_entry {
struct imp_entry *next;
tree imp_context;
tree imp_template;
tree class_decl; /* _OBJC_CLASS_<my_name>; */
tree meta_decl; /* _OBJC_METACLASS_<my_name>; */
tree class_decl; /* _OBJC[_v2]_CLASS/CATEGORY_<my_name>; */
tree meta_decl; /* _OBJC[_v2]_METACLASS_<my_name>; */
BOOL_BITFIELD has_cxx_cdtors : 1;
};
@ -361,6 +362,7 @@ enum objc_tree_index
OCTI_STRING_CLASS_DECL,
OCTI_INTERNAL_CNST_STR_TYPE,
OCTI_SUPER_DECL,
OCTI_SUPER_SUPERFIELD_ID,
OCTI_UMSG_NONNIL_DECL,
OCTI_UMSG_NONNIL_STRET_DECL,
OCTI_STORAGE_CLS,
@ -394,6 +396,10 @@ enum objc_tree_index
OCTI_GET_PROPERTY_STRUCT_DECL,
OCTI_SET_PROPERTY_STRUCT_DECL,
/* "V1" stuff. */
OCTI_V1_PROP_LIST_TEMPL,
OCTI_V1_PROP_NAME_ATTR_CHAIN,
OCTI_MAX
};
@ -433,14 +439,17 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX];
(TREE_CODE (TYPE) == POINTER_TYPE \
&& (TYPE_MAIN_VARIANT (TREE_TYPE (TYPE)) \
== TREE_TYPE (objc_object_type)))
#define IS_CLASS(TYPE) \
(TREE_CODE (TYPE) == POINTER_TYPE \
&& (TYPE_MAIN_VARIANT (TREE_TYPE (TYPE)) \
== TREE_TYPE (objc_class_type)))
#define IS_PROTOCOL_QUALIFIED_UNTYPED(TYPE) \
((IS_ID (TYPE) || IS_CLASS (TYPE)) \
&& TYPE_HAS_OBJC_INFO (TREE_TYPE (TYPE)) \
&& TYPE_OBJC_PROTOCOL_LIST (TREE_TYPE (TYPE)))
#define IS_SUPER(TYPE) \
(TREE_CODE (TYPE) == POINTER_TYPE \
&& TREE_TYPE (TYPE) == objc_super_template)
@ -549,13 +558,19 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX];
#define objc_class_id objc_global_trees[OCTI_CLS_ID]
#define objc_object_name objc_global_trees[OCTI_ID_NAME]
#define objc_class_name objc_global_trees[OCTI_CLASS_NAME]
/* Constant string classes. */
#define constant_string_id objc_global_trees[OCTI_CNST_STR_ID]
#define constant_string_type objc_global_trees[OCTI_CNST_STR_TYPE]
#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]
#define super_superclassfield_id \
objc_global_trees[OCTI_SUPER_SUPERFIELD_ID]
#define objc_fast_enumeration_state_template \
objc_global_trees[OCTI_FAST_ENUM_STATE_TEMP]
#define objc_enumeration_mutation_decl \
@ -563,11 +578,168 @@ extern GTY(()) tree objc_global_trees[OCTI_MAX];
/* Declarations of functions used when synthesizing property
accessors. */
#define objc_getProperty_decl objc_global_trees[OCTI_GET_PROPERTY_DECL]
#define objc_setProperty_decl objc_global_trees[OCTI_SET_PROPERTY_DECL]
#define objc_copyStruct_decl objc_global_trees[OCTI_COPY_STRUCT_DECL]
#define objc_getPropertyStruct_decl objc_global_trees[OCTI_GET_PROPERTY_STRUCT_DECL]
#define objc_setPropertyStruct_decl objc_global_trees[OCTI_SET_PROPERTY_STRUCT_DECL]
#define objc_getProperty_decl objc_global_trees[OCTI_GET_PROPERTY_DECL]
#define objc_setProperty_decl objc_global_trees[OCTI_SET_PROPERTY_DECL]
#define objc_copyStruct_decl objc_global_trees[OCTI_COPY_STRUCT_DECL]
#define objc_getPropertyStruct_decl \
objc_global_trees[OCTI_GET_PROPERTY_STRUCT_DECL]
#define objc_setPropertyStruct_decl \
objc_global_trees[OCTI_SET_PROPERTY_STRUCT_DECL]
/* V1 stuff. */
#define objc_prop_list_ptr objc_global_trees[OCTI_V1_PROP_LIST_TEMPL]
#define prop_names_attr_chain objc_global_trees[OCTI_V1_PROP_NAME_ATTR_CHAIN]
/* Reserved tag definitions. */
#define OBJECT_TYPEDEF_NAME "id"
#define CLASS_TYPEDEF_NAME "Class"
#define TAG_OBJECT "objc_object"
#define TAG_CLASS "objc_class"
#define TAG_SUPER "objc_super"
#define TAG_SELECTOR "objc_selector"
#define UTAG_CLASS "_objc_class"
#define UTAG_IVAR "_objc_ivar"
#define UTAG_IVAR_LIST "_objc_ivar_list"
#define UTAG_METHOD "_objc_method"
#define UTAG_METHOD_LIST "_objc_method_list"
#define UTAG_CATEGORY "_objc_category"
#define UTAG_MODULE "_objc_module"
#define UTAG_SYMTAB "_objc_symtab"
#define UTAG_SUPER "_objc_super"
#define UTAG_SELECTOR "_objc_selector"
#define UTAG_PROTOCOL "_objc_protocol"
#define UTAG_METHOD_PROTOTYPE "_objc_method_prototype"
#define UTAG_METHOD_PROTOTYPE_LIST "_objc__method_prototype_list"
#define PROTOCOL_OBJECT_CLASS_NAME "Protocol"
#define TAG_EXCEPTIONTHROW "objc_exception_throw"
#define TAG_SYNCENTER "objc_sync_enter"
#define TAG_SYNCEXIT "objc_sync_exit"
/* Really should be NeXT private. */
#define UTAG_EXCDATA "_objc_exception_data"
#define TAG_CXX_CONSTRUCT ".cxx_construct"
#define TAG_CXX_DESTRUCT ".cxx_destruct"
#define TAG_ENUMERATION_MUTATION "objc_enumerationMutation"
#define TAG_FAST_ENUMERATION_STATE "__objcFastEnumerationState"
typedef enum string_section
{
class_names, /* class, category, protocol, module names */
meth_var_names, /* method and variable names */
meth_var_types, /* method and variable type descriptors */
prop_names_attr /* property names and their attributes. */
} string_section;
#define METHOD_DEF 0
#define METHOD_REF 1
/* (Decide if these can ever be validly changed.) */
#define OBJC_ENCODE_INLINE_DEFS 0
#define OBJC_ENCODE_DONT_INLINE_DEFS 1
#define BUFSIZE 1024
#define CLS_FACTORY 0x0001L
#define CLS_META 0x0002L
/* Runtime metadata flags - ??? apparently unused. */
#define OBJC_MODIFIER_STATIC 0x00000001
#define OBJC_MODIFIER_FINAL 0x00000002
#define OBJC_MODIFIER_PUBLIC 0x00000004
#define OBJC_MODIFIER_PRIVATE 0x00000008
#define OBJC_MODIFIER_PROTECTED 0x00000010
#define OBJC_MODIFIER_NATIVE 0x00000020
#define OBJC_MODIFIER_SYNCHRONIZED 0x00000040
#define OBJC_MODIFIER_ABSTRACT 0x00000080
#define OBJC_MODIFIER_VOLATILE 0x00000100
#define OBJC_MODIFIER_TRANSIENT 0x00000200
#define OBJC_MODIFIER_NONE_SPECIFIED 0x80000000
#define OBJC_VOID_AT_END void_list_node
/* Exception handling constructs. We begin by having the parser do most
of the work and passing us blocks.
This allows us to handle different exceptions implementations. */
/* Stack of open try blocks. */
struct objc_try_context
{
struct objc_try_context *outer;
/* Statements (or statement lists) as processed by the parser. */
tree try_body;
tree finally_body;
/* Some file position locations. */
location_t try_locus;
location_t end_try_locus;
location_t end_catch_locus;
location_t finally_locus;
location_t end_finally_locus;
/* A STATEMENT_LIST of CATCH_EXPRs, appropriate for sticking into op1
of a TRY_CATCH_EXPR. Even when doing Darwin setjmp. */
tree catch_list;
/* The CATCH_EXPR of an open @catch clause. */
tree current_catch;
/* The VAR_DECL holding __builtin_eh_pointer (or equivalent). */
tree caught_decl;
tree stack_decl;
tree rethrow_decl;
};
/* A small number of routines used by the FE parser and the runtime code
generators. Put here as inlines for efficiency in non-lto builds rather
than making them externs. */
extern tree objc_create_temporary_var (tree, const char *);
#define objc_is_object_id(TYPE) (OBJC_TYPE_NAME (TYPE) == objc_object_id)
#define objc_is_class_id(TYPE) (OBJC_TYPE_NAME (TYPE) == objc_class_id)
/* Retrieve category interface CAT_NAME (if any) associated with CLASS. */
static inline tree
lookup_category (tree klass, tree cat_name)
{
tree category = CLASS_CATEGORY_LIST (klass);
while (category && CLASS_SUPER_NAME (category) != cat_name)
category = CLASS_CATEGORY_LIST (category);
return category;
}
/* Count only the fields occurring in T. */
static inline int
ivar_list_length (tree t)
{
int count = 0;
for (; t; t = DECL_CHAIN (t))
if (TREE_CODE (t) == FIELD_DECL)
++count;
return count;
}
static inline tree
is_ivar (tree decl_chain, tree ident)
{
for ( ; decl_chain; decl_chain = DECL_CHAIN (decl_chain))
if (DECL_NAME (decl_chain) == ident)
return decl_chain;
return NULL_TREE;
}
#endif /* GCC_OBJC_ACT_H */

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
/* Language-dependent hooks for Objective-C.
Copyright 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2010
Copyright 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2010, 2011
Free Software Foundation, Inc.
Contributed by Ziemowit Laski <zlaski@apple.com>
@ -33,6 +33,7 @@ along with GCC; see the file COPYING3. If not see
#include "langhooks.h"
#include "langhooks-def.h"
#include "c-objc-common.h"
#include "c-lang.h"
enum c_language_kind c_language = clk_objc;
static void objc_init_ts (void);
@ -51,13 +52,6 @@ static void objc_init_ts (void);
#undef LANG_HOOKS_INIT_TS
#define LANG_HOOKS_INIT_TS objc_init_ts
#ifndef OBJCPLUS
#undef LANG_HOOKS_EH_PERSONALITY
#define LANG_HOOKS_EH_PERSONALITY objc_eh_personality
#undef LANG_HOOKS_EH_RUNTIME_TYPE
#define LANG_HOOKS_EH_RUNTIME_TYPE objc_eh_runtime_type
#endif
/* Each front end provides its own lang hook initializer. */
struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;

View File

@ -0,0 +1,172 @@
/* Declarations for meta-data attribute tags.
Copyright (C) 2011 Free Software Foundation, Inc.
Contributed by Iain Sandoe
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/>. */
/* These are identifiers used to flag meta-data attributes such that they
survive LTO and might be placed in correct sections for the target. */
enum objc_runtime_tree_index
{
OCTI_RT_OBJC_META,
OCTI_RT_META_BASE,
OCTI_RT_META_CLASS,
OCTI_RT_META_METACLASS,
OCTI_RT_META_CATEGORY,
OCTI_RT_META_PROTOCOL,
OCTI_RT_META_CLASS_CLS_VARS,
OCTI_RT_META_CLASS_NST_VARS,
OCTI_RT_META_CLASS_CLS_METH,
OCTI_RT_META_CLASS_NST_METH,
OCTI_RT_META_CATEG_CLS_METH,
OCTI_RT_META_CATEG_NST_METH,
OCTI_RT_META_PROTO_CLS_METH,
OCTI_RT_META_PROTO_NST_METH,
OCTI_RT_META_CLASS_PROT,
OCTI_RT_META_CATEG_PROT,
OCTI_RT_META_PROT_REFS,
OCTI_RT_META_MSG_REFS,
OCTI_RT_META_SEL_REFS,
OCTI_RT_META_CLSLST_REFS,
OCTI_RT_META_CLASS_REF,
OCTI_RT_META_SUPER_REF,
OCTI_RT_META_CLSLST_NLZY_LAB,
OCTI_RT_META_CLSLST_LAB,
OCTI_RT_META_LAB_PROTOLIST,
OCTI_RT_META_LAB_NLZY_CAT,
OCTI_RT_META_LAB_CAT,
OCTI_RT_META_PROPERTY_LIST,
OCTI_RT_META_PROTOCOL_EXT,
OCTI_RT_META_CLASS_EXT,
OCTI_RT_META_CLASS_NAME,
OCTI_RT_META_METHD_NAME,
OCTI_RT_META_METHD_TYPE,
OCTI_RT_META_PROPN_ATTR,
OCTI_RT_META_MODULES,
OCTI_RT_META_SYMTAB,
OCTI_RT_META_INFO,
OCTI_RT_META_EHTYPE,
OCTI_RT_META_CONST_STR,
OCTI_RT_META_MAX
};
/* Tags for the META data so that the backend can put them in the correct
sections for targets/runtimes (Darwin/NeXT) that require this.
This information also survives LTO - which might produce mixed language
output. */
/* Objective-C meta data attribute tag */
#define objc_meta objc_rt_trees[OCTI_RT_OBJC_META]
/* Attribute values, base = default section. */
#define meta_base objc_rt_trees[OCTI_RT_META_BASE]
/* CLASS. */
#define meta_class objc_rt_trees[OCTI_RT_META_CLASS]
/* METACLASS. */
#define meta_metaclass objc_rt_trees[OCTI_RT_META_METACLASS]
/* CLASS. */
#define meta_category objc_rt_trees[OCTI_RT_META_CATEGORY]
/* PROTOCOL. */
#define meta_protocol objc_rt_trees[OCTI_RT_META_PROTOCOL]
/* Class class vars section. */
#define meta_clac_vars objc_rt_trees[OCTI_RT_META_CLASS_CLS_VARS]
/* Class instance vars section. */
#define meta_clai_vars objc_rt_trees[OCTI_RT_META_CLASS_NST_VARS]
/* Class class methods section. */
#define meta_clac_meth objc_rt_trees[OCTI_RT_META_CLASS_CLS_METH]
/* Class instance methods section. */
#define meta_clai_meth objc_rt_trees[OCTI_RT_META_CLASS_NST_METH]
/* Category class methods section. */
#define meta_catc_meth objc_rt_trees[OCTI_RT_META_CATEG_CLS_METH]
/* Category instance methods section. */
#define meta_cati_meth objc_rt_trees[OCTI_RT_META_CATEG_NST_METH]
#define meta_proto_cls_meth \
objc_rt_trees[OCTI_RT_META_PROTO_CLS_METH]
#define meta_proto_nst_meth \
objc_rt_trees[OCTI_RT_META_PROTO_NST_METH]
/* Class protocols. */
#define meta_clas_prot objc_rt_trees[OCTI_RT_META_CLASS_PROT]
/* Category protocols. */
#define meta_catg_prot objc_rt_trees[OCTI_RT_META_CATEG_PROT]
/* Protocol references. */
#define meta_proto_ref objc_rt_trees[OCTI_RT_META_PROT_REFS]
/* Message refs. */
#define meta_mref objc_rt_trees[OCTI_RT_META_MSG_REFS]
/* Selector refs. */
#define meta_sel_refs objc_rt_trees[OCTI_RT_META_SEL_REFS]
/* Class list refs. */
#define meta_class_ref objc_rt_trees[OCTI_RT_META_CLSLST_REFS]
#define meta_class_reference \
objc_rt_trees[OCTI_RT_META_CLASS_REF]
#define meta_superclass_ref \
objc_rt_trees[OCTI_RT_META_SUPER_REF]
/* Class list Label. */
#define meta_label_classlist \
objc_rt_trees[OCTI_RT_META_CLSLST_LAB]
/* Class list Label (non lazy). */
#define meta_label_nonlazy_classlist \
objc_rt_trees[OCTI_RT_META_CLSLST_NLZY_LAB]
#define meta_label_categorylist \
objc_rt_trees[OCTI_RT_META_LAB_CAT]
#define meta_label_nonlazy_categorylist \
objc_rt_trees[OCTI_RT_META_LAB_NLZY_CAT]
#define meta_label_protocollist \
objc_rt_trees[OCTI_RT_META_LAB_PROTOLIST]
/* V1 - property list. */
#define meta_proplist objc_rt_trees[OCTI_RT_META_PROPERTY_LIST]
#define meta_protocol_extension \
objc_rt_trees[OCTI_RT_META_PROTOCOL_EXT]
#define meta_class_extension \
objc_rt_trees[OCTI_RT_META_CLASS_EXT]
/* String sections. */
#define meta_class_name objc_rt_trees[OCTI_RT_META_CLASS_NAME]
#define meta_meth_name objc_rt_trees[OCTI_RT_META_METHD_NAME]
#define meta_meth_type objc_rt_trees[OCTI_RT_META_METHD_TYPE]
#define meta_prop_name_attr \
objc_rt_trees[OCTI_RT_META_PROPN_ATTR]
#define meta_modules objc_rt_trees[OCTI_RT_META_MODULES]
#define meta_symtab objc_rt_trees[OCTI_RT_META_SYMTAB]
#define meta_info objc_rt_trees[OCTI_RT_META_INFO]
#define meta_ehtype objc_rt_trees[OCTI_RT_META_EHTYPE]
#define meta_const_str objc_rt_trees[OCTI_RT_META_CONST_STR]
#define OBJCMETA(DECL,VERS,KIND) \
if (VERS) \
DECL_ATTRIBUTES (DECL) = build_tree_list ((VERS), (KIND));

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,108 @@
/* Hooks to abstract the runtime meta-data generation for Objective C.
Copyright (C) 2011 Free Software Foundation, Inc.
Contributed by Iain Sandoe
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/>. */
#ifndef _OBJC_RUNTIME_HOOKS_H_
#define _OBJC_RUNTIME_HOOKS_H_
/* A set of hooks for the front end to obtain runtime-specific actions. */
/* Objective-C supports several runtime library variants:
"GNU" runtime selected by -fgnu-runtime (currently at API version 1).
"NeXT" runtime (selected by -fnext-runtime) and installed on OSX/Darwin
systems at API version 1 (for m32 code) and version 2 (for m64 code).
The runtimes require different data types/layouts, method call mechanisms
and so on, and the purpose of this interface is to abstract such
differences from the parser's perspective. */
typedef struct _objc_runtime_hooks_r
{
/* Initialize for this runtime. */
void (*initialize) (void);
const char *default_constant_string_class_name;
/* FIXME: Having to check this name should not be necessary. */
const char *tag_getclass;
/* id for superclass class field - named differently in the existing
runtimes. */
tree (*super_superclassfield_ident) (void);
/* Obtain a class decl for the identifier. */
tree (*class_decl) (tree);
/* Obtain a metaclass decl for the identifier. */
tree (*metaclass_decl) (tree);
/* Obtain a category decl for the identifier. */
tree (*category_decl) (tree);
/* Obtain a protocol decl for the identifier. */
tree (*protocol_decl) (tree);
/* Obtain a string decl, to be placed in the nominated string-section. */
tree (*string_decl) (tree, const char *, string_section);
/* Obtain a class reference, generating the fwd def. if necessary. */
tree (*get_class_reference) (tree);
/* build/get selector reference. */
tree (*build_selector_reference) (location_t, tree, tree);
/* Get a protocol reference, generating the forward def. if necessary. */
tree (*get_protocol_reference) (location_t, tree);
/* Get an ivar ref. re the base. */
tree (*build_ivar_reference) (location_t, tree, tree);
/* Get a reference to {meta}class' super. */
tree (*get_class_super_ref) (location_t, struct imp_entry *, bool);
/* Get a reference to Category {meta}class' super. */
tree (*get_category_super_ref) (location_t, struct imp_entry *, bool);
/* Receiver is class Object, check runtime-specific. */
tree (*receiver_is_class_object) (tree);
/* Get the start of a method argument type list (receiver, _cmd). */
tree (*get_arg_type_list_base) (tree, int, int);
/* Build method call. */
tree (*build_objc_method_call) (location_t, tree, tree, tree, tree, tree, int);
/* Check for or otherwise handle a request to check that the constant
string class reference is set-up & OK. */
bool (*setup_const_string_class_decl) (void);
/* Return the tree reprenting a const string constructor for the arg.
Most of the data are in global trees. */
tree (*build_const_string_constructor) (location_t, tree, int);
/* Exceptions. */
tree (*build_throw_stmt) (location_t, tree, bool);
tree (*build_exc_ptr) (struct objc_try_context **);
tree (*begin_catch) (struct objc_try_context **, tree, tree, tree, bool);
void (*finish_catch) (struct objc_try_context **, tree);
tree (*finish_try_stmt) (struct objc_try_context **);
/* Emit all the metadata required by the runtime - based on the tables built
during parsing. */
void (*generate_metadata) (void);
} objc_runtime_hooks;
/* For shared support that needs to access these. */
extern objc_runtime_hooks runtime;
/* One per runtime at present.
TODO: Make into some kind of configury-generated table. */
extern bool objc_gnu_runtime_abi_01_init (objc_runtime_hooks *);
extern bool objc_next_runtime_abi_01_init (objc_runtime_hooks *);
extern bool objc_next_runtime_abi_02_init (objc_runtime_hooks *);
#endif /* _OBJC_RUNTIME_HOOKS_H_ */

View File

@ -0,0 +1,733 @@
/* Support routines shared by all runtimes.
Copyright (C) 2011 Free Software Foundation, Inc.
Contributed by Iain Sandoe (partially split from objc-act.c)
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"
#ifdef OBJCPLUS
#include "cp-tree.h"
#else
#include "c-tree.h"
#include "c-lang.h"
#endif
#include "langhooks.h"
#include "c-family/c-objc.h"
#include "objc-act.h"
/* When building Objective-C++, we are not linking against the C front-end
and so need to replicate the C tree-construction functions in some way. */
#ifdef OBJCPLUS
#define OBJCP_REMAP_FUNCTIONS
#include "objcp-decl.h"
#endif /* OBJCPLUS */
#include "obstack.h"
/* These are only used for encoding ivars. */
extern struct obstack util_obstack;
extern char *util_firstobj;
/* Hooks for string decls etc. */
#include "objc-runtime-hooks.h"
#include "objc-runtime-shared-support.h"
/* rt_trees identifiers - shared between NeXT implementations. These allow
the FE to tag meta-data in a manner that survives LTO and can be used when
the runtime requires that certain meta-data items appear in particular
named sections. */
#include "objc-next-metadata-tags.h"
extern GTY(()) tree objc_rt_trees[OCTI_RT_META_MAX];
/* Rather than repeatedly looking up the identifiers, we save them here. */
tree objc_rt_trees[OCTI_RT_META_MAX];
/* For building an objc struct. These might not be used when this file
is compiled as part of obj-c++. */
static bool objc_building_struct;
static struct c_struct_parse_info *objc_struct_info ATTRIBUTE_UNUSED;
/* Start building a struct for objc. */
tree
objc_start_struct (tree name)
{
gcc_assert (!objc_building_struct);
objc_building_struct = true;
return start_struct (input_location, RECORD_TYPE, name, &objc_struct_info);
}
/* Finish building a struct for objc. */
tree
objc_finish_struct (tree type, tree fieldlist)
{
gcc_assert (objc_building_struct);
objc_building_struct = false;
return finish_struct (input_location, type, fieldlist, NULL_TREE,
objc_struct_info);
}
tree
build_sized_array_type (tree base_type, int size)
{
tree index_type = build_index_type (build_int_cst (NULL_TREE, size - 1));
return build_array_type (base_type, index_type);
}
/* Create a declaration for field NAME of a given TYPE. */
static tree
create_field_decl (tree type, const char *name)
{
return build_decl (input_location,
FIELD_DECL, get_identifier (name), type);
}
tree
add_field_decl (tree type, const char *name, tree **chain)
{
tree field = create_field_decl (type, name);
if (*chain != NULL)
**chain = field;
*chain = &DECL_CHAIN (field);
return field;
}
/* Create a global, static declaration for variable NAME of a given TYPE. The
finish_var_decl() routine will need to be called on it afterwards. */
tree
start_var_decl (tree type, const char *name)
{
tree var = build_decl (input_location,
VAR_DECL, get_identifier (name), type);
TREE_STATIC (var) = 1;
DECL_INITIAL (var) = error_mark_node; /* A real initializer is coming... */
DECL_IGNORED_P (var) = 1;
DECL_ARTIFICIAL (var) = 1;
DECL_CONTEXT (var) = NULL_TREE;
#ifdef OBJCPLUS
DECL_THIS_STATIC (var) = 1; /* squash redeclaration errors */
#endif
return var;
}
/* Finish off the variable declaration created by start_var_decl(). */
void
finish_var_decl (tree var, tree initializer)
{
finish_decl (var, input_location, initializer, NULL_TREE, NULL_TREE);
}
/* Just a handy wrapper for add_objc_string. */
tree
build_selector (tree ident)
{
return convert (objc_selector_type, add_objc_string (ident, meth_var_names));
}
/* --- templates --- */
/* Set 'objc_super_template' to the data type node for 'struct _objc_super'.
This needs to be done just once per compilation. */
/* struct _objc_super {
struct _objc_object *self;
struct _objc_class *super_class;
[or Class cls; for the abi v2]
}; */
void
build_super_template (void)
{
tree decls, *chain = NULL;
objc_super_template = objc_start_struct (get_identifier (UTAG_SUPER));
/* struct _objc_object *self; */
decls = add_field_decl (objc_object_type, "self", &chain);
/* struct _objc_class *super_class; */
add_field_decl (build_pointer_type (objc_class_template),
"super_class", &chain);
objc_finish_struct (objc_super_template, decls);
}
/* To accomplish method prototyping without generating all kinds of
inane warnings, the definition of the dispatch table entries were
changed from:
struct objc_method { SEL _cmd; ...; id (*_imp)(); };
to:
struct objc_method { SEL _cmd; ...; void *_imp; }; */
tree
build_method_template (void)
{
tree _SLT_record;
tree decls, *chain = NULL;
_SLT_record = objc_start_struct (get_identifier (UTAG_METHOD));
/* SEL _cmd; */
decls = add_field_decl (objc_selector_type, "_cmd", &chain);
/* char *method_types; */
add_field_decl (string_type_node, "method_types", &chain);
/* void *_imp; */
add_field_decl (build_pointer_type (void_type_node), "_imp", &chain);
objc_finish_struct (_SLT_record, decls);
return _SLT_record;
}
tree
build_method_prototype_template (void)
{
tree proto_record;
tree decls, *chain = NULL;
proto_record = objc_start_struct (get_identifier (UTAG_METHOD_PROTOTYPE));
/* SEL _cmd; */
decls = add_field_decl (objc_selector_type, "_cmd", &chain);
/* char *method_types; */
add_field_decl (string_type_node, "method_types", &chain);
objc_finish_struct (proto_record, decls);
return proto_record;
}
/* struct {
struct _objc__method_prototype_list *method_next;
int method_count;
struct objc_method method_list[method_count];
}; */
tree
build_method_list_template (tree list_type, int size)
{
tree objc_ivar_list_record;
tree array_type, decls, *chain = NULL;
objc_ivar_list_record = objc_start_struct (NULL_TREE);
/* struct _objc__method_prototype_list *method_next; */
decls = add_field_decl (objc_method_proto_list_ptr, "method_next", &chain);
/* int method_count; */
add_field_decl (integer_type_node, "method_count", &chain);
/* struct objc_method method_list[]; */
array_type = build_sized_array_type (list_type, size);
add_field_decl (array_type, "method_list", &chain);
objc_finish_struct (objc_ivar_list_record, decls);
return objc_ivar_list_record;
}
/* struct objc_method_prototype_list {
int count;
struct objc_method_prototype {
SEL name;
char *types;
} list[1];
}; */
tree
build_method_prototype_list_template (tree list_type, int size)
{
tree objc_ivar_list_record;
tree array_type, decls, *chain = NULL;
/* Generate an unnamed struct definition. */
objc_ivar_list_record = objc_start_struct (NULL_TREE);
/* int method_count; */
decls = add_field_decl (integer_type_node, "method_count", &chain);
/* struct objc_method method_list[]; */
array_type = build_sized_array_type (list_type, size);
add_field_decl (array_type, "method_list", &chain);
objc_finish_struct (objc_ivar_list_record, decls);
return objc_ivar_list_record;
}
/* --- names, decls entry --- */
/* For each string section we have a chain which maps identifier nodes
to decls for the strings. */
static GTY(()) int meth_var_names_idx;
static GTY(()) int meth_var_types_idx;
static GTY(()) int property_name_attr_idx;
tree
add_objc_string (tree ident, string_section section)
{
tree *chain, decl, type;
char buf[BUFSIZE];
switch (section)
{
case class_names:
chain = &class_names_chain;
snprintf (buf, BUFSIZE, "_OBJC_ClassName_%s", IDENTIFIER_POINTER (ident));
break;
case meth_var_names:
chain = &meth_var_names_chain;
snprintf (buf, BUFSIZE, "_OBJC_METH_VAR_NAME_%d", meth_var_names_idx++);
break;
case meth_var_types:
chain = &meth_var_types_chain;
snprintf (buf, BUFSIZE, "_OBJC_METH_VAR_TYPE_%d", meth_var_types_idx++);
break;
case prop_names_attr:
chain = &prop_names_attr_chain;
snprintf (buf, BUFSIZE, "_OBJC_PropertyAttributeOrName_%d", property_name_attr_idx++);
break;
default:
gcc_unreachable ();
}
while (*chain)
{
if (TREE_VALUE (*chain) == ident)
return convert (string_type_node,
build_unary_op (input_location,
ADDR_EXPR, TREE_PURPOSE (*chain), 1));
chain = &TREE_CHAIN (*chain);
}
type = build_sized_array_type (char_type_node, IDENTIFIER_LENGTH (ident) + 1);
/* Get a runtime-specific string decl which will be finish_var()'ed in
generate_strings (). */
decl = (*runtime.string_decl) (type, buf, section);
TREE_CONSTANT (decl) = 1;
*chain = tree_cons (decl, ident, NULL_TREE);
return convert (string_type_node,
build_unary_op (input_location, ADDR_EXPR, decl, 1));
}
/* --- shared metadata routines --- */
tree
build_descriptor_table_initializer (tree type, tree entries)
{
VEC(constructor_elt,gc) *inits = NULL;
do
{
VEC(constructor_elt,gc) *elts = NULL;
CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
build_selector (METHOD_SEL_NAME (entries)));
CONSTRUCTOR_APPEND_ELT (elts, NULL_TREE,
add_objc_string (METHOD_ENCODING (entries),
meth_var_types));
CONSTRUCTOR_APPEND_ELT (inits, NULL_TREE,
objc_build_constructor (type, elts));
entries = DECL_CHAIN (entries);
}
while (entries);
return objc_build_constructor (build_array_type (type, 0), inits);
}
tree
build_dispatch_table_initializer (tree type, tree entries)
{
VEC(constructor_elt,gc) *inits = NULL;
do
{
VEC(constructor_elt,gc) *elems = NULL;
tree expr;
CONSTRUCTOR_APPEND_ELT (elems, NULL_TREE,
build_selector (METHOD_SEL_NAME (entries)));
/* Generate the method encoding if we don't have one already. */
if (! METHOD_ENCODING (entries))
METHOD_ENCODING (entries) =
encode_method_prototype (entries);
CONSTRUCTOR_APPEND_ELT (elems, NULL_TREE,
add_objc_string (METHOD_ENCODING (entries),
meth_var_types));
expr = convert (ptr_type_node,
build_unary_op (input_location, ADDR_EXPR,
METHOD_DEFINITION (entries), 1));
CONSTRUCTOR_APPEND_ELT (elems, NULL_TREE, expr);
CONSTRUCTOR_APPEND_ELT (inits, NULL_TREE,
objc_build_constructor (type, elems));
entries = DECL_CHAIN (entries);
}
while (entries);
return objc_build_constructor (build_array_type (type, 0), inits);
}
/* Used only by build_*_selector_translation_table (). */
void
diagnose_missing_method (tree meth, location_t here)
{
tree method_chain;
bool found = false;
for (method_chain = meth_var_names_chain;
method_chain;
method_chain = TREE_CHAIN (method_chain))
{
if (TREE_VALUE (method_chain) == meth)
{
found = true;
break;
}
}
if (!found)
warning_at (here, 0, "creating selector for nonexistent method %qE",
meth);
}
static tree
init_module_descriptor (tree type, long vers)
{
tree expr, ltyp;
location_t loc;
VEC(constructor_elt,gc) *v = NULL;
/* No really useful place to point to. */
loc = UNKNOWN_LOCATION;
/* version = { 1, ... } */
expr = build_int_cst (long_integer_type_node, vers);
CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, expr);
/* size = { ..., sizeof (struct _objc_module), ... } */
expr = convert (long_integer_type_node,
size_in_bytes (objc_module_template));
CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, expr);
/* Don't provide any file name for security reasons. */
/* name = { ..., "", ... } */
expr = add_objc_string (get_identifier (""), class_names);
CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, expr);
/* symtab = { ..., _OBJC_SYMBOLS, ... } */
ltyp = build_pointer_type (xref_tag (RECORD_TYPE,
get_identifier (UTAG_SYMTAB)));
if (UOBJC_SYMBOLS_decl)
expr = convert (ltyp, build_unary_op (loc,
ADDR_EXPR, UOBJC_SYMBOLS_decl, 0));
else
expr = convert (ltyp, null_pointer_node);
CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, expr);
return objc_build_constructor (type, v);
}
/* Write out the data structures to describe Objective C classes defined.
struct _objc_module { ... } _OBJC_MODULE = { ... }; */
void
build_module_descriptor (long vers, tree attr)
{
tree decls, *chain = NULL;
#ifdef OBJCPLUS
push_lang_context (lang_name_c); /* extern "C" */
#endif
objc_module_template = objc_start_struct (get_identifier (UTAG_MODULE));
/* long version; */
decls = add_field_decl (long_integer_type_node, "version", &chain);
/* long size; */
add_field_decl (long_integer_type_node, "size", &chain);
/* char *name; */
add_field_decl (string_type_node, "name", &chain);
/* struct _objc_symtab *symtab; */
add_field_decl (build_pointer_type (xref_tag (RECORD_TYPE,
get_identifier (UTAG_SYMTAB))),
"symtab", &chain);
objc_finish_struct (objc_module_template, decls);
/* Create an instance of "_objc_module". */
UOBJC_MODULES_decl = start_var_decl (objc_module_template,
flag_next_runtime ? "_OBJC_Module" : "_OBJC_Module");
/* This is the root of the metadata for defined classes and categories, it
is referenced by the runtime and, therefore, needed. */
DECL_PRESERVE_P (UOBJC_MODULES_decl) = 1;
/* Allow the runtime to mark meta-data such that it can be assigned to target
specific sections by the back-end. */
if (attr)
DECL_ATTRIBUTES (UOBJC_MODULES_decl) = attr;
finish_var_decl (UOBJC_MODULES_decl,
init_module_descriptor (TREE_TYPE (UOBJC_MODULES_decl),
vers));
#ifdef OBJCPLUS
pop_lang_context ();
#endif
}
tree
build_ivar_list_initializer (tree type, tree field_decl)
{
VEC(constructor_elt,gc) *inits = NULL;
do
{
VEC(constructor_elt,gc) *ivar = NULL;
tree id;
/* Set name. */
if (DECL_NAME (field_decl))
CONSTRUCTOR_APPEND_ELT (ivar, NULL_TREE,
add_objc_string (DECL_NAME (field_decl),
meth_var_names));
else
/* Unnamed bit-field ivar (yuck). */
CONSTRUCTOR_APPEND_ELT (ivar, NULL_TREE, build_int_cst (NULL_TREE, 0));
/* Set type. */
encode_field_decl (field_decl,
obstack_object_size (&util_obstack),
OBJC_ENCODE_DONT_INLINE_DEFS);
/* Null terminate string. */
obstack_1grow (&util_obstack, 0);
id = add_objc_string (get_identifier (XOBFINISH (&util_obstack, char *)),
meth_var_types);
CONSTRUCTOR_APPEND_ELT (ivar, NULL_TREE, id);
obstack_free (&util_obstack, util_firstobj);
/* Set offset. */
CONSTRUCTOR_APPEND_ELT (ivar, NULL_TREE, byte_position (field_decl));
CONSTRUCTOR_APPEND_ELT (inits, NULL_TREE,
objc_build_constructor (type, ivar));
do
field_decl = DECL_CHAIN (field_decl);
while (field_decl && TREE_CODE (field_decl) != FIELD_DECL);
}
while (field_decl);
return objc_build_constructor (build_array_type (type, 0), inits);
}
/* struct {
int ivar_count;
struct objc_ivar ivar_list[ivar_count];
}; */
tree
build_ivar_list_template (tree list_type, int size)
{
tree objc_ivar_list_record;
tree array_type, decls, *chain = NULL;
objc_ivar_list_record = objc_start_struct (NULL_TREE);
/* int ivar_count; */
decls = add_field_decl (integer_type_node, "ivar_count", &chain);
/* struct objc_ivar ivar_list[]; */
array_type = build_sized_array_type (list_type, size);
add_field_decl (array_type, "ivar_list", &chain);
objc_finish_struct (objc_ivar_list_record, decls);
return objc_ivar_list_record;
}
/* struct _objc_ivar {
char *ivar_name;
char *ivar_type;
int ivar_offset;
}; */
tree
build_ivar_template (void)
{
tree objc_ivar_id, objc_ivar_record;
tree decls, *chain = NULL;
objc_ivar_id = get_identifier (UTAG_IVAR);
objc_ivar_record = objc_start_struct (objc_ivar_id);
/* char *ivar_name; */
decls = add_field_decl (string_type_node, "ivar_name", &chain);
/* char *ivar_type; */
add_field_decl (string_type_node, "ivar_type", &chain);
/* int ivar_offset; */
add_field_decl (integer_type_node, "ivar_offset", &chain);
objc_finish_struct (objc_ivar_record, decls);
return objc_ivar_record;
}
/* Used by NeXT ABI=0..2 */
void
build_next_selector_translation_table (void)
{
tree chain;
for (chain = sel_ref_chain; chain; chain = TREE_CHAIN (chain))
{
tree expr;
tree decl = TREE_PURPOSE (chain);
if (warn_selector)
{
location_t loc;
if (decl)
loc = DECL_SOURCE_LOCATION (decl);
else
loc = UNKNOWN_LOCATION;
diagnose_missing_method (TREE_VALUE (chain), loc);
}
expr = build_selector (TREE_VALUE (chain));
if (decl)
{
/* Entries of this form are used for references to methods.
The runtime re-writes these on start-up, but the compiler can't see
that and optimizes it away unless we force it. */
DECL_PRESERVE_P (decl) = 1;
finish_var_decl (decl, expr);
}
}
}
void
generate_protocol_references (tree plist)
{
tree lproto;
/* Forward declare protocols referenced. */
for (lproto = plist; lproto; lproto = TREE_CHAIN (lproto))
{
tree proto = TREE_VALUE (lproto);
if (TREE_CODE (proto) == PROTOCOL_INTERFACE_TYPE
&& PROTOCOL_NAME (proto))
{
if (! PROTOCOL_FORWARD_DECL (proto))
PROTOCOL_FORWARD_DECL (proto) = (*runtime.protocol_decl) (proto);
if (PROTOCOL_LIST (proto))
generate_protocol_references (PROTOCOL_LIST (proto));
}
}
}
/* --- new routines --- */
/* Output all strings. */
/* FIXME: don't use global vars for all this... */
/* This emits all the meta-data string tables (and finalizes each var
as it goes). */
void
generate_strings (void)
{
tree chain, string_expr;
tree string, decl; /* , type;*/
for (chain = class_names_chain; chain; chain = TREE_CHAIN (chain))
{
string = TREE_VALUE (chain);
decl = TREE_PURPOSE (chain);
string_expr = my_build_string (IDENTIFIER_LENGTH (string) + 1,
IDENTIFIER_POINTER (string));
finish_var_decl (decl, string_expr);
}
for (chain = meth_var_names_chain; chain; chain = TREE_CHAIN (chain))
{
string = TREE_VALUE (chain);
decl = TREE_PURPOSE (chain);
string_expr = my_build_string (IDENTIFIER_LENGTH (string) + 1,
IDENTIFIER_POINTER (string));
finish_var_decl (decl, string_expr);
}
for (chain = meth_var_types_chain; chain; chain = TREE_CHAIN (chain))
{
string = TREE_VALUE (chain);
decl = TREE_PURPOSE (chain);
string_expr = my_build_string (IDENTIFIER_LENGTH (string) + 1,
IDENTIFIER_POINTER (string));
finish_var_decl (decl, string_expr);
}
for (chain = prop_names_attr_chain; chain; chain = TREE_CHAIN (chain))
{
string = TREE_VALUE (chain);
decl = TREE_PURPOSE (chain);
string_expr = my_build_string (IDENTIFIER_LENGTH (string) + 1,
IDENTIFIER_POINTER (string));
finish_var_decl (decl, string_expr);
}
}
#include "gt-objc-objc-runtime-shared-support.h"

View File

@ -0,0 +1,90 @@
/* Support routines shared by all runtimes.
Copyright (C) 2011 Free Software Foundation, Inc.
Contributed by Iain Sandoe
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/>. */
#ifndef _OBJC_RUNTIME_SHARED_SUPPORT_H_
#define _OBJC_RUNTIME_SHARED_SUPPORT_H_
/* Left in obj-act.c for now... */
extern tree objc_start_struct (tree);
extern tree objc_finish_struct (tree, tree);
extern tree add_field_decl (tree, const char *, tree **);
extern tree build_sized_array_type (tree, int);
extern tree lookup_interface (tree);
extern tree objc_build_constructor (tree, VEC(constructor_elt,gc) *);
extern tree start_var_decl (tree, const char *);
extern void finish_var_decl (tree, tree);
extern tree my_build_string (int, const char *);
extern tree my_build_string_pointer (int, const char *);
extern tree add_objc_string (tree ident, string_section);
extern tree get_objc_string_decl (tree, string_section);
extern void add_class_reference (tree);
#ifdef OBJCPLUS
extern void objc_start_function (tree, tree, tree, tree);
extern tree objc_get_parm_info (int);
#else
extern void objc_start_function (tree, tree, tree, struct c_arg_info *);
extern struct c_arg_info *objc_get_parm_info (int);
#endif
extern void objc_push_parm (tree);
extern tree get_arg_type_list (tree, int, int);
/* Stuff that should be migrated to shared support (or some v1-only file). */
extern void build_super_template (void);
extern tree objc_build_component_ref (tree, tree);
extern tree objc_v2_encode_prop_attr (tree);
extern tree build_descriptor_table_initializer (tree, tree);
extern tree build_method_prototype_list_template (tree, int);
extern tree build_protocol_initializer (tree, tree, tree, tree, tree);
/* Stuff that should be migrated to shared encode. */
extern tree encode_method_prototype (tree);
extern void encode_field_decl (tree, int, int);
/* Moved or new routines in objc-runtime-shared-support.c */
extern tree build_selector (tree);
extern tree build_method_template (void);
extern tree build_method_prototype_template (void);
extern tree build_method_list_template (tree, int);
extern tree build_dispatch_table_initializer (tree, tree);
extern void diagnose_missing_method (tree, location_t);
extern void build_next_selector_translation_table (void);
extern void generate_protocol_references (tree);
extern void build_module_descriptor (long, tree);
extern tree build_ivar_list_initializer (tree, tree);
extern tree build_ivar_list_template (tree, int);
extern tree build_ivar_template (void);
extern void generate_strings (void);
extern void dump_interface (FILE *, tree);
extern int generating_instance_variables;
extern FILE *gen_declaration_file;
#endif /* _OBJC_RUNTIME_SHARED_SUPPORT_H_ */

View File

@ -1,3 +1,19 @@
2011-02-17 Iain Sandoe <iains@gcc.gnu.org>
* Make-lang.in (START_HDRS): New.
(OBJCXX_OBJS): Added new object files from objc/.
(objcp/objcp-act.o): Updated prerequisites.
(objcp/objcp-lang.o): Updated prerequisites.
(objcp/objc-runtime-shared-support.o): New.
(objcp/objc-gnu-runtime-abi-01.o): New.
(objcp/objc-next-runtime-abi-01.o): New.
(objcp/objc-next-runtime-abi-02.o): New.
* config-lang.in (gtfiles): Updated.
* objcp-lang.c (objcxx_eh_personality): Removed.
(LANG_HOOKS_EH_PERSONALITY): Removed.
(LANG_HOOKS_EH_RUNTIME_TYPE): Removed.
(objcp_eh_personality_decl): Removed.
2011-02-07 Mike Stump <mikestump@comcast.net>
* Make-lang.in (obj-c++.tags): Don't include *.y.

View File

@ -1,5 +1,5 @@
# Top level -*- makefile -*- fragment for GNU Objective-C++
# Copyright (C) 2005, 2007, 2008, 2009, 2010
# Copyright (C) 2005, 2007, 2008, 2009, 2010, 2011
# Free Software Foundation, Inc.
# Contributed by Ziemowit Laski <zlaski@apple.com>
@ -44,12 +44,19 @@ obj-c++: cc1objplus$(exeext)
# Tell GNU make to ignore these if they exist.
.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
# Use maximal warnings for this front end. Also, make ObjC and C++
# headers accessible.
objcp-warn = $(STRICT_WARN) -DOBJCPLUS -I$(srcdir)/objc -I$(srcdir)/cp
# Language-specific object files for Objective C++.
OBJCXX_OBJS = objcp/objcp-act.o objcp/objcp-lang.o objcp/objcp-decl.o \
objcp/objc-runtime-shared-support.o \
objcp/objc-gnu-runtime-abi-01.o \
objcp/objc-next-runtime-abi-01.o \
objcp/objc-next-runtime-abi-02.o \
$(CXX_AND_OBJCXX_OBJS)
obj-c++_OBJS = $(OBJCXX_OBJS) cc1objplus-checksum.o
@ -69,23 +76,48 @@ cc1objplus$(exeext): $(OBJCXX_OBJS) cc1objplus-checksum.o $(BACKEND) $(LIBDEPS)
# Objective C++ language specific files.
objcp/objcp-lang.o : objcp/objcp-lang.c \
$(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(CXX_TREE_H) \
$(C_COMMON_H) $(LANGHOOKS_DEF_H) objc/objc-act.h cp/cp-objcp-common.h \
$(TARGET_H) gtype-objcp.h c-family/c-objc.h
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
objcp/objcp-decl.o : objcp/objcp-decl.c \
$(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(CXX_TREE_H) \
objc/objc-act.h objcp/objcp-decl.h c-family/c-objc.h
objcp/objc-runtime-shared-support.o : objc/objc-runtime-shared-support.c \
$(START_HDRS) objc/objc-runtime-shared-support.h $(OBSTACK_H) \
objc/objc-next-metadata-tags.h gt-objc-objc-runtime-shared-support.h
$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< \
$(OUTPUT_OPTION)
objcp/objc-gnu-runtime-abi-01.o: objc/objc-gnu-runtime-abi-01.c $(START_HDRS) \
objc/objc-runtime-hooks.h $(GGC_H) \
gt-objc-objc-gnu-runtime-abi-01.h toplev.h
$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< \
$(OUTPUT_OPTION)
objcp/objc-next-runtime-abi-01.o: objc/objc-next-runtime-abi-01.c $(START_HDRS) \
$(GGC_H) objc/objc-runtime-hooks.h \
objc/objc-next-metadata-tags.h gt-objc-objc-next-runtime-abi-01.h output.h \
objc/objc-runtime-shared-support.h $(TARGET_H)
$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< \
$(OUTPUT_OPTION)
objcp/objc-next-runtime-abi-02.o: objc/objc-next-runtime-abi-02.c $(START_HDRS) \
$(GGC_H) objc/objc-runtime-hooks.h \
objc/objc-next-metadata-tags.h gt-objc-objc-next-runtime-abi-02.h $(TARGET_H) \
objc/objc-runtime-shared-support.h $(OBSTACK_H)
$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< \
$(OUTPUT_OPTION)
# The following must be an explicit rule; please keep in sync with the implicit
# one in Makefile.in.
objcp/objcp-act.o : objc/objc-act.c \
$(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) $(RTL_H) $(TM_P_H) \
$(EXPR_H) $(TARGET_H) $(CXX_TREE_H) $(DIAGNOSTIC_H) toplev.h $(FLAGS_H) \
objc/objc-act.h input.h $(FUNCTION_H) output.h debug.h langhooks.h \
objcp/objcp-act.o : objc/objc-act.c $(START_HDRS) $(GGC_H) \
$(RTL_H) $(EXPR_H) $(TARGET_H) $(DIAGNOSTIC_H) toplev.h $(FLAGS_H) \
input.h $(FUNCTION_H) output.h debug.h $(OBSTACK_H) \
objcp/objcp-decl.h $(LANGHOOKS_DEF_H) $(HASHTAB_H) gt-objc-objc-act.h \
$(GIMPLE_H) c-family/c-objc.h
$(GIMPLE_H) objc/objc-runtime-hooks.h objc/objc-runtime-shared-support.h
$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< \
$(OUTPUT_OPTION)

View File

@ -1,5 +1,5 @@
# Top level configure fragment for GNU Objective-C++.
# Copyright (C) 2005, 2007, 2010 Free Software Foundation, Inc.
# Copyright (C) 2005, 2007, 2010, 2011 Free Software Foundation, Inc.
# Contributed by Ziemowit Laski <zlaski@apple.com>
#This file is part of GCC.
@ -37,4 +37,4 @@ build_by_default="no"
lang_requires="objc c++"
subdir_requires="objc cp"
gtfiles="\$(srcdir)/objcp/objcp-decl.c \$(srcdir)/objc/objc-act.c \$(srcdir)/objc/objc-act.h \$(srcdir)/cp/rtti.c \$(srcdir)/cp/mangle.c \$(srcdir)/cp/name-lookup.h \$(srcdir)/cp/name-lookup.c \$(srcdir)/cp/cp-tree.h \$(srcdir)/cp/decl.h \$(srcdir)/cp/call.c \$(srcdir)/cp/decl.c \$(srcdir)/cp/decl2.c \$(srcdir)/cp/pt.c \$(srcdir)/cp/repo.c \$(srcdir)/cp/semantics.c \$(srcdir)/cp/tree.c \$(srcdir)/cp/parser.c \$(srcdir)/cp/method.c \$(srcdir)/cp/typeck2.c \$(srcdir)/c-family/c-common.c \$(srcdir)/c-family/c-common.h \$(srcdir)/c-family/c-objc.h \$(srcdir)/c-family/c-lex.c \$(srcdir)/c-family/c-cppbuiltin.c \$(srcdir)/c-family/c-pragma.h \$(srcdir)/c-family/c-pragma.c \$(srcdir)/cp/cp-objcp-common.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)/cp/call.c \$(srcdir)/cp/cp-tree.h \$(srcdir)/cp/decl.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 \$(srcdir)/cp/parser.c \$(srcdir)/cp/pt.c \$(srcdir)/cp/repo.c \$(srcdir)/cp/rtti.c \$(srcdir)/cp/semantics.c \$(srcdir)/cp/tree.c \$(srcdir)/cp/typeck2.c \$(srcdir)/c-family/c-common.c \$(srcdir)/c-family/c-common.h \$(srcdir)/c-family/c-objc.h \$(srcdir)/c-family/c-lex.c \$(srcdir)/c-family/c-cppbuiltin.c \$(srcdir)/c-family/c-pragma.h \$(srcdir)/c-family/c-pragma.c "

View File

@ -1,5 +1,5 @@
/* Language-dependent hooks for Objective-C++.
Copyright 2005, 2007, 2008, 2010 Free Software Foundation, Inc.
Copyright 2005, 2007, 2008, 2010, 2011 Free Software Foundation, Inc.
Contributed by Ziemowit Laski <zlaski@apple.com>
This file is part of GCC.
@ -18,7 +18,6 @@ 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"
@ -35,7 +34,6 @@ along with GCC; see the file COPYING3. If not see
enum c_language_kind c_language = clk_objcxx;
static void objcxx_init_ts (void);
static tree objcxx_eh_personality (void);
/* Lang hooks common to C++ and ObjC++ are declared in cp/cp-objcp-common.h;
consequently, there should be very few hooks below. */
@ -48,10 +46,6 @@ static tree objcxx_eh_personality (void);
#define LANG_HOOKS_GIMPLIFY_EXPR objc_gimplify_expr
#undef LANG_HOOKS_INIT_TS
#define LANG_HOOKS_INIT_TS objcxx_init_ts
#undef LANG_HOOKS_EH_PERSONALITY
#define LANG_HOOKS_EH_PERSONALITY objcxx_eh_personality
#undef LANG_HOOKS_EH_RUNTIME_TYPE
#define LANG_HOOKS_EH_RUNTIME_TYPE build_eh_type_type
/* Each front end provides its own lang hook initializer. */
struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
@ -145,14 +139,4 @@ objcxx_init_ts (void)
init_shadowed_var_for_decl ();
}
static GTY(()) tree objcp_eh_personality_decl;
static tree
objcxx_eh_personality (void)
{
if (!objcp_eh_personality_decl)
objcp_eh_personality_decl = build_personality_function ("gxx");
return objcp_eh_personality_decl;
}
#include "gtype-objcp.h"

View File

@ -1,3 +1,55 @@
2011-02-17 Iain Sandoe <iains@gcc.gnu.org>
* objc.dg/special/unclaimed-category-1.h: Updated for
new ABI support.
* objc.dg/special/unclaimed-category-1.m: Same.
* objc.dg/zero-link-1.m: Same.
* objc.dg/lookup-1.m: Same.
* objc.dg/torture/strings/const-str-9.m
* objc.dg/torture/strings/const-str-10.m: Same.
* objc.dg/torture/strings/const-str-11.m: Same.
* objc.dg/torture/forward-1.m: Same.
* objc.dg/zero-link-2.m: Same.
* objc.dg/encode-7-next-64bit.m: Same.
* objc.dg/method-4.m: Same.
* objc.dg/next-runtime-1.m: Same.
* objc.dg/image-info.m: Same.
* objc.dg/pr23214.m: Same.
* objc.dg/symtab-1.m: Same.
* obj-c++.dg/basic.m: Same.m
* obj-c++.dg/proto-lossage-3.m: Same.m
* obj-c++.dg/torture/strings/const-str-10.m: Same.m
* obj-c++.dg/torture/strings/const-str-11.m: Same.m
* obj-c++.dg/torture/strings/const-str-9.m: Same.m
* obj-c++.dg/method-11.m: Same.m
* objc/execute/enumeration-1.m: Same.
* objc/execute/object_is_class.m: Same.
* objc/execute/formal_protocol-2.m: Same.
* objc/execute/formal_protocol-4.m: Same.
* objc/execute/formal_protocol-6.m: Same.
* objc/execute/bycopy-3.m: Same.
* objc/execute/exceptions/catchall-1.m: Same.
* objc/execute/exceptions/finally-1.m: Same.
* objc/execute/exceptions/local-variables-1.m: Same.
* objc/execute/exceptions/foward-1.m: Same.
* objc/execute/bf-common.h
* objc/execute/enumeration-2.m: Same.
* objc/execute/formal_protocol-1.m: Same.
* objc/execute/formal_protocol-3.m: Same.
* objc/execute/formal_protocol-5.m: Same.
* objc/execute/accessing_ivars.m: Same.
* objc/execute/bycopy-2.m: Same.
* objc/execute/formal_protocol-7.m: Same.
* objc/execute/compatibility_alias.m: Same.
* objc/execute/no_clash.m: Same.
* objc/execute/object_is_meta_class.m: Same.
* objc/execute/exceptions/exceptions.exp: Load target-supports.exp
* objc/execute/class-tests-1.h: Include stdio.h.
* objc/execute/class-tests-2.h: Same.
* obj-c++.dg/try-catch-9.mm: xfail-run the test with both
runtimes.
* obj-c++.dg/try-catch-2.mm: Same.
2011-02-17 Jakub Jelinek <jakub@redhat.com>
PR c++/47783

View File

@ -1,22 +1,41 @@
// A basic sanity check for Objective-C++.
// { dg-do run }
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#include "../objc-obj-c++-shared/Object1.h"
//#include "../objc-obj-c++-shared/Object1.h"
#include <iostream>
#include <objc/Object.h>
#ifdef __OBJC2__
@interface Object (ADDITIONS)
+ initialize;
- init;
+ alloc;
+ new;
@end
@implementation Object (ADDITIONS)
+ initialize { return self; }
- init { return self; }
+ alloc { return class_createInstance (self, 0); }
+ new { return [[self alloc] init]; }
@end
#endif
@interface Greeter : Object
- (void) greet: (const char *)msg;
@end
@implementation Greeter
- (void) greet: (const char *)msg { std::cout << msg; }
- (void) greet: (const char *)msg
{ std::cout << msg << __VERSION__ << std::endl;}
@end
int
main ()
{
std::cout << "Hello from C++\n";
std::cout << "Hello from C++" << __VERSION__ << std::endl;
Greeter *obj = [Greeter new];
[obj greet: "Hello from Objective-C\n"];
[obj greet: "Hello from Objective-C++"];
}
#include "../objc-obj-c++-shared/Object1-implementation.h"
//#include "../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -22,5 +22,8 @@ void foo(void) {
obj = [ObjectAlias2 new];
}
/* { dg-final { scan-assembler "_OBJC_CLASS_REFERENCES_0" } } */
/* { dg-final { scan-assembler-not "_OBJC_CLASS_REFERENCES_1" } } */
/* { dg-final { scan-assembler "_OBJC_ClassRefs_0" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler "_OBJC_ClassRef_Object" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler-not "_OBJC_ClassRefs_1" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler-not "_OBJC_ClassRef_ObjectTypedef" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler-not "_OBJC_ClassRef_ObjectAlias" { target { *-*-darwin* && { lp64 } } } } } */

View File

@ -19,9 +19,16 @@
int
main()
{
#ifdef __OBJC2__
protocol_getMethodDescription(@protocol(NoInstanceMethods), @selector(name), NO, YES);
protocol_getMethodDescription(@protocol(NoInstanceMethods), @selector(name), NO, NO);
protocol_getMethodDescription(@protocol(NoClassMethods), @selector(name), NO, YES);
protocol_getMethodDescription(@protocol(NoClassMethods), @selector(name), NO, NO);
#else
[@protocol(NoInstanceMethods) descriptionForInstanceMethod: @selector(name)];
[@protocol(NoInstanceMethods) descriptionForClassMethod: @selector(name)];
[@protocol(NoClassMethods) descriptionForInstanceMethod: @selector(name)];
[@protocol(NoClassMethods) descriptionForClassMethod: @selector(name)];
#endif
return 0;
}

View File

@ -29,6 +29,7 @@ extern struct objc_class _NSConstantStringClassReference;
const NSConstantString *appKey = @"MyApp";
/* { dg-final { scan-assembler ".section __OBJC, __cstring_object" } } */
/* { dg-final { scan-assembler ".section __OBJC, __cstring_object" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler ".section __DATA, __objc_stringobj" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler ".long\t__NSConstantStringClassReference\n\t.long\t.*\n\t.long\t5\n\t.data" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler ".quad\t__NSConstantStringClassReference\n\t.quad\t.*\n\t.long\t5\n\t.space 4\n\t.data" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler ".quad\t_OBJC_CLASS_._NSConstantString\n\t.quad\t.*\n\t.long\t5\n\t.space" { target { *-*-darwin* && { lp64 } } } } } */

View File

@ -29,6 +29,7 @@ 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" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler ".quad\t__XStrClassReference\n\t.quad\t.*\n\t.long\t5\n\t.space 4\n\t.data" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler ".section __OBJC, __cstring_object" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler ".section __DATA, __objc_stringobj" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler ".long\t__XStrClassReference\n\t.long\t.*\n\t.long\t5\n\t.data" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler ".quad\t_OBJC_CLASS_._XStr\n\t.quad\t.*\n\t.long\t5\n\t.space" { target { *-*-darwin* && { lp64 } } } } } */

View File

@ -21,6 +21,7 @@ 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" { target { *-*-darwin* && { ! lp64 } } }} } */
/* { dg-final { scan-assembler ".quad\t__NSConstantStringClassReference\n\t.quad\t.*\n\t.long\t5\n\t.space 4\n\t.data" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler ".section __OBJC, __cstring_object" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler ".section __DATA, __objc_stringobj" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler ".long\t__NSConstantStringClassReference\n\t.long\t.*\n\t.long\t5\n\t.data" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler ".quad\t_OBJC_CLASS_._NSConstantString\n\t.quad\t.*\n\t.long\t5\n\t.space" { target { *-*-darwin* && { lp64 } } } } } */

View File

@ -3,7 +3,7 @@
/* Developed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-do run } */
/* { dg-xfail-if "PR23616" { *-*-* } { "-fgnu-runtime" } { "-fnext-runtime" } } */
/* { dg-xfail-run-if "PR23616" { *-*-* } { "-fgnu-runtime" } { "-fnext-runtime" } } */
/* { dg-xfail-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" "-fgnu-runtime" } { "" } }
/* { dg-options "-fobjc-exceptions" } */

View File

@ -3,7 +3,7 @@
/* Developed by Ziemowit Laski <zlaski@apple.com>. */
/* { dg-do run } */
/* { dg-xfail-if "PR23616" { *-*-* } { "-fgnu-runtime" } { "-fnext-runtime" } } */
/* { dg-xfail-run-if "PR23616" { *-*-* } { "-fgnu-runtime" } { "-fnext-runtime" } } */
/* { dg-xfail-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" "-fgnu-runtime" } { "" } }
/* { dg-prune-output ".*internal compiler error.*" } */
/* { dg-options "-fobjc-exceptions -O2" } */

View File

@ -2,16 +2,15 @@
/* { dg-do run { target *-*-darwin* } } */
/* { dg-require-effective-target lp64 } */
/* { dg-options "-Wno-deprecated-declarations" } */
/* { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* { dg-additional-sources "../objc-obj-c++-shared/Object1.m" } */
#include "../objc-obj-c++-shared/Object1.h"
#include "../objc-obj-c++-shared/next-mapping.h"
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <objc/Object.h>
#include "../objc-obj-c++-shared/next-mapping.h"
#define CHECK_IF(E) if (!(E)) abort ()
@class NSDictionary, NSFont, NSError, _NSATSTypesetterGuts, NSString, NSMenu, NSArray;
@ -195,69 +194,70 @@ NSRange globalRange;
int main(void) {
Class fooClass = objc_getClass ("Foo");
Method meth;
struct objc_ivar_list *ivars;
struct objc_ivar *ivar;
Ivar *ivars;
unsigned int ivar_count;
Ivar ivar;
meth = class_getInstanceMethod (fooClass, @selector(_errorWithOSStatus:ref1:ref2:reading:));
CHECK_IF (!strcmp (meth->method_types, "@44@0:8q16r^{FSRef=[80C]}24r^{FSRef=[80C]}32c40"));
CHECK_IF (!strcmp (method_getTypeEncoding(meth), "@44@0:8q16r^{FSRef=[80C]}24r^{FSRef=[80C]}32c40"));
meth = class_getInstanceMethod (fooClass, @selector(_attributeRunForCharacterAtIndex:));
CHECK_IF (!strcmp (meth->method_types, "r^{?=@@QQ^Qffff{_NSRect={_NSPoint=ff}{_NSSize=ff}}q^qQ^Q@@@:::****{?=b1b1b1b1b1b27}}24@0:8Q16"));
CHECK_IF (!strcmp (method_getTypeEncoding (meth), "r^{?=@@QQ^Qffff{_NSRect={_NSPoint=ff}{_NSSize=ff}}q^qQ^Q@@@:::****{?=b1b1b1b1b1b27}}24@0:8Q16"));
meth = class_getInstanceMethod (fooClass, @selector(_getATSTypesetterGuts:));
CHECK_IF (!strcmp (meth->method_types, "r@24@0:8r:16"));
CHECK_IF (!strcmp (method_getTypeEncoding (meth), "r@24@0:8r:16"));
meth = class_getInstanceMethod (fooClass, @selector(resumeWithSuspensionID:and:));
CHECK_IF (!strcmp (meth->method_types, "v32@0:8^{__NSAppleEventManagerSuspension=}16r^Q24"));
CHECK_IF (!strcmp (method_getTypeEncoding (meth), "v32@0:8^{__NSAppleEventManagerSuspension=}16r^Q24"));
meth = class_getInstanceMethod (fooClass, @selector(anotherMeth:and:and:));
CHECK_IF (!strcmp (meth->method_types, "r@40@0:8r:16r@24r@32"));
CHECK_IF (!strcmp (method_getTypeEncoding (meth), "r@40@0:8r:16r@24r@32"));
meth = class_getInstanceMethod (fooClass, @selector(str1:str2:str3:str4:));
CHECK_IF (!strcmp (meth->method_types, "@48@0:8r*16*24*32r*40"));
CHECK_IF (!strcmp (method_getTypeEncoding (meth), "@48@0:8r*16*24*32r*40"));
meth = class_getInstanceMethod (fooClass, @selector(foo1:foo2:foo3:foo4:));
CHECK_IF (!strcmp (meth->method_types, "Vv48@0:8@16r@24@32r@40"));
CHECK_IF (!strcmp (method_getTypeEncoding (meth), "Vv48@0:8@16r@24@32r@40"));
meth = class_getInstanceMethod (fooClass, @selector(sel1:id1:));
CHECK_IF (!strcmp (meth->method_types, "rn*32@0:8r:16r@24"));
CHECK_IF (!strcmp (method_getTypeEncoding (meth), "rn*32@0:8r:16r@24"));
meth = class_getInstanceMethod (fooClass, @selector(obj1:obj2:obj3:));
CHECK_IF (!strcmp (meth->method_types, "N@40@0:8r@16@24^{Object=#}32"));
CHECK_IF (!strcmp (method_getTypeEncoding (meth), "N@40@0:8r@16@24^{Object=#}32"));
meth = class_getClassMethod (fooClass, @selector(_defaultScriptingComponent));
CHECK_IF (!strcmp (meth->method_types, "^{ComponentInstanceRecord=[1q]}16@0:8"));
CHECK_IF (!strcmp (method_getTypeEncoding (meth), "^{ComponentInstanceRecord=[1q]}16@0:8"));
meth = class_getInstanceMethod (fooClass, @selector(_formatCocoaErrorString:parameters:applicableFormatters:count:));
CHECK_IF (!strcmp (meth->method_types, "@44@0:8@16r*24^^{?}32i40"));
CHECK_IF (!strcmp (method_getTypeEncoding (meth), "@44@0:8@16r*24^^{?}32i40"));
meth = class_getInstanceMethod (fooClass, @selector(formatter_func:run:));
CHECK_IF (!strcmp (meth->method_types, "^{?=^?@I}32@0:8@16r^^{?}24"));
CHECK_IF (!strcmp (method_getTypeEncoding (meth), "^{?=^?@I}32@0:8@16r^^{?}24"));
meth = class_getInstanceMethod (fooClass, @selector(_forgetWord:inDictionary:));
CHECK_IF (!strcmp (meth->method_types, "c32@0:8nO@16nO@24"));
CHECK_IF (!strcmp (method_getTypeEncoding (meth), "c32@0:8nO@16nO@24"));
meth = class_getInstanceMethod (fooClass, @selector(_registerServicesMenu:withSendTypes:andReturnTypes:addToList:));
CHECK_IF (!strcmp (meth->method_types, "v44@0:8@16r^*24r^*32c40"));
CHECK_IF (!strcmp (method_getTypeEncoding (meth), "v44@0:8@16r^*24r^*32c40"));
meth = class_getClassMethod (fooClass, @selector(_proxySharePointer));
CHECK_IF (!strcmp (meth->method_types, "^^{__CFSet}16@0:8"));
CHECK_IF (!strcmp (method_getTypeEncoding (meth), "^^{__CFSet}16@0:8"));
meth = class_getInstanceMethod (fooClass, @selector(_checkGrammarInString:language:details:));
CHECK_IF (!strcmp (meth->method_types, "{_NSRange=II}40@0:8n@16nO@24oO^@32"));
CHECK_IF (!strcmp (method_getTypeEncoding (meth), "{_NSRange=II}40@0:8n@16nO@24oO^@32"));
meth = class_getInstanceMethod (fooClass, @selector(_resolvePositionalStakeGlyphsForLineFragment:lineFragmentRect:minPosition:maxPosition:maxLineFragmentWidth:breakHint:));
CHECK_IF (!strcmp (meth->method_types, "B60@0:8^{__CTLine=}16{_NSRect={_NSPoint=ff}{_NSSize=ff}}24f40f44f48^Q52"));
CHECK_IF (!strcmp (method_getTypeEncoding (meth), "B60@0:8^{__CTLine=}16{_NSRect={_NSPoint=ff}{_NSSize=ff}}24f40f44f48^Q52"));
meth = class_getClassMethod (fooClass, @selector(findVoiceByIdentifier:returningCreator:returningID:));
CHECK_IF (!strcmp (meth->method_types, "c40@0:8@16^I24^I32"));
CHECK_IF (!strcmp (method_getTypeEncoding (meth), "c40@0:8@16^I24^I32"));
ivars = fooClass->ivars;
CHECK_IF (ivars->ivar_count == 1);
ivars = class_copyIvarList (fooClass, &ivar_count);
CHECK_IF (ivar_count == 1);
ivar = ivars->ivar_list;
CHECK_IF (!strcmp (ivar->ivar_name, "r"));
CHECK_IF (!strcmp (ivar->ivar_type,
ivar = ivars[0];
CHECK_IF (!strcmp (ivar_getName(ivar), "r"));
CHECK_IF (!strcmp (ivar_getTypeEncoding(ivar),
"{?=\"_attributes\"@\"NSDictionary\"\"_font\"@\"NSFont\"\"_characterLength\""
"Q\"_nominalGlyphLocation\"Q\"p\"^Q\"_defaultLineHeight\"f\"_defaultBaselineOffset\""
"f\"_horizExpansion\"f\"_baselineDelta\"f\"_attachmentBBox\"{_NSRect=\"origin\""

View File

@ -7,13 +7,19 @@
/* { dg-skip-if "NeXT-only" { *-*-* } { "-fgnu-runtime" } { "" } } */
/* { dg-options "-freplace-objc-classes" } */
#include "../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
#include <objc/Object.h>
extern void abort(void);
#define CHECK_IF(expr) if(!(expr)) abort();
@interface Object (TEST_SUITE_C1)
- init;
@end
@implementation Object (TEST_SUITE_C1)
- init {return self;}
@end
@interface Base: Object {
@public
int a;
@ -33,4 +39,5 @@ extern void abort(void);
}
@end
/* { dg-final { scan-assembler "\t.section __OBJC, __image_info.*\n\t.align.*\nL_OBJC_IMAGE_INFO.*:\n\t.long\t0\n\t.long\t1" } } */
/* { dg-final { scan-assembler "\t.section __OBJC, __image_info.*\n\t.align.*\nL_OBJC_ImageInfo.*:\n\t.long\t0\n\t.long\t1" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler "\t.section __DATA, __objc_imageinfo.*\n\t.align.*\nL_OBJC_ImageInfo.*:\n\t.long\t0\n\t.long\t17" { target { *-*-darwin* && { lp64 } } } } } */

View File

@ -1,5 +1,6 @@
/* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* { dg-additional-sources "../objc-obj-c++-shared/Object1.m" } */
#include <stdlib.h>
#include "../objc-obj-c++-shared/Object1.h"
@ -53,5 +54,3 @@ int main(void) {
return 0;
}
#include "../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -22,5 +22,5 @@ void foo(void) {
obj = [ObjectAlias2 new];
}
/* { dg-final { scan-assembler "_OBJC_CLASS_REFERENCES_0" } } */
/* { dg-final { scan-assembler-not "_OBJC_CLASS_REFERENCES_1" } } */
/* { dg-final { scan-assembler "_OBJC_ClassRefs_0" } } */
/* { dg-final { scan-assembler-not "_OBJC_ClassRefs_1" } } */

View File

@ -1,13 +1,14 @@
/* Test that the correct version number (6) is set in the module descriptor
when compiling for the NeXT runtime. */
/* Author: Ziemowit Laski <zlaski@apple.com> */
when compiling for the NeXT runtime ABI=0 - and that the MODULE descriptor
is not emitted at all for ABI 2. */
/* modified from a testcase added by: Ziemowit Laski <zlaski@apple.com> */
/* { dg-do compile { target *-*-darwin* } } */
/* { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } } */
/* { dg-skip-if "" { *-*-* } { "-fobjc-abi-version=1" } { "" } } */
/* { dg-options "-fobjc-abi-version=0" { target { *-*-darwin* && { ! lp64 } } } } */
#include "../objc-obj-c++-shared/Object1.h"
@interface FooBar: Object
@interface FooBar
- (void)boo;
@end
@ -15,5 +16,5 @@
- (void)boo { }
@end
/* { dg-final { scan-assembler "L_OBJC_MODULES:\n\[ \t\]*\.long\t6\n" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler "L_OBJC_MODULES:\n\[ \t\]*\.quad\t6\n" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler "L_OBJC_Module:\n\[ \t\]*\.long\t6\n" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler-not "L_OBJC_Module" { target { *-*-darwin* && { lp64 } } } } } */

View File

@ -3,10 +3,19 @@
/* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* { dg-additional-sources "../objc-obj-c++-shared/Object1.m" } */
#import "../objc-obj-c++-shared/Object1.h"
#import "../objc-obj-c++-shared/Protocol1.h"
#include <objc/Protocol.h>
#ifdef __OBJC2__
/* The ObjC V2 "Object" does not provide -class. */
@interface Object (TS_CAT)
- class;
@end
@implementation Object (TS_CAT)
- class { return isa; }
@end
#endif
@protocol A
@end

View File

@ -5,7 +5,11 @@
@interface TestClass
{
#ifdef __OBJC2__
Class isa;
#else
id isa;
#endif
}
- (int)D;
@end

View File

@ -2,11 +2,11 @@
/* { dg-do run } */
/* { dg-xfail-run-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
#import "../../objc-obj-c++-shared/next-mapping.h"
#include <objc/objc.h>
#ifndef __NEXT_RUNTIME__
#include <objc/objc-api.h>
#endif
#include "../../objc-obj-c++-shared/next-mapping.h"
extern void abort (void);
@ -73,5 +73,3 @@ int main (void)
return 0;
}
#import "../../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -4,7 +4,7 @@
/* { dg-do compile { target { *-*-darwin* } } } */
/* { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } } */
#include "../objc-obj-c++-shared/Object1.h"
#include <objc/Object.h>
@interface Base: Object
- (void)setValues;
@ -22,7 +22,6 @@
-(void)checkValues { }
@end
/* { dg-final { scan-assembler "L_OBJC_SYMBOLS.*:\n\t.long\t0\n\t.long\t0\n\t.word\t2\n\t.word\t0\n\t.long\tL_OBJC_CLASS_Derived.*\n\t.long\tL_OBJC_CLASS_Base.*\n" { target { *86*-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler "L_OBJC_SYMBOLS.*:\n\t.long\t0\n\t.long\t0\n\t.short\t2\n\t.short\t0\n\t.long\tL_OBJC_CLASS_Derived.*\n\t.long\tL_OBJC_CLASS_Base.*\n" { target { powerpc*-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler "L_OBJC_SYMBOLS.*:\n\t.quad\t0\n\t.quad\t0\n\t.word\t2\n\t.word\t0\n\t.space 4\n\t.quad\tL_OBJC_CLASS_Derived.*\n\t.quad\tL_OBJC_CLASS_Base.*\n" { target { *86*-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler "L_OBJC_SYMBOLS.*:\n\t.quad\t0\n\t.quad\t0\n\t.short\t2\n\t.short\t0\n\t.space 4\n\t.quad\tL_OBJC_CLASS_Derived.*\n\t.quad\tL_OBJC_CLASS_Base.*\n" { target { powerpc*-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler "L_OBJC_Symbols.*:\n\t.long\t0\n\t.long\t0\n\t.word\t2\n\t.word\t0\n\t.long\tL_OBJC_Class_Derived.*\n\t.long\tL_OBJC_Class_Base.*\n" { target { *86*-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler "L_OBJC_Symbols.*:\n\t.long\t0\n\t.long\t0\n\t.short\t2\n\t.short\t0\n\t.long\tL_OBJC_Class_Derived.*\n\t.long\tL_OBJC_Class_Base.*\n" { target { powerpc*-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler-not "L_OBJC_Symbols" { target { *-*-darwin* && { lp64 } } } } } */

View File

@ -1,14 +1,18 @@
/* { dg-do run } */
/* See if -forward::/-performv:: is able to work. */
/* { dg-xfail-run-if "PR36610" { ! { { i?86-*-* x86_64-*-* } && ilp32 } } { "-fgnu-runtime" } { "" } } */
/* { dg-skip-if "Needs OBJC2 ABI" { *-*-darwin* && { lp64 && { ! objc2 } } } { "-fnext-runtime" } { "" } } */
/* { dg-skip-if "Needs OBJC2 Implementation" { *-*-darwin* && { lp64 } } { "-fnext-runtime" } { "" } } */
/* There is no implementation of forward: in the NeXT m64 libobjc/Object
neither have we implemented this in our extensions - so we have to skip it
for now. */
#include <stdio.h>
#include <stdlib.h>
#import "../../objc-obj-c++-shared/Object1.h"
#import "../../objc-obj-c++-shared/next-mapping.h"
#include <objc/objc-api.h>
#ifndef __NEXT_RUNTIME__
# include <objc/objc-api.h>
#endif
#include <objc/Object.h>
#define VALUETOUSE 1234567890

View File

@ -29,6 +29,7 @@ extern Class _NSConstantStringClassReference;
const NSConstantString *appKey = @"MyApp";
/* { dg-final { scan-assembler ".section __OBJC, __cstring_object" } } */
/* { dg-final { scan-assembler ".section __OBJC, __cstring_object" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler ".section __DATA, __objc_stringobj" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler ".long\t__NSConstantStringClassReference\n\t.long\t.*\n\t.long\t5\n\t.data" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler ".quad\t__NSConstantStringClassReference\n\t.quad\t.*\n\t.long\t5\n\t.space" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler ".quad\t_OBJC_CLASS_._NSConstantString\n\t.quad\t.*\n\t.long\t5\n\t.space" { target { *-*-darwin* && { lp64 } } } } } */

View File

@ -29,6 +29,7 @@ extern Class _XStrClassReference;
const XStr *appKey = @"MyApp";
/* { dg-final { scan-assembler ".section __OBJC, __cstring_object" } } */
/* { dg-final { scan-assembler ".section __OBJC, __cstring_object" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler ".section __DATA, __objc_stringobj" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler ".long\t__XStrClassReference\n\t.long\t.*\n\t.long\t5\n\t.data" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler ".quad\t__XStrClassReference\n\t.quad\t.*\n\t.long\t5\n\t.space" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler ".quad\t_OBJC_CLASS_._XStr\n\t.quad\t.*\n\t.long\t5\n\t.space" { target { *-*-darwin* && { lp64 } } } } } */

View File

@ -21,6 +21,7 @@ Class _NSConstantStringClassReference;
const NSConstantString *appKey = @"MyApp";
/* { dg-final { scan-assembler ".section __OBJC, __cstring_object" } } */
/* { dg-final { scan-assembler ".section __OBJC, __cstring_object" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler ".section __DATA, __objc_stringobj" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler ".long\t__NSConstantStringClassReference\n\t.long\t.*\n\t.long\t5\n\t.data" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler ".quad\t__NSConstantStringClassReference\n\t.quad\t.*\n\t.long\t5\n\t.space" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler ".quad\t_OBJC_CLASS_._NSConstantString\n\t.quad\t.*\n\t.long\t5\n\t.space" { target { *-*-darwin* && { lp64 } } } } } */

View File

@ -25,6 +25,7 @@ int main(void) {
return 0;
}
/* { dg-final { scan-assembler-not "_OBJC_CLASS_REFERENCES_0" } } */
/* { dg-final { scan-assembler-not "_OBJC_ClassRefs_0" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler-not "_OBJC_ClassRef_Base" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler "objc_getClass" } } */

View File

@ -5,8 +5,7 @@
/* { dg-skip-if "" { *-*-* } { "-fgnu-runtime" } { "" } } */
/* { dg-options "-fno-zero-link" } */
#include "../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
#include <objc/Object.h>
extern void abort(void);
#define CHECK_IF(expr) if(!(expr)) abort();
@ -25,5 +24,6 @@ int main(void) {
return 0;
}
/* { dg-final { scan-assembler "_OBJC_CLASS_REFERENCES_0" } } */
/* { dg-final { scan-assembler "_OBJC_ClassRefs_0" { target { *-*-darwin* && { ! lp64 } } } } } */
/* { dg-final { scan-assembler "_OBJC_ClassRef_Base" { target { *-*-darwin* && { lp64 } } } } } */
/* { dg-final { scan-assembler-not "objc_getClass" } } */

View File

@ -1,7 +1,9 @@
/* Contributed by Nicola Pero - Thu Mar 8 16:27:46 CET 2001 */
#include <stdlib.h>
#import "../../objc-obj-c++-shared/Object1.h"
#ifndef __NEXT_RUNTIME__
#include <objc/objc-api.h>
#endif
#include "../../objc-obj-c++-shared/Object1.h"
/* Test that by using -> we can access ivars of other objects of the same
class */
@ -53,3 +55,4 @@ int main (void)
return 0;
}
#include "../../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -11,6 +11,7 @@
#define objc_get_class(C) objc_getClass(C)
#endif
#ifndef __OBJC2__
void print_ivars (Class class)
{
struct objc_ivar_list* ivars = class->ivars;
@ -61,9 +62,11 @@ void compare_structures (Class class, const char* type)
printf ("%d ivars checked\n", i);
}
#endif
int main ()
{
#ifndef __OBJC2__
struct class_vars
{
@defs (MyObject);
@ -80,8 +83,10 @@ int main ()
printf ("sizes don't match (computed %d, exact %d)\n", size1, size2);
abort ();
}
#endif
exit (0);
}
#ifndef __OBJC2__
#include "../../objc-obj-c++-shared/objc-test-suite-next-encode-assist-impl.h"
#endif

View File

@ -27,5 +27,4 @@ int main (void)
exit (0);
}
#include "../../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -24,6 +24,12 @@ extern int printf (const char *, ...);
/* This no-op class to keep it compile under broken gcc 3.x */
@interface MyObject : Object <MyProtocol>
#ifdef __OBJC2__
+ (id) initialize;
+ (id) alloc;
+ new;
- init;
#endif
@end
@implementation MyObject
@ -31,6 +37,12 @@ extern int printf (const char *, ...);
{
return [MyObject alloc];
}
#ifdef __OBJC2__
+ initialize {return self;}
+ alloc { return class_createInstance (self, 0);}
+ new { return [[self alloc] init]; }
- init {return self;}
#endif
@end
/* The following header, together with the implementation included below,

View File

@ -1,5 +1,6 @@
/* Contributed by Nicola Pero on Tue Mar 6 23:05:53 CET 2001 */
#include <stdio.h>
#include <stdlib.h>
#include "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>

View File

@ -1,6 +1,7 @@
/* Contributed by Nicola Pero on Tue Mar 6 23:05:53 CET 2001 */
#include <objc/objc.h>
#include <objc/objc-api.h>
#include <stdio.h>
#include <stdlib.h>
/*

View File

@ -10,3 +10,4 @@ int main (void)
return 0;
}
#include "../../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -48,3 +48,4 @@ int main (void)
return 0;
}
#include "../../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -50,3 +50,4 @@ int main (void)
return 0;
}
#include "../../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -74,3 +74,4 @@ int main (void) {
test((Object *)-1);
return 0;
}
#import "../../../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -28,6 +28,7 @@ lappend additional_flags "-fobjc-exceptions"
# load support procs
load_lib objc-torture.exp
load_lib torture-options.exp
load_lib target-supports.exp
torture-init
objc-set-runtime-options "execute" "additional_flags=-fobjc-exceptions"

View File

@ -1,6 +1,22 @@
#include <stdio.h>
#include <stdlib.h>
//#import "../../../objc-obj-c++-shared/Object1.h"
#ifdef __OBJC2__
#include <objc/runtime.h>
@interface Object
+ initialize;
+ new;
- free;
@end
@implementation Object
+ initialize { return self; }
+ new { return class_createInstance (self, 0); }
- free { return object_dispose(self);}
@end
#else
#import "../../../objc-obj-c++-shared/Object1.h"
#endif
static int made_try = 0;
@ -57,3 +73,4 @@ main(int ac, char *av[])
abort ();
return 0;
}
//#import "../../../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -2,12 +2,33 @@
/* Developed by Marcin Koziej <creep@desk.pl>. */
#include <stdlib.h>
#import "../../../objc-obj-c++-shared/Object1.h"
#include <objc/Object.h>
#ifndef __NEXT_RUNTIME__
#import <objc/objc-api.h>
#endif
#ifdef __OBJC2__
@interface Object (TEST_SUITE_ADDITIONS)
+ initialize;
+ alloc;
+ new;
- init;
- free;
@end
@implementation Object (TEST_SUITE_ADDITIONS)
+ initialize { return self; }
+ alloc { return class_createInstance (self, 0); }
+ new { return [[self alloc] init]; }
- init { return self; }
- free { return object_dispose(self); }
@end
#endif
static int i;
@interface Thrower : Object
__attribute__((objc_exception))
@interface Thrower : Object
- forward: (SEL) s : (void*) a;
@end
@ -16,8 +37,10 @@ static int i;
{
i++;
@throw [Object new];
return nil;
}
@end
int
main()
{

View File

@ -60,3 +60,4 @@ int main(void) {
foo(15, &gf1);
return 0;
}
#import "../../../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -42,4 +42,4 @@ int main (void)
return 0;
}
#include "../../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -43,4 +43,4 @@ int main (void)
return 0;
}
#include "../../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -56,4 +56,4 @@ int main (void)
return 0;
}
#include "../../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -38,4 +38,4 @@ int main (void)
return 0;
}
#include "../../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -1,7 +1,8 @@
/* Contributed by Nicola Pero - Fri Mar 9 21:35:47 CET 2001 */
#include <stdlib.h>
#include "../../objc-obj-c++-shared/Protocol1.h"
#include <objc/Protocol.h>
#include "../../objc-obj-c++-shared/next-mapping.h"
/* Test defining a protocol, and accessing it using @protocol */
@ -35,4 +36,3 @@ int main (void)
return 0;
}

View File

@ -1,7 +1,8 @@
/* Contributed by Nicola Pero - Fri Mar 9 21:35:47 CET 2001 */
#include <stdlib.h>
#include "../../objc-obj-c++-shared/Protocol1.h"
#include <objc/Protocol.h>
#include "../../objc-obj-c++-shared/next-mapping.h"
/* Test defining a protocol, and accessing it using @protocol */

View File

@ -41,4 +41,4 @@ int main (void)
return 0;
}
#include "../../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -39,3 +39,4 @@ int main (void)
return 0;
}
#include "../../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -1,8 +1,10 @@
/* Contributed by Nicola Pero - Tue Jul 3 10:55:21 BST 2001 */
#import "../../objc-obj-c++-shared/next-mapping.h"
#import "../../objc-obj-c++-shared/Object1.h"
#include <objc/objc.h>
#include <objc/objc-api.h>
#ifdef __NEXT_RUNTIME__
# include "../../objc-obj-c++-shared/next-mapping.h"
#else
# include <objc/objc-api.h>
#endif
#include "../../objc-obj-c++-shared/Object1.h"
/* This test demonstrate a failure in object_is_class which was fixed */
@ -41,3 +43,4 @@ int main (void)
return 0;
}
#include "../../objc-obj-c++-shared/Object1-implementation.h"

View File

@ -1,7 +1,10 @@
/* Contributed by Nicola Pero - Tue Jul 3 10:55:21 BST 2001 */
#import "../../objc-obj-c++-shared/Object1.h"
#import "../../objc-obj-c++-shared/next-mapping.h"
#include <objc/objc-api.h>
#ifdef __NEXT_RUNTIME__
# include "../../objc-obj-c++-shared/next-mapping.h"
#else
# include <objc/objc-api.h>
#endif
#include "../../objc-obj-c++-shared/Object1.h"
/* This test demonstrate a failure in object_is_meta_class which was fixed */
@ -38,4 +41,4 @@ int main (void)
return 0;
}
#include "../../objc-obj-c++-shared/Object1-implementation.h"