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