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