Home | History | Annotate | Download | only in config
      1 /* Mach-O object file format for gas, the assembler.
      2    Copyright (C) 2009-2016 Free Software Foundation, Inc.
      3 
      4    This file is part of GAS, the GNU Assembler.
      5 
      6    GAS is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as
      8    published by the Free Software Foundation; either version 3,
      9    or (at your option) any later version.
     10 
     11    GAS is distributed in the hope that it will be useful, but
     12    WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     14    the GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with GAS; see the file COPYING.  If not, write to the Free
     18    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
     19    02110-1301, USA.  */
     20 
     21 #ifndef _OBJ_MACH_O_H
     22 #define _OBJ_MACH_O_H
     23 
     24 /* Tag to validate Mach-O object file format processing */
     25 #define OBJ_MACH_O 1
     26 
     27 #include "bfd/mach-o.h"
     28 
     29 #include "targ-cpu.h"
     30 
     31 #define OUTPUT_FLAVOR bfd_target_mach_o_flavour
     32 
     33 /* We want to control how the sections are pre-defined on startup.  */
     34 #define obj_begin() mach_o_begin ()
     35 extern void mach_o_begin (void);
     36 
     37 /* All our align expressions are power of two.  */
     38 #define USE_ALIGN_PTWO 1
     39 
     40 /* Common symbols can carry alignment information.  */
     41 #ifndef S_SET_ALIGN
     42 #define S_SET_ALIGN(S,V) do {\
     43   bfd_mach_o_asymbol *___s = (bfd_mach_o_asymbol *) symbol_get_bfdsym (S);\
     44   ___s->n_desc = (___s->n_desc & 0xf0ff) | (((V) & 0x0f) << 8);\
     45 } while (0)
     46 #endif
     47 
     48 extern const pseudo_typeS mach_o_pseudo_table[];
     49 
     50 #ifndef obj_pop_insert
     51 #define obj_pop_insert() pop_insert (mach_o_pseudo_table)
     52 #endif
     53 
     54 #define obj_sec_sym_ok_for_reloc(SEC)	1
     55 
     56 #define obj_read_begin_hook()	{;}
     57 #define obj_symbol_new_hook(s)	{;}
     58 
     59 #define EMIT_SECTION_SYMBOLS		0
     60 
     61 struct obj_mach_o_symbol_data
     62 {
     63   /* If the symbol represents a subsection, this is the size of the subsection.
     64      This is used to check whether a local symbol belongs to a subsection.  */
     65   valueT subsection_size;
     66 };
     67 #define OBJ_SYMFIELD_TYPE struct obj_mach_o_symbol_data
     68 
     69 #define obj_frob_colon obj_mach_o_frob_colon
     70 extern void obj_mach_o_frob_colon (const char *);
     71 
     72 /* Called when a label is defined.  Mach-O uses this to create subsections.  */
     73 #define obj_frob_label obj_mach_o_frob_label
     74 extern void obj_mach_o_frob_label (symbolS *);
     75 
     76 #define obj_frob_symbol(s, punt) punt = obj_mach_o_frob_symbol(s)
     77 extern int obj_mach_o_frob_symbol (struct symbol *);
     78 
     79 #define OBJ_PROCESS_STAB(SEG,W,S,T,O,D)	obj_mach_o_process_stab(W,S,T,O,D)
     80 extern void obj_mach_o_process_stab (int, const char *,int, int, int);
     81 
     82 struct obj_mach_o_frag_data
     83 {
     84   /* Symbol that corresponds to the subsection.  */
     85   symbolS *subsection;
     86 };
     87 
     88 #define OBJ_FRAG_TYPE struct obj_mach_o_frag_data
     89 
     90 #define md_pre_output_hook obj_mach_o_pre_output_hook()
     91 extern void obj_mach_o_pre_output_hook(void);
     92 
     93 #define md_pre_relax_hook obj_mach_o_pre_relax_hook()
     94 extern void obj_mach_o_pre_relax_hook (void);
     95 
     96 #define md_post_relax_hook obj_mach_o_post_relax_hook()
     97 extern void obj_mach_o_post_relax_hook (void);
     98 
     99 #define obj_frob_file_after_relocs obj_mach_o_frob_file_after_relocs
    100 extern void obj_mach_o_frob_file_after_relocs (void);
    101 
    102 #define SET_SECTION_RELOCS(sec, relocs, n) \
    103   obj_mach_o_reorder_section_relocs (sec, relocs, n)
    104 extern void obj_mach_o_reorder_section_relocs (asection *, arelent **,
    105 					       unsigned int);
    106 
    107 /* Emit relocs for local subtracts, to cater for subsections-via-symbols.  */
    108 #define md_allow_local_subtract(LEFT, RIGHT, SECTION) \
    109  obj_mach_o_allow_local_subtract (LEFT, RIGHT, SECTION)
    110 extern int obj_mach_o_allow_local_subtract (expressionS *, expressionS *,
    111 					    segT);
    112 
    113 struct fix;
    114 extern int obj_mach_o_in_different_subsection (symbolS *a, symbolS *b);
    115 extern int obj_mach_o_force_reloc (struct fix *fix);
    116 extern int obj_mach_o_force_reloc_sub_same (struct fix *fix, segT seg);
    117 extern int obj_mach_o_force_reloc_sub_local (struct fix *fix, segT seg);
    118 
    119 #endif /* _OBJ_MACH_O_H */
    120