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