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