1 /* Functions for generic Darwin as target machine for GNU C compiler.
2 Copyright (C) 1989, 1990, 1991, 1992, 1993, 2000, 2001, 2002, 2003, 2004
3 Free Software Foundation, Inc.
4 Contributed by Apple Computer Inc.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
25 #include "coretypes.h"
29 #include "hard-reg-set.h"
31 #include "insn-config.h"
32 #include "conditions.h"
33 #include "insn-flags.h"
35 #include "insn-attr.h"
42 #include "langhooks.h"
47 /* Darwin supports a feature called fix-and-continue, which is used
48 for rapid turn around debugging. When code is compiled with the
49 -mfix-and-continue flag, two changes are made to the generated code
50 that allow the system to do things that it would normally not be
51 able to do easily. These changes allow gdb to load in
52 recompilation of a translation unit that has been changed into a
53 running program and replace existing functions and methods of that
54 translation unit with with versions of those functions and methods
55 from the newly compiled translation unit. The new functions access
56 the existing static data from the old translation unit, if the data
57 existed in the unit to be replaced, and from the new translation
60 The changes are to insert 4 nops at the beginning of all functions
61 and to use indirection to get at static duration data. The 4 nops
62 are required by consumers of the generated code. Currently, gdb
63 uses this to patch in a jump to the overriding function, this
64 allows all uses of the old name to forward to the replacement,
65 including existing function poiinters and virtual methods. See
66 rs6000_emit_prologue for the code that handles the nop insertions.
68 The added indirection allows gdb to redirect accesses to static
69 duration data from the newly loaded translation unit to the
70 existing data, if any. @code{static} data is special and is
71 handled by setting the second word in the .non_lazy_symbol_pointer
72 data structure to the address of the data. See indirect_data for
73 the code that handles the extra indirection, and
74 machopic_output_indirection and its use of MACHO_SYMBOL_STATIC for
75 the code that handles @code{static} data indirection. */
78 /* Nonzero if the user passes the -mone-byte-bool switch, which forces
79 sizeof(bool) to be 1. */
80 const char *darwin_one_byte_bool = 0;
83 name_needs_quotes (const char *name)
86 while ((c = *name++) != '\0')
87 if (! ISIDNUM (c) && c != '.' && c != '$')
93 * flag_pic = 1 ... generate only indirections
94 * flag_pic = 2 ... generate indirections and pure code
98 machopic_symbol_defined_p (rtx sym_ref)
100 return ((SYMBOL_REF_FLAGS (sym_ref) & MACHO_SYMBOL_FLAG_DEFINED)
101 /* Local symbols must always be defined. */
102 || SYMBOL_REF_LOCAL_P (sym_ref));
105 /* This module assumes that (const (symbol_ref "foo")) is a legal pic
106 reference, which will not be changed. */
108 enum machopic_addr_class
109 machopic_classify_symbol (rtx sym_ref)
114 flags = SYMBOL_REF_FLAGS (sym_ref);
115 function_p = SYMBOL_REF_FUNCTION_P (sym_ref);
116 if (machopic_symbol_defined_p (sym_ref))
118 ? MACHOPIC_DEFINED_FUNCTION : MACHOPIC_DEFINED_DATA);
121 ? MACHOPIC_UNDEFINED_FUNCTION : MACHOPIC_UNDEFINED_DATA);
124 #ifndef TARGET_FIX_AND_CONTINUE
125 #define TARGET_FIX_AND_CONTINUE 0
128 /* Indicate when fix-and-continue style code generation is being used
129 and when a reference to data should be indirected so that it can be
130 rebound in a new translation unit to refernce the original instance
131 of that data. Symbol names that are for code generation local to
132 the translation unit are bound to the new translation unit;
133 currently this means symbols that begin with L or _OBJC_;
134 otherwise, we indicate that an indirect reference should be made to
135 permit the runtime to rebind new instances of the translation unit
136 to the original instance of the data. */
139 indirect_data (rtx sym_ref)
144 /* If we aren't generating fix-and-continue code, don't do anything special. */
145 if (TARGET_FIX_AND_CONTINUE == 0)
148 /* Otherwise, all symbol except symbols that begin with L or _OBJC_
149 are indirected. Symbols that begin with L and _OBJC_ are always
150 bound to the current translation unit as they are used for
151 generated local data of the translation unit. */
153 name = XSTR (sym_ref, 0);
155 lprefix = (((name[0] == '*' || name[0] == '&')
156 && (name[1] == 'L' || (name[1] == '"' && name[2] == 'L')))
157 || (strncmp (name, "_OBJC_", 6)));
164 machopic_data_defined_p (rtx sym_ref)
166 if (indirect_data (sym_ref))
169 switch (machopic_classify_symbol (sym_ref))
171 case MACHOPIC_DEFINED_DATA:
179 machopic_define_symbol (rtx mem)
182 if (GET_CODE (mem) != MEM)
184 sym_ref = XEXP (mem, 0);
185 SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_FLAG_DEFINED;
188 static GTY(()) char * function_base;
191 machopic_function_base_name (void)
193 /* if dynamic-no-pic is on, we should not get here */
194 if (MACHO_DYNAMIC_NO_PIC_P)
197 if (function_base == NULL)
199 (char *) ggc_alloc_string ("<pic base>", sizeof ("<pic base>"));
201 current_function_uses_pic_offset_table = 1;
203 return function_base;
206 /* Return a SYMBOL_REF for the PIC function base. */
209 machopic_function_base_sym (void)
213 sym_ref = gen_rtx_SYMBOL_REF (Pmode, machopic_function_base_name ());
214 SYMBOL_REF_FLAGS (sym_ref)
215 |= (MACHO_SYMBOL_FLAG_VARIABLE | MACHO_SYMBOL_FLAG_DEFINED);
219 static GTY(()) const char * function_base_func_name;
220 static GTY(()) int current_pic_label_num;
223 machopic_output_function_base_name (FILE *file)
225 const char *current_name;
227 /* If dynamic-no-pic is on, we should not get here. */
228 if (MACHO_DYNAMIC_NO_PIC_P)
231 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (current_function_decl));
232 if (function_base_func_name != current_name)
234 ++current_pic_label_num;
235 function_base_func_name = current_name;
237 fprintf (file, "\"L%011d$pb\"", current_pic_label_num);
240 /* The suffix attached to non-lazy pointer symbols. */
241 #define NON_LAZY_POINTER_SUFFIX "$non_lazy_ptr"
242 /* The suffix attached to stub symbols. */
243 #define STUB_SUFFIX "$stub"
245 typedef struct machopic_indirection GTY (())
247 /* The SYMBOL_REF for the entity referenced. */
249 /* The IDENTIFIER_NODE giving the name of the stub or non-lazy
252 /* True iff this entry is for a stub (as opposed to a non-lazy
255 /* True iff this stub or pointer pointer has been referenced. */
257 } machopic_indirection;
259 /* A table mapping stub names and non-lazy pointer names to
260 SYMBOL_REFs for the stubbed-to and pointed-to entities. */
262 static GTY ((param_is (struct machopic_indirection))) htab_t
263 machopic_indirections;
265 /* Return a hash value for a SLOT in the indirections hash table. */
268 machopic_indirection_hash (const void *slot)
270 const machopic_indirection *p = (const machopic_indirection *) slot;
271 return IDENTIFIER_HASH_VALUE (p->ptr_name);
274 /* Returns true if the KEY is the same as that associated with
278 machopic_indirection_eq (const void *slot, const void *key)
280 return ((const machopic_indirection *) slot)->ptr_name == (tree) key;
283 /* Return the name of the non-lazy pointer (if STUB_P is false) or
284 stub (if STUB_B is true) corresponding to the given name. */
287 machopic_indirection_name (rtx sym_ref, bool stub_p)
290 const char *name = XSTR (sym_ref, 0);
291 int namelen = strlen (name);
293 machopic_indirection *p;
295 /* Construct the name of the non-lazy pointer or stub. */
298 int needs_quotes = name_needs_quotes (name);
299 buffer = alloca (strlen ("&L")
301 + strlen (STUB_SUFFIX)
302 + 2 /* possible quotes */
308 sprintf (buffer, "&\"L%s" STUB_SUFFIX "\"", name + 1);
310 sprintf (buffer, "&\"L%s%s" STUB_SUFFIX "\"", user_label_prefix,
313 else if (name[0] == '*')
314 sprintf (buffer, "&L%s" STUB_SUFFIX, name + 1);
316 sprintf (buffer, "&L%s%s" STUB_SUFFIX, user_label_prefix, name);
320 buffer = alloca (strlen ("&L")
321 + strlen (user_label_prefix)
323 + strlen (NON_LAZY_POINTER_SUFFIX)
326 sprintf (buffer, "&L%s" NON_LAZY_POINTER_SUFFIX, name + 1);
328 sprintf (buffer, "&L%s%s" NON_LAZY_POINTER_SUFFIX,
329 user_label_prefix, name);
332 /* See if we already have it. */
333 ptr_name = maybe_get_identifier (buffer);
334 /* If not, create a mapping from the non-lazy pointer to the
339 ptr_name = get_identifier (buffer);
340 p = (machopic_indirection *) ggc_alloc (sizeof (machopic_indirection));
342 p->ptr_name = ptr_name;
345 if (!machopic_indirections)
346 machopic_indirections
347 = htab_create_ggc (37,
348 machopic_indirection_hash,
349 machopic_indirection_eq,
351 slot = htab_find_slot_with_hash (machopic_indirections, ptr_name,
352 IDENTIFIER_HASH_VALUE (ptr_name),
354 *((machopic_indirection **) slot) = p;
357 return IDENTIFIER_POINTER (ptr_name);
360 /* Return the name of the stub for the mcount function. */
363 machopic_mcount_stub_name (void)
365 return "&L*mcount$stub";
368 /* If NAME is the name of a stub or a non-lazy pointer , mark the stub
369 or non-lazy pointer as used -- and mark the object to which the
370 pointer/stub refers as used as well, since the pointer/stub will
371 emit a reference to it. */
374 machopic_validate_stub_or_non_lazy_ptr (const char *name)
376 tree ident = get_identifier (name);
378 machopic_indirection *p;
380 p = ((machopic_indirection *)
381 (htab_find_with_hash (machopic_indirections, ident,
382 IDENTIFIER_HASH_VALUE (ident))));
386 mark_referenced (ident);
387 mark_referenced (get_identifier (XSTR (p->symbol, 0)));
391 /* Transform ORIG, which may be any data source, to the corresponding
392 source using indirections. */
395 machopic_indirect_data_reference (rtx orig, rtx reg)
399 if (! MACHOPIC_INDIRECT)
402 if (GET_CODE (orig) == SYMBOL_REF)
404 int defined = machopic_data_defined_p (orig);
406 if (defined && MACHO_DYNAMIC_NO_PIC_P)
408 #if defined (TARGET_TOC)
409 emit_insn (GET_MODE (orig) == DImode
410 ? gen_macho_high_di (reg, orig)
411 : gen_macho_high (reg, orig));
412 emit_insn (GET_MODE (orig) == DImode
413 ? gen_macho_low_di (reg, reg, orig)
414 : gen_macho_low (reg, reg, orig));
416 /* some other cpu -- writeme! */
423 #if defined (TARGET_TOC) || defined (HAVE_lo_sum)
424 rtx pic_base = machopic_function_base_sym ();
425 rtx offset = gen_rtx_CONST (Pmode,
426 gen_rtx_MINUS (Pmode, orig, pic_base));
429 #if defined (TARGET_TOC) /* i.e., PowerPC */
430 rtx hi_sum_reg = (no_new_pseudos ? reg : gen_reg_rtx (Pmode));
435 emit_insn (gen_rtx_SET (Pmode, hi_sum_reg,
436 gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
437 gen_rtx_HIGH (Pmode, offset))));
438 emit_insn (gen_rtx_SET (Pmode, reg,
439 gen_rtx_LO_SUM (Pmode, hi_sum_reg, offset)));
443 #if defined (HAVE_lo_sum)
444 if (reg == 0) abort ();
446 emit_insn (gen_rtx_SET (VOIDmode, reg,
447 gen_rtx_HIGH (Pmode, offset)));
448 emit_insn (gen_rtx_SET (VOIDmode, reg,
449 gen_rtx_LO_SUM (Pmode, reg, offset)));
450 emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
452 orig = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, reg);
458 ptr_ref = (gen_rtx_SYMBOL_REF
460 machopic_indirection_name (orig, /*stub_p=*/false)));
462 SYMBOL_REF_DECL (ptr_ref) = SYMBOL_REF_DECL (orig);
464 ptr_ref = gen_const_mem (Pmode, ptr_ref);
468 else if (GET_CODE (orig) == CONST)
472 /* legitimize both operands of the PLUS */
473 if (GET_CODE (XEXP (orig, 0)) == PLUS)
475 base = machopic_indirect_data_reference (XEXP (XEXP (orig, 0), 0),
477 orig = machopic_indirect_data_reference (XEXP (XEXP (orig, 0), 1),
478 (base == reg ? 0 : reg));
483 if (MACHOPIC_PURE && GET_CODE (orig) == CONST_INT)
484 result = plus_constant (base, INTVAL (orig));
486 result = gen_rtx_PLUS (Pmode, base, orig);
488 if (MACHOPIC_JUST_INDIRECT && GET_CODE (base) == MEM)
492 emit_move_insn (reg, result);
497 result = force_reg (GET_MODE (result), result);
504 else if (GET_CODE (orig) == MEM)
505 XEXP (ptr_ref, 0) = machopic_indirect_data_reference (XEXP (orig, 0), reg);
506 /* When the target is i386, this code prevents crashes due to the
507 compiler's ignorance on how to move the PIC base register to
508 other registers. (The reload phase sometimes introduces such
510 else if (GET_CODE (orig) == PLUS
511 && GET_CODE (XEXP (orig, 0)) == REG
512 && REGNO (XEXP (orig, 0)) == PIC_OFFSET_TABLE_REGNUM
514 /* Prevent the same register from being erroneously used
515 as both the base and index registers. */
516 && GET_CODE (XEXP (orig, 1)) == CONST
520 emit_move_insn (reg, XEXP (orig, 0));
521 XEXP (ptr_ref, 0) = reg;
526 /* Transform TARGET (a MEM), which is a function call target, to the
527 corresponding symbol_stub if necessary. Return a new MEM. */
530 machopic_indirect_call_target (rtx target)
532 if (GET_CODE (target) != MEM)
535 if (MACHOPIC_INDIRECT
536 && GET_CODE (XEXP (target, 0)) == SYMBOL_REF
537 && !(SYMBOL_REF_FLAGS (XEXP (target, 0))
538 & MACHO_SYMBOL_FLAG_DEFINED))
540 rtx sym_ref = XEXP (target, 0);
541 const char *stub_name = machopic_indirection_name (sym_ref,
543 enum machine_mode mode = GET_MODE (sym_ref);
544 tree decl = SYMBOL_REF_DECL (sym_ref);
546 XEXP (target, 0) = gen_rtx_SYMBOL_REF (mode, stub_name);
547 SYMBOL_REF_DECL (XEXP (target, 0)) = decl;
548 MEM_READONLY_P (target) = 1;
549 MEM_NOTRAP_P (target) = 1;
556 machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
560 if (! MACHOPIC_INDIRECT)
563 /* First handle a simple SYMBOL_REF or LABEL_REF */
564 if (GET_CODE (orig) == LABEL_REF
565 || (GET_CODE (orig) == SYMBOL_REF
568 /* addr(foo) = &func+(foo-func) */
571 orig = machopic_indirect_data_reference (orig, reg);
573 if (GET_CODE (orig) == PLUS
574 && GET_CODE (XEXP (orig, 0)) == REG)
577 return force_reg (mode, orig);
579 emit_move_insn (reg, orig);
583 /* if dynamic-no-pic then use 0 as the pic base */
584 if (MACHO_DYNAMIC_NO_PIC_P)
585 pic_base = CONST0_RTX (Pmode);
587 pic_base = machopic_function_base_sym ();
589 if (GET_CODE (orig) == MEM)
593 if (reload_in_progress)
596 reg = gen_reg_rtx (Pmode);
600 if (MACHO_DYNAMIC_NO_PIC_P
601 && (GET_CODE (XEXP (orig, 0)) == SYMBOL_REF
602 || GET_CODE (XEXP (orig, 0)) == LABEL_REF))
604 #if defined (TARGET_TOC) /* ppc */
605 rtx temp_reg = (no_new_pseudos) ? reg : gen_reg_rtx (Pmode);
606 rtx asym = XEXP (orig, 0);
609 emit_insn (mode == DImode
610 ? gen_macho_high_di (temp_reg, asym)
611 : gen_macho_high (temp_reg, asym));
612 mem = gen_const_mem (GET_MODE (orig),
613 gen_rtx_LO_SUM (Pmode, temp_reg, asym));
614 emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
616 /* Some other CPU -- WriteMe! but right now there are no other platform that can use dynamic-no-pic */
622 if (GET_CODE (XEXP (orig, 0)) == SYMBOL_REF
623 || GET_CODE (XEXP (orig, 0)) == LABEL_REF)
625 rtx offset = gen_rtx_CONST (Pmode,
626 gen_rtx_MINUS (Pmode,
629 #if defined (TARGET_TOC) /* i.e., PowerPC */
630 /* Generating a new reg may expose opportunities for
631 common subexpression elimination. */
632 rtx hi_sum_reg = no_new_pseudos ? reg : gen_reg_rtx (Pmode);
637 sum = gen_rtx_HIGH (Pmode, offset);
638 if (! MACHO_DYNAMIC_NO_PIC_P)
639 sum = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, sum);
641 emit_insn (gen_rtx_SET (Pmode, hi_sum_reg, sum));
643 mem = gen_const_mem (GET_MODE (orig),
644 gen_rtx_LO_SUM (Pmode,
645 hi_sum_reg, offset));
646 insn = emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
647 REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_EQUAL, pic_ref,
652 emit_insn (gen_rtx_USE (VOIDmode,
654 PIC_OFFSET_TABLE_REGNUM)));
656 emit_insn (gen_rtx_SET (VOIDmode, reg,
658 gen_rtx_CONST (Pmode,
660 emit_insn (gen_rtx_SET (VOIDmode, reg,
661 gen_rtx_LO_SUM (Pmode, reg,
662 gen_rtx_CONST (Pmode, offset))));
663 pic_ref = gen_rtx_PLUS (Pmode,
664 pic_offset_table_rtx, reg);
668 #endif /* HAVE_lo_sum */
670 rtx pic = pic_offset_table_rtx;
671 if (GET_CODE (pic) != REG)
673 emit_move_insn (reg, pic);
677 emit_insn (gen_rtx_USE (VOIDmode,
679 PIC_OFFSET_TABLE_REGNUM)));
682 pic_ref = gen_rtx_PLUS (Pmode,
684 gen_rtx_CONST (Pmode,
685 gen_rtx_MINUS (Pmode,
690 #if !defined (TARGET_TOC)
691 emit_move_insn (reg, pic_ref);
692 pic_ref = gen_const_mem (GET_MODE (orig), reg);
699 if (GET_CODE (orig) == SYMBOL_REF
700 || GET_CODE (orig) == LABEL_REF)
702 rtx offset = gen_rtx_CONST (Pmode,
703 gen_rtx_MINUS (Pmode,
705 #if defined (TARGET_TOC) /* i.e., PowerPC */
710 if (reload_in_progress)
713 reg = gen_reg_rtx (Pmode);
718 emit_insn (gen_rtx_SET (Pmode, hi_sum_reg,
719 (MACHO_DYNAMIC_NO_PIC_P)
720 ? gen_rtx_HIGH (Pmode, offset)
721 : gen_rtx_PLUS (Pmode,
722 pic_offset_table_rtx,
725 emit_insn (gen_rtx_SET (VOIDmode, reg,
726 gen_rtx_LO_SUM (Pmode,
727 hi_sum_reg, offset)));
730 emit_insn (gen_rtx_SET (VOIDmode, reg,
731 gen_rtx_HIGH (Pmode, offset)));
732 emit_insn (gen_rtx_SET (VOIDmode, reg,
733 gen_rtx_LO_SUM (Pmode, reg, offset)));
734 pic_ref = gen_rtx_PLUS (Pmode,
735 pic_offset_table_rtx, reg);
739 #endif /* HAVE_lo_sum */
741 if (GET_CODE (orig) == REG)
747 rtx pic = pic_offset_table_rtx;
748 if (GET_CODE (pic) != REG)
750 emit_move_insn (reg, pic);
754 emit_insn (gen_rtx_USE (VOIDmode,
755 pic_offset_table_rtx));
757 pic_ref = gen_rtx_PLUS (Pmode,
759 gen_rtx_CONST (Pmode,
760 gen_rtx_MINUS (Pmode,
766 if (GET_CODE (pic_ref) != REG)
770 emit_move_insn (reg, pic_ref);
775 return force_reg (mode, pic_ref);
784 else if (GET_CODE (orig) == SYMBOL_REF)
787 else if (GET_CODE (orig) == PLUS
788 && (GET_CODE (XEXP (orig, 0)) == MEM
789 || GET_CODE (XEXP (orig, 0)) == SYMBOL_REF
790 || GET_CODE (XEXP (orig, 0)) == LABEL_REF)
791 && XEXP (orig, 0) != pic_offset_table_rtx
792 && GET_CODE (XEXP (orig, 1)) != REG)
796 int is_complex = (GET_CODE (XEXP (orig, 0)) == MEM);
798 base = machopic_legitimize_pic_address (XEXP (orig, 0), Pmode, reg);
799 orig = machopic_legitimize_pic_address (XEXP (orig, 1),
800 Pmode, (base == reg ? 0 : reg));
801 if (GET_CODE (orig) == CONST_INT)
803 pic_ref = plus_constant (base, INTVAL (orig));
807 pic_ref = gen_rtx_PLUS (Pmode, base, orig);
809 if (reg && is_complex)
811 emit_move_insn (reg, pic_ref);
814 /* Likewise, should we set special REG_NOTEs here? */
817 else if (GET_CODE (orig) == CONST)
819 return machopic_legitimize_pic_address (XEXP (orig, 0), Pmode, reg);
822 else if (GET_CODE (orig) == MEM
823 && GET_CODE (XEXP (orig, 0)) == SYMBOL_REF)
825 rtx addr = machopic_legitimize_pic_address (XEXP (orig, 0), Pmode, reg);
826 addr = replace_equiv_address (orig, addr);
827 emit_move_insn (reg, addr);
834 /* Output the stub or non-lazy pointer in *SLOT, if it has been used.
835 DATA is the FILE* for assembly output. Called from
839 machopic_output_indirection (void **slot, void *data)
841 machopic_indirection *p = *((machopic_indirection **) slot);
842 FILE *asm_out_file = (FILE *) data;
844 const char *sym_name;
845 const char *ptr_name;
851 sym_name = XSTR (symbol, 0);
852 ptr_name = IDENTIFIER_POINTER (p->ptr_name);
859 sym = alloca (strlen (sym_name) + 2);
860 if (sym_name[0] == '*' || sym_name[0] == '&')
861 strcpy (sym, sym_name + 1);
862 else if (sym_name[0] == '-' || sym_name[0] == '+')
863 strcpy (sym, sym_name);
865 sprintf (sym, "%s%s", user_label_prefix, sym_name);
867 stub = alloca (strlen (ptr_name) + 2);
868 if (ptr_name[0] == '*' || ptr_name[0] == '&')
869 strcpy (stub, ptr_name + 1);
871 sprintf (stub, "%s%s", user_label_prefix, ptr_name);
873 machopic_output_stub (asm_out_file, sym, stub);
875 else if (! indirect_data (symbol)
876 && machopic_symbol_defined_p (symbol))
879 assemble_align (GET_MODE_ALIGNMENT (Pmode));
880 assemble_label (ptr_name);
881 assemble_integer (gen_rtx_SYMBOL_REF (Pmode, sym_name),
882 GET_MODE_SIZE (Pmode),
883 GET_MODE_ALIGNMENT (Pmode), 1);
887 rtx init = const0_rtx;
889 machopic_nl_symbol_ptr_section ();
890 assemble_name (asm_out_file, ptr_name);
891 fprintf (asm_out_file, ":\n");
893 fprintf (asm_out_file, "\t.indirect_symbol ");
894 assemble_name (asm_out_file, sym_name);
895 fprintf (asm_out_file, "\n");
897 /* Variables that are marked with MACHO_SYMBOL_STATIC need to
898 have their symbol name instead of 0 in the second entry of
899 the non-lazy symbol pointer data structure when they are
900 defined. This allows the runtime to rebind newer instances
901 of the translation unit with the original instance of the
904 if ((SYMBOL_REF_FLAGS (symbol) & MACHO_SYMBOL_STATIC)
905 && machopic_symbol_defined_p (symbol))
906 init = gen_rtx_SYMBOL_REF (Pmode, sym_name);
908 assemble_integer (init, GET_MODE_SIZE (Pmode),
909 GET_MODE_ALIGNMENT (Pmode), 1);
916 machopic_finish (FILE *asm_out_file)
918 if (machopic_indirections)
919 htab_traverse_noresize (machopic_indirections,
920 machopic_output_indirection,
925 machopic_operand_p (rtx op)
927 if (MACHOPIC_JUST_INDIRECT)
929 while (GET_CODE (op) == CONST)
932 if (GET_CODE (op) == SYMBOL_REF)
933 return machopic_symbol_defined_p (op);
938 while (GET_CODE (op) == CONST)
941 if (GET_CODE (op) == MINUS
942 && GET_CODE (XEXP (op, 0)) == SYMBOL_REF
943 && GET_CODE (XEXP (op, 1)) == SYMBOL_REF
944 && machopic_symbol_defined_p (XEXP (op, 0))
945 && machopic_symbol_defined_p (XEXP (op, 1)))
951 /* This function records whether a given name corresponds to a defined
952 or undefined function or variable, for machopic_classify_ident to
956 darwin_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
960 /* Do the standard encoding things first. */
961 default_encode_section_info (decl, rtl, first);
963 if (TREE_CODE (decl) != FUNCTION_DECL && TREE_CODE (decl) != VAR_DECL)
966 sym_ref = XEXP (rtl, 0);
967 if (TREE_CODE (decl) == VAR_DECL)
968 SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_FLAG_VARIABLE;
970 if (!DECL_EXTERNAL (decl)
971 && (!TREE_PUBLIC (decl) || (!DECL_ONE_ONLY (decl) && !DECL_WEAK (decl)))
972 && ((TREE_STATIC (decl)
973 && (!DECL_COMMON (decl) || !TREE_PUBLIC (decl)))
974 || (!DECL_COMMON (decl) && DECL_INITIAL (decl)
975 && DECL_INITIAL (decl) != error_mark_node)))
976 SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_FLAG_DEFINED;
978 if (TREE_CODE (decl) == VAR_DECL
979 && indirect_data (sym_ref)
980 && ! TREE_PUBLIC (decl))
981 SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_STATIC;
985 darwin_make_decl_one_only (tree decl)
987 static const char *text_section = "__TEXT,__textcoal_nt,coalesced,no_toc";
988 static const char *data_section = "__DATA,__datacoal_nt,coalesced,no_toc";
990 const char *sec = TREE_CODE (decl) == FUNCTION_DECL
993 TREE_PUBLIC (decl) = 1;
994 DECL_ONE_ONLY (decl) = 1;
995 DECL_SECTION_NAME (decl) = build_string (strlen (sec), sec);
999 darwin_mark_decl_preserved (const char *name)
1001 fprintf (asm_out_file, ".no_dead_strip ");
1002 assemble_name (asm_out_file, name);
1003 fputc ('\n', asm_out_file);
1007 machopic_select_section (tree exp, int reloc,
1008 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
1010 void (*base_function)(void);
1012 if (decl_readonly_section_1 (exp, reloc, MACHOPIC_INDIRECT))
1013 base_function = readonly_data_section;
1014 else if (TREE_READONLY (exp) || TREE_CONSTANT (exp))
1015 base_function = const_data_section;
1017 base_function = data_section;
1019 if (TREE_CODE (exp) == STRING_CST
1020 && ((size_t) TREE_STRING_LENGTH (exp)
1021 == strlen (TREE_STRING_POINTER (exp)) + 1))
1023 else if ((TREE_CODE (exp) == INTEGER_CST || TREE_CODE (exp) == REAL_CST)
1024 && flag_merge_constants)
1026 tree size = TYPE_SIZE (TREE_TYPE (exp));
1028 if (TREE_CODE (size) == INTEGER_CST &&
1029 TREE_INT_CST_LOW (size) == 4 &&
1030 TREE_INT_CST_HIGH (size) == 0)
1031 literal4_section ();
1032 else if (TREE_CODE (size) == INTEGER_CST &&
1033 TREE_INT_CST_LOW (size) == 8 &&
1034 TREE_INT_CST_HIGH (size) == 0)
1035 literal8_section ();
1039 else if (TREE_CODE (exp) == CONSTRUCTOR
1041 && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
1042 && TYPE_NAME (TREE_TYPE (exp)))
1044 tree name = TYPE_NAME (TREE_TYPE (exp));
1045 if (TREE_CODE (name) == TYPE_DECL)
1046 name = DECL_NAME (name);
1047 if (!strcmp (IDENTIFIER_POINTER (name), "NSConstantString"))
1048 objc_constant_string_object_section ();
1049 else if (!strcmp (IDENTIFIER_POINTER (name), "NXConstantString"))
1050 objc_string_object_section ();
1054 else if (TREE_CODE (exp) == VAR_DECL &&
1056 TREE_CODE (DECL_NAME (exp)) == IDENTIFIER_NODE &&
1057 IDENTIFIER_POINTER (DECL_NAME (exp)) &&
1058 !strncmp (IDENTIFIER_POINTER (DECL_NAME (exp)), "_OBJC_", 6))
1060 const char *name = IDENTIFIER_POINTER (DECL_NAME (exp));
1062 if (!strncmp (name, "_OBJC_CLASS_METHODS_", 20))
1063 objc_cls_meth_section ();
1064 else if (!strncmp (name, "_OBJC_INSTANCE_METHODS_", 23))
1065 objc_inst_meth_section ();
1066 else if (!strncmp (name, "_OBJC_CATEGORY_CLASS_METHODS_", 20))
1067 objc_cat_cls_meth_section ();
1068 else if (!strncmp (name, "_OBJC_CATEGORY_INSTANCE_METHODS_", 23))
1069 objc_cat_inst_meth_section ();
1070 else if (!strncmp (name, "_OBJC_CLASS_VARIABLES_", 22))
1071 objc_class_vars_section ();
1072 else if (!strncmp (name, "_OBJC_INSTANCE_VARIABLES_", 25))
1073 objc_instance_vars_section ();
1074 else if (!strncmp (name, "_OBJC_CLASS_PROTOCOLS_", 22))
1075 objc_cat_cls_meth_section ();
1076 else if (!strncmp (name, "_OBJC_CLASS_NAME_", 17))
1077 objc_class_names_section ();
1078 else if (!strncmp (name, "_OBJC_METH_VAR_NAME_", 20))
1079 objc_meth_var_names_section ();
1080 else if (!strncmp (name, "_OBJC_METH_VAR_TYPE_", 20))
1081 objc_meth_var_types_section ();
1082 else if (!strncmp (name, "_OBJC_CLASS_REFERENCES", 22))
1083 objc_cls_refs_section ();
1084 else if (!strncmp (name, "_OBJC_CLASS_", 12))
1085 objc_class_section ();
1086 else if (!strncmp (name, "_OBJC_METACLASS_", 16))
1087 objc_meta_class_section ();
1088 else if (!strncmp (name, "_OBJC_CATEGORY_", 15))
1089 objc_category_section ();
1090 else if (!strncmp (name, "_OBJC_SELECTOR_REFERENCES", 25))
1091 objc_selector_refs_section ();
1092 else if (!strncmp (name, "_OBJC_SELECTOR_FIXUP", 20))
1093 objc_selector_fixup_section ();
1094 else if (!strncmp (name, "_OBJC_SYMBOLS", 13))
1095 objc_symbols_section ();
1096 else if (!strncmp (name, "_OBJC_MODULES", 13))
1097 objc_module_info_section ();
1098 else if (!strncmp (name, "_OBJC_IMAGE_INFO", 16))
1099 objc_image_info_section ();
1100 else if (!strncmp (name, "_OBJC_PROTOCOL_INSTANCE_METHODS_", 32))
1101 objc_cat_inst_meth_section ();
1102 else if (!strncmp (name, "_OBJC_PROTOCOL_CLASS_METHODS_", 29))
1103 objc_cat_cls_meth_section ();
1104 else if (!strncmp (name, "_OBJC_PROTOCOL_REFS_", 20))
1105 objc_cat_cls_meth_section ();
1106 else if (!strncmp (name, "_OBJC_PROTOCOL_", 15))
1107 objc_protocol_section ();
1115 /* This can be called with address expressions as "rtx".
1116 They must go in "const". */
1119 machopic_select_rtx_section (enum machine_mode mode, rtx x,
1120 unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
1122 if (GET_MODE_SIZE (mode) == 8)
1123 literal8_section ();
1124 else if (GET_MODE_SIZE (mode) == 4
1125 && (GET_CODE (x) == CONST_INT
1126 || GET_CODE (x) == CONST_DOUBLE))
1127 literal4_section ();
1128 else if (MACHOPIC_INDIRECT
1129 && (GET_CODE (x) == SYMBOL_REF
1130 || GET_CODE (x) == CONST
1131 || GET_CODE (x) == LABEL_REF))
1132 const_data_section ();
1138 machopic_asm_out_constructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
1140 if (MACHOPIC_INDIRECT)
1141 mod_init_section ();
1143 constructor_section ();
1144 assemble_align (POINTER_SIZE);
1145 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1147 if (! MACHOPIC_INDIRECT)
1148 fprintf (asm_out_file, ".reference .constructors_used\n");
1152 machopic_asm_out_destructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
1154 if (MACHOPIC_INDIRECT)
1155 mod_term_section ();
1157 destructor_section ();
1158 assemble_align (POINTER_SIZE);
1159 assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1161 if (! MACHOPIC_INDIRECT)
1162 fprintf (asm_out_file, ".reference .destructors_used\n");
1166 darwin_globalize_label (FILE *stream, const char *name)
1168 if (!!strncmp (name, "_OBJC_", 6))
1169 default_globalize_label (stream, name);
1173 darwin_asm_named_section (const char *name, unsigned int flags ATTRIBUTE_UNUSED)
1175 fprintf (asm_out_file, ".section %s\n", name);
1179 darwin_section_type_flags (tree decl, const char *name, int reloc)
1181 unsigned int flags = default_section_type_flags (decl, name, reloc);
1183 /* Weak or linkonce variables live in a writable section. */
1184 if (decl != 0 && TREE_CODE (decl) != FUNCTION_DECL
1185 && (DECL_WEAK (decl) || DECL_ONE_ONLY (decl)))
1186 flags |= SECTION_WRITE;
1192 darwin_unique_section (tree decl, int reloc ATTRIBUTE_UNUSED)
1194 /* Darwin does not use unique sections. However, the target's
1195 unique_section hook is called for linkonce symbols. We need
1196 to set an appropriate section for such symbols. */
1197 if (DECL_ONE_ONLY (decl) && !DECL_SECTION_NAME (decl))
1198 darwin_make_decl_one_only (decl);
1201 #define HAVE_DEAD_STRIP 0
1204 no_dead_strip (FILE *file, const char *lab)
1206 if (HAVE_DEAD_STRIP)
1207 fprintf (file, ".no_dead_strip %s\n", lab);
1210 /* Emit a label for an FDE, making it global and/or weak if appropriate.
1211 The third parameter is nonzero if this is for exception handling.
1212 The fourth parameter is nonzero if this is just a placeholder for an
1213 FDE that we are omitting. */
1216 darwin_emit_unwind_label (FILE *file, tree decl, int for_eh, int empty)
1218 tree id = DECL_ASSEMBLER_NAME (decl)
1219 ? DECL_ASSEMBLER_NAME (decl)
1222 const char *prefix = "_";
1223 const int prefix_len = 1;
1225 const char *base = IDENTIFIER_POINTER (id);
1226 unsigned int base_len = IDENTIFIER_LENGTH (id);
1228 const char *suffix = ".eh";
1230 int need_quotes = name_needs_quotes (base);
1231 int quotes_len = need_quotes ? 2 : 0;
1237 lab = xmalloc (prefix_len + base_len + strlen (suffix) + quotes_len + 1);
1242 strcat(lab, prefix);
1244 strcat(lab, suffix);
1248 if (TREE_PUBLIC (decl))
1249 fprintf (file, "%s %s\n",
1250 (DECL_VISIBILITY (decl) != VISIBILITY_HIDDEN
1252 : ".private_extern"),
1255 if (DECL_ONE_ONLY (decl) && TREE_PUBLIC (decl))
1256 fprintf (file, ".weak_definition %s\n", lab);
1260 fprintf (file, "%s = 0\n", lab);
1262 /* Mark the absolute .eh and .eh1 style labels as needed to
1263 ensure that we don't dead code strip them and keep such
1264 labels from another instantiation point until we can fix this
1265 properly with group comdat support. */
1266 no_dead_strip (file, lab);
1269 fprintf (file, "%s:\n", lab);
1274 /* Generate a PC-relative reference to a Mach-O non-lazy-symbol. */
1277 darwin_non_lazy_pcrel (FILE *file, rtx addr)
1279 const char *nlp_name;
1281 if (GET_CODE (addr) != SYMBOL_REF)
1284 nlp_name = machopic_indirection_name (addr, /*stub_p=*/false);
1285 fputs ("\t.long\t", file);
1286 ASM_OUTPUT_LABELREF (file, nlp_name);
1290 /* Emit an assembler directive to set visibility for a symbol. The
1291 only supported visibilities are VISIBILITY_DEFAULT and
1292 VISIBILITY_HIDDEN; the latter corresponds to Darwin's "private
1293 extern". There is no MACH-O equivalent of ELF's
1294 VISIBILITY_INTERNAL or VISIBILITY_PROTECTED. */
1297 darwin_assemble_visibility (tree decl, int vis)
1299 if (vis == VISIBILITY_DEFAULT)
1301 else if (vis == VISIBILITY_HIDDEN)
1303 fputs ("\t.private_extern ", asm_out_file);
1304 assemble_name (asm_out_file,
1305 (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
1306 fputs ("\n", asm_out_file);
1309 warning ("internal and protected visibility attributes not supported"
1310 "in this configuration; ignored");
1313 /* Output a difference of two labels that will be an assembly time
1314 constant if the two labels are local. (.long lab1-lab2 will be
1315 very different if lab1 is at the boundary between two sections; it
1316 will be relocated according to the second section, not the first,
1317 so one ends up with a difference between labels in different
1318 sections, which is bad in the dwarf2 eh context for instance.) */
1320 static int darwin_dwarf_label_counter;
1323 darwin_asm_output_dwarf_delta (FILE *file, int size ATTRIBUTE_UNUSED,
1324 const char *lab1, const char *lab2)
1326 int islocaldiff = (lab1[0] == '*' && lab1[1] == 'L'
1327 && lab2[0] == '*' && lab2[1] == 'L');
1330 fprintf (file, "\t.set L$set$%d,", darwin_dwarf_label_counter);
1332 fprintf (file, "\t%s\t", ".long");
1333 assemble_name (file, lab1);
1334 fprintf (file, "-");
1335 assemble_name (file, lab2);
1337 fprintf (file, "\n\t.long L$set$%d", darwin_dwarf_label_counter++);
1341 darwin_file_end (void)
1343 machopic_finish (asm_out_file);
1344 if (strcmp (lang_hooks.name, "GNU C++") == 0)
1346 constructor_section ();
1347 destructor_section ();
1348 ASM_OUTPUT_ALIGN (asm_out_file, 1);
1350 fprintf (asm_out_file, "\t.subsections_via_symbols\n");
1353 /* True, iff we're generating fast turn around debugging code. When
1354 true, we arrange for function prologues to start with 4 nops so
1355 that gdb may insert code to redirect them, and for data to accessed
1356 indirectly. The runtime uses this indirection to forward
1357 references for data to the original instance of that data. */
1359 int darwin_fix_and_continue;
1360 const char *darwin_fix_and_continue_switch;
1362 #include "gt-darwin.h"