diff options
Diffstat (limited to 'gcc/config/nextstep.c')
-rw-r--r-- | gcc/config/nextstep.c | 122 |
1 files changed, 121 insertions, 1 deletions
diff --git a/gcc/config/nextstep.c b/gcc/config/nextstep.c index 228c566..a701776 100644 --- a/gcc/config/nextstep.c +++ b/gcc/config/nextstep.c @@ -1,6 +1,6 @@ /* Functions for generic NeXT as target machine for GNU C compiler. Copyright (C) 1989, 1990, 1991, 1992, 1993, 1996, 1997, 1998, - 2000 Free Software Foundation, Inc. + 2000, 2002 Free Software Foundation, Inc. This file is part of GNU CC. @@ -115,3 +115,123 @@ nextstep_asm_out_destructor (symbol, priority) fprintf (asm_out_file, ".reference .destructors_used\n"); } +void +nextstep_select_section (exp, reloc, align) + tree exp; + int reloc; + unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED; +{ + if (TREE_CODE (exp) == STRING_CST) + { + if (flag_writable_strings) + data_section (); + else if (TREE_STRING_LENGTH (exp) + != strlen (TREE_STRING_POINTER (exp)) + 1) + readonly_data_section (); + else + cstring_section (); + } + else if (TREE_CODE (exp) == INTEGER_CST + || TREE_CODE (exp) == REAL_CST) + { + tree size = TYPE_SIZE (TREE_TYPE (exp)); + HOST_WIDE_INT size_int; + + if (TREE_CODE (size) == INTEGER_CST) + size_int = tree_low_cst (size, 1); + else + size_int = 0; + + if (size_int == 4) + literal4_section (); + else if (size_int == 8) + literal8_section (); + else + readonly_data_section (); + } + else if (TREE_CODE (exp) == CONSTRUCTOR + && TREE_TYPE (exp) + && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE + && TYPE_NAME (TREE_TYPE (exp)) + && TREE_CODE (TYPE_NAME (TREE_TYPE (exp))) == IDENTIFIER_NODE + && IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (exp)))) + { + if (!strcmp (IDENTIFIER_POINTER (TYPE_NAME (TREE_TYPE (exp))), + "NXConstantString")) + objc_string_object_section (); + else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp)) + && !TREE_SIDE_EFFECTS (exp)) + readonly_data_section (); + else + data_section (); + } + else if (TREE_CODE (exp) == VAR_DECL + && DECL_NAME (exp) + && TREE_CODE (DECL_NAME (exp)) == IDENTIFIER_NODE + && IDENTIFIER_POINTER (DECL_NAME (exp)) + && !strncmp (IDENTIFIER_POINTER (DECL_NAME (exp)), "_OBJC_", 6)) + { + const char *name = IDENTIFIER_POINTER (DECL_NAME (exp)); + + if (!strncmp (name, "_OBJC_CLASS_METHODS_", 20)) + objc_cls_meth_section (); + else if (!strncmp (name, "_OBJC_INSTANCE_METHODS_", 23)) + objc_inst_meth_section (); + else if (!strncmp (name, "_OBJC_CATEGORY_CLASS_METHODS_", 20)) + objc_cat_cls_meth_section (); + else if (!strncmp (name, "_OBJC_CATEGORY_INSTANCE_METHODS_", 23)) + objc_cat_inst_meth_section (); + else if (!strncmp (name, "_OBJC_CLASS_VARIABLES_", 22)) + objc_class_vars_section (); + else if (!strncmp (name, "_OBJC_INSTANCE_VARIABLES_", 25)) + objc_instance_vars_section (); + else if (!strncmp (name, "_OBJC_CLASS_PROTOCOLS_", 22)) + objc_cat_cls_meth_section (); + else if (!strncmp (name, "_OBJC_CLASS_NAME_", 17)) + objc_class_names_section (); + else if (!strncmp (name, "_OBJC_METH_VAR_NAME_", 20)) + objc_meth_var_names_section (); + else if (!strncmp (name, "_OBJC_METH_VAR_TYPE_", 20)) + objc_meth_var_types_section (); + else if (!strncmp (name, "_OBJC_CLASS_REFERENCES", 22)) + objc_cls_refs_section (); + else if (!strncmp (name, "_OBJC_CLASS_", 12)) + objc_class_section (); + else if (!strncmp (name, "_OBJC_METACLASS_", 16)) + objc_meta_class_section (); + else if (!strncmp (name, "_OBJC_CATEGORY_", 15)) + objc_category_section (); + else if (!strncmp (name, "_OBJC_SELECTOR_REFERENCES", 25)) + objc_selector_refs_section (); + else if (!strncmp (name, "_OBJC_SYMBOLS", 13)) + objc_symbols_section (); + else if (!strncmp (name, "_OBJC_MODULES", 13)) + objc_module_info_section (); + else if (!strncmp (name, "_OBJC_PROTOCOL_INSTANCE_METHODS_", 32)) + objc_cat_inst_meth_section (); + else if (!strncmp (name, "_OBJC_PROTOCOL_CLASS_METHODS_", 29)) + objc_cat_cls_meth_section (); + else if (!strncmp (name, "_OBJC_PROTOCOL_REFS_", 20)) + objc_cat_cls_meth_section (); + else if (!strncmp (name, "_OBJC_PROTOCOL_", 15)) + objc_protocol_section (); + else if ((TREE_READONLY (exp) || TREE_CONSTANT (exp)) + && !TREE_SIDE_EFFECTS (exp)) + readonly_data_section (); + else + data_section (); + } + else if (TREE_CODE (exp) == VAR_DECL) + { + if ((flag_pic && reloc) + || !TREE_READONLY (exp) || TREE_SIDE_EFFECTS (exp) + || !DECL_INITIAL (exp) + || (DECL_INITIAL (exp) != error_mark_node + && !TREE_CONSTANT (DECL_INITIAL (exp)))) + data_section (); + else + readonly_data_section (); + } + else + readonly_data_section (); +} |