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