Added support for the 64-bit Apple Objective-C runtime
From-SVN: r170260
This commit is contained in:
parent
0a8134cace
commit
d764a8e6bd
@ -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.
|
||||
|
@ -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. */
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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); \
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
||||
|
@ -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"
|
||||
|
5625
gcc/objc/objc-act.c
5625
gcc/objc/objc-act.c
File diff suppressed because it is too large
Load Diff
@ -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 */
|
||||
|
2265
gcc/objc/objc-gnu-runtime-abi-01.c
Normal file
2265
gcc/objc/objc-gnu-runtime-abi-01.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
|
||||
|
172
gcc/objc/objc-next-metadata-tags.h
Normal file
172
gcc/objc/objc-next-metadata-tags.h
Normal 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));
|
2969
gcc/objc/objc-next-runtime-abi-01.c
Normal file
2969
gcc/objc/objc-next-runtime-abi-01.c
Normal file
File diff suppressed because it is too large
Load Diff
3750
gcc/objc/objc-next-runtime-abi-02.c
Normal file
3750
gcc/objc/objc-next-runtime-abi-02.c
Normal file
File diff suppressed because it is too large
Load Diff
108
gcc/objc/objc-runtime-hooks.h
Normal file
108
gcc/objc/objc-runtime-hooks.h
Normal 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_ */
|
733
gcc/objc/objc-runtime-shared-support.c
Normal file
733
gcc/objc/objc-runtime-shared-support.c
Normal 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"
|
90
gcc/objc/objc-runtime-shared-support.h
Normal file
90
gcc/objc/objc-runtime-shared-support.h
Normal 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_ */
|
@ -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.
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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 "
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -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"
|
||||
|
@ -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 } } } } } */
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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 } } } } } */
|
||||
|
@ -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 } } } } } */
|
||||
|
@ -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 } } } } } */
|
||||
|
@ -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" } */
|
||||
|
||||
|
@ -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" } */
|
||||
|
@ -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\""
|
||||
|
@ -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 } } } } } */
|
||||
|
@ -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"
|
||||
|
@ -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" } } */
|
||||
|
@ -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 } } } } } */
|
||||
|
@ -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
|
||||
|
@ -5,7 +5,11 @@
|
||||
|
||||
@interface TestClass
|
||||
{
|
||||
#ifdef __OBJC2__
|
||||
Class isa;
|
||||
#else
|
||||
id isa;
|
||||
#endif
|
||||
}
|
||||
- (int)D;
|
||||
@end
|
||||
|
@ -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"
|
||||
|
@ -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 } } } } } */
|
||||
|
@ -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
|
||||
|
||||
|
@ -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 } } } } } */
|
||||
|
@ -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 } } } } } */
|
||||
|
@ -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 } } } } } */
|
||||
|
@ -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" } } */
|
||||
|
||||
|
@ -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" } } */
|
||||
|
@ -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"
|
||||
|
@ -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
|
||||
|
@ -27,5 +27,4 @@ int main (void)
|
||||
|
||||
exit (0);
|
||||
}
|
||||
|
||||
|
||||
#include "../../objc-obj-c++-shared/Object1-implementation.h"
|
||||
|
@ -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,
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
||||
/*
|
||||
|
@ -10,3 +10,4 @@ int main (void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#include "../../objc-obj-c++-shared/Object1-implementation.h"
|
||||
|
@ -48,3 +48,4 @@ int main (void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#include "../../objc-obj-c++-shared/Object1-implementation.h"
|
||||
|
@ -50,3 +50,4 @@ int main (void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#include "../../objc-obj-c++-shared/Object1-implementation.h"
|
||||
|
@ -74,3 +74,4 @@ int main (void) {
|
||||
test((Object *)-1);
|
||||
return 0;
|
||||
}
|
||||
#import "../../../objc-obj-c++-shared/Object1-implementation.h"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
@ -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()
|
||||
{
|
||||
|
@ -60,3 +60,4 @@ int main(void) {
|
||||
foo(15, &gf1);
|
||||
return 0;
|
||||
}
|
||||
#import "../../../objc-obj-c++-shared/Object1-implementation.h"
|
||||
|
@ -42,4 +42,4 @@ int main (void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include "../../objc-obj-c++-shared/Object1-implementation.h"
|
||||
|
@ -43,4 +43,4 @@ int main (void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include "../../objc-obj-c++-shared/Object1-implementation.h"
|
||||
|
@ -56,4 +56,4 @@ int main (void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include "../../objc-obj-c++-shared/Object1-implementation.h"
|
||||
|
@ -38,4 +38,4 @@ int main (void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include "../../objc-obj-c++-shared/Object1-implementation.h"
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -41,4 +41,4 @@ int main (void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#include "../../objc-obj-c++-shared/Object1-implementation.h"
|
||||
|
@ -39,3 +39,4 @@ int main (void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
#include "../../objc-obj-c++-shared/Object1-implementation.h"
|
||||
|
@ -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"
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user