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