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