home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Source / GNU / cctools / as / frags.h < prev    next >
Text File  |  1993-09-09  |  4KB  |  112 lines

  1. /* frags.h - Header file for the frag concept.
  2.    Copyright (C) 1987 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 published by
  8. the Free Software Foundation; either version 1, or (at your option)
  9. any later version.
  10.  
  11. GAS is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. 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
  18. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. #import "relax.h"
  21. #import "struc-symbol.h"
  22.  
  23. /*
  24.  * A code fragment (frag) is some known number of chars, followed by some
  25.  * unknown number of chars. Typically the unknown number of chars is an
  26.  * instruction address whose size is yet unknown. We always know the greatest
  27.  * possible size the unknown number of chars may become, and reserve that
  28.  * much room at the end of the frag.
  29.  * Once created, frags do not change address during assembly.
  30.  * We chain the frags in (a) forward-linked list(s). The object-file address
  31.  * of the 1st char of a frag is generally not known until after relax().
  32.  * Many things at assembly time describe an address by {object-file-address
  33.  * of a particular frag}+offset.
  34.  
  35.  BUG: it may be smarter to have a single pointer off to various different
  36. notes for different frag kinds. See how code pans out.
  37.  
  38.  */
  39. struct frag            /* a code fragment */
  40. {
  41.     unsigned long fr_address;    /* Object file address. */
  42.     struct frag *fr_next;    /* Chain forward; ascending address order. */
  43.                 /* Rooted in frch_root. */
  44.  
  45.     long fr_fix;        /* (Fixed) number of chars we know we have. */
  46.                 /* May be 0. */
  47.     long fr_var;        /* (Variable) number of chars after above. */
  48.                 /* May be 0. */
  49.     struct symbol *fr_symbol;    /* For variable-length tail. */
  50.     long fr_offset;        /* For variable-length tail. */
  51.     char *fr_opcode;        /* ->opcode low addr byte,for relax()ation*/
  52.     relax_stateT fr_type;    /* What state is my tail in? */
  53.     relax_substateT fr_subtype;    /* Used to index in to md_relax_table for */
  54.                 /*  fr_type == rs_machine_dependent frags. */
  55.     char fr_literal[1];        /* Chars begin here. */
  56.                 /* One day we will compile fr_literal[0]. */
  57. };
  58. typedef struct frag fragS;
  59.  
  60. /* We want to say fr_literal[0] below */
  61. #define SIZEOF_STRUCT_FRAG \
  62.  ((int)zero_address_frag.fr_literal - (int)&zero_address_frag)
  63.  
  64. /*
  65.  * frag_now points at the current frag we are building. This frag is incomplete.
  66.  * It is, however, included in frchain_now. Frag_now->fr_fix is not the total
  67.  * bytes in use for the frag.  For that use:
  68.  * frag_now->fr_fix + obstack_next_free(&frags) - frag_now->fr_literal.
  69.  */
  70. extern fragS *frag_now;
  71.  
  72. /*
  73.  * Frags ONLY live in this obstack.  We use obstack_next_free() macro 
  74.  * so please don't put any other objects on this stack!
  75.  */
  76. extern struct obstack frags;
  77.  
  78. /* For foreign-segment symbol fixups. */
  79. extern fragS zero_address_frag;
  80.  
  81. extern void frag_new(
  82.     int old_frags_var_max_size);
  83. extern char * frag_more(
  84.     int nchars);
  85. extern char *frag_var(
  86.     relax_stateT type,
  87.     int max_chars,
  88.     int var,
  89.     relax_substateT subtype,
  90.     symbolS *symbol,
  91.     long offset,
  92.     char *opcode);
  93. extern void frag_wane(
  94.     fragS *fragP);
  95. extern void frag_align(
  96.     int alignment,
  97.     int fill_character);
  98.  
  99. /*
  100.  * A macro to speed up appending exactly 1 char
  101.  * to current frag.
  102.  */
  103. /* JF changed < 1 to <= 1 to avoid a race conditon */
  104. #define FRAG_APPEND_1_CHAR(datum)    \
  105. {                    \
  106.     if (obstack_room( &frags ) <= 1) {\
  107.         frag_wane (frag_now);    \
  108.         frag_new (0);        \
  109.     }                \
  110.     obstack_1grow( &frags, datum );    \
  111. }
  112.