Home | History | Annotate | Download | only in bfd
      1 /* BFD back-end for mmo objects (MMIX-specific object-format).
      2    Copyright (C) 2001-2014 Free Software Foundation, Inc.
      3    Written by Hans-Peter Nilsson (hp (at) bitrange.com).
      4    Infrastructure and other bits originally copied from srec.c and
      5    binary.c.
      6 
      7    This file is part of BFD, the Binary File Descriptor library.
      8 
      9    This program 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 of the License, or
     12    (at your option) any later version.
     13 
     14    This program 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 this program; if not, write to the Free Software
     21    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     22    MA 02110-1301, USA.  */
     23 
     24 
     25 /*
     26 SECTION
     27 	mmo backend
     28 
     29 	The mmo object format is used exclusively together with Professor
     30 	Donald E.@: Knuth's educational 64-bit processor MMIX.  The simulator
     31 	@command{mmix} which is available at
     32 	@url{http://mmix.cs.hm.edu/src/index.html}
     33 	understands this format.  That package also includes a combined
     34 	assembler and linker called @command{mmixal}.  The mmo format has
     35 	no advantages feature-wise compared to e.g. ELF.  It is a simple
     36 	non-relocatable object format with no support for archives or
     37 	debugging information, except for symbol value information and
     38 	line numbers (which is not yet implemented in BFD).  See
     39 	@url{http://mmix.cs.hm.edu/} for more
     40 	information about MMIX.  The ELF format is used for intermediate
     41 	object files in the BFD implementation.
     42 
     43 @c We want to xref the symbol table node.  A feature in "chew"
     44 @c requires that "commands" do not contain spaces in the
     45 @c arguments.  Hence the hyphen in "Symbol-table".
     46 @menu
     47 @* File layout::
     48 @* Symbol-table::
     49 @* mmo section mapping::
     50 @end menu
     51 
     52 INODE
     53 File layout, Symbol-table, mmo, mmo
     54 SUBSECTION
     55 	File layout
     56 
     57 	The mmo file contents is not partitioned into named sections as
     58 	with e.g.@: ELF.  Memory areas is formed by specifying the
     59 	location of the data that follows.  Only the memory area
     60 	@samp{0x0000@dots{}00} to @samp{0x01ff@dots{}ff} is executable, so
     61 	it is used for code (and constants) and the area
     62 	@samp{0x2000@dots{}00} to @samp{0x20ff@dots{}ff} is used for
     63 	writable data.  @xref{mmo section mapping}.
     64 
     65 	There is provision for specifying ``special data'' of 65536
     66 	different types.  We use type 80 (decimal), arbitrarily chosen the
     67 	same as the ELF <<e_machine>> number for MMIX, filling it with
     68 	section information normally found in ELF objects. @xref{mmo
     69 	section mapping}.
     70 
     71 	Contents is entered as 32-bit words, xor:ed over previous
     72 	contents, always zero-initialized.  A word that starts with the
     73 	byte @samp{0x98} forms a command called a @samp{lopcode}, where
     74 	the next byte distinguished between the thirteen lopcodes.  The
     75 	two remaining bytes, called the @samp{Y} and @samp{Z} fields, or
     76 	the @samp{YZ} field (a 16-bit big-endian number), are used for
     77 	various purposes different for each lopcode.  As documented in
     78 	@url{http://mmix.cs.hm.edu/doc/mmixal.pdf},
     79 	the lopcodes are:
     80 
     81 	@table @code
     82 	@item lop_quote
     83 	0x98000001.  The next word is contents, regardless of whether it
     84 	starts with 0x98 or not.
     85 
     86 	@item lop_loc
     87 	0x9801YYZZ, where @samp{Z} is 1 or 2.  This is a location
     88 	directive, setting the location for the next data to the next
     89 	32-bit word (for @math{Z = 1}) or 64-bit word (for @math{Z = 2}),
     90 	plus @math{Y * 2^56}.  Normally @samp{Y} is 0 for the text segment
     91 	and 2 for the data segment.  Beware that the low bits of non-
     92 	tetrabyte-aligned values are silently discarded when being
     93 	automatically incremented and when storing contents (in contrast
     94 	to e.g. its use as current location when followed by lop_fixo
     95 	et al before the next possibly-quoted tetrabyte contents).
     96 
     97 	@item lop_skip
     98 	0x9802YYZZ.  Increase the current location by @samp{YZ} bytes.
     99 
    100 	@item lop_fixo
    101 	0x9803YYZZ, where @samp{Z} is 1 or 2.  Store the current location
    102 	as 64 bits into the location pointed to by the next 32-bit
    103 	(@math{Z = 1}) or 64-bit (@math{Z = 2}) word, plus @math{Y *
    104 	2^56}.
    105 
    106 	@item lop_fixr
    107 	0x9804YYZZ.  @samp{YZ} is stored into the current location plus
    108 	@math{2 - 4 * YZ}.
    109 
    110 	@item lop_fixrx
    111 	0x980500ZZ.  @samp{Z} is 16 or 24.  A value @samp{L} derived from
    112 	the following 32-bit word are used in a manner similar to
    113 	@samp{YZ} in lop_fixr: it is xor:ed into the current location
    114 	minus @math{4 * L}.  The first byte of the word is 0 or 1.  If it
    115 	is 1, then @math{L = (@var{lowest 24 bits of word}) - 2^Z}, if 0,
    116  	then @math{L = (@var{lowest 24 bits of word})}.
    117 
    118 	@item lop_file
    119 	0x9806YYZZ.  @samp{Y} is the file number, @samp{Z} is count of
    120 	32-bit words.  Set the file number to @samp{Y} and the line
    121 	counter to 0.  The next @math{Z * 4} bytes contain the file name,
    122 	padded with zeros if the count is not a multiple of four.  The
    123 	same @samp{Y} may occur multiple times, but @samp{Z} must be 0 for
    124 	all but the first occurrence.
    125 
    126 	@item lop_line
    127 	0x9807YYZZ.  @samp{YZ} is the line number.  Together with
    128 	lop_file, it forms the source location for the next 32-bit word.
    129 	Note that for each non-lopcode 32-bit word, line numbers are
    130 	assumed incremented by one.
    131 
    132 	@item lop_spec
    133 	0x9808YYZZ.  @samp{YZ} is the type number.  Data until the next
    134 	lopcode other than lop_quote forms special data of type @samp{YZ}.
    135 	@xref{mmo section mapping}.
    136 
    137 	Other types than 80, (or type 80 with a content that does not
    138 	parse) is stored in sections named <<.MMIX.spec_data.@var{n}>>
    139 	where @var{n} is the @samp{YZ}-type.  The flags for such a
    140 	sections say not to allocate or load the data.  The vma is 0.
    141 	Contents of multiple occurrences of special data @var{n} is
    142 	concatenated to the data of the previous lop_spec @var{n}s.  The
    143 	location in data or code at which the lop_spec occurred is lost.
    144 
    145 	@item lop_pre
    146 	0x980901ZZ.  The first lopcode in a file.  The @samp{Z} field forms the
    147 	length of header information in 32-bit words, where the first word
    148 	tells the time in seconds since @samp{00:00:00 GMT Jan 1 1970}.
    149 
    150 	@item lop_post
    151 	0x980a00ZZ.  @math{Z > 32}.  This lopcode follows after all
    152 	content-generating lopcodes in a program.  The @samp{Z} field
    153 	denotes the value of @samp{rG} at the beginning of the program.
    154 	The following @math{256 - Z} big-endian 64-bit words are loaded
    155 	into global registers @samp{$G} @dots{} @samp{$255}.
    156 
    157 	@item lop_stab
    158 	0x980b0000.  The next-to-last lopcode in a program.  Must follow
    159 	immediately after the lop_post lopcode and its data.  After this
    160 	lopcode follows all symbols in a compressed format
    161 	(@pxref{Symbol-table}).
    162 
    163 	@item lop_end
    164 	0x980cYYZZ.  The last lopcode in a program.  It must follow the
    165 	lop_stab lopcode and its data.  The @samp{YZ} field contains the
    166 	number of 32-bit words of symbol table information after the
    167 	preceding lop_stab lopcode.
    168 	@end table
    169 
    170 	Note that the lopcode "fixups"; <<lop_fixr>>, <<lop_fixrx>> and
    171 	<<lop_fixo>> are not generated by BFD, but are handled.  They are
    172 	generated by <<mmixal>>.
    173 
    174 EXAMPLE
    175 	This trivial one-label, one-instruction file:
    176 
    177 | :Main TRAP 1,2,3
    178 
    179 	can be represented this way in mmo:
    180 
    181 | 0x98090101 - lop_pre, one 32-bit word with timestamp.
    182 | <timestamp>
    183 | 0x98010002 - lop_loc, text segment, using a 64-bit address.
    184 |              Note that mmixal does not emit this for the file above.
    185 | 0x00000000 - Address, high 32 bits.
    186 | 0x00000000 - Address, low 32 bits.
    187 | 0x98060002 - lop_file, 2 32-bit words for file-name.
    188 | 0x74657374 - "test"
    189 | 0x2e730000 - ".s\0\0"
    190 | 0x98070001 - lop_line, line 1.
    191 | 0x00010203 - TRAP 1,2,3
    192 | 0x980a00ff - lop_post, setting $255 to 0.
    193 | 0x00000000
    194 | 0x00000000
    195 | 0x980b0000 - lop_stab for ":Main" = 0, serial 1.
    196 | 0x203a4040   @xref{Symbol-table}.
    197 | 0x10404020
    198 | 0x4d206120
    199 | 0x69016e00
    200 | 0x81000000
    201 | 0x980c0005 - lop_end; symbol table contained five 32-bit words.  */
    202 
    203 #include "sysdep.h"
    204 #include "bfd.h"
    205 #include "libbfd.h"
    206 #include "libiberty.h"
    207 #include "elf/mmix.h"
    208 #include "opcode/mmix.h"
    209 
    210 #define LOP 0x98
    211 #define LOP_QUOTE 0
    212 #define LOP_LOC 1
    213 #define LOP_SKIP 2
    214 #define LOP_FIXO 3
    215 #define LOP_FIXR 4
    216 #define LOP_FIXRX 5
    217 #define LOP_FILE 6
    218 #define LOP_LINE 7
    219 #define LOP_SPEC 8
    220 #define LOP_PRE 9
    221 #define LOP_POST 10
    222 #define LOP_STAB 11
    223 #define LOP_END 12
    224 
    225 #define LOP_QUOTE_NEXT ((LOP << 24) | (LOP_QUOTE << 16) | 1)
    226 #define SPEC_DATA_SECTION 80
    227 #define LOP_SPEC_SECTION \
    228  ((LOP << 24) | (LOP_SPEC << 16) | SPEC_DATA_SECTION)
    229 
    230 /* Must be a power of two.  If you change this to be >= 64k, you need a
    231    new test-case; the ld test b-loc64k.d touches chunk-size problem areas.  */
    232 #define MMO_SEC_CONTENTS_CHUNK_SIZE (1 << 15)
    233 
    234 /* An arbitrary number for the maximum length section name size.  */
    235 #define MAX_SECTION_NAME_SIZE (1024 * 1024)
    236 
    237 /* A quite arbitrary number for the maximum length section size.  */
    238 #define MAX_ARTIFICIAL_SECTION_SIZE (1024 * 1024 * 1024)
    239 
    240 #define MMO3_WCHAR 0x80
    241 #define MMO3_LEFT 0x40
    242 #define MMO3_MIDDLE 0x20
    243 #define MMO3_RIGHT 0x10
    244 #define MMO3_TYPEBITS 0xf
    245 #define MMO3_REGQUAL_BITS 0xf
    246 #define MMO3_UNDEF 2
    247 #define MMO3_DATA 8
    248 #define MMO3_SYMBITS 0x2f
    249 
    250 /* Put these everywhere in new code.  */
    251 #define FATAL_DEBUG						\
    252  _bfd_abort (__FILE__, __LINE__,				\
    253 	     "Internal: Non-debugged code (test-case missing)")
    254 
    255 #define BAD_CASE(x)				\
    256  _bfd_abort (__FILE__, __LINE__,		\
    257 	     "bad case for " #x)
    258 
    259 enum mmo_sym_type { mmo_reg_sym, mmo_undef_sym, mmo_data_sym, mmo_abs_sym};
    260 
    261 /* When scanning the mmo file, a linked list of mmo_symbol
    262    structures is built to represent the symbol table (if there is
    263    one).  */
    264 
    265 struct mmo_symbol
    266   {
    267     struct mmo_symbol *next;
    268     char *name;
    269     bfd_vma value;
    270     enum mmo_sym_type sym_type;
    271     unsigned int serno;
    272   };
    273 
    274 struct mmo_data_list_struct
    275   {
    276     struct mmo_data_list_struct *next;
    277     bfd_vma where;
    278     bfd_size_type size;
    279     bfd_size_type allocated_size;
    280     bfd_byte data[1];
    281   };
    282 
    283 typedef struct mmo_data_list_struct mmo_data_list_type;
    284 
    285 struct mmo_symbol_trie
    286   {
    287     struct mmo_symbol_trie *left;
    288     struct mmo_symbol_trie *right;
    289     struct mmo_symbol_trie *middle;
    290 
    291     bfd_byte symchar;
    292 
    293     /* A zero name means there's nothing here.  */
    294     struct mmo_symbol sym;
    295   };
    296 
    297 /* The mmo tdata information.  */
    298 
    299 struct mmo_data_struct
    300   {
    301     struct mmo_symbol *symbols;
    302     struct mmo_symbol *symtail;
    303     asymbol *csymbols;
    304 
    305     /* File representation of time (NULL) when this file was created.  */
    306     bfd_byte created[4];
    307 
    308     /* When we're reading bytes recursively, check this occasionally.
    309        Also holds write errors.  */
    310     bfd_boolean have_error;
    311 
    312     /* Max symbol length that may appear in the lop_stab table.  Note that
    313        this table might just hold a subset of symbols for not-really large
    314        programs, as it can only be 65536 * 4 bytes large.  */
    315     int max_symbol_length;
    316 
    317     /* Here's the symbol we build in lop_stab.  */
    318     char *lop_stab_symbol;
    319 
    320     /* Index into lop_stab_symbol for the next character when parsing the
    321        symbol information.  */
    322     int symbol_position;
    323 
    324     /* When creating arbitrary sections, we need to count section numbers.  */
    325     int sec_no;
    326 
    327     /* When writing or reading byte-wise, we need to count the bytes
    328        within a 32-bit word.  */
    329     int byte_no;
    330 
    331     /* We also need a buffer to hold the bytes we count reading or writing.  */
    332     bfd_byte buf[4];
    333   };
    334 
    335 typedef struct mmo_data_struct tdata_type;
    336 
    337 struct mmo_section_data_struct
    338   {
    339     mmo_data_list_type *head;
    340     mmo_data_list_type *tail;
    341   };
    342 
    343 #define mmo_section_data(sec) \
    344   ((struct mmo_section_data_struct *) (sec)->used_by_bfd)
    345 
    346 /* These structures are used in bfd_map_over_sections constructs.  */
    347 
    348 /* Used when writing out sections; all but the register contents section
    349    which is stored in reg_section.  */
    350 struct mmo_write_sec_info
    351   {
    352     asection *reg_section;
    353     bfd_boolean retval;
    354   };
    355 
    356 /* Used when trying to find a section corresponding to addr.  */
    357 struct mmo_find_sec_info
    358   {
    359     asection *sec;
    360     bfd_vma addr;
    361   };
    362 
    363 static bfd_boolean mmo_bfd_copy_private_bfd_data (bfd *, bfd *);
    364 static void mmo_write_section_unless_reg_contents (bfd *, asection *, void *);
    365 static void mmo_find_sec_w_addr (bfd *, asection *, void *);
    366 static void mmo_find_sec_w_addr_grow (bfd *, asection *, void *);
    367 static asection *mmo_make_section (bfd *, const char *);
    368 static void mmo_get_symbol_info (bfd *, asymbol *, symbol_info *);
    369 static void mmo_print_symbol (bfd *, void *, asymbol *,
    370 			      bfd_print_symbol_type);
    371 static void mmo_init (void);
    372 static bfd_boolean mmo_mkobject (bfd *);
    373 static bfd_boolean mmo_scan (bfd *);
    374 static asection *mmo_decide_section (bfd *, bfd_vma);
    375 static asection *mmo_get_generic_spec_data_section (bfd *, int);
    376 static asection *mmo_get_spec_section (bfd *, int);
    377 static INLINE bfd_byte *mmo_get_loc (asection *, bfd_vma, int);
    378 static void mmo_xore_64 (asection *, bfd_vma vma, bfd_vma value);
    379 static void mmo_xore_32 (asection *, bfd_vma vma, unsigned int);
    380 static void mmo_xore_16 (asection *, bfd_vma vma, unsigned int);
    381 static const bfd_target *mmo_object_p (bfd *);
    382 static void mmo_map_set_sizes (bfd *, asection *, void *);
    383 static bfd_boolean mmo_get_symbols (bfd *);
    384 static bfd_boolean mmo_create_symbol (bfd *, const char *, bfd_vma,
    385 				      enum mmo_sym_type, unsigned int);
    386 static bfd_boolean mmo_get_section_contents (bfd *, asection *, void *,
    387 					     file_ptr, bfd_size_type);
    388 static long mmo_get_symtab_upper_bound (bfd *);
    389 static long mmo_canonicalize_symtab (bfd *, asymbol **);
    390 static void mmo_get_symbol_info (bfd *, asymbol *, symbol_info *);
    391 static void mmo_print_symbol (bfd *, void *, asymbol *,
    392 			      bfd_print_symbol_type);
    393 static bfd_boolean mmo_set_section_contents (bfd *, sec_ptr, const void *,
    394 					     file_ptr, bfd_size_type);
    395 static int mmo_sizeof_headers (bfd *, struct bfd_link_info *);
    396 static bfd_boolean mmo_internal_write_header (bfd *);
    397 static bfd_boolean mmo_internal_write_post (bfd *, int, asection *);
    398 static bfd_boolean mmo_internal_add_3_sym (bfd *, struct mmo_symbol_trie *,
    399 					   const struct mmo_symbol *);
    400 static unsigned int mmo_internal_3_length (bfd *, struct mmo_symbol_trie *);
    401 static void mmo_internal_3_dump (bfd *, struct mmo_symbol_trie *);
    402 static void mmo_beb128_out (bfd *, int, int);
    403 static bfd_boolean mmo_internal_write_section (bfd *, asection *);
    404 static void mmo_write_tetra (bfd *, unsigned int);
    405 static void mmo_write_tetra_raw (bfd *, unsigned int);
    406 static void mmo_write_octa (bfd *, bfd_vma);
    407 static void mmo_write_octa_raw (bfd *, bfd_vma);
    408 static bfd_boolean mmo_write_chunk (bfd *, const bfd_byte *, unsigned int);
    409 static bfd_boolean mmo_flush_chunk (bfd *);
    410 static bfd_boolean mmo_write_loc_chunk (bfd *, bfd_vma, const bfd_byte *,
    411 					unsigned int, bfd_vma *);
    412 static bfd_boolean mmo_write_chunk_list (bfd *, mmo_data_list_type *);
    413 static bfd_boolean mmo_write_loc_chunk_list (bfd *, mmo_data_list_type *);
    414 static bfd_boolean mmo_write_symbols_and_terminator (bfd *);
    415 static flagword mmo_sec_flags_from_bfd_flags (flagword);
    416 static flagword bfd_sec_flags_from_mmo_flags (flagword);
    417 static bfd_byte mmo_get_byte (bfd *);
    418 static void mmo_write_byte (bfd *, bfd_byte);
    419 static bfd_boolean mmo_new_section_hook (bfd *, asection *);
    420 static int mmo_sort_mmo_symbols (const void *, const void *);
    421 static bfd_boolean mmo_write_object_contents (bfd *);
    422 static bfd_boolean mmo_write_section_description (bfd *, asection *);
    423 static bfd_boolean mmo_has_leading_or_trailing_zero_tetra_p (bfd *,
    424 							     asection *);
    425 
    426 /* Global "const" variables initialized once.  Must not depend on
    427    particular input or caller; put such things into the bfd or elsewhere.
    428    Look ma, no static per-invocation data!  */
    429 
    430 static
    431 char valid_mmo_symbol_character_set[/* A-Z a-z (we assume consecutive
    432 				       codes; sorry EBCDIC:ers!).  */
    433 				    + 'Z' - 'A' + 1 + 'z' - 'a' + 1
    434 				    /* Digits.  */
    435 				    + 10
    436 				    /* ':' and '_'.  */
    437 				    + 1 + 1
    438 				    /* Codes higher than 126.  */
    439 				    + 256 - 126
    440 				    /* Ending zero.  */
    441 				    + 1];
    442 
    443 
    444 /* Get section SECNAME or create one if it doesn't exist.  When creating
    445    one, new memory for the name is allocated.  */
    446 
    447 static asection *
    448 mmo_make_section (bfd *abfd, const char *secname)
    449 {
    450   asection *sec = bfd_get_section_by_name (abfd, secname);
    451 
    452   if (sec == NULL)
    453     {
    454       char *newsecname = strdup (secname);
    455 
    456       if (newsecname == NULL)
    457 	{
    458 	  (*_bfd_error_handler)
    459 	    (_("%s: No core to allocate section name %s\n"),
    460 	     bfd_get_filename (abfd), secname);
    461 	  bfd_set_error (bfd_error_system_call);
    462 	  return NULL;
    463 	}
    464       sec = bfd_make_section (abfd, newsecname);
    465     }
    466 
    467   return sec;
    468 }
    469 
    470 /* Nothing to do, but keep as a placeholder if we need it.
    471    Note that state that might differ between bfd:s must not be initialized
    472    here, nor must it be static.  Add it to tdata information instead.  */
    473 
    474 static void
    475 mmo_init (void)
    476 {
    477   static bfd_boolean inited = FALSE;
    478   int i = 0;
    479   int j = 0;
    480   static const char letters[]
    481     = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789:_";
    482 
    483   if (inited)
    484     return;
    485   inited = TRUE;
    486 
    487   /* Fill in the set of valid symbol characters.  */
    488   strcpy (valid_mmo_symbol_character_set, letters);
    489   i = strlen (letters);
    490 
    491   for (j = 126; j < 256; j++)
    492     valid_mmo_symbol_character_set[i++] = j;
    493 }
    494 
    495 /* Check whether an existing file is an mmo file.  */
    496 
    497 static const bfd_target *
    498 mmo_object_p (bfd *abfd)
    499 {
    500   struct stat statbuf;
    501   bfd_byte b[4];
    502 
    503   mmo_init ();
    504 
    505   if (bfd_stat (abfd, &statbuf) < 0
    506       || bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
    507       || bfd_bread (b, 4, abfd) != 4)
    508     goto bad_final;
    509 
    510   /* All mmo files are a multiple of four bytes long.
    511      Only recognize version one.  */
    512   if ((statbuf.st_size % 4) != 0
    513       || b[0] != LOP || b[1] != LOP_PRE || b[2] != 1)
    514     goto bad_format;
    515 
    516   /* Get the last 32-bit word.  */
    517   if (bfd_seek (abfd, (file_ptr) statbuf.st_size - 4, SEEK_SET) != 0
    518       || bfd_bread (b, 4, abfd) != 4)
    519     goto bad_final;
    520 
    521   /* Check if the file ends in a lop_end lopcode. */
    522   if (b[0] != LOP || b[1] != LOP_END || ! mmo_mkobject (abfd))
    523     goto bad_format;
    524 
    525   /* Compute an upper bound on the max symbol length.  Not really
    526      important as all of the symbol information can only be 256k.  */
    527   abfd->tdata.mmo_data->max_symbol_length = (b[2] * 256 + b[3]) * 4;
    528   abfd->tdata.mmo_data->lop_stab_symbol
    529     = bfd_malloc (abfd->tdata.mmo_data->max_symbol_length + 1);
    530 
    531   if (abfd->tdata.mmo_data->lop_stab_symbol == NULL)
    532     {
    533       (*_bfd_error_handler)
    534 	(_("%s: No core to allocate a symbol %d bytes long\n"),
    535 	 bfd_get_filename (abfd), abfd->tdata.mmo_data->max_symbol_length);
    536       goto bad_final;
    537     }
    538 
    539   /* Read in everything.  */
    540   if (! mmo_scan (abfd))
    541     goto bad_format_free;
    542 
    543   if (abfd->symcount > 0)
    544     abfd->flags |= HAS_SYMS;
    545 
    546   /* You'll have to tweak this if you want to use this format for other
    547      arches (not recommended due to its small-size limitations).  Look at
    548      the ELF format for how to make it target-generic.  */
    549   if (! bfd_default_set_arch_mach (abfd, bfd_arch_mmix, 0))
    550     goto bad_format_free;
    551 
    552   return abfd->xvec;
    553 
    554  bad_format_free:
    555   free (abfd->tdata.mmo_data->lop_stab_symbol);
    556  bad_format:
    557   bfd_set_error (bfd_error_wrong_format);
    558  bad_final:
    559   return NULL;
    560 }
    561 
    562 /* Set up the mmo tdata information.  */
    563 
    564 static bfd_boolean
    565 mmo_mkobject (bfd *abfd)
    566 {
    567   mmo_init ();
    568 
    569   if (abfd->tdata.mmo_data == NULL)
    570     {
    571       time_t created;
    572 
    573       /* All fields are zero-initialized, so we don't have to explicitly
    574 	 initialize most.  */
    575       tdata_type *tdata = (tdata_type *) bfd_zmalloc (sizeof (tdata_type));
    576       if (tdata == NULL)
    577 	return FALSE;
    578 
    579       created = time (NULL);
    580       bfd_put_32 (abfd, created, tdata->created);
    581 
    582       abfd->tdata.mmo_data = tdata;
    583     }
    584 
    585   return TRUE;
    586 }
    587 
    588 static bfd_boolean
    589 mmo_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
    590 {
    591   if (bfd_get_flavour (ibfd) != bfd_target_mmo_flavour
    592       || bfd_get_flavour (obfd) != bfd_target_mmo_flavour)
    593     return TRUE;
    594 
    595   /* Copy the time the copied-from file was created.  If people want the
    596      time the file was last *modified*, they have that in the normal file
    597      information.  */
    598   memcpy (obfd->tdata.mmo_data->created, ibfd->tdata.mmo_data->created,
    599 	  sizeof (obfd->tdata.mmo_data->created));
    600   return TRUE;
    601 }
    602 
    603 /* Helper functions for mmo_decide_section, used through
    604    bfd_map_over_sections.  */
    605 
    606 static void
    607 mmo_find_sec_w_addr (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *p)
    608 {
    609   struct mmo_find_sec_info *infop = (struct mmo_find_sec_info *) p;
    610   bfd_vma vma = bfd_get_section_vma (abfd, sec);
    611 
    612   /* Ignore sections that aren't loaded.  */
    613   if ((bfd_get_section_flags (abfd, sec) & (SEC_LOAD | SEC_ALLOC))
    614       !=  (SEC_LOAD | SEC_ALLOC))
    615     return;
    616 
    617   if (infop->addr >= vma && infop->addr < vma + sec->size)
    618     infop->sec = sec;
    619 }
    620 
    621 static void
    622 mmo_find_sec_w_addr_grow (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *p)
    623 {
    624   struct mmo_find_sec_info *infop = (struct mmo_find_sec_info *) p;
    625   bfd_vma vma = bfd_get_section_vma (abfd, sec);
    626 
    627   /* Ignore sections that aren't loaded.  */
    628   if ((bfd_get_section_flags (abfd, sec) & (SEC_LOAD | SEC_ALLOC))
    629       !=  (SEC_LOAD | SEC_ALLOC))
    630     return;
    631 
    632   if (infop->addr >= vma && infop->addr < vma + MAX_ARTIFICIAL_SECTION_SIZE)
    633     infop->sec = sec;
    634 }
    635 
    636 /* Find a section that corresponds to a VMA.  Automatically create .text
    637    or .data and set current section to it, depending on what vma.  If we
    638    can't deduce a section, make one up as ".MMIX.sec.N", where N is an
    639    increasing number.  */
    640 
    641 static asection *
    642 mmo_decide_section (bfd *abfd, bfd_vma vma)
    643 {
    644   asection *sec = NULL;
    645   char sec_name[sizeof (".MMIX.sec.") + 20];
    646   struct mmo_find_sec_info info;
    647 
    648   info.addr = vma;
    649   info.sec = NULL;
    650 
    651   /* First see if there's a section that would match exactly.  */
    652   bfd_map_over_sections (abfd, mmo_find_sec_w_addr, &info);
    653 
    654   if (info.sec != NULL)
    655     return info.sec;
    656 
    657   /* If there's no such section, try and expand one of the existing ones,
    658      up to a limit.  Make sure we have .text and .data before we try that;
    659      create them corresponding to expected addresses and set flags to make
    660      them match the "loaded and with contents" expectation.  */
    661   if ((vma >> 56) == 0)
    662     {
    663       sec = bfd_make_section_old_way (abfd, MMO_TEXT_SECTION_NAME);
    664 
    665       if (sec == NULL)
    666 	return NULL;
    667 
    668       if (! sec->user_set_vma && ! bfd_set_section_vma (abfd, sec, vma))
    669 	return NULL;
    670 
    671       if (! bfd_set_section_flags (abfd, sec,
    672 				   bfd_get_section_flags (abfd, sec)
    673 				   | SEC_CODE | SEC_LOAD | SEC_ALLOC))
    674 	return NULL;
    675     }
    676   else if ((vma >> 56) == 0x20)
    677     {
    678       sec = bfd_make_section_old_way (abfd, MMO_DATA_SECTION_NAME);
    679 
    680       if (sec == NULL)
    681 	return NULL;
    682 
    683       if (! sec->user_set_vma && ! bfd_set_section_vma (abfd, sec, vma))
    684 	return NULL;
    685 
    686       if (! bfd_set_section_flags (abfd, sec,
    687 				   bfd_get_section_flags (abfd, sec)
    688 				   | SEC_LOAD | SEC_ALLOC))
    689 	return NULL;
    690     }
    691 
    692   bfd_map_over_sections (abfd, mmo_find_sec_w_addr_grow, &info);
    693 
    694   if (info.sec != NULL)
    695     return info.sec;
    696 
    697   /* If there's still no suitable section, make a new one.  */
    698   sprintf (sec_name, ".MMIX.sec.%d", abfd->tdata.mmo_data->sec_no++);
    699   sec = mmo_make_section (abfd, sec_name);
    700 
    701   if (! sec->user_set_vma && ! bfd_set_section_vma (abfd, sec, vma))
    702     return NULL;
    703 
    704   if (! bfd_set_section_flags (abfd, sec,
    705 			       bfd_get_section_flags (abfd, sec)
    706 			       | SEC_LOAD | SEC_ALLOC))
    707     return NULL;
    708   return sec;
    709 }
    710 
    711 /* Xor in a 64-bit value VALUE at VMA.  */
    712 
    713 static INLINE void
    714 mmo_xore_64 (asection *sec, bfd_vma vma, bfd_vma value)
    715 {
    716   bfd_byte *loc = mmo_get_loc (sec, vma, 8);
    717   bfd_vma prev = bfd_get_64 (sec->owner, loc);
    718 
    719   value ^= prev;
    720   bfd_put_64 (sec->owner, value, loc);
    721 }
    722 
    723 /* Xor in a 32-bit value VALUE at VMA.  */
    724 
    725 static INLINE void
    726 mmo_xore_32 (asection *sec, bfd_vma vma, unsigned int value)
    727 {
    728   bfd_byte *loc = mmo_get_loc (sec, vma, 4);
    729   unsigned int prev = bfd_get_32 (sec->owner, loc);
    730 
    731   value ^= prev;
    732   bfd_put_32 (sec->owner, value, loc);
    733 }
    734 
    735 /* Xor in a 16-bit value VALUE at VMA.  */
    736 
    737 static INLINE void
    738 mmo_xore_16 (asection *sec, bfd_vma vma, unsigned int value)
    739 {
    740   bfd_byte *loc = mmo_get_loc (sec, vma, 2);
    741   unsigned int prev = bfd_get_16 (sec->owner, loc);
    742 
    743   value ^= prev;
    744   bfd_put_16 (sec->owner, value, loc);
    745 }
    746 
    747 /* Write a 32-bit word to output file, no lop_quote generated.  */
    748 
    749 static INLINE void
    750 mmo_write_tetra_raw (bfd *abfd, unsigned int value)
    751 {
    752   bfd_byte buf[4];
    753 
    754   bfd_put_32 (abfd, value, buf);
    755 
    756   if (bfd_bwrite (buf, 4, abfd) != 4)
    757     abfd->tdata.mmo_data->have_error = TRUE;
    758 }
    759 
    760 /* Write a 32-bit word to output file; lop_quote if necessary.  */
    761 
    762 static INLINE void
    763 mmo_write_tetra (bfd *abfd, unsigned int value)
    764 {
    765   if (((value >> 24) & 0xff) == LOP)
    766     mmo_write_tetra_raw (abfd, LOP_QUOTE_NEXT);
    767 
    768   mmo_write_tetra_raw (abfd, value);
    769 }
    770 
    771 /* Write a 64-bit word to output file, perhaps with lop_quoting.  */
    772 
    773 static INLINE void
    774 mmo_write_octa (bfd *abfd, bfd_vma value)
    775 {
    776   mmo_write_tetra (abfd, (unsigned int) (value >> 32));
    777   mmo_write_tetra (abfd, (unsigned int) value);
    778 }
    779 
    780 /* Write a 64-bit word to output file, without lop_quoting.  */
    781 
    782 static INLINE void
    783 mmo_write_octa_raw (bfd *abfd, bfd_vma value)
    784 {
    785   mmo_write_tetra_raw (abfd, (unsigned int) (value >> 32));
    786   mmo_write_tetra_raw (abfd, (unsigned int) value);
    787 }
    788 
    789 /* Write quoted contents.  Intended to be called multiple times in
    790    sequence, followed by a call to mmo_flush_chunk.  */
    791 
    792 static INLINE bfd_boolean
    793 mmo_write_chunk (bfd *abfd, const bfd_byte *loc, unsigned int len)
    794 {
    795   bfd_boolean retval = TRUE;
    796   struct mmo_data_struct *mmop = abfd->tdata.mmo_data;
    797 
    798   /* Fill up a tetra from bytes remaining from a previous chunk.  */
    799   if (mmop->byte_no != 0)
    800     {
    801       while (mmop->byte_no < 4 && len != 0)
    802 	{
    803 	  mmop->buf[mmop->byte_no++] = *loc++;
    804 	  len--;
    805 	}
    806 
    807       if (mmop->byte_no == 4)
    808 	{
    809 	  mmo_write_tetra (abfd, bfd_get_32 (abfd, mmop->buf));
    810 	  mmop->byte_no = 0;
    811 	}
    812     }
    813 
    814   while (len >= 4)
    815     {
    816       if (loc[0] == LOP)
    817 	mmo_write_tetra_raw (abfd, LOP_QUOTE_NEXT);
    818 
    819       retval = (retval
    820 		&& ! mmop->have_error
    821 		&& 4 == bfd_bwrite (loc, 4, abfd));
    822 
    823       loc += 4;
    824       len -= 4;
    825     }
    826 
    827   if (len)
    828     {
    829       /* We must have flushed a previous remainder if we get one from
    830 	 this chunk too.  */
    831       BFD_ASSERT (mmop->byte_no == 0);
    832       memcpy (mmop->buf, loc, len);
    833       mmop->byte_no = len;
    834     }
    835 
    836   if (! retval)
    837     mmop->have_error = TRUE;
    838   return retval;
    839 }
    840 
    841 /* Flush remaining bytes, from a previous mmo_write_chunk, zero-padded to
    842    4 bytes.  */
    843 
    844 static INLINE bfd_boolean
    845 mmo_flush_chunk (bfd *abfd)
    846 {
    847   if (abfd->tdata.mmo_data->byte_no != 0)
    848     {
    849       memset (abfd->tdata.mmo_data->buf + abfd->tdata.mmo_data->byte_no,
    850 	      0, 4 - abfd->tdata.mmo_data->byte_no);
    851       mmo_write_tetra (abfd,
    852 		       bfd_get_32 (abfd, abfd->tdata.mmo_data->buf));
    853       abfd->tdata.mmo_data->byte_no = 0;
    854     }
    855 
    856   return ! abfd->tdata.mmo_data->have_error;
    857 }
    858 
    859 /* Same, but from a list.  */
    860 
    861 static INLINE bfd_boolean
    862 mmo_write_chunk_list (bfd *abfd, mmo_data_list_type *datap)
    863 {
    864   for (; datap != NULL; datap = datap->next)
    865     if (! mmo_write_chunk (abfd, datap->data, datap->size))
    866       return FALSE;
    867 
    868   return mmo_flush_chunk (abfd);
    869 }
    870 
    871 /* Write a lop_loc and some contents.  A caller needs to call
    872    mmo_flush_chunk after calling this function.  The location is only
    873    output if different than *LAST_VMAP, which is updated after this call.  */
    874 
    875 static bfd_boolean
    876 mmo_write_loc_chunk (bfd *abfd, bfd_vma vma, const bfd_byte *loc,
    877 		     unsigned int len, bfd_vma *last_vmap)
    878 {
    879   /* Find an initial and trailing section of zero (aligned) tetras; we don't
    880      need to write out zeros.  FIXME: When we do this, we should emit
    881      section size and address specifiers, else objcopy can't always perform
    882      an identity translation.  Only do this if we *don't* have left-over
    883      data from a previous write (and will not add any) or else the vma of
    884      this chunk is *not* the next address, because then data isn't
    885      tetrabyte-aligned and we're concatenating to that left-over data.  */
    886 
    887   if ((vma & 3) == 0
    888       && (abfd->tdata.mmo_data->byte_no == 0 || vma != *last_vmap))
    889     {
    890       while (len > 4 && bfd_get_32 (abfd, loc) == 0)
    891 	{
    892 	  vma += 4;
    893 	  len -= 4;
    894 	  loc += 4;
    895 	}
    896 
    897       if ((len & 3) == 0)
    898 	while (len > 4 && bfd_get_32 (abfd, loc + len - 4) == 0)
    899 	  len -= 4;
    900     }
    901 
    902   /* Only write out the location if it's different than the one the caller
    903      (supposedly) previously handled, accounting for omitted leading zeros.  */
    904   if (vma != *last_vmap)
    905     {
    906       /* We might be in the middle of a sequence.  */
    907       mmo_flush_chunk (abfd);
    908 
    909       /* This should not happen during normal usage, but can presumably
    910 	 happen with an erroneous linker-script, so handle gracefully.
    911 	 Avoid Knuth-specific terms in the message, such as "tetrabyte".
    912 	 Note that this function will get non-4-multiple lengths and
    913 	 unaligned vmas but those come in tuples (mostly pairs) and are
    914 	 continuous (i.e. the if-condition above false) and they are
    915 	 group-wise aligned.  */
    916       if ((vma & 3) != 0)
    917 	{
    918 	  (*_bfd_error_handler)
    919 	    (_("%s: attempt to emit contents at non-multiple-of-4 address 0x%lx\n"),
    920 	     bfd_get_filename (abfd), (unsigned long) vma);
    921 	  bfd_set_error (bfd_error_bad_value);
    922 	  return FALSE;
    923 	}
    924 
    925       /* We always write the location as 64 bits; no use saving bytes
    926          here.  */
    927       mmo_write_tetra_raw (abfd, (LOP << 24) | (LOP_LOC << 16) | 2);
    928       mmo_write_octa_raw (abfd, vma);
    929     }
    930 
    931   /* Update to reflect end of this chunk, with trailing zeros omitted.  */
    932   *last_vmap = vma + len;
    933 
    934   return (! abfd->tdata.mmo_data->have_error
    935 	  && mmo_write_chunk (abfd, loc, len));
    936 }
    937 
    938 /* Same, but from a list.  */
    939 
    940 static INLINE bfd_boolean
    941 mmo_write_loc_chunk_list (bfd *abfd, mmo_data_list_type *datap)
    942 {
    943   /* Get an address different than the address of the first chunk.  */
    944   bfd_vma last_vma = datap ? datap->where - 1 : 0;
    945 
    946   for (; datap != NULL; datap = datap->next)
    947     if (! mmo_write_loc_chunk (abfd, datap->where, datap->data, datap->size,
    948 			       &last_vma))
    949       return FALSE;
    950 
    951   return mmo_flush_chunk (abfd);
    952 }
    953 
    954 /* Make a .MMIX.spec_data.N section.  */
    955 
    956 static asection *
    957 mmo_get_generic_spec_data_section (bfd *abfd, int spec_data_number)
    958 {
    959   asection *sec;
    960   char secname[sizeof (MMIX_OTHER_SPEC_SECTION_PREFIX) + 20]
    961     = MMIX_OTHER_SPEC_SECTION_PREFIX;
    962 
    963   sprintf (secname + strlen (MMIX_OTHER_SPEC_SECTION_PREFIX),
    964 	   "%d", spec_data_number);
    965 
    966   sec = mmo_make_section (abfd, secname);
    967 
    968   return sec;
    969 }
    970 
    971 /* Make a special section for SPEC_DATA_NUMBER.  If it is the one we use
    972    ourselves, parse some of its data to get at the section name.  */
    973 
    974 static asection *
    975 mmo_get_spec_section (bfd *abfd, int spec_data_number)
    976 {
    977   char *secname;
    978   asection *sec;
    979   bfd_byte buf[4];
    980   unsigned int secname_length;
    981   unsigned int i;
    982   bfd_vma section_length;
    983   bfd_vma section_vma;
    984   mmo_data_list_type *loc;
    985   flagword flags;
    986   long orig_pos;
    987 
    988   /* If this isn't the "special" special data, then make a placeholder
    989      section.  */
    990   if (spec_data_number != SPEC_DATA_SECTION)
    991     return mmo_get_generic_spec_data_section (abfd, spec_data_number);
    992 
    993   /* Seek back to this position if there was a format error.  */
    994   orig_pos = bfd_tell (abfd);
    995 
    996   /* Read the length (in 32-bit words).  */
    997   if (bfd_bread (buf, 4, abfd) != 4)
    998     goto format_error;
    999 
   1000   if (buf[0] == LOP)
   1001     {
   1002       if (buf[1] != LOP_QUOTE)
   1003 	goto format_error;
   1004 
   1005       if (bfd_bread (buf, 4, abfd) != 4)
   1006 	goto format_error;
   1007     }
   1008 
   1009   /* We don't care to keep the name length accurate.  It's
   1010      zero-terminated.  */
   1011   secname_length = bfd_get_32 (abfd, buf) * 4;
   1012 
   1013   /* Check section name length for sanity.  */
   1014   if (secname_length > MAX_SECTION_NAME_SIZE)
   1015     goto format_error;
   1016 
   1017   /* This should be free'd regardless if a section is created.  */
   1018   secname = bfd_malloc (secname_length + 1);
   1019   secname[secname_length] = 0;
   1020 
   1021   for (i = 0; i < secname_length / 4; i++)
   1022     {
   1023       if (bfd_bread (secname + i * 4, 4, abfd) != 4)
   1024 	goto format_error_free;
   1025 
   1026       if (secname[i * 4] == (char) LOP)
   1027 	{
   1028 	  /* A bit of overkill, but we handle char 0x98 in a section name,
   1029 	     and recognize misparsing.  */
   1030 	  if (secname[i * 4 + 1] != LOP_QUOTE
   1031 	      || bfd_bread (secname + i * 4, 4, abfd) != 4)
   1032 	    /* Whoops.  We thought this was a name, and now we found a
   1033 	       non-lop_quote lopcode before we parsed the whole length of
   1034 	       the name.  Signal end-of-file in the same manner.  */
   1035 	      goto format_error_free;
   1036 	}
   1037     }
   1038 
   1039   /* Get the section flags.  */
   1040   if (bfd_bread (buf, 4, abfd) != 4
   1041       || (buf[0] == LOP
   1042 	  && (buf[1] != LOP_QUOTE || bfd_bread (buf, 4, abfd) != 4)))
   1043     goto format_error_free;
   1044 
   1045   flags = bfd_get_32 (abfd, buf);
   1046 
   1047   /* Get the section length.  */
   1048   if (bfd_bread (buf, 4, abfd) != 4
   1049       || (buf[0] == LOP
   1050 	  && (buf[1] != LOP_QUOTE || bfd_bread (buf, 4, abfd) != 4)))
   1051     goto format_error_free;
   1052 
   1053   section_length = (bfd_vma) bfd_get_32 (abfd, buf) << 32;
   1054 
   1055   /* That's the first, high-part.  Now get the low part.  */
   1056 
   1057   if (bfd_bread (buf, 4, abfd) != 4
   1058       || (buf[0] == LOP
   1059 	  && (buf[1] != LOP_QUOTE || bfd_bread (buf, 4, abfd) != 4)))
   1060     goto format_error_free;
   1061 
   1062   section_length |= (bfd_vma) bfd_get_32 (abfd, buf);
   1063 
   1064   /* Check the section length for sanity.  */
   1065   if (section_length > MAX_ARTIFICIAL_SECTION_SIZE)
   1066     goto format_error_free;
   1067 
   1068   /* Get the section VMA.  */
   1069   if (bfd_bread (buf, 4, abfd) != 4
   1070       || (buf[0] == LOP
   1071 	  && (buf[1] != LOP_QUOTE || bfd_bread (buf, 4, abfd) != 4)))
   1072     goto format_error_free;
   1073 
   1074   section_vma = (bfd_vma) bfd_get_32 (abfd, buf) << 32;
   1075 
   1076   /* That's the first, high-part.  Now get the low part.  */
   1077   if (bfd_bread (buf, 4, abfd) != 4
   1078       || (buf[0] == LOP
   1079 	  && (buf[1] != LOP_QUOTE || bfd_bread (buf, 4, abfd) != 4)))
   1080     goto format_error_free;
   1081 
   1082   section_vma |= (bfd_vma) bfd_get_32 (abfd, buf);
   1083 
   1084   sec = mmo_make_section (abfd, secname);
   1085   free (secname);
   1086   if (sec == NULL)
   1087     goto format_error;
   1088 
   1089   /* We allocate a buffer here for the advertised size, with head room for
   1090      tetrabyte alignment.  */
   1091   loc = bfd_zmalloc (section_length + 3
   1092 		     + sizeof (struct mmo_data_list_struct));
   1093   if (loc == NULL)
   1094     goto format_error;
   1095 
   1096   /* Use a TETRA-rounded size for the allocated buffer; we set the
   1097      "visible" section size below.  */
   1098   loc->size = (section_length + 3) & ~3;
   1099 
   1100   /* Add in the section flags we found to those bfd entered during this
   1101      process and set the contents.  */
   1102   if (! bfd_set_section_flags (abfd, sec,
   1103 			       bfd_sec_flags_from_mmo_flags (flags)
   1104 			       | bfd_get_section_flags (abfd, sec)
   1105 			       | (section_length != 0 ? SEC_HAS_CONTENTS : 0))
   1106       || ! bfd_set_section_size (abfd, sec, sec->size + section_length)
   1107       /* Set VMA only for the first occurrence.  */
   1108       || (! sec->user_set_vma
   1109 	  && ! bfd_set_section_vma  (abfd, sec, section_vma)))
   1110     {
   1111       /* If we get an error for any of the calls above, signal more than
   1112 	 just a format error for the spec section.  */
   1113       return NULL;
   1114     }
   1115 
   1116   loc->next = NULL;
   1117   if (mmo_section_data (sec)->tail != NULL)
   1118     mmo_section_data (sec)->tail->next = loc;
   1119   else
   1120     mmo_section_data (sec)->head = loc;
   1121   mmo_section_data (sec)->tail = loc;
   1122   loc->where = section_vma;
   1123 
   1124   return sec;
   1125 
   1126  format_error_free:
   1127   free (secname);
   1128  format_error:
   1129   if (bfd_seek (abfd, orig_pos, SEEK_SET) != 0)
   1130     return NULL;
   1131 
   1132   return mmo_get_generic_spec_data_section (abfd, spec_data_number);
   1133 }
   1134 
   1135 /* Read a byte, but read from file in multiples of 32-bit words.  */
   1136 
   1137 static bfd_byte
   1138 mmo_get_byte (bfd *abfd)
   1139 {
   1140   bfd_byte retval;
   1141 
   1142   if (abfd->tdata.mmo_data->byte_no == 0)
   1143     {
   1144       if (! abfd->tdata.mmo_data->have_error
   1145 	  && bfd_bread (abfd->tdata.mmo_data->buf, 4, abfd) != 4)
   1146 	{
   1147 	  abfd->tdata.mmo_data->have_error = TRUE;
   1148 
   1149 	  /* A value somewhat safe against tripping on some inconsistency
   1150 	     when mopping up after this error.  */
   1151 	  return 128;
   1152 	}
   1153     }
   1154 
   1155   retval = abfd->tdata.mmo_data->buf[abfd->tdata.mmo_data->byte_no];
   1156   abfd->tdata.mmo_data->byte_no = (abfd->tdata.mmo_data->byte_no + 1) % 4;
   1157 
   1158   return retval;
   1159 }
   1160 
   1161 /* Write a byte, in multiples of 32-bit words.  */
   1162 
   1163 static void
   1164 mmo_write_byte (bfd *abfd, bfd_byte value)
   1165 {
   1166   abfd->tdata.mmo_data->buf[(abfd->tdata.mmo_data->byte_no++ % 4)] = value;
   1167   if ((abfd->tdata.mmo_data->byte_no % 4) == 0)
   1168     {
   1169       if (! abfd->tdata.mmo_data->have_error
   1170 	  && bfd_bwrite (abfd->tdata.mmo_data->buf, 4, abfd) != 4)
   1171 	abfd->tdata.mmo_data->have_error = TRUE;
   1172     }
   1173 }
   1174 
   1175 /* Create a symbol.  */
   1176 
   1177 static bfd_boolean
   1178 mmo_create_symbol (bfd *abfd, const char *symname, bfd_vma addr, enum
   1179 		   mmo_sym_type sym_type, unsigned int serno)
   1180 {
   1181   struct mmo_symbol *n;
   1182 
   1183   n = (struct mmo_symbol *) bfd_alloc (abfd, sizeof (struct mmo_symbol));
   1184   if (n == NULL)
   1185     return FALSE;
   1186 
   1187   n->name = bfd_alloc (abfd, strlen (symname) + 1);
   1188   if (n->name == NULL)
   1189     return FALSE;
   1190 
   1191   strcpy (n->name, symname);
   1192 
   1193   n->value = addr;
   1194   n->sym_type = sym_type;
   1195   n->serno = serno;
   1196 
   1197   if (abfd->tdata.mmo_data->symbols == NULL)
   1198     abfd->tdata.mmo_data->symbols = n;
   1199   else
   1200     abfd->tdata.mmo_data->symtail->next = n;
   1201   abfd->tdata.mmo_data->symtail = n;
   1202   n->next = NULL;
   1203 
   1204   ++abfd->symcount;
   1205 
   1206   /* Check that :Main equals the last octa of the .MMIX.reg_contents
   1207      section, as it's the one place we're sure to pass when reading a mmo
   1208      object.  For written objects, we do it while setting the symbol
   1209      table.  */
   1210   if (strcmp (symname, MMIX_START_SYMBOL_NAME) == 0
   1211       && bfd_get_start_address (abfd) != addr)
   1212     {
   1213       (*_bfd_error_handler)
   1214 	(_("%s: invalid mmo file: initialization value for $255 is not `Main'\n"),
   1215 	 bfd_get_filename (abfd));
   1216       bfd_set_error (bfd_error_bad_value);
   1217       return FALSE;
   1218     }
   1219 
   1220   return TRUE;
   1221 }
   1222 
   1223 /* Read in symbols.  */
   1224 
   1225 static bfd_boolean
   1226 mmo_get_symbols (bfd *abfd)
   1227 {
   1228 /*
   1229 INODE
   1230 Symbol-table, mmo section mapping, File layout, mmo
   1231 SUBSECTION
   1232 	Symbol table format
   1233 
   1234 	From mmixal.w (or really, the generated mmixal.tex) in the
   1235 	MMIXware package which also contains the @command{mmix} simulator:
   1236 	``Symbols are stored and retrieved by means of a @samp{ternary
   1237 	search trie}, following ideas of Bentley and Sedgewick. (See
   1238 	ACM--SIAM Symp.@: on Discrete Algorithms @samp{8} (1997), 360--369;
   1239 	R.@:Sedgewick, @samp{Algorithms in C} (Reading, Mass.@:
   1240 	Addison--Wesley, 1998), @samp{15.4}.)  Each trie node stores a
   1241 	character, and there are branches to subtries for the cases where
   1242 	a given character is less than, equal to, or greater than the
   1243 	character in the trie.  There also is a pointer to a symbol table
   1244 	entry if a symbol ends at the current node.''
   1245 
   1246 	So it's a tree encoded as a stream of bytes.  The stream of bytes
   1247 	acts on a single virtual global symbol, adding and removing
   1248 	characters and signalling complete symbol points.  Here, we read
   1249 	the stream and create symbols at the completion points.
   1250 
   1251 	First, there's a control byte <<m>>.  If any of the listed bits
   1252 	in <<m>> is nonzero, we execute what stands at the right, in
   1253 	the listed order:
   1254 
   1255 | (MMO3_LEFT)
   1256 | 0x40 - Traverse left trie.
   1257 |        (Read a new command byte and recurse.)
   1258 |
   1259 | (MMO3_SYMBITS)
   1260 | 0x2f - Read the next byte as a character and store it in the
   1261 |        current character position; increment character position.
   1262 |        Test the bits of <<m>>:
   1263 |
   1264 |        (MMO3_WCHAR)
   1265 |        0x80 - The character is 16-bit (so read another byte,
   1266 |               merge into current character.
   1267 |
   1268 |        (MMO3_TYPEBITS)
   1269 |        0xf  - We have a complete symbol; parse the type, value
   1270 |               and serial number and do what should be done
   1271 |               with a symbol.  The type and length information
   1272 |               is in j = (m & 0xf).
   1273 |
   1274 |               (MMO3_REGQUAL_BITS)
   1275 |	        j == 0xf: A register variable.  The following
   1276 |                         byte tells which register.
   1277 |               j <= 8:   An absolute symbol.  Read j bytes as the
   1278 |                         big-endian number the symbol equals.
   1279 |                         A j = 2 with two zero bytes denotes an
   1280 |                         unknown symbol.
   1281 |               j > 8:    As with j <= 8, but add (0x20 << 56)
   1282 |                         to the value in the following j - 8
   1283 |                         bytes.
   1284 |
   1285 |               Then comes the serial number, as a variant of
   1286 |               uleb128, but better named ubeb128:
   1287 |               Read bytes and shift the previous value left 7
   1288 |               (multiply by 128).  Add in the new byte, repeat
   1289 |               until a byte has bit 7 set.  The serial number
   1290 |               is the computed value minus 128.
   1291 |
   1292 |        (MMO3_MIDDLE)
   1293 |        0x20 - Traverse middle trie.  (Read a new command byte
   1294 |               and recurse.)  Decrement character position.
   1295 |
   1296 | (MMO3_RIGHT)
   1297 | 0x10 - Traverse right trie.  (Read a new command byte and
   1298 |        recurse.)
   1299 
   1300 	Let's look again at the <<lop_stab>> for the trivial file
   1301 	(@pxref{File layout}).
   1302 
   1303 | 0x980b0000 - lop_stab for ":Main" = 0, serial 1.
   1304 | 0x203a4040
   1305 | 0x10404020
   1306 | 0x4d206120
   1307 | 0x69016e00
   1308 | 0x81000000
   1309 
   1310 	This forms the trivial trie (note that the path between ``:'' and
   1311 	``M'' is redundant):
   1312 
   1313 | 203a	   ":"
   1314 | 40       /
   1315 | 40      /
   1316 | 10      \
   1317 | 40      /
   1318 | 40     /
   1319 | 204d  "M"
   1320 | 2061  "a"
   1321 | 2069  "i"
   1322 | 016e  "n" is the last character in a full symbol, and
   1323 |       with a value represented in one byte.
   1324 | 00    The value is 0.
   1325 | 81    The serial number is 1.  */
   1326 
   1327   bfd_byte m = mmo_get_byte (abfd);
   1328 
   1329   /* Check first if we have a bad hair day.  */
   1330   if (abfd->tdata.mmo_data->have_error)
   1331     return FALSE;
   1332 
   1333   if (m & MMO3_LEFT)
   1334     /* Traverse left trie. */
   1335     mmo_get_symbols (abfd);
   1336 
   1337   if (m & MMO3_SYMBITS)
   1338     {
   1339       bfd_byte c = mmo_get_byte (abfd);
   1340       bfd_byte j = m & MMO3_TYPEBITS;
   1341       bfd_vma addr = 0;
   1342       enum mmo_sym_type sym_type;
   1343       unsigned int serno = 0;
   1344       bfd_byte k;
   1345 
   1346       if (m & MMO3_WCHAR)
   1347 	{
   1348 	  bfd_byte c2 = mmo_get_byte (abfd);
   1349 
   1350 	  /* A two-byte character.  We can't grok this, but neither can
   1351 	     mmotype, for other cases than the second byte being zero.  */
   1352 
   1353 	  if (c != 0)
   1354 	    {
   1355 	      abfd->tdata.mmo_data->lop_stab_symbol
   1356 		[abfd->tdata.mmo_data->symbol_position] = 0;
   1357 
   1358 	      (*_bfd_error_handler)
   1359 		(_("%s: unsupported wide character sequence"
   1360 		   " 0x%02X 0x%02X after symbol name starting with `%s'\n"),
   1361 		 bfd_get_filename (abfd), c, c2,
   1362 		 abfd->tdata.mmo_data->lop_stab_symbol);
   1363 	      bfd_set_error (bfd_error_bad_value);
   1364 	      abfd->tdata.mmo_data->have_error = TRUE;
   1365 	      return FALSE;
   1366 	    }
   1367 	  else
   1368 	    c = c2;
   1369 	}
   1370 
   1371       abfd->tdata.mmo_data->lop_stab_symbol[abfd->tdata.mmo_data->symbol_position++] = c;
   1372       abfd->tdata.mmo_data->lop_stab_symbol[abfd->tdata.mmo_data->symbol_position] = 0;
   1373 
   1374       if (j & MMO3_REGQUAL_BITS)
   1375 	{
   1376 	  if (j == MMO3_REGQUAL_BITS)
   1377 	    {
   1378 	      sym_type = mmo_reg_sym;
   1379 	      addr = mmo_get_byte (abfd);
   1380 	    }
   1381 	  else if (j <= 8)
   1382 	    {
   1383 	      unsigned int i;
   1384 
   1385 	      for (i = 0; i < j; i++)
   1386 		addr = (addr << 8) + mmo_get_byte (abfd);
   1387 
   1388 	      if (addr == 0 && j == MMO3_UNDEF)
   1389 		sym_type = mmo_undef_sym;
   1390 	      else
   1391 		sym_type = mmo_abs_sym;
   1392 	    }
   1393 	  else
   1394 	    {
   1395 	      unsigned int i;
   1396 
   1397 	      for (i = MMO3_DATA; i < j; i++)
   1398 		addr = (addr << 8) + mmo_get_byte (abfd);
   1399 
   1400 	      addr += (bfd_vma) 0x20 << 56;
   1401 	      sym_type = mmo_data_sym;
   1402 	    }
   1403 
   1404 	  /* Get the serial number.  */
   1405 	  do
   1406 	    {
   1407 	      k = mmo_get_byte (abfd);
   1408 	      serno = (serno << 7) + k;
   1409 	    }
   1410 	  while (k < 128);
   1411 	  serno -= 128;
   1412 
   1413 	  /* Got it.  Now enter it.  Skip a leading ":".  */
   1414 	  if (! abfd->tdata.mmo_data->have_error
   1415 	      && ! mmo_create_symbol (abfd,
   1416 				      abfd->tdata.mmo_data->lop_stab_symbol
   1417 				      + 1,
   1418 				      addr, sym_type, serno))
   1419 	    abfd->tdata.mmo_data->have_error = TRUE;
   1420 	}
   1421 
   1422       if (m & MMO3_MIDDLE)
   1423 	/* Traverse middle trie. */
   1424 	mmo_get_symbols (abfd);
   1425 
   1426       abfd->tdata.mmo_data->symbol_position--;
   1427     }
   1428 
   1429   if (m & MMO3_RIGHT)
   1430     /* Traverse right trie.  */
   1431     mmo_get_symbols (abfd);
   1432 
   1433   return ! abfd->tdata.mmo_data->have_error;
   1434 }
   1435 
   1436 /* Get the location of memory area [VMA..VMA + SIZE - 1], which we think
   1437    is in section SEC.  Adjust and reallocate zero-initialized contents.
   1438    If there's new contents, allocate to the next multiple of
   1439    MMO_SEC_CONTENTS_CHUNK_SIZE.  */
   1440 
   1441 static INLINE bfd_byte *
   1442 mmo_get_loc (asection *sec, bfd_vma vma, int size)
   1443 {
   1444   bfd_size_type allocated_size;
   1445   struct mmo_section_data_struct *sdatap = mmo_section_data (sec);
   1446   struct mmo_data_list_struct *datap = sdatap->head;
   1447   struct mmo_data_list_struct *entry;
   1448 
   1449   /* First search the list to see if we have the requested chunk in one
   1450      piece, or perhaps if we have a suitable chunk with room to fit.  */
   1451   for (; datap != NULL; datap = datap->next)
   1452     {
   1453       if (datap->where <= vma
   1454 	  && datap->where + datap->size >= vma + size)
   1455 	return datap->data + vma - datap->where;
   1456       else if (datap->where <= vma
   1457 	       && datap->where + datap->allocated_size >= vma + size
   1458 	       /* Only munch on the "allocated size" if it does not
   1459 		  overlap the next chunk.  */
   1460 	       && (datap->next == NULL || datap->next->where >= vma + size))
   1461 	{
   1462 	  /* There was room allocated, but the size wasn't set to include
   1463 	     it.  Do that now.  */
   1464 	  datap->size += (vma + size) - (datap->where + datap->size);
   1465 
   1466 	  /* Update the section size.  This happens only if we update the
   1467 	     32-bit-aligned chunk size.  Callers that have
   1468 	     non-32-bit-aligned sections should do all allocation and
   1469 	     size-setting by themselves or at least set the section size
   1470 	     after the last allocating call to this function.  */
   1471 	  if (vma + size > sec->vma + sec->size)
   1472 	    sec->size += (vma + size) - (sec->vma + sec->size);
   1473 
   1474 	  return datap->data + vma - datap->where;
   1475 	}
   1476     }
   1477 
   1478   /* Not found; allocate a new block.  First check in case we get a
   1479      request for a size split up over several blocks; we'll have to return
   1480      NULL for those cases, requesting the caller to split up the request.
   1481      Requests with an address aligned on MMO_SEC_CONTENTS_CHUNK_SIZE bytes and
   1482      for no more than MMO_SEC_CONTENTS_CHUNK_SIZE will always get resolved.  */
   1483 
   1484   for (datap = sdatap->head; datap != NULL; datap = datap->next)
   1485     if ((datap->where <= vma && datap->where + datap->size > vma)
   1486 	|| (datap->where < vma + size
   1487 	    && datap->where + datap->size >= vma + size))
   1488       return NULL;
   1489 
   1490   allocated_size
   1491     = (size + MMO_SEC_CONTENTS_CHUNK_SIZE - 1) & ~(MMO_SEC_CONTENTS_CHUNK_SIZE - 1);
   1492   entry = (mmo_data_list_type *)
   1493     bfd_zalloc (sec->owner, sizeof (mmo_data_list_type) + allocated_size);
   1494   if (entry == NULL)
   1495     return NULL;
   1496   entry->where = vma;
   1497   entry->size = size;
   1498   entry->allocated_size = allocated_size;
   1499 
   1500   datap = sdatap->head;
   1501 
   1502   /* Sort the records by address.  Optimize for the common case of adding
   1503      a record to the end of the list.  */
   1504   if (sdatap->tail != NULL && entry->where >= sdatap->tail->where)
   1505     {
   1506       sdatap->tail->next = entry;
   1507       entry->next = NULL;
   1508       sdatap->tail = entry;
   1509     }
   1510   else
   1511     {
   1512       mmo_data_list_type **look;
   1513       for (look = &sdatap->head;
   1514 	   *look != NULL && (*look)->where < entry->where;
   1515 	   look = &(*look)->next)
   1516 	;
   1517       entry->next = *look;
   1518       *look = entry;
   1519       if (entry->next == NULL)
   1520 	{
   1521 	  sdatap->tail = entry;
   1522 
   1523 	  /* We get here for the first time (at other times too) for this
   1524 	     section.  Say we have contents.  */
   1525 	  if (! bfd_set_section_flags (sec->owner, sec,
   1526 				       bfd_get_section_flags (sec->owner, sec)
   1527 				       | SEC_HAS_CONTENTS))
   1528 	    return NULL;
   1529 	}
   1530     }
   1531 
   1532   /* Update the section size.  This happens only when we add contents and
   1533      re-size as we go.  The section size will then be aligned to 32 bits.  */
   1534   if (vma + size > sec->vma + sec->size)
   1535     sec->size += (vma + size) - (sec->vma + sec->size);
   1536   return entry->data;
   1537 }
   1538 
   1539 /* Set sizes once we've read in all sections.  */
   1540 
   1541 static void
   1542 mmo_map_set_sizes (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
   1543 		   void *ignored ATTRIBUTE_UNUSED)
   1544 {
   1545   sec->lma = sec->vma;
   1546 }
   1547 
   1548 /* Read the mmo file and turn it into sections.  */
   1549 
   1550 static bfd_boolean
   1551 mmo_scan (bfd *abfd)
   1552 {
   1553   unsigned int i;
   1554   unsigned int lineno = 1;
   1555   bfd_boolean error = FALSE;
   1556   bfd_vma vma = 0;
   1557   asection *sec = bfd_make_section_old_way (abfd, MMO_TEXT_SECTION_NAME);
   1558   asection *non_spec_sec = NULL;
   1559   bfd_vma non_spec_vma = 0;
   1560   bfd_size_type nbytes_read = 0;
   1561   /* Buffer with room to read a 64-bit value.  */
   1562   bfd_byte buf[8];
   1563   long stab_loc = -1;
   1564   char *file_names[256];
   1565 
   1566   abfd->symcount = 0;
   1567   memset (file_names, 0, sizeof (file_names));
   1568 
   1569   if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
   1570     goto error_return;
   1571 
   1572   while ((nbytes_read = bfd_bread (buf, 4, abfd)) == 4)
   1573     {
   1574       if (buf[0] == LOP)
   1575 	{
   1576 	  unsigned int y = bfd_get_8 (abfd, buf + 2);
   1577 	  unsigned int z = bfd_get_8 (abfd, buf + 3);
   1578 
   1579 	  /* Change back to the original section for lopcodes other
   1580 	     than LOP_QUOTE that comes after a LOP_SPEC.  */
   1581 	  if ((buf[1] != LOP_QUOTE || y != 0 || z != 1)
   1582 	      && non_spec_sec != NULL)
   1583 	    {
   1584 	      sec = non_spec_sec;
   1585 	      vma = non_spec_vma;
   1586 	      non_spec_sec = NULL;
   1587 	    }
   1588 
   1589 	  switch (buf[1])
   1590 	    {
   1591 	    default:
   1592 	      (*_bfd_error_handler)
   1593 		(_("%s: invalid mmo file: unsupported lopcode `%d'\n"),
   1594 		 bfd_get_filename (abfd), buf[1]);
   1595 	      bfd_set_error (bfd_error_bad_value);
   1596 	      goto error_return;
   1597 
   1598 	    case LOP_QUOTE:
   1599 	      /* Quote the next 32-bit word.  */
   1600 	      if (y != 0 || z != 1)
   1601 		{
   1602 		  (*_bfd_error_handler)
   1603 		    (_("%s: invalid mmo file: expected YZ = 1 got YZ = %d for lop_quote\n"),
   1604 		     bfd_get_filename (abfd), y*256+z);
   1605 		  bfd_set_error (bfd_error_bad_value);
   1606 		  goto error_return;
   1607 		}
   1608 	      if (bfd_bread (buf, 4, abfd) != 4)
   1609 		goto error_return;
   1610 
   1611 	      vma &= ~3;
   1612 	      mmo_xore_32 (sec, vma, bfd_get_32 (abfd, buf));
   1613 	      vma += 4;
   1614 	      lineno++;
   1615 	      break;
   1616 
   1617 	    case LOP_LOC:
   1618 	      /* Set vma (and section).  */
   1619 	      vma = (bfd_vma) y << 56;
   1620 	      if (z == 1)
   1621 		{
   1622 		  /* Get a 32-bit value.  */
   1623 		  if (bfd_bread (buf, 4, abfd) != 4)
   1624 		    goto error_return;
   1625 
   1626 		  vma += bfd_get_32 (abfd, buf);
   1627 		}
   1628 	      else if (z == 2)
   1629 		{
   1630 		  /* Get a 64-bit value.  */
   1631 		  if (bfd_bread (buf, 8, abfd) != 8)
   1632 		    goto error_return;
   1633 
   1634 		  vma += bfd_get_64 (abfd, buf);
   1635 		}
   1636 	      else
   1637 		{
   1638 		  (*_bfd_error_handler)
   1639 		    (_("%s: invalid mmo file: expected z = 1 or z = 2, got z = %d for lop_loc\n"),
   1640 		     bfd_get_filename (abfd), z);
   1641 		  bfd_set_error (bfd_error_bad_value);
   1642 		  goto error_return;
   1643 		}
   1644 
   1645 	      /* When we decide which section the data goes into, we might
   1646 		 create the section.  If that happens, make sure the VMA at
   1647 		 creation time is tetra-aligned.  */
   1648 	      sec = mmo_decide_section (abfd, vma & ~3);
   1649 	      if (sec == NULL)
   1650 		goto error_return;
   1651 	      break;
   1652 
   1653 	    case LOP_SKIP:
   1654 	      /* Move forward within the same section.  */
   1655 	      vma += y * 256 + z;
   1656 
   1657 	      sec = mmo_decide_section (abfd, vma);
   1658 	      if (sec == NULL)
   1659 		goto error_return;
   1660 	      break;
   1661 
   1662 	    case LOP_FIXO:
   1663 	      /* A fixup: Store the current vma somewhere.  Position using
   1664 		 same format as LOP_LOC.  */
   1665 	      {
   1666 		bfd_vma p = (bfd_vma) y << 56;
   1667 		asection *fixosec;
   1668 
   1669 		if (z == 1)
   1670 		  {
   1671 		    /* Get a 32-bit value.  */
   1672 		    if (bfd_bread (buf, 4, abfd) != 4)
   1673 		      goto error_return;
   1674 
   1675 		    p += bfd_get_32 (abfd, buf);
   1676 		  }
   1677 		else if (z == 2)
   1678 		  {
   1679 		    /* Get a 64-bit value.  */
   1680 		    if (bfd_bread (buf, 8, abfd) != 8)
   1681 		      goto error_return;
   1682 
   1683 		    p += bfd_get_64 (abfd, buf);
   1684 		  }
   1685 		else
   1686 		  {
   1687 		    (*_bfd_error_handler)
   1688 		      (_("%s: invalid mmo file: expected z = 1 or z = 2, got z = %d for lop_fixo\n"),
   1689 		       bfd_get_filename (abfd), z);
   1690 		    bfd_set_error (bfd_error_bad_value);
   1691 		    goto error_return;
   1692 		  }
   1693 
   1694 		/* The section where we store this address might be a
   1695 		   different one than the current section.  */
   1696 		fixosec = mmo_decide_section (abfd, p);
   1697 		if (fixosec == NULL)
   1698 		  goto error_return;
   1699 		mmo_xore_64 (fixosec, p, vma);
   1700 	      }
   1701 	    break;
   1702 
   1703 	    case LOP_FIXR:
   1704 	      /* A fixup: Store YZ of this lopcode into YZ at vma - 4 * yz.  */
   1705 	      {
   1706 		unsigned int yz = (y * 256 + z);
   1707 		bfd_vma p = vma + 2 - 4 * yz;
   1708 		asection *fixrsec = mmo_decide_section (abfd, p);
   1709 		if (fixrsec == NULL)
   1710 		  goto error_return;
   1711 		mmo_xore_16 (fixrsec, p, yz);
   1712 	      }
   1713 	    break;
   1714 
   1715 	    case LOP_FIXRX:
   1716 	      /* A fixup, similar to lop_fixr, but taking larger numbers
   1717 		 and can change branches into the opposite direction
   1718 		 (gasp!).  */
   1719 	      {
   1720 		bfd_vma delta;
   1721 		bfd_vma p;
   1722 		asection *fixrsec;
   1723 
   1724 		if (y != 0)
   1725 		  {
   1726 		    (*_bfd_error_handler)
   1727 		      (_("%s: invalid mmo file: expected y = 0, got y = %d for lop_fixrx\n"),
   1728 		       bfd_get_filename (abfd), y);
   1729 		    bfd_set_error (bfd_error_bad_value);
   1730 		    goto error_return;
   1731 		  }
   1732 
   1733 		if (z != 16 && z != 24)
   1734 		  {
   1735 		    (*_bfd_error_handler)
   1736 		      (_("%s: invalid mmo file: expected z = 16 or z = 24, got z = %d for lop_fixrx\n"),
   1737 		       bfd_get_filename (abfd), z);
   1738 		    bfd_set_error (bfd_error_bad_value);
   1739 		    goto error_return;
   1740 		  }
   1741 
   1742 		/* Get the next 32-bit value.  */
   1743 		if (bfd_bread (buf, 4, abfd) != 4)
   1744 		  goto error_return;
   1745 
   1746 		delta = bfd_get_32 (abfd, buf);
   1747 
   1748 		/* Do an, ehm, involved calculation for the location of
   1749 		   the fixup.  See mmixal documentation for a verbose
   1750 		   explanation.  We follow it verbosely here for the
   1751 		   readers delight.  */
   1752 		if (buf[0] == 0)
   1753 		  p = vma - 4 * delta;
   1754 		else if (buf[0] == 1)
   1755 		  p = vma - 4 * ((delta & 0xffffff) - (1 << z));
   1756 		else
   1757 		  {
   1758 		    (*_bfd_error_handler)
   1759 		      (_("%s: invalid mmo file: leading byte of operand word must be 0 or 1, got %d for lop_fixrx\n"),
   1760 		       bfd_get_filename (abfd), buf[0]);
   1761 		    bfd_set_error (bfd_error_bad_value);
   1762 		    goto error_return;
   1763 		  }
   1764 
   1765 		fixrsec = mmo_decide_section (abfd, vma);
   1766 		if (fixrsec == NULL)
   1767 		  goto error_return;
   1768 		mmo_xore_32 (fixrsec, p, delta);
   1769 	      }
   1770 	    break;
   1771 
   1772 	    case LOP_FILE:
   1773 	      /* Set current file and perhaps the file name.  Reset line
   1774 		 number.  */
   1775 	      if (z != 0)
   1776 		{
   1777 		  char *fname = bfd_malloc (z * 4 + 1);
   1778 
   1779 		  if (fname == NULL)
   1780 		    {
   1781 		      (*_bfd_error_handler)
   1782 			(_("%s: cannot allocate file name for file number %d, %d bytes\n"),
   1783 			 bfd_get_filename (abfd), y, z * 4 + 1);
   1784 		      bfd_set_error (bfd_error_system_call);
   1785 		      goto error_return;
   1786 		    }
   1787 
   1788 		  fname[z * 4] = 0;
   1789 
   1790 		  for (i = 0; i < z; i++)
   1791 		    {
   1792 		      if (bfd_bread (fname + i * 4, 4, abfd) != 4)
   1793 			{
   1794 			  free (fname);
   1795 			  goto error_return;
   1796 			}
   1797 		    }
   1798 
   1799 		  if (file_names[y] != NULL)
   1800 		    {
   1801 		      (*_bfd_error_handler)
   1802 			(_("%s: invalid mmo file: file number %d `%s',"
   1803 			   " was already entered as `%s'\n"),
   1804 			 bfd_get_filename (abfd), y, fname, file_names[y]);
   1805 		      bfd_set_error (bfd_error_bad_value);
   1806 		      goto error_return;
   1807 		    }
   1808 
   1809 		  file_names[y] = fname;
   1810 		}
   1811 
   1812 	      if (file_names[y] == NULL)
   1813 		{
   1814 		  (*_bfd_error_handler)
   1815 		    (_("%s: invalid mmo file: file name for number %d"
   1816 		       " was not specified before use\n"),
   1817 		     bfd_get_filename (abfd), y);
   1818 		  bfd_set_error (bfd_error_bad_value);
   1819 		  goto error_return;
   1820 		}
   1821 
   1822 	      lineno = 0;
   1823 	      break;
   1824 
   1825 	    case LOP_LINE:
   1826 	      /* Set line number.  */
   1827 	      lineno = y * 256 + z;
   1828 	      /* FIXME: Create a sequence of mmo-specific line number
   1829 		 entries for each section, then translate into canonical
   1830 		 format.  */
   1831 	      break;
   1832 
   1833 	    case LOP_SPEC:
   1834 	      /* Special data follows until the next non-lop_quote
   1835 		 lopcode.  */
   1836 	      non_spec_sec = sec;
   1837 	      non_spec_vma = vma;
   1838 	      sec = mmo_get_spec_section (abfd, y * 256 + z);
   1839 	      if (sec == NULL)
   1840 		goto error_return;
   1841 
   1842 	      vma = sec->vma;
   1843 	      break;
   1844 
   1845 	    case LOP_PRE:
   1846 	      {
   1847 		/* We ignore header information, except we read in the
   1848 		   creation time from the first 32-bit word with the time
   1849 		   in seconds since era.  */
   1850 		if (z >= 1
   1851 		    && bfd_bread (abfd->tdata.mmo_data->created, 4,
   1852 				 abfd) != 4)
   1853 		  goto error_return;
   1854 
   1855 		for (i = 1; i < z; i++)
   1856 		  if (bfd_bread (buf, 4, abfd) != 4)
   1857 		    goto error_return;
   1858 	      }
   1859 	      break;
   1860 
   1861 	    case LOP_POST:
   1862 	      /* This tells of the contents of registers $Z..$255 at
   1863 		 startup.  We make a section out of it, with VMA = Z * 8,
   1864 		 but only if Z != 255 or the contents is non-zero.  */
   1865 	      {
   1866 		asection *rsec;
   1867 		bfd_byte *loc;
   1868 		bfd_vma first_octa;
   1869 		bfd_vma startaddr_octa;
   1870 
   1871 		/* Read first octaword outside loop to simplify logic when
   1872 		   excluding the Z == 255, octa == 0 case.  */
   1873 		if (bfd_bread (buf, 8, abfd) != 8)
   1874 		  goto error_return;
   1875 
   1876 		first_octa = bfd_get_64 (abfd, buf);
   1877 
   1878 		/* Don't emit contents for the trivial case which is
   1879 		   always present; $255 pointing to Main.  */
   1880 		if (z != 255)
   1881 		  {
   1882 		    rsec
   1883 		      = bfd_make_section_old_way (abfd,
   1884 						  MMIX_REG_CONTENTS_SECTION_NAME);
   1885 		    rsec->flags |= SEC_LINKER_CREATED;
   1886 		    rsec->vma = z * 8;
   1887 		    loc = mmo_get_loc (rsec, z * 8, (255 - z) * 8);
   1888 		    bfd_put_64 (abfd, first_octa, loc);
   1889 
   1890 		    for (i = z + 1; i < 255; i++)
   1891 		      {
   1892 			if (bfd_bread (loc + (i - z) * 8, 8, abfd) != 8)
   1893 			  goto error_return;
   1894 		      }
   1895 
   1896 		    /* Read out the last octabyte, and use it to set the
   1897 		       start address.  */
   1898 		    if (bfd_bread (buf, 8, abfd) != 8)
   1899 		      goto error_return;
   1900 
   1901 		    startaddr_octa = bfd_get_64 (abfd, buf);
   1902 		  }
   1903 		else
   1904 		  startaddr_octa = first_octa;
   1905 
   1906 		if (! bfd_set_start_address (abfd, startaddr_octa))
   1907 		  {
   1908 		    /* Currently this can't fail, but this should handle
   1909 		       future failures.  */
   1910 		    bfd_set_error (bfd_error_bad_value);
   1911 		    goto error_return;
   1912 		  }
   1913 	      }
   1914 	      break;
   1915 
   1916 	    case LOP_STAB:
   1917 	      /* We read in the symbols now, not later.  */
   1918 	      if (y != 0 || z != 0)
   1919 		{
   1920 		  (*_bfd_error_handler)
   1921 		    (_("%s: invalid mmo file: fields y and z of lop_stab"
   1922 		       " non-zero, y: %d, z: %d\n"),
   1923 		     bfd_get_filename (abfd), y, z);
   1924 		  bfd_set_error (bfd_error_bad_value);
   1925 		  goto error_return;
   1926 		}
   1927 
   1928 	      /* Save the location, so we can check that YZ in the LOP_END
   1929 		 is correct.  */
   1930 	      stab_loc = bfd_tell (abfd);
   1931 
   1932 	      /* It's not said that an MMO can be without symbols (though
   1933 		 mmixal will refuse to assemble files without Main), but
   1934 		 it seems it would still be a valid mmo-file, so allow it.
   1935 		 We detect the absence of a symbol area in that the upper
   1936 		 limit is computed (from the lop_end YZ field) as 0.
   1937 		 Don't call mmo_get_symbols; it can only detect the end of
   1938 		 a valid symbol trie, not the absence of one.  */
   1939 	      if (abfd->tdata.mmo_data->max_symbol_length != 0
   1940 		  && ! mmo_get_symbols (abfd))
   1941 		goto error_return;
   1942 	      break;
   1943 
   1944 	    case LOP_END:
   1945 	      {
   1946 		/* This must be the last 32-bit word in an mmo file.
   1947 		   Let's find out.  */
   1948 		struct stat statbuf;
   1949 		file_ptr curpos = bfd_tell (abfd);
   1950 
   1951 		if (bfd_stat (abfd, &statbuf) < 0)
   1952 		  goto error_return;
   1953 
   1954 		if (statbuf.st_size != curpos)
   1955 		  {
   1956 		    (*_bfd_error_handler)
   1957 		      (_("%s: invalid mmo file: lop_end not last item in"
   1958 			 " file\n"),
   1959 		       bfd_get_filename (abfd));
   1960 		    bfd_set_error (bfd_error_bad_value);
   1961 		    goto error_return;
   1962 		  }
   1963 
   1964 		/* Check that the YZ field is right.  Subtract the size of
   1965 		   this LOP_END in the calculation; YZ does not include
   1966 		   it.  */
   1967 		if ((long) (y * 256 + z) * 4 != (curpos - stab_loc) - 4)
   1968 		  {
   1969 		    (*_bfd_error_handler)
   1970 		      (_("%s: invalid mmo file: YZ of lop_end (%ld)"
   1971 			 " not equal to the number of tetras to the preceding"
   1972 			 " lop_stab (%ld)\n"),
   1973 		       bfd_get_filename (abfd), (long) (y * 256 + z),
   1974 		       (curpos - stab_loc - 4)/4);
   1975 		    bfd_set_error (bfd_error_bad_value);
   1976 		    goto error_return;
   1977 		  }
   1978 
   1979 		bfd_map_over_sections (abfd, mmo_map_set_sizes, NULL);
   1980 		goto done;
   1981 	      }
   1982 	    }
   1983 	}
   1984       else
   1985 	{
   1986 	  /* This wasn't a lopcode, so store it in the current section.  */
   1987 	  mmo_xore_32 (sec, vma & ~3, bfd_get_32 (abfd, buf));
   1988 	  vma += 4;
   1989 	  vma &= ~3;
   1990 	  lineno++;
   1991 	}
   1992     }
   1993 
   1994   /* We know this file is a multiple of four bytes (checked in
   1995      mmo_object_p), so if we got something other than 0, this was a bad
   1996      file (although it's more likely we'll get 0 in that case too).
   1997      If we got end-of-file, then there was no lop_stab, so the file has
   1998      invalid format.  */
   1999 
   2000   if (nbytes_read != 0)
   2001     bfd_set_error (bfd_error_system_call);
   2002   else
   2003     bfd_set_error (bfd_error_bad_value);
   2004 
   2005  error_return:
   2006   error = TRUE;
   2007  done:
   2008   /* Mark the .text and .data section with their normal attribute if they
   2009      contain anything.  This is not redundant wrt. mmo_decide_section,
   2010      since that code might never execute, and conversely the alloc+code
   2011      section flags must be set then.  */
   2012   sec = bfd_get_section_by_name (abfd, MMO_TEXT_SECTION_NAME);
   2013   if (sec != NULL
   2014       && (bfd_get_section_flags (abfd, sec) & SEC_HAS_CONTENTS)
   2015       && ! bfd_set_section_flags (abfd, sec,
   2016 				  bfd_get_section_flags (abfd, sec)
   2017 				  | SEC_ALLOC | SEC_LOAD | SEC_CODE))
   2018     error = TRUE;
   2019 
   2020   sec = bfd_get_section_by_name (abfd, MMO_DATA_SECTION_NAME);
   2021   if (sec != NULL
   2022       && (bfd_get_section_flags (abfd, sec) & SEC_HAS_CONTENTS)
   2023       && ! bfd_set_section_flags (abfd, sec,
   2024 				  bfd_get_section_flags (abfd, sec)
   2025 				  | SEC_ALLOC | SEC_LOAD))
   2026     error = TRUE;
   2027 
   2028   /* Free whatever resources we took.  */
   2029   for (i = 0; i < sizeof (file_names) / sizeof (file_names[0]); i++)
   2030     if (file_names[i])
   2031       free (file_names[i]);
   2032   return ! error;
   2033 }
   2034 
   2035 /* A hook to set up object file dependent section information.  For mmo,
   2036    we point out the shape of allocated section contents.  */
   2037 
   2038 static bfd_boolean
   2039 mmo_new_section_hook (bfd *abfd, asection *newsect)
   2040 {
   2041   if (!newsect->used_by_bfd)
   2042     {
   2043       /* We zero-fill all fields and assume NULL is represented by an all
   2044 	 zero-bit pattern.  */
   2045       newsect->used_by_bfd
   2046 	= bfd_zalloc (abfd, sizeof (struct mmo_section_data_struct));
   2047       if (!newsect->used_by_bfd)
   2048 	return FALSE;
   2049     }
   2050 
   2051   /* Always align to at least 32-bit words.  */
   2052   newsect->alignment_power = 2;
   2053   return _bfd_generic_new_section_hook (abfd, newsect);
   2054 }
   2055 
   2056 /* We already have section contents loaded for sections that have
   2057    contents.  */
   2058 
   2059 static bfd_boolean
   2060 mmo_get_section_contents (bfd *abfd ATTRIBUTE_UNUSED,
   2061 			  asection *sec,
   2062 			  void * location,
   2063 			  file_ptr offset,
   2064 			  bfd_size_type bytes_to_do)
   2065 {
   2066   /* Iterate over diminishing chunk sizes, copying contents, like
   2067      mmo_set_section_contents.  */
   2068   while (bytes_to_do)
   2069     {
   2070       /* A minor song-and-dance to make sure we're not bitten by the
   2071 	 distant possibility of the cast from bfd_vma to int making the
   2072 	 chunk zero-sized.  */
   2073       int chunk_size
   2074 	= (int) bytes_to_do != 0 ? bytes_to_do : MMO_SEC_CONTENTS_CHUNK_SIZE;
   2075       bfd_byte *loc;
   2076 
   2077       do
   2078 	loc = mmo_get_loc (sec, sec->vma + offset, chunk_size);
   2079       while (loc == NULL && (chunk_size /= 2) != 0);
   2080 
   2081       if (chunk_size == 0)
   2082 	return FALSE;
   2083 
   2084       memcpy (location, loc, chunk_size);
   2085 
   2086       location += chunk_size;
   2087       bytes_to_do -= chunk_size;
   2088       offset += chunk_size;
   2089     }
   2090   return TRUE;
   2091 }
   2092 
   2093 /* Return the amount of memory needed to read the symbol table.  */
   2094 
   2095 static long
   2096 mmo_get_symtab_upper_bound (bfd *abfd)
   2097 {
   2098   return (abfd->symcount + 1) * sizeof (asymbol *);
   2099 }
   2100 
   2101 /* Sort mmo symbols by serial number.  */
   2102 
   2103 static int
   2104 mmo_sort_mmo_symbols (const void *arg1, const void *arg2)
   2105 {
   2106   const struct mmo_symbol *sym1 = *(const struct mmo_symbol **) arg1;
   2107   const struct mmo_symbol *sym2 = *(const struct mmo_symbol **) arg2;
   2108 
   2109   /* Sort by serial number first.  */
   2110   if (sym1->serno < sym2->serno)
   2111     return -1;
   2112   else if (sym1->serno > sym2->serno)
   2113     return 1;
   2114 
   2115   /* Then sort by address of the table entries.  */
   2116   return ((const char *) arg1 - (const char *) arg2);
   2117 }
   2118 
   2119 /* Translate the symbol table.  */
   2120 
   2121 static long
   2122 mmo_canonicalize_symtab (bfd *abfd, asymbol **alocation)
   2123 {
   2124   unsigned int symcount = bfd_get_symcount (abfd);
   2125   asymbol *csymbols;
   2126   unsigned int i;
   2127 
   2128   csymbols = abfd->tdata.mmo_data->csymbols;
   2129   if (csymbols == NULL && symcount != 0)
   2130     {
   2131       asymbol *c;
   2132       struct mmo_symbol *s;
   2133       struct mmo_symbol **msp;
   2134 
   2135       /* First we store the symbols into the table we'll return, then we
   2136 	 qsort it on the serial number, with secondary on the address of
   2137 	 the symbol, to preserve order if there would be non-unique serial
   2138 	 numbers.  */
   2139       for (s = abfd->tdata.mmo_data->symbols,
   2140 	     msp = (struct mmo_symbol **) alocation;
   2141 	   s != NULL;
   2142 	   s = s->next, ++msp)
   2143 	*msp = s;
   2144 
   2145       *msp = NULL;
   2146 
   2147       qsort (alocation, symcount, sizeof (struct mmo_symbol *),
   2148 	     mmo_sort_mmo_symbols);
   2149 
   2150       csymbols = (asymbol *) bfd_alloc (abfd, symcount * sizeof (asymbol));
   2151       if (csymbols == NULL)
   2152 	return -1;
   2153       abfd->tdata.mmo_data->csymbols = csymbols;
   2154 
   2155       for (msp = (struct mmo_symbol **) alocation, c = csymbols;
   2156 	   *msp != NULL;
   2157 	   msp++, ++c)
   2158 	{
   2159 	  s = *msp;
   2160 	  c->the_bfd = abfd;
   2161 	  c->name = s->name;
   2162 	  c->value = s->value;
   2163 	  c->flags = BSF_GLOBAL;
   2164 
   2165 	  if (s->sym_type == mmo_data_sym)
   2166 	    {
   2167 	      c->section
   2168 		= bfd_get_section_by_name (abfd, MMO_DATA_SECTION_NAME);
   2169 
   2170 	      if (c->section == NULL)
   2171 		c->section = bfd_abs_section_ptr;
   2172 	      else
   2173 		c->value -= c->section->vma;
   2174 	    }
   2175 	  else if (s->sym_type == mmo_undef_sym)
   2176 	    c->section = bfd_und_section_ptr;
   2177 	  else if (s->sym_type == mmo_reg_sym)
   2178 	    {
   2179 	      c->section
   2180 		= bfd_make_section_old_way (abfd, MMIX_REG_SECTION_NAME);
   2181 	      c->section->flags |= SEC_LINKER_CREATED;
   2182 	    }
   2183 	  else
   2184 	    {
   2185 	      asection *textsec
   2186 		= bfd_get_section_by_name (abfd, MMO_TEXT_SECTION_NAME);
   2187 	      asection *datasec;
   2188 
   2189 	      if (textsec != NULL
   2190 		  && c->value >= textsec->vma
   2191 		  && c->value <= textsec->vma + textsec->size)
   2192 		{
   2193 		  c->section = textsec;
   2194 		  c->value -= c->section->vma;
   2195 		}
   2196 	      /* In mmo, symbol types depend on the VMA.  Therefore, if
   2197 		 the data section isn't within the usual bounds, its
   2198 		 symbols are marked as absolute.  Correct that.  This
   2199 		 means we can't have absolute symbols with values matching
   2200 		 data section addresses, but we also can't have with
   2201 		 absolute symbols with values matching text section
   2202 		 addresses.  For such needs, use the ELF format.  */
   2203 	      else if ((datasec
   2204 			= bfd_get_section_by_name (abfd,
   2205 						   MMO_DATA_SECTION_NAME))
   2206 		       != NULL
   2207 		       && c->value >= datasec->vma
   2208 		       && c->value <= datasec->vma + datasec->size)
   2209 		{
   2210 		  c->section = datasec;
   2211 		  c->value -= c->section->vma;
   2212 		}
   2213 	      else
   2214 		c->section = bfd_abs_section_ptr;
   2215 	    }
   2216 
   2217 	  c->udata.p = NULL;
   2218 	}
   2219     }
   2220 
   2221   /* Last, overwrite the incoming table with the right-type entries.  */
   2222   for (i = 0; i < symcount; i++)
   2223     *alocation++ = csymbols++;
   2224   *alocation = NULL;
   2225 
   2226   return symcount;
   2227 }
   2228 
   2229 /* Get information about a symbol.  */
   2230 
   2231 static void
   2232 mmo_get_symbol_info (bfd *ignore_abfd ATTRIBUTE_UNUSED,
   2233 		     asymbol *symbol, symbol_info *ret)
   2234 {
   2235   bfd_symbol_info (symbol, ret);
   2236 }
   2237 
   2238 static void
   2239 mmo_print_symbol (bfd *abfd, void *afile, asymbol *symbol,
   2240 		  bfd_print_symbol_type how)
   2241 {
   2242   FILE *file = (FILE *) afile;
   2243 
   2244   switch (how)
   2245     {
   2246     case bfd_print_symbol_name:
   2247       fprintf (file, "%s", symbol->name);
   2248       break;
   2249     default:
   2250       bfd_print_symbol_vandf (abfd, file, symbol);
   2251 
   2252       fprintf (file, " %-5s %s",
   2253 	       symbol->section->name,
   2254 	       symbol->name);
   2255     }
   2256 }
   2257 
   2258 /* We can't map a file directly into executable code, so the
   2259    size of header information is irrelevant.  */
   2260 
   2261 static int
   2262 mmo_sizeof_headers (bfd *abfd ATTRIBUTE_UNUSED,
   2263 		    struct bfd_link_info *info ATTRIBUTE_UNUSED)
   2264 {
   2265   return 0;
   2266 }
   2267 
   2268 /* Write the (section-neutral) file preamble.  */
   2269 
   2270 static bfd_boolean
   2271 mmo_internal_write_header (bfd *abfd)
   2272 {
   2273   const char lop_pre_bfd[] = { LOP, LOP_PRE, 1, 1};
   2274 
   2275   if (bfd_bwrite (lop_pre_bfd, 4, abfd) != 4)
   2276     return FALSE;
   2277 
   2278   /* Copy creation time of original file.  */
   2279   if (bfd_bwrite (abfd->tdata.mmo_data->created, 4, abfd) != 4)
   2280     return FALSE;
   2281 
   2282   return TRUE;
   2283 }
   2284 
   2285 /* Write the LOP_POST record, with global register initializations.
   2286    Z is the Z field of the LOP_POST, corresponding to 255 - number of
   2287    registers at DATA.  The Z = 255 field is filled in with the
   2288    start-address.  */
   2289 
   2290 static bfd_boolean
   2291 mmo_internal_write_post (bfd *abfd, int z, asection *sec)
   2292 {
   2293   int i;
   2294   bfd_byte buf[8];
   2295   mmo_write_tetra_raw (abfd, (LOP << 24) | (LOP_POST << 16) | z);
   2296 
   2297   for (i = z; i < 255; i++)
   2298     {
   2299       bfd_byte *data = mmo_get_loc (sec, i * 8, 8);
   2300 
   2301       if (bfd_bwrite (data, 8, abfd) != 8)
   2302 	return FALSE;
   2303     }
   2304 
   2305   /* For Z == $255, we always emit the start location; supposedly Main,
   2306      but we have it handy at bfd_get_start_address.  If we're called with
   2307      Z == 255, don't assume DATA is valid.  */
   2308   bfd_put_64 (abfd, bfd_get_start_address (abfd), buf);
   2309 
   2310   return ! abfd->tdata.mmo_data->have_error && bfd_bwrite (buf, 8, abfd) == 8;
   2311 }
   2312 
   2313 /* Translate to and from BFD flags.  This is to make sure that we don't
   2314    get bitten by BFD flag number changes.  */
   2315 
   2316 static flagword
   2317 mmo_sec_flags_from_bfd_flags (flagword flags)
   2318 {
   2319   flagword oflags = 0;
   2320 
   2321   if (flags & SEC_ALLOC)
   2322     oflags |= MMO_SEC_ALLOC;
   2323   if (flags & SEC_LOAD)
   2324     oflags |= MMO_SEC_LOAD;
   2325   if (flags & SEC_RELOC)
   2326     oflags |= MMO_SEC_RELOC;
   2327   if (flags & SEC_READONLY)
   2328     oflags |= MMO_SEC_READONLY;
   2329   if (flags & SEC_CODE)
   2330     oflags |= MMO_SEC_CODE;
   2331   if (flags & SEC_DATA)
   2332     oflags |= MMO_SEC_DATA;
   2333   if (flags & SEC_NEVER_LOAD)
   2334     oflags |= MMO_SEC_NEVER_LOAD;
   2335   if (flags & SEC_IS_COMMON)
   2336     oflags |= MMO_SEC_IS_COMMON;
   2337   if (flags & SEC_DEBUGGING)
   2338     oflags |= MMO_SEC_DEBUGGING;
   2339 
   2340   return oflags;
   2341 }
   2342 
   2343 static flagword
   2344 bfd_sec_flags_from_mmo_flags (flagword flags)
   2345 {
   2346   flagword oflags = 0;
   2347 
   2348   if (flags & MMO_SEC_ALLOC)
   2349     oflags |= SEC_ALLOC;
   2350   if (flags & MMO_SEC_LOAD)
   2351     oflags |= SEC_LOAD;
   2352   if (flags & MMO_SEC_RELOC)
   2353     oflags |= SEC_RELOC;
   2354   if (flags & MMO_SEC_READONLY)
   2355     oflags |= SEC_READONLY;
   2356   if (flags & MMO_SEC_CODE)
   2357     oflags |= SEC_CODE;
   2358   if (flags & MMO_SEC_DATA)
   2359     oflags |= SEC_DATA;
   2360   if (flags & MMO_SEC_NEVER_LOAD)
   2361     oflags |= SEC_NEVER_LOAD;
   2362   if (flags & MMO_SEC_IS_COMMON)
   2363     oflags |= SEC_IS_COMMON;
   2364   if (flags & MMO_SEC_DEBUGGING)
   2365     oflags |= SEC_DEBUGGING;
   2366 
   2367   return oflags;
   2368 }
   2369 
   2370 /* Return TRUE iff the leading or trailing tetrabyte in SEC is defined and
   2371    is 0.  */
   2372 
   2373 static bfd_boolean
   2374 mmo_has_leading_or_trailing_zero_tetra_p (bfd *abfd, asection *sec)
   2375 {
   2376   bfd_vma secaddr = bfd_get_section_vma (abfd, sec);
   2377 
   2378   if (sec->size < 4)
   2379     return FALSE;
   2380 
   2381   if (bfd_get_32 (abfd, mmo_get_loc (sec, secaddr, 4)) == 0
   2382       && bfd_get_32 (abfd,
   2383 		     mmo_get_loc (sec, secaddr + sec->size - 4, 4)) == 0)
   2384     return TRUE;
   2385 
   2386   return FALSE;
   2387 }
   2388 
   2389 /* Write a section.  */
   2390 
   2391 static bfd_boolean
   2392 mmo_internal_write_section (bfd *abfd, asection *sec)
   2393 {
   2394   /* We do it differently depending on what section this is:
   2395 
   2396    ".text": Output, prepended by information about the first source file
   2397    (not yet implemented.)
   2398 
   2399    ".data": Output.
   2400 
   2401    (".MMIX.reg_contents": Not handled here.)
   2402 
   2403    Anything else: Output inside a lop_spec 80, in the format described
   2404    above.  */
   2405 
   2406   if (strcmp (sec->name, MMO_TEXT_SECTION_NAME) == 0)
   2407     {
   2408       bfd_vma secaddr = bfd_get_section_vma (abfd, sec);
   2409 
   2410       /* Because leading and trailing zeros are omitted in output, we need to
   2411 	 specify the section boundaries so they're correct when the file
   2412 	 is read in again.  That's also the case if this section is
   2413 	 specified as not within its usual boundaries or alignments.  */
   2414       if (sec->size != 0
   2415 	  && (secaddr + sec->size >= (bfd_vma) 1 << 56
   2416 	      || (secaddr & 3) != 0
   2417 	      || (sec->size & 3) != 0
   2418 	      || mmo_has_leading_or_trailing_zero_tetra_p (abfd, sec)))
   2419 	{
   2420 	  if (!mmo_write_section_description (abfd, sec))
   2421 	    return FALSE;
   2422 	}
   2423 
   2424       /* FIXME: Output source file name and line number.  */
   2425       return mmo_write_loc_chunk_list (abfd, mmo_section_data (sec)->head);
   2426     }
   2427   else if (strcmp (sec->name, MMO_DATA_SECTION_NAME) == 0)
   2428     {
   2429       bfd_vma secaddr = bfd_get_section_vma (abfd, sec);
   2430 
   2431       /* Same goes as for MMO_TEXT_SECTION_NAME above.  */
   2432       if (sec->size != 0
   2433 	  && (secaddr < (bfd_vma) 0x20 << 56
   2434 	      || secaddr + sec->size >= (bfd_vma) 0x21 << 56
   2435 	      || (secaddr & 3) != 0
   2436 	      || (sec->size & 3) != 0
   2437 	      || mmo_has_leading_or_trailing_zero_tetra_p (abfd, sec)))
   2438 	{
   2439 	  if (!mmo_write_section_description (abfd, sec))
   2440 	    return FALSE;
   2441 	}
   2442 
   2443       return mmo_write_loc_chunk_list (abfd, mmo_section_data (sec)->head);
   2444     }
   2445   else if (strcmp (sec->name, MMIX_REG_CONTENTS_SECTION_NAME) == 0)
   2446     /* Not handled here.  */
   2447     {
   2448       /* This would normally be an abort call since this can't happen, but
   2449          we don't do that.  */
   2450       bfd_set_error (bfd_error_bad_value);
   2451       return FALSE;
   2452     }
   2453   else if (CONST_STRNEQ (sec->name, MMIX_OTHER_SPEC_SECTION_PREFIX))
   2454     {
   2455       int n = atoi (sec->name + strlen (MMIX_OTHER_SPEC_SECTION_PREFIX));
   2456 
   2457       mmo_write_tetra_raw (abfd, (LOP << 24) | (LOP_SPEC << 16) | n);
   2458       return (! abfd->tdata.mmo_data->have_error
   2459 	      && mmo_write_chunk_list (abfd, mmo_section_data (sec)->head));
   2460     }
   2461   /* Ignore sections that are just allocated or empty; we write out
   2462      _contents_ here.  */
   2463   else if ((bfd_get_section_flags (abfd, sec) & SEC_HAS_CONTENTS) != 0
   2464 	   && sec->size != 0)
   2465     {
   2466       if (!mmo_write_section_description (abfd, sec))
   2467 	return FALSE;
   2468 
   2469       /* Writing a LOP_LOC ends the LOP_SPEC data, and makes data actually
   2470 	 loaded.  */
   2471       if (bfd_get_section_flags (abfd, sec) & SEC_LOAD)
   2472 	return (! abfd->tdata.mmo_data->have_error
   2473 		&& mmo_write_loc_chunk_list (abfd,
   2474 					 mmo_section_data (sec)->head));
   2475       return (! abfd->tdata.mmo_data->have_error
   2476 	      && mmo_write_chunk_list (abfd, mmo_section_data (sec)->head));
   2477     }
   2478 
   2479   /* Some section without contents.  */
   2480   return TRUE;
   2481 }
   2482 
   2483 /* Write the description of a section, extended-mmo-style.  */
   2484 
   2485 static bfd_boolean
   2486 mmo_write_section_description (bfd *abfd, asection *sec)
   2487 {
   2488   /* Keep the following document-comment formatted the way it is.  */
   2489 /*
   2490 INODE
   2491 mmo section mapping, , Symbol-table, mmo
   2492 SUBSECTION
   2493 	mmo section mapping
   2494 
   2495 	The implementation in BFD uses special data type 80 (decimal) to
   2496 	encapsulate and describe named sections, containing e.g.@: debug
   2497 	information.  If needed, any datum in the encapsulation will be
   2498 	quoted using lop_quote.  First comes a 32-bit word holding the
   2499 	number of 32-bit words containing the zero-terminated zero-padded
   2500 	segment name.  After the name there's a 32-bit word holding flags
   2501 	describing the section type.  Then comes a 64-bit big-endian word
   2502 	with the section length (in bytes), then another with the section
   2503 	start address.  Depending on the type of section, the contents
   2504 	might follow, zero-padded to 32-bit boundary.  For a loadable
   2505 	section (such as data or code), the contents might follow at some
   2506 	later point, not necessarily immediately, as a lop_loc with the
   2507 	same start address as in the section description, followed by the
   2508 	contents.  This in effect forms a descriptor that must be emitted
   2509 	before the actual contents.  Sections described this way must not
   2510 	overlap.
   2511 
   2512 	For areas that don't have such descriptors, synthetic sections are
   2513 	formed by BFD.  Consecutive contents in the two memory areas
   2514 	@samp{0x0000@dots{}00} to @samp{0x01ff@dots{}ff} and
   2515 	@samp{0x2000@dots{}00} to @samp{0x20ff@dots{}ff} are entered in
   2516 	sections named <<.text>> and <<.data>> respectively.  If an area
   2517 	is not otherwise described, but would together with a neighboring
   2518 	lower area be less than @samp{0x40000000} bytes long, it is joined
   2519 	with the lower area and the gap is zero-filled.  For other cases,
   2520 	a new section is formed, named <<.MMIX.sec.@var{n}>>.  Here,
   2521 	@var{n} is a number, a running count through the mmo file,
   2522 	starting at 0.
   2523 
   2524 EXAMPLE
   2525 	A loadable section specified as:
   2526 
   2527 | .section secname,"ax"
   2528 | TETRA 1,2,3,4,-1,-2009
   2529 | BYTE 80
   2530 
   2531 	and linked to address @samp{0x4}, is represented by the sequence:
   2532 
   2533 | 0x98080050 - lop_spec 80
   2534 | 0x00000002 - two 32-bit words for the section name
   2535 | 0x7365636e - "secn"
   2536 | 0x616d6500 - "ame\0"
   2537 | 0x00000033 - flags CODE, READONLY, LOAD, ALLOC
   2538 | 0x00000000 - high 32 bits of section length
   2539 | 0x0000001c - section length is 28 bytes; 6 * 4 + 1 + alignment to 32 bits
   2540 | 0x00000000 - high 32 bits of section address
   2541 | 0x00000004 - section address is 4
   2542 | 0x98010002 - 64 bits with address of following data
   2543 | 0x00000000 - high 32 bits of address
   2544 | 0x00000004 - low 32 bits: data starts at address 4
   2545 | 0x00000001 - 1
   2546 | 0x00000002 - 2
   2547 | 0x00000003 - 3
   2548 | 0x00000004 - 4
   2549 | 0xffffffff - -1
   2550 | 0xfffff827 - -2009
   2551 | 0x50000000 - 80 as a byte, padded with zeros.
   2552 
   2553 	Note that the lop_spec wrapping does not include the section
   2554 	contents.  Compare this to a non-loaded section specified as:
   2555 
   2556 | .section thirdsec
   2557 | TETRA 200001,100002
   2558 | BYTE 38,40
   2559 
   2560 	This, when linked to address @samp{0x200000000000001c}, is
   2561 	represented by:
   2562 
   2563 | 0x98080050 - lop_spec 80
   2564 | 0x00000002 - two 32-bit words for the section name
   2565 | 0x7365636e - "thir"
   2566 | 0x616d6500 - "dsec"
   2567 | 0x00000010 - flag READONLY
   2568 | 0x00000000 - high 32 bits of section length
   2569 | 0x0000000c - section length is 12 bytes; 2 * 4 + 2 + alignment to 32 bits
   2570 | 0x20000000 - high 32 bits of address
   2571 | 0x0000001c - low 32 bits of address 0x200000000000001c
   2572 | 0x00030d41 - 200001
   2573 | 0x000186a2 - 100002
   2574 | 0x26280000 - 38, 40 as bytes, padded with zeros
   2575 
   2576 	For the latter example, the section contents must not be
   2577 	loaded in memory, and is therefore specified as part of the
   2578 	special data.  The address is usually unimportant but might
   2579 	provide information for e.g.@: the DWARF 2 debugging format.  */
   2580 
   2581   mmo_write_tetra_raw (abfd, LOP_SPEC_SECTION);
   2582   mmo_write_tetra (abfd, (strlen (sec->name) + 3) / 4);
   2583   mmo_write_chunk (abfd, (bfd_byte *) sec->name, strlen (sec->name));
   2584   mmo_flush_chunk (abfd);
   2585   /* FIXME: We can get debug sections (.debug_line & Co.) with a section
   2586      flag still having SEC_RELOC set.  Investigate.  This might be true
   2587      for all alien sections; perhaps mmo.em should clear that flag.  Might
   2588      be related to weak references.  */
   2589   mmo_write_tetra (abfd,
   2590 		   mmo_sec_flags_from_bfd_flags
   2591 		   (bfd_get_section_flags (abfd, sec)));
   2592   mmo_write_octa (abfd, sec->size);
   2593   mmo_write_octa (abfd, bfd_get_section_vma (abfd, sec));
   2594   return TRUE;
   2595 }
   2596 
   2597 /* We save up all data before output.  */
   2598 
   2599 static bfd_boolean
   2600 mmo_set_section_contents (bfd *abfd ATTRIBUTE_UNUSED, sec_ptr sec,
   2601 			  const void *location, file_ptr offset,
   2602 			  bfd_size_type bytes_to_do)
   2603 {
   2604   /* Iterate over diminishing chunk sizes, copying contents.  */
   2605   while (bytes_to_do)
   2606     {
   2607       /* A minor song-and-dance to make sure we're not bitten by the
   2608 	 distant possibility of the cast from bfd_vma to int making the
   2609 	 chunk zero-sized.  */
   2610       int chunk_size
   2611 	= (int) bytes_to_do != 0 ? bytes_to_do : MMO_SEC_CONTENTS_CHUNK_SIZE;
   2612       bfd_byte *loc;
   2613 
   2614       do
   2615 	loc = mmo_get_loc (sec, sec->vma + offset, chunk_size);
   2616       while (loc == NULL && (chunk_size /= 2) != 0);
   2617 
   2618       if (chunk_size == 0)
   2619 	return FALSE;
   2620 
   2621       memcpy (loc, location, chunk_size);
   2622 
   2623       location += chunk_size;
   2624       bytes_to_do -= chunk_size;
   2625       offset += chunk_size;
   2626     }
   2627   return TRUE;
   2628 }
   2629 
   2630 /* Add a symbol to a trie-tree.  */
   2631 
   2632 static bfd_boolean
   2633 mmo_internal_add_3_sym (bfd *abfd, struct mmo_symbol_trie *rootp,
   2634 			const struct mmo_symbol *symp)
   2635 {
   2636   const char *name = symp->name;
   2637   struct mmo_symbol_trie *trie = rootp;
   2638   struct mmo_symbol_trie **triep = NULL;
   2639 
   2640   while (*name && trie != NULL)
   2641     {
   2642       if (*name < trie->symchar)
   2643 	{
   2644 	  triep = &trie->left;
   2645 	  trie = trie->left;
   2646 	}
   2647       else if (*name > trie->symchar)
   2648 	{
   2649 	  triep = &trie->right;
   2650 	  trie = trie->right;
   2651 	}
   2652       else if (*name == trie->symchar)
   2653 	{
   2654 	  triep = &trie->middle;
   2655 	  name++;
   2656 
   2657 	  /* Make sure "trie" points to where we should fill in the
   2658 	     current symbol whenever we've iterated through "name".  We
   2659 	     would lose the right position if we encounter "foobar" then
   2660 	     "foo".  */
   2661 	  if (*name)
   2662 	    trie = trie->middle;
   2663 	}
   2664     }
   2665 
   2666   while (*name != 0)
   2667     {
   2668       /* Create middle branches for the rest of the characters.  */
   2669       trie = bfd_zalloc (abfd, sizeof (struct mmo_symbol_trie));
   2670       *triep = trie;
   2671       trie->symchar = *name++;
   2672       triep = &trie->middle;
   2673     }
   2674 
   2675   /* We discover a duplicate symbol rather late in the process, but still;
   2676      we discover it and bail out.  */
   2677   if (trie->sym.name != NULL)
   2678     {
   2679       (*_bfd_error_handler)
   2680 	(_("%s: invalid symbol table: duplicate symbol `%s'\n"),
   2681 	 bfd_get_filename (abfd), trie->sym.name);
   2682       bfd_set_error (bfd_error_bad_value);
   2683       return FALSE;
   2684     }
   2685 
   2686   memcpy (&trie->sym, symp, sizeof *symp);
   2687   return TRUE;
   2688 }
   2689 
   2690 /* Find out the length of the serialized version of a trie in bytes.  */
   2691 
   2692 static unsigned int
   2693 mmo_internal_3_length (bfd *abfd, struct mmo_symbol_trie *trie)
   2694 {
   2695   /* First, one for the control byte.  */
   2696   unsigned int length = 1;
   2697 
   2698   if (trie == NULL)
   2699     return 0;
   2700 
   2701   /* Add in the recursion to the left.  */
   2702   length += mmo_internal_3_length (abfd, trie->left);
   2703 
   2704   /* Add in the middle trie and the character.  */
   2705   length += 1 + mmo_internal_3_length (abfd, trie->middle);
   2706 
   2707   /* Add in the recursion to the right.  */
   2708   length += mmo_internal_3_length (abfd, trie->right);
   2709 
   2710   /* Add in bytes for the symbol (if this is an endnode). */
   2711   if (trie->sym.name != NULL)
   2712     {
   2713       unsigned int serno = trie->sym.serno;
   2714 
   2715       /* First what it takes to encode the value. */
   2716       if (trie->sym.sym_type == mmo_reg_sym)
   2717 	length++;
   2718       else if (trie->sym.sym_type == mmo_undef_sym)
   2719 	length += 2;
   2720       else
   2721 	{
   2722 	  bfd_vma value = trie->sym.value;
   2723 
   2724 	  /* Coded in one to eight following bytes.  */
   2725 	  if (trie->sym.sym_type == mmo_data_sym)
   2726 	    value -= (bfd_vma) 0x20 << 56;
   2727 
   2728 	  do
   2729 	    {
   2730 	      value >>= 8;
   2731 	      length++;
   2732 	    }
   2733 	  while (value != 0);
   2734 	}
   2735 
   2736       /* Find out what it takes to encode the serial number.  */
   2737       do
   2738 	{
   2739 	  serno >>= 7;
   2740 	  length++;
   2741 	}
   2742       while (serno != 0);
   2743     }
   2744 
   2745   return length;
   2746 }
   2747 
   2748 /* Helper function for outputting the serial number of a symbol, output as
   2749    a variant of leb128 (see dwarf2 documentation) which could be called
   2750    beb128.  Using a helper function and recursion simplifies debugging.  */
   2751 
   2752 static void
   2753 mmo_beb128_out (bfd *abfd, int serno, int marker)
   2754 {
   2755   if (serno & ~0x7f)
   2756     mmo_beb128_out (abfd, serno >> 7, 0);
   2757   mmo_write_byte (abfd, marker | (serno & 0x7f));
   2758 }
   2759 
   2760 /* Serialize a trie.  */
   2761 
   2762 static void
   2763 mmo_internal_3_dump (bfd *abfd, struct mmo_symbol_trie *trie)
   2764 {
   2765   bfd_byte control = 0;
   2766 
   2767   if (trie == NULL)
   2768     return;
   2769 
   2770   if (trie->left)
   2771     control |= MMO3_LEFT;
   2772 
   2773   if (trie->middle)
   2774     control |= MMO3_MIDDLE;
   2775 
   2776   if (trie->right)
   2777     control |= MMO3_RIGHT;
   2778 
   2779   if (trie->sym.name != NULL)
   2780     {
   2781       /* Encode the symbol type and length of value bytes.  */
   2782       if (trie->sym.sym_type == mmo_reg_sym)
   2783 	control |= MMO3_REGQUAL_BITS;
   2784       else if (trie->sym.sym_type == mmo_undef_sym)
   2785 	control |= MMO3_UNDEF;
   2786       else
   2787 	{
   2788 	  bfd_vma value = trie->sym.value;
   2789 
   2790 	  /* Coded in 1..8 following bytes.  */
   2791 	  if (trie->sym.sym_type == mmo_data_sym)
   2792 	    {
   2793 	      control |= MMO3_DATA;
   2794 	      value -= (bfd_vma) 0x20 << 56;
   2795 	    }
   2796 
   2797 	  do
   2798 	    {
   2799 	      value >>= 8;
   2800 	      control++;
   2801 	    }
   2802 	  while (value != 0);
   2803 	}
   2804     }
   2805 
   2806   /* The control byte is output before recursing.  */
   2807   mmo_write_byte (abfd, control);
   2808 
   2809   mmo_internal_3_dump (abfd, trie->left);
   2810 
   2811   if (control & MMO3_SYMBITS)
   2812     {
   2813       mmo_write_byte (abfd, trie->symchar);
   2814 
   2815       if (trie->sym.name != NULL)
   2816 	{
   2817 	  if (trie->sym.sym_type == mmo_reg_sym)
   2818 	    mmo_write_byte (abfd, trie->sym.value);
   2819 	  else if (trie->sym.sym_type == mmo_undef_sym)
   2820 	    {
   2821 	      mmo_write_byte (abfd, 0);
   2822 	      mmo_write_byte (abfd, 0);
   2823 	    }
   2824 	  else
   2825 	    {
   2826 	      bfd_vma value = trie->sym.value;
   2827 
   2828 	      bfd_byte byte_n = control & 15;
   2829 
   2830 	      /* Coded in 1..8 following bytes.  Note that the value is
   2831 		 shifted out big-endian.  */
   2832 	      if (trie->sym.sym_type == mmo_data_sym)
   2833 		{
   2834 		  value -= (bfd_vma) 0x20 << 56;
   2835 		  byte_n -= 8;
   2836 		}
   2837 
   2838 	      do
   2839 		{
   2840 		  mmo_write_byte (abfd, (value >> ((byte_n - 1) * 8)) & 0xff);
   2841 		  byte_n--;
   2842 		}
   2843 	      while (byte_n != 0);
   2844 	    }
   2845 
   2846 	  mmo_beb128_out (abfd, trie->sym.serno, 128);
   2847 	}
   2848       mmo_internal_3_dump (abfd, trie->middle);
   2849     }
   2850   mmo_internal_3_dump (abfd, trie->right);
   2851 }
   2852 
   2853 /* Write symbols in mmo format.  Also write the lop_end terminator.  */
   2854 
   2855 static bfd_boolean
   2856 mmo_write_symbols_and_terminator (bfd *abfd)
   2857 {
   2858   int count = bfd_get_symcount (abfd);
   2859   asymbol **table;
   2860   asymbol **orig_table = bfd_get_outsymbols (abfd);
   2861   int serno;
   2862   struct mmo_symbol_trie root;
   2863   int trie_len;
   2864   int i;
   2865   bfd_byte buf[4];
   2866 
   2867   /* Create a symbol for "Main".  */
   2868   asymbol *fakemain = bfd_make_empty_symbol (abfd);
   2869 
   2870   fakemain->flags = BSF_GLOBAL;
   2871   fakemain->value = bfd_get_start_address (abfd);
   2872   fakemain->name = MMIX_START_SYMBOL_NAME;
   2873   fakemain->section = bfd_abs_section_ptr;
   2874 
   2875   memset (&root, 0, sizeof (root));
   2876 
   2877   /* Make all symbols take a left turn.  */
   2878   root.symchar = 0xff;
   2879 
   2880   /* There must always be a ":Main", so we'll add one if there are no
   2881      symbols.  Make sure we have room for it.  */
   2882   table = bfd_alloc (abfd, (count + 1) * sizeof (asymbol *));
   2883   if (table == NULL)
   2884     return FALSE;
   2885 
   2886   memcpy (table, orig_table, count * sizeof (asymbol *));
   2887 
   2888   /* Move :Main (if there is one) to the first position.  This is
   2889      necessary to get the same layout of the trie-tree when linking as
   2890      when objcopying the result as in the objcopy.exp test "simple objcopy
   2891      of executable".  It also automatically takes care of assigning serial
   2892      number 1 to :Main (as is mandatory).  */
   2893   for (i = 0; i < count; i++)
   2894     if (table[i] != NULL
   2895 	&& strcmp (table[i]->name, MMIX_START_SYMBOL_NAME) == 0
   2896 	&& (table[i]->flags & (BSF_DEBUGGING|BSF_GLOBAL)) == BSF_GLOBAL)
   2897       {
   2898 	asymbol *mainsym = table[i];
   2899 	memcpy (table + 1, orig_table, i * sizeof (asymbol *));
   2900 	table[0] = mainsym;
   2901 
   2902 	/* Check that the value assigned to :Main is the same as the entry
   2903 	   address.  The default linker script asserts this.  This is as
   2904 	   good a place as any to check this consistency. */
   2905 	if ((mainsym->value
   2906 	     + mainsym->section->output_section->vma
   2907 	     + mainsym->section->output_offset)
   2908 	    != bfd_get_start_address (abfd))
   2909 	  {
   2910 	    /* Arbitrary buffer to hold the printable representation of a
   2911 	       vma.  */
   2912 	    char vmas_main[40];
   2913 	    char vmas_start[40];
   2914 	    bfd_vma vma_start = bfd_get_start_address (abfd);
   2915 
   2916 	    sprintf_vma (vmas_main, mainsym->value);
   2917 	    sprintf_vma (vmas_start, vma_start);
   2918 
   2919 	    (*_bfd_error_handler)
   2920 	      (_("%s: Bad symbol definition: `Main' set to %s rather"
   2921 		 " than the start address %s\n"),
   2922 	       bfd_get_filename (abfd), vmas_main, vmas_start);
   2923 	    bfd_set_error (bfd_error_bad_value);
   2924 	    return FALSE;
   2925 	  }
   2926 	break;
   2927       }
   2928   if (i == count && count != 0)
   2929     {
   2930       /* When there are symbols, there must be a :Main.  There was no
   2931 	 :Main, so we need to add it manually.  */
   2932       memcpy (table + 1, orig_table, count * sizeof (asymbol *));
   2933       table[0] = fakemain;
   2934       count++;
   2935     }
   2936 
   2937   for (i = 0, serno = 1; i < count && table[i] != NULL; i++)
   2938     {
   2939       asymbol *s = table[i];
   2940 
   2941       /* It's not enough to consult bfd_is_local_label, since it does not
   2942 	 mean "local" in the sense of linkable-and-observable-after-link.
   2943 	 Let's just check the BSF_GLOBAL flag.
   2944 
   2945 	 Also, don't export symbols with characters not in the allowed set.  */
   2946       if ((s->flags & (BSF_DEBUGGING|BSF_GLOBAL)) == BSF_GLOBAL
   2947 	  && strspn (s->name,
   2948 		     valid_mmo_symbol_character_set) == strlen (s->name))
   2949 	{
   2950 	  struct mmo_symbol sym;
   2951 	  memset (&sym, 0, sizeof (sym));
   2952 
   2953 	  /* Need to strip const here; strdup:ing would leak and the
   2954 	     existing string must be safe to reuse.  */
   2955 	  sym.name = (char *) s->name;
   2956 	  sym.value =
   2957 	    s->value
   2958 	    + s->section->output_section->vma
   2959 	    + s->section->output_offset;
   2960 
   2961 	  if (bfd_is_und_section (s->section))
   2962 	    sym.sym_type = mmo_undef_sym;
   2963 	  else if (strcmp (s->section->name, MMO_DATA_SECTION_NAME) == 0
   2964 		   /* The encoding of data symbols require that the "rest"
   2965 		      of the value fits in 6 bytes, so the upper two bytes
   2966 		      must be 0x2000.  All other symbols get to be the
   2967 		      absolute type.  */
   2968 		   && (sym.value >> 48) == 0x2000)
   2969 	    sym.sym_type = mmo_data_sym;
   2970 	  else if (strcmp (s->section->name, MMIX_REG_SECTION_NAME) == 0)
   2971 	    sym.sym_type = mmo_reg_sym;
   2972 	  else if (strcmp (s->section->name,
   2973 			   MMIX_REG_CONTENTS_SECTION_NAME) == 0)
   2974 	    {
   2975 	      sym.sym_type = mmo_reg_sym;
   2976 	      sym.value /= 8;
   2977 	    }
   2978 	  else
   2979 	    sym.sym_type = mmo_abs_sym;
   2980 
   2981 	  /* FIXME: We assume the order of the received symbols is an
   2982 	     ordered mapping of the serial numbers.  This is not
   2983 	     necessarily true if we e.g. objcopy a mmo file to another and
   2984 	     there are gaps in the numbering.  Not sure if this can
   2985 	     happen.  Not sure what to do.  */
   2986 	  sym.serno = serno++;
   2987 
   2988 	  if (! mmo_internal_add_3_sym (abfd, &root, &sym))
   2989 	    return FALSE;
   2990 	}
   2991     }
   2992 
   2993   /* Change the root node to be a ":"-prefix.  */
   2994   root.symchar = ':';
   2995   root.middle = root.left;
   2996   root.right = NULL;
   2997   root.left = NULL;
   2998 
   2999   /* We have to find out if we can fit the whole symbol table in the mmo
   3000      symtab.  It would be bad to assume we can always fit it in 262144
   3001      bytes.  If we can't, just leave the Main symbol.  */
   3002   trie_len = (mmo_internal_3_length (abfd, &root) + 3)/4;
   3003 
   3004   if (trie_len > 0xffff)
   3005     {
   3006       /* Test this code by using a lower limit in the test above and check
   3007 	 that the single "Main" symbol is emitted and handled properly.
   3008 	 There's no specific test-case.  */
   3009       struct mmo_symbol sym;
   3010 
   3011       (*_bfd_error_handler)
   3012 	(_("%s: warning: symbol table too large for mmo, larger than 65535"
   3013 	   " 32-bit words: %d.  Only `Main' will be emitted.\n"),
   3014 	 bfd_get_filename (abfd), trie_len);
   3015 
   3016       memset (&sym, 0, sizeof (sym));
   3017       sym.sym_type = mmo_abs_sym;
   3018       sym.name = MMIX_START_SYMBOL_NAME;
   3019       sym.serno = 1;
   3020       sym.value = bfd_get_start_address (abfd);
   3021 
   3022       /* Then patch up a symbol table to be just the ":Main" symbol.  */
   3023       memset (&root, 0, sizeof (root));
   3024       root.left = root.middle;
   3025       root.symchar = 0xff;
   3026       root.middle = NULL;
   3027       root.right = NULL;
   3028 
   3029       if (! mmo_internal_add_3_sym (abfd, &root, &sym))
   3030 	return FALSE;
   3031 
   3032       root.symchar = ':';
   3033       root.middle = root.left;
   3034       root.right = NULL;
   3035       root.left = NULL;
   3036 
   3037       trie_len = (mmo_internal_3_length (abfd, &root) + 3)/4;
   3038     }
   3039 
   3040   /* Reset the written-bytes counter.  */
   3041   abfd->tdata.mmo_data->byte_no = 0;
   3042 
   3043   /* Put out the lop_stab mark.  */
   3044   bfd_put_32 (abfd, (LOP << 24) | (LOP_STAB << 16), buf);
   3045   if (bfd_bwrite (buf, 4, abfd) != 4)
   3046     return FALSE;
   3047 
   3048   /* Dump out symbols.  */
   3049   mmo_internal_3_dump (abfd, &root);
   3050 
   3051   if (trie_len != (abfd->tdata.mmo_data->byte_no + 3)/4)
   3052     {
   3053       /* I haven't seen this trig.  It seems no use claiming this case
   3054 	 isn't debugged and abort if we get here.  Instead emit a
   3055 	 diagnostic and fail "normally".  */
   3056       (*_bfd_error_handler)
   3057 	(_("%s: internal error, symbol table changed size from %d to %d"
   3058 	   " words\n"),
   3059 	 bfd_get_filename (abfd), trie_len,
   3060 	 (abfd->tdata.mmo_data->byte_no + 3)/4);
   3061       bfd_set_error (bfd_error_bad_value);
   3062       return FALSE;
   3063     }
   3064 
   3065   /* Dump out remaining bytes in the buffer and handle I/O errors by
   3066      propagating errors.  */
   3067   if ((abfd->tdata.mmo_data->byte_no % 4) != 0
   3068       || abfd->tdata.mmo_data->have_error)
   3069     {
   3070       memset (abfd->tdata.mmo_data->buf + (abfd->tdata.mmo_data->byte_no % 4),
   3071 	      0, 4 - (abfd->tdata.mmo_data->byte_no % 4));
   3072 
   3073       if (abfd->tdata.mmo_data->have_error
   3074 	  || bfd_bwrite (abfd->tdata.mmo_data->buf, 4, abfd) != 4)
   3075 	return FALSE;
   3076     }
   3077 
   3078   bfd_put_32 (abfd, (LOP << 24) | (LOP_END << 16) | trie_len, buf);
   3079   return bfd_bwrite (buf, 4, abfd) == 4;
   3080 }
   3081 
   3082 /* Write section unless it is the register contents section.  For that, we
   3083    instead store the section in the supplied pointer.  This function is
   3084    used through bfd_map_over_sections.  */
   3085 
   3086 static void
   3087 mmo_write_section_unless_reg_contents (bfd *abfd, asection *sec, void *p)
   3088 {
   3089   struct mmo_write_sec_info *infop = (struct mmo_write_sec_info *) p;
   3090 
   3091   if (! infop->retval)
   3092     return;
   3093 
   3094   if (strcmp (sec->name, MMIX_REG_CONTENTS_SECTION_NAME) == 0)
   3095     {
   3096       infop->reg_section = sec;
   3097       return;
   3098     }
   3099 
   3100   /* Exclude the convenience register section.  */
   3101   if (strcmp (sec->name, MMIX_REG_SECTION_NAME) == 0)
   3102     {
   3103       if (bfd_get_section_flags (abfd, sec) & SEC_HAS_CONTENTS)
   3104 	{
   3105 	  /* Make sure it hasn't got contents.  It seems impossible to
   3106 	     make it carry contents, so we don't have a test-case for
   3107 	     this.  */
   3108 	  (*_bfd_error_handler)
   3109 	    (_("%s: internal error, internal register section %s had"
   3110 	       " contents\n"),
   3111 	     bfd_get_filename (abfd), sec->name);
   3112 	  bfd_set_error (bfd_error_bad_value);
   3113 	  infop->retval = FALSE;
   3114 	  return;
   3115 	}
   3116 
   3117       return;
   3118     }
   3119 
   3120   infop->retval = mmo_internal_write_section (abfd, sec);
   3121 }
   3122 
   3123 /* Do the actual output of a file.  Assumes mmo_set_section_contents is
   3124    already called. */
   3125 
   3126 static bfd_boolean
   3127 mmo_write_object_contents (bfd *abfd)
   3128 {
   3129   struct mmo_write_sec_info wsecinfo;
   3130 
   3131   /* First, there are a few words of preamble.  */
   3132   if (! mmo_internal_write_header (abfd))
   3133     return FALSE;
   3134 
   3135   wsecinfo.reg_section = NULL;
   3136   wsecinfo.retval = TRUE;
   3137 
   3138   bfd_map_over_sections (abfd, mmo_write_section_unless_reg_contents,
   3139 			 &wsecinfo);
   3140 
   3141   if (! wsecinfo.retval)
   3142     return FALSE;
   3143 
   3144   if (wsecinfo.reg_section != NULL)
   3145     {
   3146       asection *sec = wsecinfo.reg_section;
   3147       unsigned int z = (unsigned int) (sec->vma / 8);
   3148 
   3149       /* Registers 0..31 must not be global.  Do sanity check on the "vma"
   3150 	 of the register contents section and check that it corresponds to
   3151 	 the length of the section.  */
   3152       if (z < 32 || z >= 255 || (sec->vma & 7) != 0
   3153 	  || sec->vma != 256 * 8 - sec->size - 8)
   3154 	{
   3155 	  bfd_set_error (bfd_error_bad_value);
   3156 
   3157 	  if (sec->size == 0)
   3158 	    /* There must always be at least one such register.  */
   3159 	    (*_bfd_error_handler)
   3160 	      (_("%s: no initialized registers; section length 0\n"),
   3161 	       bfd_get_filename (abfd));
   3162 	  else if (sec->vma > (256 - 32) * 8)
   3163 	    /* Provide better error message for the case of too many
   3164 	       global registers.  */
   3165 	    (*_bfd_error_handler)
   3166 	      (_("%s: too many initialized registers; section length %ld\n"),
   3167 	       bfd_get_filename (abfd),
   3168 	       (long) sec->size);
   3169 	  else
   3170 	    (*_bfd_error_handler)
   3171 	      (_("%s: invalid start address for initialized registers of"
   3172 		 " length %ld: 0x%lx%08lx\n"),
   3173 	       bfd_get_filename (abfd),
   3174 	       (long) sec->size,
   3175 	       (unsigned long) (sec->vma >> 32), (unsigned long) (sec->vma));
   3176 
   3177 	  return FALSE;
   3178 	}
   3179 
   3180       if (! mmo_internal_write_post (abfd, z, sec))
   3181 	return FALSE;
   3182     }
   3183   else
   3184     if (! mmo_internal_write_post (abfd, 255, NULL))
   3185       return FALSE;
   3186 
   3187   return mmo_write_symbols_and_terminator (abfd);
   3188 }
   3189 
   3190 /* If there's anything in particular in a mmo bfd that we want to free,
   3191    make this a real function.  Only do this if you see major memory
   3192    thrashing; zealous free:ing will cause unwanted behavior, especially if
   3193    you "free" memory allocated with "bfd_alloc", or even "bfd_release" a
   3194    block allocated with "bfd_alloc"; they're really allocated from an
   3195    obstack, and we don't know what was allocated there since this
   3196    particular allocation.  */
   3197 
   3198 #define	mmo_close_and_cleanup _bfd_generic_close_and_cleanup
   3199 #define mmo_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
   3200 
   3201 /* Perhaps we need to adjust this one; mmo labels (originally) without a
   3202    leading ':' might more appropriately be called local.  */
   3203 #define mmo_bfd_is_local_label_name bfd_generic_is_local_label_name
   3204 #define mmo_bfd_is_target_special_symbol  \
   3205   ((bfd_boolean (*) (bfd *, asymbol *)) bfd_false)
   3206 
   3207 /* Is this one really used or defined by anyone?  */
   3208 #define mmo_get_lineno _bfd_nosymbols_get_lineno
   3209 
   3210 /* FIXME: We can do better on this one, if we have a dwarf2 .debug_line
   3211    section or if MMO line numbers are implemented.  */
   3212 #define mmo_find_nearest_line _bfd_nosymbols_find_nearest_line
   3213 #define mmo_find_line _bfd_nosymbols_find_line
   3214 #define mmo_find_inliner_info _bfd_nosymbols_find_inliner_info
   3215 #define mmo_make_empty_symbol _bfd_generic_make_empty_symbol
   3216 #define mmo_bfd_make_debug_symbol _bfd_nosymbols_bfd_make_debug_symbol
   3217 #define mmo_read_minisymbols _bfd_generic_read_minisymbols
   3218 #define mmo_minisymbol_to_symbol _bfd_generic_minisymbol_to_symbol
   3219 
   3220 #define mmo_get_section_contents_in_window \
   3221   _bfd_generic_get_section_contents_in_window
   3222 #define mmo_bfd_get_relocated_section_contents \
   3223   bfd_generic_get_relocated_section_contents
   3224 #define mmo_bfd_gc_sections bfd_generic_gc_sections
   3225 #define mmo_bfd_lookup_section_flags bfd_generic_lookup_section_flags
   3226 #define mmo_bfd_link_hash_table_create _bfd_generic_link_hash_table_create
   3227 #define mmo_bfd_link_add_symbols _bfd_generic_link_add_symbols
   3228 #define mmo_bfd_link_just_syms _bfd_generic_link_just_syms
   3229 #define mmo_bfd_copy_link_hash_symbol_type \
   3230   _bfd_generic_copy_link_hash_symbol_type
   3231 #define mmo_bfd_final_link _bfd_generic_final_link
   3232 #define mmo_bfd_link_split_section _bfd_generic_link_split_section
   3233 
   3234 /* Strictly speaking, only MMIX uses this restricted format, but let's not
   3235    stop anybody from shooting themselves in the foot.  */
   3236 #define mmo_set_arch_mach bfd_default_set_arch_mach
   3237 #define mmo_bfd_relax_section bfd_generic_relax_section
   3238 #define mmo_bfd_merge_sections bfd_generic_merge_sections
   3239 #define mmo_bfd_is_group_section bfd_generic_is_group_section
   3240 #define mmo_bfd_discard_group bfd_generic_discard_group
   3241 #define mmo_section_already_linked \
   3242   _bfd_generic_section_already_linked
   3243 #define mmo_bfd_define_common_symbol bfd_generic_define_common_symbol
   3244 
   3245 /* We want to copy time of creation, otherwise we'd use
   3246    BFD_JUMP_TABLE_COPY (_bfd_generic).  */
   3247 #define mmo_bfd_merge_private_bfd_data _bfd_generic_bfd_merge_private_bfd_data
   3248 #define mmo_bfd_copy_private_section_data _bfd_generic_bfd_copy_private_section_data
   3249 #define mmo_bfd_copy_private_symbol_data _bfd_generic_bfd_copy_private_symbol_data
   3250 #define mmo_bfd_copy_private_header_data _bfd_generic_bfd_copy_private_header_data
   3251 #define mmo_bfd_set_private_flags _bfd_generic_bfd_set_private_flags
   3252 #define mmo_bfd_print_private_bfd_data _bfd_generic_bfd_print_private_bfd_data
   3253 
   3254 const bfd_target mmix_mmo_vec =
   3255 {
   3256   "mmo",			/* name */
   3257   bfd_target_mmo_flavour,
   3258   BFD_ENDIAN_BIG,		/* target byte order */
   3259   BFD_ENDIAN_BIG,		/* target headers byte order */
   3260 
   3261   /* FIXME: Might need adjustments.  */
   3262   (HAS_RELOC | EXEC_P |		/* object flags */
   3263    HAS_LINENO | HAS_DEBUG |
   3264    HAS_SYMS | HAS_LOCALS | WP_TEXT),
   3265 
   3266   /* FIXME: Might need adjustments.  */
   3267   (SEC_CODE | SEC_DATA | SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD
   3268    | SEC_READONLY | SEC_EXCLUDE | SEC_DEBUGGING | SEC_IN_MEMORY),
   3269 				/* section flags */
   3270   0,				/* leading underscore */
   3271   ' ',				/* ar_pad_char */
   3272   16,				/* ar_max_namelen */
   3273   0,				/* match priority.  */
   3274   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   3275   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   3276   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* data */
   3277   bfd_getb64, bfd_getb_signed_64, bfd_putb64,
   3278   bfd_getb32, bfd_getb_signed_32, bfd_putb32,
   3279   bfd_getb16, bfd_getb_signed_16, bfd_putb16,	/* hdrs */
   3280 
   3281   {
   3282     _bfd_dummy_target,
   3283     mmo_object_p,		/* bfd_check_format */
   3284     _bfd_dummy_target,
   3285     _bfd_dummy_target,
   3286   },
   3287   {
   3288     bfd_false,
   3289     mmo_mkobject,
   3290     bfd_false,
   3291     bfd_false,
   3292   },
   3293   {				/* bfd_write_contents */
   3294     bfd_false,
   3295     mmo_write_object_contents,
   3296     bfd_false,
   3297     bfd_false,
   3298   },
   3299 
   3300   BFD_JUMP_TABLE_GENERIC (mmo),
   3301   BFD_JUMP_TABLE_COPY (mmo),
   3302   BFD_JUMP_TABLE_CORE (_bfd_nocore),
   3303   BFD_JUMP_TABLE_ARCHIVE (_bfd_noarchive),
   3304   BFD_JUMP_TABLE_SYMBOLS (mmo),
   3305   BFD_JUMP_TABLE_RELOCS (_bfd_norelocs),
   3306   BFD_JUMP_TABLE_WRITE (mmo),
   3307   BFD_JUMP_TABLE_LINK (mmo),
   3308   BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
   3309 
   3310   NULL,
   3311 
   3312   NULL
   3313 };
   3314