Initial import of binutils 2.22 on the new vendor branch
[dragonfly.git] / contrib / binutils-2.22 / gas / read.c
1 /* read.c - read a source file -
2    Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
3    1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
4    2010, 2011  Free Software Foundation, Inc.
5
6    This file is part of GAS, the GNU Assembler.
7
8    GAS is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3, or (at your option)
11    any later version.
12
13    GAS is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with GAS; see the file COPYING.  If not, write to the Free
20    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21    02110-1301, USA.  */
22
23 /* If your chars aren't 8 bits, you will change this a bit (eg. to 0xFF).
24    But then, GNU isn't spozed to run on your machine anyway.
25    (RMS is so shortsighted sometimes.)  */
26 #define MASK_CHAR ((int)(unsigned char) -1)
27
28 /* This is the largest known floating point format (for now). It will
29    grow when we do 4361 style flonums.  */
30 #define MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT (16)
31
32 /* Routines that read assembler source text to build spaghetti in memory.
33    Another group of these functions is in the expr.c module.  */
34
35 #include "as.h"
36 #include "safe-ctype.h"
37 #include "subsegs.h"
38 #include "sb.h"
39 #include "macro.h"
40 #include "obstack.h"
41 #include "ecoff.h"
42 #include "dw2gencfi.h"
43
44 #ifndef TC_START_LABEL
45 #define TC_START_LABEL(x,y,z) (x == ':')
46 #endif
47
48 /* Set by the object-format or the target.  */
49 #ifndef TC_IMPLICIT_LCOMM_ALIGNMENT
50 #define TC_IMPLICIT_LCOMM_ALIGNMENT(SIZE, P2VAR)                \
51   do                                                            \
52     {                                                           \
53       if ((SIZE) >= 8)                                          \
54         (P2VAR) = 3;                                            \
55       else if ((SIZE) >= 4)                                     \
56         (P2VAR) = 2;                                            \
57       else if ((SIZE) >= 2)                                     \
58         (P2VAR) = 1;                                            \
59       else                                                      \
60         (P2VAR) = 0;                                            \
61     }                                                           \
62   while (0)
63 #endif
64
65 char *input_line_pointer;       /*->next char of source file to parse.  */
66
67 #if BITS_PER_CHAR != 8
68 /*  The following table is indexed by[(char)] and will break if
69     a char does not have exactly 256 states (hopefully 0:255!)!  */
70 die horribly;
71 #endif
72
73 #ifndef LEX_AT
74 #define LEX_AT 0
75 #endif
76
77 #ifndef LEX_BR
78 /* The RS/6000 assembler uses {,},[,] as parts of symbol names.  */
79 #define LEX_BR 0
80 #endif
81
82 #ifndef LEX_PCT
83 /* The Delta 68k assembler permits % inside label names.  */
84 #define LEX_PCT 0
85 #endif
86
87 #ifndef LEX_QM
88 /* The PowerPC Windows NT assemblers permits ? inside label names.  */
89 #define LEX_QM 0
90 #endif
91
92 #ifndef LEX_HASH
93 /* The IA-64 assembler uses # as a suffix designating a symbol.  We include
94    it in the symbol and strip it out in tc_canonicalize_symbol_name.  */
95 #define LEX_HASH 0
96 #endif
97
98 #ifndef LEX_DOLLAR
99 #define LEX_DOLLAR 3
100 #endif
101
102 #ifndef LEX_TILDE
103 /* The Delta 68k assembler permits ~ at start of label names.  */
104 #define LEX_TILDE 0
105 #endif
106
107 /* Used by is_... macros. our ctype[].  */
108 char lex_type[256] = {
109   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* @ABCDEFGHIJKLMNO */
110   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* PQRSTUVWXYZ[\]^_ */
111   0, 0, 0, LEX_HASH, LEX_DOLLAR, LEX_PCT, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* _!"#$%&'()*+,-./ */
112   1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, LEX_QM,  /* 0123456789:;<=>? */
113   LEX_AT, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,  /* @ABCDEFGHIJKLMNO */
114   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, 0, 3, /* PQRSTUVWXYZ[\]^_ */
115   0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,       /* `abcdefghijklmno */
116   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, LEX_TILDE, 0, /* pqrstuvwxyz{|}~.  */
117   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
118   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
119   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
120   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
121   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
122   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
123   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
124   3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
125 };
126
127 /* In: a character.
128    Out: 1 if this character ends a line.
129         2 if this character is a line separator.  */
130 char is_end_of_line[256] = {
131 #ifdef CR_EOL
132   1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0,       /* @abcdefghijklmno */
133 #else
134   1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,       /* @abcdefghijklmno */
135 #endif
136   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* */
137   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* _!"#$%&'()*+,-./ */
138   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* 0123456789:;<=>? */
139   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* */
140   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* */
141   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* */
142   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* */
143   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* */
144   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* */
145   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* */
146   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* */
147   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* */
148   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* */
149   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,       /* */
150   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0        /* */
151 };
152
153 #ifndef TC_CASE_SENSITIVE
154 char original_case_string[128];
155 #endif
156
157 /* Functions private to this file.  */
158
159 static char *buffer;    /* 1st char of each buffer of lines is here.  */
160 static char *buffer_limit;      /*->1 + last char in buffer.  */
161
162 /* TARGET_BYTES_BIG_ENDIAN is required to be defined to either 0 or 1
163    in the tc-<CPU>.h file.  See the "Porting GAS" section of the
164    internals manual.  */
165 int target_big_endian = TARGET_BYTES_BIG_ENDIAN;
166
167 /* Variables for handling include file directory table.  */
168
169 /* Table of pointers to directories to search for .include's.  */
170 char **include_dirs;
171
172 /* How many are in the table.  */
173 int include_dir_count;
174
175 /* Length of longest in table.  */
176 int include_dir_maxlen = 1;
177
178 #ifndef WORKING_DOT_WORD
179 struct broken_word *broken_words;
180 int new_broken_words;
181 #endif
182
183 /* The current offset into the absolute section.  We don't try to
184    build frags in the absolute section, since no data can be stored
185    there.  We just keep track of the current offset.  */
186 addressT abs_section_offset;
187
188 /* If this line had an MRI style label, it is stored in this variable.
189    This is used by some of the MRI pseudo-ops.  */
190 symbolS *line_label;
191
192 /* This global variable is used to support MRI common sections.  We
193    translate such sections into a common symbol.  This variable is
194    non-NULL when we are in an MRI common section.  */
195 symbolS *mri_common_symbol;
196
197 /* In MRI mode, after a dc.b pseudo-op with an odd number of bytes, we
198    need to align to an even byte boundary unless the next pseudo-op is
199    dc.b, ds.b, or dcb.b.  This variable is set to 1 if an alignment
200    may be needed.  */
201 static int mri_pending_align;
202
203 #ifndef NO_LISTING
204 #ifdef OBJ_ELF
205 /* This variable is set to be non-zero if the next string we see might
206    be the name of the source file in DWARF debugging information.  See
207    the comment in emit_expr for the format we look for.  */
208 static int dwarf_file_string;
209 #endif
210 #endif
211
212 static void do_s_func (int end_p, const char *default_prefix);
213 static void do_align (int, char *, int, int);
214 static void s_align (int, int);
215 static void s_altmacro (int);
216 static void s_bad_end (int);
217 #ifdef OBJ_ELF
218 static void s_gnu_attribute (int);
219 #endif
220 static void s_reloc (int);
221 static int hex_float (int, char *);
222 static segT get_known_segmented_expression (expressionS * expP);
223 static void pobegin (void);
224 static int get_non_macro_line_sb (sb *);
225 static void generate_file_debug (void);
226 static char *_find_end_of_line (char *, int, int, int);
227 \f
228 void
229 read_begin (void)
230 {
231   const char *p;
232
233   pobegin ();
234   obj_read_begin_hook ();
235
236   /* Something close -- but not too close -- to a multiple of 1024.
237      The debugging malloc I'm using has 24 bytes of overhead.  */
238   obstack_begin (&notes, chunksize);
239   obstack_begin (&cond_obstack, chunksize);
240
241   /* Use machine dependent syntax.  */
242   for (p = line_separator_chars; *p; p++)
243     is_end_of_line[(unsigned char) *p] = 2;
244   /* Use more.  FIXME-SOMEDAY.  */
245
246   if (flag_mri)
247     lex_type['?'] = 3;
248 }
249 \f
250 #ifndef TC_ADDRESS_BYTES
251 #define TC_ADDRESS_BYTES address_bytes
252
253 static inline int
254 address_bytes (void)
255 {
256   /* Choose smallest of 1, 2, 4, 8 bytes that is large enough to
257      contain an address.  */
258   int n = (stdoutput->arch_info->bits_per_address - 1) / 8;
259   n |= n >> 1;
260   n |= n >> 2;
261   n += 1;
262   return n;
263 }
264 #endif
265
266 /* Set up pseudo-op tables.  */
267
268 static struct hash_control *po_hash;
269
270 static const pseudo_typeS potable[] = {
271   {"abort", s_abort, 0},
272   {"align", s_align_ptwo, 0},
273   {"altmacro", s_altmacro, 1},
274   {"ascii", stringer, 8+0},
275   {"asciz", stringer, 8+1},
276   {"balign", s_align_bytes, 0},
277   {"balignw", s_align_bytes, -2},
278   {"balignl", s_align_bytes, -4},
279 /* block  */
280   {"byte", cons, 1},
281   {"comm", s_comm, 0},
282   {"common", s_mri_common, 0},
283   {"common.s", s_mri_common, 1},
284   {"data", s_data, 0},
285   {"dc", cons, 2},
286 #ifdef TC_ADDRESS_BYTES
287   {"dc.a", cons, 0},
288 #endif
289   {"dc.b", cons, 1},
290   {"dc.d", float_cons, 'd'},
291   {"dc.l", cons, 4},
292   {"dc.s", float_cons, 'f'},
293   {"dc.w", cons, 2},
294   {"dc.x", float_cons, 'x'},
295   {"dcb", s_space, 2},
296   {"dcb.b", s_space, 1},
297   {"dcb.d", s_float_space, 'd'},
298   {"dcb.l", s_space, 4},
299   {"dcb.s", s_float_space, 'f'},
300   {"dcb.w", s_space, 2},
301   {"dcb.x", s_float_space, 'x'},
302   {"ds", s_space, 2},
303   {"ds.b", s_space, 1},
304   {"ds.d", s_space, 8},
305   {"ds.l", s_space, 4},
306   {"ds.p", s_space, 12},
307   {"ds.s", s_space, 4},
308   {"ds.w", s_space, 2},
309   {"ds.x", s_space, 12},
310   {"debug", s_ignore, 0},
311 #ifdef S_SET_DESC
312   {"desc", s_desc, 0},
313 #endif
314 /* dim  */
315   {"double", float_cons, 'd'},
316 /* dsect  */
317   {"eject", listing_eject, 0},  /* Formfeed listing.  */
318   {"else", s_else, 0},
319   {"elsec", s_else, 0},
320   {"elseif", s_elseif, (int) O_ne},
321   {"end", s_end, 0},
322   {"endc", s_endif, 0},
323   {"endfunc", s_func, 1},
324   {"endif", s_endif, 0},
325   {"endm", s_bad_end, 0},
326   {"endr", s_bad_end, 1},
327 /* endef  */
328   {"equ", s_set, 0},
329   {"equiv", s_set, 1},
330   {"eqv", s_set, -1},
331   {"err", s_err, 0},
332   {"error", s_errwarn, 1},
333   {"exitm", s_mexit, 0},
334 /* extend  */
335   {"extern", s_ignore, 0},      /* We treat all undef as ext.  */
336   {"appfile", s_app_file, 1},
337   {"appline", s_app_line, 1},
338   {"fail", s_fail, 0},
339   {"file", s_app_file, 0},
340   {"fill", s_fill, 0},
341   {"float", float_cons, 'f'},
342   {"format", s_ignore, 0},
343   {"func", s_func, 0},
344   {"global", s_globl, 0},
345   {"globl", s_globl, 0},
346 #ifdef OBJ_ELF
347   {"gnu_attribute", s_gnu_attribute, 0},
348 #endif
349   {"hword", cons, 2},
350   {"if", s_if, (int) O_ne},
351   {"ifb", s_ifb, 1},
352   {"ifc", s_ifc, 0},
353   {"ifdef", s_ifdef, 0},
354   {"ifeq", s_if, (int) O_eq},
355   {"ifeqs", s_ifeqs, 0},
356   {"ifge", s_if, (int) O_ge},
357   {"ifgt", s_if, (int) O_gt},
358   {"ifle", s_if, (int) O_le},
359   {"iflt", s_if, (int) O_lt},
360   {"ifnb", s_ifb, 0},
361   {"ifnc", s_ifc, 1},
362   {"ifndef", s_ifdef, 1},
363   {"ifne", s_if, (int) O_ne},
364   {"ifnes", s_ifeqs, 1},
365   {"ifnotdef", s_ifdef, 1},
366   {"incbin", s_incbin, 0},
367   {"include", s_include, 0},
368   {"int", cons, 4},
369   {"irp", s_irp, 0},
370   {"irep", s_irp, 0},
371   {"irpc", s_irp, 1},
372   {"irepc", s_irp, 1},
373   {"lcomm", s_lcomm, 0},
374   {"lflags", s_ignore, 0},      /* Listing flags.  */
375   {"linefile", s_app_line, 0},
376   {"linkonce", s_linkonce, 0},
377   {"list", listing_list, 1},    /* Turn listing on.  */
378   {"llen", listing_psize, 1},
379   {"long", cons, 4},
380   {"lsym", s_lsym, 0},
381   {"macro", s_macro, 0},
382   {"mexit", s_mexit, 0},
383   {"mri", s_mri, 0},
384   {".mri", s_mri, 0},   /* Special case so .mri works in MRI mode.  */
385   {"name", s_ignore, 0},
386   {"noaltmacro", s_altmacro, 0},
387   {"noformat", s_ignore, 0},
388   {"nolist", listing_list, 0},  /* Turn listing off.  */
389   {"nopage", listing_nopage, 0},
390   {"octa", cons, 16},
391   {"offset", s_struct, 0},
392   {"org", s_org, 0},
393   {"p2align", s_align_ptwo, 0},
394   {"p2alignw", s_align_ptwo, -2},
395   {"p2alignl", s_align_ptwo, -4},
396   {"page", listing_eject, 0},
397   {"plen", listing_psize, 0},
398   {"print", s_print, 0},
399   {"psize", listing_psize, 0},  /* Set paper size.  */
400   {"purgem", s_purgem, 0},
401   {"quad", cons, 8},
402   {"reloc", s_reloc, 0},
403   {"rep", s_rept, 0},
404   {"rept", s_rept, 0},
405   {"rva", s_rva, 4},
406   {"sbttl", listing_title, 1},  /* Subtitle of listing.  */
407 /* scl  */
408 /* sect  */
409   {"set", s_set, 0},
410   {"short", cons, 2},
411   {"single", float_cons, 'f'},
412 /* size  */
413   {"space", s_space, 0},
414   {"skip", s_space, 0},
415   {"sleb128", s_leb128, 1},
416   {"spc", s_ignore, 0},
417   {"stabd", s_stab, 'd'},
418   {"stabn", s_stab, 'n'},
419   {"stabs", s_stab, 's'},
420   {"string", stringer, 8+1},
421   {"string8", stringer, 8+1},
422   {"string16", stringer, 16+1},
423   {"string32", stringer, 32+1},
424   {"string64", stringer, 64+1},
425   {"struct", s_struct, 0},
426 /* tag  */
427   {"text", s_text, 0},
428
429   /* This is for gcc to use.  It's only just been added (2/94), so gcc
430      won't be able to use it for a while -- probably a year or more.
431      But once this has been released, check with gcc maintainers
432      before deleting it or even changing the spelling.  */
433   {"this_GCC_requires_the_GNU_assembler", s_ignore, 0},
434   /* If we're folding case -- done for some targets, not necessarily
435      all -- the above string in an input file will be converted to
436      this one.  Match it either way...  */
437   {"this_gcc_requires_the_gnu_assembler", s_ignore, 0},
438
439   {"title", listing_title, 0},  /* Listing title.  */
440   {"ttl", listing_title, 0},
441 /* type  */
442   {"uleb128", s_leb128, 0},
443 /* use  */
444 /* val  */
445   {"xcom", s_comm, 0},
446   {"xdef", s_globl, 0},
447   {"xref", s_ignore, 0},
448   {"xstabs", s_xstab, 's'},
449   {"warning", s_errwarn, 0},
450   {"weakref", s_weakref, 0},
451   {"word", cons, 2},
452   {"zero", s_space, 0},
453   {NULL, NULL, 0}                       /* End sentinel.  */
454 };
455
456 static offsetT
457 get_absolute_expr (expressionS *exp)
458 {
459   expression_and_evaluate (exp);
460   if (exp->X_op != O_constant)
461     {
462       if (exp->X_op != O_absent)
463         as_bad (_("bad or irreducible absolute expression"));
464       exp->X_add_number = 0;
465     }
466   return exp->X_add_number;
467 }
468
469 offsetT
470 get_absolute_expression (void)
471 {
472   expressionS exp;
473
474   return get_absolute_expr (&exp);
475 }
476
477 static int pop_override_ok = 0;
478 static const char *pop_table_name;
479
480 void
481 pop_insert (const pseudo_typeS *table)
482 {
483   const char *errtxt;
484   const pseudo_typeS *pop;
485   for (pop = table; pop->poc_name; pop++)
486     {
487       errtxt = hash_insert (po_hash, pop->poc_name, (char *) pop);
488       if (errtxt && (!pop_override_ok || strcmp (errtxt, "exists")))
489         as_fatal (_("error constructing %s pseudo-op table: %s"), pop_table_name,
490                   errtxt);
491     }
492 }
493
494 #ifndef md_pop_insert
495 #define md_pop_insert()         pop_insert(md_pseudo_table)
496 #endif
497
498 #ifndef obj_pop_insert
499 #define obj_pop_insert()        pop_insert(obj_pseudo_table)
500 #endif
501
502 #ifndef cfi_pop_insert
503 #define cfi_pop_insert()        pop_insert(cfi_pseudo_table)
504 #endif
505
506 static void
507 pobegin (void)
508 {
509   po_hash = hash_new ();
510
511   /* Do the target-specific pseudo ops.  */
512   pop_table_name = "md";
513   md_pop_insert ();
514
515   /* Now object specific.  Skip any that were in the target table.  */
516   pop_table_name = "obj";
517   pop_override_ok = 1;
518   obj_pop_insert ();
519
520   /* Now portable ones.  Skip any that we've seen already.  */
521   pop_table_name = "standard";
522   pop_insert (potable);
523
524   /* Now CFI ones.  */
525   pop_table_name = "cfi";
526   pop_override_ok = 1;
527   cfi_pop_insert ();
528 }
529 \f
530 #define HANDLE_CONDITIONAL_ASSEMBLY()                                   \
531   if (ignore_input ())                                                  \
532     {                                                                   \
533       char *eol = find_end_of_line (input_line_pointer, flag_m68k_mri); \
534       input_line_pointer = (input_line_pointer <= buffer_limit          \
535                             && eol >= buffer_limit)                     \
536                            ? buffer_limit                               \
537                            : eol + 1;                                   \
538       continue;                                                         \
539     }
540
541 /* This function is used when scrubbing the characters between #APP
542    and #NO_APP.  */
543
544 static char *scrub_string;
545 static char *scrub_string_end;
546
547 static int
548 scrub_from_string (char *buf, int buflen)
549 {
550   int copy;
551
552   copy = scrub_string_end - scrub_string;
553   if (copy > buflen)
554     copy = buflen;
555   memcpy (buf, scrub_string, copy);
556   scrub_string += copy;
557   return copy;
558 }
559
560 /* Helper function of read_a_source_file, which tries to expand a macro.  */
561 static int
562 try_macro (char term, const char *line)
563 {
564   sb out;
565   const char *err;
566   macro_entry *macro;
567
568   if (check_macro (line, &out, &err, &macro))
569     {
570       if (err != NULL)
571         as_bad ("%s", err);
572       *input_line_pointer++ = term;
573       input_scrub_include_sb (&out,
574                               input_line_pointer, 1);
575       sb_kill (&out);
576       buffer_limit =
577         input_scrub_next_buffer (&input_line_pointer);
578 #ifdef md_macro_info
579       md_macro_info (macro);
580 #endif
581       return 1;
582     }
583   return 0;
584 }
585
586 /* We read the file, putting things into a web that represents what we
587    have been reading.  */
588 void
589 read_a_source_file (char *name)
590 {
591   char c;
592   char *s;              /* String of symbol, '\0' appended.  */
593   int temp;
594   pseudo_typeS *pop;
595
596 #ifdef WARN_COMMENTS
597   found_comment = 0;
598 #endif
599
600   buffer = input_scrub_new_file (name);
601
602   listing_file (name);
603   listing_newline (NULL);
604   register_dependency (name);
605
606   /* Generate debugging information before we've read anything in to denote
607      this file as the "main" source file and not a subordinate one
608      (e.g. N_SO vs N_SOL in stabs).  */
609   generate_file_debug ();
610
611   while ((buffer_limit = input_scrub_next_buffer (&input_line_pointer)) != 0)
612     {                           /* We have another line to parse.  */
613 #ifndef NO_LISTING
614       /* In order to avoid listing macro expansion lines with labels
615          multiple times, keep track of which line was last issued.  */
616       static char *last_eol;
617
618       last_eol = NULL;
619 #endif
620       while (input_line_pointer < buffer_limit)
621         {
622           bfd_boolean was_new_line;
623           /* We have more of this buffer to parse.  */
624
625           /* We now have input_line_pointer->1st char of next line.
626              If input_line_pointer [-1] == '\n' then we just
627              scanned another line: so bump line counters.  */
628           was_new_line = is_end_of_line[(unsigned char) input_line_pointer[-1]];
629           if (was_new_line)
630             {
631               symbol_set_value_now (&dot_symbol);
632 #ifdef md_start_line_hook
633               md_start_line_hook ();
634 #endif
635               if (input_line_pointer[-1] == '\n')
636                 bump_line_counters ();
637             }
638
639 #ifndef NO_LISTING
640           /* If listing is on, and we are expanding a macro, then give
641              the listing code the contents of the expanded line.  */
642           if (listing)
643             {
644               if ((listing & LISTING_MACEXP) && macro_nest > 0)
645                 {
646                   /* Find the end of the current expanded macro line.  */
647                   s = find_end_of_line (input_line_pointer, flag_m68k_mri);
648
649                   if (s != last_eol)
650                     {
651                       char *copy;
652                       int len;
653
654                       last_eol = s;
655                       /* Copy it for safe keeping.  Also give an indication of
656                          how much macro nesting is involved at this point.  */
657                       len = s - input_line_pointer;
658                       copy = (char *) xmalloc (len + macro_nest + 2);
659                       memset (copy, '>', macro_nest);
660                       copy[macro_nest] = ' ';
661                       memcpy (copy + macro_nest + 1, input_line_pointer, len);
662                       copy[macro_nest + 1 + len] = '\0';
663
664                       /* Install the line with the listing facility.  */
665                       listing_newline (copy);
666                     }
667                 }
668               else
669                 listing_newline (NULL);
670             }
671 #endif
672           if (was_new_line)
673             {
674               line_label = NULL;
675
676               if (LABELS_WITHOUT_COLONS || flag_m68k_mri)
677                 {
678                   /* Text at the start of a line must be a label, we
679                      run down and stick a colon in.  */
680                   if (is_name_beginner (*input_line_pointer))
681                     {
682                       char *line_start = input_line_pointer;
683                       int mri_line_macro;
684
685                       HANDLE_CONDITIONAL_ASSEMBLY ();
686
687                       c = get_symbol_end ();
688
689                       /* In MRI mode, the EQU and MACRO pseudoops must
690                          be handled specially.  */
691                       mri_line_macro = 0;
692                       if (flag_m68k_mri)
693                         {
694                           char *rest = input_line_pointer + 1;
695
696                           if (*rest == ':')
697                             ++rest;
698                           if (*rest == ' ' || *rest == '\t')
699                             ++rest;
700                           if ((strncasecmp (rest, "EQU", 3) == 0
701                                || strncasecmp (rest, "SET", 3) == 0)
702                               && (rest[3] == ' ' || rest[3] == '\t'))
703                             {
704                               input_line_pointer = rest + 3;
705                               equals (line_start,
706                                       strncasecmp (rest, "SET", 3) == 0);
707                               continue;
708                             }
709                           if (strncasecmp (rest, "MACRO", 5) == 0
710                               && (rest[5] == ' '
711                                   || rest[5] == '\t'
712                                   || is_end_of_line[(unsigned char) rest[5]]))
713                             mri_line_macro = 1;
714                         }
715
716                       /* In MRI mode, we need to handle the MACRO
717                          pseudo-op specially: we don't want to put the
718                          symbol in the symbol table.  */
719                       if (!mri_line_macro
720 #ifdef TC_START_LABEL_WITHOUT_COLON
721                           && TC_START_LABEL_WITHOUT_COLON(c,
722                                                           input_line_pointer)
723 #endif
724                           )
725                         line_label = colon (line_start);
726                       else
727                         line_label = symbol_create (line_start,
728                                                     absolute_section,
729                                                     (valueT) 0,
730                                                     &zero_address_frag);
731
732                       *input_line_pointer = c;
733                       if (c == ':')
734                         input_line_pointer++;
735                     }
736                 }
737             }
738
739           /* We are at the beginning of a line, or similar place.
740              We expect a well-formed assembler statement.
741              A "symbol-name:" is a statement.
742
743              Depending on what compiler is used, the order of these tests
744              may vary to catch most common case 1st.
745              Each test is independent of all other tests at the (top)
746              level.  */
747           do
748             c = *input_line_pointer++;
749           while (c == '\t' || c == ' ' || c == '\f');
750
751           /* C is the 1st significant character.
752              Input_line_pointer points after that character.  */
753           if (is_name_beginner (c))
754             {
755               /* Want user-defined label or pseudo/opcode.  */
756               HANDLE_CONDITIONAL_ASSEMBLY ();
757
758               s = --input_line_pointer;
759               c = get_symbol_end ();    /* name's delimiter.  */
760
761               /* C is character after symbol.
762                  That character's place in the input line is now '\0'.
763                  S points to the beginning of the symbol.
764                    [In case of pseudo-op, s->'.'.]
765                  Input_line_pointer->'\0' where c was.  */
766               if (TC_START_LABEL (c, s, input_line_pointer))
767                 {
768                   if (flag_m68k_mri)
769                     {
770                       char *rest = input_line_pointer + 1;
771
772                       /* In MRI mode, \tsym: set 0 is permitted.  */
773                       if (*rest == ':')
774                         ++rest;
775
776                       if (*rest == ' ' || *rest == '\t')
777                         ++rest;
778
779                       if ((strncasecmp (rest, "EQU", 3) == 0
780                            || strncasecmp (rest, "SET", 3) == 0)
781                           && (rest[3] == ' ' || rest[3] == '\t'))
782                         {
783                           input_line_pointer = rest + 3;
784                           equals (s, 1);
785                           continue;
786                         }
787                     }
788
789                   line_label = colon (s);       /* User-defined label.  */
790                   /* Put ':' back for error messages' sake.  */
791                   *input_line_pointer++ = ':';
792 #ifdef tc_check_label
793                   tc_check_label (line_label);
794 #endif
795                   /* Input_line_pointer->after ':'.  */
796                   SKIP_WHITESPACE ();
797                 }
798               else if ((c == '=' && input_line_pointer[1] == '=')
799                        || ((c == ' ' || c == '\t')
800                            && input_line_pointer[1] == '='
801                            && input_line_pointer[2] == '='))
802                 {
803                   equals (s, -1);
804                   demand_empty_rest_of_line ();
805                 }
806               else if ((c == '='
807                        || ((c == ' ' || c == '\t')
808                             && input_line_pointer[1] == '='))
809 #ifdef TC_EQUAL_IN_INSN
810                            && !TC_EQUAL_IN_INSN (c, s)
811 #endif
812                            )
813                 {
814                   equals (s, 1);
815                   demand_empty_rest_of_line ();
816                 }
817               else
818                 {
819                   /* Expect pseudo-op or machine instruction.  */
820                   pop = NULL;
821
822 #ifndef TC_CASE_SENSITIVE
823                   {
824                     char *s2 = s;
825
826                     strncpy (original_case_string, s2, sizeof (original_case_string));
827                     original_case_string[sizeof (original_case_string) - 1] = 0;
828
829                     while (*s2)
830                       {
831                         *s2 = TOLOWER (*s2);
832                         s2++;
833                       }
834                   }
835 #endif
836                   if (NO_PSEUDO_DOT || flag_m68k_mri)
837                     {
838                       /* The MRI assembler uses pseudo-ops without
839                          a period.  */
840                       pop = (pseudo_typeS *) hash_find (po_hash, s);
841                       if (pop != NULL && pop->poc_handler == NULL)
842                         pop = NULL;
843                     }
844
845                   if (pop != NULL
846                       || (!flag_m68k_mri && *s == '.'))
847                     {
848                       /* PSEUDO - OP.
849
850                          WARNING: c has next char, which may be end-of-line.
851                          We lookup the pseudo-op table with s+1 because we
852                          already know that the pseudo-op begins with a '.'.  */
853
854                       if (pop == NULL)
855                         pop = (pseudo_typeS *) hash_find (po_hash, s + 1);
856                       if (pop && !pop->poc_handler)
857                         pop = NULL;
858
859                       /* In MRI mode, we may need to insert an
860                          automatic alignment directive.  What a hack
861                          this is.  */
862                       if (mri_pending_align
863                           && (pop == NULL
864                               || !((pop->poc_handler == cons
865                                     && pop->poc_val == 1)
866                                    || (pop->poc_handler == s_space
867                                        && pop->poc_val == 1)
868 #ifdef tc_conditional_pseudoop
869                                    || tc_conditional_pseudoop (pop)
870 #endif
871                                    || pop->poc_handler == s_if
872                                    || pop->poc_handler == s_ifdef
873                                    || pop->poc_handler == s_ifc
874                                    || pop->poc_handler == s_ifeqs
875                                    || pop->poc_handler == s_else
876                                    || pop->poc_handler == s_endif
877                                    || pop->poc_handler == s_globl
878                                    || pop->poc_handler == s_ignore)))
879                         {
880                           do_align (1, (char *) NULL, 0, 0);
881                           mri_pending_align = 0;
882
883                           if (line_label != NULL)
884                             {
885                               symbol_set_frag (line_label, frag_now);
886                               S_SET_VALUE (line_label, frag_now_fix ());
887                             }
888                         }
889
890                       /* Print the error msg now, while we still can.  */
891                       if (pop == NULL)
892                         {
893                           char *end = input_line_pointer;
894
895                           *input_line_pointer = c;
896                           s_ignore (0);
897                           c = *--input_line_pointer;
898                           *input_line_pointer = '\0';
899                           if (! macro_defined || ! try_macro (c, s))
900                             {
901                               *end = '\0';
902                               as_bad (_("unknown pseudo-op: `%s'"), s);
903                               *input_line_pointer++ = c;
904                             }
905                           continue;
906                         }
907
908                       /* Put it back for error messages etc.  */
909                       *input_line_pointer = c;
910                       /* The following skip of whitespace is compulsory.
911                          A well shaped space is sometimes all that separates
912                          keyword from operands.  */
913                       if (c == ' ' || c == '\t')
914                         input_line_pointer++;
915
916                       /* Input_line is restored.
917                          Input_line_pointer->1st non-blank char
918                          after pseudo-operation.  */
919                       (*pop->poc_handler) (pop->poc_val);
920
921                       /* If that was .end, just get out now.  */
922                       if (pop->poc_handler == s_end)
923                         goto quit;
924                     }
925                   else
926                     {
927                       /* WARNING: c has char, which may be end-of-line.  */
928                       /* Also: input_line_pointer->`\0` where c was.  */
929                       *input_line_pointer = c;
930                       input_line_pointer = _find_end_of_line (input_line_pointer, flag_m68k_mri, 1, 0);
931                       c = *input_line_pointer;
932                       *input_line_pointer = '\0';
933
934                       generate_lineno_debug ();
935
936                       if (macro_defined && try_macro (c, s))
937                         continue;
938
939                       if (mri_pending_align)
940                         {
941                           do_align (1, (char *) NULL, 0, 0);
942                           mri_pending_align = 0;
943                           if (line_label != NULL)
944                             {
945                               symbol_set_frag (line_label, frag_now);
946                               S_SET_VALUE (line_label, frag_now_fix ());
947                             }
948                         }
949
950                       md_assemble (s);  /* Assemble 1 instruction.  */
951
952                       *input_line_pointer++ = c;
953
954                       /* We resume loop AFTER the end-of-line from
955                          this instruction.  */
956                     }
957                 }
958               continue;
959             }
960
961           /* Empty statement?  */
962           if (is_end_of_line[(unsigned char) c])
963             continue;
964
965           if ((LOCAL_LABELS_DOLLAR || LOCAL_LABELS_FB) && ISDIGIT (c))
966             {
967               /* local label  ("4:")  */
968               char *backup = input_line_pointer;
969
970               HANDLE_CONDITIONAL_ASSEMBLY ();
971
972               temp = c - '0';
973
974               /* Read the whole number.  */
975               while (ISDIGIT (*input_line_pointer))
976                 {
977                   temp = (temp * 10) + *input_line_pointer - '0';
978                   ++input_line_pointer;
979                 }
980
981               if (LOCAL_LABELS_DOLLAR
982                   && *input_line_pointer == '$'
983                   && *(input_line_pointer + 1) == ':')
984                 {
985                   input_line_pointer += 2;
986
987                   if (dollar_label_defined (temp))
988                     {
989                       as_fatal (_("label \"%d$\" redefined"), temp);
990                     }
991
992                   define_dollar_label (temp);
993                   colon (dollar_label_name (temp, 0));
994                   continue;
995                 }
996
997               if (LOCAL_LABELS_FB
998                   && *input_line_pointer++ == ':')
999                 {
1000                   fb_label_instance_inc (temp);
1001                   colon (fb_label_name (temp, 0));
1002                   continue;
1003                 }
1004
1005               input_line_pointer = backup;
1006             }                   /* local label  ("4:") */
1007
1008           if (c && strchr (line_comment_chars, c))
1009             {                   /* Its a comment.  Better say APP or NO_APP.  */
1010               sb sbuf;
1011               char *ends;
1012               char *new_buf;
1013               char *new_tmp;
1014               unsigned int new_length;
1015               char *tmp_buf = 0;
1016
1017               s = input_line_pointer;
1018               if (strncmp (s, "APP\n", 4))
1019                 {
1020                   /* We ignore it.  */
1021                   ignore_rest_of_line ();
1022                   continue;
1023                 }
1024               bump_line_counters ();
1025               s += 4;
1026
1027               sb_new (&sbuf);
1028               ends = strstr (s, "#NO_APP\n");
1029
1030               if (!ends)
1031                 {
1032                   unsigned int tmp_len;
1033                   unsigned int num;
1034
1035                   /* The end of the #APP wasn't in this buffer.  We
1036                      keep reading in buffers until we find the #NO_APP
1037                      that goes with this #APP  There is one.  The specs
1038                      guarantee it...  */
1039                   tmp_len = buffer_limit - s;
1040                   tmp_buf = (char *) xmalloc (tmp_len + 1);
1041                   memcpy (tmp_buf, s, tmp_len);
1042                   do
1043                     {
1044                       new_tmp = input_scrub_next_buffer (&buffer);
1045                       if (!new_tmp)
1046                         break;
1047                       else
1048                         buffer_limit = new_tmp;
1049                       input_line_pointer = buffer;
1050                       ends = strstr (buffer, "#NO_APP\n");
1051                       if (ends)
1052                         num = ends - buffer;
1053                       else
1054                         num = buffer_limit - buffer;
1055
1056                       tmp_buf = (char *) xrealloc (tmp_buf, tmp_len + num);
1057                       memcpy (tmp_buf + tmp_len, buffer, num);
1058                       tmp_len += num;
1059                     }
1060                   while (!ends);
1061
1062                   input_line_pointer = ends ? ends + 8 : NULL;
1063
1064                   s = tmp_buf;
1065                   ends = s + tmp_len;
1066
1067                 }
1068               else
1069                 {
1070                   input_line_pointer = ends + 8;
1071                 }
1072
1073               scrub_string = s;
1074               scrub_string_end = ends;
1075
1076               new_length = ends - s;
1077               new_buf = (char *) xmalloc (new_length);
1078               new_tmp = new_buf;
1079               for (;;)
1080                 {
1081                   int space;
1082                   int size;
1083
1084                   space = (new_buf + new_length) - new_tmp;
1085                   size = do_scrub_chars (scrub_from_string, new_tmp, space);
1086
1087                   if (size < space)
1088                     {
1089                       new_tmp[size] = 0;
1090                       break;
1091                     }
1092
1093                   new_buf = (char *) xrealloc (new_buf, new_length + 100);
1094                   new_tmp = new_buf + new_length;
1095                   new_length += 100;
1096                 }
1097
1098               if (tmp_buf)
1099                 free (tmp_buf);
1100
1101               /* We've "scrubbed" input to the preferred format.  In the
1102                  process we may have consumed the whole of the remaining
1103                  file (and included files).  We handle this formatted
1104                  input similar to that of macro expansion, letting
1105                  actual macro expansion (possibly nested) and other
1106                  input expansion work.  Beware that in messages, line
1107                  numbers and possibly file names will be incorrect.  */
1108               sb_add_string (&sbuf, new_buf);
1109               input_scrub_include_sb (&sbuf, input_line_pointer, 0);
1110               sb_kill (&sbuf);
1111               buffer_limit = input_scrub_next_buffer (&input_line_pointer);
1112               free (new_buf);
1113               continue;
1114             }
1115
1116           HANDLE_CONDITIONAL_ASSEMBLY ();
1117
1118 #ifdef tc_unrecognized_line
1119           if (tc_unrecognized_line (c))
1120             continue;
1121 #endif
1122           input_line_pointer--;
1123           /* Report unknown char as error.  */
1124           demand_empty_rest_of_line ();
1125         }
1126     }
1127
1128  quit:
1129   symbol_set_value_now (&dot_symbol);
1130
1131 #ifdef md_cleanup
1132   md_cleanup ();
1133 #endif
1134   /* Close the input file.  */
1135   input_scrub_close ();
1136 #ifdef WARN_COMMENTS
1137   {
1138     if (warn_comment && found_comment)
1139       as_warn_where (found_comment_file, found_comment,
1140                      "first comment found here");
1141   }
1142 #endif
1143 }
1144
1145 /* Convert O_constant expression EXP into the equivalent O_big representation.
1146    Take the sign of the number from X_unsigned rather than X_add_number.  */
1147
1148 static void
1149 convert_to_bignum (expressionS *exp)
1150 {
1151   valueT value;
1152   unsigned int i;
1153
1154   value = exp->X_add_number;
1155   for (i = 0; i < sizeof (exp->X_add_number) / CHARS_PER_LITTLENUM; i++)
1156     {
1157       generic_bignum[i] = value & LITTLENUM_MASK;
1158       value >>= LITTLENUM_NUMBER_OF_BITS;
1159     }
1160   /* Add a sequence of sign bits if the top bit of X_add_number is not
1161      the sign of the original value.  */
1162   if ((exp->X_add_number < 0) != !exp->X_unsigned)
1163     generic_bignum[i++] = exp->X_unsigned ? 0 : LITTLENUM_MASK;
1164   exp->X_op = O_big;
1165   exp->X_add_number = i;
1166 }
1167
1168 /* For most MRI pseudo-ops, the line actually ends at the first
1169    nonquoted space.  This function looks for that point, stuffs a null
1170    in, and sets *STOPCP to the character that used to be there, and
1171    returns the location.
1172
1173    Until I hear otherwise, I am going to assume that this is only true
1174    for the m68k MRI assembler.  */
1175
1176 char *
1177 mri_comment_field (char *stopcp)
1178 {
1179   char *s;
1180 #ifdef TC_M68K
1181   int inquote = 0;
1182
1183   know (flag_m68k_mri);
1184
1185   for (s = input_line_pointer;
1186        ((!is_end_of_line[(unsigned char) *s] && *s != ' ' && *s != '\t')
1187         || inquote);
1188        s++)
1189     {
1190       if (*s == '\'')
1191         inquote = !inquote;
1192     }
1193 #else
1194   for (s = input_line_pointer;
1195        !is_end_of_line[(unsigned char) *s];
1196        s++)
1197     ;
1198 #endif
1199   *stopcp = *s;
1200   *s = '\0';
1201
1202   return s;
1203 }
1204
1205 /* Skip to the end of an MRI comment field.  */
1206
1207 void
1208 mri_comment_end (char *stop, int stopc)
1209 {
1210   know (flag_mri);
1211
1212   input_line_pointer = stop;
1213   *stop = stopc;
1214   while (!is_end_of_line[(unsigned char) *input_line_pointer])
1215     ++input_line_pointer;
1216 }
1217
1218 void
1219 s_abort (int ignore ATTRIBUTE_UNUSED)
1220 {
1221   as_fatal (_(".abort detected.  Abandoning ship."));
1222 }
1223
1224 /* Guts of .align directive.  N is the power of two to which to align.
1225    FILL may be NULL, or it may point to the bytes of the fill pattern.
1226    LEN is the length of whatever FILL points to, if anything.  MAX is
1227    the maximum number of characters to skip when doing the alignment,
1228    or 0 if there is no maximum.  */
1229
1230 static void
1231 do_align (int n, char *fill, int len, int max)
1232 {
1233   if (now_seg == absolute_section)
1234     {
1235       if (fill != NULL)
1236         while (len-- > 0)
1237           if (*fill++ != '\0')
1238             {
1239               as_warn (_("ignoring fill value in absolute section"));
1240               break;
1241             }
1242       fill = NULL;
1243       len = 0;
1244     }
1245
1246 #ifdef md_flush_pending_output
1247   md_flush_pending_output ();
1248 #endif
1249 #ifdef md_do_align
1250   md_do_align (n, fill, len, max, just_record_alignment);
1251 #endif
1252
1253   /* Only make a frag if we HAVE to...  */
1254   if (n != 0 && !need_pass_2)
1255     {
1256       if (fill == NULL)
1257         {
1258           if (subseg_text_p (now_seg))
1259             frag_align_code (n, max);
1260           else
1261             frag_align (n, 0, max);
1262         }
1263       else if (len <= 1)
1264         frag_align (n, *fill, max);
1265       else
1266         frag_align_pattern (n, fill, len, max);
1267     }
1268
1269 #ifdef md_do_align
1270  just_record_alignment: ATTRIBUTE_UNUSED_LABEL
1271 #endif
1272
1273   record_alignment (now_seg, n - OCTETS_PER_BYTE_POWER);
1274 }
1275
1276 /* Handle the .align pseudo-op.  A positive ARG is a default alignment
1277    (in bytes).  A negative ARG is the negative of the length of the
1278    fill pattern.  BYTES_P is non-zero if the alignment value should be
1279    interpreted as the byte boundary, rather than the power of 2.  */
1280 #ifndef TC_ALIGN_LIMIT
1281 #define TC_ALIGN_LIMIT (stdoutput->arch_info->bits_per_address - 1)
1282 #endif
1283
1284 static void
1285 s_align (int arg, int bytes_p)
1286 {
1287   unsigned int align_limit = TC_ALIGN_LIMIT;
1288   unsigned int align;
1289   char *stop = NULL;
1290   char stopc = 0;
1291   offsetT fill = 0;
1292   int max;
1293   int fill_p;
1294
1295   if (flag_mri)
1296     stop = mri_comment_field (&stopc);
1297
1298   if (is_end_of_line[(unsigned char) *input_line_pointer])
1299     {
1300       if (arg < 0)
1301         align = 0;
1302       else
1303         align = arg;    /* Default value from pseudo-op table.  */
1304     }
1305   else
1306     {
1307       align = get_absolute_expression ();
1308       SKIP_WHITESPACE ();
1309     }
1310
1311   if (bytes_p)
1312     {
1313       /* Convert to a power of 2.  */
1314       if (align != 0)
1315         {
1316           unsigned int i;
1317
1318           for (i = 0; (align & 1) == 0; align >>= 1, ++i)
1319             ;
1320           if (align != 1)
1321             as_bad (_("alignment not a power of 2"));
1322
1323           align = i;
1324         }
1325     }
1326
1327   if (align > align_limit)
1328     {
1329       align = align_limit;
1330       as_warn (_("alignment too large: %u assumed"), align);
1331     }
1332
1333   if (*input_line_pointer != ',')
1334     {
1335       fill_p = 0;
1336       max = 0;
1337     }
1338   else
1339     {
1340       ++input_line_pointer;
1341       if (*input_line_pointer == ',')
1342         fill_p = 0;
1343       else
1344         {
1345           fill = get_absolute_expression ();
1346           SKIP_WHITESPACE ();
1347           fill_p = 1;
1348         }
1349
1350       if (*input_line_pointer != ',')
1351         max = 0;
1352       else
1353         {
1354           ++input_line_pointer;
1355           max = get_absolute_expression ();
1356         }
1357     }
1358
1359   if (!fill_p)
1360     {
1361       if (arg < 0)
1362         as_warn (_("expected fill pattern missing"));
1363       do_align (align, (char *) NULL, 0, max);
1364     }
1365   else
1366     {
1367       int fill_len;
1368
1369       if (arg >= 0)
1370         fill_len = 1;
1371       else
1372         fill_len = -arg;
1373       if (fill_len <= 1)
1374         {
1375           char fill_char;
1376
1377           fill_char = fill;
1378           do_align (align, &fill_char, fill_len, max);
1379         }
1380       else
1381         {
1382           char ab[16];
1383
1384           if ((size_t) fill_len > sizeof ab)
1385             abort ();
1386           md_number_to_chars (ab, fill, fill_len);
1387           do_align (align, ab, fill_len, max);
1388         }
1389     }
1390
1391   demand_empty_rest_of_line ();
1392
1393   if (flag_mri)
1394     mri_comment_end (stop, stopc);
1395 }
1396
1397 /* Handle the .align pseudo-op on machines where ".align 4" means
1398    align to a 4 byte boundary.  */
1399
1400 void
1401 s_align_bytes (int arg)
1402 {
1403   s_align (arg, 1);
1404 }
1405
1406 /* Handle the .align pseudo-op on machines where ".align 4" means align
1407    to a 2**4 boundary.  */
1408
1409 void
1410 s_align_ptwo (int arg)
1411 {
1412   s_align (arg, 0);
1413 }
1414
1415 /* Switch in and out of alternate macro mode.  */
1416
1417 void
1418 s_altmacro (int on)
1419 {
1420   demand_empty_rest_of_line ();
1421   macro_set_alternate (on);
1422 }
1423
1424 symbolS *
1425 s_comm_internal (int param,
1426                  symbolS *(*comm_parse_extra) (int, symbolS *, addressT))
1427 {
1428   char *name;
1429   char c;
1430   char *p;
1431   offsetT temp, size;
1432   symbolS *symbolP = NULL;
1433   char *stop = NULL;
1434   char stopc = 0;
1435   expressionS exp;
1436
1437   if (flag_mri)
1438     stop = mri_comment_field (&stopc);
1439
1440   name = input_line_pointer;
1441   c = get_symbol_end ();
1442   /* Just after name is now '\0'.  */
1443   p = input_line_pointer;
1444   *p = c;
1445
1446   if (name == p)
1447     {
1448       as_bad (_("expected symbol name"));
1449       ignore_rest_of_line ();
1450       goto out;
1451     }
1452
1453   SKIP_WHITESPACE ();
1454
1455   /* Accept an optional comma after the name.  The comma used to be
1456      required, but Irix 5 cc does not generate it for .lcomm.  */
1457   if (*input_line_pointer == ',')
1458     input_line_pointer++;
1459
1460   temp = get_absolute_expr (&exp);
1461   size = temp;
1462   size &= ((offsetT) 2 << (stdoutput->arch_info->bits_per_address - 1)) - 1;
1463   if (exp.X_op == O_absent)
1464     {
1465       as_bad (_("missing size expression"));
1466       ignore_rest_of_line ();
1467       goto out;
1468     }
1469   else if (temp != size || !exp.X_unsigned)
1470     {
1471       as_warn (_("size (%ld) out of range, ignored"), (long) temp);
1472       ignore_rest_of_line ();
1473       goto out;
1474     }
1475
1476   *p = 0;
1477   symbolP = symbol_find_or_make (name);
1478   if ((S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
1479       && !S_IS_COMMON (symbolP))
1480     {
1481       if (!S_IS_VOLATILE (symbolP))
1482         {
1483           symbolP = NULL;
1484           as_bad (_("symbol `%s' is already defined"), name);
1485           *p = c;
1486           ignore_rest_of_line ();
1487           goto out;
1488         }
1489       symbolP = symbol_clone (symbolP, 1);
1490       S_SET_SEGMENT (symbolP, undefined_section);
1491       S_SET_VALUE (symbolP, 0);
1492       symbol_set_frag (symbolP, &zero_address_frag);
1493       S_CLEAR_VOLATILE (symbolP);
1494     }
1495
1496   size = S_GET_VALUE (symbolP);
1497   if (size == 0)
1498     size = temp;
1499   else if (size != temp)
1500     as_warn (_("size of \"%s\" is already %ld; not changing to %ld"),
1501              name, (long) size, (long) temp);
1502
1503   *p = c;
1504   if (comm_parse_extra != NULL)
1505     symbolP = (*comm_parse_extra) (param, symbolP, size);
1506   else
1507     {
1508       S_SET_VALUE (symbolP, (valueT) size);
1509       S_SET_EXTERNAL (symbolP);
1510       S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
1511     }
1512
1513   demand_empty_rest_of_line ();
1514  out:
1515   if (flag_mri)
1516     mri_comment_end (stop, stopc);
1517   return symbolP;
1518 }
1519
1520 void
1521 s_comm (int ignore)
1522 {
1523   s_comm_internal (ignore, NULL);
1524 }
1525
1526 /* The MRI COMMON pseudo-op.  We handle this by creating a common
1527    symbol with the appropriate name.  We make s_space do the right
1528    thing by increasing the size.  */
1529
1530 void
1531 s_mri_common (int small ATTRIBUTE_UNUSED)
1532 {
1533   char *name;
1534   char c;
1535   char *alc = NULL;
1536   symbolS *sym;
1537   offsetT align;
1538   char *stop = NULL;
1539   char stopc = 0;
1540
1541   if (!flag_mri)
1542     {
1543       s_comm (0);
1544       return;
1545     }
1546
1547   stop = mri_comment_field (&stopc);
1548
1549   SKIP_WHITESPACE ();
1550
1551   name = input_line_pointer;
1552   if (!ISDIGIT (*name))
1553     c = get_symbol_end ();
1554   else
1555     {
1556       do
1557         {
1558           ++input_line_pointer;
1559         }
1560       while (ISDIGIT (*input_line_pointer));
1561
1562       c = *input_line_pointer;
1563       *input_line_pointer = '\0';
1564
1565       if (line_label != NULL)
1566         {
1567           alc = (char *) xmalloc (strlen (S_GET_NAME (line_label))
1568                                   + (input_line_pointer - name)
1569                                   + 1);
1570           sprintf (alc, "%s%s", name, S_GET_NAME (line_label));
1571           name = alc;
1572         }
1573     }
1574
1575   sym = symbol_find_or_make (name);
1576   *input_line_pointer = c;
1577   if (alc != NULL)
1578     free (alc);
1579
1580   if (*input_line_pointer != ',')
1581     align = 0;
1582   else
1583     {
1584       ++input_line_pointer;
1585       align = get_absolute_expression ();
1586     }
1587
1588   if (S_IS_DEFINED (sym) && !S_IS_COMMON (sym))
1589     {
1590       as_bad (_("symbol `%s' is already defined"), S_GET_NAME (sym));
1591       ignore_rest_of_line ();
1592       mri_comment_end (stop, stopc);
1593       return;
1594     }
1595
1596   S_SET_EXTERNAL (sym);
1597   S_SET_SEGMENT (sym, bfd_com_section_ptr);
1598   mri_common_symbol = sym;
1599
1600 #ifdef S_SET_ALIGN
1601   if (align != 0)
1602     S_SET_ALIGN (sym, align);
1603 #else
1604   (void) align;
1605 #endif
1606
1607   if (line_label != NULL)
1608     {
1609       expressionS exp;
1610       exp.X_op = O_symbol;
1611       exp.X_add_symbol = sym;
1612       exp.X_add_number = 0;
1613       symbol_set_value_expression (line_label, &exp);
1614       symbol_set_frag (line_label, &zero_address_frag);
1615       S_SET_SEGMENT (line_label, expr_section);
1616     }
1617
1618   /* FIXME: We just ignore the small argument, which distinguishes
1619      COMMON and COMMON.S.  I don't know what we can do about it.  */
1620
1621   /* Ignore the type and hptype.  */
1622   if (*input_line_pointer == ',')
1623     input_line_pointer += 2;
1624   if (*input_line_pointer == ',')
1625     input_line_pointer += 2;
1626
1627   demand_empty_rest_of_line ();
1628
1629   mri_comment_end (stop, stopc);
1630 }
1631
1632 void
1633 s_data (int ignore ATTRIBUTE_UNUSED)
1634 {
1635   segT section;
1636   int temp;
1637
1638   temp = get_absolute_expression ();
1639   if (flag_readonly_data_in_text)
1640     {
1641       section = text_section;
1642       temp += 1000;
1643     }
1644   else
1645     section = data_section;
1646
1647   subseg_set (section, (subsegT) temp);
1648
1649   demand_empty_rest_of_line ();
1650 }
1651
1652 /* Handle the .appfile pseudo-op.  This is automatically generated by
1653    do_scrub_chars when a preprocessor # line comment is seen with a
1654    file name.  This default definition may be overridden by the object
1655    or CPU specific pseudo-ops.  This function is also the default
1656    definition for .file; the APPFILE argument is 1 for .appfile, 0 for
1657    .file.  */
1658
1659 void
1660 s_app_file_string (char *file, int appfile ATTRIBUTE_UNUSED)
1661 {
1662 #ifdef LISTING
1663   if (listing)
1664     listing_source_file (file);
1665 #endif
1666   register_dependency (file);
1667 #ifdef obj_app_file
1668   obj_app_file (file, appfile);
1669 #endif
1670 }
1671
1672 void
1673 s_app_file (int appfile)
1674 {
1675   char *s;
1676   int length;
1677
1678   /* Some assemblers tolerate immediately following '"'.  */
1679   if ((s = demand_copy_string (&length)) != 0)
1680     {
1681       int may_omit
1682         = (!new_logical_line_flags (s, -1, 1) && appfile);
1683
1684       /* In MRI mode, the preprocessor may have inserted an extraneous
1685          backquote.  */
1686       if (flag_m68k_mri
1687           && *input_line_pointer == '\''
1688           && is_end_of_line[(unsigned char) input_line_pointer[1]])
1689         ++input_line_pointer;
1690
1691       demand_empty_rest_of_line ();
1692       if (!may_omit)
1693         s_app_file_string (s, appfile);
1694     }
1695 }
1696
1697 static int
1698 get_linefile_number (int *flag)
1699 {
1700   SKIP_WHITESPACE ();
1701
1702   if (*input_line_pointer < '0' || *input_line_pointer > '9')
1703     return 0;
1704
1705   *flag = get_absolute_expression ();
1706
1707   return 1;
1708 }
1709
1710 /* Handle the .appline pseudo-op.  This is automatically generated by
1711    do_scrub_chars when a preprocessor # line comment is seen.  This
1712    default definition may be overridden by the object or CPU specific
1713    pseudo-ops.  */
1714
1715 void
1716 s_app_line (int appline)
1717 {
1718   char *file = NULL;
1719   int l;
1720
1721   /* The given number is that of the next line.  */
1722   if (appline)
1723     l = get_absolute_expression ();
1724   else if (!get_linefile_number (&l))
1725     {
1726       ignore_rest_of_line ();
1727       return;
1728     }
1729
1730   l--;
1731
1732   if (l < -1)
1733     /* Some of the back ends can't deal with non-positive line numbers.
1734        Besides, it's silly.  GCC however will generate a line number of
1735        zero when it is pre-processing builtins for assembler-with-cpp files:
1736
1737           # 0 "<built-in>"
1738
1739        We do not want to barf on this, especially since such files are used
1740        in the GCC and GDB testsuites.  So we check for negative line numbers
1741        rather than non-positive line numbers.  */
1742     as_warn (_("line numbers must be positive; line number %d rejected"),
1743              l + 1);
1744   else
1745     {
1746       int flags = 0;
1747       int length = 0;
1748
1749       if (!appline)
1750         {
1751           SKIP_WHITESPACE ();
1752
1753           if (*input_line_pointer == '"')
1754             file = demand_copy_string (&length);
1755
1756           if (file)
1757             {
1758               int this_flag;
1759
1760               while (get_linefile_number (&this_flag))
1761                 switch (this_flag)
1762                   {
1763                     /* From GCC's cpp documentation:
1764                        1: start of a new file.
1765                        2: returning to a file after having included
1766                           another file.
1767                        3: following text comes from a system header file.
1768                        4: following text should be treated as extern "C".
1769
1770                        4 is nonsensical for the assembler; 3, we don't
1771                        care about, so we ignore it just in case a
1772                        system header file is included while
1773                        preprocessing assembly.  So 1 and 2 are all we
1774                        care about, and they are mutually incompatible.
1775                        new_logical_line_flags() demands this.  */
1776                   case 1:
1777                   case 2:
1778                     if (flags && flags != (1 << this_flag))
1779                       as_warn (_("incompatible flag %i in line directive"),
1780                                this_flag);
1781                     else
1782                       flags |= 1 << this_flag;
1783                     break;
1784
1785                   case 3:
1786                   case 4:
1787                     /* We ignore these.  */
1788                     break;
1789
1790                   default:
1791                     as_warn (_("unsupported flag %i in line directive"),
1792                              this_flag);
1793                     break;
1794                   }
1795
1796               if (!is_end_of_line[(unsigned char)*input_line_pointer])
1797                 file = 0;
1798             }
1799         }
1800
1801       if (appline || file)
1802         {
1803           new_logical_line_flags (file, l, flags);
1804 #ifdef LISTING
1805           if (listing)
1806             listing_source_line (l);
1807 #endif
1808         }
1809     }
1810   if (appline || file)
1811     demand_empty_rest_of_line ();
1812   else
1813     ignore_rest_of_line ();
1814 }
1815
1816 /* Handle the .end pseudo-op.  Actually, the real work is done in
1817    read_a_source_file.  */
1818
1819 void
1820 s_end (int ignore ATTRIBUTE_UNUSED)
1821 {
1822   if (flag_mri)
1823     {
1824       /* The MRI assembler permits the start symbol to follow .end,
1825          but we don't support that.  */
1826       SKIP_WHITESPACE ();
1827       if (!is_end_of_line[(unsigned char) *input_line_pointer]
1828           && *input_line_pointer != '*'
1829           && *input_line_pointer != '!')
1830         as_warn (_("start address not supported"));
1831     }
1832 }
1833
1834 /* Handle the .err pseudo-op.  */
1835
1836 void
1837 s_err (int ignore ATTRIBUTE_UNUSED)
1838 {
1839   as_bad (_(".err encountered"));
1840   demand_empty_rest_of_line ();
1841 }
1842
1843 /* Handle the .error and .warning pseudo-ops.  */
1844
1845 void
1846 s_errwarn (int err)
1847 {
1848   int len;
1849   /* The purpose for the conditional assignment is not to
1850      internationalize the directive itself, but that we need a
1851      self-contained message, one that can be passed like the
1852      demand_copy_C_string return value, and with no assumption on the
1853      location of the name of the directive within the message.  */
1854   char *msg
1855     = (err ? _(".error directive invoked in source file")
1856        : _(".warning directive invoked in source file"));
1857
1858   if (!is_it_end_of_statement ())
1859     {
1860       if (*input_line_pointer != '\"')
1861         {
1862           as_bad (_("%s argument must be a string"),
1863                   err ? ".error" : ".warning");
1864           ignore_rest_of_line ();
1865           return;
1866         }
1867
1868       msg = demand_copy_C_string (&len);
1869       if (msg == NULL)
1870         return;
1871     }
1872
1873   if (err)
1874     as_bad ("%s", msg);
1875   else
1876     as_warn ("%s", msg);
1877   demand_empty_rest_of_line ();
1878 }
1879
1880 /* Handle the MRI fail pseudo-op.  */
1881
1882 void
1883 s_fail (int ignore ATTRIBUTE_UNUSED)
1884 {
1885   offsetT temp;
1886   char *stop = NULL;
1887   char stopc = 0;
1888
1889   if (flag_mri)
1890     stop = mri_comment_field (&stopc);
1891
1892   temp = get_absolute_expression ();
1893   if (temp >= 500)
1894     as_warn (_(".fail %ld encountered"), (long) temp);
1895   else
1896     as_bad (_(".fail %ld encountered"), (long) temp);
1897
1898   demand_empty_rest_of_line ();
1899
1900   if (flag_mri)
1901     mri_comment_end (stop, stopc);
1902 }
1903
1904 void
1905 s_fill (int ignore ATTRIBUTE_UNUSED)
1906 {
1907   expressionS rep_exp;
1908   long size = 1;
1909   long fill = 0;
1910   char *p;
1911
1912 #ifdef md_flush_pending_output
1913   md_flush_pending_output ();
1914 #endif
1915
1916 #ifdef md_cons_align
1917   md_cons_align (1);
1918 #endif
1919
1920   get_known_segmented_expression (&rep_exp);
1921   if (*input_line_pointer == ',')
1922     {
1923       input_line_pointer++;
1924       size = get_absolute_expression ();
1925       if (*input_line_pointer == ',')
1926         {
1927           input_line_pointer++;
1928           fill = get_absolute_expression ();
1929         }
1930     }
1931
1932   /* This is to be compatible with BSD 4.2 AS, not for any rational reason.  */
1933 #define BSD_FILL_SIZE_CROCK_8 (8)
1934   if (size > BSD_FILL_SIZE_CROCK_8)
1935     {
1936       as_warn (_(".fill size clamped to %d"), BSD_FILL_SIZE_CROCK_8);
1937       size = BSD_FILL_SIZE_CROCK_8;
1938     }
1939   if (size < 0)
1940     {
1941       as_warn (_("size negative; .fill ignored"));
1942       size = 0;
1943     }
1944   else if (rep_exp.X_op == O_constant && rep_exp.X_add_number <= 0)
1945     {
1946       if (rep_exp.X_add_number < 0)
1947         as_warn (_("repeat < 0; .fill ignored"));
1948       size = 0;
1949     }
1950
1951   if (size && !need_pass_2)
1952     {
1953       if (rep_exp.X_op == O_constant)
1954         {
1955           p = frag_var (rs_fill, (int) size, (int) size,
1956                         (relax_substateT) 0, (symbolS *) 0,
1957                         (offsetT) rep_exp.X_add_number,
1958                         (char *) 0);
1959         }
1960       else
1961         {
1962           /* We don't have a constant repeat count, so we can't use
1963              rs_fill.  We can get the same results out of rs_space,
1964              but its argument is in bytes, so we must multiply the
1965              repeat count by size.  */
1966
1967           symbolS *rep_sym;
1968           rep_sym = make_expr_symbol (&rep_exp);
1969           if (size != 1)
1970             {
1971               expressionS size_exp;
1972               size_exp.X_op = O_constant;
1973               size_exp.X_add_number = size;
1974
1975               rep_exp.X_op = O_multiply;
1976               rep_exp.X_add_symbol = rep_sym;
1977               rep_exp.X_op_symbol = make_expr_symbol (&size_exp);
1978               rep_exp.X_add_number = 0;
1979               rep_sym = make_expr_symbol (&rep_exp);
1980             }
1981
1982           p = frag_var (rs_space, (int) size, (int) size,
1983                         (relax_substateT) 0, rep_sym, (offsetT) 0, (char *) 0);
1984         }
1985
1986       memset (p, 0, (unsigned int) size);
1987
1988       /* The magic number BSD_FILL_SIZE_CROCK_4 is from BSD 4.2 VAX
1989          flavoured AS.  The following bizarre behaviour is to be
1990          compatible with above.  I guess they tried to take up to 8
1991          bytes from a 4-byte expression and they forgot to sign
1992          extend.  */
1993 #define BSD_FILL_SIZE_CROCK_4 (4)
1994       md_number_to_chars (p, (valueT) fill,
1995                           (size > BSD_FILL_SIZE_CROCK_4
1996                            ? BSD_FILL_SIZE_CROCK_4
1997                            : (int) size));
1998       /* Note: .fill (),0 emits no frag (since we are asked to .fill 0 bytes)
1999          but emits no error message because it seems a legal thing to do.
2000          It is a degenerate case of .fill but could be emitted by a
2001          compiler.  */
2002     }
2003   demand_empty_rest_of_line ();
2004 }
2005
2006 void
2007 s_globl (int ignore ATTRIBUTE_UNUSED)
2008 {
2009   char *name;
2010   int c;
2011   symbolS *symbolP;
2012   char *stop = NULL;
2013   char stopc = 0;
2014
2015   if (flag_mri)
2016     stop = mri_comment_field (&stopc);
2017
2018   do
2019     {
2020       name = input_line_pointer;
2021       c = get_symbol_end ();
2022       symbolP = symbol_find_or_make (name);
2023       S_SET_EXTERNAL (symbolP);
2024
2025       *input_line_pointer = c;
2026       SKIP_WHITESPACE ();
2027       c = *input_line_pointer;
2028       if (c == ',')
2029         {
2030           input_line_pointer++;
2031           SKIP_WHITESPACE ();
2032           if (is_end_of_line[(unsigned char) *input_line_pointer])
2033             c = '\n';
2034         }
2035     }
2036   while (c == ',');
2037
2038   demand_empty_rest_of_line ();
2039
2040   if (flag_mri)
2041     mri_comment_end (stop, stopc);
2042 }
2043
2044 #ifdef OBJ_ELF
2045 #define skip_whitespace(str)  do { if (*(str) == ' ') ++(str); } while (0)
2046
2047 static inline int
2048 skip_past_char (char ** str, char c)
2049 {
2050   if (**str == c)
2051     {
2052       (*str)++;
2053       return 0;
2054     }
2055   else
2056     return -1;
2057 }
2058 #define skip_past_comma(str) skip_past_char (str, ',')
2059
2060 /* Parse an attribute directive for VENDOR.
2061    Returns the attribute number read, or zero on error.  */
2062 int
2063 s_vendor_attribute (int vendor)
2064 {
2065   expressionS exp;
2066   int type;
2067   int tag;
2068   unsigned int i = 0;
2069   char *s = NULL;
2070
2071   /* Read the first number or name.  */
2072   skip_whitespace (input_line_pointer);
2073   s = input_line_pointer;
2074   if (ISDIGIT (*input_line_pointer))
2075     {
2076       expression (& exp);
2077       if (exp.X_op != O_constant)
2078         goto bad;
2079       tag = exp.X_add_number;
2080     }
2081   else
2082     {
2083       char *name;
2084
2085       /* A name may contain '_', but no other punctuation.  */
2086       for (; ISALNUM (*input_line_pointer) || *input_line_pointer == '_';
2087            ++input_line_pointer)
2088         i++;
2089       if (i == 0)
2090         goto bad;
2091
2092       name = (char *) alloca (i + 1);
2093       memcpy (name, s, i);
2094       name[i] = '\0';
2095
2096 #ifndef CONVERT_SYMBOLIC_ATTRIBUTE
2097 #define CONVERT_SYMBOLIC_ATTRIBUTE(a) -1
2098 #endif
2099
2100       tag = CONVERT_SYMBOLIC_ATTRIBUTE (name);
2101       if (tag == -1)
2102         {
2103           as_bad (_("Attribute name not recognised: %s"), name);
2104           ignore_rest_of_line ();
2105           return 0;
2106         }
2107     }
2108
2109   type = _bfd_elf_obj_attrs_arg_type (stdoutput, vendor, tag);
2110
2111   if (skip_past_comma (&input_line_pointer) == -1)
2112     goto bad;
2113   if (type & 1)
2114     {
2115       expression (& exp);
2116       if (exp.X_op != O_constant)
2117         {
2118           as_bad (_("expected numeric constant"));
2119           ignore_rest_of_line ();
2120           return 0;
2121         }
2122       i = exp.X_add_number;
2123     }
2124   if ((type & 3) == 3
2125       && skip_past_comma (&input_line_pointer) == -1)
2126     {
2127       as_bad (_("expected comma"));
2128       ignore_rest_of_line ();
2129       return 0;
2130     }
2131   if (type & 2)
2132     {
2133       int len;
2134
2135       skip_whitespace (input_line_pointer);
2136       if (*input_line_pointer != '"')
2137         goto bad_string;
2138       s = demand_copy_C_string (&len);
2139     }
2140
2141   switch (type & 3)
2142     {
2143     case 3:
2144       bfd_elf_add_obj_attr_int_string (stdoutput, vendor, tag, i, s);
2145       break;
2146     case 2:
2147       bfd_elf_add_obj_attr_string (stdoutput, vendor, tag, s);
2148       break;
2149     case 1:
2150       bfd_elf_add_obj_attr_int (stdoutput, vendor, tag, i);
2151       break;
2152     default:
2153       abort ();
2154     }
2155
2156   demand_empty_rest_of_line ();
2157   return tag;
2158 bad_string:
2159   as_bad (_("bad string constant"));
2160   ignore_rest_of_line ();
2161   return 0;
2162 bad:
2163   as_bad (_("expected <tag> , <value>"));
2164   ignore_rest_of_line ();
2165   return 0;
2166 }
2167
2168 /* Parse a .gnu_attribute directive.  */
2169
2170 static void
2171 s_gnu_attribute (int ignored ATTRIBUTE_UNUSED)
2172 {
2173   s_vendor_attribute (OBJ_ATTR_GNU);
2174 }
2175 #endif /* OBJ_ELF */
2176
2177 /* Handle the MRI IRP and IRPC pseudo-ops.  */
2178
2179 void
2180 s_irp (int irpc)
2181 {
2182   char *file, *eol;
2183   unsigned int line;
2184   sb s;
2185   const char *err;
2186   sb out;
2187
2188   as_where (&file, &line);
2189
2190   sb_new (&s);
2191   eol = find_end_of_line (input_line_pointer, 0);
2192   sb_add_buffer (&s, input_line_pointer, eol - input_line_pointer);
2193   input_line_pointer = eol;
2194
2195   sb_new (&out);
2196
2197   err = expand_irp (irpc, 0, &s, &out, get_non_macro_line_sb);
2198   if (err != NULL)
2199     as_bad_where (file, line, "%s", err);
2200
2201   sb_kill (&s);
2202
2203   input_scrub_include_sb (&out, input_line_pointer, 1);
2204   sb_kill (&out);
2205   buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2206 }
2207
2208 /* Handle the .linkonce pseudo-op.  This tells the assembler to mark
2209    the section to only be linked once.  However, this is not supported
2210    by most object file formats.  This takes an optional argument,
2211    which is what to do about duplicates.  */
2212
2213 void
2214 s_linkonce (int ignore ATTRIBUTE_UNUSED)
2215 {
2216   enum linkonce_type type;
2217
2218   SKIP_WHITESPACE ();
2219
2220   type = LINKONCE_DISCARD;
2221
2222   if (!is_end_of_line[(unsigned char) *input_line_pointer])
2223     {
2224       char *s;
2225       char c;
2226
2227       s = input_line_pointer;
2228       c = get_symbol_end ();
2229       if (strcasecmp (s, "discard") == 0)
2230         type = LINKONCE_DISCARD;
2231       else if (strcasecmp (s, "one_only") == 0)
2232         type = LINKONCE_ONE_ONLY;
2233       else if (strcasecmp (s, "same_size") == 0)
2234         type = LINKONCE_SAME_SIZE;
2235       else if (strcasecmp (s, "same_contents") == 0)
2236         type = LINKONCE_SAME_CONTENTS;
2237       else
2238         as_warn (_("unrecognized .linkonce type `%s'"), s);
2239
2240       *input_line_pointer = c;
2241     }
2242
2243 #ifdef obj_handle_link_once
2244   obj_handle_link_once (type);
2245 #else /* ! defined (obj_handle_link_once) */
2246   {
2247     flagword flags;
2248
2249     if ((bfd_applicable_section_flags (stdoutput) & SEC_LINK_ONCE) == 0)
2250       as_warn (_(".linkonce is not supported for this object file format"));
2251
2252     flags = bfd_get_section_flags (stdoutput, now_seg);
2253     flags |= SEC_LINK_ONCE;
2254     switch (type)
2255       {
2256       default:
2257         abort ();
2258       case LINKONCE_DISCARD:
2259         flags |= SEC_LINK_DUPLICATES_DISCARD;
2260         break;
2261       case LINKONCE_ONE_ONLY:
2262         flags |= SEC_LINK_DUPLICATES_ONE_ONLY;
2263         break;
2264       case LINKONCE_SAME_SIZE:
2265         flags |= SEC_LINK_DUPLICATES_SAME_SIZE;
2266         break;
2267       case LINKONCE_SAME_CONTENTS:
2268         flags |= SEC_LINK_DUPLICATES_SAME_CONTENTS;
2269         break;
2270       }
2271     if (!bfd_set_section_flags (stdoutput, now_seg, flags))
2272       as_bad (_("bfd_set_section_flags: %s"),
2273               bfd_errmsg (bfd_get_error ()));
2274   }
2275 #endif /* ! defined (obj_handle_link_once) */
2276
2277   demand_empty_rest_of_line ();
2278 }
2279
2280 void
2281 bss_alloc (symbolS *symbolP, addressT size, int align)
2282 {
2283   char *pfrag;
2284   segT current_seg = now_seg;
2285   subsegT current_subseg = now_subseg;
2286   segT bss_seg = bss_section;
2287
2288 #if defined (TC_MIPS) || defined (TC_ALPHA)
2289   if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour
2290       || OUTPUT_FLAVOR == bfd_target_elf_flavour)
2291     {
2292       /* For MIPS and Alpha ECOFF or ELF, small objects are put in .sbss.  */
2293       if (size <= bfd_get_gp_size (stdoutput))
2294         {
2295           bss_seg = subseg_new (".sbss", 1);
2296           seg_info (bss_seg)->bss = 1;
2297           if (!bfd_set_section_flags (stdoutput, bss_seg, SEC_ALLOC))
2298             as_warn (_("error setting flags for \".sbss\": %s"),
2299                      bfd_errmsg (bfd_get_error ()));
2300         }
2301     }
2302 #endif
2303   subseg_set (bss_seg, 1);
2304
2305   if (align)
2306     {
2307       record_alignment (bss_seg, align);
2308       frag_align (align, 0, 0);
2309     }
2310
2311   /* Detach from old frag.  */
2312   if (S_GET_SEGMENT (symbolP) == bss_seg)
2313     symbol_get_frag (symbolP)->fr_symbol = NULL;
2314
2315   symbol_set_frag (symbolP, frag_now);
2316   pfrag = frag_var (rs_org, 1, 1, 0, symbolP, size, NULL);
2317   *pfrag = 0;
2318
2319 #ifdef S_SET_SIZE
2320   S_SET_SIZE (symbolP, size);
2321 #endif
2322   S_SET_SEGMENT (symbolP, bss_seg);
2323
2324 #ifdef OBJ_COFF
2325   /* The symbol may already have been created with a preceding
2326      ".globl" directive -- be careful not to step on storage class
2327      in that case.  Otherwise, set it to static.  */
2328   if (S_GET_STORAGE_CLASS (symbolP) != C_EXT)
2329     S_SET_STORAGE_CLASS (symbolP, C_STAT);
2330 #endif /* OBJ_COFF */
2331
2332   subseg_set (current_seg, current_subseg);
2333 }
2334
2335 offsetT
2336 parse_align (int align_bytes)
2337 {
2338   expressionS exp;
2339   addressT align;
2340
2341   SKIP_WHITESPACE ();
2342   if (*input_line_pointer != ',')
2343     {
2344     no_align:
2345       as_bad (_("expected alignment after size"));
2346       ignore_rest_of_line ();
2347       return -1;
2348     }
2349
2350   input_line_pointer++;
2351   SKIP_WHITESPACE ();
2352
2353   align = get_absolute_expr (&exp);
2354   if (exp.X_op == O_absent)
2355     goto no_align;
2356
2357   if (!exp.X_unsigned)
2358     {
2359       as_warn (_("alignment negative; 0 assumed"));
2360       align = 0;
2361     }
2362
2363   if (align_bytes && align != 0)
2364     {
2365       /* convert to a power of 2 alignment */
2366       unsigned int alignp2 = 0;
2367       while ((align & 1) == 0)
2368         align >>= 1, ++alignp2;
2369       if (align != 1)
2370         {
2371           as_bad (_("alignment not a power of 2"));
2372           ignore_rest_of_line ();
2373           return -1;
2374         }
2375       align = alignp2;
2376     }
2377   return align;
2378 }
2379
2380 /* Called from s_comm_internal after symbol name and size have been
2381    parsed.  NEEDS_ALIGN is 0 if it was an ".lcomm" (2 args only),
2382    1 if this was a ".bss" directive which has a 3rd argument
2383    (alignment as a power of 2), or 2 if this was a ".bss" directive
2384    with alignment in bytes.  */
2385
2386 symbolS *
2387 s_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
2388 {
2389   addressT align = 0;
2390
2391   if (needs_align)
2392     {
2393       align = parse_align (needs_align - 1);
2394       if (align == (addressT) -1)
2395         return NULL;
2396     }
2397   else
2398     /* Assume some objects may require alignment on some systems.  */
2399     TC_IMPLICIT_LCOMM_ALIGNMENT (size, align);
2400
2401   bss_alloc (symbolP, size, align);
2402   return symbolP;
2403 }
2404
2405 void
2406 s_lcomm (int needs_align)
2407 {
2408   s_comm_internal (needs_align, s_lcomm_internal);
2409 }
2410
2411 void
2412 s_lcomm_bytes (int needs_align)
2413 {
2414   s_comm_internal (needs_align * 2, s_lcomm_internal);
2415 }
2416
2417 void
2418 s_lsym (int ignore ATTRIBUTE_UNUSED)
2419 {
2420   char *name;
2421   char c;
2422   char *p;
2423   expressionS exp;
2424   symbolS *symbolP;
2425
2426   /* We permit ANY defined expression: BSD4.2 demands constants.  */
2427   name = input_line_pointer;
2428   c = get_symbol_end ();
2429   p = input_line_pointer;
2430   *p = c;
2431
2432   if (name == p)
2433     {
2434       as_bad (_("expected symbol name"));
2435       ignore_rest_of_line ();
2436       return;
2437     }
2438
2439   SKIP_WHITESPACE ();
2440
2441   if (*input_line_pointer != ',')
2442     {
2443       *p = 0;
2444       as_bad (_("expected comma after \"%s\""), name);
2445       *p = c;
2446       ignore_rest_of_line ();
2447       return;
2448     }
2449
2450   input_line_pointer++;
2451   expression_and_evaluate (&exp);
2452
2453   if (exp.X_op != O_constant
2454       && exp.X_op != O_register)
2455     {
2456       as_bad (_("bad expression"));
2457       ignore_rest_of_line ();
2458       return;
2459     }
2460
2461   *p = 0;
2462   symbolP = symbol_find_or_make (name);
2463
2464   if (S_GET_SEGMENT (symbolP) == undefined_section)
2465     {
2466       /* The name might be an undefined .global symbol; be sure to
2467          keep the "external" bit.  */
2468       S_SET_SEGMENT (symbolP,
2469                      (exp.X_op == O_constant
2470                       ? absolute_section
2471                       : reg_section));
2472       S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
2473     }
2474   else
2475     {
2476       as_bad (_("symbol `%s' is already defined"), name);
2477     }
2478
2479   *p = c;
2480   demand_empty_rest_of_line ();
2481 }
2482
2483 /* Read a line into an sb.  Returns the character that ended the line
2484    or zero if there are no more lines.  */
2485
2486 static int
2487 get_line_sb (sb *line, int in_macro)
2488 {
2489   char *eol;
2490
2491   if (input_line_pointer[-1] == '\n')
2492     bump_line_counters ();
2493
2494   if (input_line_pointer >= buffer_limit)
2495     {
2496       buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2497       if (buffer_limit == 0)
2498         return 0;
2499     }
2500
2501   eol = _find_end_of_line (input_line_pointer, flag_m68k_mri, 0, in_macro);
2502   sb_add_buffer (line, input_line_pointer, eol - input_line_pointer);
2503   input_line_pointer = eol;
2504
2505   /* Don't skip multiple end-of-line characters, because that breaks support
2506      for the IA-64 stop bit (;;) which looks like two consecutive end-of-line
2507      characters but isn't.  Instead just skip one end of line character and
2508      return the character skipped so that the caller can re-insert it if
2509      necessary.   */
2510   return *input_line_pointer++;
2511 }
2512
2513 static int
2514 get_non_macro_line_sb (sb *line)
2515 {
2516   return get_line_sb (line, 0);
2517 }
2518
2519 static int
2520 get_macro_line_sb (sb *line)
2521 {
2522   return get_line_sb (line, 1);
2523 }
2524
2525 /* Define a macro.  This is an interface to macro.c.  */
2526
2527 void
2528 s_macro (int ignore ATTRIBUTE_UNUSED)
2529 {
2530   char *file, *eol;
2531   unsigned int line;
2532   sb s;
2533   const char *err;
2534   const char *name;
2535
2536   as_where (&file, &line);
2537
2538   sb_new (&s);
2539   eol = find_end_of_line (input_line_pointer, 0);
2540   sb_add_buffer (&s, input_line_pointer, eol - input_line_pointer);
2541   input_line_pointer = eol;
2542
2543   if (line_label != NULL)
2544     {
2545       sb label;
2546
2547       sb_new (&label);
2548       sb_add_string (&label, S_GET_NAME (line_label));
2549       err = define_macro (0, &s, &label, get_macro_line_sb, file, line, &name);
2550       sb_kill (&label);
2551     }
2552   else
2553     err = define_macro (0, &s, NULL, get_macro_line_sb, file, line, &name);
2554   if (err != NULL)
2555     as_bad_where (file, line, err, name);
2556   else
2557     {
2558       if (line_label != NULL)
2559         {
2560           S_SET_SEGMENT (line_label, absolute_section);
2561           S_SET_VALUE (line_label, 0);
2562           symbol_set_frag (line_label, &zero_address_frag);
2563         }
2564
2565       if (((NO_PSEUDO_DOT || flag_m68k_mri)
2566            && hash_find (po_hash, name) != NULL)
2567           || (!flag_m68k_mri
2568               && *name == '.'
2569               && hash_find (po_hash, name + 1) != NULL))
2570         as_warn_where (file,
2571                  line,
2572                  _("attempt to redefine pseudo-op `%s' ignored"),
2573                  name);
2574     }
2575
2576   sb_kill (&s);
2577 }
2578
2579 /* Handle the .mexit pseudo-op, which immediately exits a macro
2580    expansion.  */
2581
2582 void
2583 s_mexit (int ignore ATTRIBUTE_UNUSED)
2584 {
2585   if (macro_nest)
2586     {
2587       cond_exit_macro (macro_nest);
2588       buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2589     }
2590   else
2591     as_warn (_("ignoring macro exit outside a macro definition."));
2592 }
2593
2594 /* Switch in and out of MRI mode.  */
2595
2596 void
2597 s_mri (int ignore ATTRIBUTE_UNUSED)
2598 {
2599   int on;
2600 #ifdef MRI_MODE_CHANGE
2601   int old_flag;
2602 #endif
2603
2604   on = get_absolute_expression ();
2605 #ifdef MRI_MODE_CHANGE
2606   old_flag = flag_mri;
2607 #endif
2608   if (on != 0)
2609     {
2610       flag_mri = 1;
2611 #ifdef TC_M68K
2612       flag_m68k_mri = 1;
2613 #endif
2614       macro_mri_mode (1);
2615     }
2616   else
2617     {
2618       flag_mri = 0;
2619 #ifdef TC_M68K
2620       flag_m68k_mri = 0;
2621 #endif
2622       macro_mri_mode (0);
2623     }
2624
2625   /* Operator precedence changes in m68k MRI mode, so we need to
2626      update the operator rankings.  */
2627   expr_set_precedence ();
2628
2629 #ifdef MRI_MODE_CHANGE
2630   if (on != old_flag)
2631     MRI_MODE_CHANGE (on);
2632 #endif
2633
2634   demand_empty_rest_of_line ();
2635 }
2636
2637 /* Handle changing the location counter.  */
2638
2639 static void
2640 do_org (segT segment, expressionS *exp, int fill)
2641 {
2642   if (segment != now_seg
2643       && segment != absolute_section
2644       && segment != expr_section)
2645     as_bad (_("invalid segment \"%s\""), segment_name (segment));
2646
2647   if (now_seg == absolute_section)
2648     {
2649       if (fill != 0)
2650         as_warn (_("ignoring fill value in absolute section"));
2651       if (exp->X_op != O_constant)
2652         {
2653           as_bad (_("only constant offsets supported in absolute section"));
2654           exp->X_add_number = 0;
2655         }
2656       abs_section_offset = exp->X_add_number;
2657     }
2658   else
2659     {
2660       char *p;
2661       symbolS *sym = exp->X_add_symbol;
2662       offsetT off = exp->X_add_number * OCTETS_PER_BYTE;
2663
2664       if (exp->X_op != O_constant && exp->X_op != O_symbol)
2665         {
2666           /* Handle complex expressions.  */
2667           sym = make_expr_symbol (exp);
2668           off = 0;
2669         }
2670
2671       p = frag_var (rs_org, 1, 1, (relax_substateT) 0, sym, off, (char *) 0);
2672       *p = fill;
2673     }
2674 }
2675
2676 void
2677 s_org (int ignore ATTRIBUTE_UNUSED)
2678 {
2679   segT segment;
2680   expressionS exp;
2681   long temp_fill;
2682
2683 #ifdef md_flush_pending_output
2684   md_flush_pending_output ();
2685 #endif
2686
2687   /* The m68k MRI assembler has a different meaning for .org.  It
2688      means to create an absolute section at a given address.  We can't
2689      support that--use a linker script instead.  */
2690   if (flag_m68k_mri)
2691     {
2692       as_bad (_("MRI style ORG pseudo-op not supported"));
2693       ignore_rest_of_line ();
2694       return;
2695     }
2696
2697   /* Don't believe the documentation of BSD 4.2 AS.  There is no such
2698      thing as a sub-segment-relative origin.  Any absolute origin is
2699      given a warning, then assumed to be segment-relative.  Any
2700      segmented origin expression ("foo+42") had better be in the right
2701      segment or the .org is ignored.
2702
2703      BSD 4.2 AS warns if you try to .org backwards. We cannot because
2704      we never know sub-segment sizes when we are reading code.  BSD
2705      will crash trying to emit negative numbers of filler bytes in
2706      certain .orgs. We don't crash, but see as-write for that code.
2707
2708      Don't make frag if need_pass_2==1.  */
2709   segment = get_known_segmented_expression (&exp);
2710   if (*input_line_pointer == ',')
2711     {
2712       input_line_pointer++;
2713       temp_fill = get_absolute_expression ();
2714     }
2715   else
2716     temp_fill = 0;
2717
2718   if (!need_pass_2)
2719     do_org (segment, &exp, temp_fill);
2720
2721   demand_empty_rest_of_line ();
2722 }
2723
2724 /* Handle parsing for the MRI SECT/SECTION pseudo-op.  This should be
2725    called by the obj-format routine which handles section changing
2726    when in MRI mode.  It will create a new section, and return it.  It
2727    will set *TYPE to the section type: one of 'C' (code), 'D' (data),
2728    'M' (mixed), or 'R' (romable).  The flags will be set in the section.  */
2729
2730 void
2731 s_mri_sect (char *type ATTRIBUTE_UNUSED)
2732 {
2733 #ifdef TC_M68K
2734
2735   char *name;
2736   char c;
2737   segT seg;
2738
2739   SKIP_WHITESPACE ();
2740
2741   name = input_line_pointer;
2742   if (!ISDIGIT (*name))
2743     c = get_symbol_end ();
2744   else
2745     {
2746       do
2747         {
2748           ++input_line_pointer;
2749         }
2750       while (ISDIGIT (*input_line_pointer));
2751
2752       c = *input_line_pointer;
2753       *input_line_pointer = '\0';
2754     }
2755
2756   name = xstrdup (name);
2757
2758   *input_line_pointer = c;
2759
2760   seg = subseg_new (name, 0);
2761
2762   if (*input_line_pointer == ',')
2763     {
2764       int align;
2765
2766       ++input_line_pointer;
2767       align = get_absolute_expression ();
2768       record_alignment (seg, align);
2769     }
2770
2771   *type = 'C';
2772   if (*input_line_pointer == ',')
2773     {
2774       c = *++input_line_pointer;
2775       c = TOUPPER (c);
2776       if (c == 'C' || c == 'D' || c == 'M' || c == 'R')
2777         *type = c;
2778       else
2779         as_bad (_("unrecognized section type"));
2780       ++input_line_pointer;
2781
2782       {
2783         flagword flags;
2784
2785         flags = SEC_NO_FLAGS;
2786         if (*type == 'C')
2787           flags = SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE;
2788         else if (*type == 'D' || *type == 'M')
2789           flags = SEC_ALLOC | SEC_LOAD | SEC_DATA;
2790         else if (*type == 'R')
2791           flags = SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_READONLY | SEC_ROM;
2792         if (flags != SEC_NO_FLAGS)
2793           {
2794             if (!bfd_set_section_flags (stdoutput, seg, flags))
2795               as_warn (_("error setting flags for \"%s\": %s"),
2796                        bfd_section_name (stdoutput, seg),
2797                        bfd_errmsg (bfd_get_error ()));
2798           }
2799       }
2800     }
2801
2802   /* Ignore the HP type.  */
2803   if (*input_line_pointer == ',')
2804     input_line_pointer += 2;
2805
2806   demand_empty_rest_of_line ();
2807
2808 #else /* ! TC_M68K */
2809 #ifdef TC_I960
2810
2811   char *name;
2812   char c;
2813   segT seg;
2814
2815   SKIP_WHITESPACE ();
2816
2817   name = input_line_pointer;
2818   c = get_symbol_end ();
2819
2820   name = xstrdup (name);
2821
2822   *input_line_pointer = c;
2823
2824   seg = subseg_new (name, 0);
2825
2826   if (*input_line_pointer != ',')
2827     *type = 'C';
2828   else
2829     {
2830       char *sectype;
2831
2832       ++input_line_pointer;
2833       SKIP_WHITESPACE ();
2834       sectype = input_line_pointer;
2835       c = get_symbol_end ();
2836       if (*sectype == '\0')
2837         *type = 'C';
2838       else if (strcasecmp (sectype, "text") == 0)
2839         *type = 'C';
2840       else if (strcasecmp (sectype, "data") == 0)
2841         *type = 'D';
2842       else if (strcasecmp (sectype, "romdata") == 0)
2843         *type = 'R';
2844       else
2845         as_warn (_("unrecognized section type `%s'"), sectype);
2846       *input_line_pointer = c;
2847     }
2848
2849   if (*input_line_pointer == ',')
2850     {
2851       char *seccmd;
2852
2853       ++input_line_pointer;
2854       SKIP_WHITESPACE ();
2855       seccmd = input_line_pointer;
2856       c = get_symbol_end ();
2857       if (strcasecmp (seccmd, "absolute") == 0)
2858         {
2859           as_bad (_("absolute sections are not supported"));
2860           *input_line_pointer = c;
2861           ignore_rest_of_line ();
2862           return;
2863         }
2864       else if (strcasecmp (seccmd, "align") == 0)
2865         {
2866           int align;
2867
2868           *input_line_pointer = c;
2869           align = get_absolute_expression ();
2870           record_alignment (seg, align);
2871         }
2872       else
2873         {
2874           as_warn (_("unrecognized section command `%s'"), seccmd);
2875           *input_line_pointer = c;
2876         }
2877     }
2878
2879   demand_empty_rest_of_line ();
2880
2881 #else /* ! TC_I960 */
2882   /* The MRI assembler seems to use different forms of .sect for
2883      different targets.  */
2884   as_bad ("MRI mode not supported for this target");
2885   ignore_rest_of_line ();
2886 #endif /* ! TC_I960 */
2887 #endif /* ! TC_M68K */
2888 }
2889
2890 /* Handle the .print pseudo-op.  */
2891
2892 void
2893 s_print (int ignore ATTRIBUTE_UNUSED)
2894 {
2895   char *s;
2896   int len;
2897
2898   s = demand_copy_C_string (&len);
2899   if (s != NULL)
2900     printf ("%s\n", s);
2901   demand_empty_rest_of_line ();
2902 }
2903
2904 /* Handle the .purgem pseudo-op.  */
2905
2906 void
2907 s_purgem (int ignore ATTRIBUTE_UNUSED)
2908 {
2909   if (is_it_end_of_statement ())
2910     {
2911       demand_empty_rest_of_line ();
2912       return;
2913     }
2914
2915   do
2916     {
2917       char *name;
2918       char c;
2919
2920       SKIP_WHITESPACE ();
2921       name = input_line_pointer;
2922       c = get_symbol_end ();
2923       delete_macro (name);
2924       *input_line_pointer = c;
2925       SKIP_WHITESPACE ();
2926     }
2927   while (*input_line_pointer++ == ',');
2928
2929   --input_line_pointer;
2930   demand_empty_rest_of_line ();
2931 }
2932
2933 /* Handle the .endm/.endr pseudo-ops.  */
2934
2935 static void
2936 s_bad_end (int endr)
2937 {
2938   as_warn (_(".end%c encountered without preceding %s"),
2939            endr ? 'r' : 'm',
2940            endr ? ".rept, .irp, or .irpc" : ".macro");
2941   demand_empty_rest_of_line ();
2942 }
2943
2944 /* Handle the .rept pseudo-op.  */
2945
2946 void
2947 s_rept (int ignore ATTRIBUTE_UNUSED)
2948 {
2949   int count;
2950
2951   count = get_absolute_expression ();
2952
2953   do_repeat (count, "REPT", "ENDR");
2954 }
2955
2956 /* This function provides a generic repeat block implementation.   It allows
2957    different directives to be used as the start/end keys.  */
2958
2959 void
2960 do_repeat (int count, const char *start, const char *end)
2961 {
2962   sb one;
2963   sb many;
2964
2965   sb_new (&one);
2966   if (!buffer_and_nest (start, end, &one, get_non_macro_line_sb))
2967     {
2968       as_bad (_("%s without %s"), start, end);
2969       return;
2970     }
2971
2972   sb_new (&many);
2973   while (count-- > 0)
2974     sb_add_sb (&many, &one);
2975
2976   sb_kill (&one);
2977
2978   input_scrub_include_sb (&many, input_line_pointer, 1);
2979   sb_kill (&many);
2980   buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2981 }
2982
2983 /* Like do_repeat except that any text matching EXPANDER in the
2984    block is replaced by the itteration count.  */
2985
2986 void
2987 do_repeat_with_expander (int count,
2988                          const char * start,
2989                          const char * end,
2990                          const char * expander)
2991 {
2992   sb one;
2993   sb many;
2994
2995   sb_new (&one);
2996   if (!buffer_and_nest (start, end, &one, get_non_macro_line_sb))
2997     {
2998       as_bad (_("%s without %s"), start, end);
2999       return;
3000     }
3001
3002   sb_new (&many);
3003
3004   if (expander != NULL && strstr (one.ptr, expander) != NULL)
3005     {
3006       while (count -- > 0)
3007         {
3008           int len;
3009           char * sub;
3010           sb processed;
3011
3012           sb_new (& processed);
3013           sb_add_sb (& processed, & one);
3014           sub = strstr (processed.ptr, expander);
3015           len = sprintf (sub, "%d", count);
3016           gas_assert (len < 8);
3017           strcpy (sub + len, sub + 8);
3018           processed.len -= (8 - len);
3019           sb_add_sb (& many, & processed);
3020           sb_kill (& processed);
3021         }
3022     }
3023   else
3024     while (count-- > 0)
3025       sb_add_sb (&many, &one);
3026
3027   sb_kill (&one);
3028
3029   input_scrub_include_sb (&many, input_line_pointer, 1);
3030   sb_kill (&many);
3031   buffer_limit = input_scrub_next_buffer (&input_line_pointer);
3032 }
3033
3034 /* Skip to end of current repeat loop; EXTRA indicates how many additional
3035    input buffers to skip.  Assumes that conditionals preceding the loop end
3036    are properly nested.
3037
3038    This function makes it easier to implement a premature "break" out of the
3039    loop.  The EXTRA arg accounts for other buffers we might have inserted,
3040    such as line substitutions.  */
3041
3042 void
3043 end_repeat (int extra)
3044 {
3045   cond_exit_macro (macro_nest);
3046   while (extra-- >= 0)
3047     buffer_limit = input_scrub_next_buffer (&input_line_pointer);
3048 }
3049
3050 static void
3051 assign_symbol (char *name, int mode)
3052 {
3053   symbolS *symbolP;
3054
3055   if (name[0] == '.' && name[1] == '\0')
3056     {
3057       /* Turn '. = mumble' into a .org mumble.  */
3058       segT segment;
3059       expressionS exp;
3060
3061       segment = get_known_segmented_expression (&exp);
3062
3063       if (!need_pass_2)
3064         do_org (segment, &exp, 0);
3065
3066       return;
3067     }
3068
3069   if ((symbolP = symbol_find (name)) == NULL
3070       && (symbolP = md_undefined_symbol (name)) == NULL)
3071     {
3072       symbolP = symbol_find_or_make (name);
3073 #ifndef NO_LISTING
3074       /* When doing symbol listings, play games with dummy fragments living
3075          outside the normal fragment chain to record the file and line info
3076          for this symbol.  */
3077       if (listing & LISTING_SYMBOLS)
3078         {
3079           extern struct list_info_struct *listing_tail;
3080           fragS *dummy_frag = (fragS *) xcalloc (1, sizeof (fragS));
3081           dummy_frag->line = listing_tail;
3082           dummy_frag->fr_symbol = symbolP;
3083           symbol_set_frag (symbolP, dummy_frag);
3084         }
3085 #endif
3086 #ifdef OBJ_COFF
3087       /* "set" symbols are local unless otherwise specified.  */
3088       SF_SET_LOCAL (symbolP);
3089 #endif
3090     }
3091
3092   if (S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
3093     {
3094       if ((mode != 0 || !S_IS_VOLATILE (symbolP))
3095           && !S_CAN_BE_REDEFINED (symbolP))
3096         {
3097           as_bad (_("symbol `%s' is already defined"), name);
3098           symbolP = symbol_clone (symbolP, 0);
3099         }
3100       /* If the symbol is volatile, copy the symbol and replace the
3101          original with the copy, so that previous uses of the symbol will
3102          retain the value of the symbol at the point of use.  */
3103       else if (S_IS_VOLATILE (symbolP))
3104         symbolP = symbol_clone (symbolP, 1);
3105     }
3106
3107   if (mode == 0)
3108     S_SET_VOLATILE (symbolP);
3109   else if (mode < 0)
3110     S_SET_FORWARD_REF (symbolP);
3111
3112   pseudo_set (symbolP);
3113 }
3114
3115 /* Handle the .equ, .equiv, .eqv, and .set directives.  If EQUIV is 1,
3116    then this is .equiv, and it is an error if the symbol is already
3117    defined.  If EQUIV is -1, the symbol additionally is a forward
3118    reference.  */
3119
3120 void
3121 s_set (int equiv)
3122 {
3123   char *name;
3124   char delim;
3125   char *end_name;
3126
3127   /* Especial apologies for the random logic:
3128      this just grew, and could be parsed much more simply!
3129      Dean in haste.  */
3130   name = input_line_pointer;
3131   delim = get_symbol_end ();
3132   end_name = input_line_pointer;
3133   *end_name = delim;
3134
3135   if (name == end_name)
3136     {
3137       as_bad (_("expected symbol name"));
3138       ignore_rest_of_line ();
3139       return;
3140     }
3141
3142   SKIP_WHITESPACE ();
3143
3144   if (*input_line_pointer != ',')
3145     {
3146       *end_name = 0;
3147       as_bad (_("expected comma after \"%s\""), name);
3148       *end_name = delim;
3149       ignore_rest_of_line ();
3150       return;
3151     }
3152
3153   input_line_pointer++;
3154   *end_name = 0;
3155
3156   assign_symbol (name, equiv);
3157   *end_name = delim;
3158
3159   demand_empty_rest_of_line ();
3160 }
3161
3162 void
3163 s_space (int mult)
3164 {
3165   expressionS exp;
3166   expressionS val;
3167   char *p = 0;
3168   char *stop = NULL;
3169   char stopc = 0;
3170   int bytes;
3171
3172 #ifdef md_flush_pending_output
3173   md_flush_pending_output ();
3174 #endif
3175
3176 #ifdef md_cons_align
3177   md_cons_align (1);
3178 #endif
3179
3180   if (flag_mri)
3181     stop = mri_comment_field (&stopc);
3182
3183   /* In m68k MRI mode, we need to align to a word boundary, unless
3184      this is ds.b.  */
3185   if (flag_m68k_mri && mult > 1)
3186     {
3187       if (now_seg == absolute_section)
3188         {
3189           abs_section_offset += abs_section_offset & 1;
3190           if (line_label != NULL)
3191             S_SET_VALUE (line_label, abs_section_offset);
3192         }
3193       else if (mri_common_symbol != NULL)
3194         {
3195           valueT mri_val;
3196
3197           mri_val = S_GET_VALUE (mri_common_symbol);
3198           if ((mri_val & 1) != 0)
3199             {
3200               S_SET_VALUE (mri_common_symbol, mri_val + 1);
3201               if (line_label != NULL)
3202                 {
3203                   expressionS *symexp;
3204
3205                   symexp = symbol_get_value_expression (line_label);
3206                   know (symexp->X_op == O_symbol);
3207                   know (symexp->X_add_symbol == mri_common_symbol);
3208                   symexp->X_add_number += 1;
3209                 }
3210             }
3211         }
3212       else
3213         {
3214           do_align (1, (char *) NULL, 0, 0);
3215           if (line_label != NULL)
3216             {
3217               symbol_set_frag (line_label, frag_now);
3218               S_SET_VALUE (line_label, frag_now_fix ());
3219             }
3220         }
3221     }
3222
3223   bytes = mult;
3224
3225   expression (&exp);
3226
3227   SKIP_WHITESPACE ();
3228   if (*input_line_pointer == ',')
3229     {
3230       ++input_line_pointer;
3231       expression (&val);
3232     }
3233   else
3234     {
3235       val.X_op = O_constant;
3236       val.X_add_number = 0;
3237     }
3238
3239   if (val.X_op != O_constant
3240       || val.X_add_number < - 0x80
3241       || val.X_add_number > 0xff
3242       || (mult != 0 && mult != 1 && val.X_add_number != 0))
3243     {
3244       resolve_expression (&exp);
3245       if (exp.X_op != O_constant)
3246         as_bad (_("unsupported variable size or fill value"));
3247       else
3248         {
3249           offsetT i;
3250
3251           if (mult == 0)
3252             mult = 1;
3253           bytes = mult * exp.X_add_number;
3254           for (i = 0; i < exp.X_add_number; i++)
3255             emit_expr (&val, mult);
3256         }
3257     }
3258   else
3259     {
3260       if (now_seg == absolute_section || mri_common_symbol != NULL)
3261         resolve_expression (&exp);
3262
3263       if (exp.X_op == O_constant)
3264         {
3265           offsetT repeat;
3266
3267           repeat = exp.X_add_number;
3268           if (mult)
3269             repeat *= mult;
3270           bytes = repeat;
3271           if (repeat <= 0)
3272             {
3273               if (!flag_mri)
3274                 as_warn (_(".space repeat count is zero, ignored"));
3275               else if (repeat < 0)
3276                 as_warn (_(".space repeat count is negative, ignored"));
3277               goto getout;
3278             }
3279
3280           /* If we are in the absolute section, just bump the offset.  */
3281           if (now_seg == absolute_section)
3282             {
3283               abs_section_offset += repeat;
3284               goto getout;
3285             }
3286
3287           /* If we are secretly in an MRI common section, then
3288              creating space just increases the size of the common
3289              symbol.  */
3290           if (mri_common_symbol != NULL)
3291             {
3292               S_SET_VALUE (mri_common_symbol,
3293                            S_GET_VALUE (mri_common_symbol) + repeat);
3294               goto getout;
3295             }
3296
3297           if (!need_pass_2)
3298             p = frag_var (rs_fill, 1, 1, (relax_substateT) 0, (symbolS *) 0,
3299                           (offsetT) repeat, (char *) 0);
3300         }
3301       else
3302         {
3303           if (now_seg == absolute_section)
3304             {
3305               as_bad (_("space allocation too complex in absolute section"));
3306               subseg_set (text_section, 0);
3307             }
3308
3309           if (mri_common_symbol != NULL)
3310             {
3311               as_bad (_("space allocation too complex in common section"));
3312               mri_common_symbol = NULL;
3313             }
3314
3315           if (!need_pass_2)
3316             p = frag_var (rs_space, 1, 1, (relax_substateT) 0,
3317                           make_expr_symbol (&exp), (offsetT) 0, (char *) 0);
3318         }
3319
3320       if (p)
3321         *p = val.X_add_number;
3322     }
3323
3324  getout:
3325
3326   /* In MRI mode, after an odd number of bytes, we must align to an
3327      even word boundary, unless the next instruction is a dc.b, ds.b
3328      or dcb.b.  */
3329   if (flag_mri && (bytes & 1) != 0)
3330     mri_pending_align = 1;
3331
3332   demand_empty_rest_of_line ();
3333
3334   if (flag_mri)
3335     mri_comment_end (stop, stopc);
3336 }
3337
3338 /* This is like s_space, but the value is a floating point number with
3339    the given precision.  This is for the MRI dcb.s pseudo-op and
3340    friends.  */
3341
3342 void
3343 s_float_space (int float_type)
3344 {
3345   offsetT count;
3346   int flen;
3347   char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
3348   char *stop = NULL;
3349   char stopc = 0;
3350
3351 #ifdef md_cons_align
3352   md_cons_align (1);
3353 #endif
3354
3355   if (flag_mri)
3356     stop = mri_comment_field (&stopc);
3357
3358   count = get_absolute_expression ();
3359
3360   SKIP_WHITESPACE ();
3361   if (*input_line_pointer != ',')
3362     {
3363       as_bad (_("missing value"));
3364       ignore_rest_of_line ();
3365       if (flag_mri)
3366         mri_comment_end (stop, stopc);
3367       return;
3368     }
3369
3370   ++input_line_pointer;
3371
3372   SKIP_WHITESPACE ();
3373
3374   /* Skip any 0{letter} that may be present.  Don't even check if the
3375    * letter is legal.  */
3376   if (input_line_pointer[0] == '0'
3377       && ISALPHA (input_line_pointer[1]))
3378     input_line_pointer += 2;
3379
3380   /* Accept :xxxx, where the x's are hex digits, for a floating point
3381      with the exact digits specified.  */
3382   if (input_line_pointer[0] == ':')
3383     {
3384       flen = hex_float (float_type, temp);
3385       if (flen < 0)
3386         {
3387           ignore_rest_of_line ();
3388           if (flag_mri)
3389             mri_comment_end (stop, stopc);
3390           return;
3391         }
3392     }
3393   else
3394     {
3395       char *err;
3396
3397       err = md_atof (float_type, temp, &flen);
3398       know (flen <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
3399       know (err != NULL || flen > 0);
3400       if (err)
3401         {
3402           as_bad (_("bad floating literal: %s"), err);
3403           ignore_rest_of_line ();
3404           if (flag_mri)
3405             mri_comment_end (stop, stopc);
3406           return;
3407         }
3408     }
3409
3410   while (--count >= 0)
3411     {
3412       char *p;
3413
3414       p = frag_more (flen);
3415       memcpy (p, temp, (unsigned int) flen);
3416     }
3417
3418   demand_empty_rest_of_line ();
3419
3420   if (flag_mri)
3421     mri_comment_end (stop, stopc);
3422 }
3423
3424 /* Handle the .struct pseudo-op, as found in MIPS assemblers.  */
3425
3426 void
3427 s_struct (int ignore ATTRIBUTE_UNUSED)
3428 {
3429   char *stop = NULL;
3430   char stopc = 0;
3431
3432   if (flag_mri)
3433     stop = mri_comment_field (&stopc);
3434   abs_section_offset = get_absolute_expression ();
3435 #if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
3436   /* The ELF backend needs to know that we are changing sections, so
3437      that .previous works correctly. */
3438   if (IS_ELF)
3439     obj_elf_section_change_hook ();
3440 #endif
3441   subseg_set (absolute_section, 0);
3442   demand_empty_rest_of_line ();
3443   if (flag_mri)
3444     mri_comment_end (stop, stopc);
3445 }
3446
3447 void
3448 s_text (int ignore ATTRIBUTE_UNUSED)
3449 {
3450   int temp;
3451
3452   temp = get_absolute_expression ();
3453   subseg_set (text_section, (subsegT) temp);
3454   demand_empty_rest_of_line ();
3455 }
3456
3457 /* .weakref x, y sets x as an alias to y that, as long as y is not
3458    referenced directly, will cause y to become a weak symbol.  */
3459 void
3460 s_weakref (int ignore ATTRIBUTE_UNUSED)
3461 {
3462   char *name;
3463   char delim;
3464   char *end_name;
3465   symbolS *symbolP;
3466   symbolS *symbolP2;
3467   expressionS exp;
3468
3469   name = input_line_pointer;
3470   delim = get_symbol_end ();
3471   end_name = input_line_pointer;
3472
3473   if (name == end_name)
3474     {
3475       as_bad (_("expected symbol name"));
3476       *end_name = delim;
3477       ignore_rest_of_line ();
3478       return;
3479     }
3480
3481   symbolP = symbol_find_or_make (name);
3482
3483   if (S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
3484     {
3485       if (!S_IS_VOLATILE (symbolP))
3486         {
3487           as_bad (_("symbol `%s' is already defined"), name);
3488           *end_name = delim;
3489           ignore_rest_of_line ();
3490           return;
3491         }
3492       symbolP = symbol_clone (symbolP, 1);
3493       S_CLEAR_VOLATILE (symbolP);
3494     }
3495
3496   *end_name = delim;
3497
3498   SKIP_WHITESPACE ();
3499
3500   if (*input_line_pointer != ',')
3501     {
3502       *end_name = 0;
3503       as_bad (_("expected comma after \"%s\""), name);
3504       *end_name = delim;
3505       ignore_rest_of_line ();
3506       return;
3507     }
3508
3509   input_line_pointer++;
3510
3511   SKIP_WHITESPACE ();
3512
3513   name = input_line_pointer;
3514   delim = get_symbol_end ();
3515   end_name = input_line_pointer;
3516
3517   if (name == end_name)
3518     {
3519       as_bad (_("expected symbol name"));
3520       ignore_rest_of_line ();
3521       return;
3522     }
3523
3524   if ((symbolP2 = symbol_find_noref (name, 1)) == NULL
3525       && (symbolP2 = md_undefined_symbol (name)) == NULL)
3526     {
3527       symbolP2 = symbol_find_or_make (name);
3528       S_SET_WEAKREFD (symbolP2);
3529     }
3530   else
3531     {
3532       symbolS *symp = symbolP2;
3533
3534       while (S_IS_WEAKREFR (symp) && symp != symbolP)
3535         {
3536           expressionS *expP = symbol_get_value_expression (symp);
3537
3538           gas_assert (expP->X_op == O_symbol
3539                   && expP->X_add_number == 0);
3540           symp = expP->X_add_symbol;
3541         }
3542       if (symp == symbolP)
3543         {
3544           char *loop;
3545
3546           loop = concat (S_GET_NAME (symbolP),
3547                          " => ", S_GET_NAME (symbolP2), (const char *) NULL);
3548
3549           symp = symbolP2;
3550           while (symp != symbolP)
3551             {
3552               char *old_loop = loop;
3553               symp = symbol_get_value_expression (symp)->X_add_symbol;
3554               loop = concat (loop, " => ", S_GET_NAME (symp),
3555                              (const char *) NULL);
3556               free (old_loop);
3557             }
3558
3559           as_bad (_("%s: would close weakref loop: %s"),
3560                   S_GET_NAME (symbolP), loop);
3561
3562           free (loop);
3563
3564           *end_name = delim;
3565           ignore_rest_of_line ();
3566           return;
3567         }
3568
3569       /* Short-circuiting instead of just checking here might speed
3570          things up a tiny little bit, but loop error messages would
3571          miss intermediate links.  */
3572       /* symbolP2 = symp; */
3573     }
3574
3575   *end_name = delim;
3576
3577   memset (&exp, 0, sizeof (exp));
3578   exp.X_op = O_symbol;
3579   exp.X_add_symbol = symbolP2;
3580
3581   S_SET_SEGMENT (symbolP, undefined_section);
3582   symbol_set_value_expression (symbolP, &exp);
3583   symbol_set_frag (symbolP, &zero_address_frag);
3584   S_SET_WEAKREFR (symbolP);
3585
3586   demand_empty_rest_of_line ();
3587 }
3588 \f
3589
3590 /* Verify that we are at the end of a line.  If not, issue an error and
3591    skip to EOL.  */
3592
3593 void
3594 demand_empty_rest_of_line (void)
3595 {
3596   SKIP_WHITESPACE ();
3597   if (is_end_of_line[(unsigned char) *input_line_pointer])
3598     input_line_pointer++;
3599   else
3600     {
3601       if (ISPRINT (*input_line_pointer))
3602         as_bad (_("junk at end of line, first unrecognized character is `%c'"),
3603                  *input_line_pointer);
3604       else
3605         as_bad (_("junk at end of line, first unrecognized character valued 0x%x"),
3606                  *input_line_pointer);
3607       ignore_rest_of_line ();
3608     }
3609   
3610   /* Return pointing just after end-of-line.  */
3611   know (is_end_of_line[(unsigned char) input_line_pointer[-1]]);
3612 }
3613
3614 /* Silently advance to the end of line.  Use this after already having
3615    issued an error about something bad.  */
3616
3617 void
3618 ignore_rest_of_line (void)
3619 {
3620   while (input_line_pointer < buffer_limit
3621          && !is_end_of_line[(unsigned char) *input_line_pointer])
3622     input_line_pointer++;
3623
3624   input_line_pointer++;
3625
3626   /* Return pointing just after end-of-line.  */
3627   know (is_end_of_line[(unsigned char) input_line_pointer[-1]]);
3628 }
3629
3630 /* Sets frag for given symbol to zero_address_frag, except when the
3631    symbol frag is already set to a dummy listing frag.  */
3632
3633 static void
3634 set_zero_frag (symbolS *symbolP)
3635 {
3636   if (symbol_get_frag (symbolP)->fr_type != rs_dummy)
3637     symbol_set_frag (symbolP, &zero_address_frag);
3638 }
3639
3640 /* In:  Pointer to a symbol.
3641         Input_line_pointer->expression.
3642
3643    Out: Input_line_pointer->just after any whitespace after expression.
3644         Tried to set symbol to value of expression.
3645         Will change symbols type, value, and frag;  */
3646
3647 void
3648 pseudo_set (symbolS *symbolP)
3649 {
3650   expressionS exp;
3651   segT seg;
3652
3653   know (symbolP);               /* NULL pointer is logic error.  */
3654
3655   if (!S_IS_FORWARD_REF (symbolP))
3656     (void) expression (&exp);
3657   else
3658     (void) deferred_expression (&exp);
3659
3660   if (exp.X_op == O_illegal)
3661     as_bad (_("illegal expression"));
3662   else if (exp.X_op == O_absent)
3663     as_bad (_("missing expression"));
3664   else if (exp.X_op == O_big)
3665     {
3666       if (exp.X_add_number > 0)
3667         as_bad (_("bignum invalid"));
3668       else
3669         as_bad (_("floating point number invalid"));
3670     }
3671   else if (exp.X_op == O_subtract
3672            && !S_IS_FORWARD_REF (symbolP)
3673            && SEG_NORMAL (S_GET_SEGMENT (exp.X_add_symbol))
3674            && (symbol_get_frag (exp.X_add_symbol)
3675                == symbol_get_frag (exp.X_op_symbol)))
3676     {
3677       exp.X_op = O_constant;
3678       exp.X_add_number = (S_GET_VALUE (exp.X_add_symbol)
3679                           - S_GET_VALUE (exp.X_op_symbol));
3680     }
3681
3682   if (symbol_section_p (symbolP))
3683     {
3684       as_bad ("attempt to set value of section symbol");
3685       return;
3686     }
3687
3688   switch (exp.X_op)
3689     {
3690     case O_illegal:
3691     case O_absent:
3692     case O_big:
3693       exp.X_add_number = 0;
3694       /* Fall through.  */
3695     case O_constant:
3696       S_SET_SEGMENT (symbolP, absolute_section);
3697       S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
3698       set_zero_frag (symbolP);
3699       break;
3700
3701     case O_register:
3702 #ifndef TC_GLOBAL_REGISTER_SYMBOL_OK
3703       if (S_IS_EXTERNAL (symbolP))
3704         {
3705           as_bad ("can't equate global symbol `%s' with register name",
3706                   S_GET_NAME (symbolP));
3707           return;
3708         }
3709 #endif
3710       S_SET_SEGMENT (symbolP, reg_section);
3711       S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
3712       set_zero_frag (symbolP);
3713       symbol_get_value_expression (symbolP)->X_op = O_register;
3714       break;
3715
3716     case O_symbol:
3717       seg = S_GET_SEGMENT (exp.X_add_symbol);
3718       /* For x=undef+const, create an expression symbol.
3719          For x=x+const, just update x except when x is an undefined symbol
3720          For x=defined+const, evaluate x.  */
3721       if (symbolP == exp.X_add_symbol
3722           && (seg != undefined_section
3723               || !symbol_constant_p (symbolP)))
3724         {
3725           *symbol_X_add_number (symbolP) += exp.X_add_number;
3726           break;
3727         }
3728       else if (!S_IS_FORWARD_REF (symbolP) && seg != undefined_section)
3729         {
3730           symbolS *s = exp.X_add_symbol;
3731
3732           if (S_IS_COMMON (s))
3733             as_bad (_("`%s' can't be equated to common symbol '%s'"),
3734                     S_GET_NAME (symbolP), S_GET_NAME (s));
3735
3736           S_SET_SEGMENT (symbolP, seg);
3737           S_SET_VALUE (symbolP, exp.X_add_number + S_GET_VALUE (s));
3738           symbol_set_frag (symbolP, symbol_get_frag (s));
3739           copy_symbol_attributes (symbolP, s);
3740           break;
3741         }
3742       S_SET_SEGMENT (symbolP, undefined_section);
3743       symbol_set_value_expression (symbolP, &exp);
3744       copy_symbol_attributes (symbolP, exp.X_add_symbol);
3745       set_zero_frag (symbolP);
3746       break;
3747
3748     default:
3749       /* The value is some complex expression.  */
3750       S_SET_SEGMENT (symbolP, expr_section);
3751       symbol_set_value_expression (symbolP, &exp);
3752       set_zero_frag (symbolP);
3753       break;
3754     }
3755 }
3756 \f
3757 /*                      cons()
3758
3759    CONStruct more frag of .bytes, or .words etc.
3760    Should need_pass_2 be 1 then emit no frag(s).
3761    This understands EXPRESSIONS.
3762
3763    Bug (?)
3764
3765    This has a split personality. We use expression() to read the
3766    value. We can detect if the value won't fit in a byte or word.
3767    But we can't detect if expression() discarded significant digits
3768    in the case of a long. Not worth the crocks required to fix it.  */
3769
3770 /* Select a parser for cons expressions.  */
3771
3772 /* Some targets need to parse the expression in various fancy ways.
3773    You can define TC_PARSE_CONS_EXPRESSION to do whatever you like
3774    (for example, the HPPA does this).  Otherwise, you can define
3775    BITFIELD_CONS_EXPRESSIONS to permit bitfields to be specified, or
3776    REPEAT_CONS_EXPRESSIONS to permit repeat counts.  If none of these
3777    are defined, which is the normal case, then only simple expressions
3778    are permitted.  */
3779
3780 #ifdef TC_M68K
3781 static void
3782 parse_mri_cons (expressionS *exp, unsigned int nbytes);
3783 #endif
3784
3785 #ifndef TC_PARSE_CONS_EXPRESSION
3786 #ifdef BITFIELD_CONS_EXPRESSIONS
3787 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_bitfield_cons (EXP, NBYTES)
3788 static void
3789 parse_bitfield_cons (expressionS *exp, unsigned int nbytes);
3790 #endif
3791 #ifdef REPEAT_CONS_EXPRESSIONS
3792 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_repeat_cons (EXP, NBYTES)
3793 static void
3794 parse_repeat_cons (expressionS *exp, unsigned int nbytes);
3795 #endif
3796
3797 /* If we haven't gotten one yet, just call expression.  */
3798 #ifndef TC_PARSE_CONS_EXPRESSION
3799 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) expression (EXP)
3800 #endif
3801 #endif
3802
3803 void
3804 do_parse_cons_expression (expressionS *exp,
3805                           int nbytes ATTRIBUTE_UNUSED)
3806 {
3807   TC_PARSE_CONS_EXPRESSION (exp, nbytes);
3808 }
3809
3810
3811 /* Worker to do .byte etc statements.
3812    Clobbers input_line_pointer and checks end-of-line.  */
3813
3814 static void
3815 cons_worker (int nbytes,        /* 1=.byte, 2=.word, 4=.long.  */
3816              int rva)
3817 {
3818   int c;
3819   expressionS exp;
3820   char *stop = NULL;
3821   char stopc = 0;
3822
3823 #ifdef md_flush_pending_output
3824   md_flush_pending_output ();
3825 #endif
3826
3827   if (flag_mri)
3828     stop = mri_comment_field (&stopc);
3829
3830   if (is_it_end_of_statement ())
3831     {
3832       demand_empty_rest_of_line ();
3833       if (flag_mri)
3834         mri_comment_end (stop, stopc);
3835       return;
3836     }
3837
3838 #ifdef TC_ADDRESS_BYTES
3839   if (nbytes == 0)
3840     nbytes = TC_ADDRESS_BYTES ();
3841 #endif
3842
3843 #ifdef md_cons_align
3844   md_cons_align (nbytes);
3845 #endif
3846
3847   c = 0;
3848   do
3849     {
3850 #ifdef TC_M68K
3851       if (flag_m68k_mri)
3852         parse_mri_cons (&exp, (unsigned int) nbytes);
3853       else
3854 #endif
3855         {
3856           if (*input_line_pointer == '"')
3857             {
3858               as_bad (_("unexpected `\"' in expression"));
3859               ignore_rest_of_line ();
3860               return;
3861             }
3862           TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes);
3863         }
3864
3865       if (rva)
3866         {
3867           if (exp.X_op == O_symbol)
3868             exp.X_op = O_symbol_rva;
3869           else
3870             as_fatal (_("rva without symbol"));
3871         }
3872       emit_expr (&exp, (unsigned int) nbytes);
3873       ++c;
3874     }
3875   while (*input_line_pointer++ == ',');
3876
3877   /* In MRI mode, after an odd number of bytes, we must align to an
3878      even word boundary, unless the next instruction is a dc.b, ds.b
3879      or dcb.b.  */
3880   if (flag_mri && nbytes == 1 && (c & 1) != 0)
3881     mri_pending_align = 1;
3882
3883   input_line_pointer--;         /* Put terminator back into stream.  */
3884
3885   demand_empty_rest_of_line ();
3886
3887   if (flag_mri)
3888     mri_comment_end (stop, stopc);
3889 }
3890
3891 void
3892 cons (int size)
3893 {
3894   cons_worker (size, 0);
3895 }
3896
3897 void
3898 s_rva (int size)
3899 {
3900   cons_worker (size, 1);
3901 }
3902
3903 /* .reloc offset, reloc_name, symbol+addend.  */
3904
3905 void
3906 s_reloc (int ignore ATTRIBUTE_UNUSED)
3907 {
3908   char *stop = NULL;
3909   char stopc = 0;
3910   expressionS exp;
3911   char *r_name;
3912   int c;
3913   struct reloc_list *reloc;
3914
3915   reloc = (struct reloc_list *) xmalloc (sizeof (*reloc));
3916
3917   if (flag_mri)
3918     stop = mri_comment_field (&stopc);
3919
3920   expression (&exp);
3921   switch (exp.X_op)
3922     {
3923     case O_illegal:
3924     case O_absent:
3925     case O_big:
3926     case O_register:
3927       as_bad (_("missing or bad offset expression"));
3928       goto err_out;
3929     case O_constant:
3930       exp.X_add_symbol = section_symbol (now_seg);
3931       exp.X_op = O_symbol;
3932       /* Fall thru */
3933     case O_symbol:
3934       if (exp.X_add_number == 0)
3935         {
3936           reloc->u.a.offset_sym = exp.X_add_symbol;
3937           break;
3938         }
3939       /* Fall thru */
3940     default:
3941       reloc->u.a.offset_sym = make_expr_symbol (&exp);
3942       break;
3943     }
3944
3945   SKIP_WHITESPACE ();
3946   if (*input_line_pointer != ',')
3947     {
3948       as_bad (_("missing reloc type"));
3949       goto err_out;
3950     }
3951
3952   ++input_line_pointer;
3953   SKIP_WHITESPACE ();
3954   r_name = input_line_pointer;
3955   c = get_symbol_end ();
3956   reloc->u.a.howto = bfd_reloc_name_lookup (stdoutput, r_name);
3957   *input_line_pointer = c;
3958   if (reloc->u.a.howto == NULL)
3959     {
3960       as_bad (_("unrecognized reloc type"));
3961       goto err_out;
3962     }
3963
3964   exp.X_op = O_absent;
3965   SKIP_WHITESPACE ();
3966   if (*input_line_pointer == ',')
3967     {
3968       ++input_line_pointer;
3969       expression (&exp);
3970     }
3971   switch (exp.X_op)
3972     {
3973     case O_illegal:
3974     case O_big:
3975     case O_register:
3976       as_bad (_("bad reloc expression"));
3977     err_out:
3978       ignore_rest_of_line ();
3979       free (reloc);
3980       if (flag_mri)
3981         mri_comment_end (stop, stopc);
3982       return;
3983     case O_absent:
3984       reloc->u.a.sym = NULL;
3985       reloc->u.a.addend = 0;
3986       break;
3987     case O_constant:
3988       reloc->u.a.sym = NULL;
3989       reloc->u.a.addend = exp.X_add_number;
3990       break;
3991     case O_symbol:
3992       reloc->u.a.sym = exp.X_add_symbol;
3993       reloc->u.a.addend = exp.X_add_number;
3994       break;
3995     default:
3996       reloc->u.a.sym = make_expr_symbol (&exp);
3997       reloc->u.a.addend = 0;
3998       break;
3999     }
4000
4001   as_where (&reloc->file, &reloc->line);
4002   reloc->next = reloc_list;
4003   reloc_list = reloc;
4004
4005   demand_empty_rest_of_line ();
4006   if (flag_mri)
4007     mri_comment_end (stop, stopc);
4008 }
4009
4010 /* Put the contents of expression EXP into the object file using
4011    NBYTES bytes.  If need_pass_2 is 1, this does nothing.  */
4012
4013 void
4014 emit_expr (expressionS *exp, unsigned int nbytes)
4015 {
4016   operatorT op;
4017   char *p;
4018   valueT extra_digit = 0;
4019
4020   /* Don't do anything if we are going to make another pass.  */
4021   if (need_pass_2)
4022     return;
4023
4024   /* Grow the current frag now so that dot_value does not get invalidated
4025      if the frag were to fill up in the frag_more() call below.  */
4026   frag_grow (nbytes);
4027   dot_value = frag_now_fix ();
4028
4029 #ifndef NO_LISTING
4030 #ifdef OBJ_ELF
4031   /* When gcc emits DWARF 1 debugging pseudo-ops, a line number will
4032      appear as a four byte positive constant in the .line section,
4033      followed by a 2 byte 0xffff.  Look for that case here.  */
4034   {
4035     static int dwarf_line = -1;
4036
4037     if (strcmp (segment_name (now_seg), ".line") != 0)
4038       dwarf_line = -1;
4039     else if (dwarf_line >= 0
4040              && nbytes == 2
4041              && exp->X_op == O_constant
4042              && (exp->X_add_number == -1 || exp->X_add_number == 0xffff))
4043       listing_source_line ((unsigned int) dwarf_line);
4044     else if (nbytes == 4
4045              && exp->X_op == O_constant
4046              && exp->X_add_number >= 0)
4047       dwarf_line = exp->X_add_number;
4048     else
4049       dwarf_line = -1;
4050   }
4051
4052   /* When gcc emits DWARF 1 debugging pseudo-ops, a file name will
4053      appear as a 2 byte TAG_compile_unit (0x11) followed by a 2 byte
4054      AT_sibling (0x12) followed by a four byte address of the sibling
4055      followed by a 2 byte AT_name (0x38) followed by the name of the
4056      file.  We look for that case here.  */
4057   {
4058     static int dwarf_file = 0;
4059
4060     if (strcmp (segment_name (now_seg), ".debug") != 0)
4061       dwarf_file = 0;
4062     else if (dwarf_file == 0
4063              && nbytes == 2
4064              && exp->X_op == O_constant
4065              && exp->X_add_number == 0x11)
4066       dwarf_file = 1;
4067     else if (dwarf_file == 1
4068              && nbytes == 2
4069              && exp->X_op == O_constant
4070              && exp->X_add_number == 0x12)
4071       dwarf_file = 2;
4072     else if (dwarf_file == 2
4073              && nbytes == 4)
4074       dwarf_file = 3;
4075     else if (dwarf_file == 3
4076              && nbytes == 2
4077              && exp->X_op == O_constant
4078              && exp->X_add_number == 0x38)
4079       dwarf_file = 4;
4080     else
4081       dwarf_file = 0;
4082
4083     /* The variable dwarf_file_string tells stringer that the string
4084        may be the name of the source file.  */
4085     if (dwarf_file == 4)
4086       dwarf_file_string = 1;
4087     else
4088       dwarf_file_string = 0;
4089   }
4090 #endif
4091 #endif
4092
4093   if (check_eh_frame (exp, &nbytes))
4094     return;
4095
4096   op = exp->X_op;
4097
4098   /* Allow `.word 0' in the absolute section.  */
4099   if (now_seg == absolute_section)
4100     {
4101       if (op != O_constant || exp->X_add_number != 0)
4102         as_bad (_("attempt to store value in absolute section"));
4103       abs_section_offset += nbytes;
4104       return;
4105     }
4106
4107   /* Handle a negative bignum.  */
4108   if (op == O_uminus
4109       && exp->X_add_number == 0
4110       && symbol_get_value_expression (exp->X_add_symbol)->X_op == O_big
4111       && symbol_get_value_expression (exp->X_add_symbol)->X_add_number > 0)
4112     {
4113       int i;
4114       unsigned long carry;
4115
4116       exp = symbol_get_value_expression (exp->X_add_symbol);
4117
4118       /* Negate the bignum: one's complement each digit and add 1.  */
4119       carry = 1;
4120       for (i = 0; i < exp->X_add_number; i++)
4121         {
4122           unsigned long next;
4123
4124           next = (((~(generic_bignum[i] & LITTLENUM_MASK))
4125                    & LITTLENUM_MASK)
4126                   + carry);
4127           generic_bignum[i] = next & LITTLENUM_MASK;
4128           carry = next >> LITTLENUM_NUMBER_OF_BITS;
4129         }
4130
4131       /* We can ignore any carry out, because it will be handled by
4132          extra_digit if it is needed.  */
4133
4134       extra_digit = (valueT) -1;
4135       op = O_big;
4136     }
4137
4138   if (op == O_absent || op == O_illegal)
4139     {
4140       as_warn (_("zero assumed for missing expression"));
4141       exp->X_add_number = 0;
4142       op = O_constant;
4143     }
4144   else if (op == O_big && exp->X_add_number <= 0)
4145     {
4146       as_bad (_("floating point number invalid"));
4147       exp->X_add_number = 0;
4148       op = O_constant;
4149     }
4150   else if (op == O_register)
4151     {
4152       as_warn (_("register value used as expression"));
4153       op = O_constant;
4154     }
4155
4156   p = frag_more ((int) nbytes);
4157
4158 #ifndef WORKING_DOT_WORD
4159   /* If we have the difference of two symbols in a word, save it on
4160      the broken_words list.  See the code in write.c.  */
4161   if (op == O_subtract && nbytes == 2)
4162     {
4163       struct broken_word *x;
4164
4165       x = (struct broken_word *) xmalloc (sizeof (struct broken_word));
4166       x->next_broken_word = broken_words;
4167       broken_words = x;
4168       x->seg = now_seg;
4169       x->subseg = now_subseg;
4170       x->frag = frag_now;
4171       x->word_goes_here = p;
4172       x->dispfrag = 0;
4173       x->add = exp->X_add_symbol;
4174       x->sub = exp->X_op_symbol;
4175       x->addnum = exp->X_add_number;
4176       x->added = 0;
4177       x->use_jump = 0;
4178       new_broken_words++;
4179       return;
4180     }
4181 #endif
4182
4183   /* If we have an integer, but the number of bytes is too large to
4184      pass to md_number_to_chars, handle it as a bignum.  */
4185   if (op == O_constant && nbytes > sizeof (valueT))
4186     {
4187       extra_digit = exp->X_unsigned ? 0 : -1;
4188       convert_to_bignum (exp);
4189       op = O_big;
4190     }
4191
4192   if (op == O_constant)
4193     {
4194       valueT get;
4195       valueT use;
4196       valueT mask;
4197       valueT hibit;
4198       valueT unmask;
4199
4200       /* JF << of >= number of bits in the object is undefined.  In
4201          particular SPARC (Sun 4) has problems.  */
4202       if (nbytes >= sizeof (valueT))
4203         {
4204           mask = 0;
4205           if (nbytes > sizeof (valueT))
4206             hibit = 0;
4207           else
4208             hibit = (valueT) 1 << (nbytes * BITS_PER_CHAR - 1);
4209         }
4210       else
4211         {
4212           /* Don't store these bits.  */
4213           mask = ~(valueT) 0 << (BITS_PER_CHAR * nbytes);
4214           hibit = (valueT) 1 << (nbytes * BITS_PER_CHAR - 1);
4215         }
4216
4217       unmask = ~mask;           /* Do store these bits.  */
4218
4219 #ifdef NEVER
4220       "Do this mod if you want every overflow check to assume SIGNED 2's complement data.";
4221       mask = ~(unmask >> 1);    /* Includes sign bit now.  */
4222 #endif
4223
4224       get = exp->X_add_number;
4225       use = get & unmask;
4226       if ((get & mask) != 0
4227           && ((get & mask) != mask
4228               || (get & hibit) == 0))
4229         {               /* Leading bits contain both 0s & 1s.  */
4230 #if defined (BFD64) && BFD_HOST_64BIT_LONG_LONG
4231 #ifndef __MSVCRT__
4232           as_warn (_("value 0x%llx truncated to 0x%llx"),
4233                    (unsigned long long) get, (unsigned long long) use);
4234 #else
4235           as_warn (_("value 0x%I64x truncated to 0x%I64x"),
4236                    (unsigned long long) get, (unsigned long long) use);
4237 #endif
4238 #else
4239           as_warn (_("value 0x%lx truncated to 0x%lx"),
4240                    (unsigned long) get, (unsigned long) use);
4241 #endif
4242         }
4243       /* Put bytes in right order.  */
4244       md_number_to_chars (p, use, (int) nbytes);
4245     }
4246   else if (op == O_big)
4247     {
4248       unsigned int size;
4249       LITTLENUM_TYPE *nums;
4250
4251       size = exp->X_add_number * CHARS_PER_LITTLENUM;
4252       if (nbytes < size)
4253         {
4254           int i = nbytes / CHARS_PER_LITTLENUM;
4255           if (i != 0)
4256             {
4257               LITTLENUM_TYPE sign = 0;
4258               if ((generic_bignum[--i]
4259                    & (1 << (LITTLENUM_NUMBER_OF_BITS - 1))) != 0)
4260                 sign = ~(LITTLENUM_TYPE) 0;
4261               while (++i < exp->X_add_number)
4262                 if (generic_bignum[i] != sign)
4263                   break;
4264             }
4265           if (i < exp->X_add_number)
4266             as_warn (_("bignum truncated to %d bytes"), nbytes);
4267           size = nbytes;
4268         }
4269
4270       if (nbytes == 1)
4271         {
4272           md_number_to_chars (p, (valueT) generic_bignum[0], 1);
4273           return;
4274         }
4275       know (nbytes % CHARS_PER_LITTLENUM == 0);
4276
4277       if (target_big_endian)
4278         {
4279           while (nbytes > size)
4280             {
4281               md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
4282               nbytes -= CHARS_PER_LITTLENUM;
4283               p += CHARS_PER_LITTLENUM;
4284             }
4285
4286           nums = generic_bignum + size / CHARS_PER_LITTLENUM;
4287           while (size >= CHARS_PER_LITTLENUM)
4288             {
4289               --nums;
4290               md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
4291               size -= CHARS_PER_LITTLENUM;
4292               p += CHARS_PER_LITTLENUM;
4293             }
4294         }
4295       else
4296         {
4297           nums = generic_bignum;
4298           while (size >= CHARS_PER_LITTLENUM)
4299             {
4300               md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
4301               ++nums;
4302               size -= CHARS_PER_LITTLENUM;
4303               p += CHARS_PER_LITTLENUM;
4304               nbytes -= CHARS_PER_LITTLENUM;
4305             }
4306
4307           while (nbytes >= CHARS_PER_LITTLENUM)
4308             {
4309               md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
4310               nbytes -= CHARS_PER_LITTLENUM;
4311               p += CHARS_PER_LITTLENUM;
4312             }
4313         }
4314     }
4315   else
4316     emit_expr_fix (exp, nbytes, frag_now, p);
4317 }
4318
4319 void
4320 emit_expr_fix (expressionS *exp, unsigned int nbytes, fragS *frag, char *p)
4321 {
4322   memset (p, 0, nbytes);
4323
4324   /* Generate a fixS to record the symbol value.  */
4325
4326 #ifdef TC_CONS_FIX_NEW
4327   TC_CONS_FIX_NEW (frag, p - frag->fr_literal, nbytes, exp);
4328 #else
4329   {
4330     bfd_reloc_code_real_type r;
4331
4332     switch (nbytes)
4333       {
4334       case 1:
4335         r = BFD_RELOC_8;
4336         break;
4337       case 2:
4338         r = BFD_RELOC_16;
4339         break;
4340       case 3:
4341         r = BFD_RELOC_24;
4342         break;
4343       case 4:
4344         r = BFD_RELOC_32;
4345         break;
4346       case 8:
4347         r = BFD_RELOC_64;
4348         break;
4349       default:
4350         as_bad (_("unsupported BFD relocation size %u"), nbytes);
4351         r = BFD_RELOC_32;
4352         break;
4353       }
4354     fix_new_exp (frag, p - frag->fr_literal, (int) nbytes, exp,
4355                  0, r);
4356   }
4357 #endif
4358 }
4359 \f
4360 #ifdef BITFIELD_CONS_EXPRESSIONS
4361
4362 /* i960 assemblers, (eg, asm960), allow bitfields after ".byte" as
4363    w:x,y:z, where w and y are bitwidths and x and y are values.  They
4364    then pack them all together. We do a little better in that we allow
4365    them in words, longs, etc. and we'll pack them in target byte order
4366    for you.
4367
4368    The rules are: pack least significant bit first, if a field doesn't
4369    entirely fit, put it in the next unit.  Overflowing the bitfield is
4370    explicitly *not* even a warning.  The bitwidth should be considered
4371    a "mask".
4372
4373    To use this function the tc-XXX.h file should define
4374    BITFIELD_CONS_EXPRESSIONS.  */
4375
4376 static void
4377 parse_bitfield_cons (exp, nbytes)
4378      expressionS *exp;
4379      unsigned int nbytes;
4380 {
4381   unsigned int bits_available = BITS_PER_CHAR * nbytes;
4382   char *hold = input_line_pointer;
4383
4384   (void) expression (exp);
4385
4386   if (*input_line_pointer == ':')
4387     {
4388       /* Bitfields.  */
4389       long value = 0;
4390
4391       for (;;)
4392         {
4393           unsigned long width;
4394
4395           if (*input_line_pointer != ':')
4396             {
4397               input_line_pointer = hold;
4398               break;
4399             }                   /* Next piece is not a bitfield.  */
4400
4401           /* In the general case, we can't allow
4402              full expressions with symbol
4403              differences and such.  The relocation
4404              entries for symbols not defined in this
4405              assembly would require arbitrary field
4406              widths, positions, and masks which most
4407              of our current object formats don't
4408              support.
4409
4410              In the specific case where a symbol
4411              *is* defined in this assembly, we
4412              *could* build fixups and track it, but
4413              this could lead to confusion for the
4414              backends.  I'm lazy. I'll take any
4415              SEG_ABSOLUTE. I think that means that
4416              you can use a previous .set or
4417              .equ type symbol.  xoxorich.  */
4418
4419           if (exp->X_op == O_absent)
4420             {
4421               as_warn (_("using a bit field width of zero"));
4422               exp->X_add_number = 0;
4423               exp->X_op = O_constant;
4424             }                   /* Implied zero width bitfield.  */
4425
4426           if (exp->X_op != O_constant)
4427             {
4428               *input_line_pointer = '\0';
4429               as_bad (_("field width \"%s\" too complex for a bitfield"), hold);
4430               *input_line_pointer = ':';
4431               demand_empty_rest_of_line ();
4432               return;
4433             }                   /* Too complex.  */
4434
4435           if ((width = exp->X_add_number) > (BITS_PER_CHAR * nbytes))
4436             {
4437               as_warn (_("field width %lu too big to fit in %d bytes: truncated to %d bits"),
4438                        width, nbytes, (BITS_PER_CHAR * nbytes));
4439               width = BITS_PER_CHAR * nbytes;
4440             }                   /* Too big.  */
4441
4442           if (width > bits_available)
4443             {
4444               /* FIXME-SOMEDAY: backing up and reparsing is wasteful.  */
4445               input_line_pointer = hold;
4446               exp->X_add_number = value;
4447               break;
4448             }                   /* Won't fit.  */
4449
4450           /* Skip ':'.  */
4451           hold = ++input_line_pointer;
4452
4453           (void) expression (exp);
4454           if (exp->X_op != O_constant)
4455             {
4456               char cache = *input_line_pointer;
4457
4458               *input_line_pointer = '\0';
4459               as_bad (_("field value \"%s\" too complex for a bitfield"), hold);
4460               *input_line_pointer = cache;
4461               demand_empty_rest_of_line ();
4462               return;
4463             }                   /* Too complex.  */
4464
4465           value |= ((~(-1 << width) & exp->X_add_number)
4466                     << ((BITS_PER_CHAR * nbytes) - bits_available));
4467
4468           if ((bits_available -= width) == 0
4469               || is_it_end_of_statement ()
4470               || *input_line_pointer != ',')
4471             {
4472               break;
4473             }                   /* All the bitfields we're gonna get.  */
4474
4475           hold = ++input_line_pointer;
4476           (void) expression (exp);
4477         }
4478
4479       exp->X_add_number = value;
4480       exp->X_op = O_constant;
4481       exp->X_unsigned = 1;
4482     }
4483 }
4484
4485 #endif /* BITFIELD_CONS_EXPRESSIONS */
4486 \f
4487 /* Handle an MRI style string expression.  */
4488
4489 #ifdef TC_M68K
4490 static void
4491 parse_mri_cons (exp, nbytes)
4492      expressionS *exp;
4493      unsigned int nbytes;
4494 {
4495   if (*input_line_pointer != '\''
4496       && (input_line_pointer[1] != '\''
4497           || (*input_line_pointer != 'A'
4498               && *input_line_pointer != 'E')))
4499     TC_PARSE_CONS_EXPRESSION (exp, nbytes);
4500   else
4501     {
4502       unsigned int scan;
4503       unsigned int result = 0;
4504
4505       /* An MRI style string.  Cut into as many bytes as will fit into
4506          a nbyte chunk, left justify if necessary, and separate with
4507          commas so we can try again later.  */
4508       if (*input_line_pointer == 'A')
4509         ++input_line_pointer;
4510       else if (*input_line_pointer == 'E')
4511         {
4512           as_bad (_("EBCDIC constants are not supported"));
4513           ++input_line_pointer;
4514         }
4515
4516       input_line_pointer++;
4517       for (scan = 0; scan < nbytes; scan++)
4518         {
4519           if (*input_line_pointer == '\'')
4520             {
4521               if (input_line_pointer[1] == '\'')
4522                 {
4523                   input_line_pointer++;
4524                 }
4525               else
4526                 break;
4527             }
4528           result = (result << 8) | (*input_line_pointer++);
4529         }
4530
4531       /* Left justify.  */
4532       while (scan < nbytes)
4533         {
4534           result <<= 8;
4535           scan++;
4536         }
4537
4538       /* Create correct expression.  */
4539       exp->X_op = O_constant;
4540       exp->X_add_number = result;
4541
4542       /* Fake it so that we can read the next char too.  */
4543       if (input_line_pointer[0] != '\'' ||
4544           (input_line_pointer[0] == '\'' && input_line_pointer[1] == '\''))
4545         {
4546           input_line_pointer -= 2;
4547           input_line_pointer[0] = ',';
4548           input_line_pointer[1] = '\'';
4549         }
4550       else
4551         input_line_pointer++;
4552     }
4553 }
4554 #endif /* TC_M68K */
4555 \f
4556 #ifdef REPEAT_CONS_EXPRESSIONS
4557
4558 /* Parse a repeat expression for cons.  This is used by the MIPS
4559    assembler.  The format is NUMBER:COUNT; NUMBER appears in the
4560    object file COUNT times.
4561
4562    To use this for a target, define REPEAT_CONS_EXPRESSIONS.  */
4563
4564 static void
4565 parse_repeat_cons (exp, nbytes)
4566      expressionS *exp;
4567      unsigned int nbytes;
4568 {
4569   expressionS count;
4570   int i;
4571
4572   expression (exp);
4573
4574   if (*input_line_pointer != ':')
4575     {
4576       /* No repeat count.  */
4577       return;
4578     }
4579
4580   ++input_line_pointer;
4581   expression (&count);
4582   if (count.X_op != O_constant
4583       || count.X_add_number <= 0)
4584     {
4585       as_warn (_("unresolvable or nonpositive repeat count; using 1"));
4586       return;
4587     }
4588
4589   /* The cons function is going to output this expression once.  So we
4590      output it count - 1 times.  */
4591   for (i = count.X_add_number - 1; i > 0; i--)
4592     emit_expr (exp, nbytes);
4593 }
4594
4595 #endif /* REPEAT_CONS_EXPRESSIONS */
4596 \f
4597 /* Parse a floating point number represented as a hex constant.  This
4598    permits users to specify the exact bits they want in the floating
4599    point number.  */
4600
4601 static int
4602 hex_float (int float_type, char *bytes)
4603 {
4604   int length;
4605   int i;
4606
4607   switch (float_type)
4608     {
4609     case 'f':
4610     case 'F':
4611     case 's':
4612     case 'S':
4613       length = 4;
4614       break;
4615
4616     case 'd':
4617     case 'D':
4618     case 'r':
4619     case 'R':
4620       length = 8;
4621       break;
4622
4623     case 'x':
4624     case 'X':
4625       length = 12;
4626       break;
4627
4628     case 'p':
4629     case 'P':
4630       length = 12;
4631       break;
4632
4633     default:
4634       as_bad (_("unknown floating type type '%c'"), float_type);
4635       return -1;
4636     }
4637
4638   /* It would be nice if we could go through expression to parse the
4639      hex constant, but if we get a bignum it's a pain to sort it into
4640      the buffer correctly.  */
4641   i = 0;
4642   while (hex_p (*input_line_pointer) || *input_line_pointer == '_')
4643     {
4644       int d;
4645
4646       /* The MRI assembler accepts arbitrary underscores strewn about
4647          through the hex constant, so we ignore them as well.  */
4648       if (*input_line_pointer == '_')
4649         {
4650           ++input_line_pointer;
4651           continue;
4652         }
4653
4654       if (i >= length)
4655         {
4656           as_warn (_("floating point constant too large"));
4657           return -1;
4658         }
4659       d = hex_value (*input_line_pointer) << 4;
4660       ++input_line_pointer;
4661       while (*input_line_pointer == '_')
4662         ++input_line_pointer;
4663       if (hex_p (*input_line_pointer))
4664         {
4665           d += hex_value (*input_line_pointer);
4666           ++input_line_pointer;
4667         }
4668       if (target_big_endian)
4669         bytes[i] = d;
4670       else
4671         bytes[length - i - 1] = d;
4672       ++i;
4673     }
4674
4675   if (i < length)
4676     {
4677       if (target_big_endian)
4678         memset (bytes + i, 0, length - i);
4679       else
4680         memset (bytes, 0, length - i);
4681     }
4682
4683   return length;
4684 }
4685
4686 /*                      float_cons()
4687
4688    CONStruct some more frag chars of .floats .ffloats etc.
4689    Makes 0 or more new frags.
4690    If need_pass_2 == 1, no frags are emitted.
4691    This understands only floating literals, not expressions. Sorry.
4692
4693    A floating constant is defined by atof_generic(), except it is preceded
4694    by 0d 0f 0g or 0h. After observing the STRANGE way my BSD AS does its
4695    reading, I decided to be incompatible. This always tries to give you
4696    rounded bits to the precision of the pseudo-op. Former AS did premature
4697    truncation, restored noisy bits instead of trailing 0s AND gave you
4698    a choice of 2 flavours of noise according to which of 2 floating-point
4699    scanners you directed AS to use.
4700
4701    In:  input_line_pointer->whitespace before, or '0' of flonum.  */
4702
4703 void
4704 float_cons (/* Clobbers input_line-pointer, checks end-of-line.  */
4705             int float_type      /* 'f':.ffloat ... 'F':.float ...  */)
4706 {
4707   char *p;
4708   int length;                   /* Number of chars in an object.  */
4709   char *err;            /* Error from scanning floating literal.  */
4710   char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
4711
4712   if (is_it_end_of_statement ())
4713     {
4714       demand_empty_rest_of_line ();
4715       return;
4716     }
4717
4718 #ifdef md_flush_pending_output
4719   md_flush_pending_output ();
4720 #endif
4721
4722 #ifdef md_cons_align
4723   md_cons_align (1);
4724 #endif
4725
4726   do
4727     {
4728       /* input_line_pointer->1st char of a flonum (we hope!).  */
4729       SKIP_WHITESPACE ();
4730
4731       /* Skip any 0{letter} that may be present. Don't even check if the
4732          letter is legal. Someone may invent a "z" format and this routine
4733          has no use for such information. Lusers beware: you get
4734          diagnostics if your input is ill-conditioned.  */
4735       if (input_line_pointer[0] == '0'
4736           && ISALPHA (input_line_pointer[1]))
4737         input_line_pointer += 2;
4738
4739       /* Accept :xxxx, where the x's are hex digits, for a floating
4740          point with the exact digits specified.  */
4741       if (input_line_pointer[0] == ':')
4742         {
4743           ++input_line_pointer;
4744           length = hex_float (float_type, temp);
4745           if (length < 0)
4746             {
4747               ignore_rest_of_line ();
4748               return;
4749             }
4750         }
4751       else
4752         {
4753           err = md_atof (float_type, temp, &length);
4754           know (length <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
4755           know (err != NULL || length > 0);
4756           if (err)
4757             {
4758               as_bad (_("bad floating literal: %s"), err);
4759               ignore_rest_of_line ();
4760               return;
4761             }
4762         }
4763
4764       if (!need_pass_2)
4765         {
4766           int count;
4767
4768           count = 1;
4769
4770 #ifdef REPEAT_CONS_EXPRESSIONS
4771           if (*input_line_pointer == ':')
4772             {
4773               expressionS count_exp;
4774
4775               ++input_line_pointer;
4776               expression (&count_exp);
4777
4778               if (count_exp.X_op != O_constant
4779                   || count_exp.X_add_number <= 0)
4780                 as_warn (_("unresolvable or nonpositive repeat count; using 1"));
4781               else
4782                 count = count_exp.X_add_number;
4783             }
4784 #endif
4785
4786           while (--count >= 0)
4787             {
4788               p = frag_more (length);
4789               memcpy (p, temp, (unsigned int) length);
4790             }
4791         }
4792       SKIP_WHITESPACE ();
4793     }
4794   while (*input_line_pointer++ == ',');
4795
4796   /* Put terminator back into stream.  */
4797   --input_line_pointer;
4798   demand_empty_rest_of_line ();
4799 }
4800 \f
4801 /* Return the size of a LEB128 value.  */
4802
4803 static inline int
4804 sizeof_sleb128 (offsetT value)
4805 {
4806   int size = 0;
4807   unsigned byte;
4808
4809   do
4810     {
4811       byte = (value & 0x7f);
4812       /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
4813          Fortunately, we can structure things so that the extra work reduces
4814          to a noop on systems that do things "properly".  */
4815       value = (value >> 7) | ~(-(offsetT)1 >> 7);
4816       size += 1;
4817     }
4818   while (!(((value == 0) && ((byte & 0x40) == 0))
4819            || ((value == -1) && ((byte & 0x40) != 0))));
4820
4821   return size;
4822 }
4823
4824 static inline int
4825 sizeof_uleb128 (valueT value)
4826 {
4827   int size = 0;
4828
4829   do
4830     {
4831       value >>= 7;
4832       size += 1;
4833     }
4834   while (value != 0);
4835
4836   return size;
4837 }
4838
4839 int
4840 sizeof_leb128 (valueT value, int sign)
4841 {
4842   if (sign)
4843     return sizeof_sleb128 ((offsetT) value);
4844   else
4845     return sizeof_uleb128 (value);
4846 }
4847
4848 /* Output a LEB128 value.  */
4849
4850 static inline int
4851 output_sleb128 (char *p, offsetT value)
4852 {
4853   char *orig = p;
4854   int more;
4855
4856   do
4857     {
4858       unsigned byte = (value & 0x7f);
4859
4860       /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
4861          Fortunately, we can structure things so that the extra work reduces
4862          to a noop on systems that do things "properly".  */
4863       value = (value >> 7) | ~(-(offsetT)1 >> 7);
4864
4865       more = !((((value == 0) && ((byte & 0x40) == 0))
4866                 || ((value == -1) && ((byte & 0x40) != 0))));
4867       if (more)
4868         byte |= 0x80;
4869
4870       *p++ = byte;
4871     }
4872   while (more);
4873
4874   return p - orig;
4875 }
4876
4877 static inline int
4878 output_uleb128 (char *p, valueT value)
4879 {
4880   char *orig = p;
4881
4882   do
4883     {
4884       unsigned byte = (value & 0x7f);
4885       value >>= 7;
4886       if (value != 0)
4887         /* More bytes to follow.  */
4888         byte |= 0x80;
4889
4890       *p++ = byte;
4891     }
4892   while (value != 0);
4893
4894   return p - orig;
4895 }
4896
4897 int
4898 output_leb128 (char *p, valueT value, int sign)
4899 {
4900   if (sign)
4901     return output_sleb128 (p, (offsetT) value);
4902   else
4903     return output_uleb128 (p, value);
4904 }
4905
4906 /* Do the same for bignums.  We combine sizeof with output here in that
4907    we don't output for NULL values of P.  It isn't really as critical as
4908    for "normal" values that this be streamlined.  */
4909
4910 static inline int
4911 output_big_sleb128 (char *p, LITTLENUM_TYPE *bignum, int size)
4912 {
4913   char *orig = p;
4914   valueT val = 0;
4915   int loaded = 0;
4916   unsigned byte;
4917
4918   /* Strip leading sign extensions off the bignum.  */
4919   while (size > 1
4920          && bignum[size - 1] == LITTLENUM_MASK
4921          && bignum[size - 2] > LITTLENUM_MASK / 2)
4922     size--;
4923
4924   do
4925     {
4926       /* OR in the next part of the littlenum.  */
4927       val |= (*bignum << loaded);
4928       loaded += LITTLENUM_NUMBER_OF_BITS;
4929       size--;
4930       bignum++;
4931
4932       /* Add bytes until there are less than 7 bits left in VAL
4933          or until every non-sign bit has been written.  */
4934       do
4935         {
4936           byte = val & 0x7f;
4937           loaded -= 7;
4938           val >>= 7;
4939           if (size > 0
4940               || val != ((byte & 0x40) == 0 ? 0 : ((valueT) 1 << loaded) - 1))
4941             byte |= 0x80;
4942
4943           if (orig)
4944             *p = byte;
4945           p++;
4946         }
4947       while ((byte & 0x80) != 0 && loaded >= 7);
4948     }
4949   while (size > 0);
4950
4951   /* Mop up any left-over bits (of which there will be less than 7).  */
4952   if ((byte & 0x80) != 0)
4953     {
4954       /* Sign-extend VAL.  */
4955       if (val & (1 << (loaded - 1)))
4956         val |= ~0 << loaded;
4957       if (orig)
4958         *p = val & 0x7f;
4959       p++;
4960     }
4961
4962   return p - orig;
4963 }
4964
4965 static inline int
4966 output_big_uleb128 (char *p, LITTLENUM_TYPE *bignum, int size)
4967 {
4968   char *orig = p;
4969   valueT val = 0;
4970   int loaded = 0;
4971   unsigned byte;
4972
4973   /* Strip leading zeros off the bignum.  */
4974   /* XXX: Is this needed?  */
4975   while (size > 0 && bignum[size - 1] == 0)
4976     size--;
4977
4978   do
4979     {
4980       if (loaded < 7 && size > 0)
4981         {
4982           val |= (*bignum << loaded);
4983           loaded += 8 * CHARS_PER_LITTLENUM;
4984           size--;
4985           bignum++;
4986         }
4987
4988       byte = val & 0x7f;
4989       loaded -= 7;
4990       val >>= 7;
4991
4992       if (size > 0 || val)
4993         byte |= 0x80;
4994
4995       if (orig)
4996         *p = byte;
4997       p++;
4998     }
4999   while (byte & 0x80);
5000
5001   return p - orig;
5002 }
5003
5004 static int
5005 output_big_leb128 (char *p, LITTLENUM_TYPE *bignum, int size, int sign)
5006 {
5007   if (sign)
5008     return output_big_sleb128 (p, bignum, size);
5009   else
5010     return output_big_uleb128 (p, bignum, size);
5011 }
5012
5013 /* Generate the appropriate fragments for a given expression to emit a
5014    leb128 value.  */
5015
5016 static void
5017 emit_leb128_expr (expressionS *exp, int sign)
5018 {
5019   operatorT op = exp->X_op;
5020   unsigned int nbytes;
5021
5022   if (op == O_absent || op == O_illegal)
5023     {
5024       as_warn (_("zero assumed for missing expression"));
5025       exp->X_add_number = 0;
5026       op = O_constant;
5027     }
5028   else if (op == O_big && exp->X_add_number <= 0)
5029     {
5030       as_bad (_("floating point number invalid"));
5031       exp->X_add_number = 0;
5032       op = O_constant;
5033     }
5034   else if (op == O_register)
5035     {
5036       as_warn (_("register value used as expression"));
5037       op = O_constant;
5038     }
5039   else if (op == O_constant
5040            && sign
5041            && (exp->X_add_number < 0) != !exp->X_unsigned)
5042     {
5043       /* We're outputting a signed leb128 and the sign of X_add_number
5044          doesn't reflect the sign of the original value.  Convert EXP
5045          to a correctly-extended bignum instead.  */
5046       convert_to_bignum (exp);
5047       op = O_big;
5048     }
5049
5050   /* Let check_eh_frame know that data is being emitted.  nbytes == -1 is
5051      a signal that this is leb128 data.  It shouldn't optimize this away.  */
5052   nbytes = (unsigned int) -1;
5053   if (check_eh_frame (exp, &nbytes))
5054     abort ();
5055
5056   /* Let the backend know that subsequent data may be byte aligned.  */
5057 #ifdef md_cons_align
5058   md_cons_align (1);
5059 #endif
5060
5061   if (op == O_constant)
5062     {
5063       /* If we've got a constant, emit the thing directly right now.  */
5064
5065       valueT value = exp->X_add_number;
5066       int size;
5067       char *p;
5068
5069       size = sizeof_leb128 (value, sign);
5070       p = frag_more (size);
5071       output_leb128 (p, value, sign);
5072     }
5073   else if (op == O_big)
5074     {
5075       /* O_big is a different sort of constant.  */
5076
5077       int size;
5078       char *p;
5079
5080       size = output_big_leb128 (NULL, generic_bignum, exp->X_add_number, sign);
5081       p = frag_more (size);
5082       output_big_leb128 (p, generic_bignum, exp->X_add_number, sign);
5083     }
5084   else
5085     {
5086       /* Otherwise, we have to create a variable sized fragment and
5087          resolve things later.  */
5088
5089       frag_var (rs_leb128, sizeof_uleb128 (~(valueT) 0), 0, sign,
5090                 make_expr_symbol (exp), 0, (char *) NULL);
5091     }
5092 }
5093
5094 /* Parse the .sleb128 and .uleb128 pseudos.  */
5095
5096 void
5097 s_leb128 (int sign)
5098 {
5099   expressionS exp;
5100
5101 #ifdef md_flush_pending_output
5102   md_flush_pending_output ();
5103 #endif
5104
5105   do
5106     {
5107       expression (&exp);
5108       emit_leb128_expr (&exp, sign);
5109     }
5110   while (*input_line_pointer++ == ',');
5111
5112   input_line_pointer--;
5113   demand_empty_rest_of_line ();
5114 }
5115 \f
5116 static void
5117 stringer_append_char (int c, int bitsize)
5118 {
5119   if (!target_big_endian)
5120     FRAG_APPEND_1_CHAR (c);
5121
5122   switch (bitsize)
5123     {
5124     case 64:
5125       FRAG_APPEND_1_CHAR (0);
5126       FRAG_APPEND_1_CHAR (0);
5127       FRAG_APPEND_1_CHAR (0);
5128       FRAG_APPEND_1_CHAR (0);
5129       /* Fall through.  */
5130     case 32:
5131       FRAG_APPEND_1_CHAR (0);
5132       FRAG_APPEND_1_CHAR (0);
5133       /* Fall through.  */
5134     case 16:
5135       FRAG_APPEND_1_CHAR (0);
5136       /* Fall through.  */
5137     case 8:
5138       break;
5139     default:
5140       /* Called with invalid bitsize argument.  */
5141       abort ();
5142       break;
5143     }
5144   if (target_big_endian)
5145     FRAG_APPEND_1_CHAR (c);
5146 }
5147
5148 /* Worker to do .ascii etc statements.
5149    Reads 0 or more ',' separated, double-quoted strings.
5150    Caller should have checked need_pass_2 is FALSE because we don't
5151    check it.
5152    Checks for end-of-line.
5153    BITS_APPENDZERO says how many bits are in a target char.
5154    The bottom bit is set if a NUL char should be appended to the strings.  */
5155
5156 void
5157 stringer (int bits_appendzero)
5158 {
5159   const int bitsize = bits_appendzero & ~7;
5160   const int append_zero = bits_appendzero & 1;
5161   unsigned int c;
5162 #if !defined(NO_LISTING) && defined (OBJ_ELF)
5163   char *start;
5164 #endif
5165
5166 #ifdef md_flush_pending_output
5167   md_flush_pending_output ();
5168 #endif
5169
5170 #ifdef md_cons_align
5171   md_cons_align (1);
5172 #endif
5173
5174   /* The following awkward logic is to parse ZERO or more strings,
5175      comma separated. Recall a string expression includes spaces
5176      before the opening '\"' and spaces after the closing '\"'.
5177      We fake a leading ',' if there is (supposed to be)
5178      a 1st, expression. We keep demanding expressions for each ','.  */
5179   if (is_it_end_of_statement ())
5180     {
5181       c = 0;                    /* Skip loop.  */
5182       ++input_line_pointer;     /* Compensate for end of loop.  */
5183     }
5184   else
5185     {
5186       c = ',';                  /* Do loop.  */
5187     }
5188   /* If we have been switched into the abs_section then we
5189      will not have an obstack onto which we can hang strings.  */
5190   if (now_seg == absolute_section)
5191     {
5192       as_bad (_("strings must be placed into a section"));
5193       c = 0;
5194       ignore_rest_of_line ();
5195     }
5196
5197   while (c == ',' || c == '<' || c == '"')
5198     {
5199       SKIP_WHITESPACE ();
5200       switch (*input_line_pointer)
5201         {
5202         case '\"':
5203           ++input_line_pointer; /*->1st char of string.  */
5204 #if !defined(NO_LISTING) && defined (OBJ_ELF)
5205           start = input_line_pointer;
5206 #endif
5207
5208           while (is_a_char (c = next_char_of_string ()))
5209             stringer_append_char (c, bitsize);
5210
5211           if (append_zero)
5212             stringer_append_char (0, bitsize);
5213
5214           know (input_line_pointer[-1] == '\"');
5215
5216 #if !defined(NO_LISTING) && defined (OBJ_ELF)
5217           /* In ELF, when gcc is emitting DWARF 1 debugging output, it
5218              will emit .string with a filename in the .debug section
5219              after a sequence of constants.  See the comment in
5220              emit_expr for the sequence.  emit_expr will set
5221              dwarf_file_string to non-zero if this string might be a
5222              source file name.  */
5223           if (strcmp (segment_name (now_seg), ".debug") != 0)
5224             dwarf_file_string = 0;
5225           else if (dwarf_file_string)
5226             {
5227               c = input_line_pointer[-1];
5228               input_line_pointer[-1] = '\0';
5229               listing_source_file (start);
5230               input_line_pointer[-1] = c;
5231             }
5232 #endif
5233
5234           break;
5235         case '<':
5236           input_line_pointer++;
5237           c = get_single_number ();
5238           stringer_append_char (c, bitsize);
5239           if (*input_line_pointer != '>')
5240             as_bad (_("expected <nn>"));
5241
5242           input_line_pointer++;
5243           break;
5244         case ',':
5245           input_line_pointer++;
5246           break;
5247         }
5248       SKIP_WHITESPACE ();
5249       c = *input_line_pointer;
5250     }
5251
5252   demand_empty_rest_of_line ();
5253 }
5254 \f
5255 /* FIXME-SOMEDAY: I had trouble here on characters with the
5256     high bits set.  We'll probably also have trouble with
5257     multibyte chars, wide chars, etc.  Also be careful about
5258     returning values bigger than 1 byte.  xoxorich.  */
5259
5260 unsigned int
5261 next_char_of_string (void)
5262 {
5263   unsigned int c;
5264
5265   c = *input_line_pointer++ & CHAR_MASK;
5266   switch (c)
5267     {
5268     case '\"':
5269       c = NOT_A_CHAR;
5270       break;
5271
5272     case '\n':
5273       as_warn (_("unterminated string; newline inserted"));
5274       bump_line_counters ();
5275       break;
5276
5277 #ifndef NO_STRING_ESCAPES
5278     case '\\':
5279       switch (c = *input_line_pointer++)
5280         {
5281         case 'b':
5282           c = '\b';
5283           break;
5284
5285         case 'f':
5286           c = '\f';
5287           break;
5288
5289         case 'n':
5290           c = '\n';
5291           break;
5292
5293         case 'r':
5294           c = '\r';
5295           break;
5296
5297         case 't':
5298           c = '\t';
5299           break;
5300
5301         case 'v':
5302           c = '\013';
5303           break;
5304
5305         case '\\':
5306         case '"':
5307           break;                /* As itself.  */
5308
5309         case '0':
5310         case '1':
5311         case '2':
5312         case '3':
5313         case '4':
5314         case '5':
5315         case '6':
5316         case '7':
5317         case '8':
5318         case '9':
5319           {
5320             long number;
5321             int i;
5322
5323             for (i = 0, number = 0;
5324                  ISDIGIT (c) && i < 3;
5325                  c = *input_line_pointer++, i++)
5326               {
5327                 number = number * 8 + c - '0';
5328               }
5329
5330             c = number & 0xff;
5331           }
5332           --input_line_pointer;
5333           break;
5334
5335         case 'x':
5336         case 'X':
5337           {
5338             long number;
5339
5340             number = 0;
5341             c = *input_line_pointer++;
5342             while (ISXDIGIT (c))
5343               {
5344                 if (ISDIGIT (c))
5345                   number = number * 16 + c - '0';
5346                 else if (ISUPPER (c))
5347                   number = number * 16 + c - 'A' + 10;
5348                 else
5349                   number = number * 16 + c - 'a' + 10;
5350                 c = *input_line_pointer++;
5351               }
5352             c = number & 0xff;
5353             --input_line_pointer;
5354           }
5355           break;
5356
5357         case '\n':
5358           /* To be compatible with BSD 4.2 as: give the luser a linefeed!!  */
5359           as_warn (_("unterminated string; newline inserted"));
5360           c = '\n';
5361           bump_line_counters ();
5362           break;
5363
5364         default:
5365
5366 #ifdef ONLY_STANDARD_ESCAPES
5367           as_bad (_("bad escaped character in string"));
5368           c = '?';
5369 #endif /* ONLY_STANDARD_ESCAPES */
5370
5371           break;
5372         }
5373       break;
5374 #endif /* ! defined (NO_STRING_ESCAPES) */
5375
5376     default:
5377       break;
5378     }
5379   return (c);
5380 }
5381 \f
5382 static segT
5383 get_segmented_expression (expressionS *expP)
5384 {
5385   segT retval;
5386
5387   retval = expression (expP);
5388   if (expP->X_op == O_illegal
5389       || expP->X_op == O_absent
5390       || expP->X_op == O_big)
5391     {
5392       as_bad (_("expected address expression"));
5393       expP->X_op = O_constant;
5394       expP->X_add_number = 0;
5395       retval = absolute_section;
5396     }
5397   return retval;
5398 }
5399
5400 static segT
5401 get_known_segmented_expression (expressionS *expP)
5402 {
5403   segT retval = get_segmented_expression (expP);
5404
5405   if (retval == undefined_section)
5406     {
5407       /* There is no easy way to extract the undefined symbol from the
5408          expression.  */
5409       if (expP->X_add_symbol != NULL
5410           && S_GET_SEGMENT (expP->X_add_symbol) != expr_section)
5411         as_warn (_("symbol \"%s\" undefined; zero assumed"),
5412                  S_GET_NAME (expP->X_add_symbol));
5413       else
5414         as_warn (_("some symbol undefined; zero assumed"));
5415       retval = absolute_section;
5416       expP->X_op = O_constant;
5417       expP->X_add_number = 0;
5418     }
5419   return retval;
5420 }
5421
5422 char                            /* Return terminator.  */
5423 get_absolute_expression_and_terminator (long *val_pointer /* Return value of expression.  */)
5424 {
5425   /* FIXME: val_pointer should probably be offsetT *.  */
5426   *val_pointer = (long) get_absolute_expression ();
5427   return (*input_line_pointer++);
5428 }
5429 \f
5430 /* Like demand_copy_string, but return NULL if the string contains any '\0's.
5431    Give a warning if that happens.  */
5432
5433 char *
5434 demand_copy_C_string (int *len_pointer)
5435 {
5436   char *s;
5437
5438   if ((s = demand_copy_string (len_pointer)) != 0)
5439     {
5440       int len;
5441
5442       for (len = *len_pointer; len > 0; len--)
5443         {
5444           if (*s == 0)
5445             {
5446               s = 0;
5447               len = 1;
5448               *len_pointer = 0;
5449               as_bad (_("this string may not contain \'\\0\'"));
5450             }
5451         }
5452     }
5453
5454   return s;
5455 }
5456 \f
5457 /* Demand string, but return a safe (=private) copy of the string.
5458    Return NULL if we can't read a string here.  */
5459
5460 char *
5461 demand_copy_string (int *lenP)
5462 {
5463   unsigned int c;
5464   int len;
5465   char *retval;
5466
5467   len = 0;
5468   SKIP_WHITESPACE ();
5469   if (*input_line_pointer == '\"')
5470     {
5471       input_line_pointer++;     /* Skip opening quote.  */
5472
5473       while (is_a_char (c = next_char_of_string ()))
5474         {
5475           obstack_1grow (&notes, c);
5476           len++;
5477         }
5478       /* JF this next line is so demand_copy_C_string will return a
5479          null terminated string.  */
5480       obstack_1grow (&notes, '\0');
5481       retval = (char *) obstack_finish (&notes);
5482     }
5483   else
5484     {
5485       as_bad (_("missing string"));
5486       retval = NULL;
5487       ignore_rest_of_line ();
5488     }
5489   *lenP = len;
5490   return (retval);
5491 }
5492 \f
5493 /* In:  Input_line_pointer->next character.
5494
5495    Do:  Skip input_line_pointer over all whitespace.
5496
5497    Out: 1 if input_line_pointer->end-of-line.  */
5498
5499 int
5500 is_it_end_of_statement (void)
5501 {
5502   SKIP_WHITESPACE ();
5503   return (is_end_of_line[(unsigned char) *input_line_pointer]);
5504 }
5505
5506 void
5507 equals (char *sym_name, int reassign)
5508 {
5509   char *stop = NULL;
5510   char stopc = 0;
5511
5512   input_line_pointer++;
5513   if (*input_line_pointer == '=')
5514     input_line_pointer++;
5515   if (reassign < 0 && *input_line_pointer == '=')
5516     input_line_pointer++;
5517
5518   while (*input_line_pointer == ' ' || *input_line_pointer == '\t')
5519     input_line_pointer++;
5520
5521   if (flag_mri)
5522     stop = mri_comment_field (&stopc);
5523
5524   assign_symbol (sym_name, reassign >= 0 ? !reassign : reassign);
5525
5526   if (flag_mri)
5527     {
5528       demand_empty_rest_of_line ();
5529       mri_comment_end (stop, stopc);
5530     }
5531 }
5532
5533 /* .incbin -- include a file verbatim at the current location.  */
5534
5535 void
5536 s_incbin (int x ATTRIBUTE_UNUSED)
5537 {
5538   FILE * binfile;
5539   char * path;
5540   char * filename;
5541   char * binfrag;
5542   long   skip = 0;
5543   long   count = 0;
5544   long   bytes;
5545   int    len;
5546
5547 #ifdef md_flush_pending_output
5548   md_flush_pending_output ();
5549 #endif
5550
5551 #ifdef md_cons_align
5552   md_cons_align (1);
5553 #endif
5554
5555   SKIP_WHITESPACE ();
5556   filename = demand_copy_string (& len);
5557   if (filename == NULL)
5558     return;
5559
5560   SKIP_WHITESPACE ();
5561
5562   /* Look for optional skip and count.  */
5563   if (* input_line_pointer == ',')
5564     {
5565       ++ input_line_pointer;
5566       skip = get_absolute_expression ();
5567
5568       SKIP_WHITESPACE ();
5569
5570       if (* input_line_pointer == ',')
5571         {
5572           ++ input_line_pointer;
5573
5574           count = get_absolute_expression ();
5575           if (count == 0)
5576             as_warn (_(".incbin count zero, ignoring `%s'"), filename);
5577
5578           SKIP_WHITESPACE ();
5579         }
5580     }
5581
5582   demand_empty_rest_of_line ();
5583
5584   /* Try opening absolute path first, then try include dirs.  */
5585   binfile = fopen (filename, FOPEN_RB);
5586   if (binfile == NULL)
5587     {
5588       int i;
5589
5590       path = (char *) xmalloc ((unsigned long) len + include_dir_maxlen + 5);
5591
5592       for (i = 0; i < include_dir_count; i++)
5593         {
5594           sprintf (path, "%s/%s", include_dirs[i], filename);
5595
5596           binfile = fopen (path, FOPEN_RB);
5597           if (binfile != NULL)
5598             break;
5599         }
5600
5601       if (binfile == NULL)
5602         as_bad (_("file not found: %s"), filename);
5603     }
5604   else
5605     path = xstrdup (filename);
5606
5607   if (binfile)
5608     {
5609       long   file_len;
5610
5611       register_dependency (path);
5612
5613       /* Compute the length of the file.  */
5614       if (fseek (binfile, 0, SEEK_END) != 0)
5615         {
5616           as_bad (_("seek to end of .incbin file failed `%s'"), path);
5617           goto done;
5618         }
5619       file_len = ftell (binfile);
5620
5621       /* If a count was not specified use the remainder of the file.  */
5622       if (count == 0)
5623         count = file_len - skip;
5624
5625       if (skip < 0 || count < 0 || file_len < 0 || skip + count > file_len)
5626         {
5627           as_bad (_("skip (%ld) or count (%ld) invalid for file size (%ld)"),
5628                   skip, count, file_len);
5629           goto done;
5630         }
5631
5632       if (fseek (binfile, skip, SEEK_SET) != 0)
5633         {
5634           as_bad (_("could not skip to %ld in file `%s'"), skip, path);
5635           goto done;
5636         }
5637
5638       /* Allocate frag space and store file contents in it.  */
5639       binfrag = frag_more (count);
5640
5641       bytes = fread (binfrag, 1, count, binfile);
5642       if (bytes < count)
5643         as_warn (_("truncated file `%s', %ld of %ld bytes read"),
5644                  path, bytes, count);
5645     }
5646 done:
5647   if (binfile != NULL)
5648     fclose (binfile);
5649   if (path)
5650     free (path);
5651 }
5652
5653 /* .include -- include a file at this point.  */
5654
5655 void
5656 s_include (int arg ATTRIBUTE_UNUSED)
5657 {
5658   char *filename;
5659   int i;
5660   FILE *try_file;
5661   char *path;
5662
5663   if (!flag_m68k_mri)
5664     {
5665       filename = demand_copy_string (&i);
5666       if (filename == NULL)
5667         {
5668           /* demand_copy_string has already printed an error and
5669              called ignore_rest_of_line.  */
5670           return;
5671         }
5672     }
5673   else
5674     {
5675       SKIP_WHITESPACE ();
5676       i = 0;
5677       while (!is_end_of_line[(unsigned char) *input_line_pointer]
5678              && *input_line_pointer != ' '
5679              && *input_line_pointer != '\t')
5680         {
5681           obstack_1grow (&notes, *input_line_pointer);
5682           ++input_line_pointer;
5683           ++i;
5684         }
5685
5686       obstack_1grow (&notes, '\0');
5687       filename = (char *) obstack_finish (&notes);
5688       while (!is_end_of_line[(unsigned char) *input_line_pointer])
5689         ++input_line_pointer;
5690     }
5691
5692   demand_empty_rest_of_line ();
5693   path = (char *) xmalloc ((unsigned long) i
5694                            + include_dir_maxlen + 5 /* slop */ );
5695
5696   for (i = 0; i < include_dir_count; i++)
5697     {
5698       strcpy (path, include_dirs[i]);
5699       strcat (path, "/");
5700       strcat (path, filename);
5701       if (0 != (try_file = fopen (path, FOPEN_RT)))
5702         {
5703           fclose (try_file);
5704           goto gotit;
5705         }
5706     }
5707
5708   free (path);
5709   path = filename;
5710 gotit:
5711   /* malloc Storage leak when file is found on path.  FIXME-SOMEDAY.  */
5712   register_dependency (path);
5713   input_scrub_insert_file (path);
5714 }
5715
5716 void
5717 add_include_dir (char *path)
5718 {
5719   int i;
5720
5721   if (include_dir_count == 0)
5722     {
5723       include_dirs = (char **) xmalloc (2 * sizeof (*include_dirs));
5724       include_dirs[0] = ".";    /* Current dir.  */
5725       include_dir_count = 2;
5726     }
5727   else
5728     {
5729       include_dir_count++;
5730       include_dirs =
5731         (char **) realloc (include_dirs,
5732                            include_dir_count * sizeof (*include_dirs));
5733     }
5734
5735   include_dirs[include_dir_count - 1] = path;   /* New one.  */
5736
5737   i = strlen (path);
5738   if (i > include_dir_maxlen)
5739     include_dir_maxlen = i;
5740 }
5741 \f
5742 /* Output debugging information to denote the source file.  */
5743
5744 static void
5745 generate_file_debug (void)
5746 {
5747   if (debug_type == DEBUG_STABS)
5748     stabs_generate_asm_file ();
5749 }
5750
5751 /* Output line number debugging information for the current source line.  */
5752
5753 void
5754 generate_lineno_debug (void)
5755 {
5756   switch (debug_type)
5757     {
5758     case DEBUG_UNSPECIFIED:
5759     case DEBUG_NONE:
5760     case DEBUG_DWARF:
5761       break;
5762     case DEBUG_STABS:
5763       stabs_generate_asm_lineno ();
5764       break;
5765     case DEBUG_ECOFF:
5766       ecoff_generate_asm_lineno ();
5767       break;
5768     case DEBUG_DWARF2:
5769       /* ??? We could here indicate to dwarf2dbg.c that something
5770          has changed.  However, since there is additional backend
5771          support that is required (calling dwarf2_emit_insn), we
5772          let dwarf2dbg.c call as_where on its own.  */
5773       break;
5774     }
5775 }
5776
5777 /* Output debugging information to mark a function entry point or end point.
5778    END_P is zero for .func, and non-zero for .endfunc.  */
5779
5780 void
5781 s_func (int end_p)
5782 {
5783   do_s_func (end_p, NULL);
5784 }
5785
5786 /* Subroutine of s_func so targets can choose a different default prefix.
5787    If DEFAULT_PREFIX is NULL, use the target's "leading char".  */
5788
5789 static void
5790 do_s_func (int end_p, const char *default_prefix)
5791 {
5792   /* Record the current function so that we can issue an error message for
5793      misplaced .func,.endfunc, and also so that .endfunc needs no
5794      arguments.  */
5795   static char *current_name;
5796   static char *current_label;
5797
5798   if (end_p)
5799     {
5800       if (current_name == NULL)
5801         {
5802           as_bad (_("missing .func"));
5803           ignore_rest_of_line ();
5804           return;
5805         }
5806
5807       if (debug_type == DEBUG_STABS)
5808         stabs_generate_asm_endfunc (current_name, current_label);
5809
5810       current_name = current_label = NULL;
5811     }
5812   else /* ! end_p */
5813     {
5814       char *name, *label;
5815       char delim1, delim2;
5816
5817       if (current_name != NULL)
5818         {
5819           as_bad (_(".endfunc missing for previous .func"));
5820           ignore_rest_of_line ();
5821           return;
5822         }
5823
5824       name = input_line_pointer;
5825       delim1 = get_symbol_end ();
5826       name = xstrdup (name);
5827       *input_line_pointer = delim1;
5828       SKIP_WHITESPACE ();
5829       if (*input_line_pointer != ',')
5830         {
5831           if (default_prefix)
5832             {
5833               if (asprintf (&label, "%s%s", default_prefix, name) == -1)
5834                 as_fatal ("%s", xstrerror (errno));
5835             }
5836           else
5837             {
5838               char leading_char = bfd_get_symbol_leading_char (stdoutput);
5839               /* Missing entry point, use function's name with the leading
5840                  char prepended.  */
5841               if (leading_char)
5842                 {
5843                   if (asprintf (&label, "%c%s", leading_char, name) == -1)
5844                     as_fatal ("%s", xstrerror (errno));
5845                 }
5846               else
5847                 label = name;
5848             }
5849         }
5850       else
5851         {
5852           ++input_line_pointer;
5853           SKIP_WHITESPACE ();
5854           label = input_line_pointer;
5855           delim2 = get_symbol_end ();
5856           label = xstrdup (label);
5857           *input_line_pointer = delim2;
5858         }
5859
5860       if (debug_type == DEBUG_STABS)
5861         stabs_generate_asm_func (name, label);
5862
5863       current_name = name;
5864       current_label = label;
5865     }
5866
5867   demand_empty_rest_of_line ();
5868 }
5869 \f
5870 void
5871 s_ignore (int arg ATTRIBUTE_UNUSED)
5872 {
5873   ignore_rest_of_line ();
5874 }
5875
5876 void
5877 read_print_statistics (FILE *file)
5878 {
5879   hash_print_statistics (file, "pseudo-op table", po_hash);
5880 }
5881
5882 /* Inserts the given line into the input stream.
5883
5884    This call avoids macro/conditionals nesting checking, since the contents of
5885    the line are assumed to replace the contents of a line already scanned.
5886
5887    An appropriate use of this function would be substitution of input lines when
5888    called by md_start_line_hook().  The given line is assumed to already be
5889    properly scrubbed.  */
5890
5891 void
5892 input_scrub_insert_line (const char *line)
5893 {
5894   sb newline;
5895   sb_new (&newline);
5896   sb_add_string (&newline, line);
5897   input_scrub_include_sb (&newline, input_line_pointer, 0);
5898   sb_kill (&newline);
5899   buffer_limit = input_scrub_next_buffer (&input_line_pointer);
5900 }
5901
5902 /* Insert a file into the input stream; the path must resolve to an actual
5903    file; no include path searching or dependency registering is performed.  */
5904
5905 void
5906 input_scrub_insert_file (char *path)
5907 {
5908   input_scrub_include_file (path, input_line_pointer);
5909   buffer_limit = input_scrub_next_buffer (&input_line_pointer);
5910 }
5911
5912 /* Find the end of a line, considering quotation and escaping of quotes.  */
5913
5914 #if !defined(TC_SINGLE_QUOTE_STRINGS) && defined(SINGLE_QUOTE_STRINGS)
5915 # define TC_SINGLE_QUOTE_STRINGS 1
5916 #endif
5917
5918 static char *
5919 _find_end_of_line (char *s, int mri_string, int insn ATTRIBUTE_UNUSED,
5920                    int in_macro)
5921 {
5922   char inquote = '\0';
5923   int inescape = 0;
5924
5925   while (!is_end_of_line[(unsigned char) *s]
5926          || (inquote && !ISCNTRL (*s))
5927          || (inquote == '\'' && flag_mri)
5928 #ifdef TC_EOL_IN_INSN
5929          || (insn && TC_EOL_IN_INSN (s))
5930 #endif
5931          /* PR 6926:  When we are parsing the body of a macro the sequence
5932             \@ is special - it refers to the invocation count.  If the @
5933             character happens to be registered as a line-separator character
5934             by the target, then the is_end_of_line[] test above will have
5935             returned true, but we need to ignore the line separating
5936             semantics in this particular case.  */
5937          || (in_macro && inescape && *s == '@')
5938         )
5939     {
5940       if (mri_string && *s == '\'')
5941         inquote ^= *s;
5942       else if (inescape)
5943         inescape = 0;
5944       else if (*s == '\\')
5945         inescape = 1;
5946       else if (!inquote
5947                ? *s == '"'
5948 #ifdef TC_SINGLE_QUOTE_STRINGS
5949                  || (TC_SINGLE_QUOTE_STRINGS && *s == '\'')
5950 #endif
5951                : *s == inquote)
5952         inquote ^= *s;
5953       ++s;
5954     }
5955   if (inquote)
5956     as_warn (_("missing closing `%c'"), inquote);
5957   if (inescape)
5958     as_warn (_("stray `\\'"));
5959   return s;
5960 }
5961
5962 char *
5963 find_end_of_line (char *s, int mri_string)
5964 {
5965   return _find_end_of_line (s, mri_string, 0, 0);
5966 }