* maxq-dis.c: Formatting.
[binutils.git] / gas / read.c
blob00fd38a340a9e5e115421440d3585fcc4e12b8b3
1 /* read.c - read a source file -
2 Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
3 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
22 #if 0
23 /* If your chars aren't 8 bits, you will change this a bit.
24 But then, GNU isn't spozed to run on your machine anyway.
25 (RMS is so shortsighted sometimes.) */
26 #define MASK_CHAR (0xFF)
27 #else
28 #define MASK_CHAR ((int)(unsigned char) -1)
29 #endif
31 /* This is the largest known floating point format (for now). It will
32 grow when we do 4361 style flonums. */
33 #define MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT (16)
35 /* Routines that read assembler source text to build spaghetti in memory.
36 Another group of these functions is in the expr.c module. */
38 #include "as.h"
39 #include "safe-ctype.h"
40 #include "subsegs.h"
41 #include "sb.h"
42 #include "macro.h"
43 #include "obstack.h"
44 #include "listing.h"
45 #include "ecoff.h"
46 #include "dw2gencfi.h"
48 #ifndef TC_START_LABEL
49 #define TC_START_LABEL(x,y) (x == ':')
50 #endif
52 /* Set by the object-format or the target. */
53 #ifndef TC_IMPLICIT_LCOMM_ALIGNMENT
54 #define TC_IMPLICIT_LCOMM_ALIGNMENT(SIZE, P2VAR) \
55 do \
56 { \
57 if ((SIZE) >= 8) \
58 (P2VAR) = 3; \
59 else if ((SIZE) >= 4) \
60 (P2VAR) = 2; \
61 else if ((SIZE) >= 2) \
62 (P2VAR) = 1; \
63 else \
64 (P2VAR) = 0; \
65 } \
66 while (0)
67 #endif
69 char *input_line_pointer; /*->next char of source file to parse. */
71 #if BITS_PER_CHAR != 8
72 /* The following table is indexed by[(char)] and will break if
73 a char does not have exactly 256 states (hopefully 0:255!)! */
74 die horribly;
75 #endif
77 #ifndef LEX_AT
78 /* The m88k unfortunately uses @ as a label beginner. */
79 #define LEX_AT 0
80 #endif
82 #ifndef LEX_BR
83 /* The RS/6000 assembler uses {,},[,] as parts of symbol names. */
84 #define LEX_BR 0
85 #endif
87 #ifndef LEX_PCT
88 /* The Delta 68k assembler permits % inside label names. */
89 #define LEX_PCT 0
90 #endif
92 #ifndef LEX_QM
93 /* The PowerPC Windows NT assemblers permits ? inside label names. */
94 #define LEX_QM 0
95 #endif
97 #ifndef LEX_HASH
98 /* The IA-64 assembler uses # as a suffix designating a symbol. We include
99 it in the symbol and strip it out in tc_canonicalize_symbol_name. */
100 #define LEX_HASH 0
101 #endif
103 #ifndef LEX_DOLLAR
104 /* The a29k assembler does not permits labels to start with $. */
105 #define LEX_DOLLAR 3
106 #endif
108 #ifndef LEX_TILDE
109 /* The Delta 68k assembler permits ~ at start of label names. */
110 #define LEX_TILDE 0
111 #endif
113 /* Used by is_... macros. our ctype[]. */
114 char lex_type[256] = {
115 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* @ABCDEFGHIJKLMNO */
116 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ[\]^_ */
117 0, 0, 0, LEX_HASH, LEX_DOLLAR, LEX_PCT, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* _!"#$%&'()*+,-./ */
118 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, LEX_QM, /* 0123456789:;<=>? */
119 LEX_AT, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* @ABCDEFGHIJKLMNO */
120 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, 0, 3, /* PQRSTUVWXYZ[\]^_ */
121 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* `abcdefghijklmno */
122 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, LEX_TILDE, 0, /* pqrstuvwxyz{|}~. */
123 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
124 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
125 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
126 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
127 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
128 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
129 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
130 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
133 /* In: a character.
134 Out: 1 if this character ends a line. */
135 char is_end_of_line[256] = {
136 #ifdef CR_EOL
137 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, /* @abcdefghijklmno */
138 #else
139 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, /* @abcdefghijklmno */
140 #endif
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, /* 0123456789:;<=>? */
144 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
145 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
146 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
147 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
148 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
149 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
150 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
151 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
152 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
153 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
154 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
155 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* */
158 #ifndef TC_CASE_SENSITIVE
159 char original_case_string[128];
160 #endif
162 /* Functions private to this file. */
164 static char *buffer; /* 1st char of each buffer of lines is here. */
165 static char *buffer_limit; /*->1 + last char in buffer. */
167 /* TARGET_BYTES_BIG_ENDIAN is required to be defined to either 0 or 1
168 in the tc-<CPU>.h file. See the "Porting GAS" section of the
169 internals manual. */
170 int target_big_endian = TARGET_BYTES_BIG_ENDIAN;
172 /* Variables for handling include file directory table. */
174 /* Table of pointers to directories to search for .include's. */
175 char **include_dirs;
177 /* How many are in the table. */
178 int include_dir_count;
180 /* Length of longest in table. */
181 int include_dir_maxlen = 1;
183 #ifndef WORKING_DOT_WORD
184 struct broken_word *broken_words;
185 int new_broken_words;
186 #endif
188 /* The current offset into the absolute section. We don't try to
189 build frags in the absolute section, since no data can be stored
190 there. We just keep track of the current offset. */
191 addressT abs_section_offset;
193 /* If this line had an MRI style label, it is stored in this variable.
194 This is used by some of the MRI pseudo-ops. */
195 symbolS *line_label;
197 /* This global variable is used to support MRI common sections. We
198 translate such sections into a common symbol. This variable is
199 non-NULL when we are in an MRI common section. */
200 symbolS *mri_common_symbol;
202 /* In MRI mode, after a dc.b pseudo-op with an odd number of bytes, we
203 need to align to an even byte boundary unless the next pseudo-op is
204 dc.b, ds.b, or dcb.b. This variable is set to 1 if an alignment
205 may be needed. */
206 static int mri_pending_align;
208 #ifndef NO_LISTING
209 #ifdef OBJ_ELF
210 /* This variable is set to be non-zero if the next string we see might
211 be the name of the source file in DWARF debugging information. See
212 the comment in emit_expr for the format we look for. */
213 static int dwarf_file_string;
214 #endif
215 #endif
217 static void do_align (int, char *, int, int);
218 static void s_align (int, int);
219 static void s_altmacro (int);
220 static int hex_float (int, char *);
221 static segT get_known_segmented_expression (expressionS * expP);
222 static void pobegin (void);
223 static int get_line_sb (sb *);
224 static void generate_file_debug (void);
226 void
227 read_begin (void)
229 const char *p;
231 pobegin ();
232 obj_read_begin_hook ();
234 /* Something close -- but not too close -- to a multiple of 1024.
235 The debugging malloc I'm using has 24 bytes of overhead. */
236 obstack_begin (&notes, chunksize);
237 obstack_begin (&cond_obstack, chunksize);
239 /* Use machine dependent syntax. */
240 for (p = line_separator_chars; *p; p++)
241 is_end_of_line[(unsigned char) *p] = 1;
242 /* Use more. FIXME-SOMEDAY. */
244 if (flag_mri)
245 lex_type['?'] = 3;
248 /* Set up pseudo-op tables. */
250 static struct hash_control *po_hash;
252 static const pseudo_typeS potable[] = {
253 {"abort", s_abort, 0},
254 {"align", s_align_ptwo, 0},
255 {"altmacro", s_altmacro, 1},
256 {"ascii", stringer, 0},
257 {"asciz", stringer, 1},
258 {"balign", s_align_bytes, 0},
259 {"balignw", s_align_bytes, -2},
260 {"balignl", s_align_bytes, -4},
261 /* block */
262 {"byte", cons, 1},
263 {"comm", s_comm, 0},
264 {"common", s_mri_common, 0},
265 {"common.s", s_mri_common, 1},
266 {"data", s_data, 0},
267 {"dc", cons, 2},
268 {"dc.b", cons, 1},
269 {"dc.d", float_cons, 'd'},
270 {"dc.l", cons, 4},
271 {"dc.s", float_cons, 'f'},
272 {"dc.w", cons, 2},
273 {"dc.x", float_cons, 'x'},
274 {"dcb", s_space, 2},
275 {"dcb.b", s_space, 1},
276 {"dcb.d", s_float_space, 'd'},
277 {"dcb.l", s_space, 4},
278 {"dcb.s", s_float_space, 'f'},
279 {"dcb.w", s_space, 2},
280 {"dcb.x", s_float_space, 'x'},
281 {"ds", s_space, 2},
282 {"ds.b", s_space, 1},
283 {"ds.d", s_space, 8},
284 {"ds.l", s_space, 4},
285 {"ds.p", s_space, 12},
286 {"ds.s", s_space, 4},
287 {"ds.w", s_space, 2},
288 {"ds.x", s_space, 12},
289 {"debug", s_ignore, 0},
290 #ifdef S_SET_DESC
291 {"desc", s_desc, 0},
292 #endif
293 /* dim */
294 {"double", float_cons, 'd'},
295 /* dsect */
296 {"eject", listing_eject, 0}, /* Formfeed listing. */
297 {"else", s_else, 0},
298 {"elsec", s_else, 0},
299 {"elseif", s_elseif, (int) O_ne},
300 {"end", s_end, 0},
301 {"endc", s_endif, 0},
302 {"endfunc", s_func, 1},
303 {"endif", s_endif, 0},
304 {"endr", s_bad_endr, 0},
305 /* endef */
306 {"equ", s_set, 0},
307 {"equiv", s_set, 1},
308 {"err", s_err, 0},
309 {"exitm", s_mexit, 0},
310 /* extend */
311 {"extern", s_ignore, 0}, /* We treat all undef as ext. */
312 {"appfile", s_app_file, 1},
313 {"appline", s_app_line, 0},
314 {"fail", s_fail, 0},
315 {"file", s_app_file, 0},
316 {"fill", s_fill, 0},
317 {"float", float_cons, 'f'},
318 {"format", s_ignore, 0},
319 {"func", s_func, 0},
320 {"global", s_globl, 0},
321 {"globl", s_globl, 0},
322 {"hword", cons, 2},
323 {"if", s_if, (int) O_ne},
324 {"ifc", s_ifc, 0},
325 {"ifdef", s_ifdef, 0},
326 {"ifeq", s_if, (int) O_eq},
327 {"ifeqs", s_ifeqs, 0},
328 {"ifge", s_if, (int) O_ge},
329 {"ifgt", s_if, (int) O_gt},
330 {"ifle", s_if, (int) O_le},
331 {"iflt", s_if, (int) O_lt},
332 {"ifnc", s_ifc, 1},
333 {"ifndef", s_ifdef, 1},
334 {"ifne", s_if, (int) O_ne},
335 {"ifnes", s_ifeqs, 1},
336 {"ifnotdef", s_ifdef, 1},
337 {"incbin", s_incbin, 0},
338 {"include", s_include, 0},
339 {"int", cons, 4},
340 {"irp", s_irp, 0},
341 {"irep", s_irp, 0},
342 {"irpc", s_irp, 1},
343 {"irepc", s_irp, 1},
344 {"lcomm", s_lcomm, 0},
345 {"lflags", listing_flags, 0}, /* Listing flags. */
346 {"linkonce", s_linkonce, 0},
347 {"list", listing_list, 1}, /* Turn listing on. */
348 {"llen", listing_psize, 1},
349 {"long", cons, 4},
350 {"lsym", s_lsym, 0},
351 {"macro", s_macro, 0},
352 {"mexit", s_mexit, 0},
353 {"mri", s_mri, 0},
354 {".mri", s_mri, 0}, /* Special case so .mri works in MRI mode. */
355 {"name", s_ignore, 0},
356 {"noaltmacro", s_altmacro, 0},
357 {"noformat", s_ignore, 0},
358 {"nolist", listing_list, 0}, /* Turn listing off. */
359 {"nopage", listing_nopage, 0},
360 {"octa", cons, 16},
361 {"offset", s_struct, 0},
362 {"org", s_org, 0},
363 {"p2align", s_align_ptwo, 0},
364 {"p2alignw", s_align_ptwo, -2},
365 {"p2alignl", s_align_ptwo, -4},
366 {"page", listing_eject, 0},
367 {"plen", listing_psize, 0},
368 {"print", s_print, 0},
369 {"psize", listing_psize, 0}, /* Set paper size. */
370 {"purgem", s_purgem, 0},
371 {"quad", cons, 8},
372 {"rep", s_rept, 0},
373 {"rept", s_rept, 0},
374 {"rva", s_rva, 4},
375 {"sbttl", listing_title, 1}, /* Subtitle of listing. */
376 /* scl */
377 /* sect */
378 {"set", s_set, 0},
379 {"short", cons, 2},
380 {"single", float_cons, 'f'},
381 /* size */
382 {"space", s_space, 0},
383 {"skip", s_space, 0},
384 {"sleb128", s_leb128, 1},
385 {"spc", s_ignore, 0},
386 {"stabd", s_stab, 'd'},
387 {"stabn", s_stab, 'n'},
388 {"stabs", s_stab, 's'},
389 {"string", stringer, 1},
390 {"struct", s_struct, 0},
391 /* tag */
392 {"text", s_text, 0},
394 /* This is for gcc to use. It's only just been added (2/94), so gcc
395 won't be able to use it for a while -- probably a year or more.
396 But once this has been released, check with gcc maintainers
397 before deleting it or even changing the spelling. */
398 {"this_GCC_requires_the_GNU_assembler", s_ignore, 0},
399 /* If we're folding case -- done for some targets, not necessarily
400 all -- the above string in an input file will be converted to
401 this one. Match it either way... */
402 {"this_gcc_requires_the_gnu_assembler", s_ignore, 0},
404 {"title", listing_title, 0}, /* Listing title. */
405 {"ttl", listing_title, 0},
406 /* type */
407 {"uleb128", s_leb128, 0},
408 /* use */
409 /* val */
410 {"xcom", s_comm, 0},
411 {"xdef", s_globl, 0},
412 {"xref", s_ignore, 0},
413 {"xstabs", s_xstab, 's'},
414 {"word", cons, 2},
415 {"zero", s_space, 0},
416 {NULL, NULL, 0} /* End sentinel. */
419 static int pop_override_ok = 0;
420 static const char *pop_table_name;
422 void
423 pop_insert (const pseudo_typeS *table)
425 const char *errtxt;
426 const pseudo_typeS *pop;
427 for (pop = table; pop->poc_name; pop++)
429 errtxt = hash_insert (po_hash, pop->poc_name, (char *) pop);
430 if (errtxt && (!pop_override_ok || strcmp (errtxt, "exists")))
431 as_fatal (_("error constructing %s pseudo-op table: %s"), pop_table_name,
432 errtxt);
436 #ifndef md_pop_insert
437 #define md_pop_insert() pop_insert(md_pseudo_table)
438 #endif
440 #ifndef obj_pop_insert
441 #define obj_pop_insert() pop_insert(obj_pseudo_table)
442 #endif
444 #ifndef cfi_pop_insert
445 #define cfi_pop_insert() pop_insert(cfi_pseudo_table)
446 #endif
448 static void
449 pobegin (void)
451 po_hash = hash_new ();
453 /* Do the target-specific pseudo ops. */
454 pop_table_name = "md";
455 md_pop_insert ();
457 /* Now object specific. Skip any that were in the target table. */
458 pop_table_name = "obj";
459 pop_override_ok = 1;
460 obj_pop_insert ();
462 /* Now portable ones. Skip any that we've seen already. */
463 pop_table_name = "standard";
464 pop_insert (potable);
466 #ifdef TARGET_USE_CFIPOP
467 pop_table_name = "cfi";
468 pop_override_ok = 1;
469 cfi_pop_insert ();
470 #endif
473 #define HANDLE_CONDITIONAL_ASSEMBLY() \
474 if (ignore_input ()) \
476 while (!is_end_of_line[(unsigned char) *input_line_pointer++]) \
477 if (input_line_pointer == buffer_limit) \
478 break; \
479 continue; \
482 /* This function is used when scrubbing the characters between #APP
483 and #NO_APP. */
485 static char *scrub_string;
486 static char *scrub_string_end;
488 static int
489 scrub_from_string (char *buf, int buflen)
491 int copy;
493 copy = scrub_string_end - scrub_string;
494 if (copy > buflen)
495 copy = buflen;
496 memcpy (buf, scrub_string, copy);
497 scrub_string += copy;
498 return copy;
501 /* We read the file, putting things into a web that represents what we
502 have been reading. */
503 void
504 read_a_source_file (char *name)
506 register char c;
507 register char *s; /* String of symbol, '\0' appended. */
508 register int temp;
509 pseudo_typeS *pop;
511 #ifdef WARN_COMMENTS
512 found_comment = 0;
513 #endif
515 buffer = input_scrub_new_file (name);
517 listing_file (name);
518 listing_newline (NULL);
519 register_dependency (name);
521 /* Generate debugging information before we've read anything in to denote
522 this file as the "main" source file and not a subordinate one
523 (e.g. N_SO vs N_SOL in stabs). */
524 generate_file_debug ();
526 while ((buffer_limit = input_scrub_next_buffer (&input_line_pointer)) != 0)
527 { /* We have another line to parse. */
528 know (buffer_limit[-1] == '\n'); /* Must have a sentinel. */
530 while (input_line_pointer < buffer_limit)
532 /* We have more of this buffer to parse. */
534 /* We now have input_line_pointer->1st char of next line.
535 If input_line_pointer [-1] == '\n' then we just
536 scanned another line: so bump line counters. */
537 if (is_end_of_line[(unsigned char) input_line_pointer[-1]])
539 #ifdef md_start_line_hook
540 md_start_line_hook ();
541 #endif
542 if (input_line_pointer[-1] == '\n')
543 bump_line_counters ();
545 line_label = NULL;
547 if (LABELS_WITHOUT_COLONS || flag_m68k_mri)
549 /* Text at the start of a line must be a label, we
550 run down and stick a colon in. */
551 if (is_name_beginner (*input_line_pointer))
553 char *line_start = input_line_pointer;
554 char c;
555 int mri_line_macro;
557 LISTING_NEWLINE ();
558 HANDLE_CONDITIONAL_ASSEMBLY ();
560 c = get_symbol_end ();
562 /* In MRI mode, the EQU and MACRO pseudoops must
563 be handled specially. */
564 mri_line_macro = 0;
565 if (flag_m68k_mri)
567 char *rest = input_line_pointer + 1;
569 if (*rest == ':')
570 ++rest;
571 if (*rest == ' ' || *rest == '\t')
572 ++rest;
573 if ((strncasecmp (rest, "EQU", 3) == 0
574 || strncasecmp (rest, "SET", 3) == 0)
575 && (rest[3] == ' ' || rest[3] == '\t'))
577 input_line_pointer = rest + 3;
578 equals (line_start,
579 strncasecmp (rest, "SET", 3) == 0);
580 continue;
582 if (strncasecmp (rest, "MACRO", 5) == 0
583 && (rest[5] == ' '
584 || rest[5] == '\t'
585 || is_end_of_line[(unsigned char) rest[5]]))
586 mri_line_macro = 1;
589 /* In MRI mode, we need to handle the MACRO
590 pseudo-op specially: we don't want to put the
591 symbol in the symbol table. */
592 if (!mri_line_macro
593 #ifdef TC_START_LABEL_WITHOUT_COLON
594 && TC_START_LABEL_WITHOUT_COLON(c,
595 input_line_pointer)
596 #endif
598 line_label = colon (line_start);
599 else
600 line_label = symbol_create (line_start,
601 absolute_section,
602 (valueT) 0,
603 &zero_address_frag);
605 *input_line_pointer = c;
606 if (c == ':')
607 input_line_pointer++;
612 /* We are at the beginning of a line, or similar place.
613 We expect a well-formed assembler statement.
614 A "symbol-name:" is a statement.
616 Depending on what compiler is used, the order of these tests
617 may vary to catch most common case 1st.
618 Each test is independent of all other tests at the (top) level.
619 PLEASE make a compiler that doesn't use this assembler.
620 It is crufty to waste a compiler's time encoding things for this
621 assembler, which then wastes more time decoding it.
622 (And communicating via (linear) files is silly!
623 If you must pass stuff, please pass a tree!) */
624 if ((c = *input_line_pointer++) == '\t'
625 || c == ' '
626 || c == '\f'
627 || c == 0)
628 c = *input_line_pointer++;
630 know (c != ' '); /* No further leading whitespace. */
632 #ifndef NO_LISTING
633 /* If listing is on, and we are expanding a macro, then give
634 the listing code the contents of the expanded line. */
635 if (listing)
637 if ((listing & LISTING_MACEXP) && macro_nest > 0)
639 char *copy;
640 int len;
642 /* Find the end of the current expanded macro line. */
643 for (s = input_line_pointer - 1; *s; ++s)
644 if (is_end_of_line[(unsigned char) *s])
645 break;
647 /* Copy it for safe keeping. Also give an indication of
648 how much macro nesting is involved at this point. */
649 len = s - (input_line_pointer - 1);
650 copy = (char *) xmalloc (len + macro_nest + 2);
651 memset (copy, '>', macro_nest);
652 copy[macro_nest] = ' ';
653 memcpy (copy + macro_nest + 1, input_line_pointer - 1, len);
654 copy[macro_nest + 1 + len] = '\0';
656 /* Install the line with the listing facility. */
657 listing_newline (copy);
659 else
660 listing_newline (NULL);
662 #endif
663 /* C is the 1st significant character.
664 Input_line_pointer points after that character. */
665 if (is_name_beginner (c))
667 /* Want user-defined label or pseudo/opcode. */
668 HANDLE_CONDITIONAL_ASSEMBLY ();
670 s = --input_line_pointer;
671 c = get_symbol_end (); /* name's delimiter. */
673 /* C is character after symbol.
674 That character's place in the input line is now '\0'.
675 S points to the beginning of the symbol.
676 [In case of pseudo-op, s->'.'.]
677 Input_line_pointer->'\0' where c was. */
678 if (TC_START_LABEL (c, input_line_pointer))
680 if (flag_m68k_mri)
682 char *rest = input_line_pointer + 1;
684 /* In MRI mode, \tsym: set 0 is permitted. */
685 if (*rest == ':')
686 ++rest;
688 if (*rest == ' ' || *rest == '\t')
689 ++rest;
691 if ((strncasecmp (rest, "EQU", 3) == 0
692 || strncasecmp (rest, "SET", 3) == 0)
693 && (rest[3] == ' ' || rest[3] == '\t'))
695 input_line_pointer = rest + 3;
696 equals (s, 1);
697 continue;
701 line_label = colon (s); /* User-defined label. */
702 /* Put ':' back for error messages' sake. */
703 *input_line_pointer++ = ':';
704 #ifdef tc_check_label
705 tc_check_label (line_label);
706 #endif
707 /* Input_line_pointer->after ':'. */
708 SKIP_WHITESPACE ();
710 else if (c == '='
711 || ((c == ' ' || c == '\t')
712 && input_line_pointer[1] == '='
713 #ifdef TC_EQUAL_IN_INSN
714 && !TC_EQUAL_IN_INSN (c, input_line_pointer)
715 #endif
718 equals (s, 1);
719 demand_empty_rest_of_line ();
721 else
723 /* Expect pseudo-op or machine instruction. */
724 pop = NULL;
726 #ifndef TC_CASE_SENSITIVE
728 char *s2 = s;
730 strncpy (original_case_string, s2, sizeof (original_case_string));
731 original_case_string[sizeof (original_case_string) - 1] = 0;
733 while (*s2)
735 *s2 = TOLOWER (*s2);
736 s2++;
739 #endif
740 if (NO_PSEUDO_DOT || flag_m68k_mri)
742 /* The MRI assembler and the m88k use pseudo-ops
743 without a period. */
744 pop = (pseudo_typeS *) hash_find (po_hash, s);
745 if (pop != NULL && pop->poc_handler == NULL)
746 pop = NULL;
749 if (pop != NULL
750 || (!flag_m68k_mri && *s == '.'))
752 /* PSEUDO - OP.
754 WARNING: c has next char, which may be end-of-line.
755 We lookup the pseudo-op table with s+1 because we
756 already know that the pseudo-op begins with a '.'. */
758 if (pop == NULL)
759 pop = (pseudo_typeS *) hash_find (po_hash, s + 1);
760 if (pop && !pop->poc_handler)
761 pop = NULL;
763 /* In MRI mode, we may need to insert an
764 automatic alignment directive. What a hack
765 this is. */
766 if (mri_pending_align
767 && (pop == NULL
768 || !((pop->poc_handler == cons
769 && pop->poc_val == 1)
770 || (pop->poc_handler == s_space
771 && pop->poc_val == 1)
772 #ifdef tc_conditional_pseudoop
773 || tc_conditional_pseudoop (pop)
774 #endif
775 || pop->poc_handler == s_if
776 || pop->poc_handler == s_ifdef
777 || pop->poc_handler == s_ifc
778 || pop->poc_handler == s_ifeqs
779 || pop->poc_handler == s_else
780 || pop->poc_handler == s_endif
781 || pop->poc_handler == s_globl
782 || pop->poc_handler == s_ignore)))
784 do_align (1, (char *) NULL, 0, 0);
785 mri_pending_align = 0;
787 if (line_label != NULL)
789 symbol_set_frag (line_label, frag_now);
790 S_SET_VALUE (line_label, frag_now_fix ());
794 /* Print the error msg now, while we still can. */
795 if (pop == NULL)
797 as_bad (_("unknown pseudo-op: `%s'"), s);
798 *input_line_pointer = c;
799 s_ignore (0);
800 continue;
803 /* Put it back for error messages etc. */
804 *input_line_pointer = c;
805 /* The following skip of whitespace is compulsory.
806 A well shaped space is sometimes all that separates
807 keyword from operands. */
808 if (c == ' ' || c == '\t')
809 input_line_pointer++;
811 /* Input_line is restored.
812 Input_line_pointer->1st non-blank char
813 after pseudo-operation. */
814 (*pop->poc_handler) (pop->poc_val);
816 /* If that was .end, just get out now. */
817 if (pop->poc_handler == s_end)
818 goto quit;
820 else
822 int inquote = 0;
823 #ifdef QUOTES_IN_INSN
824 int inescape = 0;
825 #endif
827 /* WARNING: c has char, which may be end-of-line. */
828 /* Also: input_line_pointer->`\0` where c was. */
829 *input_line_pointer = c;
830 while (!is_end_of_line[(unsigned char) *input_line_pointer]
831 || inquote
832 #ifdef TC_EOL_IN_INSN
833 || TC_EOL_IN_INSN (input_line_pointer)
834 #endif
837 if (flag_m68k_mri && *input_line_pointer == '\'')
838 inquote = !inquote;
839 #ifdef QUOTES_IN_INSN
840 if (inescape)
841 inescape = 0;
842 else if (*input_line_pointer == '"')
843 inquote = !inquote;
844 else if (*input_line_pointer == '\\')
845 inescape = 1;
846 #endif
847 input_line_pointer++;
850 c = *input_line_pointer;
851 *input_line_pointer = '\0';
853 generate_lineno_debug ();
855 if (macro_defined)
857 sb out;
858 const char *err;
859 macro_entry *macro;
861 if (check_macro (s, &out, &err, &macro))
863 if (err != NULL)
864 as_bad ("%s", err);
865 *input_line_pointer++ = c;
866 input_scrub_include_sb (&out,
867 input_line_pointer, 1);
868 sb_kill (&out);
869 buffer_limit =
870 input_scrub_next_buffer (&input_line_pointer);
871 #ifdef md_macro_info
872 md_macro_info (macro);
873 #endif
874 continue;
878 if (mri_pending_align)
880 do_align (1, (char *) NULL, 0, 0);
881 mri_pending_align = 0;
882 if (line_label != NULL)
884 symbol_set_frag (line_label, frag_now);
885 S_SET_VALUE (line_label, frag_now_fix ());
889 md_assemble (s); /* Assemble 1 instruction. */
891 *input_line_pointer++ = c;
893 /* We resume loop AFTER the end-of-line from
894 this instruction. */
897 continue;
900 /* Empty statement? */
901 if (is_end_of_line[(unsigned char) c])
902 continue;
904 if ((LOCAL_LABELS_DOLLAR || LOCAL_LABELS_FB) && ISDIGIT (c))
906 /* local label ("4:") */
907 char *backup = input_line_pointer;
909 HANDLE_CONDITIONAL_ASSEMBLY ();
911 temp = c - '0';
913 /* Read the whole number. */
914 while (ISDIGIT (*input_line_pointer))
916 temp = (temp * 10) + *input_line_pointer - '0';
917 ++input_line_pointer;
920 if (LOCAL_LABELS_DOLLAR
921 && *input_line_pointer == '$'
922 && *(input_line_pointer + 1) == ':')
924 input_line_pointer += 2;
926 if (dollar_label_defined (temp))
928 as_fatal (_("label \"%d$\" redefined"), temp);
931 define_dollar_label (temp);
932 colon (dollar_label_name (temp, 0));
933 continue;
936 if (LOCAL_LABELS_FB
937 && *input_line_pointer++ == ':')
939 fb_label_instance_inc (temp);
940 colon (fb_label_name (temp, 0));
941 continue;
944 input_line_pointer = backup;
945 } /* local label ("4:") */
947 if (c && strchr (line_comment_chars, c))
948 { /* Its a comment. Better say APP or NO_APP. */
949 sb sbuf;
950 char *ends;
951 char *new_buf;
952 char *new_tmp;
953 unsigned int new_length;
954 char *tmp_buf = 0;
956 bump_line_counters ();
957 s = input_line_pointer;
958 if (strncmp (s, "APP\n", 4))
959 continue; /* We ignore it */
960 s += 4;
962 sb_new (&sbuf);
963 ends = strstr (s, "#NO_APP\n");
965 if (!ends)
967 unsigned int tmp_len;
968 unsigned int num;
970 /* The end of the #APP wasn't in this buffer. We
971 keep reading in buffers until we find the #NO_APP
972 that goes with this #APP There is one. The specs
973 guarantee it... */
974 tmp_len = buffer_limit - s;
975 tmp_buf = xmalloc (tmp_len + 1);
976 memcpy (tmp_buf, s, tmp_len);
979 new_tmp = input_scrub_next_buffer (&buffer);
980 if (!new_tmp)
981 break;
982 else
983 buffer_limit = new_tmp;
984 input_line_pointer = buffer;
985 ends = strstr (buffer, "#NO_APP\n");
986 if (ends)
987 num = ends - buffer;
988 else
989 num = buffer_limit - buffer;
991 tmp_buf = xrealloc (tmp_buf, tmp_len + num);
992 memcpy (tmp_buf + tmp_len, buffer, num);
993 tmp_len += num;
995 while (!ends);
997 input_line_pointer = ends ? ends + 8 : NULL;
999 s = tmp_buf;
1000 ends = s + tmp_len;
1003 else
1005 input_line_pointer = ends + 8;
1008 scrub_string = s;
1009 scrub_string_end = ends;
1011 new_length = ends - s;
1012 new_buf = (char *) xmalloc (new_length);
1013 new_tmp = new_buf;
1014 for (;;)
1016 int space;
1017 int size;
1019 space = (new_buf + new_length) - new_tmp;
1020 size = do_scrub_chars (scrub_from_string, new_tmp, space);
1022 if (size < space)
1024 new_tmp[size] = 0;
1025 break;
1028 new_buf = xrealloc (new_buf, new_length + 100);
1029 new_tmp = new_buf + new_length;
1030 new_length += 100;
1033 if (tmp_buf)
1034 free (tmp_buf);
1036 /* We've "scrubbed" input to the preferred format. In the
1037 process we may have consumed the whole of the remaining
1038 file (and included files). We handle this formatted
1039 input similar to that of macro expansion, letting
1040 actual macro expansion (possibly nested) and other
1041 input expansion work. Beware that in messages, line
1042 numbers and possibly file names will be incorrect. */
1043 sb_add_string (&sbuf, new_buf);
1044 input_scrub_include_sb (&sbuf, input_line_pointer, 0);
1045 sb_kill (&sbuf);
1046 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
1047 free (new_buf);
1048 continue;
1051 HANDLE_CONDITIONAL_ASSEMBLY ();
1053 #ifdef tc_unrecognized_line
1054 if (tc_unrecognized_line (c))
1055 continue;
1056 #endif
1057 input_line_pointer--;
1058 /* Report unknown char as ignored. */
1059 demand_empty_rest_of_line ();
1062 #ifdef md_after_pass_hook
1063 md_after_pass_hook ();
1064 #endif
1067 quit:
1069 #ifdef md_cleanup
1070 md_cleanup ();
1071 #endif
1072 /* Close the input file. */
1073 input_scrub_close ();
1074 #ifdef WARN_COMMENTS
1076 if (warn_comment && found_comment)
1077 as_warn_where (found_comment_file, found_comment,
1078 "first comment found here");
1080 #endif
1083 /* For most MRI pseudo-ops, the line actually ends at the first
1084 nonquoted space. This function looks for that point, stuffs a null
1085 in, and sets *STOPCP to the character that used to be there, and
1086 returns the location.
1088 Until I hear otherwise, I am going to assume that this is only true
1089 for the m68k MRI assembler. */
1091 char *
1092 mri_comment_field (char *stopcp)
1094 char *s;
1095 #ifdef TC_M68K
1096 int inquote = 0;
1098 know (flag_m68k_mri);
1100 for (s = input_line_pointer;
1101 ((!is_end_of_line[(unsigned char) *s] && *s != ' ' && *s != '\t')
1102 || inquote);
1103 s++)
1105 if (*s == '\'')
1106 inquote = !inquote;
1108 #else
1109 for (s = input_line_pointer;
1110 !is_end_of_line[(unsigned char) *s];
1111 s++)
1113 #endif
1114 *stopcp = *s;
1115 *s = '\0';
1117 return s;
1120 /* Skip to the end of an MRI comment field. */
1122 void
1123 mri_comment_end (char *stop, int stopc)
1125 know (flag_mri);
1127 input_line_pointer = stop;
1128 *stop = stopc;
1129 while (!is_end_of_line[(unsigned char) *input_line_pointer])
1130 ++input_line_pointer;
1133 void
1134 s_abort (int ignore ATTRIBUTE_UNUSED)
1136 as_fatal (_(".abort detected. Abandoning ship."));
1139 /* Guts of .align directive. N is the power of two to which to align.
1140 FILL may be NULL, or it may point to the bytes of the fill pattern.
1141 LEN is the length of whatever FILL points to, if anything. MAX is
1142 the maximum number of characters to skip when doing the alignment,
1143 or 0 if there is no maximum. */
1145 static void
1146 do_align (int n, char *fill, int len, int max)
1148 if (now_seg == absolute_section)
1150 if (fill != NULL)
1151 while (len-- > 0)
1152 if (*fill++ != '\0')
1154 as_warn (_("ignoring fill value in absolute section"));
1155 break;
1157 fill = NULL;
1158 len = 0;
1161 #ifdef md_flush_pending_output
1162 md_flush_pending_output ();
1163 #endif
1164 #ifdef md_do_align
1165 md_do_align (n, fill, len, max, just_record_alignment);
1166 #endif
1168 /* Only make a frag if we HAVE to... */
1169 if (n != 0 && !need_pass_2)
1171 if (fill == NULL)
1173 if (subseg_text_p (now_seg))
1174 frag_align_code (n, max);
1175 else
1176 frag_align (n, 0, max);
1178 else if (len <= 1)
1179 frag_align (n, *fill, max);
1180 else
1181 frag_align_pattern (n, fill, len, max);
1184 #ifdef md_do_align
1185 just_record_alignment: ATTRIBUTE_UNUSED_LABEL
1186 #endif
1188 record_alignment (now_seg, n - OCTETS_PER_BYTE_POWER);
1191 /* Handle the .align pseudo-op. A positive ARG is a default alignment
1192 (in bytes). A negative ARG is the negative of the length of the
1193 fill pattern. BYTES_P is non-zero if the alignment value should be
1194 interpreted as the byte boundary, rather than the power of 2. */
1196 static void
1197 s_align (int arg, int bytes_p)
1199 register unsigned int align;
1200 char *stop = NULL;
1201 char stopc;
1202 offsetT fill = 0;
1203 int max;
1204 int fill_p;
1206 if (flag_mri)
1207 stop = mri_comment_field (&stopc);
1209 if (is_end_of_line[(unsigned char) *input_line_pointer])
1211 if (arg < 0)
1212 align = 0;
1213 else
1214 align = arg; /* Default value from pseudo-op table. */
1216 else
1218 align = get_absolute_expression ();
1219 SKIP_WHITESPACE ();
1222 if (bytes_p)
1224 /* Convert to a power of 2. */
1225 if (align != 0)
1227 unsigned int i;
1229 for (i = 0; (align & 1) == 0; align >>= 1, ++i)
1231 if (align != 1)
1232 as_bad (_("alignment not a power of 2"));
1234 align = i;
1238 if (align > 15)
1240 align = 15;
1241 as_warn (_("alignment too large: %u assumed"), align);
1244 if (*input_line_pointer != ',')
1246 fill_p = 0;
1247 max = 0;
1249 else
1251 ++input_line_pointer;
1252 if (*input_line_pointer == ',')
1253 fill_p = 0;
1254 else
1256 fill = get_absolute_expression ();
1257 SKIP_WHITESPACE ();
1258 fill_p = 1;
1261 if (*input_line_pointer != ',')
1262 max = 0;
1263 else
1265 ++input_line_pointer;
1266 max = get_absolute_expression ();
1270 if (!fill_p)
1272 if (arg < 0)
1273 as_warn (_("expected fill pattern missing"));
1274 do_align (align, (char *) NULL, 0, max);
1276 else
1278 int fill_len;
1280 if (arg >= 0)
1281 fill_len = 1;
1282 else
1283 fill_len = -arg;
1284 if (fill_len <= 1)
1286 char fill_char;
1288 fill_char = fill;
1289 do_align (align, &fill_char, fill_len, max);
1291 else
1293 char ab[16];
1295 if ((size_t) fill_len > sizeof ab)
1296 abort ();
1297 md_number_to_chars (ab, fill, fill_len);
1298 do_align (align, ab, fill_len, max);
1302 demand_empty_rest_of_line ();
1304 if (flag_mri)
1305 mri_comment_end (stop, stopc);
1308 /* Handle the .align pseudo-op on machines where ".align 4" means
1309 align to a 4 byte boundary. */
1311 void
1312 s_align_bytes (int arg)
1314 s_align (arg, 1);
1317 /* Handle the .align pseudo-op on machines where ".align 4" means align
1318 to a 2**4 boundary. */
1320 void
1321 s_align_ptwo (int arg)
1323 s_align (arg, 0);
1326 /* Switch in and out of alternate macro mode. */
1328 void
1329 s_altmacro (int on)
1331 demand_empty_rest_of_line ();
1332 macro_set_alternate (on);
1335 symbolS *
1336 s_comm_internal (int param,
1337 symbolS *(*comm_parse_extra) (int, symbolS *, addressT))
1339 char *name;
1340 char c;
1341 char *p;
1342 offsetT temp, size;
1343 symbolS *symbolP = NULL;
1344 char *stop = NULL;
1345 char stopc;
1346 expressionS exp;
1348 if (flag_mri)
1349 stop = mri_comment_field (&stopc);
1351 name = input_line_pointer;
1352 c = get_symbol_end ();
1353 /* Just after name is now '\0'. */
1354 p = input_line_pointer;
1355 *p = c;
1357 if (name == p)
1359 as_bad (_("expected symbol name"));
1360 discard_rest_of_line ();
1361 goto out;
1364 SKIP_WHITESPACE ();
1366 /* Accept an optional comma after the name. The comma used to be
1367 required, but Irix 5 cc does not generate it for .lcomm. */
1368 if (*input_line_pointer == ',')
1369 input_line_pointer++;
1371 *p = 0;
1372 temp = get_absolute_expr (&exp);
1373 size = temp;
1374 #ifdef BFD_ASSEMBLER
1375 size &= ((offsetT) 2 << (stdoutput->arch_info->bits_per_address - 1)) - 1;
1376 #endif
1377 if (exp.X_op == O_absent)
1379 as_bad (_("missing size expression"));
1380 *p = c;
1381 ignore_rest_of_line ();
1382 goto out;
1384 else if (temp != size || !exp.X_unsigned)
1386 as_warn (_("size (%ld) out of range, ignored"), (long) temp);
1387 *p = c;
1388 ignore_rest_of_line ();
1389 goto out;
1392 symbolP = symbol_find_or_make (name);
1393 if (S_IS_DEFINED (symbolP) && !S_IS_COMMON (symbolP))
1395 symbolP = NULL;
1396 as_bad (_("symbol `%s' is already defined"), name);
1397 *p = c;
1398 ignore_rest_of_line ();
1399 goto out;
1402 size = S_GET_VALUE (symbolP);
1403 if (size == 0)
1404 size = temp;
1405 else if (size != temp)
1406 as_warn (_("size of \"%s\" is already %ld; not changing to %ld"),
1407 name, (long) size, (long) temp);
1409 *p = c;
1410 if (comm_parse_extra != NULL)
1411 symbolP = (*comm_parse_extra) (param, symbolP, size);
1412 else
1414 S_SET_VALUE (symbolP, (valueT) size);
1415 S_SET_EXTERNAL (symbolP);
1416 #ifdef OBJ_VMS
1418 extern int flag_one;
1419 if (size == 0 || !flag_one)
1420 S_GET_OTHER (symbolP) = const_flag;
1422 #endif
1425 know (symbolP == NULL || symbolP->sy_frag == &zero_address_frag);
1426 demand_empty_rest_of_line ();
1427 out:
1428 if (flag_mri)
1429 mri_comment_end (stop, stopc);
1430 return symbolP;
1433 void
1434 s_comm (int ignore)
1436 s_comm_internal (ignore, NULL);
1439 /* The MRI COMMON pseudo-op. We handle this by creating a common
1440 symbol with the appropriate name. We make s_space do the right
1441 thing by increasing the size. */
1443 void
1444 s_mri_common (int small ATTRIBUTE_UNUSED)
1446 char *name;
1447 char c;
1448 char *alc = NULL;
1449 symbolS *sym;
1450 offsetT align;
1451 char *stop = NULL;
1452 char stopc;
1454 if (!flag_mri)
1456 s_comm (0);
1457 return;
1460 stop = mri_comment_field (&stopc);
1462 SKIP_WHITESPACE ();
1464 name = input_line_pointer;
1465 if (!ISDIGIT (*name))
1466 c = get_symbol_end ();
1467 else
1471 ++input_line_pointer;
1473 while (ISDIGIT (*input_line_pointer));
1475 c = *input_line_pointer;
1476 *input_line_pointer = '\0';
1478 if (line_label != NULL)
1480 alc = (char *) xmalloc (strlen (S_GET_NAME (line_label))
1481 + (input_line_pointer - name)
1482 + 1);
1483 sprintf (alc, "%s%s", name, S_GET_NAME (line_label));
1484 name = alc;
1488 sym = symbol_find_or_make (name);
1489 *input_line_pointer = c;
1490 if (alc != NULL)
1491 free (alc);
1493 if (*input_line_pointer != ',')
1494 align = 0;
1495 else
1497 ++input_line_pointer;
1498 align = get_absolute_expression ();
1501 if (S_IS_DEFINED (sym) && !S_IS_COMMON (sym))
1503 as_bad (_("symbol `%s' is already defined"), S_GET_NAME (sym));
1504 ignore_rest_of_line ();
1505 mri_comment_end (stop, stopc);
1506 return;
1509 S_SET_EXTERNAL (sym);
1510 mri_common_symbol = sym;
1512 #ifdef S_SET_ALIGN
1513 if (align != 0)
1514 S_SET_ALIGN (sym, align);
1515 #endif
1517 if (line_label != NULL)
1519 expressionS exp;
1520 exp.X_op = O_symbol;
1521 exp.X_add_symbol = sym;
1522 exp.X_add_number = 0;
1523 symbol_set_value_expression (line_label, &exp);
1524 symbol_set_frag (line_label, &zero_address_frag);
1525 S_SET_SEGMENT (line_label, expr_section);
1528 /* FIXME: We just ignore the small argument, which distinguishes
1529 COMMON and COMMON.S. I don't know what we can do about it. */
1531 /* Ignore the type and hptype. */
1532 if (*input_line_pointer == ',')
1533 input_line_pointer += 2;
1534 if (*input_line_pointer == ',')
1535 input_line_pointer += 2;
1537 demand_empty_rest_of_line ();
1539 mri_comment_end (stop, stopc);
1542 void
1543 s_data (int ignore ATTRIBUTE_UNUSED)
1545 segT section;
1546 register int temp;
1548 temp = get_absolute_expression ();
1549 if (flag_readonly_data_in_text)
1551 section = text_section;
1552 temp += 1000;
1554 else
1555 section = data_section;
1557 subseg_set (section, (subsegT) temp);
1559 #ifdef OBJ_VMS
1560 const_flag = 0;
1561 #endif
1562 demand_empty_rest_of_line ();
1565 /* Handle the .appfile pseudo-op. This is automatically generated by
1566 do_scrub_chars when a preprocessor # line comment is seen with a
1567 file name. This default definition may be overridden by the object
1568 or CPU specific pseudo-ops. This function is also the default
1569 definition for .file; the APPFILE argument is 1 for .appfile, 0 for
1570 .file. */
1572 void
1573 s_app_file_string (char *file, int appfile)
1575 #ifdef LISTING
1576 if (listing)
1577 listing_source_file (file);
1578 #endif
1579 register_dependency (file);
1580 #ifdef obj_app_file
1581 obj_app_file (file, appfile);
1582 #endif
1585 void
1586 s_app_file (int appfile)
1588 register char *s;
1589 int length;
1591 /* Some assemblers tolerate immediately following '"'. */
1592 if ((s = demand_copy_string (&length)) != 0)
1594 /* If this is a fake .appfile, a fake newline was inserted into
1595 the buffer. Passing -2 to new_logical_line tells it to
1596 account for it. */
1597 int may_omit
1598 = (!new_logical_line (s, appfile ? -2 : -1) && appfile);
1600 /* In MRI mode, the preprocessor may have inserted an extraneous
1601 backquote. */
1602 if (flag_m68k_mri
1603 && *input_line_pointer == '\''
1604 && is_end_of_line[(unsigned char) input_line_pointer[1]])
1605 ++input_line_pointer;
1607 demand_empty_rest_of_line ();
1608 if (!may_omit)
1609 s_app_file_string (s, appfile);
1613 /* Handle the .appline pseudo-op. This is automatically generated by
1614 do_scrub_chars when a preprocessor # line comment is seen. This
1615 default definition may be overridden by the object or CPU specific
1616 pseudo-ops. */
1618 void
1619 s_app_line (int ignore ATTRIBUTE_UNUSED)
1621 int l;
1623 /* The given number is that of the next line. */
1624 l = get_absolute_expression () - 1;
1625 if (l < 0)
1626 /* Some of the back ends can't deal with non-positive line numbers.
1627 Besides, it's silly. */
1628 as_warn (_("line numbers must be positive; line number %d rejected"),
1629 l + 1);
1630 else
1632 new_logical_line ((char *) NULL, l);
1633 #ifdef LISTING
1634 if (listing)
1635 listing_source_line (l);
1636 #endif
1638 demand_empty_rest_of_line ();
1641 /* Handle the .end pseudo-op. Actually, the real work is done in
1642 read_a_source_file. */
1644 void
1645 s_end (int ignore ATTRIBUTE_UNUSED)
1647 if (flag_mri)
1649 /* The MRI assembler permits the start symbol to follow .end,
1650 but we don't support that. */
1651 SKIP_WHITESPACE ();
1652 if (!is_end_of_line[(unsigned char) *input_line_pointer]
1653 && *input_line_pointer != '*'
1654 && *input_line_pointer != '!')
1655 as_warn (_("start address not supported"));
1659 /* Handle the .err pseudo-op. */
1661 void
1662 s_err (int ignore ATTRIBUTE_UNUSED)
1664 as_bad (_(".err encountered"));
1665 demand_empty_rest_of_line ();
1668 /* Handle the MRI fail pseudo-op. */
1670 void
1671 s_fail (int ignore ATTRIBUTE_UNUSED)
1673 offsetT temp;
1674 char *stop = NULL;
1675 char stopc;
1677 if (flag_mri)
1678 stop = mri_comment_field (&stopc);
1680 temp = get_absolute_expression ();
1681 if (temp >= 500)
1682 as_warn (_(".fail %ld encountered"), (long) temp);
1683 else
1684 as_bad (_(".fail %ld encountered"), (long) temp);
1686 demand_empty_rest_of_line ();
1688 if (flag_mri)
1689 mri_comment_end (stop, stopc);
1692 void
1693 s_fill (int ignore ATTRIBUTE_UNUSED)
1695 expressionS rep_exp;
1696 long size = 1;
1697 register long fill = 0;
1698 char *p;
1700 #ifdef md_flush_pending_output
1701 md_flush_pending_output ();
1702 #endif
1704 get_known_segmented_expression (&rep_exp);
1705 if (*input_line_pointer == ',')
1707 input_line_pointer++;
1708 size = get_absolute_expression ();
1709 if (*input_line_pointer == ',')
1711 input_line_pointer++;
1712 fill = get_absolute_expression ();
1716 /* This is to be compatible with BSD 4.2 AS, not for any rational reason. */
1717 #define BSD_FILL_SIZE_CROCK_8 (8)
1718 if (size > BSD_FILL_SIZE_CROCK_8)
1720 as_warn (_(".fill size clamped to %d"), BSD_FILL_SIZE_CROCK_8);
1721 size = BSD_FILL_SIZE_CROCK_8;
1723 if (size < 0)
1725 as_warn (_("size negative; .fill ignored"));
1726 size = 0;
1728 else if (rep_exp.X_op == O_constant && rep_exp.X_add_number <= 0)
1730 if (rep_exp.X_add_number < 0)
1731 as_warn (_("repeat < 0; .fill ignored"));
1732 size = 0;
1735 if (size && !need_pass_2)
1737 if (rep_exp.X_op == O_constant)
1739 p = frag_var (rs_fill, (int) size, (int) size,
1740 (relax_substateT) 0, (symbolS *) 0,
1741 (offsetT) rep_exp.X_add_number,
1742 (char *) 0);
1744 else
1746 /* We don't have a constant repeat count, so we can't use
1747 rs_fill. We can get the same results out of rs_space,
1748 but its argument is in bytes, so we must multiply the
1749 repeat count by size. */
1751 symbolS *rep_sym;
1752 rep_sym = make_expr_symbol (&rep_exp);
1753 if (size != 1)
1755 expressionS size_exp;
1756 size_exp.X_op = O_constant;
1757 size_exp.X_add_number = size;
1759 rep_exp.X_op = O_multiply;
1760 rep_exp.X_add_symbol = rep_sym;
1761 rep_exp.X_op_symbol = make_expr_symbol (&size_exp);
1762 rep_exp.X_add_number = 0;
1763 rep_sym = make_expr_symbol (&rep_exp);
1766 p = frag_var (rs_space, (int) size, (int) size,
1767 (relax_substateT) 0, rep_sym, (offsetT) 0, (char *) 0);
1770 memset (p, 0, (unsigned int) size);
1772 /* The magic number BSD_FILL_SIZE_CROCK_4 is from BSD 4.2 VAX
1773 flavoured AS. The following bizarre behaviour is to be
1774 compatible with above. I guess they tried to take up to 8
1775 bytes from a 4-byte expression and they forgot to sign
1776 extend. */
1777 #define BSD_FILL_SIZE_CROCK_4 (4)
1778 md_number_to_chars (p, (valueT) fill,
1779 (size > BSD_FILL_SIZE_CROCK_4
1780 ? BSD_FILL_SIZE_CROCK_4
1781 : (int) size));
1782 /* Note: .fill (),0 emits no frag (since we are asked to .fill 0 bytes)
1783 but emits no error message because it seems a legal thing to do.
1784 It is a degenerate case of .fill but could be emitted by a
1785 compiler. */
1787 demand_empty_rest_of_line ();
1790 void
1791 s_globl (int ignore ATTRIBUTE_UNUSED)
1793 char *name;
1794 int c;
1795 symbolS *symbolP;
1796 char *stop = NULL;
1797 char stopc;
1799 if (flag_mri)
1800 stop = mri_comment_field (&stopc);
1804 name = input_line_pointer;
1805 c = get_symbol_end ();
1806 symbolP = symbol_find_or_make (name);
1807 S_SET_EXTERNAL (symbolP);
1809 *input_line_pointer = c;
1810 SKIP_WHITESPACE ();
1811 c = *input_line_pointer;
1812 if (c == ',')
1814 input_line_pointer++;
1815 SKIP_WHITESPACE ();
1816 if (is_end_of_line[(unsigned char) *input_line_pointer])
1817 c = '\n';
1820 while (c == ',');
1822 demand_empty_rest_of_line ();
1824 if (flag_mri)
1825 mri_comment_end (stop, stopc);
1828 /* Handle the MRI IRP and IRPC pseudo-ops. */
1830 void
1831 s_irp (int irpc)
1833 char *file;
1834 unsigned int line;
1835 sb s;
1836 const char *err;
1837 sb out;
1839 as_where (&file, &line);
1841 sb_new (&s);
1842 while (!is_end_of_line[(unsigned char) *input_line_pointer])
1843 sb_add_char (&s, *input_line_pointer++);
1845 sb_new (&out);
1847 err = expand_irp (irpc, 0, &s, &out, get_line_sb);
1848 if (err != NULL)
1849 as_bad_where (file, line, "%s", err);
1851 sb_kill (&s);
1853 input_scrub_include_sb (&out, input_line_pointer, 1);
1854 sb_kill (&out);
1855 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
1858 /* Handle the .linkonce pseudo-op. This tells the assembler to mark
1859 the section to only be linked once. However, this is not supported
1860 by most object file formats. This takes an optional argument,
1861 which is what to do about duplicates. */
1863 void
1864 s_linkonce (int ignore ATTRIBUTE_UNUSED)
1866 enum linkonce_type type;
1868 SKIP_WHITESPACE ();
1870 type = LINKONCE_DISCARD;
1872 if (!is_end_of_line[(unsigned char) *input_line_pointer])
1874 char *s;
1875 char c;
1877 s = input_line_pointer;
1878 c = get_symbol_end ();
1879 if (strcasecmp (s, "discard") == 0)
1880 type = LINKONCE_DISCARD;
1881 else if (strcasecmp (s, "one_only") == 0)
1882 type = LINKONCE_ONE_ONLY;
1883 else if (strcasecmp (s, "same_size") == 0)
1884 type = LINKONCE_SAME_SIZE;
1885 else if (strcasecmp (s, "same_contents") == 0)
1886 type = LINKONCE_SAME_CONTENTS;
1887 else
1888 as_warn (_("unrecognized .linkonce type `%s'"), s);
1890 *input_line_pointer = c;
1893 #ifdef obj_handle_link_once
1894 obj_handle_link_once (type);
1895 #else /* ! defined (obj_handle_link_once) */
1896 #ifdef BFD_ASSEMBLER
1898 flagword flags;
1900 if ((bfd_applicable_section_flags (stdoutput) & SEC_LINK_ONCE) == 0)
1901 as_warn (_(".linkonce is not supported for this object file format"));
1903 flags = bfd_get_section_flags (stdoutput, now_seg);
1904 flags |= SEC_LINK_ONCE;
1905 switch (type)
1907 default:
1908 abort ();
1909 case LINKONCE_DISCARD:
1910 flags |= SEC_LINK_DUPLICATES_DISCARD;
1911 break;
1912 case LINKONCE_ONE_ONLY:
1913 flags |= SEC_LINK_DUPLICATES_ONE_ONLY;
1914 break;
1915 case LINKONCE_SAME_SIZE:
1916 flags |= SEC_LINK_DUPLICATES_SAME_SIZE;
1917 break;
1918 case LINKONCE_SAME_CONTENTS:
1919 flags |= SEC_LINK_DUPLICATES_SAME_CONTENTS;
1920 break;
1922 if (!bfd_set_section_flags (stdoutput, now_seg, flags))
1923 as_bad (_("bfd_set_section_flags: %s"),
1924 bfd_errmsg (bfd_get_error ()));
1926 #else /* ! defined (BFD_ASSEMBLER) */
1927 as_warn (_(".linkonce is not supported for this object file format"));
1928 #endif /* ! defined (BFD_ASSEMBLER) */
1929 #endif /* ! defined (obj_handle_link_once) */
1931 demand_empty_rest_of_line ();
1934 void
1935 bss_alloc (symbolS *symbolP, addressT size, int align)
1937 char *pfrag;
1938 segT current_seg = now_seg;
1939 subsegT current_subseg = now_subseg;
1940 segT bss_seg = bss_section;
1942 #if defined (TC_MIPS) || defined (TC_ALPHA)
1943 if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour
1944 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
1946 /* For MIPS and Alpha ECOFF or ELF, small objects are put in .sbss. */
1947 if (size <= bfd_get_gp_size (stdoutput))
1949 bss_seg = subseg_new (".sbss", 1);
1950 seg_info (bss_seg)->bss = 1;
1951 #ifdef BFD_ASSEMBLER
1952 if (!bfd_set_section_flags (stdoutput, bss_seg, SEC_ALLOC))
1953 as_warn (_("error setting flags for \".sbss\": %s"),
1954 bfd_errmsg (bfd_get_error ()));
1955 #endif
1958 #endif
1959 subseg_set (bss_seg, 1);
1961 if (align)
1963 record_alignment (bss_seg, align);
1964 frag_align (align, 0, 0);
1967 /* Detach from old frag. */
1968 if (S_GET_SEGMENT (symbolP) == bss_seg)
1969 symbol_get_frag (symbolP)->fr_symbol = NULL;
1971 symbol_set_frag (symbolP, frag_now);
1972 pfrag = frag_var (rs_org, 1, 1, 0, symbolP, size, NULL);
1973 *pfrag = 0;
1975 #ifdef S_SET_SIZE
1976 S_SET_SIZE (symbolP, size);
1977 #endif
1978 S_SET_SEGMENT (symbolP, bss_seg);
1980 #ifdef OBJ_COFF
1981 /* The symbol may already have been created with a preceding
1982 ".globl" directive -- be careful not to step on storage class
1983 in that case. Otherwise, set it to static. */
1984 if (S_GET_STORAGE_CLASS (symbolP) != C_EXT)
1985 S_SET_STORAGE_CLASS (symbolP, C_STAT);
1986 #endif /* OBJ_COFF */
1988 subseg_set (current_seg, current_subseg);
1991 offsetT
1992 parse_align (int align_bytes)
1994 expressionS exp;
1995 addressT align;
1997 SKIP_WHITESPACE ();
1998 if (*input_line_pointer != ',')
2000 no_align:
2001 as_bad (_("expected alignment after size"));
2002 ignore_rest_of_line ();
2003 return -1;
2006 input_line_pointer++;
2007 SKIP_WHITESPACE ();
2009 align = get_absolute_expr (&exp);
2010 if (exp.X_op == O_absent)
2011 goto no_align;
2013 if (!exp.X_unsigned)
2015 as_warn (_("alignment negative; 0 assumed"));
2016 align = 0;
2019 if (align_bytes && align != 0)
2021 /* convert to a power of 2 alignment */
2022 unsigned int alignp2 = 0;
2023 while ((align & 1) == 0)
2024 align >>= 1, ++alignp2;
2025 if (align != 1)
2027 as_bad (_("alignment not a power of 2"));
2028 ignore_rest_of_line ();
2029 return -1;
2031 align = alignp2;
2033 return align;
2036 /* Called from s_comm_internal after symbol name and size have been
2037 parsed. NEEDS_ALIGN is 0 if it was an ".lcomm" (2 args only),
2038 1 if this was a ".bss" directive which has a 3rd argument
2039 (alignment as a power of 2), or 2 if this was a ".bss" directive
2040 with alignment in bytes. */
2042 symbolS *
2043 s_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
2045 addressT align = 0;
2047 if (needs_align)
2049 align = parse_align (needs_align - 1);
2050 if (align == (addressT) -1)
2051 return NULL;
2053 else
2054 /* Assume some objects may require alignment on some systems. */
2055 TC_IMPLICIT_LCOMM_ALIGNMENT (size, align);
2057 bss_alloc (symbolP, size, align);
2058 return symbolP;
2061 void
2062 s_lcomm (int needs_align)
2064 s_comm_internal (needs_align, s_lcomm_internal);
2067 void
2068 s_lcomm_bytes (int needs_align)
2070 s_comm_internal (needs_align * 2, s_lcomm_internal);
2073 void
2074 s_lsym (int ignore ATTRIBUTE_UNUSED)
2076 register char *name;
2077 register char c;
2078 register char *p;
2079 expressionS exp;
2080 register symbolS *symbolP;
2082 /* We permit ANY defined expression: BSD4.2 demands constants. */
2083 name = input_line_pointer;
2084 c = get_symbol_end ();
2085 p = input_line_pointer;
2086 *p = c;
2088 if (name == p)
2090 as_bad (_("expected symbol name"));
2091 discard_rest_of_line ();
2092 return;
2095 SKIP_WHITESPACE ();
2097 if (*input_line_pointer != ',')
2099 *p = 0;
2100 as_bad (_("expected comma after \"%s\""), name);
2101 *p = c;
2102 ignore_rest_of_line ();
2103 return;
2106 input_line_pointer++;
2107 expression (&exp);
2109 if (exp.X_op != O_constant
2110 && exp.X_op != O_register)
2112 as_bad (_("bad expression"));
2113 ignore_rest_of_line ();
2114 return;
2117 *p = 0;
2118 symbolP = symbol_find_or_make (name);
2120 /* FIXME-SOON I pulled a (&& symbolP->sy_other == 0 &&
2121 symbolP->sy_desc == 0) out of this test because coff doesn't have
2122 those fields, and I can't see when they'd ever be tripped. I
2123 don't think I understand why they were here so I may have
2124 introduced a bug. As recently as 1.37 didn't have this test
2125 anyway. xoxorich. */
2127 if (S_GET_SEGMENT (symbolP) == undefined_section
2128 && S_GET_VALUE (symbolP) == 0)
2130 /* The name might be an undefined .global symbol; be sure to
2131 keep the "external" bit. */
2132 S_SET_SEGMENT (symbolP,
2133 (exp.X_op == O_constant
2134 ? absolute_section
2135 : reg_section));
2136 S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
2138 else
2140 as_bad (_("symbol `%s' is already defined"), name);
2143 *p = c;
2144 demand_empty_rest_of_line ();
2147 /* Read a line into an sb. Returns the character that ended the line
2148 or zero if there are no more lines. */
2150 static int
2151 get_line_sb (sb *line)
2153 char quote1, quote2, inquote;
2154 unsigned char c;
2156 if (input_line_pointer[-1] == '\n')
2157 bump_line_counters ();
2159 if (input_line_pointer >= buffer_limit)
2161 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2162 if (buffer_limit == 0)
2163 return 0;
2166 /* If app.c sets any other characters to LEX_IS_STRINGQUOTE, this
2167 code needs to be changed. */
2168 if (!flag_m68k_mri)
2169 quote1 = '"';
2170 else
2171 quote1 = '\0';
2173 quote2 = '\0';
2174 if (flag_m68k_mri)
2175 quote2 = '\'';
2176 #ifdef LEX_IS_STRINGQUOTE
2177 quote2 = '\'';
2178 #endif
2180 inquote = '\0';
2182 while ((c = * input_line_pointer ++) != 0
2183 && (!is_end_of_line[c]
2184 || (inquote != '\0' && c != '\n')))
2186 if (inquote == c)
2187 inquote = '\0';
2188 else if (inquote == '\0')
2190 if (c == quote1)
2191 inquote = quote1;
2192 else if (c == quote2)
2193 inquote = quote2;
2196 sb_add_char (line, c);
2199 /* Don't skip multiple end-of-line characters, because that breaks support
2200 for the IA-64 stop bit (;;) which looks like two consecutive end-of-line
2201 characters but isn't. Instead just skip one end of line character and
2202 return the character skipped so that the caller can re-insert it if
2203 necessary. */
2204 return c;
2207 /* Define a macro. This is an interface to macro.c. */
2209 void
2210 s_macro (int ignore ATTRIBUTE_UNUSED)
2212 char *file;
2213 unsigned int line;
2214 sb s;
2215 sb label;
2216 const char *err;
2217 const char *name;
2219 as_where (&file, &line);
2221 sb_new (&s);
2222 while (!is_end_of_line[(unsigned char) *input_line_pointer])
2223 sb_add_char (&s, *input_line_pointer++);
2225 sb_new (&label);
2226 if (line_label != NULL)
2227 sb_add_string (&label, S_GET_NAME (line_label));
2229 err = define_macro (0, &s, &label, get_line_sb, &name);
2230 if (err != NULL)
2231 as_bad_where (file, line, "%s", err);
2232 else
2234 if (line_label != NULL)
2236 S_SET_SEGMENT (line_label, undefined_section);
2237 S_SET_VALUE (line_label, 0);
2238 symbol_set_frag (line_label, &zero_address_frag);
2241 if (((NO_PSEUDO_DOT || flag_m68k_mri)
2242 && hash_find (po_hash, name) != NULL)
2243 || (!flag_m68k_mri
2244 && *name == '.'
2245 && hash_find (po_hash, name + 1) != NULL))
2246 as_warn (_("attempt to redefine pseudo-op `%s' ignored"),
2247 name);
2250 sb_kill (&s);
2253 /* Handle the .mexit pseudo-op, which immediately exits a macro
2254 expansion. */
2256 void
2257 s_mexit (int ignore ATTRIBUTE_UNUSED)
2259 cond_exit_macro (macro_nest);
2260 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2263 /* Switch in and out of MRI mode. */
2265 void
2266 s_mri (int ignore ATTRIBUTE_UNUSED)
2268 int on, old_flag;
2270 on = get_absolute_expression ();
2271 old_flag = flag_mri;
2272 if (on != 0)
2274 flag_mri = 1;
2275 #ifdef TC_M68K
2276 flag_m68k_mri = 1;
2277 #endif
2278 macro_mri_mode (1);
2280 else
2282 flag_mri = 0;
2283 #ifdef TC_M68K
2284 flag_m68k_mri = 0;
2285 #endif
2286 macro_mri_mode (0);
2289 /* Operator precedence changes in m68k MRI mode, so we need to
2290 update the operator rankings. */
2291 expr_set_precedence ();
2293 #ifdef MRI_MODE_CHANGE
2294 if (on != old_flag)
2295 MRI_MODE_CHANGE (on);
2296 #endif
2298 demand_empty_rest_of_line ();
2301 /* Handle changing the location counter. */
2303 static void
2304 do_org (segT segment, expressionS *exp, int fill)
2306 if (segment != now_seg && segment != absolute_section)
2307 as_bad (_("invalid segment \"%s\""), segment_name (segment));
2309 if (now_seg == absolute_section)
2311 if (fill != 0)
2312 as_warn (_("ignoring fill value in absolute section"));
2313 if (exp->X_op != O_constant)
2315 as_bad (_("only constant offsets supported in absolute section"));
2316 exp->X_add_number = 0;
2318 abs_section_offset = exp->X_add_number;
2320 else
2322 char *p;
2323 symbolS *sym = exp->X_add_symbol;
2324 offsetT off = exp->X_add_number * OCTETS_PER_BYTE;
2326 if (exp->X_op != O_constant && exp->X_op != O_symbol)
2328 /* Handle complex expressions. */
2329 sym = make_expr_symbol (exp);
2330 off = 0;
2333 p = frag_var (rs_org, 1, 1, (relax_substateT) 0, sym, off, (char *) 0);
2334 *p = fill;
2338 void
2339 s_org (int ignore ATTRIBUTE_UNUSED)
2341 register segT segment;
2342 expressionS exp;
2343 register long temp_fill;
2345 #ifdef md_flush_pending_output
2346 md_flush_pending_output ();
2347 #endif
2349 /* The m68k MRI assembler has a different meaning for .org. It
2350 means to create an absolute section at a given address. We can't
2351 support that--use a linker script instead. */
2352 if (flag_m68k_mri)
2354 as_bad (_("MRI style ORG pseudo-op not supported"));
2355 ignore_rest_of_line ();
2356 return;
2359 /* Don't believe the documentation of BSD 4.2 AS. There is no such
2360 thing as a sub-segment-relative origin. Any absolute origin is
2361 given a warning, then assumed to be segment-relative. Any
2362 segmented origin expression ("foo+42") had better be in the right
2363 segment or the .org is ignored.
2365 BSD 4.2 AS warns if you try to .org backwards. We cannot because
2366 we never know sub-segment sizes when we are reading code. BSD
2367 will crash trying to emit negative numbers of filler bytes in
2368 certain .orgs. We don't crash, but see as-write for that code.
2370 Don't make frag if need_pass_2==1. */
2371 segment = get_known_segmented_expression (&exp);
2372 if (*input_line_pointer == ',')
2374 input_line_pointer++;
2375 temp_fill = get_absolute_expression ();
2377 else
2378 temp_fill = 0;
2380 if (!need_pass_2)
2381 do_org (segment, &exp, temp_fill);
2383 demand_empty_rest_of_line ();
2386 /* Handle parsing for the MRI SECT/SECTION pseudo-op. This should be
2387 called by the obj-format routine which handles section changing
2388 when in MRI mode. It will create a new section, and return it. It
2389 will set *TYPE to the section type: one of 'C' (code), 'D' (data),
2390 'M' (mixed), or 'R' (romable). If BFD_ASSEMBLER is defined, the
2391 flags will be set in the section. */
2393 void
2394 s_mri_sect (char *type ATTRIBUTE_UNUSED)
2396 #ifdef TC_M68K
2398 char *name;
2399 char c;
2400 segT seg;
2402 SKIP_WHITESPACE ();
2404 name = input_line_pointer;
2405 if (!ISDIGIT (*name))
2406 c = get_symbol_end ();
2407 else
2411 ++input_line_pointer;
2413 while (ISDIGIT (*input_line_pointer));
2415 c = *input_line_pointer;
2416 *input_line_pointer = '\0';
2419 name = xstrdup (name);
2421 *input_line_pointer = c;
2423 seg = subseg_new (name, 0);
2425 if (*input_line_pointer == ',')
2427 int align;
2429 ++input_line_pointer;
2430 align = get_absolute_expression ();
2431 record_alignment (seg, align);
2434 *type = 'C';
2435 if (*input_line_pointer == ',')
2437 c = *++input_line_pointer;
2438 c = TOUPPER (c);
2439 if (c == 'C' || c == 'D' || c == 'M' || c == 'R')
2440 *type = c;
2441 else
2442 as_bad (_("unrecognized section type"));
2443 ++input_line_pointer;
2445 #ifdef BFD_ASSEMBLER
2447 flagword flags;
2449 flags = SEC_NO_FLAGS;
2450 if (*type == 'C')
2451 flags = SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE;
2452 else if (*type == 'D' || *type == 'M')
2453 flags = SEC_ALLOC | SEC_LOAD | SEC_DATA;
2454 else if (*type == 'R')
2455 flags = SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_READONLY | SEC_ROM;
2456 if (flags != SEC_NO_FLAGS)
2458 if (!bfd_set_section_flags (stdoutput, seg, flags))
2459 as_warn (_("error setting flags for \"%s\": %s"),
2460 bfd_section_name (stdoutput, seg),
2461 bfd_errmsg (bfd_get_error ()));
2464 #endif
2467 /* Ignore the HP type. */
2468 if (*input_line_pointer == ',')
2469 input_line_pointer += 2;
2471 demand_empty_rest_of_line ();
2473 #else /* ! TC_M68K */
2474 #ifdef TC_I960
2476 char *name;
2477 char c;
2478 segT seg;
2480 SKIP_WHITESPACE ();
2482 name = input_line_pointer;
2483 c = get_symbol_end ();
2485 name = xstrdup (name);
2487 *input_line_pointer = c;
2489 seg = subseg_new (name, 0);
2491 if (*input_line_pointer != ',')
2492 *type = 'C';
2493 else
2495 char *sectype;
2497 ++input_line_pointer;
2498 SKIP_WHITESPACE ();
2499 sectype = input_line_pointer;
2500 c = get_symbol_end ();
2501 if (*sectype == '\0')
2502 *type = 'C';
2503 else if (strcasecmp (sectype, "text") == 0)
2504 *type = 'C';
2505 else if (strcasecmp (sectype, "data") == 0)
2506 *type = 'D';
2507 else if (strcasecmp (sectype, "romdata") == 0)
2508 *type = 'R';
2509 else
2510 as_warn (_("unrecognized section type `%s'"), sectype);
2511 *input_line_pointer = c;
2514 if (*input_line_pointer == ',')
2516 char *seccmd;
2518 ++input_line_pointer;
2519 SKIP_WHITESPACE ();
2520 seccmd = input_line_pointer;
2521 c = get_symbol_end ();
2522 if (strcasecmp (seccmd, "absolute") == 0)
2524 as_bad (_("absolute sections are not supported"));
2525 *input_line_pointer = c;
2526 ignore_rest_of_line ();
2527 return;
2529 else if (strcasecmp (seccmd, "align") == 0)
2531 int align;
2533 *input_line_pointer = c;
2534 align = get_absolute_expression ();
2535 record_alignment (seg, align);
2537 else
2539 as_warn (_("unrecognized section command `%s'"), seccmd);
2540 *input_line_pointer = c;
2544 demand_empty_rest_of_line ();
2546 #else /* ! TC_I960 */
2547 /* The MRI assembler seems to use different forms of .sect for
2548 different targets. */
2549 as_bad ("MRI mode not supported for this target");
2550 ignore_rest_of_line ();
2551 #endif /* ! TC_I960 */
2552 #endif /* ! TC_M68K */
2555 /* Handle the .print pseudo-op. */
2557 void
2558 s_print (int ignore ATTRIBUTE_UNUSED)
2560 char *s;
2561 int len;
2563 s = demand_copy_C_string (&len);
2564 if (s != NULL)
2565 printf ("%s\n", s);
2566 demand_empty_rest_of_line ();
2569 /* Handle the .purgem pseudo-op. */
2571 void
2572 s_purgem (int ignore ATTRIBUTE_UNUSED)
2574 if (is_it_end_of_statement ())
2576 demand_empty_rest_of_line ();
2577 return;
2582 char *name;
2583 char c;
2585 SKIP_WHITESPACE ();
2586 name = input_line_pointer;
2587 c = get_symbol_end ();
2588 delete_macro (name);
2589 *input_line_pointer = c;
2590 SKIP_WHITESPACE ();
2592 while (*input_line_pointer++ == ',');
2594 --input_line_pointer;
2595 demand_empty_rest_of_line ();
2598 /* Handle the .rept pseudo-op. */
2600 void
2601 s_bad_endr (int ignore ATTRIBUTE_UNUSED)
2603 as_warn (_(".endr encountered without preceeding .rept, .irc, or .irp"));
2604 demand_empty_rest_of_line ();
2607 /* Handle the .rept pseudo-op. */
2609 void
2610 s_rept (int ignore ATTRIBUTE_UNUSED)
2612 int count;
2614 count = get_absolute_expression ();
2616 do_repeat (count, "REPT", "ENDR");
2619 /* This function provides a generic repeat block implementation. It allows
2620 different directives to be used as the start/end keys. */
2622 void
2623 do_repeat (int count, const char *start, const char *end)
2625 sb one;
2626 sb many;
2628 sb_new (&one);
2629 if (!buffer_and_nest (start, end, &one, get_line_sb))
2631 as_bad (_("%s without %s"), start, end);
2632 return;
2635 sb_new (&many);
2636 while (count-- > 0)
2637 sb_add_sb (&many, &one);
2639 sb_kill (&one);
2641 input_scrub_include_sb (&many, input_line_pointer, 1);
2642 sb_kill (&many);
2643 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2646 /* Skip to end of current repeat loop; EXTRA indicates how many additional
2647 input buffers to skip. Assumes that conditionals preceding the loop end
2648 are properly nested.
2650 This function makes it easier to implement a premature "break" out of the
2651 loop. The EXTRA arg accounts for other buffers we might have inserted,
2652 such as line substitutions. */
2654 void
2655 end_repeat (int extra)
2657 cond_exit_macro (macro_nest);
2658 while (extra-- >= 0)
2659 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2662 /* Handle the .equ, .equiv and .set directives. If EQUIV is 1, then
2663 this is .equiv, and it is an error if the symbol is already
2664 defined. */
2666 void
2667 s_set (int equiv)
2669 register char *name;
2670 register char delim;
2671 register char *end_name;
2672 register symbolS *symbolP;
2674 /* Especial apologies for the random logic:
2675 this just grew, and could be parsed much more simply!
2676 Dean in haste. */
2677 name = input_line_pointer;
2678 delim = get_symbol_end ();
2679 end_name = input_line_pointer;
2680 *end_name = delim;
2682 if (name == end_name)
2684 as_bad (_("expected symbol name"));
2685 discard_rest_of_line ();
2686 return;
2689 SKIP_WHITESPACE ();
2691 if (*input_line_pointer != ',')
2693 *end_name = 0;
2694 as_bad (_("expected comma after \"%s\""), name);
2695 *end_name = delim;
2696 ignore_rest_of_line ();
2697 return;
2700 input_line_pointer++;
2701 *end_name = 0;
2703 if (name[0] == '.' && name[1] == '\0')
2705 /* Turn '. = mumble' into a .org mumble. */
2706 register segT segment;
2707 expressionS exp;
2709 segment = get_known_segmented_expression (&exp);
2711 if (!need_pass_2)
2712 do_org (segment, &exp, 0);
2714 *end_name = delim;
2715 return;
2718 if ((symbolP = symbol_find (name)) == NULL
2719 && (symbolP = md_undefined_symbol (name)) == NULL)
2721 #ifndef NO_LISTING
2722 /* When doing symbol listings, play games with dummy fragments living
2723 outside the normal fragment chain to record the file and line info
2724 for this symbol. */
2725 if (listing & LISTING_SYMBOLS)
2727 extern struct list_info_struct *listing_tail;
2728 fragS *dummy_frag = (fragS *) xmalloc (sizeof (fragS));
2729 memset (dummy_frag, 0, sizeof (fragS));
2730 dummy_frag->fr_type = rs_fill;
2731 dummy_frag->line = listing_tail;
2732 symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
2733 dummy_frag->fr_symbol = symbolP;
2735 else
2736 #endif
2737 symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
2739 #ifdef OBJ_COFF
2740 /* "set" symbols are local unless otherwise specified. */
2741 SF_SET_LOCAL (symbolP);
2742 #endif /* OBJ_COFF */
2745 symbol_table_insert (symbolP);
2747 *end_name = delim;
2749 if (equiv
2750 && S_IS_DEFINED (symbolP)
2751 && S_GET_SEGMENT (symbolP) != reg_section)
2752 as_bad (_("symbol `%s' is already defined"), S_GET_NAME (symbolP));
2754 pseudo_set (symbolP);
2755 demand_empty_rest_of_line ();
2758 void
2759 s_space (int mult)
2761 expressionS exp;
2762 expressionS val;
2763 char *p = 0;
2764 char *stop = NULL;
2765 char stopc;
2766 int bytes;
2768 #ifdef md_flush_pending_output
2769 md_flush_pending_output ();
2770 #endif
2772 if (flag_mri)
2773 stop = mri_comment_field (&stopc);
2775 /* In m68k MRI mode, we need to align to a word boundary, unless
2776 this is ds.b. */
2777 if (flag_m68k_mri && mult > 1)
2779 if (now_seg == absolute_section)
2781 abs_section_offset += abs_section_offset & 1;
2782 if (line_label != NULL)
2783 S_SET_VALUE (line_label, abs_section_offset);
2785 else if (mri_common_symbol != NULL)
2787 valueT val;
2789 val = S_GET_VALUE (mri_common_symbol);
2790 if ((val & 1) != 0)
2792 S_SET_VALUE (mri_common_symbol, val + 1);
2793 if (line_label != NULL)
2795 expressionS *symexp;
2797 symexp = symbol_get_value_expression (line_label);
2798 know (symexp->X_op == O_symbol);
2799 know (symexp->X_add_symbol == mri_common_symbol);
2800 symexp->X_add_number += 1;
2804 else
2806 do_align (1, (char *) NULL, 0, 0);
2807 if (line_label != NULL)
2809 symbol_set_frag (line_label, frag_now);
2810 S_SET_VALUE (line_label, frag_now_fix ());
2815 bytes = mult;
2817 expression (&exp);
2819 SKIP_WHITESPACE ();
2820 if (*input_line_pointer == ',')
2822 ++input_line_pointer;
2823 expression (&val);
2825 else
2827 val.X_op = O_constant;
2828 val.X_add_number = 0;
2831 if (val.X_op != O_constant
2832 || val.X_add_number < - 0x80
2833 || val.X_add_number > 0xff
2834 || (mult != 0 && mult != 1 && val.X_add_number != 0))
2836 if (exp.X_op != O_constant)
2837 as_bad (_("unsupported variable size or fill value"));
2838 else
2840 offsetT i;
2842 if (mult == 0)
2843 mult = 1;
2844 bytes = mult * exp.X_add_number;
2845 for (i = 0; i < exp.X_add_number; i++)
2846 emit_expr (&val, mult);
2849 else
2851 if (exp.X_op == O_constant)
2853 long repeat;
2855 repeat = exp.X_add_number;
2856 if (mult)
2857 repeat *= mult;
2858 bytes = repeat;
2859 if (repeat <= 0)
2861 if (!flag_mri)
2862 as_warn (_(".space repeat count is zero, ignored"));
2863 else if (repeat < 0)
2864 as_warn (_(".space repeat count is negative, ignored"));
2865 goto getout;
2868 /* If we are in the absolute section, just bump the offset. */
2869 if (now_seg == absolute_section)
2871 abs_section_offset += repeat;
2872 goto getout;
2875 /* If we are secretly in an MRI common section, then
2876 creating space just increases the size of the common
2877 symbol. */
2878 if (mri_common_symbol != NULL)
2880 S_SET_VALUE (mri_common_symbol,
2881 S_GET_VALUE (mri_common_symbol) + repeat);
2882 goto getout;
2885 if (!need_pass_2)
2886 p = frag_var (rs_fill, 1, 1, (relax_substateT) 0, (symbolS *) 0,
2887 (offsetT) repeat, (char *) 0);
2889 else
2891 if (now_seg == absolute_section)
2893 as_bad (_("space allocation too complex in absolute section"));
2894 subseg_set (text_section, 0);
2897 if (mri_common_symbol != NULL)
2899 as_bad (_("space allocation too complex in common section"));
2900 mri_common_symbol = NULL;
2903 if (!need_pass_2)
2904 p = frag_var (rs_space, 1, 1, (relax_substateT) 0,
2905 make_expr_symbol (&exp), (offsetT) 0, (char *) 0);
2908 if (p)
2909 *p = val.X_add_number;
2912 getout:
2914 /* In MRI mode, after an odd number of bytes, we must align to an
2915 even word boundary, unless the next instruction is a dc.b, ds.b
2916 or dcb.b. */
2917 if (flag_mri && (bytes & 1) != 0)
2918 mri_pending_align = 1;
2920 demand_empty_rest_of_line ();
2922 if (flag_mri)
2923 mri_comment_end (stop, stopc);
2926 /* This is like s_space, but the value is a floating point number with
2927 the given precision. This is for the MRI dcb.s pseudo-op and
2928 friends. */
2930 void
2931 s_float_space (int float_type)
2933 offsetT count;
2934 int flen;
2935 char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
2936 char *stop = NULL;
2937 char stopc;
2939 if (flag_mri)
2940 stop = mri_comment_field (&stopc);
2942 count = get_absolute_expression ();
2944 SKIP_WHITESPACE ();
2945 if (*input_line_pointer != ',')
2947 as_bad (_("missing value"));
2948 ignore_rest_of_line ();
2949 if (flag_mri)
2950 mri_comment_end (stop, stopc);
2951 return;
2954 ++input_line_pointer;
2956 SKIP_WHITESPACE ();
2958 /* Skip any 0{letter} that may be present. Don't even check if the
2959 * letter is legal. */
2960 if (input_line_pointer[0] == '0'
2961 && ISALPHA (input_line_pointer[1]))
2962 input_line_pointer += 2;
2964 /* Accept :xxxx, where the x's are hex digits, for a floating point
2965 with the exact digits specified. */
2966 if (input_line_pointer[0] == ':')
2968 flen = hex_float (float_type, temp);
2969 if (flen < 0)
2971 ignore_rest_of_line ();
2972 if (flag_mri)
2973 mri_comment_end (stop, stopc);
2974 return;
2977 else
2979 char *err;
2981 err = md_atof (float_type, temp, &flen);
2982 know (flen <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
2983 know (flen > 0);
2984 if (err)
2986 as_bad (_("bad floating literal: %s"), err);
2987 ignore_rest_of_line ();
2988 if (flag_mri)
2989 mri_comment_end (stop, stopc);
2990 return;
2994 while (--count >= 0)
2996 char *p;
2998 p = frag_more (flen);
2999 memcpy (p, temp, (unsigned int) flen);
3002 demand_empty_rest_of_line ();
3004 if (flag_mri)
3005 mri_comment_end (stop, stopc);
3008 /* Handle the .struct pseudo-op, as found in MIPS assemblers. */
3010 void
3011 s_struct (int ignore ATTRIBUTE_UNUSED)
3013 char *stop = NULL;
3014 char stopc;
3016 if (flag_mri)
3017 stop = mri_comment_field (&stopc);
3018 abs_section_offset = get_absolute_expression ();
3019 subseg_set (absolute_section, 0);
3020 demand_empty_rest_of_line ();
3021 if (flag_mri)
3022 mri_comment_end (stop, stopc);
3025 void
3026 s_text (int ignore ATTRIBUTE_UNUSED)
3028 register int temp;
3030 temp = get_absolute_expression ();
3031 subseg_set (text_section, (subsegT) temp);
3032 demand_empty_rest_of_line ();
3033 #ifdef OBJ_VMS
3034 const_flag &= ~IN_DEFAULT_SECTION;
3035 #endif
3039 /* Verify that we are at the end of a line. If not, issue an error and
3040 skip to EOL. */
3042 void
3043 demand_empty_rest_of_line (void)
3045 SKIP_WHITESPACE ();
3046 if (is_end_of_line[(unsigned char) *input_line_pointer])
3047 input_line_pointer++;
3048 else
3050 if (ISPRINT (*input_line_pointer))
3051 as_bad (_("junk at end of line, first unrecognized character is `%c'"),
3052 *input_line_pointer);
3053 else
3054 as_bad (_("junk at end of line, first unrecognized character valued 0x%x"),
3055 *input_line_pointer);
3056 ignore_rest_of_line ();
3059 /* Return pointing just after end-of-line. */
3060 know (is_end_of_line[(unsigned char) input_line_pointer[-1]]);
3063 /* Silently advance to the end of line. Use this after already having
3064 issued an error about something bad. */
3066 void
3067 ignore_rest_of_line (void)
3069 while (input_line_pointer < buffer_limit
3070 && !is_end_of_line[(unsigned char) *input_line_pointer])
3071 input_line_pointer++;
3073 input_line_pointer++;
3075 /* Return pointing just after end-of-line. */
3076 know (is_end_of_line[(unsigned char) input_line_pointer[-1]]);
3079 void
3080 discard_rest_of_line (void)
3082 while (input_line_pointer < buffer_limit
3083 && !is_end_of_line[(unsigned char) *input_line_pointer])
3084 input_line_pointer++;
3086 input_line_pointer++;
3088 /* Return pointing just after end-of-line. */
3089 know (is_end_of_line[(unsigned char) input_line_pointer[-1]]);
3092 /* In: Pointer to a symbol.
3093 Input_line_pointer->expression.
3095 Out: Input_line_pointer->just after any whitespace after expression.
3096 Tried to set symbol to value of expression.
3097 Will change symbols type, value, and frag; */
3099 void
3100 pseudo_set (symbolS *symbolP)
3102 expressionS exp;
3103 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3104 int ext;
3105 #endif /* OBJ_AOUT or OBJ_BOUT */
3107 know (symbolP); /* NULL pointer is logic error. */
3108 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3109 ext = S_IS_EXTERNAL (symbolP);
3110 #endif /* OBJ_AOUT or OBJ_BOUT */
3112 (void) expression (&exp);
3114 if (exp.X_op == O_illegal)
3115 as_bad (_("illegal expression"));
3116 else if (exp.X_op == O_absent)
3117 as_bad (_("missing expression"));
3118 else if (exp.X_op == O_big)
3120 if (exp.X_add_number > 0)
3121 as_bad (_("bignum invalid"));
3122 else
3123 as_bad (_("floating point number invalid"));
3125 else if (exp.X_op == O_subtract
3126 && SEG_NORMAL (S_GET_SEGMENT (exp.X_add_symbol))
3127 && (symbol_get_frag (exp.X_add_symbol)
3128 == symbol_get_frag (exp.X_op_symbol)))
3130 exp.X_op = O_constant;
3131 exp.X_add_number = (S_GET_VALUE (exp.X_add_symbol)
3132 - S_GET_VALUE (exp.X_op_symbol));
3135 switch (exp.X_op)
3137 case O_illegal:
3138 case O_absent:
3139 case O_big:
3140 exp.X_add_number = 0;
3141 /* Fall through. */
3142 case O_constant:
3143 S_SET_SEGMENT (symbolP, absolute_section);
3144 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3145 if (ext)
3146 S_SET_EXTERNAL (symbolP);
3147 else
3148 S_CLEAR_EXTERNAL (symbolP);
3149 #endif /* OBJ_AOUT or OBJ_BOUT */
3150 S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
3151 if (exp.X_op != O_constant)
3152 symbol_set_frag (symbolP, &zero_address_frag);
3153 break;
3155 case O_register:
3156 S_SET_SEGMENT (symbolP, reg_section);
3157 S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
3158 symbol_set_frag (symbolP, &zero_address_frag);
3159 break;
3161 case O_symbol:
3162 if (S_GET_SEGMENT (exp.X_add_symbol) == undefined_section
3163 || exp.X_add_number != 0)
3164 symbol_set_value_expression (symbolP, &exp);
3165 else if (symbol_section_p (symbolP))
3166 as_bad ("attempt to set value of section symbol");
3167 else
3169 symbolS *s = exp.X_add_symbol;
3171 S_SET_SEGMENT (symbolP, S_GET_SEGMENT (s));
3172 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3173 if (ext)
3174 S_SET_EXTERNAL (symbolP);
3175 else
3176 S_CLEAR_EXTERNAL (symbolP);
3177 #endif /* OBJ_AOUT or OBJ_BOUT */
3178 S_SET_VALUE (symbolP,
3179 exp.X_add_number + S_GET_VALUE (s));
3180 symbol_set_frag (symbolP, symbol_get_frag (s));
3181 copy_symbol_attributes (symbolP, s);
3183 break;
3185 default:
3186 /* The value is some complex expression.
3187 FIXME: Should we set the segment to anything? */
3188 symbol_set_value_expression (symbolP, &exp);
3189 break;
3193 /* cons()
3195 CONStruct more frag of .bytes, or .words etc.
3196 Should need_pass_2 be 1 then emit no frag(s).
3197 This understands EXPRESSIONS.
3199 Bug (?)
3201 This has a split personality. We use expression() to read the
3202 value. We can detect if the value won't fit in a byte or word.
3203 But we can't detect if expression() discarded significant digits
3204 in the case of a long. Not worth the crocks required to fix it. */
3206 /* Select a parser for cons expressions. */
3208 /* Some targets need to parse the expression in various fancy ways.
3209 You can define TC_PARSE_CONS_EXPRESSION to do whatever you like
3210 (for example, the HPPA does this). Otherwise, you can define
3211 BITFIELD_CONS_EXPRESSIONS to permit bitfields to be specified, or
3212 REPEAT_CONS_EXPRESSIONS to permit repeat counts. If none of these
3213 are defined, which is the normal case, then only simple expressions
3214 are permitted. */
3216 #ifdef TC_M68K
3217 static void
3218 parse_mri_cons (expressionS *exp, unsigned int nbytes);
3219 #endif
3221 #ifndef TC_PARSE_CONS_EXPRESSION
3222 #ifdef BITFIELD_CONS_EXPRESSIONS
3223 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_bitfield_cons (EXP, NBYTES)
3224 static void
3225 parse_bitfield_cons (expressionS *exp, unsigned int nbytes);
3226 #endif
3227 #ifdef REPEAT_CONS_EXPRESSIONS
3228 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_repeat_cons (EXP, NBYTES)
3229 static void
3230 parse_repeat_cons (expressionS *exp, unsigned int nbytes);
3231 #endif
3233 /* If we haven't gotten one yet, just call expression. */
3234 #ifndef TC_PARSE_CONS_EXPRESSION
3235 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) expression (EXP)
3236 #endif
3237 #endif
3239 void
3240 do_parse_cons_expression (expressionS *exp,
3241 int nbytes ATTRIBUTE_UNUSED)
3243 TC_PARSE_CONS_EXPRESSION (exp, nbytes);
3247 /* Worker to do .byte etc statements.
3248 Clobbers input_line_pointer and checks end-of-line. */
3250 static void
3251 cons_worker (register int nbytes, /* 1=.byte, 2=.word, 4=.long. */
3252 int rva)
3254 int c;
3255 expressionS exp;
3256 char *stop = NULL;
3257 char stopc;
3259 #ifdef md_flush_pending_output
3260 md_flush_pending_output ();
3261 #endif
3263 if (flag_mri)
3264 stop = mri_comment_field (&stopc);
3266 if (is_it_end_of_statement ())
3268 demand_empty_rest_of_line ();
3269 if (flag_mri)
3270 mri_comment_end (stop, stopc);
3271 return;
3274 #ifdef md_cons_align
3275 md_cons_align (nbytes);
3276 #endif
3278 c = 0;
3281 #ifdef TC_M68K
3282 if (flag_m68k_mri)
3283 parse_mri_cons (&exp, (unsigned int) nbytes);
3284 else
3285 #endif
3286 TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes);
3288 if (rva)
3290 if (exp.X_op == O_symbol)
3291 exp.X_op = O_symbol_rva;
3292 else
3293 as_fatal (_("rva without symbol"));
3295 emit_expr (&exp, (unsigned int) nbytes);
3296 ++c;
3298 while (*input_line_pointer++ == ',');
3300 /* In MRI mode, after an odd number of bytes, we must align to an
3301 even word boundary, unless the next instruction is a dc.b, ds.b
3302 or dcb.b. */
3303 if (flag_mri && nbytes == 1 && (c & 1) != 0)
3304 mri_pending_align = 1;
3306 input_line_pointer--; /* Put terminator back into stream. */
3308 demand_empty_rest_of_line ();
3310 if (flag_mri)
3311 mri_comment_end (stop, stopc);
3314 void
3315 cons (int size)
3317 cons_worker (size, 0);
3320 void
3321 s_rva (int size)
3323 cons_worker (size, 1);
3326 /* Put the contents of expression EXP into the object file using
3327 NBYTES bytes. If need_pass_2 is 1, this does nothing. */
3329 void
3330 emit_expr (expressionS *exp, unsigned int nbytes)
3332 operatorT op;
3333 register char *p;
3334 valueT extra_digit = 0;
3336 /* Don't do anything if we are going to make another pass. */
3337 if (need_pass_2)
3338 return;
3340 dot_value = frag_now_fix ();
3342 #ifndef NO_LISTING
3343 #ifdef OBJ_ELF
3344 /* When gcc emits DWARF 1 debugging pseudo-ops, a line number will
3345 appear as a four byte positive constant in the .line section,
3346 followed by a 2 byte 0xffff. Look for that case here. */
3348 static int dwarf_line = -1;
3350 if (strcmp (segment_name (now_seg), ".line") != 0)
3351 dwarf_line = -1;
3352 else if (dwarf_line >= 0
3353 && nbytes == 2
3354 && exp->X_op == O_constant
3355 && (exp->X_add_number == -1 || exp->X_add_number == 0xffff))
3356 listing_source_line ((unsigned int) dwarf_line);
3357 else if (nbytes == 4
3358 && exp->X_op == O_constant
3359 && exp->X_add_number >= 0)
3360 dwarf_line = exp->X_add_number;
3361 else
3362 dwarf_line = -1;
3365 /* When gcc emits DWARF 1 debugging pseudo-ops, a file name will
3366 appear as a 2 byte TAG_compile_unit (0x11) followed by a 2 byte
3367 AT_sibling (0x12) followed by a four byte address of the sibling
3368 followed by a 2 byte AT_name (0x38) followed by the name of the
3369 file. We look for that case here. */
3371 static int dwarf_file = 0;
3373 if (strcmp (segment_name (now_seg), ".debug") != 0)
3374 dwarf_file = 0;
3375 else if (dwarf_file == 0
3376 && nbytes == 2
3377 && exp->X_op == O_constant
3378 && exp->X_add_number == 0x11)
3379 dwarf_file = 1;
3380 else if (dwarf_file == 1
3381 && nbytes == 2
3382 && exp->X_op == O_constant
3383 && exp->X_add_number == 0x12)
3384 dwarf_file = 2;
3385 else if (dwarf_file == 2
3386 && nbytes == 4)
3387 dwarf_file = 3;
3388 else if (dwarf_file == 3
3389 && nbytes == 2
3390 && exp->X_op == O_constant
3391 && exp->X_add_number == 0x38)
3392 dwarf_file = 4;
3393 else
3394 dwarf_file = 0;
3396 /* The variable dwarf_file_string tells stringer that the string
3397 may be the name of the source file. */
3398 if (dwarf_file == 4)
3399 dwarf_file_string = 1;
3400 else
3401 dwarf_file_string = 0;
3403 #endif
3404 #endif
3406 if (check_eh_frame (exp, &nbytes))
3407 return;
3409 op = exp->X_op;
3411 /* Allow `.word 0' in the absolute section. */
3412 if (now_seg == absolute_section)
3414 if (op != O_constant || exp->X_add_number != 0)
3415 as_bad (_("attempt to store value in absolute section"));
3416 abs_section_offset += nbytes;
3417 return;
3420 /* Handle a negative bignum. */
3421 if (op == O_uminus
3422 && exp->X_add_number == 0
3423 && symbol_get_value_expression (exp->X_add_symbol)->X_op == O_big
3424 && symbol_get_value_expression (exp->X_add_symbol)->X_add_number > 0)
3426 int i;
3427 unsigned long carry;
3429 exp = symbol_get_value_expression (exp->X_add_symbol);
3431 /* Negate the bignum: one's complement each digit and add 1. */
3432 carry = 1;
3433 for (i = 0; i < exp->X_add_number; i++)
3435 unsigned long next;
3437 next = (((~(generic_bignum[i] & LITTLENUM_MASK))
3438 & LITTLENUM_MASK)
3439 + carry);
3440 generic_bignum[i] = next & LITTLENUM_MASK;
3441 carry = next >> LITTLENUM_NUMBER_OF_BITS;
3444 /* We can ignore any carry out, because it will be handled by
3445 extra_digit if it is needed. */
3447 extra_digit = (valueT) -1;
3448 op = O_big;
3451 if (op == O_absent || op == O_illegal)
3453 as_warn (_("zero assumed for missing expression"));
3454 exp->X_add_number = 0;
3455 op = O_constant;
3457 else if (op == O_big && exp->X_add_number <= 0)
3459 as_bad (_("floating point number invalid"));
3460 exp->X_add_number = 0;
3461 op = O_constant;
3463 else if (op == O_register)
3465 as_warn (_("register value used as expression"));
3466 op = O_constant;
3469 p = frag_more ((int) nbytes);
3471 #ifndef WORKING_DOT_WORD
3472 /* If we have the difference of two symbols in a word, save it on
3473 the broken_words list. See the code in write.c. */
3474 if (op == O_subtract && nbytes == 2)
3476 struct broken_word *x;
3478 x = (struct broken_word *) xmalloc (sizeof (struct broken_word));
3479 x->next_broken_word = broken_words;
3480 broken_words = x;
3481 x->seg = now_seg;
3482 x->subseg = now_subseg;
3483 x->frag = frag_now;
3484 x->word_goes_here = p;
3485 x->dispfrag = 0;
3486 x->add = exp->X_add_symbol;
3487 x->sub = exp->X_op_symbol;
3488 x->addnum = exp->X_add_number;
3489 x->added = 0;
3490 x->use_jump = 0;
3491 new_broken_words++;
3492 return;
3494 #endif
3496 /* If we have an integer, but the number of bytes is too large to
3497 pass to md_number_to_chars, handle it as a bignum. */
3498 if (op == O_constant && nbytes > sizeof (valueT))
3500 valueT val;
3501 int gencnt;
3503 if (!exp->X_unsigned && exp->X_add_number < 0)
3504 extra_digit = (valueT) -1;
3505 val = (valueT) exp->X_add_number;
3506 gencnt = 0;
3509 generic_bignum[gencnt] = val & LITTLENUM_MASK;
3510 val >>= LITTLENUM_NUMBER_OF_BITS;
3511 ++gencnt;
3513 while (val != 0);
3514 op = exp->X_op = O_big;
3515 exp->X_add_number = gencnt;
3518 if (op == O_constant)
3520 register valueT get;
3521 register valueT use;
3522 register valueT mask;
3523 valueT hibit;
3524 register valueT unmask;
3526 /* JF << of >= number of bits in the object is undefined. In
3527 particular SPARC (Sun 4) has problems. */
3528 if (nbytes >= sizeof (valueT))
3530 mask = 0;
3531 if (nbytes > sizeof (valueT))
3532 hibit = 0;
3533 else
3534 hibit = (valueT) 1 << (nbytes * BITS_PER_CHAR - 1);
3536 else
3538 /* Don't store these bits. */
3539 mask = ~(valueT) 0 << (BITS_PER_CHAR * nbytes);
3540 hibit = (valueT) 1 << (nbytes * BITS_PER_CHAR - 1);
3543 unmask = ~mask; /* Do store these bits. */
3545 #ifdef NEVER
3546 "Do this mod if you want every overflow check to assume SIGNED 2's complement data.";
3547 mask = ~(unmask >> 1); /* Includes sign bit now. */
3548 #endif
3550 get = exp->X_add_number;
3551 use = get & unmask;
3552 if ((get & mask) != 0
3553 && ((get & mask) != mask
3554 || (get & hibit) == 0))
3555 { /* Leading bits contain both 0s & 1s. */
3556 as_warn (_("value 0x%lx truncated to 0x%lx"),
3557 (unsigned long) get, (unsigned long) use);
3559 /* Put bytes in right order. */
3560 md_number_to_chars (p, use, (int) nbytes);
3562 else if (op == O_big)
3564 unsigned int size;
3565 LITTLENUM_TYPE *nums;
3567 know (nbytes % CHARS_PER_LITTLENUM == 0);
3569 size = exp->X_add_number * CHARS_PER_LITTLENUM;
3570 if (nbytes < size)
3572 as_warn (_("bignum truncated to %d bytes"), nbytes);
3573 size = nbytes;
3576 if (target_big_endian)
3578 while (nbytes > size)
3580 md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
3581 nbytes -= CHARS_PER_LITTLENUM;
3582 p += CHARS_PER_LITTLENUM;
3585 nums = generic_bignum + size / CHARS_PER_LITTLENUM;
3586 while (size >= CHARS_PER_LITTLENUM)
3588 --nums;
3589 md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
3590 size -= CHARS_PER_LITTLENUM;
3591 p += CHARS_PER_LITTLENUM;
3594 else
3596 nums = generic_bignum;
3597 while (size >= CHARS_PER_LITTLENUM)
3599 md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
3600 ++nums;
3601 size -= CHARS_PER_LITTLENUM;
3602 p += CHARS_PER_LITTLENUM;
3603 nbytes -= CHARS_PER_LITTLENUM;
3606 while (nbytes >= CHARS_PER_LITTLENUM)
3608 md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
3609 nbytes -= CHARS_PER_LITTLENUM;
3610 p += CHARS_PER_LITTLENUM;
3614 else
3616 memset (p, 0, nbytes);
3618 /* Now we need to generate a fixS to record the symbol value.
3619 This is easy for BFD. For other targets it can be more
3620 complex. For very complex cases (currently, the HPPA and
3621 NS32K), you can define TC_CONS_FIX_NEW to do whatever you
3622 want. For simpler cases, you can define TC_CONS_RELOC to be
3623 the name of the reloc code that should be stored in the fixS.
3624 If neither is defined, the code uses NO_RELOC if it is
3625 defined, and otherwise uses 0. */
3627 #ifdef BFD_ASSEMBLER
3628 #ifdef TC_CONS_FIX_NEW
3629 TC_CONS_FIX_NEW (frag_now, p - frag_now->fr_literal, nbytes, exp);
3630 #else
3632 bfd_reloc_code_real_type r;
3634 switch (nbytes)
3636 case 1:
3637 r = BFD_RELOC_8;
3638 break;
3639 case 2:
3640 r = BFD_RELOC_16;
3641 break;
3642 case 4:
3643 r = BFD_RELOC_32;
3644 break;
3645 case 8:
3646 r = BFD_RELOC_64;
3647 break;
3648 default:
3649 as_bad (_("unsupported BFD relocation size %u"), nbytes);
3650 r = BFD_RELOC_32;
3651 break;
3653 fix_new_exp (frag_now, p - frag_now->fr_literal, (int) nbytes, exp,
3654 0, r);
3656 #endif
3657 #else
3658 #ifdef TC_CONS_FIX_NEW
3659 TC_CONS_FIX_NEW (frag_now, p - frag_now->fr_literal, nbytes, exp);
3660 #else
3661 /* Figure out which reloc number to use. Use TC_CONS_RELOC if
3662 it is defined, otherwise use NO_RELOC if it is defined,
3663 otherwise use 0. */
3664 #ifndef TC_CONS_RELOC
3665 #ifdef NO_RELOC
3666 #define TC_CONS_RELOC NO_RELOC
3667 #else
3668 #define TC_CONS_RELOC 0
3669 #endif
3670 #endif
3671 fix_new_exp (frag_now, p - frag_now->fr_literal, (int) nbytes, exp, 0,
3672 TC_CONS_RELOC);
3673 #endif /* TC_CONS_FIX_NEW */
3674 #endif /* BFD_ASSEMBLER */
3678 #ifdef BITFIELD_CONS_EXPRESSIONS
3680 /* i960 assemblers, (eg, asm960), allow bitfields after ".byte" as
3681 w:x,y:z, where w and y are bitwidths and x and y are values. They
3682 then pack them all together. We do a little better in that we allow
3683 them in words, longs, etc. and we'll pack them in target byte order
3684 for you.
3686 The rules are: pack least significant bit first, if a field doesn't
3687 entirely fit, put it in the next unit. Overflowing the bitfield is
3688 explicitly *not* even a warning. The bitwidth should be considered
3689 a "mask".
3691 To use this function the tc-XXX.h file should define
3692 BITFIELD_CONS_EXPRESSIONS. */
3694 static void
3695 parse_bitfield_cons (exp, nbytes)
3696 expressionS *exp;
3697 unsigned int nbytes;
3699 unsigned int bits_available = BITS_PER_CHAR * nbytes;
3700 char *hold = input_line_pointer;
3702 (void) expression (exp);
3704 if (*input_line_pointer == ':')
3706 /* Bitfields. */
3707 long value = 0;
3709 for (;;)
3711 unsigned long width;
3713 if (*input_line_pointer != ':')
3715 input_line_pointer = hold;
3716 break;
3717 } /* Next piece is not a bitfield. */
3719 /* In the general case, we can't allow
3720 full expressions with symbol
3721 differences and such. The relocation
3722 entries for symbols not defined in this
3723 assembly would require arbitrary field
3724 widths, positions, and masks which most
3725 of our current object formats don't
3726 support.
3728 In the specific case where a symbol
3729 *is* defined in this assembly, we
3730 *could* build fixups and track it, but
3731 this could lead to confusion for the
3732 backends. I'm lazy. I'll take any
3733 SEG_ABSOLUTE. I think that means that
3734 you can use a previous .set or
3735 .equ type symbol. xoxorich. */
3737 if (exp->X_op == O_absent)
3739 as_warn (_("using a bit field width of zero"));
3740 exp->X_add_number = 0;
3741 exp->X_op = O_constant;
3742 } /* Implied zero width bitfield. */
3744 if (exp->X_op != O_constant)
3746 *input_line_pointer = '\0';
3747 as_bad (_("field width \"%s\" too complex for a bitfield"), hold);
3748 *input_line_pointer = ':';
3749 demand_empty_rest_of_line ();
3750 return;
3751 } /* Too complex. */
3753 if ((width = exp->X_add_number) > (BITS_PER_CHAR * nbytes))
3755 as_warn (_("field width %lu too big to fit in %d bytes: truncated to %d bits"),
3756 width, nbytes, (BITS_PER_CHAR * nbytes));
3757 width = BITS_PER_CHAR * nbytes;
3758 } /* Too big. */
3760 if (width > bits_available)
3762 /* FIXME-SOMEDAY: backing up and reparsing is wasteful. */
3763 input_line_pointer = hold;
3764 exp->X_add_number = value;
3765 break;
3766 } /* Won't fit. */
3768 /* Skip ':'. */
3769 hold = ++input_line_pointer;
3771 (void) expression (exp);
3772 if (exp->X_op != O_constant)
3774 char cache = *input_line_pointer;
3776 *input_line_pointer = '\0';
3777 as_bad (_("field value \"%s\" too complex for a bitfield"), hold);
3778 *input_line_pointer = cache;
3779 demand_empty_rest_of_line ();
3780 return;
3781 } /* Too complex. */
3783 value |= ((~(-1 << width) & exp->X_add_number)
3784 << ((BITS_PER_CHAR * nbytes) - bits_available));
3786 if ((bits_available -= width) == 0
3787 || is_it_end_of_statement ()
3788 || *input_line_pointer != ',')
3790 break;
3791 } /* All the bitfields we're gonna get. */
3793 hold = ++input_line_pointer;
3794 (void) expression (exp);
3797 exp->X_add_number = value;
3798 exp->X_op = O_constant;
3799 exp->X_unsigned = 1;
3803 #endif /* BITFIELD_CONS_EXPRESSIONS */
3805 /* Handle an MRI style string expression. */
3807 #ifdef TC_M68K
3808 static void
3809 parse_mri_cons (exp, nbytes)
3810 expressionS *exp;
3811 unsigned int nbytes;
3813 if (*input_line_pointer != '\''
3814 && (input_line_pointer[1] != '\''
3815 || (*input_line_pointer != 'A'
3816 && *input_line_pointer != 'E')))
3817 TC_PARSE_CONS_EXPRESSION (exp, nbytes);
3818 else
3820 unsigned int scan;
3821 unsigned int result = 0;
3823 /* An MRI style string. Cut into as many bytes as will fit into
3824 a nbyte chunk, left justify if necessary, and separate with
3825 commas so we can try again later. */
3826 if (*input_line_pointer == 'A')
3827 ++input_line_pointer;
3828 else if (*input_line_pointer == 'E')
3830 as_bad (_("EBCDIC constants are not supported"));
3831 ++input_line_pointer;
3834 input_line_pointer++;
3835 for (scan = 0; scan < nbytes; scan++)
3837 if (*input_line_pointer == '\'')
3839 if (input_line_pointer[1] == '\'')
3841 input_line_pointer++;
3843 else
3844 break;
3846 result = (result << 8) | (*input_line_pointer++);
3849 /* Left justify. */
3850 while (scan < nbytes)
3852 result <<= 8;
3853 scan++;
3856 /* Create correct expression. */
3857 exp->X_op = O_constant;
3858 exp->X_add_number = result;
3860 /* Fake it so that we can read the next char too. */
3861 if (input_line_pointer[0] != '\'' ||
3862 (input_line_pointer[0] == '\'' && input_line_pointer[1] == '\''))
3864 input_line_pointer -= 2;
3865 input_line_pointer[0] = ',';
3866 input_line_pointer[1] = '\'';
3868 else
3869 input_line_pointer++;
3872 #endif /* TC_M68K */
3874 #ifdef REPEAT_CONS_EXPRESSIONS
3876 /* Parse a repeat expression for cons. This is used by the MIPS
3877 assembler. The format is NUMBER:COUNT; NUMBER appears in the
3878 object file COUNT times.
3880 To use this for a target, define REPEAT_CONS_EXPRESSIONS. */
3882 static void
3883 parse_repeat_cons (exp, nbytes)
3884 expressionS *exp;
3885 unsigned int nbytes;
3887 expressionS count;
3888 register int i;
3890 expression (exp);
3892 if (*input_line_pointer != ':')
3894 /* No repeat count. */
3895 return;
3898 ++input_line_pointer;
3899 expression (&count);
3900 if (count.X_op != O_constant
3901 || count.X_add_number <= 0)
3903 as_warn (_("unresolvable or nonpositive repeat count; using 1"));
3904 return;
3907 /* The cons function is going to output this expression once. So we
3908 output it count - 1 times. */
3909 for (i = count.X_add_number - 1; i > 0; i--)
3910 emit_expr (exp, nbytes);
3913 #endif /* REPEAT_CONS_EXPRESSIONS */
3915 /* Parse a floating point number represented as a hex constant. This
3916 permits users to specify the exact bits they want in the floating
3917 point number. */
3919 static int
3920 hex_float (int float_type, char *bytes)
3922 int length;
3923 int i;
3925 switch (float_type)
3927 case 'f':
3928 case 'F':
3929 case 's':
3930 case 'S':
3931 length = 4;
3932 break;
3934 case 'd':
3935 case 'D':
3936 case 'r':
3937 case 'R':
3938 length = 8;
3939 break;
3941 case 'x':
3942 case 'X':
3943 length = 12;
3944 break;
3946 case 'p':
3947 case 'P':
3948 length = 12;
3949 break;
3951 default:
3952 as_bad (_("unknown floating type type '%c'"), float_type);
3953 return -1;
3956 /* It would be nice if we could go through expression to parse the
3957 hex constant, but if we get a bignum it's a pain to sort it into
3958 the buffer correctly. */
3959 i = 0;
3960 while (hex_p (*input_line_pointer) || *input_line_pointer == '_')
3962 int d;
3964 /* The MRI assembler accepts arbitrary underscores strewn about
3965 through the hex constant, so we ignore them as well. */
3966 if (*input_line_pointer == '_')
3968 ++input_line_pointer;
3969 continue;
3972 if (i >= length)
3974 as_warn (_("floating point constant too large"));
3975 return -1;
3977 d = hex_value (*input_line_pointer) << 4;
3978 ++input_line_pointer;
3979 while (*input_line_pointer == '_')
3980 ++input_line_pointer;
3981 if (hex_p (*input_line_pointer))
3983 d += hex_value (*input_line_pointer);
3984 ++input_line_pointer;
3986 if (target_big_endian)
3987 bytes[i] = d;
3988 else
3989 bytes[length - i - 1] = d;
3990 ++i;
3993 if (i < length)
3995 if (target_big_endian)
3996 memset (bytes + i, 0, length - i);
3997 else
3998 memset (bytes, 0, length - i);
4001 return length;
4004 /* float_cons()
4006 CONStruct some more frag chars of .floats .ffloats etc.
4007 Makes 0 or more new frags.
4008 If need_pass_2 == 1, no frags are emitted.
4009 This understands only floating literals, not expressions. Sorry.
4011 A floating constant is defined by atof_generic(), except it is preceded
4012 by 0d 0f 0g or 0h. After observing the STRANGE way my BSD AS does its
4013 reading, I decided to be incompatible. This always tries to give you
4014 rounded bits to the precision of the pseudo-op. Former AS did premature
4015 truncation, restored noisy bits instead of trailing 0s AND gave you
4016 a choice of 2 flavours of noise according to which of 2 floating-point
4017 scanners you directed AS to use.
4019 In: input_line_pointer->whitespace before, or '0' of flonum. */
4021 void
4022 float_cons (/* Clobbers input_line-pointer, checks end-of-line. */
4023 register int float_type /* 'f':.ffloat ... 'F':.float ... */)
4025 register char *p;
4026 int length; /* Number of chars in an object. */
4027 register char *err; /* Error from scanning floating literal. */
4028 char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
4030 if (is_it_end_of_statement ())
4032 demand_empty_rest_of_line ();
4033 return;
4036 #ifdef md_flush_pending_output
4037 md_flush_pending_output ();
4038 #endif
4042 /* input_line_pointer->1st char of a flonum (we hope!). */
4043 SKIP_WHITESPACE ();
4045 /* Skip any 0{letter} that may be present. Don't even check if the
4046 letter is legal. Someone may invent a "z" format and this routine
4047 has no use for such information. Lusers beware: you get
4048 diagnostics if your input is ill-conditioned. */
4049 if (input_line_pointer[0] == '0'
4050 && ISALPHA (input_line_pointer[1]))
4051 input_line_pointer += 2;
4053 /* Accept :xxxx, where the x's are hex digits, for a floating
4054 point with the exact digits specified. */
4055 if (input_line_pointer[0] == ':')
4057 ++input_line_pointer;
4058 length = hex_float (float_type, temp);
4059 if (length < 0)
4061 ignore_rest_of_line ();
4062 return;
4065 else
4067 err = md_atof (float_type, temp, &length);
4068 know (length <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
4069 know (length > 0);
4070 if (err)
4072 as_bad (_("bad floating literal: %s"), err);
4073 ignore_rest_of_line ();
4074 return;
4078 if (!need_pass_2)
4080 int count;
4082 count = 1;
4084 #ifdef REPEAT_CONS_EXPRESSIONS
4085 if (*input_line_pointer == ':')
4087 expressionS count_exp;
4089 ++input_line_pointer;
4090 expression (&count_exp);
4092 if (count_exp.X_op != O_constant
4093 || count_exp.X_add_number <= 0)
4094 as_warn (_("unresolvable or nonpositive repeat count; using 1"));
4095 else
4096 count = count_exp.X_add_number;
4098 #endif
4100 while (--count >= 0)
4102 p = frag_more (length);
4103 memcpy (p, temp, (unsigned int) length);
4106 SKIP_WHITESPACE ();
4108 while (*input_line_pointer++ == ',');
4110 /* Put terminator back into stream. */
4111 --input_line_pointer;
4112 demand_empty_rest_of_line ();
4115 /* Return the size of a LEB128 value. */
4117 static inline int
4118 sizeof_sleb128 (offsetT value)
4120 register int size = 0;
4121 register unsigned byte;
4125 byte = (value & 0x7f);
4126 /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
4127 Fortunately, we can structure things so that the extra work reduces
4128 to a noop on systems that do things "properly". */
4129 value = (value >> 7) | ~(-(offsetT)1 >> 7);
4130 size += 1;
4132 while (!(((value == 0) && ((byte & 0x40) == 0))
4133 || ((value == -1) && ((byte & 0x40) != 0))));
4135 return size;
4138 static inline int
4139 sizeof_uleb128 (valueT value)
4141 register int size = 0;
4142 register unsigned byte;
4146 byte = (value & 0x7f);
4147 value >>= 7;
4148 size += 1;
4150 while (value != 0);
4152 return size;
4156 sizeof_leb128 (valueT value, int sign)
4158 if (sign)
4159 return sizeof_sleb128 ((offsetT) value);
4160 else
4161 return sizeof_uleb128 (value);
4164 /* Output a LEB128 value. */
4166 static inline int
4167 output_sleb128 (char *p, offsetT value)
4169 register char *orig = p;
4170 register int more;
4174 unsigned byte = (value & 0x7f);
4176 /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
4177 Fortunately, we can structure things so that the extra work reduces
4178 to a noop on systems that do things "properly". */
4179 value = (value >> 7) | ~(-(offsetT)1 >> 7);
4181 more = !((((value == 0) && ((byte & 0x40) == 0))
4182 || ((value == -1) && ((byte & 0x40) != 0))));
4183 if (more)
4184 byte |= 0x80;
4186 *p++ = byte;
4188 while (more);
4190 return p - orig;
4193 static inline int
4194 output_uleb128 (char *p, valueT value)
4196 char *orig = p;
4200 unsigned byte = (value & 0x7f);
4201 value >>= 7;
4202 if (value != 0)
4203 /* More bytes to follow. */
4204 byte |= 0x80;
4206 *p++ = byte;
4208 while (value != 0);
4210 return p - orig;
4214 output_leb128 (char *p, valueT value, int sign)
4216 if (sign)
4217 return output_sleb128 (p, (offsetT) value);
4218 else
4219 return output_uleb128 (p, value);
4222 /* Do the same for bignums. We combine sizeof with output here in that
4223 we don't output for NULL values of P. It isn't really as critical as
4224 for "normal" values that this be streamlined. */
4226 static inline int
4227 output_big_sleb128 (char *p, LITTLENUM_TYPE *bignum, int size)
4229 char *orig = p;
4230 valueT val = 0;
4231 int loaded = 0;
4232 unsigned byte;
4234 /* Strip leading sign extensions off the bignum. */
4235 while (size > 0 && bignum[size - 1] == (LITTLENUM_TYPE) -1)
4236 size--;
4240 if (loaded < 7 && size > 0)
4242 val |= (*bignum << loaded);
4243 loaded += 8 * CHARS_PER_LITTLENUM;
4244 size--;
4245 bignum++;
4248 byte = val & 0x7f;
4249 loaded -= 7;
4250 val >>= 7;
4252 if (size == 0)
4254 if ((val == 0 && (byte & 0x40) == 0)
4255 || (~(val | ~(((valueT) 1 << loaded) - 1)) == 0
4256 && (byte & 0x40) != 0))
4257 byte |= 0x80;
4260 if (orig)
4261 *p = byte;
4262 p++;
4264 while (byte & 0x80);
4266 return p - orig;
4269 static inline int
4270 output_big_uleb128 (char *p, LITTLENUM_TYPE *bignum, int size)
4272 char *orig = p;
4273 valueT val = 0;
4274 int loaded = 0;
4275 unsigned byte;
4277 /* Strip leading zeros off the bignum. */
4278 /* XXX: Is this needed? */
4279 while (size > 0 && bignum[size - 1] == 0)
4280 size--;
4284 if (loaded < 7 && size > 0)
4286 val |= (*bignum << loaded);
4287 loaded += 8 * CHARS_PER_LITTLENUM;
4288 size--;
4289 bignum++;
4292 byte = val & 0x7f;
4293 loaded -= 7;
4294 val >>= 7;
4296 if (size > 0 || val)
4297 byte |= 0x80;
4299 if (orig)
4300 *p = byte;
4301 p++;
4303 while (byte & 0x80);
4305 return p - orig;
4308 static int
4309 output_big_leb128 (char *p, LITTLENUM_TYPE *bignum, int size, int sign)
4311 if (sign)
4312 return output_big_sleb128 (p, bignum, size);
4313 else
4314 return output_big_uleb128 (p, bignum, size);
4317 /* Generate the appropriate fragments for a given expression to emit a
4318 leb128 value. */
4320 void
4321 emit_leb128_expr (expressionS *exp, int sign)
4323 operatorT op = exp->X_op;
4324 int nbytes;
4326 if (op == O_absent || op == O_illegal)
4328 as_warn (_("zero assumed for missing expression"));
4329 exp->X_add_number = 0;
4330 op = O_constant;
4332 else if (op == O_big && exp->X_add_number <= 0)
4334 as_bad (_("floating point number invalid"));
4335 exp->X_add_number = 0;
4336 op = O_constant;
4338 else if (op == O_register)
4340 as_warn (_("register value used as expression"));
4341 op = O_constant;
4344 /* Let check_eh_frame know that data is being emitted. nbytes == -1 is
4345 a signal that this is leb128 data. It shouldn't optimize this away. */
4346 nbytes = -1;
4347 if (check_eh_frame (exp, &nbytes))
4348 abort ();
4350 /* Let the backend know that subsequent data may be byte aligned. */
4351 #ifdef md_cons_align
4352 md_cons_align (1);
4353 #endif
4355 if (op == O_constant)
4357 /* If we've got a constant, emit the thing directly right now. */
4359 valueT value = exp->X_add_number;
4360 int size;
4361 char *p;
4363 size = sizeof_leb128 (value, sign);
4364 p = frag_more (size);
4365 output_leb128 (p, value, sign);
4367 else if (op == O_big)
4369 /* O_big is a different sort of constant. */
4371 int size;
4372 char *p;
4374 size = output_big_leb128 (NULL, generic_bignum, exp->X_add_number, sign);
4375 p = frag_more (size);
4376 output_big_leb128 (p, generic_bignum, exp->X_add_number, sign);
4378 else
4380 /* Otherwise, we have to create a variable sized fragment and
4381 resolve things later. */
4383 frag_var (rs_leb128, sizeof_uleb128 (~(valueT) 0), 0, sign,
4384 make_expr_symbol (exp), 0, (char *) NULL);
4388 /* Parse the .sleb128 and .uleb128 pseudos. */
4390 void
4391 s_leb128 (int sign)
4393 expressionS exp;
4395 #ifdef md_flush_pending_output
4396 md_flush_pending_output ();
4397 #endif
4401 expression (&exp);
4402 emit_leb128_expr (&exp, sign);
4404 while (*input_line_pointer++ == ',');
4406 input_line_pointer--;
4407 demand_empty_rest_of_line ();
4410 /* We read 0 or more ',' separated, double-quoted strings.
4411 Caller should have checked need_pass_2 is FALSE because we don't
4412 check it. */
4414 void
4415 stringer (/* Worker to do .ascii etc statements. */
4416 /* Checks end-of-line. */
4417 register int append_zero /* 0: don't append '\0', else 1. */)
4419 register unsigned int c;
4420 char *start;
4422 #ifdef md_flush_pending_output
4423 md_flush_pending_output ();
4424 #endif
4426 /* The following awkward logic is to parse ZERO or more strings,
4427 comma separated. Recall a string expression includes spaces
4428 before the opening '\"' and spaces after the closing '\"'.
4429 We fake a leading ',' if there is (supposed to be)
4430 a 1st, expression. We keep demanding expressions for each ','. */
4431 if (is_it_end_of_statement ())
4433 c = 0; /* Skip loop. */
4434 ++input_line_pointer; /* Compensate for end of loop. */
4436 else
4438 c = ','; /* Do loop. */
4440 /* If we have been switched into the abs_section then we
4441 will not have an obstack onto which we can hang strings. */
4442 if (now_seg == absolute_section)
4444 as_bad (_("strings must be placed into a section"));
4445 c = 0;
4446 ignore_rest_of_line ();
4449 while (c == ',' || c == '<' || c == '"')
4451 SKIP_WHITESPACE ();
4452 switch (*input_line_pointer)
4454 case '\"':
4455 ++input_line_pointer; /*->1st char of string. */
4456 start = input_line_pointer;
4457 while (is_a_char (c = next_char_of_string ()))
4459 FRAG_APPEND_1_CHAR (c);
4461 if (append_zero)
4463 FRAG_APPEND_1_CHAR (0);
4465 know (input_line_pointer[-1] == '\"');
4467 #ifndef NO_LISTING
4468 #ifdef OBJ_ELF
4469 /* In ELF, when gcc is emitting DWARF 1 debugging output, it
4470 will emit .string with a filename in the .debug section
4471 after a sequence of constants. See the comment in
4472 emit_expr for the sequence. emit_expr will set
4473 dwarf_file_string to non-zero if this string might be a
4474 source file name. */
4475 if (strcmp (segment_name (now_seg), ".debug") != 0)
4476 dwarf_file_string = 0;
4477 else if (dwarf_file_string)
4479 c = input_line_pointer[-1];
4480 input_line_pointer[-1] = '\0';
4481 listing_source_file (start);
4482 input_line_pointer[-1] = c;
4484 #endif
4485 #endif
4487 break;
4488 case '<':
4489 input_line_pointer++;
4490 c = get_single_number ();
4491 FRAG_APPEND_1_CHAR (c);
4492 if (*input_line_pointer != '>')
4494 as_bad (_("expected <nn>"));
4496 input_line_pointer++;
4497 break;
4498 case ',':
4499 input_line_pointer++;
4500 break;
4502 SKIP_WHITESPACE ();
4503 c = *input_line_pointer;
4506 demand_empty_rest_of_line ();
4507 } /* stringer() */
4509 /* FIXME-SOMEDAY: I had trouble here on characters with the
4510 high bits set. We'll probably also have trouble with
4511 multibyte chars, wide chars, etc. Also be careful about
4512 returning values bigger than 1 byte. xoxorich. */
4514 unsigned int
4515 next_char_of_string (void)
4517 register unsigned int c;
4519 c = *input_line_pointer++ & CHAR_MASK;
4520 switch (c)
4522 case '\"':
4523 c = NOT_A_CHAR;
4524 break;
4526 case '\n':
4527 as_warn (_("unterminated string; newline inserted"));
4528 bump_line_counters ();
4529 break;
4531 #ifndef NO_STRING_ESCAPES
4532 case '\\':
4533 switch (c = *input_line_pointer++)
4535 case 'b':
4536 c = '\b';
4537 break;
4539 case 'f':
4540 c = '\f';
4541 break;
4543 case 'n':
4544 c = '\n';
4545 break;
4547 case 'r':
4548 c = '\r';
4549 break;
4551 case 't':
4552 c = '\t';
4553 break;
4555 case 'v':
4556 c = '\013';
4557 break;
4559 case '\\':
4560 case '"':
4561 break; /* As itself. */
4563 case '0':
4564 case '1':
4565 case '2':
4566 case '3':
4567 case '4':
4568 case '5':
4569 case '6':
4570 case '7':
4571 case '8':
4572 case '9':
4574 long number;
4575 int i;
4577 for (i = 0, number = 0;
4578 ISDIGIT (c) && i < 3;
4579 c = *input_line_pointer++, i++)
4581 number = number * 8 + c - '0';
4584 c = number & 0xff;
4586 --input_line_pointer;
4587 break;
4589 case 'x':
4590 case 'X':
4592 long number;
4594 number = 0;
4595 c = *input_line_pointer++;
4596 while (ISXDIGIT (c))
4598 if (ISDIGIT (c))
4599 number = number * 16 + c - '0';
4600 else if (ISUPPER (c))
4601 number = number * 16 + c - 'A' + 10;
4602 else
4603 number = number * 16 + c - 'a' + 10;
4604 c = *input_line_pointer++;
4606 c = number & 0xff;
4607 --input_line_pointer;
4609 break;
4611 case '\n':
4612 /* To be compatible with BSD 4.2 as: give the luser a linefeed!! */
4613 as_warn (_("unterminated string; newline inserted"));
4614 c = '\n';
4615 bump_line_counters ();
4616 break;
4618 default:
4620 #ifdef ONLY_STANDARD_ESCAPES
4621 as_bad (_("bad escaped character in string"));
4622 c = '?';
4623 #endif /* ONLY_STANDARD_ESCAPES */
4625 break;
4627 break;
4628 #endif /* ! defined (NO_STRING_ESCAPES) */
4630 default:
4631 break;
4633 return (c);
4636 static segT
4637 get_segmented_expression (register expressionS *expP)
4639 register segT retval;
4641 retval = expression (expP);
4642 if (expP->X_op == O_illegal
4643 || expP->X_op == O_absent
4644 || expP->X_op == O_big)
4646 as_bad (_("expected address expression"));
4647 expP->X_op = O_constant;
4648 expP->X_add_number = 0;
4649 retval = absolute_section;
4651 return retval;
4654 static segT
4655 get_known_segmented_expression (register expressionS *expP)
4657 register segT retval;
4659 if ((retval = get_segmented_expression (expP)) == undefined_section)
4661 /* There is no easy way to extract the undefined symbol from the
4662 expression. */
4663 if (expP->X_add_symbol != NULL
4664 && S_GET_SEGMENT (expP->X_add_symbol) != expr_section)
4665 as_warn (_("symbol \"%s\" undefined; zero assumed"),
4666 S_GET_NAME (expP->X_add_symbol));
4667 else
4668 as_warn (_("some symbol undefined; zero assumed"));
4669 retval = absolute_section;
4670 expP->X_op = O_constant;
4671 expP->X_add_number = 0;
4673 know (retval == absolute_section || SEG_NORMAL (retval));
4674 return (retval);
4677 offsetT
4678 get_absolute_expr (expressionS *exp)
4680 expression (exp);
4681 if (exp->X_op != O_constant)
4683 if (exp->X_op != O_absent)
4684 as_bad (_("bad or irreducible absolute expression"));
4685 exp->X_add_number = 0;
4687 return exp->X_add_number;
4690 offsetT
4691 get_absolute_expression (void)
4693 expressionS exp;
4695 return get_absolute_expr (&exp);
4698 char /* Return terminator. */
4699 get_absolute_expression_and_terminator (long *val_pointer /* Return value of expression. */)
4701 /* FIXME: val_pointer should probably be offsetT *. */
4702 *val_pointer = (long) get_absolute_expression ();
4703 return (*input_line_pointer++);
4706 /* Like demand_copy_string, but return NULL if the string contains any '\0's.
4707 Give a warning if that happens. */
4709 char *
4710 demand_copy_C_string (int *len_pointer)
4712 register char *s;
4714 if ((s = demand_copy_string (len_pointer)) != 0)
4716 register int len;
4718 for (len = *len_pointer; len > 0; len--)
4720 if (*s == 0)
4722 s = 0;
4723 len = 1;
4724 *len_pointer = 0;
4725 as_bad (_("this string may not contain \'\\0\'"));
4730 return s;
4733 /* Demand string, but return a safe (=private) copy of the string.
4734 Return NULL if we can't read a string here. */
4736 char *
4737 demand_copy_string (int *lenP)
4739 register unsigned int c;
4740 register int len;
4741 char *retval;
4743 len = 0;
4744 SKIP_WHITESPACE ();
4745 if (*input_line_pointer == '\"')
4747 input_line_pointer++; /* Skip opening quote. */
4749 while (is_a_char (c = next_char_of_string ()))
4751 obstack_1grow (&notes, c);
4752 len++;
4754 /* JF this next line is so demand_copy_C_string will return a
4755 null terminated string. */
4756 obstack_1grow (&notes, '\0');
4757 retval = obstack_finish (&notes);
4759 else
4761 as_bad (_("missing string"));
4762 retval = NULL;
4763 ignore_rest_of_line ();
4765 *lenP = len;
4766 return (retval);
4769 /* In: Input_line_pointer->next character.
4771 Do: Skip input_line_pointer over all whitespace.
4773 Out: 1 if input_line_pointer->end-of-line. */
4776 is_it_end_of_statement (void)
4778 SKIP_WHITESPACE ();
4779 return (is_end_of_line[(unsigned char) *input_line_pointer]);
4782 void
4783 equals (char *sym_name, int reassign)
4785 register symbolS *symbolP; /* Symbol we are working with. */
4786 char *stop = NULL;
4787 char stopc;
4789 input_line_pointer++;
4790 if (*input_line_pointer == '=')
4791 input_line_pointer++;
4793 while (*input_line_pointer == ' ' || *input_line_pointer == '\t')
4794 input_line_pointer++;
4796 if (flag_mri)
4797 stop = mri_comment_field (&stopc);
4799 if (sym_name[0] == '.' && sym_name[1] == '\0')
4801 /* Turn '. = mumble' into a .org mumble. */
4802 register segT segment;
4803 expressionS exp;
4805 segment = get_known_segmented_expression (&exp);
4806 if (!need_pass_2)
4807 do_org (segment, &exp, 0);
4809 else
4811 #ifdef OBJ_COFF
4812 int local;
4814 symbolP = symbol_find (sym_name);
4815 local = symbolP == NULL;
4816 if (local)
4817 #endif /* OBJ_COFF */
4818 symbolP = symbol_find_or_make (sym_name);
4819 /* Permit register names to be redefined. */
4820 if (!reassign
4821 && S_IS_DEFINED (symbolP)
4822 && S_GET_SEGMENT (symbolP) != reg_section)
4823 as_bad (_("symbol `%s' is already defined"), S_GET_NAME (symbolP));
4825 #ifdef OBJ_COFF
4826 /* "set" symbols are local unless otherwise specified. */
4827 if (local)
4828 SF_SET_LOCAL (symbolP);
4829 #endif /* OBJ_COFF */
4831 pseudo_set (symbolP);
4834 if (flag_mri)
4836 /* Check garbage after the expression. */
4837 demand_empty_rest_of_line ();
4838 mri_comment_end (stop, stopc);
4842 /* .incbin -- include a file verbatim at the current location. */
4844 void
4845 s_incbin (int x ATTRIBUTE_UNUSED)
4847 FILE * binfile;
4848 char * path;
4849 char * filename;
4850 char * binfrag;
4851 long skip = 0;
4852 long count = 0;
4853 long bytes;
4854 int len;
4856 #ifdef md_flush_pending_output
4857 md_flush_pending_output ();
4858 #endif
4860 SKIP_WHITESPACE ();
4861 filename = demand_copy_string (& len);
4862 if (filename == NULL)
4863 return;
4865 SKIP_WHITESPACE ();
4867 /* Look for optional skip and count. */
4868 if (* input_line_pointer == ',')
4870 ++ input_line_pointer;
4871 skip = get_absolute_expression ();
4873 SKIP_WHITESPACE ();
4875 if (* input_line_pointer == ',')
4877 ++ input_line_pointer;
4879 count = get_absolute_expression ();
4880 if (count == 0)
4881 as_warn (_(".incbin count zero, ignoring `%s'"), filename);
4883 SKIP_WHITESPACE ();
4887 demand_empty_rest_of_line ();
4889 /* Try opening absolute path first, then try include dirs. */
4890 binfile = fopen (filename, FOPEN_RB);
4891 if (binfile == NULL)
4893 int i;
4895 path = xmalloc ((unsigned long) len + include_dir_maxlen + 5);
4897 for (i = 0; i < include_dir_count; i++)
4899 sprintf (path, "%s/%s", include_dirs[i], filename);
4901 binfile = fopen (path, FOPEN_RB);
4902 if (binfile != NULL)
4903 break;
4906 if (binfile == NULL)
4907 as_bad (_("file not found: %s"), filename);
4909 else
4910 path = xstrdup (filename);
4912 if (binfile)
4914 long file_len;
4916 register_dependency (path);
4918 /* Compute the length of the file. */
4919 if (fseek (binfile, 0, SEEK_END) != 0)
4921 as_bad (_("seek to end of .incbin file failed `%s'"), path);
4922 goto done;
4924 file_len = ftell (binfile);
4926 /* If a count was not specified use the size of the file. */
4927 if (count == 0)
4928 count = file_len;
4930 if (skip + count > file_len)
4932 as_bad (_("skip (%ld) + count (%ld) larger than file size (%ld)"),
4933 skip, count, file_len);
4934 goto done;
4937 if (fseek (binfile, skip, SEEK_SET) != 0)
4939 as_bad (_("could not skip to %ld in file `%s'"), skip, path);
4940 goto done;
4943 /* Allocate frag space and store file contents in it. */
4944 binfrag = frag_more (count);
4946 bytes = fread (binfrag, 1, count, binfile);
4947 if (bytes < count)
4948 as_warn (_("truncated file `%s', %ld of %ld bytes read"),
4949 path, bytes, count);
4951 done:
4952 if (binfile != NULL)
4953 fclose (binfile);
4954 if (path)
4955 free (path);
4958 /* .include -- include a file at this point. */
4960 void
4961 s_include (int arg ATTRIBUTE_UNUSED)
4963 char *filename;
4964 int i;
4965 FILE *try;
4966 char *path;
4968 if (!flag_m68k_mri)
4970 filename = demand_copy_string (&i);
4971 if (filename == NULL)
4973 /* demand_copy_string has already printed an error and
4974 called ignore_rest_of_line. */
4975 return;
4978 else
4980 SKIP_WHITESPACE ();
4981 i = 0;
4982 while (!is_end_of_line[(unsigned char) *input_line_pointer]
4983 && *input_line_pointer != ' '
4984 && *input_line_pointer != '\t')
4986 obstack_1grow (&notes, *input_line_pointer);
4987 ++input_line_pointer;
4988 ++i;
4991 obstack_1grow (&notes, '\0');
4992 filename = obstack_finish (&notes);
4993 while (!is_end_of_line[(unsigned char) *input_line_pointer])
4994 ++input_line_pointer;
4997 demand_empty_rest_of_line ();
4998 path = xmalloc ((unsigned long) i + include_dir_maxlen + 5 /* slop */ );
5000 for (i = 0; i < include_dir_count; i++)
5002 strcpy (path, include_dirs[i]);
5003 strcat (path, "/");
5004 strcat (path, filename);
5005 if (0 != (try = fopen (path, FOPEN_RT)))
5007 fclose (try);
5008 goto gotit;
5012 free (path);
5013 path = filename;
5014 gotit:
5015 /* malloc Storage leak when file is found on path. FIXME-SOMEDAY. */
5016 register_dependency (path);
5017 input_scrub_insert_file (path);
5020 void
5021 add_include_dir (char *path)
5023 int i;
5025 if (include_dir_count == 0)
5027 include_dirs = (char **) xmalloc (2 * sizeof (*include_dirs));
5028 include_dirs[0] = "."; /* Current dir. */
5029 include_dir_count = 2;
5031 else
5033 include_dir_count++;
5034 include_dirs =
5035 (char **) realloc (include_dirs,
5036 include_dir_count * sizeof (*include_dirs));
5039 include_dirs[include_dir_count - 1] = path; /* New one. */
5041 i = strlen (path);
5042 if (i > include_dir_maxlen)
5043 include_dir_maxlen = i;
5046 /* Output debugging information to denote the source file. */
5048 static void
5049 generate_file_debug (void)
5051 if (debug_type == DEBUG_STABS)
5052 stabs_generate_asm_file ();
5055 /* Output line number debugging information for the current source line. */
5057 void
5058 generate_lineno_debug (void)
5060 switch (debug_type)
5062 case DEBUG_UNSPECIFIED:
5063 case DEBUG_NONE:
5064 case DEBUG_DWARF:
5065 break;
5066 case DEBUG_STABS:
5067 stabs_generate_asm_lineno ();
5068 break;
5069 case DEBUG_ECOFF:
5070 ecoff_generate_asm_lineno ();
5071 break;
5072 case DEBUG_DWARF2:
5073 /* ??? We could here indicate to dwarf2dbg.c that something
5074 has changed. However, since there is additional backend
5075 support that is required (calling dwarf2_emit_insn), we
5076 let dwarf2dbg.c call as_where on its own. */
5077 break;
5081 /* Output debugging information to mark a function entry point or end point.
5082 END_P is zero for .func, and non-zero for .endfunc. */
5084 void
5085 s_func (int end_p)
5087 do_s_func (end_p, NULL);
5090 /* Subroutine of s_func so targets can choose a different default prefix.
5091 If DEFAULT_PREFIX is NULL, use the target's "leading char". */
5093 void
5094 do_s_func (int end_p, const char *default_prefix)
5096 /* Record the current function so that we can issue an error message for
5097 misplaced .func,.endfunc, and also so that .endfunc needs no
5098 arguments. */
5099 static char *current_name;
5100 static char *current_label;
5102 if (end_p)
5104 if (current_name == NULL)
5106 as_bad (_("missing .func"));
5107 ignore_rest_of_line ();
5108 return;
5111 if (debug_type == DEBUG_STABS)
5112 stabs_generate_asm_endfunc (current_name, current_label);
5114 current_name = current_label = NULL;
5116 else /* ! end_p */
5118 char *name, *label;
5119 char delim1, delim2;
5121 if (current_name != NULL)
5123 as_bad (_(".endfunc missing for previous .func"));
5124 ignore_rest_of_line ();
5125 return;
5128 name = input_line_pointer;
5129 delim1 = get_symbol_end ();
5130 name = xstrdup (name);
5131 *input_line_pointer = delim1;
5132 SKIP_WHITESPACE ();
5133 if (*input_line_pointer != ',')
5135 if (default_prefix)
5136 asprintf (&label, "%s%s", default_prefix, name);
5137 else
5139 char leading_char = 0;
5140 #ifdef BFD_ASSEMBLER
5141 leading_char = bfd_get_symbol_leading_char (stdoutput);
5142 #endif
5143 /* Missing entry point, use function's name with the leading
5144 char prepended. */
5145 if (leading_char)
5146 asprintf (&label, "%c%s", leading_char, name);
5147 else
5148 label = name;
5151 else
5153 ++input_line_pointer;
5154 SKIP_WHITESPACE ();
5155 label = input_line_pointer;
5156 delim2 = get_symbol_end ();
5157 label = xstrdup (label);
5158 *input_line_pointer = delim2;
5161 if (debug_type == DEBUG_STABS)
5162 stabs_generate_asm_func (name, label);
5164 current_name = name;
5165 current_label = label;
5168 demand_empty_rest_of_line ();
5171 void
5172 s_ignore (int arg ATTRIBUTE_UNUSED)
5174 while (!is_end_of_line[(unsigned char) *input_line_pointer])
5176 ++input_line_pointer;
5178 ++input_line_pointer;
5181 void
5182 read_print_statistics (FILE *file)
5184 hash_print_statistics (file, "pseudo-op table", po_hash);
5187 /* Inserts the given line into the input stream.
5189 This call avoids macro/conditionals nesting checking, since the contents of
5190 the line are assumed to replace the contents of a line already scanned.
5192 An appropriate use of this function would be substitution of input lines when
5193 called by md_start_line_hook(). The given line is assumed to already be
5194 properly scrubbed. */
5196 void
5197 input_scrub_insert_line (const char *line)
5199 sb newline;
5200 sb_new (&newline);
5201 sb_add_string (&newline, line);
5202 input_scrub_include_sb (&newline, input_line_pointer, 0);
5203 sb_kill (&newline);
5204 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
5207 /* Insert a file into the input stream; the path must resolve to an actual
5208 file; no include path searching or dependency registering is performed. */
5210 void
5211 input_scrub_insert_file (char *path)
5213 input_scrub_include_file (path, input_line_pointer);
5214 buffer_limit = input_scrub_next_buffer (&input_line_pointer);