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