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@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 *
mmo_make_section(bfd * abfd,const char * secname)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
mmo_init(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 *
mmo_object_p(bfd * abfd)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
mmo_mkobject(bfd * abfd)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
mmo_bfd_copy_private_bfd_data(bfd * ibfd,bfd * obfd)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
mmo_find_sec_w_addr(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,void * p)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
mmo_find_sec_w_addr_grow(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,void * p)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 *
mmo_decide_section(bfd * abfd,bfd_vma vma)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
mmo_xore_64(asection * sec,bfd_vma vma,bfd_vma value)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
mmo_xore_32(asection * sec,bfd_vma vma,unsigned int value)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
mmo_xore_16(asection * sec,bfd_vma vma,unsigned int value)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
mmo_write_tetra_raw(bfd * abfd,unsigned int value)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
mmo_write_tetra(bfd * abfd,unsigned int value)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
mmo_write_octa(bfd * abfd,bfd_vma value)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
mmo_write_octa_raw(bfd * abfd,bfd_vma value)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
mmo_write_chunk(bfd * abfd,const bfd_byte * loc,unsigned int len)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
mmo_flush_chunk(bfd * abfd)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
mmo_write_chunk_list(bfd * abfd,mmo_data_list_type * datap)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
mmo_write_loc_chunk(bfd * abfd,bfd_vma vma,const bfd_byte * loc,unsigned int len,bfd_vma * last_vmap)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
mmo_write_loc_chunk_list(bfd * abfd,mmo_data_list_type * datap)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 *
mmo_get_generic_spec_data_section(bfd * abfd,int spec_data_number)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 *
mmo_get_spec_section(bfd * abfd,int spec_data_number)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
mmo_get_byte(bfd * abfd)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
mmo_write_byte(bfd * abfd,bfd_byte value)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
mmo_create_symbol(bfd * abfd,const char * symname,bfd_vma addr,enum mmo_sym_type sym_type,unsigned int serno)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
mmo_get_symbols(bfd * abfd)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 *
mmo_get_loc(asection * sec,bfd_vma vma,int size)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
mmo_map_set_sizes(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,void * ignored ATTRIBUTE_UNUSED)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
mmo_scan(bfd * abfd)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
mmo_new_section_hook(bfd * abfd,asection * newsect)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
mmo_get_section_contents(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,void * location,file_ptr offset,bfd_size_type bytes_to_do)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
mmo_get_symtab_upper_bound(bfd * abfd)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
mmo_sort_mmo_symbols(const void * arg1,const void * arg2)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
mmo_canonicalize_symtab(bfd * abfd,asymbol ** alocation)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
mmo_get_symbol_info(bfd * ignore_abfd ATTRIBUTE_UNUSED,asymbol * symbol,symbol_info * ret)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
mmo_print_symbol(bfd * abfd,void * afile,asymbol * symbol,bfd_print_symbol_type how)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
mmo_sizeof_headers(bfd * abfd ATTRIBUTE_UNUSED,struct bfd_link_info * info ATTRIBUTE_UNUSED)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
mmo_internal_write_header(bfd * abfd)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
mmo_internal_write_post(bfd * abfd,int z,asection * sec)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
mmo_sec_flags_from_bfd_flags(flagword flags)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
bfd_sec_flags_from_mmo_flags(flagword flags)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
mmo_has_leading_or_trailing_zero_tetra_p(bfd * abfd,asection * sec)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
mmo_internal_write_section(bfd * abfd,asection * sec)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
mmo_write_section_description(bfd * abfd,asection * sec)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
mmo_set_section_contents(bfd * abfd ATTRIBUTE_UNUSED,sec_ptr sec,const void * location,file_ptr offset,bfd_size_type bytes_to_do)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
mmo_internal_add_3_sym(bfd * abfd,struct mmo_symbol_trie * rootp,const struct mmo_symbol * symp)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
mmo_internal_3_length(bfd * abfd,struct mmo_symbol_trie * trie)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
mmo_beb128_out(bfd * abfd,int serno,int marker)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
mmo_internal_3_dump(bfd * abfd,struct mmo_symbol_trie * trie)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
mmo_write_symbols_and_terminator(bfd * abfd)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
mmo_write_section_unless_reg_contents(bfd * abfd,asection * sec,void * p)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
mmo_write_object_contents(bfd * abfd)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