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