OSDN Git Service

* config/pa/pa.md (addhi3): Fix typo in last change.
[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 (0, "-mdynamic-no-pic overrides -fpic or -fPIC");
3003       flag_pic = 0;
3004     }
3005   else if (flag_pic == 1)
3006     {
3007       /* Darwin's -fpic is -fPIC.  */
3008       flag_pic = 2;
3009     }
3010
3011   /* It is assumed that branch island stubs are needed for earlier systems.  */
3012   if (generating_for_darwin_version < 9)
3013     darwin_emit_branch_islands = true;
3014   else
3015     emit_aligned_common = true; /* Later systems can support aligned common.  */
3016
3017   /* The c_dialect...() macros are not available to us here.  */
3018   darwin_running_cxx = (strstr (lang_hooks.name, "C++") != 0);
3019 }
3020
3021 /* Add $LDBL128 suffix to long double builtins.  */
3022
3023 static void
3024 darwin_patch_builtin (int fncode)
3025 {
3026   tree fn = built_in_decls[fncode];
3027   tree sym;
3028   char *newname;
3029
3030   if (!fn)
3031     return;
3032
3033   sym = DECL_ASSEMBLER_NAME (fn);
3034   newname = ACONCAT (("_", IDENTIFIER_POINTER (sym), "$LDBL128", NULL));
3035
3036   set_user_assembler_name (fn, newname);
3037
3038   fn = implicit_built_in_decls[fncode];
3039   if (fn)
3040     set_user_assembler_name (fn, newname);
3041 }
3042
3043 void
3044 darwin_patch_builtins (void)
3045 {
3046   if (LONG_DOUBLE_TYPE_SIZE != 128)
3047     return;
3048
3049 #define PATCH_BUILTIN(fncode) darwin_patch_builtin (fncode);
3050 #define PATCH_BUILTIN_NO64(fncode)              \
3051   if (!TARGET_64BIT)                            \
3052     darwin_patch_builtin (fncode);
3053 #define PATCH_BUILTIN_VARIADIC(fncode)                            \
3054   if (!TARGET_64BIT                                               \
3055       && (strverscmp (darwin_macosx_version_min, "10.3.9") >= 0)) \
3056     darwin_patch_builtin (fncode);
3057 #include "darwin-ppc-ldouble-patch.def"
3058 #undef PATCH_BUILTIN
3059 #undef PATCH_BUILTIN_NO64
3060 #undef PATCH_BUILTIN_VARIADIC
3061 }
3062
3063 /*  CFStrings implementation.  */
3064 static GTY(()) tree cfstring_class_reference = NULL_TREE;
3065 static GTY(()) tree cfstring_type_node = NULL_TREE;
3066 static GTY(()) tree ccfstring_type_node = NULL_TREE;
3067 static GTY(()) tree pccfstring_type_node = NULL_TREE;
3068 static GTY(()) tree pcint_type_node = NULL_TREE;
3069 static GTY(()) tree pcchar_type_node = NULL_TREE;
3070
3071 static enum built_in_function darwin_builtin_cfstring;
3072
3073 /* Store all constructed constant CFStrings in a hash table so that
3074    they get uniqued properly.  */
3075
3076 typedef struct GTY (()) cfstring_descriptor {
3077   /* The string literal.  */
3078   tree literal;
3079   /* The resulting constant CFString.  */
3080   tree constructor;
3081 } cfstring_descriptor;
3082
3083 static GTY ((param_is (struct cfstring_descriptor))) htab_t cfstring_htab;
3084
3085 static hashval_t cfstring_hash (const void *);
3086 static int cfstring_eq (const void *, const void *);
3087
3088 static tree
3089 add_builtin_field_decl (tree type, const char *name, tree **chain)
3090 {
3091   tree field = build_decl (BUILTINS_LOCATION, FIELD_DECL, 
3092                             get_identifier (name), type);
3093
3094   if (*chain != NULL)
3095     **chain = field;
3096   *chain = &DECL_CHAIN (field);
3097
3098   return field;
3099 }
3100
3101 tree
3102 darwin_init_cfstring_builtins (unsigned builtin_cfstring)
3103 {
3104   tree cfsfun, fields, pccfstring_ftype_pcchar;
3105   tree *chain = NULL;
3106
3107   darwin_builtin_cfstring = 
3108     (enum built_in_function) builtin_cfstring;
3109   
3110   /* struct __builtin_CFString {
3111        const int *isa;          (will point at
3112        int flags;                __CFConstantStringClassReference)
3113        const char *str;
3114        long length;
3115      };  */
3116
3117   pcint_type_node = build_pointer_type 
3118                    (build_qualified_type (integer_type_node, TYPE_QUAL_CONST));
3119
3120   pcchar_type_node = build_pointer_type 
3121                    (build_qualified_type (char_type_node, TYPE_QUAL_CONST));
3122
3123   cfstring_type_node = (*lang_hooks.types.make_type) (RECORD_TYPE);
3124
3125   /* Have to build backwards for finish struct.  */
3126   fields = add_builtin_field_decl (long_integer_type_node, "length", &chain);
3127   add_builtin_field_decl (pcchar_type_node, "str", &chain);
3128   add_builtin_field_decl (integer_type_node, "flags", &chain);
3129   add_builtin_field_decl (pcint_type_node, "isa", &chain);
3130   finish_builtin_struct (cfstring_type_node, "__builtin_CFString",
3131                          fields, NULL_TREE);
3132
3133   /* const struct __builtin_CFstring *
3134      __builtin___CFStringMakeConstantString (const char *); */
3135
3136   ccfstring_type_node = build_qualified_type 
3137                         (cfstring_type_node, TYPE_QUAL_CONST);
3138   pccfstring_type_node = build_pointer_type (ccfstring_type_node);
3139   pccfstring_ftype_pcchar = build_function_type_list 
3140                         (pccfstring_type_node, pcchar_type_node, NULL_TREE);
3141
3142   cfsfun  = build_decl (BUILTINS_LOCATION, FUNCTION_DECL, 
3143                         get_identifier ("__builtin___CFStringMakeConstantString"),
3144                         pccfstring_ftype_pcchar);
3145
3146   TREE_PUBLIC (cfsfun) = 1;
3147   DECL_EXTERNAL (cfsfun) = 1;
3148   DECL_ARTIFICIAL (cfsfun) = 1;
3149   /* Make a lang-specific section - dup_lang_specific_decl makes a new node
3150      in place of the existing, which may be NULL.  */
3151   DECL_LANG_SPECIFIC (cfsfun) = NULL;
3152   (*lang_hooks.dup_lang_specific_decl) (cfsfun);
3153   DECL_BUILT_IN_CLASS (cfsfun) = BUILT_IN_MD;
3154   DECL_FUNCTION_CODE (cfsfun) = darwin_builtin_cfstring;
3155   lang_hooks.builtin_function (cfsfun);
3156
3157   /* extern int __CFConstantStringClassReference[];  */
3158   cfstring_class_reference = build_decl (BUILTINS_LOCATION, VAR_DECL,
3159                  get_identifier ("__CFConstantStringClassReference"),
3160                  build_array_type (integer_type_node, NULL_TREE));
3161
3162   TREE_PUBLIC (cfstring_class_reference) = 1;
3163   DECL_ARTIFICIAL (cfstring_class_reference) = 1;
3164   (*lang_hooks.decls.pushdecl) (cfstring_class_reference);
3165   DECL_EXTERNAL (cfstring_class_reference) = 1;
3166   rest_of_decl_compilation (cfstring_class_reference, 0, 0);
3167   
3168   /* Initialize the hash table used to hold the constant CFString objects.  */
3169   cfstring_htab = htab_create_ggc (31, cfstring_hash, cfstring_eq, NULL);
3170
3171   return cfstring_type_node;
3172 }
3173
3174 tree
3175 darwin_fold_builtin (tree fndecl, int n_args, tree *argp, 
3176                      bool ARG_UNUSED (ignore))
3177 {
3178   unsigned int fcode = DECL_FUNCTION_CODE (fndecl);
3179   
3180   if (fcode == darwin_builtin_cfstring)
3181     {
3182       if (!darwin_constant_cfstrings)
3183         {
3184           error ("built-in function %qD requires the" 
3185                  " %<-mconstant-cfstrings%> flag", fndecl);
3186           return error_mark_node;
3187         }
3188
3189       if (n_args != 1)
3190         {
3191           error ("built-in function %qD takes one argument only", fndecl);
3192           return error_mark_node;
3193         }
3194
3195       return darwin_build_constant_cfstring (*argp);
3196     }
3197
3198   return NULL_TREE;
3199 }
3200
3201 void
3202 darwin_rename_builtins (void)
3203 {
3204   /* The system ___divdc3 routine in libSystem on darwin10 is not
3205      accurate to 1ulp, ours is, so we avoid ever using the system name
3206      for this routine and instead install a non-conflicting name that
3207      is accurate.
3208
3209      When -ffast-math or -funsafe-math-optimizations is given, we can
3210      use the faster version.  */
3211   if (!flag_unsafe_math_optimizations)
3212     {
3213       int dcode = (BUILT_IN_COMPLEX_DIV_MIN
3214                    + DCmode - MIN_MODE_COMPLEX_FLOAT);
3215       tree fn = built_in_decls[dcode];
3216       /* Fortran and c call TARGET_INIT_BUILTINS and
3217          TARGET_INIT_LIBFUNCS at different times, so we have to put a
3218          call into each to ensure that at least one of them is called
3219          after build_common_builtin_nodes.  A better fix is to add a
3220          new hook to run after build_common_builtin_nodes runs.  */
3221       if (fn)
3222         set_user_assembler_name (fn, "___ieee_divdc3");
3223       fn = implicit_built_in_decls[dcode];
3224       if (fn)
3225         set_user_assembler_name (fn, "___ieee_divdc3");
3226     }
3227 }
3228
3229 static hashval_t
3230 cfstring_hash (const void *ptr)
3231 {
3232   tree str = ((const struct cfstring_descriptor *)ptr)->literal;
3233   const unsigned char *p = (const unsigned char *) TREE_STRING_POINTER (str);
3234   int i, len = TREE_STRING_LENGTH (str);
3235   hashval_t h = len;
3236
3237   for (i = 0; i < len; i++)
3238     h = ((h * 613) + p[i]);
3239
3240   return h;
3241 }
3242
3243 static int
3244 cfstring_eq (const void *ptr1, const void *ptr2)
3245 {
3246   tree str1 = ((const struct cfstring_descriptor *)ptr1)->literal;
3247   tree str2 = ((const struct cfstring_descriptor *)ptr2)->literal;
3248   int len1 = TREE_STRING_LENGTH (str1);
3249
3250   return (len1 == TREE_STRING_LENGTH (str2)
3251           && !memcmp (TREE_STRING_POINTER (str1), TREE_STRING_POINTER (str2),
3252                       len1));
3253 }
3254
3255 tree
3256 darwin_build_constant_cfstring (tree str)
3257 {
3258   struct cfstring_descriptor *desc, key;
3259   void **loc;
3260   tree addr;
3261
3262   if (!str)
3263     {
3264       error ("CFString literal is missing");
3265       return error_mark_node;
3266     }
3267
3268   STRIP_NOPS (str);
3269
3270   if (TREE_CODE (str) == ADDR_EXPR)
3271     str = TREE_OPERAND (str, 0);
3272
3273   if (TREE_CODE (str) != STRING_CST)
3274     {
3275       error ("CFString literal expression is not a string constant");
3276       return error_mark_node;
3277     }
3278
3279   /* Perhaps we already constructed a constant CFString just like this one? */
3280   key.literal = str;
3281   loc = htab_find_slot (cfstring_htab, &key, INSERT);
3282   desc = (struct cfstring_descriptor *) *loc;
3283
3284   if (!desc)
3285     {
3286       tree var, constructor, field;
3287       VEC(constructor_elt,gc) *v = NULL;
3288       int length = TREE_STRING_LENGTH (str) - 1;
3289
3290       if (darwin_warn_nonportable_cfstrings)
3291         {
3292           const char *s = TREE_STRING_POINTER (str);
3293           int l = 0;
3294
3295           for (l = 0; l < length; l++)
3296             if (!s[l] || !isascii (s[l]))
3297               {
3298                 warning (darwin_warn_nonportable_cfstrings, "%s in CFString literal",
3299                          s[l] ? "non-ASCII character" : "embedded NUL");
3300                 break;
3301               }
3302         }
3303
3304       *loc = desc = ggc_alloc_cleared_cfstring_descriptor ();
3305       desc->literal = str;
3306
3307       /* isa *. */
3308       field = TYPE_FIELDS (ccfstring_type_node);
3309       CONSTRUCTOR_APPEND_ELT(v, NULL_TREE, 
3310                              build1 (ADDR_EXPR,  TREE_TYPE (field),  
3311                                      cfstring_class_reference));
3312       /* flags */
3313       field = DECL_CHAIN (field);
3314       CONSTRUCTOR_APPEND_ELT(v, NULL_TREE, 
3315                              build_int_cst (TREE_TYPE (field), 0x000007c8));
3316       /* string *. */
3317       field = DECL_CHAIN (field);
3318       CONSTRUCTOR_APPEND_ELT(v, NULL_TREE,
3319                              build1 (ADDR_EXPR, TREE_TYPE (field), str));
3320       /* length */
3321       field = DECL_CHAIN (field);
3322       CONSTRUCTOR_APPEND_ELT(v, NULL_TREE,
3323                              build_int_cst (TREE_TYPE (field), length));
3324
3325       constructor = build_constructor (ccfstring_type_node, v);
3326       TREE_READONLY (constructor) = 1;
3327       TREE_CONSTANT (constructor) = 1;
3328       TREE_STATIC (constructor) = 1;
3329
3330       /* Fromage: The C++ flavor of 'build_unary_op' expects constructor nodes
3331          to have the TREE_HAS_CONSTRUCTOR (...) bit set.  However, this file is
3332          being built without any knowledge of C++ tree accessors; hence, we shall
3333          use the generic accessor that TREE_HAS_CONSTRUCTOR actually maps to!  */
3334       if (darwin_running_cxx)
3335         TREE_LANG_FLAG_4 (constructor) = 1;  /* TREE_HAS_CONSTRUCTOR  */
3336
3337       /* Create an anonymous global variable for this CFString.  */
3338       var = build_decl (input_location, CONST_DECL, 
3339                         NULL, TREE_TYPE (constructor));
3340       DECL_ARTIFICIAL (var) = 1;
3341       TREE_STATIC (var) = 1;
3342       DECL_INITIAL (var) = constructor;
3343       /* FIXME: This should use a translation_unit_decl to indicate file scope.  */
3344       DECL_CONTEXT (var) = NULL_TREE;
3345       desc->constructor = var;
3346     }
3347
3348   addr = build1 (ADDR_EXPR, pccfstring_type_node, desc->constructor);
3349   TREE_CONSTANT (addr) = 1;
3350
3351   return addr;
3352 }
3353
3354 bool
3355 darwin_cfstring_p (tree str)
3356 {
3357   struct cfstring_descriptor key;
3358   void **loc;
3359
3360   if (!str)
3361     return false;
3362
3363   STRIP_NOPS (str);
3364
3365   if (TREE_CODE (str) == ADDR_EXPR)
3366     str = TREE_OPERAND (str, 0);
3367
3368   if (TREE_CODE (str) != STRING_CST)
3369     return false;
3370
3371   key.literal = str;
3372   loc = htab_find_slot (cfstring_htab, &key, NO_INSERT);
3373   
3374   if (loc)
3375     return true;
3376
3377   return false;
3378 }
3379
3380 void
3381 darwin_enter_string_into_cfstring_table (tree str)
3382 {
3383   struct cfstring_descriptor key;
3384   void **loc;
3385
3386   key.literal = str;
3387   loc = htab_find_slot (cfstring_htab, &key, INSERT);
3388
3389   if (!*loc)
3390     {
3391       *loc = ggc_alloc_cleared_cfstring_descriptor ();
3392       ((struct cfstring_descriptor *)*loc)->literal = str;
3393     }
3394 }
3395
3396 /* Choose named function section based on its frequency.  */
3397
3398 section *
3399 darwin_function_section (tree decl, enum node_frequency freq,
3400                           bool startup, bool exit)
3401 {
3402   /* Decide if we need to put this in a coalescable section.  */
3403   bool weak = (decl 
3404                && DECL_WEAK (decl)
3405                && (!DECL_ATTRIBUTES (decl)
3406                    || !lookup_attribute ("weak_import", 
3407                                           DECL_ATTRIBUTES (decl))));
3408
3409   /* If there is a specified section name, we should not be trying to
3410      override.  */
3411   if (decl && DECL_SECTION_NAME (decl) != NULL_TREE)
3412     return get_named_section (decl, NULL, 0);
3413
3414   /* Default when there is no function re-ordering.  */
3415   if (!flag_reorder_functions)
3416     return (weak)
3417             ? darwin_sections[text_coal_section]
3418             : text_section;
3419
3420   /* Startup code should go to startup subsection unless it is
3421      unlikely executed (this happens especially with function splitting
3422      where we can split away unnecesary parts of static constructors).  */
3423   if (startup && freq != NODE_FREQUENCY_UNLIKELY_EXECUTED)
3424     return (weak)
3425             ? darwin_sections[text_startup_coal_section]
3426             : darwin_sections[text_startup_section];
3427
3428   /* Similarly for exit.  */
3429   if (exit && freq != NODE_FREQUENCY_UNLIKELY_EXECUTED)
3430     return (weak)
3431             ? darwin_sections[text_exit_coal_section]
3432             : darwin_sections[text_exit_section];
3433
3434   /* Group cold functions together, similarly for hot code.  */
3435   switch (freq)
3436     {
3437       case NODE_FREQUENCY_UNLIKELY_EXECUTED:
3438         return (weak)
3439                 ? darwin_sections[text_cold_coal_section]
3440                 : darwin_sections[text_cold_section];
3441         break;
3442       case NODE_FREQUENCY_HOT:
3443         return (weak)
3444                 ? darwin_sections[text_hot_coal_section]
3445                 : darwin_sections[text_hot_section];
3446         break;
3447       default:
3448         return (weak)
3449                 ? darwin_sections[text_coal_section]
3450                 : text_section;
3451         break;
3452     }
3453 }
3454
3455 /* When a function is partitioned between sections, we need to insert a label
3456    at the start of each new chunk - so that it may become a valid 'atom' for
3457    eh and debug purposes.  Without this the linker will emit warnings if one 
3458    tries to add line location information (since the switched fragment will 
3459    be anonymous).  */
3460
3461 void
3462 darwin_function_switched_text_sections (FILE *fp, tree decl, bool new_is_cold)
3463 {
3464   char buf[128];
3465   snprintf (buf, 128, "%s%s",new_is_cold?"__cold_sect_of_":"__hot_sect_of_",
3466             IDENTIFIER_POINTER (DECL_NAME (decl)));
3467   /* Make sure we pick up all the relevant quotes etc.  */
3468   assemble_name_raw (fp, (const char *) buf);
3469   fputs (":\n", fp);
3470 }
3471
3472 #include "gt-darwin.h"