ecoff find_nearest_line and final link leaks
[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 /* Make sure symbol_equated_p() recognizes the symbol as an equate. */
4004 exp.X_add_symbol = make_expr_symbol (&exp);
4005 exp.X_add_number = 0;
4006 exp.X_op = O_symbol;
4007 symbol_set_value_expression (symbolP, &exp);
4008 S_SET_SEGMENT (symbolP, reg_section);
4009 set_zero_frag (symbolP);
4010 break;
4011
4012 case O_symbol:
4013 seg = S_GET_SEGMENT (exp.X_add_symbol);
4014 /* For x=undef+const, create an expression symbol.
4015 For x=x+const, just update x except when x is an undefined symbol
4016 For x=defined+const, evaluate x. */
4017 if (symbolP == exp.X_add_symbol
4018 && (seg != undefined_section
4019 || !symbol_constant_p (symbolP)))
4020 {
4021 *symbol_X_add_number (symbolP) += exp.X_add_number;
4022 break;
4023 }
4024 else if (!S_IS_FORWARD_REF (symbolP) && seg != undefined_section)
4025 {
4026 symbolS *s = exp.X_add_symbol;
4027
4028 if (S_IS_COMMON (s))
4029 as_bad (_("`%s' can't be equated to common symbol `%s'"),
4030 S_GET_NAME (symbolP), S_GET_NAME (s));
4031
4032 S_SET_SEGMENT (symbolP, seg);
4033 S_SET_VALUE (symbolP, exp.X_add_number + S_GET_VALUE (s));
4034 symbol_set_frag (symbolP, symbol_get_frag (s));
4035 copy_symbol_attributes (symbolP, s);
4036 break;
4037 }
4038 S_SET_SEGMENT (symbolP, undefined_section);
4039 symbol_set_value_expression (symbolP, &exp);
4040 copy_symbol_attributes (symbolP, exp.X_add_symbol);
4041 set_zero_frag (symbolP);
4042 break;
4043
4044 default:
4045 /* The value is some complex expression. */
4046 S_SET_SEGMENT (symbolP, expr_section);
4047 symbol_set_value_expression (symbolP, &exp);
4048 set_zero_frag (symbolP);
4049 break;
4050 }
4051 }
4052 \f
4053 /* cons()
4054
4055 CONStruct more frag of .bytes, or .words etc.
4056 Should need_pass_2 be 1 then emit no frag(s).
4057 This understands EXPRESSIONS.
4058
4059 Bug (?)
4060
4061 This has a split personality. We use expression() to read the
4062 value. We can detect if the value won't fit in a byte or word.
4063 But we can't detect if expression() discarded significant digits
4064 in the case of a long. Not worth the crocks required to fix it. */
4065
4066 /* Select a parser for cons expressions. */
4067
4068 /* Some targets need to parse the expression in various fancy ways.
4069 You can define TC_PARSE_CONS_EXPRESSION to do whatever you like
4070 (for example, the HPPA does this). Otherwise, you can define
4071 REPEAT_CONS_EXPRESSIONS to permit repeat counts. If none of these
4072 are defined, which is the normal case, then only simple expressions
4073 are permitted. */
4074
4075 #ifdef TC_M68K
4076 static void
4077 parse_mri_cons (expressionS *exp, unsigned int nbytes);
4078 #endif
4079
4080 #ifndef TC_PARSE_CONS_EXPRESSION
4081 #ifdef REPEAT_CONS_EXPRESSIONS
4082 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
4083 (parse_repeat_cons (EXP, NBYTES), TC_PARSE_CONS_RETURN_NONE)
4084 static void
4085 parse_repeat_cons (expressionS *exp, unsigned int nbytes);
4086 #endif
4087
4088 /* If we haven't gotten one yet, just call expression. */
4089 #ifndef TC_PARSE_CONS_EXPRESSION
4090 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
4091 (expression (EXP), TC_PARSE_CONS_RETURN_NONE)
4092 #endif
4093 #endif
4094
4095 void
4096 do_parse_cons_expression (expressionS *exp,
4097 int nbytes ATTRIBUTE_UNUSED)
4098 {
4099 (void) TC_PARSE_CONS_EXPRESSION (exp, nbytes);
4100 }
4101
4102
4103 /* Worker to do .byte etc statements.
4104 Clobbers input_line_pointer and checks end-of-line. */
4105
4106 static void
4107 cons_worker (int nbytes, /* 1=.byte, 2=.word, 4=.long. */
4108 int rva)
4109 {
4110 int c;
4111 expressionS exp;
4112 char *stop = NULL;
4113 char stopc = 0;
4114
4115 #ifdef md_flush_pending_output
4116 md_flush_pending_output ();
4117 #endif
4118
4119 if (flag_mri)
4120 stop = mri_comment_field (&stopc);
4121
4122 if (is_it_end_of_statement ())
4123 {
4124 demand_empty_rest_of_line ();
4125 if (flag_mri)
4126 mri_comment_end (stop, stopc);
4127 return;
4128 }
4129
4130 if (nbytes == 0)
4131 nbytes = TC_ADDRESS_BYTES ();
4132
4133 #ifdef md_cons_align
4134 md_cons_align (nbytes);
4135 #endif
4136
4137 c = 0;
4138 do
4139 {
4140 TC_PARSE_CONS_RETURN_TYPE ret = TC_PARSE_CONS_RETURN_NONE;
4141 #ifdef TC_CONS_FIX_CHECK
4142 fixS **cur_fix = &frchain_now->fix_tail;
4143
4144 if (*cur_fix != NULL)
4145 cur_fix = &(*cur_fix)->fx_next;
4146 #endif
4147
4148 #ifdef TC_M68K
4149 if (flag_m68k_mri)
4150 parse_mri_cons (&exp, (unsigned int) nbytes);
4151 else
4152 #endif
4153 {
4154 #if 0
4155 if (*input_line_pointer == '"')
4156 {
4157 as_bad (_("unexpected `\"' in expression"));
4158 ignore_rest_of_line ();
4159 return;
4160 }
4161 #endif
4162 ret = TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes);
4163 }
4164
4165 if (rva)
4166 {
4167 if (exp.X_op == O_symbol)
4168 exp.X_op = O_symbol_rva;
4169 else
4170 as_fatal (_("rva without symbol"));
4171 }
4172 emit_expr_with_reloc (&exp, (unsigned int) nbytes, ret);
4173 #ifdef TC_CONS_FIX_CHECK
4174 TC_CONS_FIX_CHECK (&exp, nbytes, *cur_fix);
4175 #endif
4176 ++c;
4177 }
4178 while (*input_line_pointer++ == ',');
4179
4180 /* In MRI mode, after an odd number of bytes, we must align to an
4181 even word boundary, unless the next instruction is a dc.b, ds.b
4182 or dcb.b. */
4183 if (flag_mri && nbytes == 1 && (c & 1) != 0)
4184 mri_pending_align = 1;
4185
4186 input_line_pointer--; /* Put terminator back into stream. */
4187
4188 demand_empty_rest_of_line ();
4189
4190 if (flag_mri)
4191 mri_comment_end (stop, stopc);
4192 }
4193
4194 void
4195 cons (int size)
4196 {
4197 cons_worker (size, 0);
4198 }
4199
4200 void
4201 s_rva (int size)
4202 {
4203 cons_worker (size, 1);
4204 }
4205
4206 /* .reloc offset, reloc_name, symbol+addend. */
4207
4208 static void
4209 s_reloc (int ignore ATTRIBUTE_UNUSED)
4210 {
4211 char *stop = NULL;
4212 char stopc = 0;
4213 expressionS exp;
4214 char *r_name;
4215 int c;
4216 struct reloc_list *reloc;
4217 struct _bfd_rel { const char * name; bfd_reloc_code_real_type code; };
4218 static const struct _bfd_rel bfd_relocs[] =
4219 {
4220 { "NONE", BFD_RELOC_NONE },
4221 { "8", BFD_RELOC_8 },
4222 { "16", BFD_RELOC_16 },
4223 { "32", BFD_RELOC_32 },
4224 { "64", BFD_RELOC_64 }
4225 };
4226
4227 reloc = XNEW (struct reloc_list);
4228
4229 if (flag_mri)
4230 stop = mri_comment_field (&stopc);
4231
4232 expression (&exp);
4233 switch (exp.X_op)
4234 {
4235 case O_illegal:
4236 case O_absent:
4237 case O_big:
4238 case O_register:
4239 as_bad (_("missing or bad offset expression"));
4240 goto err_out;
4241 case O_constant:
4242 exp.X_add_symbol = section_symbol (now_seg);
4243 /* Mark the section symbol used in relocation so that it will be
4244 included in the symbol table. */
4245 symbol_mark_used_in_reloc (exp.X_add_symbol);
4246 exp.X_op = O_symbol;
4247 /* Fallthru */
4248 case O_symbol:
4249 if (exp.X_add_number == 0)
4250 {
4251 reloc->u.a.offset_sym = exp.X_add_symbol;
4252 break;
4253 }
4254 /* Fallthru */
4255 default:
4256 reloc->u.a.offset_sym = make_expr_symbol (&exp);
4257 break;
4258 }
4259
4260 SKIP_WHITESPACE ();
4261 if (*input_line_pointer != ',')
4262 {
4263 as_bad (_("missing reloc type"));
4264 goto err_out;
4265 }
4266
4267 ++input_line_pointer;
4268 SKIP_WHITESPACE ();
4269 c = get_symbol_name (& r_name);
4270 if (strncasecmp (r_name, "BFD_RELOC_", 10) == 0)
4271 {
4272 unsigned int i;
4273
4274 for (reloc->u.a.howto = NULL, i = 0; i < ARRAY_SIZE (bfd_relocs); i++)
4275 if (strcasecmp (r_name + 10, bfd_relocs[i].name) == 0)
4276 {
4277 reloc->u.a.howto = bfd_reloc_type_lookup (stdoutput,
4278 bfd_relocs[i].code);
4279 break;
4280 }
4281 }
4282 else
4283 reloc->u.a.howto = bfd_reloc_name_lookup (stdoutput, r_name);
4284 *input_line_pointer = c;
4285 if (reloc->u.a.howto == NULL)
4286 {
4287 as_bad (_("unrecognized reloc type"));
4288 goto err_out;
4289 }
4290
4291 exp.X_op = O_absent;
4292 SKIP_WHITESPACE_AFTER_NAME ();
4293 if (*input_line_pointer == ',')
4294 {
4295 ++input_line_pointer;
4296 expression (&exp);
4297 }
4298 switch (exp.X_op)
4299 {
4300 case O_illegal:
4301 case O_big:
4302 case O_register:
4303 as_bad (_("bad reloc expression"));
4304 err_out:
4305 ignore_rest_of_line ();
4306 free (reloc);
4307 if (flag_mri)
4308 mri_comment_end (stop, stopc);
4309 return;
4310 case O_absent:
4311 reloc->u.a.sym = NULL;
4312 reloc->u.a.addend = 0;
4313 break;
4314 case O_constant:
4315 reloc->u.a.sym = NULL;
4316 reloc->u.a.addend = exp.X_add_number;
4317 break;
4318 case O_symbol:
4319 reloc->u.a.sym = exp.X_add_symbol;
4320 reloc->u.a.addend = exp.X_add_number;
4321 break;
4322 default:
4323 reloc->u.a.sym = make_expr_symbol (&exp);
4324 reloc->u.a.addend = 0;
4325 break;
4326 }
4327
4328 reloc->file = as_where (&reloc->line);
4329 reloc->next = reloc_list;
4330 reloc_list = reloc;
4331
4332 demand_empty_rest_of_line ();
4333 if (flag_mri)
4334 mri_comment_end (stop, stopc);
4335 }
4336
4337 /* Put the contents of expression EXP into the object file using
4338 NBYTES bytes. If need_pass_2 is 1, this does nothing. */
4339
4340 void
4341 emit_expr (expressionS *exp, unsigned int nbytes)
4342 {
4343 emit_expr_with_reloc (exp, nbytes, TC_PARSE_CONS_RETURN_NONE);
4344 }
4345
4346 void
4347 emit_expr_with_reloc (expressionS *exp,
4348 unsigned int nbytes,
4349 TC_PARSE_CONS_RETURN_TYPE reloc)
4350 {
4351 operatorT op;
4352 char *p;
4353 valueT extra_digit = 0;
4354
4355 /* Don't do anything if we are going to make another pass. */
4356 if (need_pass_2)
4357 return;
4358
4359 frag_grow (nbytes);
4360 dot_value = frag_now_fix ();
4361 dot_frag = frag_now;
4362
4363 #ifndef NO_LISTING
4364 #ifdef OBJ_ELF
4365 /* When gcc emits DWARF 1 debugging pseudo-ops, a line number will
4366 appear as a four byte positive constant in the .line section,
4367 followed by a 2 byte 0xffff. Look for that case here. */
4368 if (strcmp (segment_name (now_seg), ".line") != 0)
4369 dwarf_line = -1;
4370 else if (dwarf_line >= 0
4371 && nbytes == 2
4372 && exp->X_op == O_constant
4373 && (exp->X_add_number == -1 || exp->X_add_number == 0xffff))
4374 listing_source_line ((unsigned int) dwarf_line);
4375 else if (nbytes == 4
4376 && exp->X_op == O_constant
4377 && exp->X_add_number >= 0)
4378 dwarf_line = exp->X_add_number;
4379 else
4380 dwarf_line = -1;
4381
4382 /* When gcc emits DWARF 1 debugging pseudo-ops, a file name will
4383 appear as a 2 byte TAG_compile_unit (0x11) followed by a 2 byte
4384 AT_sibling (0x12) followed by a four byte address of the sibling
4385 followed by a 2 byte AT_name (0x38) followed by the name of the
4386 file. We look for that case here. */
4387 if (strcmp (segment_name (now_seg), ".debug") != 0)
4388 dwarf_file = 0;
4389 else if (dwarf_file == 0
4390 && nbytes == 2
4391 && exp->X_op == O_constant
4392 && exp->X_add_number == 0x11)
4393 dwarf_file = 1;
4394 else if (dwarf_file == 1
4395 && nbytes == 2
4396 && exp->X_op == O_constant
4397 && exp->X_add_number == 0x12)
4398 dwarf_file = 2;
4399 else if (dwarf_file == 2
4400 && nbytes == 4)
4401 dwarf_file = 3;
4402 else if (dwarf_file == 3
4403 && nbytes == 2
4404 && exp->X_op == O_constant
4405 && exp->X_add_number == 0x38)
4406 dwarf_file = 4;
4407 else
4408 dwarf_file = 0;
4409
4410 /* The variable dwarf_file_string tells stringer that the string
4411 may be the name of the source file. */
4412 if (dwarf_file == 4)
4413 dwarf_file_string = 1;
4414 else
4415 dwarf_file_string = 0;
4416 #endif
4417 #endif
4418
4419 if (check_eh_frame (exp, &nbytes))
4420 return;
4421
4422 op = exp->X_op;
4423
4424 /* Handle a negative bignum. */
4425 if (op == O_uminus
4426 && exp->X_add_number == 0
4427 && symbol_get_value_expression (exp->X_add_symbol)->X_op == O_big
4428 && symbol_get_value_expression (exp->X_add_symbol)->X_add_number > 0)
4429 {
4430 int i;
4431 unsigned long carry;
4432
4433 exp = symbol_get_value_expression (exp->X_add_symbol);
4434
4435 /* Negate the bignum: one's complement each digit and add 1. */
4436 carry = 1;
4437 for (i = 0; i < exp->X_add_number; i++)
4438 {
4439 unsigned long next;
4440
4441 next = (((~(generic_bignum[i] & LITTLENUM_MASK))
4442 & LITTLENUM_MASK)
4443 + carry);
4444 generic_bignum[i] = next & LITTLENUM_MASK;
4445 carry = next >> LITTLENUM_NUMBER_OF_BITS;
4446 }
4447
4448 /* We can ignore any carry out, because it will be handled by
4449 extra_digit if it is needed. */
4450
4451 extra_digit = (valueT) -1;
4452 op = O_big;
4453 }
4454
4455 if (op == O_absent || op == O_illegal)
4456 {
4457 as_warn (_("zero assumed for missing expression"));
4458 exp->X_add_number = 0;
4459 op = O_constant;
4460 }
4461 else if (op == O_big && exp->X_add_number <= 0)
4462 {
4463 as_bad (_("floating point number invalid"));
4464 exp->X_add_number = 0;
4465 op = O_constant;
4466 }
4467 else if (op == O_register)
4468 {
4469 as_warn (_("register value used as expression"));
4470 op = O_constant;
4471 }
4472
4473 /* Allow `.word 0' in the absolute section. */
4474 if (now_seg == absolute_section)
4475 {
4476 if (op != O_constant || exp->X_add_number != 0)
4477 as_bad (_("attempt to store value in absolute section"));
4478 abs_section_offset += nbytes;
4479 return;
4480 }
4481
4482 /* Allow `.word 0' in BSS style sections. */
4483 if ((op != O_constant || exp->X_add_number != 0) && in_bss ())
4484 as_bad (_("attempt to store non-zero value in section `%s'"),
4485 segment_name (now_seg));
4486
4487 p = frag_more ((int) nbytes);
4488
4489 if (reloc != TC_PARSE_CONS_RETURN_NONE)
4490 {
4491 emit_expr_fix (exp, nbytes, frag_now, p, reloc);
4492 return;
4493 }
4494
4495 #ifndef WORKING_DOT_WORD
4496 /* If we have the difference of two symbols in a word, save it on
4497 the broken_words list. See the code in write.c. */
4498 if (op == O_subtract && nbytes == 2)
4499 {
4500 struct broken_word *x;
4501
4502 x = XNEW (struct broken_word);
4503 x->next_broken_word = broken_words;
4504 broken_words = x;
4505 x->seg = now_seg;
4506 x->subseg = now_subseg;
4507 x->frag = frag_now;
4508 x->word_goes_here = p;
4509 x->dispfrag = 0;
4510 x->add = exp->X_add_symbol;
4511 x->sub = exp->X_op_symbol;
4512 x->addnum = exp->X_add_number;
4513 x->added = 0;
4514 x->use_jump = 0;
4515 new_broken_words++;
4516 return;
4517 }
4518 #endif
4519
4520 /* If we have an integer, but the number of bytes is too large to
4521 pass to md_number_to_chars, handle it as a bignum. */
4522 if (op == O_constant && nbytes > sizeof (valueT))
4523 {
4524 extra_digit = exp->X_unsigned ? 0 : -1;
4525 convert_to_bignum (exp, !exp->X_unsigned);
4526 op = O_big;
4527 }
4528
4529 if (op == O_constant)
4530 {
4531 valueT get;
4532 valueT use;
4533 valueT mask;
4534 valueT unmask;
4535
4536 /* JF << of >= number of bits in the object is undefined. In
4537 particular SPARC (Sun 4) has problems. */
4538 if (nbytes >= sizeof (valueT))
4539 {
4540 know (nbytes == sizeof (valueT));
4541 mask = 0;
4542 }
4543 else
4544 {
4545 /* Don't store these bits. */
4546 mask = ~(valueT) 0 << (BITS_PER_CHAR * nbytes);
4547 }
4548
4549 unmask = ~mask; /* Do store these bits. */
4550
4551 #ifdef NEVER
4552 "Do this mod if you want every overflow check to assume SIGNED 2's complement data.";
4553 mask = ~(unmask >> 1); /* Includes sign bit now. */
4554 #endif
4555
4556 get = exp->X_add_number;
4557 use = get & unmask;
4558 if ((get & mask) != 0 && (-get & mask) != 0)
4559 {
4560 /* Leading bits contain both 0s & 1s. */
4561 as_warn (_("value 0x%" PRIx64 " truncated to 0x%" PRIx64),
4562 (uint64_t) get, (uint64_t) use);
4563 }
4564 /* Put bytes in right order. */
4565 md_number_to_chars (p, use, (int) nbytes);
4566 }
4567 else if (op == O_big)
4568 {
4569 unsigned int size;
4570 LITTLENUM_TYPE *nums;
4571
4572 size = exp->X_add_number * CHARS_PER_LITTLENUM;
4573 if (nbytes < size)
4574 {
4575 int i = nbytes / CHARS_PER_LITTLENUM;
4576
4577 if (i != 0)
4578 {
4579 LITTLENUM_TYPE sign = 0;
4580 if ((generic_bignum[--i]
4581 & (1 << (LITTLENUM_NUMBER_OF_BITS - 1))) != 0)
4582 sign = ~(LITTLENUM_TYPE) 0;
4583
4584 while (++i < exp->X_add_number)
4585 if (generic_bignum[i] != sign)
4586 break;
4587 }
4588 else if (nbytes == 1)
4589 {
4590 /* We have nbytes == 1 and CHARS_PER_LITTLENUM == 2 (probably).
4591 Check that bits 8.. of generic_bignum[0] match bit 7
4592 and that they match all of generic_bignum[1..exp->X_add_number]. */
4593 LITTLENUM_TYPE sign = (generic_bignum[0] & (1 << 7)) ? -1 : 0;
4594 LITTLENUM_TYPE himask = LITTLENUM_MASK & ~ 0xFF;
4595
4596 if ((generic_bignum[0] & himask) == (sign & himask))
4597 {
4598 while (++i < exp->X_add_number)
4599 if (generic_bignum[i] != sign)
4600 break;
4601 }
4602 }
4603
4604 if (i < exp->X_add_number)
4605 as_warn (ngettext ("bignum truncated to %d byte",
4606 "bignum truncated to %d bytes",
4607 nbytes),
4608 nbytes);
4609 size = nbytes;
4610 }
4611
4612 if (nbytes == 1)
4613 {
4614 md_number_to_chars (p, (valueT) generic_bignum[0], 1);
4615 return;
4616 }
4617 know (nbytes % CHARS_PER_LITTLENUM == 0);
4618
4619 if (target_big_endian)
4620 {
4621 while (nbytes > size)
4622 {
4623 md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
4624 nbytes -= CHARS_PER_LITTLENUM;
4625 p += CHARS_PER_LITTLENUM;
4626 }
4627
4628 nums = generic_bignum + size / CHARS_PER_LITTLENUM;
4629 while (size >= CHARS_PER_LITTLENUM)
4630 {
4631 --nums;
4632 md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
4633 size -= CHARS_PER_LITTLENUM;
4634 p += CHARS_PER_LITTLENUM;
4635 }
4636 }
4637 else
4638 {
4639 nums = generic_bignum;
4640 while (size >= CHARS_PER_LITTLENUM)
4641 {
4642 md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
4643 ++nums;
4644 size -= CHARS_PER_LITTLENUM;
4645 p += CHARS_PER_LITTLENUM;
4646 nbytes -= CHARS_PER_LITTLENUM;
4647 }
4648
4649 while (nbytes >= CHARS_PER_LITTLENUM)
4650 {
4651 md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
4652 nbytes -= CHARS_PER_LITTLENUM;
4653 p += CHARS_PER_LITTLENUM;
4654 }
4655 }
4656 }
4657 else
4658 emit_expr_fix (exp, nbytes, frag_now, p, TC_PARSE_CONS_RETURN_NONE);
4659 }
4660
4661 void
4662 emit_expr_fix (expressionS *exp, unsigned int nbytes, fragS *frag, char *p,
4663 TC_PARSE_CONS_RETURN_TYPE r ATTRIBUTE_UNUSED)
4664 {
4665 int offset = 0;
4666 unsigned int size = nbytes;
4667
4668 memset (p, 0, size);
4669
4670 /* Generate a fixS to record the symbol value. */
4671
4672 #ifdef TC_CONS_FIX_NEW
4673 TC_CONS_FIX_NEW (frag, p - frag->fr_literal + offset, size, exp, r);
4674 #else
4675 if (r != TC_PARSE_CONS_RETURN_NONE)
4676 {
4677 reloc_howto_type *reloc_howto;
4678
4679 reloc_howto = bfd_reloc_type_lookup (stdoutput, r);
4680 size = bfd_get_reloc_size (reloc_howto);
4681
4682 if (size > nbytes)
4683 {
4684 as_bad (ngettext ("%s relocations do not fit in %u byte",
4685 "%s relocations do not fit in %u bytes",
4686 nbytes),
4687 reloc_howto->name, nbytes);
4688 return;
4689 }
4690 else if (target_big_endian)
4691 offset = nbytes - size;
4692 }
4693 else
4694 switch (size)
4695 {
4696 case 1:
4697 r = BFD_RELOC_8;
4698 break;
4699 case 2:
4700 r = BFD_RELOC_16;
4701 break;
4702 case 3:
4703 r = BFD_RELOC_24;
4704 break;
4705 case 4:
4706 r = BFD_RELOC_32;
4707 break;
4708 case 8:
4709 r = BFD_RELOC_64;
4710 break;
4711 default:
4712 as_bad (_("unsupported BFD relocation size %u"), size);
4713 return;
4714 }
4715 fix_new_exp (frag, p - frag->fr_literal + offset, size,
4716 exp, 0, r);
4717 #endif
4718 }
4719 \f
4720 /* Handle an MRI style string expression. */
4721
4722 #ifdef TC_M68K
4723 static void
4724 parse_mri_cons (expressionS *exp, unsigned int nbytes)
4725 {
4726 if (*input_line_pointer != '\''
4727 && (input_line_pointer[1] != '\''
4728 || (*input_line_pointer != 'A'
4729 && *input_line_pointer != 'E')))
4730 (void) TC_PARSE_CONS_EXPRESSION (exp, nbytes);
4731 else
4732 {
4733 unsigned int scan;
4734 unsigned int result = 0;
4735
4736 /* An MRI style string. Cut into as many bytes as will fit into
4737 a nbyte chunk, left justify if necessary, and separate with
4738 commas so we can try again later. */
4739 if (*input_line_pointer == 'A')
4740 ++input_line_pointer;
4741 else if (*input_line_pointer == 'E')
4742 {
4743 as_bad (_("EBCDIC constants are not supported"));
4744 ++input_line_pointer;
4745 }
4746
4747 input_line_pointer++;
4748 for (scan = 0; scan < nbytes; scan++)
4749 {
4750 if (*input_line_pointer == '\'')
4751 {
4752 if (input_line_pointer[1] == '\'')
4753 {
4754 input_line_pointer++;
4755 }
4756 else
4757 break;
4758 }
4759 result = (result << 8) | (*input_line_pointer++);
4760 }
4761
4762 /* Left justify. */
4763 while (scan < nbytes)
4764 {
4765 result <<= 8;
4766 scan++;
4767 }
4768
4769 /* Create correct expression. */
4770 exp->X_op = O_constant;
4771 exp->X_add_number = result;
4772
4773 /* Fake it so that we can read the next char too. */
4774 if (input_line_pointer[0] != '\'' ||
4775 (input_line_pointer[0] == '\'' && input_line_pointer[1] == '\''))
4776 {
4777 input_line_pointer -= 2;
4778 input_line_pointer[0] = ',';
4779 input_line_pointer[1] = '\'';
4780 }
4781 else
4782 input_line_pointer++;
4783 }
4784 }
4785 #endif /* TC_M68K */
4786 \f
4787 #ifdef REPEAT_CONS_EXPRESSIONS
4788
4789 /* Parse a repeat expression for cons. This is used by the MIPS
4790 assembler. The format is NUMBER:COUNT; NUMBER appears in the
4791 object file COUNT times.
4792
4793 To use this for a target, define REPEAT_CONS_EXPRESSIONS. */
4794
4795 static void
4796 parse_repeat_cons (expressionS *exp, unsigned int nbytes)
4797 {
4798 expressionS count;
4799 int i;
4800
4801 expression (exp);
4802
4803 if (*input_line_pointer != ':')
4804 {
4805 /* No repeat count. */
4806 return;
4807 }
4808
4809 ++input_line_pointer;
4810 expression (&count);
4811 if (count.X_op != O_constant
4812 || count.X_add_number <= 0)
4813 {
4814 as_warn (_("unresolvable or nonpositive repeat count; using 1"));
4815 return;
4816 }
4817
4818 /* The cons function is going to output this expression once. So we
4819 output it count - 1 times. */
4820 for (i = count.X_add_number - 1; i > 0; i--)
4821 emit_expr (exp, nbytes);
4822 }
4823
4824 #endif /* REPEAT_CONS_EXPRESSIONS */
4825 \f
4826 /* Parse a floating point number represented as a hex constant. This
4827 permits users to specify the exact bits they want in the floating
4828 point number. */
4829
4830 static int
4831 hex_float (int float_type, char *bytes)
4832 {
4833 int pad, length = float_length (float_type, &pad);
4834 int i;
4835
4836 if (length < 0)
4837 return length;
4838
4839 /* It would be nice if we could go through expression to parse the
4840 hex constant, but if we get a bignum it's a pain to sort it into
4841 the buffer correctly. */
4842 i = 0;
4843 while (hex_p (*input_line_pointer) || *input_line_pointer == '_')
4844 {
4845 int d;
4846
4847 /* The MRI assembler accepts arbitrary underscores strewn about
4848 through the hex constant, so we ignore them as well. */
4849 if (*input_line_pointer == '_')
4850 {
4851 ++input_line_pointer;
4852 continue;
4853 }
4854
4855 if (i >= length)
4856 {
4857 as_warn (_("floating point constant too large"));
4858 return -1;
4859 }
4860 d = hex_value (*input_line_pointer) << 4;
4861 ++input_line_pointer;
4862 while (*input_line_pointer == '_')
4863 ++input_line_pointer;
4864 if (hex_p (*input_line_pointer))
4865 {
4866 d += hex_value (*input_line_pointer);
4867 ++input_line_pointer;
4868 }
4869 if (target_big_endian)
4870 bytes[i] = d;
4871 else
4872 bytes[length - i - 1] = d;
4873 ++i;
4874 }
4875
4876 if (i < length)
4877 {
4878 if (target_big_endian)
4879 memset (bytes + i, 0, length - i);
4880 else
4881 memset (bytes, 0, length - i);
4882 }
4883
4884 memset (bytes + length, 0, pad);
4885
4886 return length + pad;
4887 }
4888
4889 /* float_cons()
4890
4891 CONStruct some more frag chars of .floats .ffloats etc.
4892 Makes 0 or more new frags.
4893 If need_pass_2 == 1, no frags are emitted.
4894 This understands only floating literals, not expressions. Sorry.
4895
4896 A floating constant is defined by atof_generic(), except it is preceded
4897 by 0d 0f 0g or 0h. After observing the STRANGE way my BSD AS does its
4898 reading, I decided to be incompatible. This always tries to give you
4899 rounded bits to the precision of the pseudo-op. Former AS did premature
4900 truncation, restored noisy bits instead of trailing 0s AND gave you
4901 a choice of 2 flavours of noise according to which of 2 floating-point
4902 scanners you directed AS to use.
4903
4904 In: input_line_pointer->whitespace before, or '0' of flonum. */
4905
4906 void
4907 float_cons (/* Clobbers input_line-pointer, checks end-of-line. */
4908 int float_type /* 'f':.ffloat ... 'F':.float ... */)
4909 {
4910 char *p;
4911 int length; /* Number of chars in an object. */
4912 char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
4913
4914 if (is_it_end_of_statement ())
4915 {
4916 demand_empty_rest_of_line ();
4917 return;
4918 }
4919
4920 if (now_seg == absolute_section)
4921 {
4922 as_bad (_("attempt to store float in absolute section"));
4923 ignore_rest_of_line ();
4924 return;
4925 }
4926
4927 if (in_bss ())
4928 {
4929 as_bad (_("attempt to store float in section `%s'"),
4930 segment_name (now_seg));
4931 ignore_rest_of_line ();
4932 return;
4933 }
4934
4935 #ifdef md_flush_pending_output
4936 md_flush_pending_output ();
4937 #endif
4938
4939 #ifdef md_cons_align
4940 md_cons_align (1);
4941 #endif
4942
4943 do
4944 {
4945 length = parse_one_float (float_type, temp);
4946 if (length < 0)
4947 return;
4948
4949 if (!need_pass_2)
4950 {
4951 int count;
4952
4953 count = 1;
4954
4955 #ifdef REPEAT_CONS_EXPRESSIONS
4956 if (*input_line_pointer == ':')
4957 {
4958 expressionS count_exp;
4959
4960 ++input_line_pointer;
4961 expression (&count_exp);
4962
4963 if (count_exp.X_op != O_constant
4964 || count_exp.X_add_number <= 0)
4965 as_warn (_("unresolvable or nonpositive repeat count; using 1"));
4966 else
4967 count = count_exp.X_add_number;
4968 }
4969 #endif
4970
4971 while (--count >= 0)
4972 {
4973 p = frag_more (length);
4974 memcpy (p, temp, (unsigned int) length);
4975 }
4976 }
4977 SKIP_WHITESPACE ();
4978 }
4979 while (*input_line_pointer++ == ',');
4980
4981 /* Put terminator back into stream. */
4982 --input_line_pointer;
4983 demand_empty_rest_of_line ();
4984 }
4985 \f
4986 /* LEB128 Encoding.
4987
4988 Note - we are using the DWARF standard's definition of LEB128 encoding
4989 where each 7-bit value is a stored in a byte, *not* an octet. This
4990 means that on targets where a byte contains multiple octets there is
4991 a *huge waste of space*. (This also means that we do not have to
4992 have special versions of these functions for when OCTETS_PER_BYTE_POWER
4993 is non-zero).
4994
4995 If the 7-bit values were to be packed into N-bit bytes (where N > 8)
4996 we would then have to consider whether multiple, successive LEB128
4997 values should be packed into the bytes without padding (bad idea) or
4998 whether each LEB128 number is padded out to a whole number of bytes.
4999 Plus you have to decide on the endianness of packing octets into a
5000 byte. */
5001
5002 /* Return the size of a LEB128 value in bytes. */
5003
5004 static inline unsigned int
5005 sizeof_sleb128 (offsetT value)
5006 {
5007 int size = 0;
5008 unsigned byte;
5009
5010 do
5011 {
5012 byte = (value & 0x7f);
5013 /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
5014 Fortunately, we can structure things so that the extra work reduces
5015 to a noop on systems that do things "properly". */
5016 value = (value >> 7) | ~(-(offsetT)1 >> 7);
5017 size += 1;
5018 }
5019 while (!(((value == 0) && ((byte & 0x40) == 0))
5020 || ((value == -1) && ((byte & 0x40) != 0))));
5021
5022 return size;
5023 }
5024
5025 static inline unsigned int
5026 sizeof_uleb128 (valueT value)
5027 {
5028 int size = 0;
5029
5030 do
5031 {
5032 value >>= 7;
5033 size += 1;
5034 }
5035 while (value != 0);
5036
5037 return size;
5038 }
5039
5040 unsigned int
5041 sizeof_leb128 (valueT value, int sign)
5042 {
5043 if (sign)
5044 return sizeof_sleb128 ((offsetT) value);
5045 else
5046 return sizeof_uleb128 (value);
5047 }
5048
5049 /* Output a LEB128 value. Returns the number of bytes used. */
5050
5051 static inline unsigned int
5052 output_sleb128 (char *p, offsetT value)
5053 {
5054 char *orig = p;
5055 int more;
5056
5057 do
5058 {
5059 unsigned byte = (value & 0x7f);
5060
5061 /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
5062 Fortunately, we can structure things so that the extra work reduces
5063 to a noop on systems that do things "properly". */
5064 value = (value >> 7) | ~(-(offsetT)1 >> 7);
5065
5066 more = !((((value == 0) && ((byte & 0x40) == 0))
5067 || ((value == -1) && ((byte & 0x40) != 0))));
5068 if (more)
5069 byte |= 0x80;
5070
5071 *p++ = byte;
5072 }
5073 while (more);
5074
5075 return p - orig;
5076 }
5077
5078 static inline unsigned int
5079 output_uleb128 (char *p, valueT value)
5080 {
5081 char *orig = p;
5082
5083 do
5084 {
5085 unsigned byte = (value & 0x7f);
5086
5087 value >>= 7;
5088 if (value != 0)
5089 /* More bytes to follow. */
5090 byte |= 0x80;
5091
5092 *p++ = byte;
5093 }
5094 while (value != 0);
5095
5096 return p - orig;
5097 }
5098
5099 unsigned int
5100 output_leb128 (char *p, valueT value, int sign)
5101 {
5102 if (sign)
5103 return output_sleb128 (p, (offsetT) value);
5104 else
5105 return output_uleb128 (p, value);
5106 }
5107
5108 /* Do the same for bignums. We combine sizeof with output here in that
5109 we don't output for NULL values of P. It isn't really as critical as
5110 for "normal" values that this be streamlined. Returns the number of
5111 bytes used. */
5112
5113 static inline unsigned int
5114 output_big_sleb128 (char *p, LITTLENUM_TYPE *bignum, unsigned int size)
5115 {
5116 char *orig = p;
5117 valueT val = 0;
5118 int loaded = 0;
5119 unsigned byte;
5120
5121 /* Strip leading sign extensions off the bignum. */
5122 while (size > 1
5123 && bignum[size - 1] == LITTLENUM_MASK
5124 && bignum[size - 2] > LITTLENUM_MASK / 2)
5125 size--;
5126
5127 do
5128 {
5129 /* OR in the next part of the littlenum. */
5130 val |= (*bignum << loaded);
5131 loaded += LITTLENUM_NUMBER_OF_BITS;
5132 size--;
5133 bignum++;
5134
5135 /* Add bytes until there are less than 7 bits left in VAL
5136 or until every non-sign bit has been written. */
5137 do
5138 {
5139 byte = val & 0x7f;
5140 loaded -= 7;
5141 val >>= 7;
5142 if (size > 0
5143 || val != ((byte & 0x40) == 0 ? 0 : ((valueT) 1 << loaded) - 1))
5144 byte |= 0x80;
5145
5146 if (orig)
5147 *p = byte;
5148 p++;
5149 }
5150 while ((byte & 0x80) != 0 && loaded >= 7);
5151 }
5152 while (size > 0);
5153
5154 /* Mop up any left-over bits (of which there will be less than 7). */
5155 if ((byte & 0x80) != 0)
5156 {
5157 /* Sign-extend VAL. */
5158 if (val & (1 << (loaded - 1)))
5159 val |= ~0U << loaded;
5160 if (orig)
5161 *p = val & 0x7f;
5162 p++;
5163 }
5164
5165 return p - orig;
5166 }
5167
5168 static inline unsigned int
5169 output_big_uleb128 (char *p, LITTLENUM_TYPE *bignum, unsigned int size)
5170 {
5171 char *orig = p;
5172 valueT val = 0;
5173 int loaded = 0;
5174 unsigned byte;
5175
5176 /* Strip leading zeros off the bignum. */
5177 /* XXX: Is this needed? */
5178 while (size > 0 && bignum[size - 1] == 0)
5179 size--;
5180
5181 do
5182 {
5183 if (loaded < 7 && size > 0)
5184 {
5185 val |= (*bignum << loaded);
5186 loaded += 8 * CHARS_PER_LITTLENUM;
5187 size--;
5188 bignum++;
5189 }
5190
5191 byte = val & 0x7f;
5192 loaded -= 7;
5193 val >>= 7;
5194
5195 if (size > 0 || val)
5196 byte |= 0x80;
5197
5198 if (orig)
5199 *p = byte;
5200 p++;
5201 }
5202 while (byte & 0x80);
5203
5204 return p - orig;
5205 }
5206
5207 static unsigned int
5208 output_big_leb128 (char *p, LITTLENUM_TYPE *bignum, unsigned int size, int sign)
5209 {
5210 if (sign)
5211 return output_big_sleb128 (p, bignum, size);
5212 else
5213 return output_big_uleb128 (p, bignum, size);
5214 }
5215
5216 /* Generate the appropriate fragments for a given expression to emit a
5217 leb128 value. SIGN is 1 for sleb, 0 for uleb. */
5218
5219 void
5220 emit_leb128_expr (expressionS *exp, int sign)
5221 {
5222 operatorT op = exp->X_op;
5223 unsigned int nbytes;
5224
5225 if (op == O_absent || op == O_illegal)
5226 {
5227 as_warn (_("zero assumed for missing expression"));
5228 exp->X_add_number = 0;
5229 op = O_constant;
5230 }
5231 else if (op == O_big && exp->X_add_number <= 0)
5232 {
5233 as_bad (_("floating point number invalid"));
5234 exp->X_add_number = 0;
5235 op = O_constant;
5236 }
5237 else if (op == O_register)
5238 {
5239 as_warn (_("register value used as expression"));
5240 op = O_constant;
5241 }
5242 else if (op == O_constant
5243 && sign
5244 && (exp->X_add_number < 0) == !exp->X_extrabit)
5245 {
5246 /* We're outputting a signed leb128 and the sign of X_add_number
5247 doesn't reflect the sign of the original value. Convert EXP
5248 to a correctly-extended bignum instead. */
5249 convert_to_bignum (exp, exp->X_extrabit);
5250 op = O_big;
5251 }
5252
5253 if (now_seg == absolute_section)
5254 {
5255 if (op != O_constant || exp->X_add_number != 0)
5256 as_bad (_("attempt to store value in absolute section"));
5257 abs_section_offset++;
5258 return;
5259 }
5260
5261 if ((op != O_constant || exp->X_add_number != 0) && in_bss ())
5262 as_bad (_("attempt to store non-zero value in section `%s'"),
5263 segment_name (now_seg));
5264
5265 /* Let check_eh_frame know that data is being emitted. nbytes == -1 is
5266 a signal that this is leb128 data. It shouldn't optimize this away. */
5267 nbytes = (unsigned int) -1;
5268 if (check_eh_frame (exp, &nbytes))
5269 abort ();
5270
5271 /* Let the backend know that subsequent data may be byte aligned. */
5272 #ifdef md_cons_align
5273 md_cons_align (1);
5274 #endif
5275
5276 if (op == O_constant)
5277 {
5278 /* If we've got a constant, emit the thing directly right now. */
5279
5280 valueT value = exp->X_add_number;
5281 unsigned int size;
5282 char *p;
5283
5284 size = sizeof_leb128 (value, sign);
5285 p = frag_more (size);
5286 if (output_leb128 (p, value, sign) > size)
5287 abort ();
5288 }
5289 else if (op == O_big)
5290 {
5291 /* O_big is a different sort of constant. */
5292 int nbr_digits = exp->X_add_number;
5293 unsigned int size;
5294 char *p;
5295
5296 /* If the leading littenum is 0xffff, prepend a 0 to avoid confusion with
5297 a signed number. Unary operators like - or ~ always extend the
5298 bignum to its largest size. */
5299 if (exp->X_unsigned
5300 && nbr_digits < SIZE_OF_LARGE_NUMBER
5301 && generic_bignum[nbr_digits - 1] == LITTLENUM_MASK)
5302 generic_bignum[nbr_digits++] = 0;
5303
5304 size = output_big_leb128 (NULL, generic_bignum, nbr_digits, sign);
5305 p = frag_more (size);
5306 if (output_big_leb128 (p, generic_bignum, nbr_digits, sign) > size)
5307 abort ();
5308 }
5309 else
5310 {
5311 /* Otherwise, we have to create a variable sized fragment and
5312 resolve things later. */
5313
5314 frag_var (rs_leb128, sizeof_uleb128 (~(valueT) 0), 0, sign,
5315 make_expr_symbol (exp), 0, (char *) NULL);
5316 }
5317 }
5318
5319 /* Parse the .sleb128 and .uleb128 pseudos. */
5320
5321 void
5322 s_leb128 (int sign)
5323 {
5324 expressionS exp;
5325
5326 #ifdef md_flush_pending_output
5327 md_flush_pending_output ();
5328 #endif
5329
5330 do
5331 {
5332 expression (&exp);
5333 emit_leb128_expr (&exp, sign);
5334 }
5335 while (*input_line_pointer++ == ',');
5336
5337 input_line_pointer--;
5338 demand_empty_rest_of_line ();
5339 }
5340 \f
5341 static void
5342 stringer_append_char (int c, int bitsize)
5343 {
5344 if (c && in_bss ())
5345 as_bad (_("attempt to store non-empty string in section `%s'"),
5346 segment_name (now_seg));
5347
5348 if (!target_big_endian)
5349 FRAG_APPEND_1_CHAR (c);
5350
5351 switch (bitsize)
5352 {
5353 case 64:
5354 FRAG_APPEND_1_CHAR (0);
5355 FRAG_APPEND_1_CHAR (0);
5356 FRAG_APPEND_1_CHAR (0);
5357 FRAG_APPEND_1_CHAR (0);
5358 /* Fall through. */
5359 case 32:
5360 FRAG_APPEND_1_CHAR (0);
5361 FRAG_APPEND_1_CHAR (0);
5362 /* Fall through. */
5363 case 16:
5364 FRAG_APPEND_1_CHAR (0);
5365 /* Fall through. */
5366 case 8:
5367 break;
5368 default:
5369 /* Called with invalid bitsize argument. */
5370 abort ();
5371 break;
5372 }
5373 if (target_big_endian)
5374 FRAG_APPEND_1_CHAR (c);
5375 }
5376
5377 /* Worker to do .ascii etc statements.
5378 Reads 0 or more ',' separated, double-quoted strings.
5379 Caller should have checked need_pass_2 is FALSE because we don't
5380 check it.
5381 Checks for end-of-line.
5382 BITS_APPENDZERO says how many bits are in a target char.
5383 The bottom bit is set if a NUL char should be appended to the strings. */
5384
5385 void
5386 stringer (int bits_appendzero)
5387 {
5388 const int bitsize = bits_appendzero & ~7;
5389 const int append_zero = bits_appendzero & 1;
5390 unsigned int c;
5391 #if !defined(NO_LISTING) && defined (OBJ_ELF)
5392 char *start;
5393 #endif
5394
5395 #ifdef md_flush_pending_output
5396 md_flush_pending_output ();
5397 #endif
5398
5399 #ifdef md_cons_align
5400 md_cons_align (1);
5401 #endif
5402
5403 /* If we have been switched into the abs_section then we
5404 will not have an obstack onto which we can hang strings. */
5405 if (now_seg == absolute_section)
5406 {
5407 as_bad (_("strings must be placed into a section"));
5408 ignore_rest_of_line ();
5409 return;
5410 }
5411
5412 /* The following awkward logic is to parse ZERO or more strings,
5413 comma separated. Recall a string expression includes spaces
5414 before the opening '\"' and spaces after the closing '\"'.
5415 We fake a leading ',' if there is (supposed to be)
5416 a 1st, expression. We keep demanding expressions for each ','. */
5417 if (is_it_end_of_statement ())
5418 {
5419 c = 0; /* Skip loop. */
5420 ++input_line_pointer; /* Compensate for end of loop. */
5421 }
5422 else
5423 {
5424 c = ','; /* Do loop. */
5425 }
5426
5427 while (c == ',' || c == '<' || c == '"')
5428 {
5429 SKIP_WHITESPACE ();
5430 switch (*input_line_pointer)
5431 {
5432 case '\"':
5433 ++input_line_pointer; /*->1st char of string. */
5434 #if !defined(NO_LISTING) && defined (OBJ_ELF)
5435 start = input_line_pointer;
5436 #endif
5437
5438 while (is_a_char (c = next_char_of_string ()))
5439 stringer_append_char (c, bitsize);
5440
5441 /* Treat "a" "b" as "ab". Even if we are appending zeros. */
5442 SKIP_ALL_WHITESPACE ();
5443 if (*input_line_pointer == '"')
5444 break;
5445
5446 if (append_zero)
5447 stringer_append_char (0, bitsize);
5448
5449 #if !defined(NO_LISTING) && defined (OBJ_ELF)
5450 /* In ELF, when gcc is emitting DWARF 1 debugging output, it
5451 will emit .string with a filename in the .debug section
5452 after a sequence of constants. See the comment in
5453 emit_expr for the sequence. emit_expr will set
5454 dwarf_file_string to non-zero if this string might be a
5455 source file name. */
5456 if (strcmp (segment_name (now_seg), ".debug") != 0)
5457 dwarf_file_string = 0;
5458 else if (dwarf_file_string)
5459 {
5460 c = input_line_pointer[-1];
5461 input_line_pointer[-1] = '\0';
5462 listing_source_file (start);
5463 input_line_pointer[-1] = c;
5464 }
5465 #endif
5466
5467 break;
5468 case '<':
5469 input_line_pointer++;
5470 c = get_single_number ();
5471 stringer_append_char (c, bitsize);
5472 if (*input_line_pointer != '>')
5473 {
5474 as_bad (_("expected <nn>"));
5475 ignore_rest_of_line ();
5476 return;
5477 }
5478 input_line_pointer++;
5479 break;
5480 case ',':
5481 input_line_pointer++;
5482 break;
5483 }
5484 SKIP_WHITESPACE ();
5485 c = *input_line_pointer;
5486 }
5487
5488 demand_empty_rest_of_line ();
5489 }
5490 \f
5491 /* FIXME-SOMEDAY: I had trouble here on characters with the
5492 high bits set. We'll probably also have trouble with
5493 multibyte chars, wide chars, etc. Also be careful about
5494 returning values bigger than 1 byte. xoxorich. */
5495
5496 unsigned int
5497 next_char_of_string (void)
5498 {
5499 unsigned int c;
5500
5501 c = *input_line_pointer++ & CHAR_MASK;
5502 switch (c)
5503 {
5504 case 0:
5505 /* PR 20902: Do not advance past the end of the buffer. */
5506 -- input_line_pointer;
5507 c = NOT_A_CHAR;
5508 break;
5509
5510 case '\"':
5511 c = NOT_A_CHAR;
5512 break;
5513
5514 case '\n':
5515 as_warn (_("unterminated string; newline inserted"));
5516 bump_line_counters ();
5517 break;
5518
5519 case '\\':
5520 if (!TC_STRING_ESCAPES)
5521 break;
5522 switch (c = *input_line_pointer++ & CHAR_MASK)
5523 {
5524 case 'b':
5525 c = '\b';
5526 break;
5527
5528 case 'f':
5529 c = '\f';
5530 break;
5531
5532 case 'n':
5533 c = '\n';
5534 break;
5535
5536 case 'r':
5537 c = '\r';
5538 break;
5539
5540 case 't':
5541 c = '\t';
5542 break;
5543
5544 case 'v':
5545 c = '\013';
5546 break;
5547
5548 case '\\':
5549 case '"':
5550 break; /* As itself. */
5551
5552 case '0':
5553 case '1':
5554 case '2':
5555 case '3':
5556 case '4':
5557 case '5':
5558 case '6':
5559 case '7':
5560 case '8':
5561 case '9':
5562 {
5563 unsigned number;
5564 int i;
5565
5566 for (i = 0, number = 0;
5567 ISDIGIT (c) && i < 3;
5568 c = *input_line_pointer++, i++)
5569 {
5570 number = number * 8 + c - '0';
5571 }
5572
5573 c = number & CHAR_MASK;
5574 }
5575 --input_line_pointer;
5576 break;
5577
5578 case 'x':
5579 case 'X':
5580 {
5581 unsigned number;
5582
5583 number = 0;
5584 c = *input_line_pointer++;
5585 while (ISXDIGIT (c))
5586 {
5587 if (ISDIGIT (c))
5588 number = number * 16 + c - '0';
5589 else if (ISUPPER (c))
5590 number = number * 16 + c - 'A' + 10;
5591 else
5592 number = number * 16 + c - 'a' + 10;
5593 c = *input_line_pointer++;
5594 }
5595 c = number & CHAR_MASK;
5596 --input_line_pointer;
5597 }
5598 break;
5599
5600 case '\n':
5601 /* To be compatible with BSD 4.2 as: give the luser a linefeed!! */
5602 as_warn (_("unterminated string; newline inserted"));
5603 c = '\n';
5604 bump_line_counters ();
5605 break;
5606
5607 case 0:
5608 /* Do not advance past the end of the buffer. */
5609 -- input_line_pointer;
5610 c = NOT_A_CHAR;
5611 break;
5612
5613 default:
5614
5615 #ifdef ONLY_STANDARD_ESCAPES
5616 as_bad (_("bad escaped character in string"));
5617 c = '?';
5618 #endif /* ONLY_STANDARD_ESCAPES */
5619
5620 break;
5621 }
5622 break;
5623
5624 default:
5625 break;
5626 }
5627 return (c);
5628 }
5629 \f
5630 static segT
5631 get_segmented_expression (expressionS *expP)
5632 {
5633 segT retval;
5634
5635 retval = expression (expP);
5636 if (expP->X_op == O_illegal
5637 || expP->X_op == O_absent
5638 || expP->X_op == O_big)
5639 {
5640 as_bad (_("expected address expression"));
5641 expP->X_op = O_constant;
5642 expP->X_add_number = 0;
5643 retval = absolute_section;
5644 }
5645 return retval;
5646 }
5647
5648 static segT
5649 get_known_segmented_expression (expressionS *expP)
5650 {
5651 segT retval = get_segmented_expression (expP);
5652
5653 if (retval == undefined_section)
5654 {
5655 /* There is no easy way to extract the undefined symbol from the
5656 expression. */
5657 if (expP->X_add_symbol != NULL
5658 && S_GET_SEGMENT (expP->X_add_symbol) != expr_section)
5659 as_warn (_("symbol \"%s\" undefined; zero assumed"),
5660 S_GET_NAME (expP->X_add_symbol));
5661 else
5662 as_warn (_("some symbol undefined; zero assumed"));
5663 retval = absolute_section;
5664 expP->X_op = O_constant;
5665 expP->X_add_number = 0;
5666 }
5667 return retval;
5668 }
5669
5670 char /* Return terminator. */
5671 get_absolute_expression_and_terminator (long *val_pointer /* Return value of expression. */)
5672 {
5673 /* FIXME: val_pointer should probably be offsetT *. */
5674 *val_pointer = (long) get_absolute_expression ();
5675 return (*input_line_pointer++);
5676 }
5677 \f
5678 /* Like demand_copy_string, but return NULL if the string contains any '\0's.
5679 Give a warning if that happens. */
5680
5681 char *
5682 demand_copy_C_string (int *len_pointer)
5683 {
5684 char *s;
5685
5686 if ((s = demand_copy_string (len_pointer)) != 0)
5687 {
5688 int len;
5689
5690 for (len = *len_pointer; len > 0; len--)
5691 {
5692 if (s[len - 1] == 0)
5693 {
5694 s = 0;
5695 *len_pointer = 0;
5696 as_bad (_("this string may not contain \'\\0\'"));
5697 break;
5698 }
5699 }
5700 }
5701
5702 return s;
5703 }
5704 \f
5705 /* Demand string, but return a safe (=private) copy of the string.
5706 Return NULL if we can't read a string here. */
5707
5708 char *
5709 demand_copy_string (int *lenP)
5710 {
5711 unsigned int c;
5712 int len;
5713 char *retval;
5714
5715 len = 0;
5716 SKIP_WHITESPACE ();
5717 if (*input_line_pointer == '\"')
5718 {
5719 input_line_pointer++; /* Skip opening quote. */
5720
5721 while (is_a_char (c = next_char_of_string ()))
5722 {
5723 obstack_1grow (&notes, c);
5724 len++;
5725 }
5726 /* JF this next line is so demand_copy_C_string will return a
5727 null terminated string. */
5728 obstack_1grow (&notes, '\0');
5729 retval = (char *) obstack_finish (&notes);
5730 }
5731 else
5732 {
5733 as_bad (_("missing string"));
5734 retval = NULL;
5735 ignore_rest_of_line ();
5736 }
5737 *lenP = len;
5738 return (retval);
5739 }
5740 \f
5741 /* In: Input_line_pointer->next character.
5742
5743 Do: Skip input_line_pointer over all whitespace.
5744
5745 Out: 1 if input_line_pointer->end-of-line. */
5746
5747 int
5748 is_it_end_of_statement (void)
5749 {
5750 SKIP_WHITESPACE ();
5751 return (is_end_of_line[(unsigned char) *input_line_pointer]);
5752 }
5753
5754 void
5755 equals (char *sym_name, int reassign)
5756 {
5757 char *stop = NULL;
5758 char stopc = 0;
5759
5760 input_line_pointer++;
5761 if (*input_line_pointer == '=')
5762 input_line_pointer++;
5763 if (reassign < 0 && *input_line_pointer == '=')
5764 input_line_pointer++;
5765
5766 while (*input_line_pointer == ' ' || *input_line_pointer == '\t')
5767 input_line_pointer++;
5768
5769 if (flag_mri)
5770 stop = mri_comment_field (&stopc);
5771
5772 assign_symbol (sym_name, reassign >= 0 ? !reassign : reassign);
5773
5774 if (flag_mri)
5775 {
5776 demand_empty_rest_of_line ();
5777 mri_comment_end (stop, stopc);
5778 }
5779 }
5780
5781 /* Open FILENAME, first trying the unadorned file name, then if that
5782 fails and the file name is not an absolute path, attempt to open
5783 the file in current -I include paths. PATH is a preallocated
5784 buffer which will be set to the file opened, or FILENAME if no file
5785 is found. */
5786
5787 FILE *
5788 search_and_open (const char *filename, char *path)
5789 {
5790 FILE *f = fopen (filename, FOPEN_RB);
5791 if (f == NULL && !IS_ABSOLUTE_PATH (filename))
5792 {
5793 for (size_t i = 0; i < include_dir_count; i++)
5794 {
5795 sprintf (path, "%s/%s", include_dirs[i], filename);
5796 f = fopen (path, FOPEN_RB);
5797 if (f != NULL)
5798 return f;
5799 }
5800 }
5801 strcpy (path, filename);
5802 return f;
5803 }
5804
5805 /* .incbin -- include a file verbatim at the current location. */
5806
5807 void
5808 s_incbin (int x ATTRIBUTE_UNUSED)
5809 {
5810 FILE * binfile;
5811 char * path;
5812 char * filename;
5813 char * binfrag;
5814 long skip = 0;
5815 long count = 0;
5816 long bytes;
5817 int len;
5818
5819 #ifdef md_flush_pending_output
5820 md_flush_pending_output ();
5821 #endif
5822
5823 #ifdef md_cons_align
5824 md_cons_align (1);
5825 #endif
5826
5827 SKIP_WHITESPACE ();
5828 filename = demand_copy_string (& len);
5829 if (filename == NULL)
5830 return;
5831
5832 SKIP_WHITESPACE ();
5833
5834 /* Look for optional skip and count. */
5835 if (* input_line_pointer == ',')
5836 {
5837 ++ input_line_pointer;
5838 skip = get_absolute_expression ();
5839
5840 SKIP_WHITESPACE ();
5841
5842 if (* input_line_pointer == ',')
5843 {
5844 ++ input_line_pointer;
5845
5846 count = get_absolute_expression ();
5847 if (count == 0)
5848 as_warn (_(".incbin count zero, ignoring `%s'"), filename);
5849
5850 SKIP_WHITESPACE ();
5851 }
5852 }
5853
5854 demand_empty_rest_of_line ();
5855
5856 path = XNEWVEC (char, len + include_dir_maxlen + 2);
5857 binfile = search_and_open (filename, path);
5858
5859 if (binfile == NULL)
5860 as_bad (_("file not found: %s"), filename);
5861 else
5862 {
5863 long file_len;
5864 struct stat filestat;
5865
5866 if (fstat (fileno (binfile), &filestat) != 0
5867 || ! S_ISREG (filestat.st_mode)
5868 || S_ISDIR (filestat.st_mode))
5869 {
5870 as_bad (_("unable to include `%s'"), path);
5871 goto done;
5872 }
5873
5874 register_dependency (path);
5875
5876 /* Compute the length of the file. */
5877 if (fseek (binfile, 0, SEEK_END) != 0)
5878 {
5879 as_bad (_("seek to end of .incbin file failed `%s'"), path);
5880 goto done;
5881 }
5882 file_len = ftell (binfile);
5883
5884 /* If a count was not specified use the remainder of the file. */
5885 if (count == 0)
5886 count = file_len - skip;
5887
5888 if (skip < 0 || count < 0 || file_len < 0 || skip + count > file_len)
5889 {
5890 as_bad (_("skip (%ld) or count (%ld) invalid for file size (%ld)"),
5891 skip, count, file_len);
5892 goto done;
5893 }
5894
5895 if (fseek (binfile, skip, SEEK_SET) != 0)
5896 {
5897 as_bad (_("could not skip to %ld in file `%s'"), skip, path);
5898 goto done;
5899 }
5900
5901 /* Allocate frag space and store file contents in it. */
5902 binfrag = frag_more (count);
5903
5904 bytes = fread (binfrag, 1, count, binfile);
5905 if (bytes < count)
5906 as_warn (_("truncated file `%s', %ld of %ld bytes read"),
5907 path, bytes, count);
5908 }
5909 done:
5910 if (binfile != NULL)
5911 fclose (binfile);
5912 free (path);
5913 }
5914
5915 /* .include -- include a file at this point. */
5916
5917 void
5918 s_include (int arg ATTRIBUTE_UNUSED)
5919 {
5920 char *filename;
5921 int i;
5922 FILE *try_file;
5923 char *path;
5924
5925 if (!flag_m68k_mri)
5926 {
5927 filename = demand_copy_string (&i);
5928 if (filename == NULL)
5929 {
5930 /* demand_copy_string has already printed an error and
5931 called ignore_rest_of_line. */
5932 return;
5933 }
5934 }
5935 else
5936 {
5937 SKIP_WHITESPACE ();
5938 i = 0;
5939 while (!is_end_of_line[(unsigned char) *input_line_pointer]
5940 && *input_line_pointer != ' '
5941 && *input_line_pointer != '\t')
5942 {
5943 obstack_1grow (&notes, *input_line_pointer);
5944 ++input_line_pointer;
5945 ++i;
5946 }
5947
5948 obstack_1grow (&notes, '\0');
5949 filename = (char *) obstack_finish (&notes);
5950 while (!is_end_of_line[(unsigned char) *input_line_pointer])
5951 ++input_line_pointer;
5952 }
5953
5954 demand_empty_rest_of_line ();
5955
5956 path = notes_alloc (i + include_dir_maxlen + 2);
5957 try_file = search_and_open (filename, path);
5958 if (try_file)
5959 fclose (try_file);
5960
5961 register_dependency (path);
5962 input_scrub_insert_file (path);
5963 }
5964
5965 void
5966 init_include_dir (void)
5967 {
5968 include_dirs = XNEWVEC (const char *, 1);
5969 include_dirs[0] = "."; /* Current dir. */
5970 include_dir_count = 1;
5971 include_dir_maxlen = 1;
5972 }
5973
5974 void
5975 add_include_dir (char *path)
5976 {
5977 include_dir_count++;
5978 include_dirs = XRESIZEVEC (const char *, include_dirs, include_dir_count);
5979 include_dirs[include_dir_count - 1] = path; /* New one. */
5980
5981 size_t i = strlen (path);
5982 if (i > include_dir_maxlen)
5983 include_dir_maxlen = i;
5984 }
5985 \f
5986 /* Output debugging information to denote the source file. */
5987
5988 static void
5989 generate_file_debug (void)
5990 {
5991 if (debug_type == DEBUG_STABS)
5992 stabs_generate_asm_file ();
5993 }
5994
5995 /* Output line number debugging information for the current source line. */
5996
5997 void
5998 generate_lineno_debug (void)
5999 {
6000 switch (debug_type)
6001 {
6002 case DEBUG_UNSPECIFIED:
6003 case DEBUG_NONE:
6004 case DEBUG_DWARF:
6005 break;
6006 case DEBUG_STABS:
6007 stabs_generate_asm_lineno ();
6008 break;
6009 case DEBUG_ECOFF:
6010 ecoff_generate_asm_lineno ();
6011 break;
6012 case DEBUG_DWARF2:
6013 /* ??? We could here indicate to dwarf2dbg.c that something
6014 has changed. However, since there is additional backend
6015 support that is required (calling dwarf2_emit_insn), we
6016 let dwarf2dbg.c call as_where on its own. */
6017 break;
6018 case DEBUG_CODEVIEW:
6019 codeview_generate_asm_lineno ();
6020 break;
6021 }
6022 }
6023
6024 /* Output debugging information to mark a function entry point or end point.
6025 END_P is zero for .func, and non-zero for .endfunc. */
6026
6027 void
6028 s_func (int end_p)
6029 {
6030 do_s_func (end_p, NULL);
6031 }
6032
6033 /* Subroutine of s_func so targets can choose a different default prefix.
6034 If DEFAULT_PREFIX is NULL, use the target's "leading char". */
6035
6036 static void
6037 do_s_func (int end_p, const char *default_prefix)
6038 {
6039 if (end_p)
6040 {
6041 if (current_name == NULL)
6042 {
6043 as_bad (_("missing .func"));
6044 ignore_rest_of_line ();
6045 return;
6046 }
6047
6048 if (debug_type == DEBUG_STABS)
6049 stabs_generate_asm_endfunc (current_name, current_label);
6050
6051 current_name = current_label = NULL;
6052 }
6053 else /* ! end_p */
6054 {
6055 char *name, *label;
6056 char delim1, delim2;
6057
6058 if (current_name != NULL)
6059 {
6060 as_bad (_(".endfunc missing for previous .func"));
6061 ignore_rest_of_line ();
6062 return;
6063 }
6064
6065 delim1 = get_symbol_name (& name);
6066 name = xstrdup (name);
6067 *input_line_pointer = delim1;
6068 SKIP_WHITESPACE_AFTER_NAME ();
6069 if (*input_line_pointer != ',')
6070 {
6071 if (default_prefix)
6072 {
6073 if (asprintf (&label, "%s%s", default_prefix, name) == -1)
6074 as_fatal ("%s", xstrerror (errno));
6075 }
6076 else
6077 {
6078 char leading_char = bfd_get_symbol_leading_char (stdoutput);
6079 /* Missing entry point, use function's name with the leading
6080 char prepended. */
6081 if (leading_char)
6082 {
6083 if (asprintf (&label, "%c%s", leading_char, name) == -1)
6084 as_fatal ("%s", xstrerror (errno));
6085 }
6086 else
6087 label = name;
6088 }
6089 }
6090 else
6091 {
6092 ++input_line_pointer;
6093 SKIP_WHITESPACE ();
6094 delim2 = get_symbol_name (& label);
6095 label = xstrdup (label);
6096 restore_line_pointer (delim2);
6097 }
6098
6099 if (debug_type == DEBUG_STABS)
6100 stabs_generate_asm_func (name, label);
6101
6102 current_name = name;
6103 current_label = label;
6104 }
6105
6106 demand_empty_rest_of_line ();
6107 }
6108 \f
6109 #ifdef HANDLE_BUNDLE
6110
6111 void
6112 s_bundle_align_mode (int arg ATTRIBUTE_UNUSED)
6113 {
6114 unsigned int align = get_absolute_expression ();
6115 SKIP_WHITESPACE ();
6116 demand_empty_rest_of_line ();
6117
6118 if (align > (unsigned int) TC_ALIGN_LIMIT)
6119 as_fatal (_(".bundle_align_mode alignment too large (maximum %u)"),
6120 (unsigned int) TC_ALIGN_LIMIT);
6121
6122 if (bundle_lock_frag != NULL)
6123 {
6124 as_bad (_("cannot change .bundle_align_mode inside .bundle_lock"));
6125 return;
6126 }
6127
6128 bundle_align_p2 = align;
6129 }
6130
6131 void
6132 s_bundle_lock (int arg ATTRIBUTE_UNUSED)
6133 {
6134 demand_empty_rest_of_line ();
6135
6136 if (bundle_align_p2 == 0)
6137 {
6138 as_bad (_(".bundle_lock is meaningless without .bundle_align_mode"));
6139 return;
6140 }
6141
6142 if (bundle_lock_depth == 0)
6143 {
6144 bundle_lock_frchain = frchain_now;
6145 bundle_lock_frag = start_bundle ();
6146 }
6147 ++bundle_lock_depth;
6148 }
6149
6150 void
6151 s_bundle_unlock (int arg ATTRIBUTE_UNUSED)
6152 {
6153 unsigned int size;
6154
6155 demand_empty_rest_of_line ();
6156
6157 if (bundle_lock_frag == NULL)
6158 {
6159 as_bad (_(".bundle_unlock without preceding .bundle_lock"));
6160 return;
6161 }
6162
6163 gas_assert (bundle_align_p2 > 0);
6164
6165 gas_assert (bundle_lock_depth > 0);
6166 if (--bundle_lock_depth > 0)
6167 return;
6168
6169 size = pending_bundle_size (bundle_lock_frag);
6170
6171 if (size > 1U << bundle_align_p2)
6172 as_bad (_(".bundle_lock sequence is %u bytes, "
6173 "but bundle size is only %u bytes"),
6174 size, 1u << bundle_align_p2);
6175 else
6176 finish_bundle (bundle_lock_frag, size);
6177
6178 bundle_lock_frag = NULL;
6179 bundle_lock_frchain = NULL;
6180 }
6181
6182 #endif /* HANDLE_BUNDLE */
6183 \f
6184 void
6185 s_ignore (int arg ATTRIBUTE_UNUSED)
6186 {
6187 ignore_rest_of_line ();
6188 }
6189
6190 void
6191 read_print_statistics (FILE *file)
6192 {
6193 htab_print_statistics (file, "pseudo-op table", po_hash);
6194 }
6195
6196 /* Inserts the given line into the input stream.
6197
6198 This call avoids macro/conditionals nesting checking, since the contents of
6199 the line are assumed to replace the contents of a line already scanned.
6200
6201 An appropriate use of this function would be substitution of input lines when
6202 called by md_start_line_hook(). The given line is assumed to already be
6203 properly scrubbed. */
6204
6205 void
6206 input_scrub_insert_line (const char *line)
6207 {
6208 sb newline;
6209 size_t len = strlen (line);
6210 sb_build (&newline, len);
6211 sb_add_buffer (&newline, line, len);
6212 input_scrub_include_sb (&newline, input_line_pointer, expanding_none);
6213 sb_kill (&newline);
6214 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
6215 }
6216
6217 /* Insert a file into the input stream; the path must resolve to an actual
6218 file; no include path searching or dependency registering is performed. */
6219
6220 void
6221 input_scrub_insert_file (char *path)
6222 {
6223 input_scrub_include_file (path, input_line_pointer);
6224 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
6225 }
6226
6227 /* Find the end of a line, considering quotation and escaping of quotes. */
6228
6229 #if !defined(TC_SINGLE_QUOTE_STRINGS) && defined(SINGLE_QUOTE_STRINGS)
6230 # define TC_SINGLE_QUOTE_STRINGS 1
6231 #endif
6232
6233 static char *
6234 _find_end_of_line (char *s, int mri_string, int insn ATTRIBUTE_UNUSED,
6235 int in_macro)
6236 {
6237 char inquote = '\0';
6238 int inescape = 0;
6239
6240 while (!is_end_of_line[(unsigned char) *s]
6241 || (inquote && !ISCNTRL (*s))
6242 || (inquote == '\'' && flag_mri)
6243 #ifdef TC_EOL_IN_INSN
6244 || (insn && TC_EOL_IN_INSN (s))
6245 #endif
6246 /* PR 6926: When we are parsing the body of a macro the sequence
6247 \@ is special - it refers to the invocation count. If the @
6248 character happens to be registered as a line-separator character
6249 by the target, then the is_end_of_line[] test above will have
6250 returned true, but we need to ignore the line separating
6251 semantics in this particular case. */
6252 || (in_macro && inescape && *s == '@')
6253 )
6254 {
6255 if (mri_string && *s == '\'')
6256 inquote ^= *s;
6257 else if (inescape)
6258 inescape = 0;
6259 else if (*s == '\\')
6260 inescape = 1;
6261 else if (!inquote
6262 ? *s == '"'
6263 #ifdef TC_SINGLE_QUOTE_STRINGS
6264 || (TC_SINGLE_QUOTE_STRINGS && *s == '\'')
6265 #endif
6266 : *s == inquote)
6267 inquote ^= *s;
6268 ++s;
6269 }
6270 if (inquote)
6271 as_warn (_("missing closing `%c'"), inquote);
6272 if (inescape && !ignore_input ())
6273 as_warn (_("stray `\\'"));
6274 return s;
6275 }
6276
6277 char *
6278 find_end_of_line (char *s, int mri_string)
6279 {
6280 return _find_end_of_line (s, mri_string, 0, 0);
6281 }
6282
6283 static char *saved_ilp;
6284 static char *saved_limit;
6285
6286 /* Use BUF as a temporary input pointer for calling other functions in this
6287 file. BUF must be a C string, so that its end can be found by strlen.
6288 Also sets the buffer_limit variable (local to this file) so that buffer
6289 overruns should not occur. Saves the current input line pointer so that
6290 it can be restored by calling restore_ilp().
6291
6292 Does not support recursion. */
6293
6294 void
6295 temp_ilp (char *buf)
6296 {
6297 gas_assert (saved_ilp == NULL);
6298 gas_assert (buf != NULL);
6299
6300 saved_ilp = input_line_pointer;
6301 saved_limit = buffer_limit;
6302 /* Prevent the assert in restore_ilp from triggering if
6303 the input_line_pointer has not yet been initialised. */
6304 if (saved_ilp == NULL)
6305 saved_limit = saved_ilp = (char *) "";
6306
6307 input_line_pointer = buf;
6308 buffer_limit = buf + strlen (buf);
6309 input_from_string = true;
6310 }
6311
6312 /* Restore a saved input line pointer. */
6313
6314 void
6315 restore_ilp (void)
6316 {
6317 gas_assert (saved_ilp != NULL);
6318
6319 input_line_pointer = saved_ilp;
6320 buffer_limit = saved_limit;
6321 input_from_string = false;
6322
6323 saved_ilp = NULL;
6324 }