OSDN Git Service

* trans-array.c (set_vector_loop_bounds): Loop over the parents.
[pf3gnuchains/gcc-fork.git] / gcc / config / darwin.c
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    2005, 2006, 2007, 2008, 2009, 2010, 2011
4    Free Software Foundation, Inc.
5    Contributed by Apple Computer Inc.
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
12 any later version.
13
14 GCC is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3.  If not see
21 <http://www.gnu.org/licenses/>.  */
22
23 #include "config.h"
24 #include "system.h"
25 #include "coretypes.h"
26 #include "tm.h"
27 #include "rtl.h"
28 #include "regs.h"
29 #include "hard-reg-set.h"
30 #include "insn-config.h"
31 #include "conditions.h"
32 #include "insn-flags.h"
33 #include "output.h"
34 #include "insn-attr.h"
35 #include "flags.h"
36 #include "tree.h"
37 #include "expr.h"
38 #include "reload.h"
39 #include "function.h"
40 #include "ggc.h"
41 #include "langhooks.h"
42 #include "target.h"
43 #include "tm_p.h"
44 #include "diagnostic-core.h"
45 #include "toplev.h"
46 #include "hashtab.h"
47 #include "df.h"
48 #include "debug.h"
49 #include "obstack.h"
50 #include "lto-streamer.h"
51
52 /* Darwin supports a feature called fix-and-continue, which is used
53    for rapid turn around debugging.  When code is compiled with the
54    -mfix-and-continue flag, two changes are made to the generated code
55    that allow the system to do things that it would normally not be
56    able to do easily.  These changes allow gdb to load in
57    recompilation of a translation unit that has been changed into a
58    running program and replace existing functions and methods of that
59    translation unit with versions of those functions and methods
60    from the newly compiled translation unit.  The new functions access
61    the existing static symbols from the old translation unit, if the
62    symbol existed in the unit to be replaced, and from the new
63    translation unit, otherwise.
64
65    The changes are to insert 5 nops at the beginning of all functions
66    and to use indirection to get at static symbols.  The 5 nops
67    are required by consumers of the generated code.  Currently, gdb
68    uses this to patch in a jump to the overriding function, this
69    allows all uses of the old name to forward to the replacement,
70    including existing function pointers and virtual methods.  See
71    rs6000_emit_prologue for the code that handles the nop insertions.
72
73    The added indirection allows gdb to redirect accesses to static
74    symbols from the newly loaded translation unit to the existing
75    symbol, if any.  @code{static} symbols are special and are handled by
76    setting the second word in the .non_lazy_symbol_pointer data
77    structure to symbol.  See indirect_data for the code that handles
78    the extra indirection, and machopic_output_indirection and its use
79    of MACHO_SYMBOL_STATIC for the code that handles @code{static}
80    symbol indirection.  */
81
82 /* For darwin >= 9  (OSX 10.5) the linker is capable of making the necessary
83    branch islands and we no longer need to emit darwin stubs.
84    However, if we are generating code for earlier systems (or for use in the 
85    kernel) the stubs might still be required, and this will be set true.  */
86 int darwin_emit_branch_islands = false;
87
88 /* A flag to determine whether we are running c++ or obj-c++.  This has to be
89    settable from non-c-family contexts too (i.e. we can't use the c_dialect_
90    functions).  */
91 int darwin_running_cxx;
92
93 /* Some code-gen now depends on OS major version numbers (at least).  */
94 int generating_for_darwin_version ;
95
96 /* Section names.  */
97 section * darwin_sections[NUM_DARWIN_SECTIONS];
98
99 /* While we transition to using in-tests instead of ifdef'd code.  */
100 #ifndef HAVE_lo_sum
101 #define HAVE_lo_sum 0
102 #define gen_macho_high(a,b) (a)
103 #define gen_macho_low(a,b,c) (a)
104 #endif
105
106 /* True if we're setting __attribute__ ((ms_struct)).  */
107 int darwin_ms_struct = false;
108
109 /* Earlier versions of Darwin as do not recognize an alignment field in 
110    .comm directives, this should be set for versions that allow it.  */
111 int emit_aligned_common = false;
112
113 /* A get_unnamed_section callback used to switch to an ObjC section.
114    DIRECTIVE is as for output_section_asm_op.  */
115
116 static void
117 output_objc_section_asm_op (const void *directive)
118 {
119   static bool been_here = false;
120
121   /* The NeXT ObjC Runtime requires these sections to be present and in 
122      order in the object.  The code below implements this by emitting 
123      a section header for each ObjC section the first time that an ObjC
124      section is requested.  */
125   if (! been_here)
126     {
127       section *saved_in_section = in_section;
128       static const enum darwin_section_enum tomark[] =
129         {
130           /* written, cold -> hot */
131           objc_cat_cls_meth_section,
132           objc_cat_inst_meth_section,
133           objc_string_object_section,
134           objc_constant_string_object_section,
135           objc_selector_refs_section,
136           objc_selector_fixup_section,
137           objc_cls_refs_section,
138           objc_class_section,
139           objc_meta_class_section,
140           /* shared, hot -> cold */
141           objc_cls_meth_section,
142           objc_inst_meth_section,
143           objc_protocol_section,
144           objc_class_names_section,
145           objc_meth_var_types_section,
146           objc_meth_var_names_section,
147           objc_category_section,
148           objc_class_vars_section,
149           objc_instance_vars_section,
150           objc_module_info_section,
151           objc_symbols_section,
152         };
153       /* ABI=1 */
154       static const enum darwin_section_enum tomarkv1[] =
155         {
156           objc1_protocol_ext_section,
157           objc1_class_ext_section,
158           objc1_prop_list_section
159         } ;
160       /* ABI=2 */
161       static const enum darwin_section_enum tomarkv2[] =
162         {
163           objc2_message_refs_section,
164           objc2_classdefs_section,
165           objc2_metadata_section,
166           objc2_classrefs_section,
167           objc2_classlist_section,
168           objc2_categorylist_section,
169           objc2_selector_refs_section,
170           objc2_nonlazy_class_section,
171           objc2_nonlazy_category_section,
172           objc2_protocollist_section,
173           objc2_protocolrefs_section,
174           objc2_super_classrefs_section,
175           objc2_image_info_section,
176           objc2_constant_string_object_section
177         } ;
178       size_t i;
179
180       been_here = true;
181       if (flag_objc_abi < 2)
182         {
183           for (i = 0; i < ARRAY_SIZE (tomark); i++)
184             switch_to_section (darwin_sections[tomark[i]]);
185           if (flag_objc_abi == 1)
186             for (i = 0; i < ARRAY_SIZE (tomarkv1); i++)
187               switch_to_section (darwin_sections[tomarkv1[i]]);
188         }
189       else
190         for (i = 0; i < ARRAY_SIZE (tomarkv2); i++)
191           switch_to_section (darwin_sections[tomarkv2[i]]);
192       /* Make sure we don't get varasm.c out of sync with us.  */
193       switch_to_section (saved_in_section);
194     }
195   output_section_asm_op (directive);
196 }
197
198
199 /* Private flag applied to disable section-anchors in a particular section.  */
200 #define SECTION_NO_ANCHOR SECTION_MACH_DEP
201
202
203 /* Implement TARGET_ASM_INIT_SECTIONS.  */
204
205 void
206 darwin_init_sections (void)
207 {
208 #define DEF_SECTION(NAME, FLAGS, DIRECTIVE, OBJC)               \
209   darwin_sections[NAME] =                                       \
210     get_unnamed_section (FLAGS, (OBJC                           \
211                                  ? output_objc_section_asm_op   \
212                                  : output_section_asm_op),      \
213                          "\t" DIRECTIVE);
214 #include "config/darwin-sections.def"
215 #undef DEF_SECTION
216
217   readonly_data_section = darwin_sections[const_section];
218   exception_section = darwin_sections[darwin_exception_section];
219   eh_frame_section = darwin_sections[darwin_eh_frame_section];
220 }
221
222 int
223 name_needs_quotes (const char *name)
224 {
225   int c;
226   while ((c = *name++) != '\0')
227     if (! ISIDNUM (c) 
228           && c != '.' && c != '$' && c != '_' )
229       return 1;
230   return 0;
231 }
232
233 /* Return true if SYM_REF can be used without an indirection.  */
234 int
235 machopic_symbol_defined_p (rtx sym_ref)
236 {
237   if (SYMBOL_REF_FLAGS (sym_ref) & MACHO_SYMBOL_FLAG_DEFINED)
238     return true;
239
240   /* If a symbol references local and is not an extern to this
241      file, then the symbol might be able to declared as defined.  */
242   if (SYMBOL_REF_LOCAL_P (sym_ref) && ! SYMBOL_REF_EXTERNAL_P (sym_ref))
243     {
244       /* If the symbol references a variable and the variable is a
245          common symbol, then this symbol is not defined.  */
246       if (SYMBOL_REF_FLAGS (sym_ref) & MACHO_SYMBOL_FLAG_VARIABLE)
247         {
248           tree decl = SYMBOL_REF_DECL (sym_ref);
249           if (!decl)
250             return true;
251           if (DECL_COMMON (decl))
252             return false;
253         }
254       return true;
255     }
256   return false;
257 }
258
259 /* This module assumes that (const (symbol_ref "foo")) is a legal pic
260    reference, which will not be changed.  */
261
262 enum machopic_addr_class
263 machopic_classify_symbol (rtx sym_ref)
264 {
265   bool function_p;
266
267   function_p = SYMBOL_REF_FUNCTION_P (sym_ref);
268   if (machopic_symbol_defined_p (sym_ref))
269     return (function_p
270             ? MACHOPIC_DEFINED_FUNCTION : MACHOPIC_DEFINED_DATA);
271   else
272     return (function_p
273             ? MACHOPIC_UNDEFINED_FUNCTION : MACHOPIC_UNDEFINED_DATA);
274 }
275
276 #ifndef TARGET_FIX_AND_CONTINUE
277 #define TARGET_FIX_AND_CONTINUE 0
278 #endif
279
280 /* Indicate when fix-and-continue style code generation is being used
281    and when a reference to data should be indirected so that it can be
282    rebound in a new translation unit to reference the original instance
283    of that data.  Symbol names that are for code generation local to
284    the translation unit are bound to the new translation unit;
285    currently this means symbols that begin with L or _OBJC_;
286    otherwise, we indicate that an indirect reference should be made to
287    permit the runtime to rebind new instances of the translation unit
288    to the original instance of the data.  */
289
290 static int
291 indirect_data (rtx sym_ref)
292 {
293   int lprefix;
294   const char *name;
295
296   /* If we aren't generating fix-and-continue code, don't do anything
297      special.  */
298   if (TARGET_FIX_AND_CONTINUE == 0)
299     return 0;
300
301   /* Otherwise, all symbol except symbols that begin with L or _OBJC_
302      are indirected.  Symbols that begin with L and _OBJC_ are always
303      bound to the current translation unit as they are used for
304      generated local data of the translation unit.  */
305
306   name = XSTR (sym_ref, 0);
307
308   lprefix = (((name[0] == '*' || name[0] == '&')
309               && (name[1] == 'L' || (name[1] == '"' && name[2] == 'L')))
310              || (strncmp (name, "_OBJC_", 6) == 0));
311
312   return ! lprefix;
313 }
314
315 static int
316 machopic_data_defined_p (rtx sym_ref)
317 {
318   if (indirect_data (sym_ref))
319     return 0;
320
321   switch (machopic_classify_symbol (sym_ref))
322     {
323     case MACHOPIC_DEFINED_DATA:
324     case MACHOPIC_DEFINED_FUNCTION:
325       return 1;
326     default:
327       return 0;
328     }
329 }
330
331 void
332 machopic_define_symbol (rtx mem)
333 {
334   rtx sym_ref;
335
336   gcc_assert (GET_CODE (mem) == MEM);
337   sym_ref = XEXP (mem, 0);
338   SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_FLAG_DEFINED;
339 }
340
341 /* Return either ORIG or:
342
343      (const:P (unspec:P [ORIG] UNSPEC_MACHOPIC_OFFSET))
344
345    depending on MACHO_DYNAMIC_NO_PIC_P.  */
346 rtx
347 machopic_gen_offset (rtx orig)
348 {
349   if (MACHO_DYNAMIC_NO_PIC_P)
350     return orig;
351   else
352     {
353       /* Play games to avoid marking the function as needing pic if we
354          are being called as part of the cost-estimation process.  */
355       if (current_ir_type () != IR_GIMPLE || currently_expanding_to_rtl)
356         crtl->uses_pic_offset_table = 1;
357       orig = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, orig),
358                              UNSPEC_MACHOPIC_OFFSET);
359       return gen_rtx_CONST (Pmode, orig);
360     }
361 }
362
363 static GTY(()) const char * function_base_func_name;
364 static GTY(()) int current_pic_label_num;
365
366 void
367 machopic_output_function_base_name (FILE *file)
368 {
369   const char *current_name;
370
371   /* If dynamic-no-pic is on, we should not get here.  */
372   gcc_assert (!MACHO_DYNAMIC_NO_PIC_P);
373   /* When we are generating _get_pc thunks within stubs, there is no current
374      function.  */
375   if (current_function_decl)
376     {
377       current_name =
378         IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (current_function_decl));
379       if (function_base_func_name != current_name)
380         {
381           ++current_pic_label_num;
382           function_base_func_name = current_name;
383         }
384     }
385   else
386     {
387       ++current_pic_label_num;
388       function_base_func_name = "L_machopic_stub_dummy";
389     }
390   fprintf (file, "L%011d$pb", current_pic_label_num);
391 }
392
393 /* The suffix attached to non-lazy pointer symbols.  */
394 #define NON_LAZY_POINTER_SUFFIX "$non_lazy_ptr"
395 /* The suffix attached to stub symbols.  */
396 #define STUB_SUFFIX "$stub"
397
398 typedef struct GTY (()) machopic_indirection
399 {
400   /* The SYMBOL_REF for the entity referenced.  */
401   rtx symbol;
402   /* The name of the stub or non-lazy pointer.  */
403   const char * ptr_name;
404   /* True iff this entry is for a stub (as opposed to a non-lazy
405      pointer).  */
406   bool stub_p;
407   /* True iff this stub or pointer pointer has been referenced.  */
408   bool used;
409 } machopic_indirection;
410
411 /* A table mapping stub names and non-lazy pointer names to
412    SYMBOL_REFs for the stubbed-to and pointed-to entities.  */
413
414 static GTY ((param_is (struct machopic_indirection))) htab_t
415   machopic_indirections;
416
417 /* Return a hash value for a SLOT in the indirections hash table.  */
418
419 static hashval_t
420 machopic_indirection_hash (const void *slot)
421 {
422   const machopic_indirection *p = (const machopic_indirection *) slot;
423   return htab_hash_string (p->ptr_name);
424 }
425
426 /* Returns true if the KEY is the same as that associated with
427    SLOT.  */
428
429 static int
430 machopic_indirection_eq (const void *slot, const void *key)
431 {
432   return strcmp (((const machopic_indirection *) slot)->ptr_name,
433                  (const char *) key) == 0;
434 }
435
436 /* Return the name of the non-lazy pointer (if STUB_P is false) or
437    stub (if STUB_B is true) corresponding to the given name.  */
438
439 const char *
440 machopic_indirection_name (rtx sym_ref, bool stub_p)
441 {
442   char *buffer;
443   const char *name = XSTR (sym_ref, 0);
444   size_t namelen = strlen (name);
445   machopic_indirection *p;
446   void ** slot;
447   bool needs_quotes;
448   const char *suffix;
449   const char *prefix = user_label_prefix;
450   const char *quote = "";
451   tree id;
452
453   id = maybe_get_identifier (name);
454   if (id)
455     {
456       tree id_orig = id;
457
458       while (IDENTIFIER_TRANSPARENT_ALIAS (id))
459         id = TREE_CHAIN (id);
460       if (id != id_orig)
461         {
462           name = IDENTIFIER_POINTER (id);
463           namelen = strlen (name);
464         }
465     }
466
467   if (name[0] == '*')
468     {
469       prefix = "";
470       ++name;
471       --namelen;
472     }
473
474   needs_quotes = name_needs_quotes (name);
475   if (needs_quotes)
476     {
477       quote = "\"";
478     }
479
480   if (stub_p)
481     suffix = STUB_SUFFIX;
482   else
483     suffix = NON_LAZY_POINTER_SUFFIX;
484
485   buffer = XALLOCAVEC (char, strlen ("&L")
486                    + strlen (prefix)
487                    + namelen
488                    + strlen (suffix)
489                    + 2 * strlen (quote)
490                    + 1 /* '\0' */);
491
492   /* Construct the name of the non-lazy pointer or stub.  */
493   sprintf (buffer, "&%sL%s%s%s%s", quote, prefix, name, suffix, quote);
494
495   if (!machopic_indirections)
496     machopic_indirections = htab_create_ggc (37,
497                                              machopic_indirection_hash,
498                                              machopic_indirection_eq,
499                                              /*htab_del=*/NULL);
500
501   slot = htab_find_slot_with_hash (machopic_indirections, buffer,
502                                    htab_hash_string (buffer), INSERT);
503   if (*slot)
504     {
505       p = (machopic_indirection *) *slot;
506     }
507   else
508     {
509       p = ggc_alloc_machopic_indirection ();
510       p->symbol = sym_ref;
511       p->ptr_name = xstrdup (buffer);
512       p->stub_p = stub_p;
513       p->used = false;
514       *slot = p;
515     }
516
517   return p->ptr_name;
518 }
519
520 /* Return the name of the stub for the mcount function.  */
521
522 const char*
523 machopic_mcount_stub_name (void)
524 {
525   rtx symbol = gen_rtx_SYMBOL_REF (Pmode, "*mcount");
526   return machopic_indirection_name (symbol, /*stub_p=*/true);
527 }
528
529 /* If NAME is the name of a stub or a non-lazy pointer , mark the stub
530    or non-lazy pointer as used -- and mark the object to which the
531    pointer/stub refers as used as well, since the pointer/stub will
532    emit a reference to it.  */
533
534 void
535 machopic_validate_stub_or_non_lazy_ptr (const char *name)
536 {
537   machopic_indirection *p;
538
539   p = ((machopic_indirection *)
540        (htab_find_with_hash (machopic_indirections, name,
541                              htab_hash_string (name))));
542   if (p && ! p->used)
543     {
544       const char *real_name;
545       tree id;
546
547       p->used = true;
548
549       /* Do what output_addr_const will do when we actually call it.  */
550       if (SYMBOL_REF_DECL (p->symbol))
551         mark_decl_referenced (SYMBOL_REF_DECL (p->symbol));
552
553       real_name = targetm.strip_name_encoding (XSTR (p->symbol, 0));
554
555       id = maybe_get_identifier (real_name);
556       if (id)
557         mark_referenced (id);
558     }
559 }
560
561 /* Transform ORIG, which may be any data source, to the corresponding
562    source using indirections.  */
563
564 rtx
565 machopic_indirect_data_reference (rtx orig, rtx reg)
566 {
567   rtx ptr_ref = orig;
568
569   if (! MACHOPIC_INDIRECT)
570     return orig;
571
572   if (GET_CODE (orig) == SYMBOL_REF)
573     {
574       int defined = machopic_data_defined_p (orig);
575
576       if (defined && MACHO_DYNAMIC_NO_PIC_P)
577         {
578           if (DARWIN_PPC)
579             {
580           /* Create a new register for CSE opportunities.  */
581           rtx hi_reg = (!can_create_pseudo_p () ? reg : gen_reg_rtx (Pmode));
582           emit_insn (gen_macho_high (hi_reg, orig));
583           emit_insn (gen_macho_low (reg, hi_reg, orig));
584               return reg;
585             }
586           else if (DARWIN_X86)
587             return orig;
588           else
589            /* some other cpu -- writeme!  */
590            gcc_unreachable ();
591         }
592       else if (defined)
593         {
594           rtx offset = NULL;
595           if (DARWIN_PPC || HAVE_lo_sum)
596             offset = machopic_gen_offset (orig);
597
598           if (DARWIN_PPC)
599             {
600           rtx hi_sum_reg = (!can_create_pseudo_p ()
601                             ? reg
602                             : gen_reg_rtx (Pmode));
603
604           gcc_assert (reg);
605
606           emit_insn (gen_rtx_SET (Pmode, hi_sum_reg,
607                               gen_rtx_PLUS (Pmode, pic_offset_table_rtx,
608                                        gen_rtx_HIGH (Pmode, offset))));
609           emit_insn (gen_rtx_SET (Pmode, reg,
610                                   gen_rtx_LO_SUM (Pmode, hi_sum_reg,
611                                                   copy_rtx (offset))));
612
613           orig = reg;
614             }
615           else if (HAVE_lo_sum)
616             {
617           gcc_assert (reg);
618
619           emit_insn (gen_rtx_SET (VOIDmode, reg,
620                                   gen_rtx_HIGH (Pmode, offset)));
621           emit_insn (gen_rtx_SET (VOIDmode, reg,
622                                   gen_rtx_LO_SUM (Pmode, reg,
623                                                   copy_rtx (offset))));
624           emit_use (pic_offset_table_rtx);
625
626           orig = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, reg);
627             }
628           return orig;
629         }
630
631       ptr_ref = (gen_rtx_SYMBOL_REF
632                  (Pmode,
633                   machopic_indirection_name (orig, /*stub_p=*/false)));
634
635       SYMBOL_REF_DATA (ptr_ref) = SYMBOL_REF_DATA (orig);
636
637       ptr_ref = gen_const_mem (Pmode, ptr_ref);
638       machopic_define_symbol (ptr_ref);
639
640       if (DARWIN_X86 
641           && reg 
642           && MACHO_DYNAMIC_NO_PIC_P)
643         {
644             emit_insn (gen_rtx_SET (Pmode, reg, ptr_ref));
645             ptr_ref = reg;
646         }
647
648       return ptr_ref;
649     }
650   else if (GET_CODE (orig) == CONST)
651     {
652       /* If "(const (plus ...", walk the PLUS and return that result.
653          PLUS processing (below) will restore the "(const ..." if
654          appropriate.  */
655       if (GET_CODE (XEXP (orig, 0)) == PLUS)
656         return machopic_indirect_data_reference (XEXP (orig, 0), reg);
657       else 
658         return orig;
659     }
660   else if (GET_CODE (orig) == MEM)
661     {
662       XEXP (ptr_ref, 0) = 
663                 machopic_indirect_data_reference (XEXP (orig, 0), reg);
664       return ptr_ref;
665     }
666   else if (GET_CODE (orig) == PLUS)
667     {
668       rtx base, result;
669       /* When the target is i386, this code prevents crashes due to the
670         compiler's ignorance on how to move the PIC base register to
671         other registers.  (The reload phase sometimes introduces such
672         insns.)  */
673       if (GET_CODE (XEXP (orig, 0)) == REG
674            && REGNO (XEXP (orig, 0)) == PIC_OFFSET_TABLE_REGNUM
675            /* Prevent the same register from being erroneously used
676               as both the base and index registers.  */
677            && (DARWIN_X86 && (GET_CODE (XEXP (orig, 1)) == CONST))
678            && reg)
679         {
680           emit_move_insn (reg, XEXP (orig, 0));
681           XEXP (ptr_ref, 0) = reg;
682           return ptr_ref;
683         }
684
685       /* Legitimize both operands of the PLUS.  */
686       base = machopic_indirect_data_reference (XEXP (orig, 0), reg);
687       orig = machopic_indirect_data_reference (XEXP (orig, 1),
688                                                (base == reg ? 0 : reg));
689       if (MACHOPIC_INDIRECT && (GET_CODE (orig) == CONST_INT))
690         result = plus_constant (base, INTVAL (orig));
691       else
692         result = gen_rtx_PLUS (Pmode, base, orig);
693
694       if (MACHOPIC_JUST_INDIRECT && GET_CODE (base) == MEM)
695         {
696           if (reg)
697             {
698               emit_move_insn (reg, result);
699               result = reg;
700             }
701           else
702             {
703               result = force_reg (GET_MODE (result), result);
704             }
705         }
706
707       return result;
708     }
709   return ptr_ref;
710 }
711
712 /* Transform TARGET (a MEM), which is a function call target, to the
713    corresponding symbol_stub if necessary.  Return a new MEM.  */
714
715 rtx
716 machopic_indirect_call_target (rtx target)
717 {
718   if (! darwin_emit_branch_islands)
719     return target;
720
721   if (GET_CODE (target) != MEM)
722     return target;
723
724   if (MACHOPIC_INDIRECT
725       && GET_CODE (XEXP (target, 0)) == SYMBOL_REF
726       && !(SYMBOL_REF_FLAGS (XEXP (target, 0))
727            & MACHO_SYMBOL_FLAG_DEFINED))
728     {
729       rtx sym_ref = XEXP (target, 0);
730       const char *stub_name = machopic_indirection_name (sym_ref,
731                                                          /*stub_p=*/true);
732       enum machine_mode mode = GET_MODE (sym_ref);
733
734       XEXP (target, 0) = gen_rtx_SYMBOL_REF (mode, stub_name);
735       SYMBOL_REF_DATA (XEXP (target, 0)) = SYMBOL_REF_DATA (sym_ref);
736       MEM_READONLY_P (target) = 1;
737       MEM_NOTRAP_P (target) = 1;
738     }
739
740   return target;
741 }
742
743 rtx
744 machopic_legitimize_pic_address (rtx orig, enum machine_mode mode, rtx reg)
745 {
746   rtx pic_ref = orig;
747
748   if (! MACHOPIC_INDIRECT)
749     return orig;
750
751   /* First handle a simple SYMBOL_REF or LABEL_REF */
752   if (GET_CODE (orig) == LABEL_REF
753       || (GET_CODE (orig) == SYMBOL_REF
754           ))
755     {
756       /* addr(foo) = &func+(foo-func) */
757       orig = machopic_indirect_data_reference (orig, reg);
758
759       if (GET_CODE (orig) == PLUS
760           && GET_CODE (XEXP (orig, 0)) == REG)
761         {
762           if (reg == 0)
763             return force_reg (mode, orig);
764
765           emit_move_insn (reg, orig);
766           return reg;
767         }
768
769       if (GET_CODE (orig) == MEM)
770         {
771           if (reg == 0)
772             {
773               gcc_assert (!reload_in_progress);
774               reg = gen_reg_rtx (Pmode);
775             }
776
777 #if HAVE_lo_sum
778           if (MACHO_DYNAMIC_NO_PIC_P
779               && (GET_CODE (XEXP (orig, 0)) == SYMBOL_REF
780                   || GET_CODE (XEXP (orig, 0)) == LABEL_REF))
781             {
782 #if defined (TARGET_TOC)        /* ppc  */
783               rtx temp_reg = (!can_create_pseudo_p ()
784                               ? reg :
785                               gen_reg_rtx (Pmode));
786               rtx asym = XEXP (orig, 0);
787               rtx mem;
788
789               emit_insn (gen_macho_high (temp_reg, asym));
790               mem = gen_const_mem (GET_MODE (orig),
791                                    gen_rtx_LO_SUM (Pmode, temp_reg,
792                                                    copy_rtx (asym)));
793               emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
794 #else
795               /* Some other CPU -- WriteMe! but right now there are no other
796                  platforms that can use dynamic-no-pic  */
797               gcc_unreachable ();
798 #endif
799               pic_ref = reg;
800             }
801           else
802           if (GET_CODE (XEXP (orig, 0)) == SYMBOL_REF
803               || GET_CODE (XEXP (orig, 0)) == LABEL_REF)
804             {
805               rtx offset = machopic_gen_offset (XEXP (orig, 0));
806 #if defined (TARGET_TOC) /* i.e., PowerPC */
807               /* Generating a new reg may expose opportunities for
808                  common subexpression elimination.  */
809               rtx hi_sum_reg = (!can_create_pseudo_p ()
810                                 ? reg
811                                 : gen_reg_rtx (Pmode));
812               rtx mem;
813               rtx insn;
814               rtx sum;
815
816               sum = gen_rtx_HIGH (Pmode, offset);
817               if (! MACHO_DYNAMIC_NO_PIC_P)
818                 sum = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, sum);
819
820               emit_insn (gen_rtx_SET (Pmode, hi_sum_reg, sum));
821
822               mem = gen_const_mem (GET_MODE (orig),
823                                   gen_rtx_LO_SUM (Pmode,
824                                                   hi_sum_reg,
825                                                   copy_rtx (offset)));
826               insn = emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
827               set_unique_reg_note (insn, REG_EQUAL, pic_ref);
828
829               pic_ref = reg;
830 #else
831               emit_use (gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM));
832
833               emit_insn (gen_rtx_SET (VOIDmode, reg,
834                                       gen_rtx_HIGH (Pmode,
835                                                     gen_rtx_CONST (Pmode,
836                                                                    offset))));
837               emit_insn (gen_rtx_SET (VOIDmode, reg,
838                                   gen_rtx_LO_SUM (Pmode, reg,
839                                            gen_rtx_CONST (Pmode,
840                                                           copy_rtx (offset)))));
841               pic_ref = gen_rtx_PLUS (Pmode,
842                                       pic_offset_table_rtx, reg);
843 #endif
844             }
845           else
846 #endif  /* HAVE_lo_sum */
847             {
848               rtx pic = pic_offset_table_rtx;
849               if (GET_CODE (pic) != REG)
850                 {
851                   emit_move_insn (reg, pic);
852                   pic = reg;
853                 }
854 #if 0
855               emit_use (gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM));
856 #endif
857
858               if (reload_in_progress)
859                 df_set_regs_ever_live (REGNO (pic), true);
860               pic_ref = gen_rtx_PLUS (Pmode, pic,
861                                       machopic_gen_offset (XEXP (orig, 0)));
862             }
863
864 #if !defined (TARGET_TOC)
865           emit_move_insn (reg, pic_ref);
866           pic_ref = gen_const_mem (GET_MODE (orig), reg);
867 #endif
868         }
869       else
870         {
871
872 #if HAVE_lo_sum
873           if (GET_CODE (orig) == SYMBOL_REF
874               || GET_CODE (orig) == LABEL_REF)
875             {
876               rtx offset = machopic_gen_offset (orig);
877 #if defined (TARGET_TOC) /* i.e., PowerPC */
878               rtx hi_sum_reg;
879
880               if (reg == 0)
881                 {
882                   gcc_assert (!reload_in_progress);
883                   reg = gen_reg_rtx (Pmode);
884                 }
885
886               hi_sum_reg = reg;
887
888               emit_insn (gen_rtx_SET (Pmode, hi_sum_reg,
889                                       (MACHO_DYNAMIC_NO_PIC_P)
890                                       ? gen_rtx_HIGH (Pmode, offset)
891                                       : gen_rtx_PLUS (Pmode,
892                                                       pic_offset_table_rtx,
893                                                       gen_rtx_HIGH (Pmode,
894                                                                     offset))));
895               emit_insn (gen_rtx_SET (VOIDmode, reg,
896                                       gen_rtx_LO_SUM (Pmode,
897                                                       hi_sum_reg,
898                                                       copy_rtx (offset))));
899               pic_ref = reg;
900 #else
901               emit_insn (gen_rtx_SET (VOIDmode, reg,
902                                       gen_rtx_HIGH (Pmode, offset)));
903               emit_insn (gen_rtx_SET (VOIDmode, reg,
904                                       gen_rtx_LO_SUM (Pmode, reg,
905                                                       copy_rtx (offset))));
906               pic_ref = gen_rtx_PLUS (Pmode,
907                                       pic_offset_table_rtx, reg);
908 #endif
909             }
910           else
911 #endif  /*  HAVE_lo_sum  */
912             {
913               if (REG_P (orig)
914                   || GET_CODE (orig) == SUBREG)
915                 {
916                   return orig;
917                 }
918               else
919                 {
920                   rtx pic = pic_offset_table_rtx;
921                   if (GET_CODE (pic) != REG)
922                     {
923                       emit_move_insn (reg, pic);
924                       pic = reg;
925                     }
926 #if 0
927                   emit_use (pic_offset_table_rtx);
928 #endif
929                   if (reload_in_progress)
930                     df_set_regs_ever_live (REGNO (pic), true);
931                   pic_ref = gen_rtx_PLUS (Pmode,
932                                           pic,
933                                           machopic_gen_offset (orig));
934                 }
935             }
936         }
937
938       if (GET_CODE (pic_ref) != REG)
939         {
940           if (reg != 0)
941             {
942               emit_move_insn (reg, pic_ref);
943               return reg;
944             }
945           else
946             {
947               return force_reg (mode, pic_ref);
948             }
949         }
950       else
951         {
952           return pic_ref;
953         }
954     }
955
956   else if (GET_CODE (orig) == SYMBOL_REF)
957     return orig;
958
959   else if (GET_CODE (orig) == PLUS
960            && (GET_CODE (XEXP (orig, 0)) == MEM
961                || GET_CODE (XEXP (orig, 0)) == SYMBOL_REF
962                || GET_CODE (XEXP (orig, 0)) == LABEL_REF)
963            && XEXP (orig, 0) != pic_offset_table_rtx
964            && GET_CODE (XEXP (orig, 1)) != REG)
965
966     {
967       rtx base;
968       int is_complex = (GET_CODE (XEXP (orig, 0)) == MEM);
969
970       base = machopic_legitimize_pic_address (XEXP (orig, 0), Pmode, reg);
971       orig = machopic_legitimize_pic_address (XEXP (orig, 1),
972                                               Pmode, (base == reg ? 0 : reg));
973       if (GET_CODE (orig) == CONST_INT)
974         {
975           pic_ref = plus_constant (base, INTVAL (orig));
976           is_complex = 1;
977         }
978       else
979         pic_ref = gen_rtx_PLUS (Pmode, base, orig);
980
981       if (reg && is_complex)
982         {
983           emit_move_insn (reg, pic_ref);
984           pic_ref = reg;
985         }
986       /* Likewise, should we set special REG_NOTEs here?  */
987     }
988
989   else if (GET_CODE (orig) == CONST)
990     {
991       return machopic_legitimize_pic_address (XEXP (orig, 0), Pmode, reg);
992     }
993
994   else if (GET_CODE (orig) == MEM
995            && GET_CODE (XEXP (orig, 0)) == SYMBOL_REF)
996     {
997       rtx addr = machopic_legitimize_pic_address (XEXP (orig, 0), Pmode, reg);
998       addr = replace_equiv_address (orig, addr);
999       emit_move_insn (reg, addr);
1000       pic_ref = reg;
1001     }
1002
1003   return pic_ref;
1004 }
1005
1006 /* Output the stub or non-lazy pointer in *SLOT, if it has been used.
1007    DATA is the FILE* for assembly output.  Called from
1008    htab_traverse.  */
1009
1010 static int
1011 machopic_output_indirection (void **slot, void *data)
1012 {
1013   machopic_indirection *p = *((machopic_indirection **) slot);
1014   FILE *asm_out_file = (FILE *) data;
1015   rtx symbol;
1016   const char *sym_name;
1017   const char *ptr_name;
1018
1019   if (!p->used)
1020     return 1;
1021
1022   symbol = p->symbol;
1023   sym_name = XSTR (symbol, 0);
1024   ptr_name = p->ptr_name;
1025
1026   if (p->stub_p)
1027     {
1028       char *sym;
1029       char *stub;
1030       tree id;
1031
1032       id = maybe_get_identifier (sym_name);
1033       if (id)
1034         {
1035           tree id_orig = id;
1036
1037           while (IDENTIFIER_TRANSPARENT_ALIAS (id))
1038             id = TREE_CHAIN (id);
1039           if (id != id_orig)
1040             sym_name = IDENTIFIER_POINTER (id);
1041         }
1042
1043       sym = XALLOCAVEC (char, strlen (sym_name) + 2);
1044       if (sym_name[0] == '*' || sym_name[0] == '&')
1045         strcpy (sym, sym_name + 1);
1046       else if (sym_name[0] == '-' || sym_name[0] == '+')
1047         strcpy (sym, sym_name);
1048       else
1049         sprintf (sym, "%s%s", user_label_prefix, sym_name);
1050
1051       stub = XALLOCAVEC (char, strlen (ptr_name) + 2);
1052       if (ptr_name[0] == '*' || ptr_name[0] == '&')
1053         strcpy (stub, ptr_name + 1);
1054       else
1055         sprintf (stub, "%s%s", user_label_prefix, ptr_name);
1056
1057       machopic_output_stub (asm_out_file, sym, stub);
1058     }
1059   else if (! indirect_data (symbol)
1060            && (machopic_symbol_defined_p (symbol)
1061                || SYMBOL_REF_LOCAL_P (symbol)))
1062     {
1063       switch_to_section (data_section);
1064       assemble_align (GET_MODE_ALIGNMENT (Pmode));
1065       assemble_label (asm_out_file, ptr_name);
1066       assemble_integer (gen_rtx_SYMBOL_REF (Pmode, sym_name),
1067                         GET_MODE_SIZE (Pmode),
1068                         GET_MODE_ALIGNMENT (Pmode), 1);
1069     }
1070   else
1071     {
1072       rtx init = const0_rtx;
1073
1074       switch_to_section (darwin_sections[machopic_nl_symbol_ptr_section]);
1075
1076       /* Mach-O symbols are passed around in code through indirect
1077          references and the original symbol_ref hasn't passed through
1078          the generic handling and reference-catching in
1079          output_operand, so we need to manually mark weak references
1080          as such.  */
1081       if (SYMBOL_REF_WEAK (symbol))
1082         {
1083           tree decl = SYMBOL_REF_DECL (symbol);
1084           gcc_assert (DECL_P (decl));
1085
1086           if (decl != NULL_TREE
1087               && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl)
1088               /* Handle only actual external-only definitions, not
1089                  e.g. extern inline code or variables for which
1090                  storage has been allocated.  */
1091               && !TREE_STATIC (decl))
1092             {
1093               fputs ("\t.weak_reference ", asm_out_file);
1094               assemble_name (asm_out_file, sym_name);
1095               fputc ('\n', asm_out_file);
1096             }
1097         }
1098
1099       assemble_name (asm_out_file, ptr_name);
1100       fprintf (asm_out_file, ":\n");
1101
1102       fprintf (asm_out_file, "\t.indirect_symbol ");
1103       assemble_name (asm_out_file, sym_name);
1104       fprintf (asm_out_file, "\n");
1105
1106       /* Variables that are marked with MACHO_SYMBOL_STATIC need to
1107          have their symbol name instead of 0 in the second entry of
1108          the non-lazy symbol pointer data structure when they are
1109          defined.  This allows the runtime to rebind newer instances
1110          of the translation unit with the original instance of the
1111          symbol.  */
1112
1113       if ((SYMBOL_REF_FLAGS (symbol) & MACHO_SYMBOL_STATIC)
1114           && machopic_symbol_defined_p (symbol))
1115         init = gen_rtx_SYMBOL_REF (Pmode, sym_name);
1116
1117       assemble_integer (init, GET_MODE_SIZE (Pmode),
1118                         GET_MODE_ALIGNMENT (Pmode), 1);
1119     }
1120
1121   return 1;
1122 }
1123
1124 void
1125 machopic_finish (FILE *asm_out_file)
1126 {
1127   if (machopic_indirections)
1128     htab_traverse_noresize (machopic_indirections,
1129                             machopic_output_indirection,
1130                             asm_out_file);
1131 }
1132
1133 int
1134 machopic_operand_p (rtx op)
1135 {
1136   if (MACHOPIC_JUST_INDIRECT)
1137     return (GET_CODE (op) == SYMBOL_REF
1138             && machopic_symbol_defined_p (op));
1139   else
1140     return (GET_CODE (op) == CONST
1141             && GET_CODE (XEXP (op, 0)) == UNSPEC
1142             && XINT (XEXP (op, 0), 1) == UNSPEC_MACHOPIC_OFFSET);
1143 }
1144
1145 /* This function records whether a given name corresponds to a defined
1146    or undefined function or variable, for machopic_classify_ident to
1147    use later.  */
1148
1149 void
1150 darwin_encode_section_info (tree decl, rtx rtl, int first ATTRIBUTE_UNUSED)
1151 {
1152   rtx sym_ref;
1153
1154   /* Do the standard encoding things first.  */
1155   default_encode_section_info (decl, rtl, first);
1156
1157   if (TREE_CODE (decl) != FUNCTION_DECL && TREE_CODE (decl) != VAR_DECL)
1158     return;
1159
1160   sym_ref = XEXP (rtl, 0);
1161   if (TREE_CODE (decl) == VAR_DECL)
1162     SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_FLAG_VARIABLE;
1163
1164   if (!DECL_EXTERNAL (decl)
1165       && (!TREE_PUBLIC (decl) || !DECL_WEAK (decl))
1166       && ! lookup_attribute ("weakref", DECL_ATTRIBUTES (decl))
1167       && ((TREE_STATIC (decl)
1168            && (!DECL_COMMON (decl) || !TREE_PUBLIC (decl)))
1169           || (!DECL_COMMON (decl) && DECL_INITIAL (decl)
1170               && DECL_INITIAL (decl) != error_mark_node)))
1171     SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_FLAG_DEFINED;
1172
1173   if (! TREE_PUBLIC (decl))
1174     SYMBOL_REF_FLAGS (sym_ref) |= MACHO_SYMBOL_STATIC;
1175 }
1176
1177 void
1178 darwin_mark_decl_preserved (const char *name)
1179 {
1180   fprintf (asm_out_file, "\t.no_dead_strip ");
1181   assemble_name (asm_out_file, name);
1182   fputc ('\n', asm_out_file);
1183 }
1184
1185 static section *
1186 darwin_rodata_section (int weak, bool zsize)
1187 {
1188   return (weak
1189           ? darwin_sections[const_coal_section]
1190           : (zsize ? darwin_sections[zobj_const_section]
1191                    : darwin_sections[const_section]));
1192 }
1193
1194 static section *
1195 darwin_mergeable_string_section (tree exp,
1196                                  unsigned HOST_WIDE_INT align)
1197 {
1198   /* Darwin's ld expects to see non-writable string literals in the .cstring 
1199      section.  Later versions of ld check and complain when CFStrings are 
1200      enabled.  Therefore we shall force the strings into .cstring since we
1201      don't support writable ones anyway.  */
1202   if ((darwin_constant_cfstrings || flag_merge_constants)
1203       && TREE_CODE (exp) == STRING_CST
1204       && TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE
1205       && align <= 256
1206       && (int_size_in_bytes (TREE_TYPE (exp))
1207           == TREE_STRING_LENGTH (exp))
1208       && ((size_t) TREE_STRING_LENGTH (exp)
1209           == strlen (TREE_STRING_POINTER (exp)) + 1))
1210     return darwin_sections[cstring_section];
1211
1212   if (DARWIN_SECTION_ANCHORS && flag_section_anchors
1213       && TREE_CODE (exp) == STRING_CST
1214       && TREE_STRING_LENGTH (exp) == 0)
1215     return darwin_sections[zobj_const_section];
1216
1217   return readonly_data_section;
1218 }
1219
1220 #ifndef HAVE_GAS_LITERAL16
1221 #define HAVE_GAS_LITERAL16 0
1222 #endif
1223
1224 static section *
1225 darwin_mergeable_constant_section (tree exp,
1226                                    unsigned HOST_WIDE_INT align,
1227                                    bool zsize)
1228 {
1229   enum machine_mode mode = DECL_MODE (exp);
1230   unsigned int modesize = GET_MODE_BITSIZE (mode);
1231
1232   if (DARWIN_SECTION_ANCHORS 
1233       && flag_section_anchors 
1234       && zsize)
1235     return darwin_sections[zobj_const_section];
1236
1237   if (flag_merge_constants
1238       && mode != VOIDmode
1239       && mode != BLKmode
1240       && modesize <= align
1241       && align >= 8
1242       && align <= 256
1243       && (align & (align -1)) == 0)
1244     {
1245       tree size = TYPE_SIZE_UNIT (TREE_TYPE (exp));
1246
1247       if (TREE_CODE (size) == INTEGER_CST
1248           && TREE_INT_CST_LOW (size) == 4
1249           && TREE_INT_CST_HIGH (size) == 0)
1250         return darwin_sections[literal4_section];
1251       else if (TREE_CODE (size) == INTEGER_CST
1252                && TREE_INT_CST_LOW (size) == 8
1253                && TREE_INT_CST_HIGH (size) == 0)
1254         return darwin_sections[literal8_section];
1255       else if (HAVE_GAS_LITERAL16
1256                && TARGET_64BIT
1257                && TREE_CODE (size) == INTEGER_CST
1258                && TREE_INT_CST_LOW (size) == 16
1259                && TREE_INT_CST_HIGH (size) == 0)
1260         return darwin_sections[literal16_section];
1261       else
1262         return readonly_data_section;
1263     }
1264
1265   return readonly_data_section;
1266 }
1267
1268 int
1269 machopic_reloc_rw_mask (void)
1270 {
1271   return MACHOPIC_INDIRECT ? 3 : 0;
1272 }
1273
1274 /* We have to deal with ObjC/C++ metadata section placement in the common
1275    code, since it will also be called from LTO.
1276    
1277    Return metadata attributes, if present (searching for ABI=2 first)
1278    Return NULL_TREE if no such attributes are found.  */
1279
1280 static tree
1281 is_objc_metadata (tree decl)
1282 {
1283   if (DECL_P (decl) 
1284       && (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == CONST_DECL)
1285       && DECL_ATTRIBUTES (decl))
1286     {
1287       tree meta = lookup_attribute ("OBJC2META", DECL_ATTRIBUTES (decl));
1288       if (meta)
1289         return meta;
1290       meta = lookup_attribute ("OBJC1META", DECL_ATTRIBUTES (decl));
1291       if (meta)
1292         return meta;
1293     }
1294   return NULL_TREE;
1295 }
1296
1297 /* Return the section required for Objective C ABI 2 metadata.  */
1298 static section *
1299 darwin_objc2_section (tree decl ATTRIBUTE_UNUSED, tree meta, section * base)
1300 {
1301   const char *p;
1302   tree ident = TREE_VALUE (meta);
1303   gcc_assert (TREE_CODE (ident) == IDENTIFIER_NODE);
1304   p = IDENTIFIER_POINTER (ident);
1305
1306   /* If we are in LTO, then we don't know the state of flag_next_runtime
1307      or flag_objc_abi when the code was generated.  We set these from the
1308      meta-data - which is needed to deal with const string constructors.  */
1309
1310   flag_next_runtime = 1;
1311   flag_objc_abi = 2;
1312
1313   if (base == data_section)
1314     base = darwin_sections[objc2_metadata_section];
1315
1316   /* Most of the OBJC2 META-data end up in the base section, so check it
1317      first.  */
1318   if      (!strncmp (p, "V2_BASE", 7))
1319     return base;
1320   else if (!strncmp (p, "V2_STRG", 7))
1321     return darwin_sections[cstring_section];
1322
1323   else if (!strncmp (p, "G2_META", 7) || !strncmp (p, "G2_CLAS", 7))
1324     return darwin_sections[objc2_classdefs_section];
1325   else if (!strncmp (p, "V2_MREF", 7))
1326     return darwin_sections[objc2_message_refs_section];
1327   else if (!strncmp (p, "V2_CLRF", 7))
1328     return darwin_sections[objc2_classrefs_section];
1329   else if (!strncmp (p, "V2_SURF", 7))
1330     return darwin_sections[objc2_super_classrefs_section];
1331   else if (!strncmp (p, "V2_NLCL", 7))
1332     return darwin_sections[objc2_nonlazy_class_section];
1333   else if (!strncmp (p, "V2_CLAB", 7))
1334     return darwin_sections[objc2_classlist_section];
1335   else if (!strncmp (p, "V2_SRFS", 7))
1336     return darwin_sections[objc2_selector_refs_section];
1337   else if (!strncmp (p, "V2_NLCA", 7))
1338     return darwin_sections[objc2_nonlazy_category_section];
1339   else if (!strncmp (p, "V2_CALA", 7))
1340     return darwin_sections[objc2_categorylist_section];
1341
1342   else if (!strncmp (p, "V2_PLST", 7))
1343     return darwin_sections[objc2_protocollist_section];
1344   else if (!strncmp (p, "V2_PRFS", 7))
1345     return darwin_sections[objc2_protocolrefs_section];
1346
1347   else if (!strncmp (p, "V2_INFO", 7))
1348     return darwin_sections[objc2_image_info_section];
1349
1350   else if (!strncmp (p, "V2_EHTY", 7))
1351     return darwin_sections[data_coal_section];
1352
1353   else if (!strncmp (p, "V2_CSTR", 7))
1354     return darwin_sections[objc2_constant_string_object_section];
1355
1356   /* Not recognized, default.  */
1357   return base;
1358 }
1359
1360 /* Return the section required for Objective C ABI 0/1 metadata.  */
1361 static section *
1362 darwin_objc1_section (tree decl ATTRIBUTE_UNUSED, tree meta, section * base)
1363 {
1364   const char *p;
1365   tree ident = TREE_VALUE (meta);
1366   gcc_assert (TREE_CODE (ident) == IDENTIFIER_NODE);
1367   p = IDENTIFIER_POINTER (ident);
1368
1369   /* If we are in LTO, then we don't know the state of flag_next_runtime
1370      or flag_objc_abi when the code was generated.  We set these from the
1371      meta-data - which is needed to deal with const string constructors.  */
1372   flag_next_runtime = 1;
1373   if (!global_options_set.x_flag_objc_abi)
1374     flag_objc_abi = 1;
1375
1376   /* String sections first, cos there are lots of strings.  */
1377   if      (!strncmp (p, "V1_STRG", 7))
1378     return darwin_sections[cstring_section];
1379   else if (!strncmp (p, "V1_CLSN", 7))
1380     return darwin_sections[objc_class_names_section];
1381   else if (!strncmp (p, "V1_METN", 7))
1382     return darwin_sections[objc_meth_var_names_section];
1383   else if (!strncmp (p, "V1_METT", 7))
1384     return darwin_sections[objc_meth_var_types_section];
1385
1386   else if (!strncmp (p, "V1_CLAS", 7))
1387     return darwin_sections[objc_class_section];
1388   else if (!strncmp (p, "V1_META", 7))
1389     return darwin_sections[objc_meta_class_section];
1390   else if (!strncmp (p, "V1_CATG", 7))
1391     return darwin_sections[objc_category_section];
1392   else if (!strncmp (p, "V1_PROT", 7))
1393     return darwin_sections[objc_protocol_section];
1394
1395   else if (!strncmp (p, "V1_CLCV", 7))
1396     return darwin_sections[objc_class_vars_section];
1397   else if (!strncmp (p, "V1_CLIV", 7))
1398     return darwin_sections[objc_instance_vars_section];
1399
1400   else if (!strncmp (p, "V1_CLCM", 7))
1401     return darwin_sections[objc_cls_meth_section];
1402   else if (!strncmp (p, "V1_CLIM", 7))
1403     return darwin_sections[objc_inst_meth_section];
1404   else if (!strncmp (p, "V1_CACM", 7))
1405     return darwin_sections[objc_cat_cls_meth_section];
1406   else if (!strncmp (p, "V1_CAIM", 7))
1407     return darwin_sections[objc_cat_inst_meth_section];
1408   else if (!strncmp (p, "V1_PNSM", 7))
1409     return darwin_sections[objc_cat_inst_meth_section];
1410   else if (!strncmp (p, "V1_PCLM", 7))
1411     return darwin_sections[objc_cat_cls_meth_section];
1412
1413   else if (!strncmp (p, "V1_CLPR", 7))
1414     return darwin_sections[objc_cat_cls_meth_section];
1415   else if (!strncmp (p, "V1_CAPR", 7))
1416     return darwin_sections[objc_category_section]; /* ??? CHECK me.  */
1417
1418   else if (!strncmp (p, "V1_PRFS", 7))
1419     return darwin_sections[objc_cat_cls_meth_section];
1420   else if (!strncmp (p, "V1_CLRF", 7))
1421     return darwin_sections[objc_cls_refs_section];
1422   else if (!strncmp (p, "V1_SRFS", 7))
1423     return darwin_sections[objc_selector_refs_section];
1424
1425   else if (!strncmp (p, "V1_MODU", 7))
1426     return darwin_sections[objc_module_info_section];
1427   else if (!strncmp (p, "V1_SYMT", 7))
1428     return darwin_sections[objc_symbols_section];
1429   else if (!strncmp (p, "V1_INFO", 7))
1430     return darwin_sections[objc_image_info_section];
1431
1432   else if (!strncmp (p, "V1_PLST", 7))
1433     return darwin_sections[objc1_prop_list_section];
1434   else if (!strncmp (p, "V1_PEXT", 7))
1435     return darwin_sections[objc1_protocol_ext_section];
1436   else if (!strncmp (p, "V1_CEXT", 7))
1437     return darwin_sections[objc1_class_ext_section];
1438
1439   else if (!strncmp (p, "V2_CSTR", 7))
1440     return darwin_sections[objc_constant_string_object_section];
1441
1442   return base;
1443 }
1444
1445 section *
1446 machopic_select_section (tree decl,
1447                          int reloc,
1448                          unsigned HOST_WIDE_INT align)
1449 {
1450   bool zsize, one, weak, ro;
1451   section *base_section = NULL;
1452
1453   weak = (DECL_P (decl)
1454           && DECL_WEAK (decl)
1455           && !lookup_attribute ("weak_import", DECL_ATTRIBUTES (decl)));
1456
1457   zsize = (DECL_P (decl) 
1458            && (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == CONST_DECL) 
1459            && tree_low_cst (DECL_SIZE_UNIT (decl), 1) == 0);
1460
1461   one = DECL_P (decl) 
1462         && TREE_CODE (decl) == VAR_DECL 
1463         && DECL_ONE_ONLY (decl);
1464
1465   ro = TREE_READONLY (decl) || TREE_CONSTANT (decl) ;
1466
1467   switch (categorize_decl_for_section (decl, reloc))
1468     {
1469     case SECCAT_TEXT:
1470       gcc_unreachable ();
1471       break;
1472
1473     case SECCAT_RODATA:
1474     case SECCAT_SRODATA:
1475       base_section = darwin_rodata_section (weak, zsize);
1476       break;
1477
1478     case SECCAT_RODATA_MERGE_STR:
1479       base_section = darwin_mergeable_string_section (decl, align);
1480       break;
1481
1482     case SECCAT_RODATA_MERGE_STR_INIT:
1483       base_section = darwin_mergeable_string_section (DECL_INITIAL (decl), align);
1484       break;
1485
1486     case SECCAT_RODATA_MERGE_CONST:
1487       base_section =  darwin_mergeable_constant_section (decl, align, zsize);
1488       break;
1489
1490     case SECCAT_DATA:
1491     case SECCAT_DATA_REL:
1492     case SECCAT_DATA_REL_LOCAL:
1493     case SECCAT_DATA_REL_RO:
1494     case SECCAT_DATA_REL_RO_LOCAL:
1495     case SECCAT_SDATA:
1496     case SECCAT_TDATA:
1497       if (weak || one)
1498         {
1499           if (ro)
1500             base_section = darwin_sections[const_data_coal_section];
1501           else 
1502             base_section = darwin_sections[data_coal_section];
1503         }
1504       else if (DARWIN_SECTION_ANCHORS 
1505                && flag_section_anchors
1506                && zsize)
1507         {
1508           /* If we're doing section anchors, then punt zero-sized objects into
1509              their own sections so that they don't interfere with offset
1510              computation for the remaining vars.  This does not need to be done
1511              for stuff in mergeable sections, since these are ineligible for 
1512              anchors.  */
1513           if (ro)
1514             base_section = darwin_sections[zobj_const_data_section];
1515           else
1516             base_section = darwin_sections[zobj_data_section];
1517         }
1518       else if (ro)
1519         base_section = darwin_sections[const_data_section];
1520       else
1521         base_section = data_section;
1522       break;
1523     case SECCAT_BSS:
1524     case SECCAT_SBSS:
1525     case SECCAT_TBSS:
1526       if (weak || one) 
1527         base_section = darwin_sections[data_coal_section];
1528       else
1529         {
1530           if (!TREE_PUBLIC (decl))
1531             base_section = lcomm_section;
1532           else if (bss_noswitch_section)
1533             base_section = bss_noswitch_section;
1534           else
1535             base_section = data_section;
1536         }
1537       break;
1538
1539     default:
1540       gcc_unreachable ();
1541     }
1542
1543   /* Darwin weird special cases.  
1544      a) OBJC Meta-data. */
1545   if (DECL_P (decl) 
1546       && (TREE_CODE (decl) == VAR_DECL 
1547           || TREE_CODE (decl) == CONST_DECL)
1548       && DECL_ATTRIBUTES (decl))
1549     {
1550       tree meta = lookup_attribute ("OBJC2META", DECL_ATTRIBUTES (decl));
1551       if (meta)
1552         return darwin_objc2_section (decl, meta, base_section);
1553       meta = lookup_attribute ("OBJC1META", DECL_ATTRIBUTES (decl));
1554       if (meta)
1555         return darwin_objc1_section (decl, meta, base_section);
1556       meta = lookup_attribute ("OBJC1METG", DECL_ATTRIBUTES (decl));
1557       if (meta)
1558         return base_section; /* GNU runtime is happy with it all in one pot.  */
1559     }
1560
1561   /* b) Constant string objects.  */
1562   if (TREE_CODE (decl) == CONSTRUCTOR
1563       && TREE_TYPE (decl)
1564       && TREE_CODE (TREE_TYPE (decl)) == RECORD_TYPE
1565       && TYPE_NAME (TREE_TYPE (decl)))
1566     {
1567       tree name = TYPE_NAME (TREE_TYPE (decl));
1568       if (TREE_CODE (name) == TYPE_DECL)
1569         name = DECL_NAME (name);
1570
1571       /* FIXME: This is unsatisfactory for LTO, since it relies on other
1572          metadata determining the source FE.  */
1573       if (!strcmp (IDENTIFIER_POINTER (name), "__builtin_ObjCString"))
1574         {
1575           if (flag_next_runtime)
1576             {
1577               if (flag_objc_abi == 2)
1578                 return darwin_sections[objc2_constant_string_object_section];
1579               else
1580                 return darwin_sections[objc_constant_string_object_section];
1581             }
1582           else
1583             return darwin_sections[objc_string_object_section];
1584         }
1585       else if (!strcmp (IDENTIFIER_POINTER (name), "__builtin_CFString"))
1586         return darwin_sections[cfstring_constant_object_section];
1587       else
1588         return base_section;
1589     }
1590   /* c) legacy meta-data selection.  */
1591   else if (TREE_CODE (decl) == VAR_DECL
1592            && DECL_NAME (decl)
1593            && TREE_CODE (DECL_NAME (decl)) == IDENTIFIER_NODE
1594            && IDENTIFIER_POINTER (DECL_NAME (decl))
1595            && flag_next_runtime
1596            && !strncmp (IDENTIFIER_POINTER (DECL_NAME (decl)), "_OBJC_", 6))
1597     {
1598       const char *name = IDENTIFIER_POINTER (DECL_NAME (decl));
1599       static bool warned_objc_46 = false;
1600       /* We shall assert that zero-sized objects are an error in ObjC 
1601          meta-data.  */
1602       gcc_assert (tree_low_cst (DECL_SIZE_UNIT (decl), 1) != 0);
1603       
1604       /* ??? This mechanism for determining the metadata section is
1605          broken when LTO is in use, since the frontend that generated
1606          the data is not identified.  We will keep the capability for
1607          the short term - in case any non-Objective-C programs are using
1608          it to place data in specified sections.  */
1609       if (!warned_objc_46)
1610         {
1611           location_t loc = DECL_SOURCE_LOCATION (decl);
1612           warning_at (loc, 0, "the use of _OBJC_-prefixed variable names"
1613                       " to select meta-data sections is deprecated at 4.6"
1614                       " and will be removed in 4.7");
1615           warned_objc_46 = true;
1616         }
1617       
1618       if (!strncmp (name, "_OBJC_CLASS_METHODS_", 20))
1619         return darwin_sections[objc_cls_meth_section];
1620       else if (!strncmp (name, "_OBJC_INSTANCE_METHODS_", 23))
1621         return darwin_sections[objc_inst_meth_section];
1622       else if (!strncmp (name, "_OBJC_CATEGORY_CLASS_METHODS_", 29))
1623         return darwin_sections[objc_cat_cls_meth_section];
1624       else if (!strncmp (name, "_OBJC_CATEGORY_INSTANCE_METHODS_", 32))
1625         return darwin_sections[objc_cat_inst_meth_section];
1626       else if (!strncmp (name, "_OBJC_CLASS_VARIABLES_", 22))
1627         return darwin_sections[objc_class_vars_section];
1628       else if (!strncmp (name, "_OBJC_INSTANCE_VARIABLES_", 25))
1629         return darwin_sections[objc_instance_vars_section];
1630       else if (!strncmp (name, "_OBJC_CLASS_PROTOCOLS_", 22))
1631         return darwin_sections[objc_cat_cls_meth_section];
1632       else if (!strncmp (name, "_OBJC_CLASS_NAME_", 17))
1633         return darwin_sections[objc_class_names_section];
1634       else if (!strncmp (name, "_OBJC_METH_VAR_NAME_", 20))
1635         return darwin_sections[objc_meth_var_names_section];
1636       else if (!strncmp (name, "_OBJC_METH_VAR_TYPE_", 20))
1637         return darwin_sections[objc_meth_var_types_section];
1638       else if (!strncmp (name, "_OBJC_CLASS_REFERENCES", 22))
1639         return darwin_sections[objc_cls_refs_section];
1640       else if (!strncmp (name, "_OBJC_CLASS_", 12))
1641         return darwin_sections[objc_class_section];
1642       else if (!strncmp (name, "_OBJC_METACLASS_", 16))
1643         return darwin_sections[objc_meta_class_section];
1644       else if (!strncmp (name, "_OBJC_CATEGORY_", 15))
1645         return darwin_sections[objc_category_section];
1646       else if (!strncmp (name, "_OBJC_SELECTOR_REFERENCES", 25))
1647         return darwin_sections[objc_selector_refs_section];
1648       else if (!strncmp (name, "_OBJC_SELECTOR_FIXUP", 20))
1649         return darwin_sections[objc_selector_fixup_section];
1650       else if (!strncmp (name, "_OBJC_SYMBOLS", 13))
1651         return darwin_sections[objc_symbols_section];
1652       else if (!strncmp (name, "_OBJC_MODULES", 13))
1653         return darwin_sections[objc_module_info_section];
1654       else if (!strncmp (name, "_OBJC_IMAGE_INFO", 16))
1655         return darwin_sections[objc_image_info_section];
1656       else if (!strncmp (name, "_OBJC_PROTOCOL_INSTANCE_METHODS_", 32))
1657         return darwin_sections[objc_cat_inst_meth_section];
1658       else if (!strncmp (name, "_OBJC_PROTOCOL_CLASS_METHODS_", 29))
1659         return darwin_sections[objc_cat_cls_meth_section];
1660       else if (!strncmp (name, "_OBJC_PROTOCOL_REFS_", 20))
1661         return darwin_sections[objc_cat_cls_meth_section];
1662       else if (!strncmp (name, "_OBJC_PROTOCOL_", 15))
1663         return darwin_sections[objc_protocol_section];
1664       else
1665         return base_section;
1666     }
1667
1668   return base_section;
1669 }
1670
1671 /* This can be called with address expressions as "rtx".
1672    They must go in "const".  */
1673
1674 section *
1675 machopic_select_rtx_section (enum machine_mode mode, rtx x,
1676                              unsigned HOST_WIDE_INT align ATTRIBUTE_UNUSED)
1677 {
1678   if (GET_MODE_SIZE (mode) == 8
1679       && (GET_CODE (x) == CONST_INT
1680           || GET_CODE (x) == CONST_DOUBLE))
1681     return darwin_sections[literal8_section];
1682   else if (GET_MODE_SIZE (mode) == 4
1683            && (GET_CODE (x) == CONST_INT
1684                || GET_CODE (x) == CONST_DOUBLE))
1685     return darwin_sections[literal4_section];
1686   else if (HAVE_GAS_LITERAL16
1687            && TARGET_64BIT
1688            && GET_MODE_SIZE (mode) == 16
1689            && (GET_CODE (x) == CONST_INT
1690                || GET_CODE (x) == CONST_DOUBLE
1691                || GET_CODE (x) == CONST_VECTOR))
1692     return darwin_sections[literal16_section];
1693   else if (MACHOPIC_INDIRECT
1694            && (GET_CODE (x) == SYMBOL_REF
1695                || GET_CODE (x) == CONST
1696                || GET_CODE (x) == LABEL_REF))
1697     return darwin_sections[const_data_section];
1698   else
1699     return darwin_sections[const_section];
1700 }
1701
1702 void
1703 machopic_asm_out_constructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
1704 {
1705   if (MACHOPIC_INDIRECT)
1706     switch_to_section (darwin_sections[mod_init_section]);
1707   else
1708     switch_to_section (darwin_sections[constructor_section]);
1709   assemble_align (POINTER_SIZE);
1710   assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1711
1712   if (! MACHOPIC_INDIRECT)
1713     fprintf (asm_out_file, ".reference .constructors_used\n");
1714 }
1715
1716 void
1717 machopic_asm_out_destructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
1718 {
1719   if (MACHOPIC_INDIRECT)
1720     switch_to_section (darwin_sections[mod_term_section]);
1721   else
1722     switch_to_section (darwin_sections[destructor_section]);
1723   assemble_align (POINTER_SIZE);
1724   assemble_integer (symbol, POINTER_SIZE / BITS_PER_UNIT, POINTER_SIZE, 1);
1725
1726   if (! MACHOPIC_INDIRECT)
1727     fprintf (asm_out_file, ".reference .destructors_used\n");
1728 }
1729
1730 void
1731 darwin_globalize_label (FILE *stream, const char *name)
1732 {
1733   if (!!strncmp (name, "_OBJC_", 6))
1734     default_globalize_label (stream, name);
1735 }
1736
1737 /* This routine returns non-zero if 'name' starts with the special objective-c 
1738    anonymous file-scope static name.  It accommodates c++'s mangling of such 
1739    symbols (in this case the symbols will have form _ZL{d}*_OBJC_* d=digit).  */
1740    
1741 int 
1742 darwin_label_is_anonymous_local_objc_name (const char *name)
1743 {
1744   const unsigned char *p = (const unsigned char *) name;
1745   if (*p != '_')
1746     return 0;
1747   if (p[1] == 'Z' && p[2] == 'L')
1748   {
1749     p += 3;
1750     while (*p >= '0' && *p <= '9')
1751       p++;
1752   }
1753   return (!strncmp ((const char *)p, "_OBJC_", 6));
1754 }
1755
1756 /* LTO support for Mach-O.
1757
1758    This version uses three mach-o sections to encapsulate the (unlimited
1759    number of) lto sections.
1760
1761    __GNU_LTO, __lto_sections  contains the concatented GNU LTO section data.
1762    __GNU_LTO, __section_names contains the GNU LTO section names.
1763    __GNU_LTO, __section_index contains an array of values that index these.
1764
1765    Indexed thus:
1766      <section offset from the start of __GNU_LTO, __lto_sections>,
1767      <section length>
1768      <name offset from the start of __GNU_LTO, __section_names,
1769      <name length>.
1770
1771    At present, for both m32 and m64 mach-o files each of these fields is
1772    represented  by a uint32_t.  This is because, AFAICT, a mach-o object
1773    cannot exceed 4Gb because the section_64 offset field (see below) is 32bits.
1774
1775     uint32_t offset;
1776    "offset  An integer specifying the offset to this section in the file."  */
1777
1778 /* Count lto section numbers.  */
1779 static unsigned int lto_section_num = 0;
1780
1781 /* A vector of information about LTO sections, at present, we only have
1782    the name.  TODO: see if we can get the data length somehow.  */
1783 typedef struct GTY (()) darwin_lto_section_e {
1784   const char *sectname;
1785 } darwin_lto_section_e ;
1786 DEF_VEC_O(darwin_lto_section_e);
1787 DEF_VEC_ALLOC_O(darwin_lto_section_e, gc);
1788
1789 static GTY (()) VEC (darwin_lto_section_e, gc) * lto_section_names;
1790
1791 /* Segment for LTO data.  */
1792 #define LTO_SEGMENT_NAME "__GNU_LTO"
1793
1794 /* Section wrapper scheme (used here to wrap the unlimited number of LTO
1795    sections into three Mach-O ones).
1796    NOTE: These names MUST be kept in sync with those in
1797          libiberty/simple-object-mach-o.  */
1798 #define LTO_SECTS_SECTION "__wrapper_sects"
1799 #define LTO_NAMES_SECTION "__wrapper_names"
1800 #define LTO_INDEX_SECTION "__wrapper_index"
1801
1802 /* File to temporarily store LTO data.  This is appended to asm_out_file
1803    in darwin_end_file.  */
1804 static FILE *lto_asm_out_file, *saved_asm_out_file;
1805 static char *lto_asm_out_name;
1806
1807 /* Prepare asm_out_file for LTO output.  For darwin, this means hiding
1808    asm_out_file and switching to an alternative output file.  */
1809 void
1810 darwin_asm_lto_start (void)
1811 {
1812   gcc_assert (! saved_asm_out_file);
1813   saved_asm_out_file = asm_out_file;
1814   if (! lto_asm_out_name)
1815     lto_asm_out_name = make_temp_file (".lto.s");
1816   lto_asm_out_file = fopen (lto_asm_out_name, "a");
1817   if (lto_asm_out_file == NULL)
1818     fatal_error ("failed to open temporary file %s for LTO output",
1819                  lto_asm_out_name);
1820   asm_out_file = lto_asm_out_file;
1821 }
1822
1823 /* Restore asm_out_file.  */
1824 void
1825 darwin_asm_lto_end (void)
1826 {
1827   gcc_assert (saved_asm_out_file);
1828   fclose (lto_asm_out_file);
1829   asm_out_file = saved_asm_out_file;
1830   saved_asm_out_file = NULL;
1831 }
1832
1833 static void
1834 darwin_asm_dwarf_section (const char *name, unsigned int flags, tree decl);
1835
1836 /*  Called for the TARGET_ASM_NAMED_SECTION hook.  */
1837
1838 void
1839 darwin_asm_named_section (const char *name,
1840                           unsigned int flags,
1841                           tree decl ATTRIBUTE_UNUSED)
1842 {
1843   /* LTO sections go in a special section that encapsulates the (unlimited)
1844      number of GNU LTO sections within a single mach-o one.  */
1845   if (strncmp (name, LTO_SECTION_NAME_PREFIX,
1846                strlen (LTO_SECTION_NAME_PREFIX)) == 0)
1847     {
1848       darwin_lto_section_e e;
1849       /* We expect certain flags to be set...  */
1850       gcc_assert ((flags & (SECTION_DEBUG | SECTION_NAMED))
1851                   == (SECTION_DEBUG | SECTION_NAMED));
1852
1853       /* Switch to our combined section.  */
1854       fprintf (asm_out_file, "\t.section %s,%s,regular,debug\n",
1855                LTO_SEGMENT_NAME, LTO_SECTS_SECTION);
1856       /* Output a label for the start of this sub-section.  */
1857       fprintf (asm_out_file, "L_GNU_LTO%d:\t;# %s\n",
1858                lto_section_num, name);
1859       /* We have to jump through hoops to get the values of the intra-section
1860          offsets... */
1861       fprintf (asm_out_file, "\t.set L$gnu$lto$offs%d,L_GNU_LTO%d-L_GNU_LTO0\n",
1862                lto_section_num, lto_section_num);
1863       fprintf (asm_out_file,
1864                "\t.set L$gnu$lto$size%d,L_GNU_LTO%d-L_GNU_LTO%d\n",
1865                lto_section_num, lto_section_num+1, lto_section_num);
1866       lto_section_num++;
1867       e.sectname = xstrdup (name);
1868       /* Keep the names, we'll need to make a table later.
1869          TODO: check that we do not revisit sections, that would break
1870          the assumption of how this is done.  */
1871       if (lto_section_names == NULL)
1872         lto_section_names = VEC_alloc (darwin_lto_section_e, gc, 16);
1873       VEC_safe_push (darwin_lto_section_e, gc, lto_section_names, &e);
1874    }
1875   else if (strncmp (name, "__DWARF,", 8) == 0)
1876     darwin_asm_dwarf_section (name, flags, decl);
1877   else
1878     fprintf (asm_out_file, "\t.section %s\n", name);
1879 }
1880
1881 void
1882 darwin_unique_section (tree decl ATTRIBUTE_UNUSED, int reloc ATTRIBUTE_UNUSED)
1883 {
1884   /* Darwin does not use unique sections.  */
1885 }
1886
1887 /* Handle __attribute__ ((apple_kext_compatibility)).
1888    This only applies to darwin kexts for 2.95 compatibility -- it shrinks the
1889    vtable for classes with this attribute (and their descendants) by not
1890    outputting the new 3.0 nondeleting destructor.  This means that such
1891    objects CANNOT be allocated on the stack or as globals UNLESS they have
1892    a completely empty `operator delete'.
1893    Luckily, this fits in with the Darwin kext model.
1894
1895    This attribute also disables gcc3's potential overlaying of derived
1896    class data members on the padding at the end of the base class.  */
1897
1898 tree
1899 darwin_handle_kext_attribute (tree *node, tree name,
1900                               tree args ATTRIBUTE_UNUSED,
1901                               int flags ATTRIBUTE_UNUSED,
1902                               bool *no_add_attrs)
1903 {
1904   /* APPLE KEXT stuff -- only applies with pure static C++ code.  */
1905   if (! TARGET_KEXTABI)
1906     {
1907       warning (0, "%qE 2.95 vtable-compatibility attribute applies "
1908                "only when compiling a kext", name);
1909
1910       *no_add_attrs = true;
1911     }
1912   else if (TREE_CODE (*node) != RECORD_TYPE)
1913     {
1914       warning (0, "%qE 2.95 vtable-compatibility attribute applies "
1915                "only to C++ classes", name);
1916
1917       *no_add_attrs = true;
1918     }
1919
1920   return NULL_TREE;
1921 }
1922
1923 /* Handle a "weak_import" attribute; arguments as in
1924    struct attribute_spec.handler.  */
1925
1926 tree
1927 darwin_handle_weak_import_attribute (tree *node, tree name,
1928                                      tree ARG_UNUSED (args),
1929                                      int ARG_UNUSED (flags),
1930                                      bool * no_add_attrs)
1931 {
1932   if (TREE_CODE (*node) != FUNCTION_DECL && TREE_CODE (*node) != VAR_DECL)
1933     {
1934       warning (OPT_Wattributes, "%qE attribute ignored",
1935                name);
1936       *no_add_attrs = true;
1937     }
1938   else
1939     declare_weak (*node);
1940
1941   return NULL_TREE;
1942 }
1943
1944 /* Emit a label for an FDE, making it global and/or weak if appropriate.
1945    The third parameter is nonzero if this is for exception handling.
1946    The fourth parameter is nonzero if this is just a placeholder for an
1947    FDE that we are omitting. */
1948
1949 void
1950 darwin_emit_unwind_label (FILE *file, tree decl, int for_eh, int empty)
1951 {
1952   char *lab ;
1953   char buf[32];
1954   static int invok_count = 0;
1955   static tree last_fun_decl = NULL_TREE;
1956   
1957   /* We use the linker to emit the .eh labels for Darwin 9 and above.  */
1958   if (! for_eh || generating_for_darwin_version >= 9)
1959     return;
1960
1961   /* FIXME: This only works when the eh for all sections of a function is 
1962      emitted at the same time.  If that changes, we would need to use a lookup
1963      table of some form to determine what to do.  Also, we should emit the
1964      unadorned label for the partition containing the public label for a
1965      function.  This is of limited use, probably, since we do not currently
1966      enable partitioning.  */
1967   strcpy (buf, ".eh");
1968   if (decl && TREE_CODE (decl) == FUNCTION_DECL) 
1969     {
1970       if (decl == last_fun_decl)
1971         {
1972           invok_count++;
1973           snprintf (buf, 31, "$$part$$%d.eh", invok_count);
1974         }
1975       else
1976         {
1977           last_fun_decl = decl;
1978           invok_count = 0;
1979         }
1980     }
1981
1982   lab = concat (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), buf, NULL);
1983
1984   if (TREE_PUBLIC (decl))
1985     {
1986       targetm.asm_out.globalize_label (file, lab);
1987       if (DECL_VISIBILITY (decl) == VISIBILITY_HIDDEN)
1988         {
1989           fputs ("\t.private_extern ", file);
1990           assemble_name (file, lab);
1991           fputc ('\n', file);
1992         }
1993     }
1994
1995   if (DECL_WEAK (decl))
1996     {
1997       fputs ("\t.weak_definition ", file);
1998       assemble_name (file, lab);
1999       fputc ('\n', file);
2000     }
2001
2002   assemble_name (file, lab);
2003   if (empty)
2004     {
2005       fputs (" = 0\n", file);
2006
2007       /* Mark the absolute .eh and .eh1 style labels as needed to
2008          ensure that we don't dead code strip them and keep such
2009          labels from another instantiation point until we can fix this
2010          properly with group comdat support.  */
2011       darwin_mark_decl_preserved (lab);
2012     }
2013   else
2014     fputs (":\n", file);
2015
2016   free (lab);
2017 }
2018
2019 static GTY(()) unsigned long except_table_label_num;
2020
2021 void
2022 darwin_emit_except_table_label (FILE *file)
2023 {
2024   char section_start_label[30];
2025
2026   ASM_GENERATE_INTERNAL_LABEL (section_start_label, "GCC_except_table",
2027                                except_table_label_num++);
2028   ASM_OUTPUT_LABEL (file, section_start_label);
2029 }
2030 /* Generate a PC-relative reference to a Mach-O non-lazy-symbol.  */
2031
2032 void
2033 darwin_non_lazy_pcrel (FILE *file, rtx addr)
2034 {
2035   const char *nlp_name;
2036
2037   gcc_assert (GET_CODE (addr) == SYMBOL_REF);
2038
2039   nlp_name = machopic_indirection_name (addr, /*stub_p=*/false);
2040   fputs ("\t.long\t", file);
2041   ASM_OUTPUT_LABELREF (file, nlp_name);
2042   fputs ("-.", file);
2043 }
2044
2045 /* If this is uncommented, details of each allocation will be printed
2046    in the asm right before the actual code.  WARNING - this will cause some
2047    test-suite fails (since the printout will contain items that some tests
2048    are not expecting) -- so don't leave it on by default (it bloats the
2049    asm too).  */
2050 /*#define DEBUG_DARWIN_MEM_ALLOCATORS*/
2051
2052 /* The first two of these routines are ostensibly just intended to put
2053    names into the asm.  However, they are both hijacked in order to ensure
2054    that zero-sized items do not make their way into the output.  Consequently,
2055    we also need to make these participate in provisions for dealing with
2056    such items in section anchors.  */
2057
2058 /* The implementation of ASM_DECLARE_OBJECT_NAME.  */
2059 /* The RTTI data (e.g., __ti4name) is common and public (and static),
2060    but it does need to be referenced via indirect PIC data pointers.
2061    The machopic_define_symbol calls are telling the machopic subsystem
2062    that the name *is* defined in this module, so it doesn't need to
2063    make them indirect.  */
2064 void 
2065 darwin_asm_declare_object_name (FILE *file, 
2066                                 const char *nam, tree decl)
2067 {
2068   const char *xname = nam;
2069   unsigned HOST_WIDE_INT size;
2070   bool local_def, weak;
2071
2072   weak = (DECL_P (decl)
2073           && DECL_WEAK (decl)
2074           && !lookup_attribute ("weak_import", 
2075                                  DECL_ATTRIBUTES (decl)));
2076
2077   local_def = DECL_INITIAL (decl) || (TREE_STATIC (decl) 
2078                                       && (!DECL_COMMON (decl) 
2079                                           || !TREE_PUBLIC (decl)));
2080
2081   if (GET_CODE (XEXP (DECL_RTL (decl), 0)) != SYMBOL_REF)
2082     xname = IDENTIFIER_POINTER (DECL_NAME (decl));
2083
2084   if (local_def)
2085     {
2086       (* targetm.encode_section_info) (decl, DECL_RTL (decl), false);
2087       if (!weak)
2088         machopic_define_symbol (DECL_RTL (decl));
2089     }
2090
2091   size = tree_low_cst (DECL_SIZE_UNIT (decl), 1);
2092
2093 #ifdef DEBUG_DARWIN_MEM_ALLOCATORS
2094 fprintf (file, "# dadon: %s %s (%llu, %u) local %d weak %d"
2095                " stat %d com %d pub %d t-const %d t-ro %d init %lx\n",
2096         xname, (TREE_CODE (decl) == VAR_DECL?"var":"const"), 
2097         (unsigned long long)size, DECL_ALIGN (decl), local_def, 
2098         DECL_WEAK (decl), TREE_STATIC (decl), DECL_COMMON (decl),
2099         TREE_PUBLIC (decl), TREE_CONSTANT (decl), TREE_READONLY (decl),
2100         (unsigned long)DECL_INITIAL (decl)); 
2101 #endif
2102
2103   /* Darwin needs help to support local zero-sized objects. 
2104      They must be made at least one byte, and the section containing must be
2105      marked as unsuitable for section-anchors (see storage allocators below).
2106      
2107      For non-zero objects this output is handled by varasm.c.
2108   */
2109   if (!size)
2110     {
2111       unsigned int l2align = 0;
2112
2113       /* The align must be honored, even for zero-sized.  */
2114       if (DECL_ALIGN (decl))
2115         {
2116           l2align = floor_log2 (DECL_ALIGN (decl) / BITS_PER_UNIT);
2117           fprintf (file, "\t.align\t%u\n", l2align);
2118         }
2119
2120       ASM_OUTPUT_LABEL (file, xname);
2121       size = 1;
2122       fprintf (file, "\t.space\t"HOST_WIDE_INT_PRINT_UNSIGNED"\n", size);
2123
2124       /* Check that we've correctly picked up the zero-sized item and placed it
2125          properly.  */
2126       gcc_assert ((!DARWIN_SECTION_ANCHORS || !flag_section_anchors)
2127                   || (in_section 
2128                       && (in_section->common.flags & SECTION_NO_ANCHOR)));
2129     }
2130   else
2131     ASM_OUTPUT_LABEL (file, xname);
2132 }
2133
2134 /* The implementation of ASM_DECLARE_CONSTANT_NAME.  */
2135 void
2136 darwin_asm_declare_constant_name (FILE *file, const char *name,
2137                                   const_tree exp ATTRIBUTE_UNUSED,
2138                                   HOST_WIDE_INT size)
2139 {
2140   assemble_label (file, name);
2141   /* As for other items, we need at least one byte.  */
2142   if (!size)
2143     {
2144       fputs ("\t.space\t1\n", file);
2145       /* Check that we've correctly picked up the zero-sized item and placed it
2146          properly.  */
2147       gcc_assert ((!DARWIN_SECTION_ANCHORS || !flag_section_anchors)
2148                   || (in_section 
2149                       && (in_section->common.flags & SECTION_NO_ANCHOR)));
2150     }
2151 }
2152
2153 /* Darwin storage allocators.
2154
2155    Zerofill sections are desirable for large blank data since, otherwise, these
2156    data bloat objects (PR33210).
2157
2158    However, section anchors don't work in .zerofill sections (one cannot switch
2159    to a zerofill section).  Ergo, for Darwin targets using section anchors we need
2160    to put (at least some) data into 'normal' switchable sections.
2161
2162    Here we set a relatively arbitrary value for the size of an object to trigger
2163    zerofill when section anchors are enabled (anything bigger than a page for
2164    current Darwin implementations).  FIXME: there ought to be some objective way
2165    to make this choice.
2166
2167    When section anchor are off this is ignored anyway.  */
2168
2169 #define BYTES_ZFILL 4096
2170
2171 /* Emit a chunk of data for items coalesced by the linker.  */
2172 static void
2173 darwin_emit_weak_or_comdat (FILE *fp, tree decl, const char *name,
2174                                   unsigned HOST_WIDE_INT size, 
2175                                   unsigned int align)
2176 {
2177   /* Since the sections used here are coalesed, they will not be eligible
2178      for section anchors, and therefore we don't need to break that out.  */
2179  if (TREE_READONLY (decl) || TREE_CONSTANT (decl))
2180     switch_to_section (darwin_sections[const_data_coal_section]);
2181   else
2182     switch_to_section (darwin_sections[data_coal_section]);
2183
2184   /* To be consistent, we'll allow darwin_asm_declare_object_name to assemble
2185      the align info for zero-sized items... but do it here otherwise.  */
2186   if (size && align)
2187     fprintf (fp, "\t.align\t%d\n", floor_log2 (align / BITS_PER_UNIT));
2188
2189   if (TREE_PUBLIC (decl))
2190     darwin_globalize_label (fp, name);
2191
2192   /* ... and we let it deal with outputting one byte of zero for them too.  */ 
2193   darwin_asm_declare_object_name (fp, name, decl);
2194   if (size)
2195     assemble_zeros (size);
2196 }
2197
2198 /* Emit a chunk of data for ObjC meta-data that got placed in BSS erroneously.  */
2199 static void
2200 darwin_emit_objc_zeroed (FILE *fp, tree decl, const char *name,
2201                                   unsigned HOST_WIDE_INT size, 
2202                                   unsigned int align, tree meta)
2203 {
2204   section *ocs = data_section;
2205
2206   if (TREE_PURPOSE (meta) == get_identifier("OBJC2META"))
2207     ocs = darwin_objc2_section (decl, meta, ocs);
2208   else
2209     ocs = darwin_objc1_section (decl, meta, ocs);
2210
2211   switch_to_section (ocs);
2212
2213   /* We shall declare that zero-sized meta-data are not valid (yet).  */
2214   gcc_assert (size);
2215   fprintf (fp, "\t.align\t%d\n", floor_log2 (align / BITS_PER_UNIT));
2216
2217   /* ... and we let it deal with outputting one byte of zero for them too.  */ 
2218   darwin_asm_declare_object_name (fp, name, decl);
2219   assemble_zeros (size);
2220 }
2221
2222 /* This routine emits 'local' storage:
2223
2224    When Section Anchors are off this routine emits .zerofill commands in 
2225    sections named for their alignment.
2226
2227    When Section Anchors are on, smaller (non-zero-sized) items are placed in
2228    the .static_data section so that the section anchoring system can see them.
2229    Larger items are still placed in .zerofill sections, addressing PR33210.
2230    The routine has no checking - it is all assumed to be done by the caller.
2231 */
2232 static void
2233 darwin_emit_local_bss (FILE *fp, tree decl, const char *name, 
2234                         unsigned HOST_WIDE_INT size, 
2235                         unsigned int l2align)
2236 {
2237    /* FIXME: We have a fudge to make this work with Java even when the target does
2238    not use sections anchors -- Java seems to need at least one small item in a
2239    non-zerofill segment.   */
2240    if ((DARWIN_SECTION_ANCHORS && flag_section_anchors && size < BYTES_ZFILL)
2241        || (size && size <= 2))
2242     {
2243       /* Put smaller objects in _static_data, where the section anchors system
2244          can get them.
2245          However, if they are zero-sized punt them to yet a different section
2246          (that is not allowed to participate in anchoring).  */
2247       if (!size)
2248         {
2249           fputs ("\t.section\t__DATA,__zobj_bss\n", fp);
2250           in_section = darwin_sections[zobj_bss_section];
2251           size = 1;
2252         }
2253       else
2254         {
2255           fputs ("\t.static_data\n", fp);
2256           in_section = darwin_sections[static_data_section];
2257         }
2258
2259       if (l2align)
2260         fprintf (fp, "\t.align\t%u\n", l2align);
2261
2262       assemble_name (fp, name);        
2263       fprintf (fp, ":\n\t.space\t"HOST_WIDE_INT_PRINT_UNSIGNED"\n", size);
2264     }
2265   else 
2266     {
2267       /* When we are on a non-section anchor target, we can get zero-sized
2268          items here.  However, all we need to do is to bump them to one byte
2269          and the section alignment will take care of the rest.  */
2270       char secnam[64];
2271       unsigned int flags ;
2272       snprintf (secnam, 64, "__DATA,__%sbss%u", ((size)?"":"zo_"), 
2273                                                 (unsigned) l2align);
2274       /* We can't anchor (yet, if ever) in zerofill sections, because we can't
2275          switch to them and emit a label.  */
2276       flags = SECTION_BSS|SECTION_WRITE|SECTION_NO_ANCHOR;
2277       in_section = get_section (secnam, flags, NULL);
2278       fprintf (fp, "\t.zerofill %s,", secnam);
2279       assemble_name (fp, name);
2280       if (!size)
2281         size = 1;
2282
2283       if (l2align)
2284         fprintf (fp, ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n",
2285                  size, (unsigned) l2align);
2286       else
2287         fprintf (fp, ","HOST_WIDE_INT_PRINT_UNSIGNED"\n", size);
2288     }
2289
2290   (*targetm.encode_section_info) (decl, DECL_RTL (decl), false);
2291   /* This is defined as a file-scope var, so we know to notify machopic.  */
2292   machopic_define_symbol (DECL_RTL (decl));
2293 }
2294
2295 /* Emit a chunk of common.  */
2296 static void
2297 darwin_emit_common (FILE *fp, const char *name,
2298                     unsigned HOST_WIDE_INT size, unsigned int align) 
2299 {
2300   unsigned HOST_WIDE_INT rounded;
2301   unsigned int l2align;
2302
2303   /* Earlier systems complain if the alignment exceeds the page size. 
2304      The magic number is 4096 * 8 - hard-coded for legacy systems.  */
2305   if (!emit_aligned_common && (align > 32768UL))
2306     align = 4096UL; /* In units.  */
2307   else
2308     align /= BITS_PER_UNIT;
2309
2310   /* Make sure we have a meaningful align.  */
2311   if (!align)
2312     align = 1;
2313
2314   /* For earlier toolchains, we need to emit the var as a rounded size to 
2315      tell ld the alignment.  */
2316   if (size < align) 
2317     rounded = align;
2318   else
2319     rounded = (size + (align-1)) & ~(align-1);
2320
2321   l2align = floor_log2 (align);
2322   gcc_assert (l2align <= L2_MAX_OFILE_ALIGNMENT);
2323
2324   in_section = comm_section;
2325   /* We mustn't allow multiple public symbols to share an address when using
2326      the normal OSX toolchain.  */
2327   if (!size)
2328     {
2329       /* Put at least one byte.  */
2330       size = 1;
2331       /* This section can no longer participate in section anchoring.  */
2332       comm_section->common.flags |= SECTION_NO_ANCHOR;
2333     }
2334
2335   fputs ("\t.comm\t", fp);
2336   assemble_name (fp, name);
2337   fprintf (fp, "," HOST_WIDE_INT_PRINT_UNSIGNED, 
2338            emit_aligned_common?size:rounded);
2339   if (l2align && emit_aligned_common)
2340     fprintf (fp, ",%u", l2align);
2341   fputs ("\n", fp);
2342 }
2343
2344 /* Output a var which is all zero - into aligned BSS sections, common, lcomm
2345    or coalescable data sections (for weak or comdat) as appropriate.  */
2346
2347 void
2348 darwin_output_aligned_bss (FILE *fp, tree decl, const char *name,
2349                           unsigned HOST_WIDE_INT size, unsigned int align)
2350 {
2351   unsigned int l2align;
2352   bool one, pub, weak;
2353   tree meta;
2354
2355   pub = TREE_PUBLIC (decl);
2356   one = DECL_ONE_ONLY (decl);
2357   weak = (DECL_P (decl)
2358           && DECL_WEAK (decl)
2359           && !lookup_attribute ("weak_import", 
2360                                  DECL_ATTRIBUTES (decl)));
2361
2362 #ifdef DEBUG_DARWIN_MEM_ALLOCATORS
2363 fprintf (fp, "# albss: %s (%lld,%d) ro %d cst %d stat %d com %d"
2364              " pub %d weak %d one %d init %lx\n",
2365         name, (long long)size, (int)align, TREE_READONLY (decl), 
2366         TREE_CONSTANT (decl), TREE_STATIC (decl), DECL_COMMON (decl),
2367         pub, weak, one, (unsigned long)DECL_INITIAL (decl)); 
2368 #endif
2369
2370   /* ObjC metadata can get put in BSS because varasm.c decides it's BSS 
2371      before the target has a chance to comment.  */
2372   if ((meta = is_objc_metadata (decl)))
2373     {
2374       darwin_emit_objc_zeroed (fp, decl, name, size, DECL_ALIGN (decl), meta);
2375       return;
2376     }
2377
2378   /* Check that any initializer is valid.  */
2379   gcc_assert ((DECL_INITIAL (decl) == NULL) 
2380                || (DECL_INITIAL (decl) == error_mark_node) 
2381                || initializer_zerop (DECL_INITIAL (decl)));
2382
2383   gcc_assert (DECL_SECTION_NAME (decl) == NULL);
2384   gcc_assert (!DECL_COMMON (decl));
2385
2386   /*  Pick up the correct alignment.  */
2387   if (!size || !align)
2388     align = DECL_ALIGN (decl);
2389
2390   l2align = floor_log2 (align / BITS_PER_UNIT);
2391   gcc_assert (l2align <= L2_MAX_OFILE_ALIGNMENT);
2392   
2393   last_assemble_variable_decl = decl;
2394
2395   /* We would rather not have to check this here - but it seems that we might
2396      be passed a decl that should be in coalesced space.  */
2397   if (one || weak)
2398     {
2399       /* Weak or COMDAT objects are put in mergeable sections.  */
2400       darwin_emit_weak_or_comdat (fp, decl, name, size, 
2401                                         DECL_ALIGN (decl));
2402       return;
2403     } 
2404
2405   /* If this is not public, then emit according to local rules.  */
2406   if (!pub)
2407     {
2408       darwin_emit_local_bss (fp, decl, name, size, l2align);    
2409       return;
2410     }
2411
2412   /* So we have a public symbol (small item fudge for Java, see above).  */
2413   if ((DARWIN_SECTION_ANCHORS && flag_section_anchors && size < BYTES_ZFILL) 
2414        || (size && size <= 2))
2415     {
2416       /* Put smaller objects in data, where the section anchors system can get
2417          them.  However, if they are zero-sized punt them to yet a different 
2418          section (that is not allowed to participate in anchoring).  */
2419       if (!size)
2420         {
2421           fputs ("\t.section\t__DATA,__zobj_data\n", fp);
2422           in_section = darwin_sections[zobj_data_section];
2423           size = 1;
2424         }
2425       else
2426         {
2427           fputs ("\t.data\n", fp);
2428           in_section = data_section;
2429         }
2430
2431       if (l2align)
2432         fprintf (fp, "\t.align\t%u\n", l2align);
2433
2434       assemble_name (fp, name);
2435       fprintf (fp, ":\n\t.space\t"HOST_WIDE_INT_PRINT_UNSIGNED"\n", size);
2436     }
2437   else 
2438     {
2439       char secnam[64];
2440       unsigned int flags ;
2441       /* When we are on a non-section anchor target, we can get zero-sized
2442          items here.  However, all we need to do is to bump them to one byte
2443          and the section alignment will take care of the rest.  */
2444       snprintf (secnam, 64, "__DATA,__%spu_bss%u", ((size)?"":"zo_"), l2align);
2445
2446       /* We can't anchor in zerofill sections, because we can't switch
2447          to them and emit a label.  */
2448       flags = SECTION_BSS|SECTION_WRITE|SECTION_NO_ANCHOR;
2449       in_section = get_section (secnam, flags, NULL);
2450       fprintf (fp, "\t.zerofill %s,", secnam);
2451       assemble_name (fp, name);
2452       if (!size)
2453         size = 1;
2454
2455       if (l2align)
2456         fprintf (fp, ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n", size, l2align);
2457       else
2458         fprintf (fp, ","HOST_WIDE_INT_PRINT_UNSIGNED"\n", size);
2459     }
2460   (* targetm.encode_section_info) (decl, DECL_RTL (decl), false);
2461 }
2462
2463 /* Output a chunk of common, with alignment specified (where the target
2464    supports this).  */
2465 void
2466 darwin_asm_output_aligned_decl_common (FILE *fp, tree decl, const char *name,
2467                                        unsigned HOST_WIDE_INT size, 
2468                                        unsigned int align)
2469 {
2470   unsigned int l2align;
2471   bool one, weak;
2472   tree meta;
2473
2474   /* No corresponding var.  */
2475   if (decl==NULL)
2476     {
2477 #ifdef DEBUG_DARWIN_MEM_ALLOCATORS
2478 fprintf (fp, "# adcom: %s (%d,%d) decl=0x0\n", name, (int)size, (int)align); 
2479 #endif
2480       darwin_emit_common (fp, name, size, align);
2481       return;
2482     }
2483
2484   one = DECL_ONE_ONLY (decl);
2485   weak = (DECL_P (decl)
2486           && DECL_WEAK (decl)
2487           && !lookup_attribute ("weak_import", 
2488                                  DECL_ATTRIBUTES (decl)));
2489
2490 #ifdef DEBUG_DARWIN_MEM_ALLOCATORS
2491 fprintf (fp, "# adcom: %s (%lld,%d) ro %d cst %d stat %d com %d pub %d"
2492              " weak %d one %d init %lx\n",
2493         name,  (long long)size, (int)align, TREE_READONLY (decl), 
2494         TREE_CONSTANT (decl), TREE_STATIC (decl), DECL_COMMON (decl),
2495         TREE_PUBLIC (decl), weak, one, (unsigned long)DECL_INITIAL (decl)); 
2496 #endif
2497
2498   /* ObjC metadata can get put in BSS because varasm.c decides it's BSS 
2499      before the target has a chance to comment.  */
2500   if ((meta = is_objc_metadata (decl)))
2501     {
2502       darwin_emit_objc_zeroed (fp, decl, name, size, DECL_ALIGN (decl), meta);
2503       return;
2504     }
2505
2506   /* We shouldn't be messing with this if the decl has a section name.  */
2507   gcc_assert (DECL_SECTION_NAME (decl) == NULL);
2508
2509   /* We would rather not have to check this here - but it seems that we might
2510      be passed a decl that should be in coalesced space.  */
2511   if (one || weak)
2512     {
2513       /* Weak or COMDAT objects are put in mergable sections.  */
2514       darwin_emit_weak_or_comdat (fp, decl, name, size, 
2515                                         DECL_ALIGN (decl));
2516       return;
2517     } 
2518
2519   /* We should only get here for DECL_COMMON, with a zero init (and, in 
2520      principle, only for public symbols too - although we deal with local
2521      ones below).  */
2522
2523   /* Check the initializer is OK.  */
2524   gcc_assert (DECL_COMMON (decl) 
2525               && ((DECL_INITIAL (decl) == NULL) 
2526                || (DECL_INITIAL (decl) == error_mark_node) 
2527                || initializer_zerop (DECL_INITIAL (decl))));
2528
2529   last_assemble_variable_decl = decl;
2530
2531   if (!size || !align) 
2532     align = DECL_ALIGN (decl);
2533
2534   l2align = floor_log2 (align / BITS_PER_UNIT);
2535   /* Check we aren't asking for more aligment than the platform allows.  */
2536   gcc_assert (l2align <= L2_MAX_OFILE_ALIGNMENT);
2537
2538   if (TREE_PUBLIC (decl) != 0)
2539     darwin_emit_common (fp, name, size, align);
2540   else
2541     darwin_emit_local_bss (fp, decl, name, size, l2align);      
2542 }
2543
2544 /* Output a chunk of BSS with alignment specfied.  */
2545 void
2546 darwin_asm_output_aligned_decl_local (FILE *fp, tree decl, const char *name, 
2547                                       unsigned HOST_WIDE_INT size, 
2548                                       unsigned int align)
2549 {
2550   unsigned long l2align;
2551   bool one, weak;
2552   tree meta;
2553
2554   one = DECL_ONE_ONLY (decl);
2555   weak = (DECL_P (decl)
2556           && DECL_WEAK (decl)
2557           && !lookup_attribute ("weak_import", 
2558                                  DECL_ATTRIBUTES (decl)));
2559
2560 #ifdef DEBUG_DARWIN_MEM_ALLOCATORS
2561 fprintf (fp, "# adloc: %s (%lld,%d) ro %d cst %d stat %d one %d pub %d"
2562              " weak %d init %lx\n",
2563         name, (long long)size, (int)align, TREE_READONLY (decl), 
2564         TREE_CONSTANT (decl), TREE_STATIC (decl), one, TREE_PUBLIC (decl),
2565         weak , (unsigned long)DECL_INITIAL (decl)); 
2566 #endif
2567
2568   /* ObjC metadata can get put in BSS because varasm.c decides it's BSS 
2569      before the target has a chance to comment.  */
2570   if ((meta = is_objc_metadata (decl)))
2571     {
2572       darwin_emit_objc_zeroed (fp, decl, name, size, DECL_ALIGN (decl), meta);
2573       return;
2574     }
2575
2576   /* We shouldn't be messing with this if the decl has a section name.  */
2577   gcc_assert (DECL_SECTION_NAME (decl) == NULL);
2578
2579   /* We would rather not have to check this here - but it seems that we might
2580      be passed a decl that should be in coalesced space.  */
2581   if (one || weak)
2582     {
2583       /* Weak or COMDAT objects are put in mergable sections.  */
2584       darwin_emit_weak_or_comdat (fp, decl, name, size, 
2585                                         DECL_ALIGN (decl));
2586       return;
2587     } 
2588
2589   /* .. and it should be suitable for placement in local mem.  */
2590   gcc_assert(!TREE_PUBLIC (decl) && !DECL_COMMON (decl));
2591   /* .. and any initializer must be all-zero.  */
2592   gcc_assert ((DECL_INITIAL (decl) == NULL) 
2593                || (DECL_INITIAL (decl) == error_mark_node) 
2594                || initializer_zerop (DECL_INITIAL (decl)));
2595
2596   last_assemble_variable_decl = decl;
2597
2598   if (!size || !align)
2599     align = DECL_ALIGN (decl);
2600
2601   l2align = floor_log2 (align / BITS_PER_UNIT);
2602   gcc_assert (l2align <= L2_MAX_OFILE_ALIGNMENT);
2603
2604   darwin_emit_local_bss (fp, decl, name, size, l2align);
2605 }
2606
2607 /* Emit an assembler directive to set visibility for a symbol.  The
2608    only supported visibilities are VISIBILITY_DEFAULT and
2609    VISIBILITY_HIDDEN; the latter corresponds to Darwin's "private
2610    extern".  There is no MACH-O equivalent of ELF's
2611    VISIBILITY_INTERNAL or VISIBILITY_PROTECTED. */
2612
2613 void
2614 darwin_assemble_visibility (tree decl, int vis)
2615 {
2616   if (vis == VISIBILITY_DEFAULT)
2617     ;
2618   else if (vis == VISIBILITY_HIDDEN)
2619     {
2620       fputs ("\t.private_extern ", asm_out_file);
2621       assemble_name (asm_out_file,
2622                      (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl))));
2623       fputs ("\n", asm_out_file);
2624     }
2625   else
2626     warning (OPT_Wattributes, "internal and protected visibility attributes "
2627              "not supported in this configuration; ignored");
2628 }
2629
2630 /* VEC Used by darwin_asm_dwarf_section.
2631    Maybe a hash tab would be better here - but the intention is that this is
2632    a very short list (fewer than 16 items) and each entry should (ideally, 
2633    eventually) only be presented once.
2634
2635    A structure to hold a dwarf debug section used entry.  */
2636
2637 typedef struct GTY(()) dwarf_sect_used_entry {
2638   const char *name;
2639   unsigned count;
2640 }
2641 dwarf_sect_used_entry;
2642
2643 DEF_VEC_O(dwarf_sect_used_entry);
2644 DEF_VEC_ALLOC_O(dwarf_sect_used_entry, gc);
2645
2646 /* A list of used __DWARF sections.  */
2647 static GTY (()) VEC (dwarf_sect_used_entry, gc) * dwarf_sect_names_table;
2648
2649 /* This is called when we are asked to assemble a named section and the 
2650    name begins with __DWARF,.  We keep a list of the section names (without
2651    the __DWARF, prefix) and use this to emit our required start label on the
2652    first switch to each section.  */
2653
2654 static void
2655 darwin_asm_dwarf_section (const char *name, unsigned int flags,
2656                           tree ARG_UNUSED (decl))
2657 {
2658   unsigned i;
2659   int namelen;
2660   const char * sname;
2661   dwarf_sect_used_entry *ref;
2662   bool found = false;
2663   gcc_assert ((flags & (SECTION_DEBUG | SECTION_NAMED))
2664                     == (SECTION_DEBUG | SECTION_NAMED));
2665   /* We know that the name starts with __DWARF,  */
2666   sname = name + 8;
2667   namelen = strchr (sname, ',') - sname;
2668   gcc_assert (namelen);
2669   if (dwarf_sect_names_table == NULL)
2670     dwarf_sect_names_table = VEC_alloc (dwarf_sect_used_entry, gc, 16);
2671   else
2672     for (i = 0; 
2673          VEC_iterate (dwarf_sect_used_entry, dwarf_sect_names_table, i, ref);
2674          i++)
2675       {
2676         if (!ref)
2677           break;
2678         if (!strcmp (ref->name, sname))
2679           {
2680             found = true;
2681             ref->count++;
2682             break;
2683           }
2684       }
2685
2686   fprintf (asm_out_file, "\t.section %s\n", name);
2687   if (!found)
2688     {
2689       dwarf_sect_used_entry e;
2690       fprintf (asm_out_file, "Lsection%.*s:\n", namelen, sname);
2691       e.count = 1;
2692       e.name = xstrdup (sname);
2693       VEC_safe_push (dwarf_sect_used_entry, gc, dwarf_sect_names_table, &e);
2694     }
2695 }
2696
2697 /* Output a difference of two labels that will be an assembly time
2698    constant if the two labels are local.  (.long lab1-lab2 will be
2699    very different if lab1 is at the boundary between two sections; it
2700    will be relocated according to the second section, not the first,
2701    so one ends up with a difference between labels in different
2702    sections, which is bad in the dwarf2 eh context for instance.)  */
2703
2704 static int darwin_dwarf_label_counter;
2705
2706 void
2707 darwin_asm_output_dwarf_delta (FILE *file, int size,
2708                                const char *lab1, const char *lab2)
2709 {
2710   int islocaldiff = (lab1[0] == '*' && lab1[1] == 'L'
2711                      && lab2[0] == '*' && lab2[1] == 'L');
2712   const char *directive = (size == 8 ? ".quad" : ".long");
2713
2714   if (islocaldiff)
2715     fprintf (file, "\t.set L$set$%d,", darwin_dwarf_label_counter);
2716   else
2717     fprintf (file, "\t%s\t", directive);
2718
2719   assemble_name_raw (file, lab1);
2720   fprintf (file, "-");
2721   assemble_name_raw (file, lab2);
2722   if (islocaldiff)
2723     fprintf (file, "\n\t%s L$set$%d", directive, darwin_dwarf_label_counter++);
2724 }
2725
2726 /* Output an offset in a DWARF section on Darwin.  On Darwin, DWARF section
2727    offsets are not represented using relocs in .o files; either the
2728    section never leaves the .o file, or the linker or other tool is
2729    responsible for parsing the DWARF and updating the offsets.  */
2730
2731 void
2732 darwin_asm_output_dwarf_offset (FILE *file, int size, const char * lab,
2733                                 section *base)
2734 {
2735   char sname[64];
2736   int namelen;
2737
2738   gcc_assert (base->common.flags & SECTION_NAMED);
2739   gcc_assert (strncmp (base->named.name, "__DWARF,", 8) == 0);
2740   gcc_assert (strchr (base->named.name + 8, ','));
2741
2742   namelen = strchr (base->named.name + 8, ',') - (base->named.name + 8);
2743   sprintf (sname, "*Lsection%.*s", namelen, base->named.name + 8);
2744   darwin_asm_output_dwarf_delta (file, size, lab, sname);
2745 }
2746
2747 /* Called from the within the TARGET_ASM_FILE_START for each target.  */
2748
2749 void
2750 darwin_file_start (void)
2751 {
2752   /* Nothing to do.  */
2753 }
2754
2755 /* Called for the TARGET_ASM_FILE_END hook.
2756    Emit the mach-o pic indirection data, the lto data and, finally a flag
2757    to tell the linker that it can break the file object into sections and
2758    move those around for efficiency.  */
2759
2760 void
2761 darwin_file_end (void)
2762 {
2763   machopic_finish (asm_out_file);
2764   if (strcmp (lang_hooks.name, "GNU C++") == 0)
2765     {
2766       switch_to_section (darwin_sections[constructor_section]);
2767       switch_to_section (darwin_sections[destructor_section]);
2768       ASM_OUTPUT_ALIGN (asm_out_file, 1);
2769     }
2770
2771   /* If there was LTO assembler output, append it to asm_out_file.  */
2772   if (lto_asm_out_name)
2773     {
2774       int n;
2775       char *buf, *lto_asm_txt;
2776
2777       /* Shouldn't be here if we failed to switch back.  */
2778       gcc_assert (! saved_asm_out_file);
2779
2780       lto_asm_out_file = fopen (lto_asm_out_name, "r");
2781       if (lto_asm_out_file == NULL)
2782         fatal_error ("failed to open temporary file %s with LTO output",
2783                      lto_asm_out_name);
2784       fseek (lto_asm_out_file, 0, SEEK_END);
2785       n = ftell (lto_asm_out_file);
2786       if (n > 0)
2787         {
2788           fseek (lto_asm_out_file, 0, SEEK_SET);
2789           lto_asm_txt = buf = (char *) xmalloc (n + 1);
2790           while (fgets (lto_asm_txt, n, lto_asm_out_file))
2791             fputs (lto_asm_txt, asm_out_file);
2792           /* Put a termination label.  */
2793           fprintf (asm_out_file, "\t.section %s,%s,regular,debug\n",
2794                    LTO_SEGMENT_NAME, LTO_SECTS_SECTION);
2795           fprintf (asm_out_file, "L_GNU_LTO%d:\t;# end of lto\n",
2796                    lto_section_num);
2797           /* Make sure our termination label stays in this section.  */
2798           fputs ("\t.space\t1\n", asm_out_file);
2799         }
2800
2801       /* Remove the temporary file.  */
2802       fclose (lto_asm_out_file);
2803       unlink_if_ordinary (lto_asm_out_name);
2804       free (lto_asm_out_name);
2805     }
2806
2807   /* Output the names and indices.  */
2808   if (lto_section_names && VEC_length (darwin_lto_section_e, lto_section_names))
2809     {
2810       int count;
2811       darwin_lto_section_e *ref;
2812       /* For now, we'll make the offsets 4 bytes and unaligned - we'll fix
2813          the latter up ourselves.  */
2814       const char *op = integer_asm_op (4,0);
2815
2816       /* Emit the names.  */
2817       fprintf (asm_out_file, "\t.section %s,%s,regular,debug\n",
2818                LTO_SEGMENT_NAME, LTO_NAMES_SECTION);
2819       FOR_EACH_VEC_ELT (darwin_lto_section_e, lto_section_names, count, ref)
2820         {
2821           fprintf (asm_out_file, "L_GNU_LTO_NAME%d:\n", count);
2822          /* We have to jump through hoops to get the values of the intra-section
2823             offsets... */
2824           fprintf (asm_out_file,
2825                    "\t.set L$gnu$lto$noff%d,L_GNU_LTO_NAME%d-L_GNU_LTO_NAME0\n",
2826                    count, count);
2827           fprintf (asm_out_file,
2828                    "\t.set L$gnu$lto$nsiz%d,L_GNU_LTO_NAME%d-L_GNU_LTO_NAME%d\n",
2829                    count, count+1, count);
2830           fprintf (asm_out_file, "\t.asciz\t\"%s\"\n", ref->sectname);
2831         }
2832       fprintf (asm_out_file, "L_GNU_LTO_NAME%d:\t;# end\n", lto_section_num);
2833       /* make sure our termination label stays in this section.  */
2834       fputs ("\t.space\t1\n", asm_out_file);
2835
2836       /* Emit the Index.  */
2837       fprintf (asm_out_file, "\t.section %s,%s,regular,debug\n",
2838                LTO_SEGMENT_NAME, LTO_INDEX_SECTION);
2839       fputs ("\t.align\t2\n", asm_out_file);
2840       fputs ("# Section offset, Section length, Name offset, Name length\n",
2841              asm_out_file);
2842       FOR_EACH_VEC_ELT (darwin_lto_section_e, lto_section_names, count, ref)
2843         {
2844           fprintf (asm_out_file, "%s L$gnu$lto$offs%d\t;# %s\n",
2845                    op, count, ref->sectname);
2846           fprintf (asm_out_file, "%s L$gnu$lto$size%d\n", op, count);
2847           fprintf (asm_out_file, "%s L$gnu$lto$noff%d\n", op, count);
2848           fprintf (asm_out_file, "%s L$gnu$lto$nsiz%d\n", op, count);
2849         }
2850     }
2851
2852   /* If we have section anchors, then we must prevent the linker from
2853      re-arranging data.  */
2854   if (!DARWIN_SECTION_ANCHORS || !flag_section_anchors)
2855     fprintf (asm_out_file, "\t.subsections_via_symbols\n");
2856 }
2857
2858 /* TODO: Add a language hook for identifying if a decl is a vtable.  */
2859 #define DARWIN_VTABLE_P(DECL) 0
2860
2861 /* Cross-module name binding.  Darwin does not support overriding
2862    functions at dynamic-link time, except for vtables in kexts.  */
2863
2864 bool
2865 darwin_binds_local_p (const_tree decl)
2866 {
2867   return default_binds_local_p_1 (decl,
2868                                   TARGET_KEXTABI && DARWIN_VTABLE_P (decl));
2869 }
2870
2871 /* The Darwin's implementation of TARGET_ASM_OUTPUT_ANCHOR.  Define the
2872    anchor relative to ".", the current section position.  We cannot use
2873    the default one because ASM_OUTPUT_DEF is wrong for Darwin.  */
2874 void
2875 darwin_asm_output_anchor (rtx symbol)
2876 {
2877   fprintf (asm_out_file, "\t.set\t");
2878   assemble_name (asm_out_file, XSTR (symbol, 0));
2879   fprintf (asm_out_file, ", . + " HOST_WIDE_INT_PRINT_DEC "\n",
2880            SYMBOL_REF_BLOCK_OFFSET (symbol));
2881 }
2882
2883 /* Disable section anchoring on any section containing a zero-sized 
2884    object.  */
2885 bool
2886 darwin_use_anchors_for_symbol_p (const_rtx symbol)
2887 {
2888   if (DARWIN_SECTION_ANCHORS && flag_section_anchors) 
2889     {
2890       section *sect;
2891       /* If the section contains a zero-sized object it's ineligible.  */
2892       sect = SYMBOL_REF_BLOCK (symbol)->sect;
2893       /* This should have the effect of disabling anchors for vars that follow
2894          any zero-sized one, in a given section.  */     
2895       if (sect->common.flags & SECTION_NO_ANCHOR)
2896         return false;
2897
2898         /* Also check the normal reasons for suppressing.  */
2899         return default_use_anchors_for_symbol_p (symbol);
2900     }
2901   else
2902     return false;
2903 }
2904
2905 /* Set the darwin specific attributes on TYPE.  */
2906 void
2907 darwin_set_default_type_attributes (tree type)
2908 {
2909   if (darwin_ms_struct
2910       && TREE_CODE (type) == RECORD_TYPE)
2911     TYPE_ATTRIBUTES (type) = tree_cons (get_identifier ("ms_struct"),
2912                                         NULL_TREE,
2913                                         TYPE_ATTRIBUTES (type));
2914 }
2915
2916 /* True, iff we're generating code for loadable kernel extensions.  */
2917
2918 bool
2919 darwin_kextabi_p (void) {
2920   return flag_apple_kext;
2921 }
2922
2923 void
2924 darwin_override_options (void)
2925 {
2926   /* Keep track of which (major) version we're generating code for.  */
2927   if (darwin_macosx_version_min)
2928     {
2929       if (strverscmp (darwin_macosx_version_min, "10.6") >= 0)
2930         generating_for_darwin_version = 10;
2931       else if (strverscmp (darwin_macosx_version_min, "10.5") >= 0)
2932         generating_for_darwin_version = 9;
2933
2934       /* Earlier versions are not specifically accounted, until required.  */
2935     }
2936
2937   /* Don't emit DWARF3/4 unless specifically selected.  This is a 
2938      workaround for tool bugs.  */
2939   if (!global_options_set.x_dwarf_strict) 
2940     dwarf_strict = 1;
2941
2942   /* Do not allow unwind tables to be generated by default for m32.  
2943      fnon-call-exceptions will override this, regardless of what we do.  */
2944   if (generating_for_darwin_version < 10
2945       && !global_options_set.x_flag_asynchronous_unwind_tables
2946       && !TARGET_64BIT)
2947     global_options.x_flag_asynchronous_unwind_tables = 0;
2948
2949    /* Disable -freorder-blocks-and-partition when unwind tables are being
2950       emitted for Darwin < 9 (OSX 10.5).
2951       The strategy is, "Unless the User has specifically set/unset an unwind
2952       flag we will switch off -freorder-blocks-and-partition when unwind tables
2953       will be generated".  If the User specifically sets flags... we assume
2954       (s)he knows why...  */
2955    if (generating_for_darwin_version < 9
2956        && global_options_set.x_flag_reorder_blocks_and_partition
2957        && ((global_options.x_flag_exceptions            /* User, c++, java */
2958             && !global_options_set.x_flag_exceptions)   /* User specified... */
2959            || (global_options.x_flag_unwind_tables
2960                && !global_options_set.x_flag_unwind_tables)
2961            || (global_options.x_flag_non_call_exceptions
2962                && !global_options_set.x_flag_non_call_exceptions)
2963            || (global_options.x_flag_asynchronous_unwind_tables
2964                && !global_options_set.x_flag_asynchronous_unwind_tables)))
2965     {
2966       inform (input_location,
2967               "-freorder-blocks-and-partition does not work with exceptions "
2968               "on this architecture");
2969       flag_reorder_blocks_and_partition = 0;
2970       flag_reorder_blocks = 1;
2971     }
2972
2973   if (flag_mkernel || flag_apple_kext)
2974     {
2975       /* -mkernel implies -fapple-kext for C++ */
2976       if (strcmp (lang_hooks.name, "GNU C++") == 0)
2977         flag_apple_kext = 1;
2978
2979       flag_no_common = 1;
2980
2981       /* No EH in kexts.  */
2982       flag_exceptions = 0;
2983       /* No -fnon-call-exceptions data in kexts.  */
2984       flag_non_call_exceptions = 0;
2985       /* so no tables either.. */
2986       flag_unwind_tables = 0;
2987       flag_asynchronous_unwind_tables = 0;
2988       /* We still need to emit branch islands for kernel context.  */
2989       darwin_emit_branch_islands = true;
2990     }
2991
2992   if (flag_var_tracking
2993       && generating_for_darwin_version >= 9
2994       && (flag_gtoggle ? (debug_info_level == DINFO_LEVEL_NONE)
2995       : (debug_info_level >= DINFO_LEVEL_NORMAL))
2996       && write_symbols == DWARF2_DEBUG)
2997     flag_var_tracking_uninit = 1;
2998
2999   if (MACHO_DYNAMIC_NO_PIC_P)
3000     {
3001       if (flag_pic)
3002         warning_at (UNKNOWN_LOCATION, 0,
3003                  "%<-mdynamic-no-pic%> overrides %<-fpic%>, %<-fPIC%>,"
3004                  " %<-fpie%> or %<-fPIE%>");
3005       flag_pic = 0;
3006     }
3007   else if (flag_pic == 1)
3008     {
3009       /* Darwin's -fpic is -fPIC.  */
3010       flag_pic = 2;
3011     }
3012
3013   /* It is assumed that branch island stubs are needed for earlier systems.  */
3014   if (generating_for_darwin_version < 9)
3015     darwin_emit_branch_islands = true;
3016   else
3017     emit_aligned_common = true; /* Later systems can support aligned common.  */
3018
3019   /* The c_dialect...() macros are not available to us here.  */
3020   darwin_running_cxx = (strstr (lang_hooks.name, "C++") != 0);
3021 }
3022
3023 #if DARWIN_PPC
3024 /* Add $LDBL128 suffix to long double builtins for ppc darwin.  */
3025
3026 static void
3027 darwin_patch_builtin (enum built_in_function fncode)
3028 {
3029   tree fn = builtin_decl_explicit (fncode);
3030   tree sym;
3031   char *newname;
3032
3033   if (!fn)
3034     return;
3035
3036   sym = DECL_ASSEMBLER_NAME (fn);
3037   newname = ACONCAT (("_", IDENTIFIER_POINTER (sym), "$LDBL128", NULL));
3038
3039   set_user_assembler_name (fn, newname);
3040
3041   fn = builtin_decl_implicit (fncode);
3042   if (fn)
3043     set_user_assembler_name (fn, newname);
3044 }
3045
3046 void
3047 darwin_patch_builtins (void)
3048 {
3049   if (LONG_DOUBLE_TYPE_SIZE != 128)
3050     return;
3051
3052 #define PATCH_BUILTIN(fncode) darwin_patch_builtin (fncode);
3053 #define PATCH_BUILTIN_NO64(fncode)              \
3054   if (!TARGET_64BIT)                            \
3055     darwin_patch_builtin (fncode);
3056 #define PATCH_BUILTIN_VARIADIC(fncode)                            \
3057   if (!TARGET_64BIT                                               \
3058       && (strverscmp (darwin_macosx_version_min, "10.3.9") >= 0)) \
3059     darwin_patch_builtin (fncode);
3060 #include "darwin-ppc-ldouble-patch.def"
3061 #undef PATCH_BUILTIN
3062 #undef PATCH_BUILTIN_NO64
3063 #undef PATCH_BUILTIN_VARIADIC
3064 }
3065 #endif
3066
3067 /*  CFStrings implementation.  */
3068 static GTY(()) tree cfstring_class_reference = NULL_TREE;
3069 static GTY(()) tree cfstring_type_node = NULL_TREE;
3070 static GTY(()) tree ccfstring_type_node = NULL_TREE;
3071 static GTY(()) tree pccfstring_type_node = NULL_TREE;
3072 static GTY(()) tree pcint_type_node = NULL_TREE;
3073 static GTY(()) tree pcchar_type_node = NULL_TREE;
3074
3075 static enum built_in_function darwin_builtin_cfstring;
3076
3077 /* Store all constructed constant CFStrings in a hash table so that
3078    they get uniqued properly.  */
3079
3080 typedef struct GTY (()) cfstring_descriptor {
3081   /* The string literal.  */
3082   tree literal;
3083   /* The resulting constant CFString.  */
3084   tree constructor;
3085 } cfstring_descriptor;
3086
3087 static GTY ((param_is (struct cfstring_descriptor))) htab_t cfstring_htab;
3088
3089 static hashval_t cfstring_hash (const void *);
3090 static int cfstring_eq (const void *, const void *);
3091
3092 static tree
3093 add_builtin_field_decl (tree type, const char *name, tree **chain)
3094 {
3095   tree field = build_decl (BUILTINS_LOCATION, FIELD_DECL, 
3096                             get_identifier (name), type);
3097
3098   if (*chain != NULL)
3099     **chain = field;
3100   *chain = &DECL_CHAIN (field);
3101
3102   return field;
3103 }
3104
3105 tree
3106 darwin_init_cfstring_builtins (unsigned builtin_cfstring)
3107 {
3108   tree cfsfun, fields, pccfstring_ftype_pcchar;
3109   tree *chain = NULL;
3110
3111   darwin_builtin_cfstring = 
3112     (enum built_in_function) builtin_cfstring;
3113   
3114   /* struct __builtin_CFString {
3115        const int *isa;          (will point at
3116        int flags;                __CFConstantStringClassReference)
3117        const char *str;
3118        long length;
3119      };  */
3120
3121   pcint_type_node = build_pointer_type 
3122                    (build_qualified_type (integer_type_node, TYPE_QUAL_CONST));
3123
3124   pcchar_type_node = build_pointer_type 
3125                    (build_qualified_type (char_type_node, TYPE_QUAL_CONST));
3126
3127   cfstring_type_node = (*lang_hooks.types.make_type) (RECORD_TYPE);
3128
3129   /* Have to build backwards for finish struct.  */
3130   fields = add_builtin_field_decl (long_integer_type_node, "length", &chain);
3131   add_builtin_field_decl (pcchar_type_node, "str", &chain);
3132   add_builtin_field_decl (integer_type_node, "flags", &chain);
3133   add_builtin_field_decl (pcint_type_node, "isa", &chain);
3134   finish_builtin_struct (cfstring_type_node, "__builtin_CFString",
3135                          fields, NULL_TREE);
3136
3137   /* const struct __builtin_CFstring *
3138      __builtin___CFStringMakeConstantString (const char *); */
3139
3140   ccfstring_type_node = build_qualified_type 
3141                         (cfstring_type_node, TYPE_QUAL_CONST);
3142   pccfstring_type_node = build_pointer_type (ccfstring_type_node);
3143   pccfstring_ftype_pcchar = build_function_type_list 
3144                         (pccfstring_type_node, pcchar_type_node, NULL_TREE);
3145
3146   cfsfun  = build_decl (BUILTINS_LOCATION, FUNCTION_DECL, 
3147                         get_identifier ("__builtin___CFStringMakeConstantString"),
3148                         pccfstring_ftype_pcchar);
3149
3150   TREE_PUBLIC (cfsfun) = 1;
3151   DECL_EXTERNAL (cfsfun) = 1;
3152   DECL_ARTIFICIAL (cfsfun) = 1;
3153   /* Make a lang-specific section - dup_lang_specific_decl makes a new node
3154      in place of the existing, which may be NULL.  */
3155   DECL_LANG_SPECIFIC (cfsfun) = NULL;
3156   (*lang_hooks.dup_lang_specific_decl) (cfsfun);
3157   DECL_BUILT_IN_CLASS (cfsfun) = BUILT_IN_MD;
3158   DECL_FUNCTION_CODE (cfsfun) = darwin_builtin_cfstring;
3159   lang_hooks.builtin_function (cfsfun);
3160
3161   /* extern int __CFConstantStringClassReference[];  */
3162   cfstring_class_reference = build_decl (BUILTINS_LOCATION, VAR_DECL,
3163                  get_identifier ("__CFConstantStringClassReference"),
3164                  build_array_type (integer_type_node, NULL_TREE));
3165
3166   TREE_PUBLIC (cfstring_class_reference) = 1;
3167   DECL_ARTIFICIAL (cfstring_class_reference) = 1;
3168   (*lang_hooks.decls.pushdecl) (cfstring_class_reference);
3169   DECL_EXTERNAL (cfstring_class_reference) = 1;
3170   rest_of_decl_compilation (cfstring_class_reference, 0, 0);
3171   
3172   /* Initialize the hash table used to hold the constant CFString objects.  */
3173   cfstring_htab = htab_create_ggc (31, cfstring_hash, cfstring_eq, NULL);
3174
3175   return cfstring_type_node;
3176 }
3177
3178 tree
3179 darwin_fold_builtin (tree fndecl, int n_args, tree *argp, 
3180                      bool ARG_UNUSED (ignore))
3181 {
3182   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
3183   
3184   if (fcode == darwin_builtin_cfstring)
3185     {
3186       if (!darwin_constant_cfstrings)
3187         {
3188           error ("built-in function %qD requires the" 
3189                  " %<-mconstant-cfstrings%> flag", fndecl);
3190           return error_mark_node;
3191         }
3192
3193       if (n_args != 1)
3194         {
3195           error ("built-in function %qD takes one argument only", fndecl);
3196           return error_mark_node;
3197         }
3198
3199       return darwin_build_constant_cfstring (*argp);
3200     }
3201
3202   return NULL_TREE;
3203 }
3204
3205 void
3206 darwin_rename_builtins (void)
3207 {
3208   /* The system ___divdc3 routine in libSystem on darwin10 is not
3209      accurate to 1ulp, ours is, so we avoid ever using the system name
3210      for this routine and instead install a non-conflicting name that
3211      is accurate.
3212
3213      When -ffast-math or -funsafe-math-optimizations is given, we can
3214      use the faster version.  */
3215   if (!flag_unsafe_math_optimizations)
3216     {
3217       enum built_in_function dcode
3218         = (enum built_in_function)(BUILT_IN_COMPLEX_DIV_MIN
3219                                    + DCmode - MIN_MODE_COMPLEX_FLOAT);
3220       tree fn = builtin_decl_explicit (dcode);
3221       /* Fortran and c call TARGET_INIT_BUILTINS and
3222          TARGET_INIT_LIBFUNCS at different times, so we have to put a
3223          call into each to ensure that at least one of them is called
3224          after build_common_builtin_nodes.  A better fix is to add a
3225          new hook to run after build_common_builtin_nodes runs.  */
3226       if (fn)
3227         set_user_assembler_name (fn, "___ieee_divdc3");
3228       fn = builtin_decl_implicit (dcode);
3229       if (fn)
3230         set_user_assembler_name (fn, "___ieee_divdc3");
3231     }
3232 }
3233
3234 static hashval_t
3235 cfstring_hash (const void *ptr)
3236 {
3237   tree str = ((const struct cfstring_descriptor *)ptr)->literal;
3238   const unsigned char *p = (const unsigned char *) TREE_STRING_POINTER (str);
3239   int i, len = TREE_STRING_LENGTH (str);
3240   hashval_t h = len;
3241
3242   for (i = 0; i < len; i++)
3243     h = ((h * 613) + p[i]);
3244
3245   return h;
3246 }
3247
3248 static int
3249 cfstring_eq (const void *ptr1, const void *ptr2)
3250 {
3251   tree str1 = ((const struct cfstring_descriptor *)ptr1)->literal;
3252   tree str2 = ((const struct cfstring_descriptor *)ptr2)->literal;
3253   int len1 = TREE_STRING_LENGTH (str1);
3254
3255   return (len1 == TREE_STRING_LENGTH (str2)
3256           && !memcmp (TREE_STRING_POINTER (str1), TREE_STRING_POINTER (str2),
3257                       len1));
3258 }
3259
3260 tree
3261 darwin_build_constant_cfstring (tree str)
3262 {
3263   struct cfstring_descriptor *desc, key;
3264   void **loc;
3265   tree addr;
3266
3267   if (!str)
3268     {
3269       error ("CFString literal is missing");
3270       return error_mark_node;
3271     }
3272
3273   STRIP_NOPS (str);
3274
3275   if (TREE_CODE (str) == ADDR_EXPR)
3276     str = TREE_OPERAND (str, 0);
3277
3278   if (TREE_CODE (str) != STRING_CST)
3279     {
3280       error ("CFString literal expression is not a string constant");
3281       return error_mark_node;
3282     }
3283
3284   /* Perhaps we already constructed a constant CFString just like this one? */
3285   key.literal = str;
3286   loc = htab_find_slot (cfstring_htab, &key, INSERT);
3287   desc = (struct cfstring_descriptor *) *loc;
3288
3289   if (!desc)
3290     {
3291       tree var, constructor, field;
3292       VEC(constructor_elt,gc) *v = NULL;
3293       int length = TREE_STRING_LENGTH (str) - 1;
3294
3295       if (darwin_warn_nonportable_cfstrings)
3296         {
3297           const char *s = TREE_STRING_POINTER (str);
3298           int l = 0;
3299
3300           for (l = 0; l < length; l++)
3301             if (!s[l] || !isascii (s[l]))
3302               {
3303                 warning (darwin_warn_nonportable_cfstrings, "%s in CFString literal",
3304                          s[l] ? "non-ASCII character" : "embedded NUL");
3305                 break;
3306               }
3307         }
3308
3309       *loc = desc = ggc_alloc_cleared_cfstring_descriptor ();
3310       desc->literal = str;
3311
3312       /* isa *. */
3313       field = TYPE_FIELDS (ccfstring_type_node);
3314       CONSTRUCTOR_APPEND_ELT(v, NULL_TREE, 
3315                              build1 (ADDR_EXPR,  TREE_TYPE (field),  
3316                                      cfstring_class_reference));
3317       /* flags */
3318       field = DECL_CHAIN (field);
3319       CONSTRUCTOR_APPEND_ELT(v, NULL_TREE, 
3320                              build_int_cst (TREE_TYPE (field), 0x000007c8));
3321       /* string *. */
3322       field = DECL_CHAIN (field);
3323       CONSTRUCTOR_APPEND_ELT(v, NULL_TREE,
3324                              build1 (ADDR_EXPR, TREE_TYPE (field), str));
3325       /* length */
3326       field = DECL_CHAIN (field);
3327       CONSTRUCTOR_APPEND_ELT(v, NULL_TREE,
3328                              build_int_cst (TREE_TYPE (field), length));
3329
3330       constructor = build_constructor (ccfstring_type_node, v);
3331       TREE_READONLY (constructor) = 1;
3332       TREE_CONSTANT (constructor) = 1;
3333       TREE_STATIC (constructor) = 1;
3334
3335       /* Fromage: The C++ flavor of 'build_unary_op' expects constructor nodes
3336          to have the TREE_HAS_CONSTRUCTOR (...) bit set.  However, this file is
3337          being built without any knowledge of C++ tree accessors; hence, we shall
3338          use the generic accessor that TREE_HAS_CONSTRUCTOR actually maps to!  */
3339       if (darwin_running_cxx)
3340         TREE_LANG_FLAG_4 (constructor) = 1;  /* TREE_HAS_CONSTRUCTOR  */
3341
3342       /* Create an anonymous global variable for this CFString.  */
3343       var = build_decl (input_location, CONST_DECL, 
3344                         NULL, TREE_TYPE (constructor));
3345       DECL_ARTIFICIAL (var) = 1;
3346       TREE_STATIC (var) = 1;
3347       DECL_INITIAL (var) = constructor;
3348       /* FIXME: This should use a translation_unit_decl to indicate file scope.  */
3349       DECL_CONTEXT (var) = NULL_TREE;
3350       desc->constructor = var;
3351     }
3352
3353   addr = build1 (ADDR_EXPR, pccfstring_type_node, desc->constructor);
3354   TREE_CONSTANT (addr) = 1;
3355
3356   return addr;
3357 }
3358
3359 bool
3360 darwin_cfstring_p (tree str)
3361 {
3362   struct cfstring_descriptor key;
3363   void **loc;
3364
3365   if (!str)
3366     return false;
3367
3368   STRIP_NOPS (str);
3369
3370   if (TREE_CODE (str) == ADDR_EXPR)
3371     str = TREE_OPERAND (str, 0);
3372
3373   if (TREE_CODE (str) != STRING_CST)
3374     return false;
3375
3376   key.literal = str;
3377   loc = htab_find_slot (cfstring_htab, &key, NO_INSERT);
3378   
3379   if (loc)
3380     return true;
3381
3382   return false;
3383 }
3384
3385 void
3386 darwin_enter_string_into_cfstring_table (tree str)
3387 {
3388   struct cfstring_descriptor key;
3389   void **loc;
3390
3391   key.literal = str;
3392   loc = htab_find_slot (cfstring_htab, &key, INSERT);
3393
3394   if (!*loc)
3395     {
3396       *loc = ggc_alloc_cleared_cfstring_descriptor ();
3397       ((struct cfstring_descriptor *)*loc)->literal = str;
3398     }
3399 }
3400
3401 /* Choose named function section based on its frequency.  */
3402
3403 section *
3404 darwin_function_section (tree decl, enum node_frequency freq,
3405                           bool startup, bool exit)
3406 {
3407   /* Decide if we need to put this in a coalescable section.  */
3408   bool weak = (decl 
3409                && DECL_WEAK (decl)
3410                && (!DECL_ATTRIBUTES (decl)
3411                    || !lookup_attribute ("weak_import", 
3412                                           DECL_ATTRIBUTES (decl))));
3413
3414   /* If there is a specified section name, we should not be trying to
3415      override.  */
3416   if (decl && DECL_SECTION_NAME (decl) != NULL_TREE)
3417     return get_named_section (decl, NULL, 0);
3418
3419   /* Default when there is no function re-ordering.  */
3420   if (!flag_reorder_functions)
3421     return (weak)
3422             ? darwin_sections[text_coal_section]
3423             : text_section;
3424
3425   /* Startup code should go to startup subsection unless it is
3426      unlikely executed (this happens especially with function splitting
3427      where we can split away unnecesary parts of static constructors).  */
3428   if (startup && freq != NODE_FREQUENCY_UNLIKELY_EXECUTED)
3429     return (weak)
3430             ? darwin_sections[text_startup_coal_section]
3431             : darwin_sections[text_startup_section];
3432
3433   /* Similarly for exit.  */
3434   if (exit && freq != NODE_FREQUENCY_UNLIKELY_EXECUTED)
3435     return (weak)
3436             ? darwin_sections[text_exit_coal_section]
3437             : darwin_sections[text_exit_section];
3438
3439   /* Group cold functions together, similarly for hot code.  */
3440   switch (freq)
3441     {
3442       case NODE_FREQUENCY_UNLIKELY_EXECUTED:
3443         return (weak)
3444                 ? darwin_sections[text_cold_coal_section]
3445                 : darwin_sections[text_cold_section];
3446         break;
3447       case NODE_FREQUENCY_HOT:
3448         return (weak)
3449                 ? darwin_sections[text_hot_coal_section]
3450                 : darwin_sections[text_hot_section];
3451         break;
3452       default:
3453         return (weak)
3454                 ? darwin_sections[text_coal_section]
3455                 : text_section;
3456         break;
3457     }
3458 }
3459
3460 /* When a function is partitioned between sections, we need to insert a label
3461    at the start of each new chunk - so that it may become a valid 'atom' for
3462    eh and debug purposes.  Without this the linker will emit warnings if one 
3463    tries to add line location information (since the switched fragment will 
3464    be anonymous).  */
3465
3466 void
3467 darwin_function_switched_text_sections (FILE *fp, tree decl, bool new_is_cold)
3468 {
3469   char buf[128];
3470   snprintf (buf, 128, "%s%s",new_is_cold?"__cold_sect_of_":"__hot_sect_of_",
3471             IDENTIFIER_POINTER (DECL_NAME (decl)));
3472   /* Make sure we pick up all the relevant quotes etc.  */
3473   assemble_name_raw (fp, (const char *) buf);
3474   fputs (":\n", fp);
3475 }
3476
3477 #include "gt-darwin.h"