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