Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /* subsegs.h -> subsegs.c
  2.    Copyright 1987, 1992, 1993, 1994, 1995, 1996, 1998, 2000, 2003, 2005,
  3.    2006, 2007, 2009 Free Software Foundation, Inc.
  4.  
  5.    This file is part of GAS, the GNU Assembler.
  6.  
  7.    GAS is free software; you can redistribute it and/or modify
  8.    it under the terms of the GNU General Public License as published by
  9.    the Free Software Foundation; either version 3, or (at your option)
  10.    any later version.
  11.  
  12.    GAS is distributed in the hope that it will be useful,
  13.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.    GNU General Public License for more details.
  16.  
  17.    You should have received a copy of the GNU General Public License
  18.    along with GAS; see the file COPYING.  If not, write to the Free
  19.    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
  20.    02110-1301, USA.  */
  21.  
  22. /*
  23.  * For every sub-segment the user mentions in the ASsembler program,
  24.  * we make one struct frchain. Each sub-segment has exactly one struct frchain
  25.  * and vice versa.
  26.  *
  27.  * Struct frchain's are forward chained (in ascending order of sub-segment
  28.  * code number). The chain runs through frch_next of each subsegment.
  29.  * This makes it hard to find a subsegment's frags
  30.  * if programmer uses a lot of them. Most programs only use text0 and
  31.  * data0, so they don't suffer. At least this way:
  32.  * (1)  There are no "arbitrary" restrictions on how many subsegments
  33.  *      can be programmed;
  34.  * (2)  Subsegments' frchain-s are (later) chained together in the order in
  35.  *      which they are emitted for object file viz text then data.
  36.  *
  37.  * From each struct frchain dangles a chain of struct frags. The frags
  38.  * represent code fragments, for that sub-segment, forward chained.
  39.  */
  40.  
  41. #include "obstack.h"
  42.  
  43. struct frch_cfi_data;
  44.  
  45. struct frchain                  /* control building of a frag chain */
  46. {                               /* FRCH = FRagment CHain control */
  47.   struct frag *frch_root;       /* 1st struct frag in chain, or NULL */
  48.   struct frag *frch_last;       /* last struct frag in chain, or NULL */
  49.   struct frchain *frch_next;    /* next in chain of struct frchain-s */
  50.   subsegT frch_subseg;          /* subsegment number of this chain */
  51.   fixS *fix_root;               /* Root of fixups for this subsegment.  */
  52.   fixS *fix_tail;               /* Last fixup for this subsegment.  */
  53.   struct obstack frch_obstack;  /* for objects in this frag chain */
  54.   fragS *frch_frag_now;         /* frag_now for this subsegment */
  55.   struct frch_cfi_data *frch_cfi_data;
  56. };
  57.  
  58. typedef struct frchain frchainS;
  59.  
  60. /* Frchain we are assembling into now.  That is, the current segment's
  61.    frag chain, even if it contains no (complete) frags.  */
  62. extern frchainS *frchain_now;
  63.  
  64. typedef struct segment_info_struct {
  65.   frchainS *frchainP;
  66.   unsigned int hadone : 1;
  67.  
  68.   /* This field is set if this is a .bss section which does not really
  69.      have any contents.  Once upon a time a .bss section did not have
  70.      any frags, but that is no longer true.  This field prevent the
  71.      SEC_HAS_CONTENTS flag from being set for the section even if
  72.      there are frags.  */
  73.   unsigned int bss : 1;
  74.  
  75.   int user_stuff;
  76.  
  77.   /* Fixups for this segment.  This is only valid after the frchains
  78.      are run together.  */
  79.   fixS *fix_root;
  80.   fixS *fix_tail;
  81.  
  82.   symbolS *dot;
  83.  
  84.   struct lineno_list *lineno_list_head;
  85.   struct lineno_list *lineno_list_tail;
  86.  
  87.   /* Which BFD section does this gas segment correspond to?  */
  88.   asection *bfd_section;
  89.  
  90.   /* NULL, or pointer to the gas symbol that is the section symbol for
  91.      this section.  sym->bsym and bfd_section->symbol should be the same.  */
  92.   symbolS *sym;
  93.  
  94.   union {
  95.     /* Current size of section holding stabs strings.  */
  96.     unsigned long stab_string_size;
  97.     /* Initial frag for ELF.  */
  98.     char *p;
  99.   }
  100.   stabu;
  101.  
  102. #ifdef NEED_LITERAL_POOL
  103.   unsigned long literal_pool_size;
  104. #endif
  105.  
  106. #ifdef TC_SEGMENT_INFO_TYPE
  107.   TC_SEGMENT_INFO_TYPE tc_segment_info_data;
  108. #endif
  109. } segment_info_type;
  110.  
  111.  
  112. #define seg_info(sec) \
  113.   ((segment_info_type *) bfd_get_section_userdata (stdoutput, sec))
  114.  
  115. extern symbolS *section_symbol (segT);
  116.  
  117. extern void subsegs_print_statistics (FILE *);
  118.