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