summaryrefslogtreecommitdiff
path: root/gcc/config/darwin.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/darwin.c')
-rw-r--r--gcc/config/darwin.c130
1 files changed, 129 insertions, 1 deletions
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
index f5e9db0e315..8a3a2da8e11 100644
--- a/gcc/config/darwin.c
+++ b/gcc/config/darwin.c
@@ -1,5 +1,5 @@
/* Functions for generic Darwin as target machine for GNU C compiler.
- Copyright (C) 1989, 1990, 1991, 1992, 1993, 2000, 2001
+ Copyright (C) 1989, 1990, 1991, 1992, 1993, 2000, 2001, 2002
Free Software Foundation, Inc.
Contributed by Apple Computer Inc.
@@ -1110,6 +1110,134 @@ update_stubs (name)
}
void
+machopic_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));
+
+ if (TREE_CODE (size) == INTEGER_CST &&
+ TREE_INT_CST_LOW (size) == 4 &&
+ TREE_INT_CST_HIGH (size) == 0)
+ literal4_section ();
+ else if (TREE_CODE (size) == INTEGER_CST &&
+ TREE_INT_CST_LOW (size) == 8 &&
+ TREE_INT_CST_HIGH (size) == 0)
+ 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 name = TYPE_NAME (TREE_TYPE (exp));
+ if (TREE_CODE (name) == TYPE_DECL)
+ name = DECL_NAME (name);
+ if (!strcmp (IDENTIFIER_POINTER (name), "NSConstantString"))
+ objc_constant_string_object_section ();
+ else if (!strcmp (IDENTIFIER_POINTER (name), "NXConstantString"))
+ objc_string_object_section ();
+ else if (TREE_READONLY (exp) || TREE_CONSTANT (exp))
+ {
+ if (TREE_SIDE_EFFECTS (exp) || flag_pic && reloc)
+ const_data_section ();
+ else
+ 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_SELECTOR_FIXUP", 20))
+ objc_selector_fixup_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))
+ {
+ if (flag_pic && reloc)
+ const_data_section ();
+ else
+ readonly_data_section ();
+ }
+ else
+ data_section ();
+ }
+ else if (TREE_READONLY (exp) || TREE_CONSTANT (exp))
+ {
+ if (TREE_SIDE_EFFECTS (exp) || flag_pic && reloc)
+ const_data_section ();
+ else
+ readonly_data_section ();
+ }
+ else
+ data_section ();
+}
+
+void
machopic_asm_out_constructor (symbol, priority)
rtx symbol;
int priority ATTRIBUTE_UNUSED;