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