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