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