aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/darwin.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/darwin.c')
-rw-r--r--gcc/config/darwin.c475
1 files changed, 451 insertions, 24 deletions
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
index 858d150d45e..cc213a49388 100644
--- a/gcc/config/darwin.c
+++ b/gcc/config/darwin.c
@@ -46,7 +46,57 @@ Boston, MA 02111-1307, USA. */
static int machopic_data_defined_p (const char *);
static void update_non_lazy_ptrs (const char *);
static void update_stubs (const char *);
-static const char *machopic_non_lazy_ptr_name (const char*);
+const char *machopic_non_lazy_ptr_name (const char*);
+
+/* APPLE LOCAL prototypes */
+static tree machopic_non_lazy_ptr_list_entry PARAMS ((const char*, int));
+static tree machopic_stub_list_entry PARAMS ((const char *));
+
+/* APPLE LOCAL begin coalescing */
+void
+make_decl_coalesced (decl, private_extern_p)
+ tree decl;
+ int private_extern_p; /* 0 for global, 1 for private extern */
+{
+ int no_toc_p = 1; /* Don't add to table of contents */
+#if 0
+ const char *decl_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
+#endif
+ static const char *const names[4] = {
+ "__TEXT,__textcoal,coalesced",
+ "__TEXT,__textcoal_nt,coalesced,no_toc",
+ "__DATA,__datacoal,coalesced",
+ "__DATA,__datacoal_nt,coalesced,no_toc",
+ };
+ const char *sec;
+ int idx;
+
+ /* Do nothing if coalescing is disabled. */
+ if (!COALESCING_ENABLED_P())
+ return;
+
+ /* We *do* need to mark these *INTERNAL* functions coalesced: though
+ these pseudo-functions themselves will never appear, their cloned
+ descendants need to be marked coalesced too. */
+#if 0
+ /* Don't touch anything with " *INTERNAL" in its name. */
+ if (strstr (decl_name, " *INTERNAL") != NULL)
+ return;
+#endif
+
+ DECL_COALESCED (decl) = 1;
+ if (private_extern_p)
+ DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
+ TREE_PUBLIC (decl) = 1;
+
+ idx = 0;
+ if (TREE_CODE (decl) != FUNCTION_DECL)
+ idx = 2;
+ sec = names[idx + (no_toc_p ? 1 : 0)];
+
+ DECL_SECTION_NAME (decl) = build_string (strlen (sec), sec);
+}
+/* APPLE LOCAL end coalescing */
int
name_needs_quotes (const char *name)
@@ -187,6 +237,14 @@ machopic_ident_defined_p (tree ident)
static int
machopic_data_defined_p (const char *name)
{
+ /* APPLE LOCAL BEGIN fix-and-continue mrs */
+#ifndef TARGET_INDIRECT_ALL_DATA
+#define TARGET_INDIRECT_ALL_DATA 0
+#endif
+ if (TARGET_INDIRECT_ALL_DATA)
+ return 0;
+ /* APPLE LOCAL END fix-and-continue mrs */
+
switch (machopic_classify_ident (get_identifier (name)))
{
case MACHOPIC_DEFINED_DATA:
@@ -264,18 +322,19 @@ static GTY(()) tree machopic_non_lazy_pointers;
either by finding it in our list of pointer names, or by generating
a new one. */
-static const char *
-machopic_non_lazy_ptr_name (const char *name)
+/* APPLE LOCAL weak import */
+/* machopic_non_lazy_ptr_list_entry separated from machopic_non_lazy_ptr_name */
+static tree
+machopic_non_lazy_ptr_list_entry (const char *name, int create_p)
{
- const char *temp_name;
- tree temp, ident = get_identifier (name);
-
+ tree temp, ident = (create_p) ? get_identifier (name) : NULL;
+
for (temp = machopic_non_lazy_pointers;
temp != NULL_TREE;
temp = TREE_CHAIN (temp))
{
if (ident == TREE_VALUE (temp))
- return IDENTIFIER_POINTER (TREE_PURPOSE (temp));
+ return temp;
}
name = darwin_strip_name_encoding (name);
@@ -287,14 +346,14 @@ machopic_non_lazy_ptr_name (const char *name)
{
if (TREE_VALUE (temp))
{
- temp_name = IDENTIFIER_POINTER (TREE_VALUE (temp));
+ const char *temp_name = IDENTIFIER_POINTER (TREE_VALUE (temp));
temp_name = darwin_strip_name_encoding (temp_name);
if (strcmp (name, temp_name) == 0)
- return IDENTIFIER_POINTER (TREE_PURPOSE (temp));
+ return temp;
}
}
- {
+ if (create_p) {
char *buffer;
int namelen = strlen (name);
int bufferlen = 0;
@@ -325,17 +384,41 @@ machopic_non_lazy_ptr_name (const char *name)
TREE_USED (machopic_non_lazy_pointers) = 0;
- return IDENTIFIER_POINTER (ptr_name);
+ return machopic_non_lazy_pointers;
}
+
+ return NULL;
}
+/* APPLE LOCAL begin coalescing */
+/* Was the variable NAME ever referenced? */
+int
+machopic_var_referred_to_p (name)
+ const char *name;
+{
+ return (machopic_non_lazy_ptr_list_entry (name, /*create:*/ 0) != NULL);
+}
+/* APPLE LOCAL end coalescing */
+
+/* APPLE LOCAL begin weak import */
+const char *
+machopic_non_lazy_ptr_name (name)
+ const char *name;
+{
+ return IDENTIFIER_POINTER (TREE_PURPOSE
+ (machopic_non_lazy_ptr_list_entry (name, /*create:*/ 1)));
+}
+/* APPLE LOCAL end weak import */
+
static GTY(()) tree machopic_stubs;
/* Return the name of the stub corresponding to the given name,
generating a new stub name if necessary. */
-const char *
-machopic_stub_name (const char *name)
+/* APPLE LOCAL begin weak import */
+/* machopic_stub_list_entry separated from machopic_stub_name */
+static tree
+machopic_stub_list_entry (const char *name)
{
tree temp, ident = get_identifier (name);
const char *tname;
@@ -345,16 +428,22 @@ machopic_stub_name (const char *name)
temp = TREE_CHAIN (temp))
{
if (ident == TREE_VALUE (temp))
- return IDENTIFIER_POINTER (TREE_PURPOSE (temp));
+ return temp;
tname = IDENTIFIER_POINTER (TREE_VALUE (temp));
if (strcmp (name, tname) == 0)
- return IDENTIFIER_POINTER (TREE_PURPOSE (temp));
+ return temp;
+
+ /* APPLE LOCAL Stripped encodings ('!T_' and '!t_') should match. */
+ if (name [0] == '!' && tname[0] == '!'
+ && strcmp (name + 4, tname + 4) == 0)
+ return temp;
+
/* A library call name might not be section-encoded yet, so try
it against a stripped name. */
if (name[0] != '!'
&& tname[0] == '!'
&& strcmp (name, tname + 4) == 0)
- return IDENTIFIER_POINTER (TREE_PURPOSE (temp));
+ return temp;
}
name = darwin_strip_name_encoding (name);
@@ -406,10 +495,18 @@ machopic_stub_name (const char *name)
machopic_stubs = tree_cons (ptr_name, ident, machopic_stubs);
TREE_USED (machopic_stubs) = 0;
- return IDENTIFIER_POINTER (ptr_name);
+ return machopic_stubs;
}
}
+const char *
+machopic_stub_name (name)
+ const char *name;
+{
+ return IDENTIFIER_POINTER (TREE_PURPOSE (machopic_stub_list_entry (name)));
+}
+/* APPLE LOCAL end weak import */
+
void
machopic_validate_stub_or_non_lazy_ptr (const char *name, int validate_stub)
{
@@ -448,6 +545,8 @@ machopic_indirect_data_reference (rtx orig, rtx reg)
if (GET_CODE (orig) == SYMBOL_REF)
{
const char *name = XSTR (orig, 0);
+ /* APPLE LOCAL weak import */
+ tree sym;
int defined = machopic_data_defined_p (name);
if (defined && MACHO_DYNAMIC_NO_PIC_P)
@@ -499,8 +598,14 @@ machopic_indirect_data_reference (rtx orig, rtx reg)
return orig;
}
+ /* APPLE LOCAL weak import */
+ sym = machopic_non_lazy_ptr_list_entry (name, /*create:*/ 1);
+ IDENTIFIER_WEAK_IMPORT (TREE_PURPOSE (sym)) =
+ IDENTIFIER_WEAK_IMPORT (TREE_VALUE (sym)) =
+ SYMBOL_REF_WEAK_IMPORT (orig);
+
ptr_ref = gen_rtx_SYMBOL_REF (Pmode,
- machopic_non_lazy_ptr_name (name));
+ IDENTIFIER_POINTER (TREE_PURPOSE (sym)));
ptr_ref = gen_rtx_MEM (Pmode, ptr_ref);
RTX_UNCHANGING_P (ptr_ref) = 1;
@@ -585,9 +690,14 @@ machopic_indirect_call_target (rtx target)
if (!machopic_name_defined_p (name))
{
- const char *stub_name = machopic_stub_name (name);
-
- XEXP (target, 0) = gen_rtx_SYMBOL_REF (mode, stub_name);
+ /* APPLE LOCAL weak import */
+ tree stub = machopic_stub_list_entry (name);
+ IDENTIFIER_WEAK_IMPORT (TREE_PURPOSE (stub)) =
+ IDENTIFIER_WEAK_IMPORT (TREE_VALUE (stub)) =
+ SYMBOL_REF_WEAK_IMPORT (XEXP (target, 0));
+
+ XEXP (target, 0) = gen_rtx_SYMBOL_REF (mode,
+ IDENTIFIER_POINTER (TREE_PURPOSE (stub)));
RTX_UNCHANGING_P (target) = 1;
}
}
@@ -855,6 +965,43 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
if (RTX_UNCHANGING_P (base) && RTX_UNCHANGING_P (orig))
RTX_UNCHANGING_P (pic_ref) = 1;
+ /* APPLE LOCAL begin gen ADD */
+#ifdef MASK_80387
+ {
+ rtx mem, other;
+
+ if (GET_CODE (orig) == MEM) {
+ mem = orig; other = base;
+ /* Swap the kids only if there is only one MEM, and it's on the right. */
+ if (GET_CODE (base) != MEM) {
+ XEXP (pic_ref, 0) = orig;
+ XEXP (pic_ref, 1) = base;
+ }
+ }
+ else if (GET_CODE (base) == MEM) {
+ mem = base; other = orig;
+ } else
+ mem = other = NULL_RTX;
+
+ /* Both kids are MEMs. */
+ if (other && GET_CODE (other) == MEM)
+ other = force_reg (GET_MODE (other), other);
+
+ /* The x86 can't post-index a MEM; emit an ADD instruction to handle this. */
+ if (mem && GET_CODE (mem) == MEM) {
+ if ( ! reload_in_progress) {
+ rtx set = gen_rtx_SET (VOIDmode, reg, pic_ref);
+ rtx clobber_cc = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (CCmode, FLAGS_REG));
+ pic_ref = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, set, clobber_cc));
+ emit_insn (pic_ref);
+ pic_ref = reg;
+ is_complex = 0;
+ }
+ }
+ }
+#endif
+ /* APPLE LOCAL end gen ADD */
+
if (reg && is_complex)
{
emit_move_insn (reg, pic_ref);
@@ -871,7 +1018,12 @@ machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
else if (GET_CODE (orig) == MEM
&& GET_CODE (XEXP (orig, 0)) == SYMBOL_REF)
{
- rtx addr = machopic_legitimize_pic_address (XEXP (orig, 0), Pmode, reg);
+ /* APPLE LOCAL use new pseudo for temp; reusing reg confuses PRE */
+ rtx tempreg = reg;
+ rtx addr;
+ if ( !no_new_pseudos )
+ tempreg = gen_reg_rtx (Pmode);
+ addr = machopic_legitimize_pic_address (XEXP (orig, 0), Pmode, tempreg);
addr = gen_rtx_MEM (GET_MODE (orig), addr);
RTX_UNCHANGING_P (addr) = RTX_UNCHANGING_P (orig);
@@ -916,6 +1068,14 @@ machopic_finish (FILE *asm_out_file)
else
stub[0] = '_', strcpy (stub + 1, stub_name);
+ /* APPLE LOCAL weak import */
+ if ( IDENTIFIER_WEAK_IMPORT (TREE_VALUE (temp)))
+ {
+ fprintf (asm_out_file, "\t.weak_reference ");
+ assemble_name (asm_out_file, sym_name);
+ fprintf (asm_out_file, "\n");
+ }
+
machopic_output_stub (asm_out_file, sym, stub);
}
@@ -929,7 +1089,11 @@ machopic_finish (FILE *asm_out_file)
if (! TREE_USED (temp))
continue;
- if (machopic_ident_defined_p (TREE_VALUE (temp)))
+ /* APPLE LOCAL fix-and-continue mrs */
+ if (! TARGET_INDIRECT_ALL_DATA
+ && (machopic_ident_defined_p (TREE_VALUE (temp))
+ /* APPLE LOCAL private extern */
+ || (sym_name[0] == '!' && sym_name[2] == 'p')))
{
data_section ();
assemble_align (GET_MODE_ALIGNMENT (Pmode));
@@ -940,6 +1104,17 @@ machopic_finish (FILE *asm_out_file)
}
else
{
+ /* APPLE LOCAL fix-and-continue mrs */
+ rtx init = const0_rtx;
+
+ /* APPLE LOCAL weak import */
+ if ( IDENTIFIER_WEAK_IMPORT (TREE_VALUE (temp)))
+ {
+ fprintf (asm_out_file, "\t.weak_reference ");
+ assemble_name (asm_out_file, sym_name);
+ fprintf (asm_out_file, "\n");
+ }
+
machopic_nl_symbol_ptr_section ();
assemble_name (asm_out_file, lazy_name);
fprintf (asm_out_file, ":\n");
@@ -948,8 +1123,14 @@ machopic_finish (FILE *asm_out_file)
assemble_name (asm_out_file, sym_name);
fprintf (asm_out_file, "\n");
- assemble_integer (const0_rtx, GET_MODE_SIZE (Pmode),
+ /* APPLE LOCAL BEGIN fix-and-continue mrs */
+ if (sym_name[3] == 's'
+ && machopic_ident_defined_p (TREE_VALUE (temp)))
+ init = gen_rtx_SYMBOL_REF (Pmode, sym_name);
+
+ assemble_integer (init, GET_MODE_SIZE (Pmode),
GET_MODE_ALIGNMENT (Pmode), 1);
+ /* APPLE LOCAL END fix-and-continue mrs */
}
}
}
@@ -1004,11 +1185,28 @@ darwin_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
if ((TREE_CODE (decl) == FUNCTION_DECL
|| TREE_CODE (decl) == VAR_DECL)
&& !DECL_EXTERNAL (decl)
+ /* APPLE LOCAL coalescing */
+#ifdef DECL_IS_COALESCED_OR_WEAK
+ && ! DECL_IS_COALESCED_OR_WEAK (decl)
+#endif
&& ((TREE_STATIC (decl)
&& (!DECL_COMMON (decl) || !TREE_PUBLIC (decl)))
|| (DECL_INITIAL (decl)
&& DECL_INITIAL (decl) != error_mark_node)))
defined = 1;
+ /* APPLE LOCAL fix OBJC codegen */
+ if (TREE_CODE (decl) == VAR_DECL)
+ {
+ sym_ref = XEXP (DECL_RTL (decl), 0);
+ orig_str = XSTR (sym_ref, 0);
+ if ( orig_str[0] == '_'
+ && orig_str[1] == 'O'
+ && orig_str[2] == 'B'
+ && orig_str[3] == 'J'
+ && orig_str[4] == 'C'
+ && orig_str[5] == '_')
+ defined = 1;
+ }
if (TREE_CODE (decl) == FUNCTION_DECL)
code = (defined ? 'T' : 't');
@@ -1041,7 +1239,15 @@ darwin_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
new_str[0] = '!';
new_str[1] = code;
new_str[2] = '_';
+ /* APPLE LOCAL private extern */
+ if (DECL_VISIBILITY (decl) == VISIBILITY_HIDDEN)
+ new_str[2] = 'p';
new_str[3] = '_';
+ /* APPLE LOCAL BEGIN fix-and-continue mrs */
+ if (TARGET_INDIRECT_ALL_DATA
+ && TREE_CODE (decl) == VAR_DECL && ! TREE_PUBLIC (decl))
+ new_str[3] = 's';
+ /* APPLE LOCAL END fix-and-continue mrs */
memcpy (new_str + 4, orig_str, len);
XSTR (sym_ref, 0) = ggc_alloc_string (new_str, new_len);
}
@@ -1161,9 +1367,24 @@ machopic_select_section (tree exp, int reloc,
&& TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
&& TYPE_NAME (TREE_TYPE (exp)))
{
+ /* APPLE LOCAL begin constant strings */
+ extern int flag_next_runtime;
+ extern const char *constant_string_class_name;
+ /* APPLE LOCAL end constant strings */
tree name = TYPE_NAME (TREE_TYPE (exp));
if (TREE_CODE (name) == TYPE_DECL)
name = DECL_NAME (name);
+ /* APPLE LOCAL begin constant strings */
+ if (constant_string_class_name
+ && !strcmp (IDENTIFIER_POINTER (name),
+ constant_string_class_name))
+ {
+ if (flag_next_runtime)
+ objc_constant_string_object_section ();
+ else
+ objc_string_object_section ();
+ }
+ /* APPLE LOCAL end constant strings */
if (!strcmp (IDENTIFIER_POINTER (name), "NSConstantString"))
objc_constant_string_object_section ();
else if (!strcmp (IDENTIFIER_POINTER (name), "NXConstantString"))
@@ -1171,6 +1392,26 @@ machopic_select_section (tree exp, int reloc,
else
base_function ();
}
+ /* APPLE LOCAL begin constant cfstrings */
+ else if (TREE_CODE (exp) == CONSTRUCTOR
+ && TREE_TYPE (exp)
+ && TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE
+ && TREE_OPERAND (exp, 0))
+ {
+ tree name = TREE_OPERAND (exp, 0);
+ if (TREE_CODE (name) == TREE_LIST && TREE_VALUE (name)
+ && TREE_CODE (TREE_VALUE (name)) == NOP_EXPR
+ && TREE_OPERAND (TREE_VALUE (name), 0)
+ && TREE_OPERAND (TREE_OPERAND (TREE_VALUE (name), 0), 0))
+ name = TREE_OPERAND (TREE_OPERAND (TREE_VALUE (name), 0), 0);
+ if (TREE_CODE (name) == VAR_DECL
+ && !strcmp (IDENTIFIER_POINTER (DECL_NAME (name)),
+ "__CFConstantStringClassReference"))
+ cfstring_constant_object_section ();
+ else
+ base_function ();
+ }
+ /* APPLE LOCAL end constant cfstrings */
else if (TREE_CODE (exp) == VAR_DECL &&
DECL_NAME (exp) &&
TREE_CODE (DECL_NAME (exp)) == IDENTIFIER_NODE &&
@@ -1228,6 +1469,10 @@ machopic_select_section (tree exp, int reloc,
else
base_function ();
}
+ /* APPLE LOCAL begin darwin_set_section_for_var_p */
+ else if (darwin_set_section_for_var_p (exp, reloc, align))
+ ;
+ /* APPLE LOCAL end darwin_set_section_for_var_p */
else
base_function ();
}
@@ -1289,6 +1534,188 @@ darwin_globalize_label (FILE *stream, const char *name)
default_globalize_label (stream, name);
}
+/* APPLE LOCAL begin assembly "abort" directive */
+/* This can be called instead of EXIT. It will emit a '.abort' directive
+ into any existing assembly file, causing assembly to immediately abort,
+ thus preventing the assembler from spewing out numerous, irrelevant
+ error messages. */
+
+void
+abort_assembly_and_exit (status)
+ int status;
+{
+ /* If we're aborting, get the assembler to abort, too. */
+ if (status == FATAL_EXIT_CODE && asm_out_file != 0)
+ fprintf (asm_out_file, "\n.abort\n");
+
+ exit (status);
+}
+/* APPLE LOCAL end assembly "abort" directive */
+
+/* APPLE LOCAL coalescing */
+void
+darwin_asm_named_section (name, flags)
+ const char *name;
+ unsigned int flags ATTRIBUTE_UNUSED;
+{
+ fprintf (asm_out_file, ".section %s\n", name);
+}
+
+unsigned int
+darwin_section_type_flags (decl, name, reloc)
+ tree decl;
+ const char *name;
+ int reloc;
+{
+ unsigned int flags = default_section_type_flags (decl, name, reloc);
+
+ /* Weak or coalesced variables live in a writable section. */
+ if (decl != 0 && TREE_CODE (decl) != FUNCTION_DECL
+ && DECL_IS_COALESCED_OR_WEAK (decl))
+ flags |= SECTION_WRITE;
+
+ return flags;
+}
+/* APPLE LOCAL end coalescing */
+
+/* APPLE LOCAL begin double destructor turly 20020214 */
+#include "c-common.h"
+
+/* Handle __attribute__ ((apple_kext_compatibility)).
+ This only applies to darwin kexts for 295 compatibility -- it shrinks the
+ vtable for classes with this attribute (and their descendants) by not
+ outputting the new 3.0 nondeleting destructor. This means that such
+ objects CANNOT be allocated on the stack or as globals UNLESS they have
+ a completely empty `operator delete'.
+ Luckily, this fits in with the Darwin kext model.
+
+ This attribute also disables gcc3's potential overlaying of derived
+ class data members on the padding at the end of the base class. */
+
+tree
+darwin_handle_odd_attribute (node, name, args, flags, no_add_attrs)
+ tree *node;
+ tree name;
+ tree args ATTRIBUTE_UNUSED;
+ int flags ATTRIBUTE_UNUSED;
+ bool *no_add_attrs;
+{
+ if (! POSSIBLY_COMPILING_APPLE_KEXT_P ())
+ {
+ warning ("`%s' 2.95 vtable-compatability attribute applies "
+ "only when compiling a kext", IDENTIFIER_POINTER (name));
+
+ *no_add_attrs = true;
+ }
+ else if (TREE_CODE (*node) != RECORD_TYPE)
+ {
+ warning ("`%s' 2.95 vtable-compatability attribute applies "
+ "only to C++ classes", IDENTIFIER_POINTER (name));
+
+ *no_add_attrs = true;
+ }
+
+ return NULL_TREE;
+}
+/* APPLE LOCAL end double destructor turly 20020214 */
+
+/* APPLE LOCAL begin darwin_set_section_for_var_p turly 20020226 */
+
+/* This is specifically for any initialised static class constants
+ which may be output by the C++ front end at the end of compilation.
+ SELECT_SECTION () macro won't do because these are VAR_DECLs, not
+ STRING_CSTs or INTEGER_CSTs. And by putting 'em in appropriate
+ sections, we save space. */
+
+extern void cstring_section (void),
+ literal4_section (void), literal8_section (void);
+int
+darwin_set_section_for_var_p (exp, reloc, align)
+ tree exp;
+ int reloc;
+ int align;
+{
+ if (!reloc && TREE_CODE (exp) == VAR_DECL
+ && DECL_ALIGN (exp) == align
+ && TREE_READONLY (exp) && DECL_INITIAL (exp))
+ {
+ /* Put constant string vars in ".cstring" section. */
+
+ if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE
+ && TREE_CODE (TREE_TYPE (TREE_TYPE (exp))) == INTEGER_TYPE
+ && integer_onep (TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (exp))))
+ && TREE_CODE (DECL_INITIAL (exp)) == STRING_CST)
+ {
+
+ /* Compare string length with actual number of characters
+ the compiler will write out (which is not necessarily
+ TREE_STRING_LENGTH, in the case of a constant array of
+ characters that is not null-terminated). Select appropriate
+ section accordingly. */
+
+ if (MIN ( TREE_STRING_LENGTH (DECL_INITIAL(exp)),
+ int_size_in_bytes (TREE_TYPE (exp)))
+ == (long) strlen (TREE_STRING_POINTER (DECL_INITIAL (exp))) + 1)
+ {
+ cstring_section ();
+ return 1;
+ }
+ else
+ {
+ const_section ();
+ return 1;
+ }
+ }
+ else
+ if (TREE_READONLY (TREE_TYPE (exp))
+ && ((TREE_CODE (TREE_TYPE (exp)) == INTEGER_TYPE
+ && TREE_CODE (DECL_INITIAL (exp)) == INTEGER_CST)
+ || (TREE_CODE (TREE_TYPE (exp)) == REAL_TYPE
+ && TREE_CODE (DECL_INITIAL (exp)) == REAL_CST))
+ && TREE_CODE (TYPE_SIZE_UNIT (TREE_TYPE (DECL_INITIAL (exp))))
+ == INTEGER_CST)
+ {
+ tree size = TYPE_SIZE_UNIT (TREE_TYPE (DECL_INITIAL (exp)));
+ if (TREE_INT_CST_HIGH (size) != 0)
+ return 0;
+
+ /* Put integer and float consts in the literal4|8 sections. */
+
+ if (TREE_INT_CST_LOW (size) == 4)
+ {
+ literal4_section ();
+ return 1;
+ }
+ else if (TREE_INT_CST_LOW (size) == 8)
+ {
+ literal8_section ();
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+/* APPLE LOCAL end darwin_set_section_for_var_p turly 20020226 */
+
+/* APPLE LOCAL begin C++ EH */
+/* Generate a PC-relative reference to a Mach-O non-lazy-symbol. */
+void
+darwin_non_lazy_pcrel (FILE *file, rtx addr)
+{
+ const char *str;
+ const char *nlp_name;
+
+ if (GET_CODE (addr) != SYMBOL_REF)
+ abort ();
+
+ str = darwin_strip_name_encoding (XSTR (addr, 0));
+ nlp_name = machopic_non_lazy_ptr_name (str);
+ fputs ("\t.long\t", file);
+ ASM_OUTPUT_LABELREF (file, nlp_name);
+ fputs ("-.", file);
+}
+/* APPLE LOCAL end C++ EH */
+
/* Emit an assembler directive to set visibility for a symbol. The
only supported visibilities are VISIBILITY_DEFAULT and
VISIBILITY_HIDDEN; the latter corresponds to Darwin's "private