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