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