2000-05-29 Philip Blundell <philb@gnu.org>
[binutils.git] / gas / read.c
blob2ea5e2b61210642d4e132f40acfb9154ce57074d
1 /* read.c - read a source file -
2 Copyright (C) 1986, 87, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
3 2000 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 #define MASK_CHAR (0xFF) /* If your chars aren't 8 bits, you will
24 change this a bit. But then, GNU isn't
25 spozed to run on your machine anyway.
26 (RMS is so shortsighted sometimes.)
28 #else
29 #define MASK_CHAR ((int)(unsigned char)-1)
30 #endif
33 /* This is the largest known floating point format (for now). It will
34 grow when we do 4361 style flonums. */
36 #define MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT (16)
38 /* Routines that read assembler source text to build spagetti in memory.
39 Another group of these functions is in the expr.c module. */
41 /* for isdigit() */
42 #include <ctype.h>
44 #include "as.h"
45 #include "subsegs.h"
46 #include "sb.h"
47 #include "macro.h"
48 #include "obstack.h"
49 #include "listing.h"
50 #include "ecoff.h"
52 #ifndef TC_START_LABEL
53 #define TC_START_LABEL(x,y) (x==':')
54 #endif
56 /* Set by the object-format or the target. */
57 #ifndef TC_IMPLICIT_LCOMM_ALIGNMENT
58 #define TC_IMPLICIT_LCOMM_ALIGNMENT(SIZE, P2VAR) \
59 do { \
60 if ((SIZE) >= 8) \
61 (P2VAR) = 3; \
62 else if ((SIZE) >= 4) \
63 (P2VAR) = 2; \
64 else if ((SIZE) >= 2) \
65 (P2VAR) = 1; \
66 else \
67 (P2VAR) = 0; \
68 } while (0)
69 #endif
71 /* The NOP_OPCODE is for the alignment fill value.
72 * fill it a nop instruction so that the disassembler does not choke
73 * on it
75 #ifndef NOP_OPCODE
76 #define NOP_OPCODE 0x00
77 #endif
79 char *input_line_pointer; /*->next char of source file to parse. */
81 #if BITS_PER_CHAR != 8
82 /* The following table is indexed by[(char)] and will break if
83 a char does not have exactly 256 states (hopefully 0:255!)! */
84 die horribly;
85 #endif
87 #ifndef LEX_AT
88 /* The m88k unfortunately uses @ as a label beginner. */
89 #define LEX_AT 0
90 #endif
92 #ifndef LEX_BR
93 /* The RS/6000 assembler uses {,},[,] as parts of symbol names. */
94 #define LEX_BR 0
95 #endif
97 #ifndef LEX_PCT
98 /* The Delta 68k assembler permits % inside label names. */
99 #define LEX_PCT 0
100 #endif
102 #ifndef LEX_QM
103 /* The PowerPC Windows NT assemblers permits ? inside label names. */
104 #define LEX_QM 0
105 #endif
107 #ifndef LEX_HASH
108 /* The IA-64 assembler uses # as a suffix designating a symbol. We include
109 it in the symbol and strip it out in tc_canonicalize_symbol_name. */
110 #define LEX_HASH 0
111 #endif
113 #ifndef LEX_DOLLAR
114 /* The a29k assembler does not permits labels to start with $. */
115 #define LEX_DOLLAR 3
116 #endif
118 #ifndef LEX_TILDE
119 /* The Delta 68k assembler permits ~ at start of label names. */
120 #define LEX_TILDE 0
121 #endif
123 /* used by is_... macros. our ctype[] */
124 char lex_type[256] =
126 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* @ABCDEFGHIJKLMNO */
127 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ[\]^_ */
128 0, 0, 0, LEX_HASH, LEX_DOLLAR, LEX_PCT, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* _!"#$%&'()*+,-./ */
129 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, LEX_QM, /* 0123456789:;<=>? */
130 LEX_AT, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* @ABCDEFGHIJKLMNO */
131 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, 0, 3, /* PQRSTUVWXYZ[\]^_ */
132 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* `abcdefghijklmno */
133 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, LEX_TILDE, 0, /* pqrstuvwxyz{|}~. */
134 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
135 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
136 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
137 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
138 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
139 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
140 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
141 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
146 * In: a character.
147 * Out: 1 if this character ends a line.
149 #define Z_ (0)
150 char is_end_of_line[256] =
152 #ifdef CR_EOL
153 99, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, 99, Z_, Z_, 99, Z_, Z_, /* @abcdefghijklmno */
154 #else
155 99, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, 99, Z_, Z_, Z_, Z_, Z_, /* @abcdefghijklmno */
156 #endif
157 Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, /* */
158 #ifdef TC_HPPA
159 Z_,99, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, /* _!"#$%&'()*+,-./ */
160 Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, /* 0123456789:;<=>? */
161 #else
162 Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, /* */
163 Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, 99, Z_, Z_, Z_, Z_, /* 0123456789:;<=>? */
164 #endif
165 Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, /* */
166 Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, /* */
167 Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, /* */
168 Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, /* */
169 Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, /* */
170 Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, /* */
171 Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, /* */
172 Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, /* */
173 Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, Z_, /* */
175 #undef Z_
177 /* Functions private to this file. */
179 static char *buffer; /* 1st char of each buffer of lines is here. */
180 static char *buffer_limit; /*->1 + last char in buffer. */
182 /* TARGET_BYTES_BIG_ENDIAN is required to be defined to either 0 or 1 in the
183 tc-<CPU>.h file. See the "Porting GAS" section of the internals manual. */
184 int target_big_endian = TARGET_BYTES_BIG_ENDIAN;
186 static char *old_buffer; /* JF a hack */
187 static char *old_input;
188 static char *old_limit;
190 /* Variables for handling include file directory table. */
192 char **include_dirs; /* Table of pointers to directories to
193 search for .include's */
194 int include_dir_count; /* How many are in the table */
195 int include_dir_maxlen = 1;/* Length of longest in table */
197 #ifndef WORKING_DOT_WORD
198 struct broken_word *broken_words;
199 int new_broken_words;
200 #endif
202 /* The current offset into the absolute section. We don't try to
203 build frags in the absolute section, since no data can be stored
204 there. We just keep track of the current offset. */
205 addressT abs_section_offset;
207 /* If this line had an MRI style label, it is stored in this variable.
208 This is used by some of the MRI pseudo-ops. */
209 symbolS *line_label;
211 /* This global variable is used to support MRI common sections. We
212 translate such sections into a common symbol. This variable is
213 non-NULL when we are in an MRI common section. */
214 symbolS *mri_common_symbol;
216 /* In MRI mode, after a dc.b pseudo-op with an odd number of bytes, we
217 need to align to an even byte boundary unless the next pseudo-op is
218 dc.b, ds.b, or dcb.b. This variable is set to 1 if an alignment
219 may be needed. */
220 static int mri_pending_align;
222 #ifndef NO_LISTING
223 #ifdef OBJ_ELF
224 /* This variable is set to be non-zero if the next string we see might
225 be the name of the source file in DWARF debugging information. See
226 the comment in emit_expr for the format we look for. */
227 static int dwarf_file_string;
228 #endif
229 #endif
231 static void cons_worker PARAMS ((int, int));
232 static int scrub_from_string PARAMS ((char *, int));
233 static void do_align PARAMS ((int, char *, int, int));
234 static void s_align PARAMS ((int, int));
235 static void s_lcomm_internal PARAMS ((int, int));
236 static int hex_float PARAMS ((int, char *));
237 static inline int sizeof_sleb128 PARAMS ((offsetT));
238 static inline int sizeof_uleb128 PARAMS ((valueT));
239 static inline int output_sleb128 PARAMS ((char *, offsetT));
240 static inline int output_uleb128 PARAMS ((char *, valueT));
241 static inline int output_big_sleb128 PARAMS ((char *, LITTLENUM_TYPE *, int));
242 static inline int output_big_uleb128 PARAMS ((char *, LITTLENUM_TYPE *, int));
243 static int output_big_leb128 PARAMS ((char *, LITTLENUM_TYPE *, int, int));
244 static void do_org PARAMS ((segT, expressionS *, int));
245 char *demand_copy_string PARAMS ((int *lenP));
246 static segT get_segmented_expression PARAMS ((expressionS *expP));
247 static segT get_known_segmented_expression PARAMS ((expressionS * expP));
248 static void pobegin PARAMS ((void));
249 static int get_line_sb PARAMS ((sb *));
250 static void generate_file_debug PARAMS ((void));
253 void
254 read_begin ()
256 const char *p;
258 pobegin ();
259 obj_read_begin_hook ();
261 /* Something close -- but not too close -- to a multiple of 1024.
262 The debugging malloc I'm using has 24 bytes of overhead. */
263 obstack_begin (&notes, chunksize);
264 obstack_begin (&cond_obstack, chunksize);
266 /* Use machine dependent syntax */
267 for (p = line_separator_chars; *p; p++)
268 is_end_of_line[(unsigned char) *p] = 1;
269 /* Use more. FIXME-SOMEDAY. */
271 if (flag_mri)
272 lex_type['?'] = 3;
275 /* set up pseudo-op tables */
277 static struct hash_control *po_hash;
279 static const pseudo_typeS potable[] =
281 {"abort", s_abort, 0},
282 {"align", s_align_ptwo, 0},
283 {"ascii", stringer, 0},
284 {"asciz", stringer, 1},
285 {"balign", s_align_bytes, 0},
286 {"balignw", s_align_bytes, -2},
287 {"balignl", s_align_bytes, -4},
288 /* block */
289 {"byte", cons, 1},
290 {"comm", s_comm, 0},
291 {"common", s_mri_common, 0},
292 {"common.s", s_mri_common, 1},
293 {"data", s_data, 0},
294 {"dc", cons, 2},
295 {"dc.b", cons, 1},
296 {"dc.d", float_cons, 'd'},
297 {"dc.l", cons, 4},
298 {"dc.s", float_cons, 'f'},
299 {"dc.w", cons, 2},
300 {"dc.x", float_cons, 'x'},
301 {"dcb", s_space, 2},
302 {"dcb.b", s_space, 1},
303 {"dcb.d", s_float_space, 'd'},
304 {"dcb.l", s_space, 4},
305 {"dcb.s", s_float_space, 'f'},
306 {"dcb.w", s_space, 2},
307 {"dcb.x", s_float_space, 'x'},
308 {"ds", s_space, 2},
309 {"ds.b", s_space, 1},
310 {"ds.d", s_space, 8},
311 {"ds.l", s_space, 4},
312 {"ds.p", s_space, 12},
313 {"ds.s", s_space, 4},
314 {"ds.w", s_space, 2},
315 {"ds.x", s_space, 12},
316 {"debug", s_ignore, 0},
317 #ifdef S_SET_DESC
318 {"desc", s_desc, 0},
319 #endif
320 /* dim */
321 {"double", float_cons, 'd'},
322 /* dsect */
323 {"eject", listing_eject, 0}, /* Formfeed listing */
324 {"else", s_else, 0},
325 {"elsec", s_else, 0},
326 {"elseif", s_elseif, (int) O_ne},
327 {"end", s_end, 0},
328 {"endc", s_endif, 0},
329 {"endfunc", s_func, 1},
330 {"endif", s_endif, 0},
331 /* endef */
332 {"equ", s_set, 0},
333 {"equiv", s_set, 1},
334 {"err", s_err, 0},
335 {"exitm", s_mexit, 0},
336 /* extend */
337 {"extern", s_ignore, 0}, /* We treat all undef as ext */
338 {"appfile", s_app_file, 1},
339 {"appline", s_app_line, 0},
340 {"fail", s_fail, 0},
341 {"file", s_app_file, 0},
342 {"fill", s_fill, 0},
343 {"float", float_cons, 'f'},
344 {"format", s_ignore, 0},
345 {"func", s_func, 0},
346 {"global", s_globl, 0},
347 {"globl", s_globl, 0},
348 {"hword", cons, 2},
349 {"if", s_if, (int) O_ne},
350 {"ifc", s_ifc, 0},
351 {"ifdef", s_ifdef, 0},
352 {"ifeq", s_if, (int) O_eq},
353 {"ifeqs", s_ifeqs, 0},
354 {"ifge", s_if, (int) O_ge},
355 {"ifgt", s_if, (int) O_gt},
356 {"ifle", s_if, (int) O_le},
357 {"iflt", s_if, (int) O_lt},
358 {"ifnc", s_ifc, 1},
359 {"ifndef", s_ifdef, 1},
360 {"ifne", s_if, (int) O_ne},
361 {"ifnes", s_ifeqs, 1},
362 {"ifnotdef", s_ifdef, 1},
363 {"include", s_include, 0},
364 {"int", cons, 4},
365 {"irp", s_irp, 0},
366 {"irep", s_irp, 0},
367 {"irpc", s_irp, 1},
368 {"irepc", s_irp, 1},
369 {"lcomm", s_lcomm, 0},
370 {"lflags", listing_flags, 0}, /* Listing flags */
371 {"linkonce", s_linkonce, 0},
372 {"list", listing_list, 1}, /* Turn listing on */
373 {"llen", listing_psize, 1},
374 {"long", cons, 4},
375 {"lsym", s_lsym, 0},
376 {"macro", s_macro, 0},
377 {"mexit", s_mexit, 0},
378 {"mri", s_mri, 0},
379 {".mri", s_mri, 0}, /* Special case so .mri works in MRI mode. */
380 {"name", s_ignore, 0},
381 {"noformat", s_ignore, 0},
382 {"nolist", listing_list, 0}, /* Turn listing off */
383 {"nopage", listing_nopage, 0},
384 {"octa", cons, 16},
385 {"offset", s_struct, 0},
386 {"org", s_org, 0},
387 {"p2align", s_align_ptwo, 0},
388 {"p2alignw", s_align_ptwo, -2},
389 {"p2alignl", s_align_ptwo, -4},
390 {"page", listing_eject, 0},
391 {"plen", listing_psize, 0},
392 {"print", s_print, 0},
393 {"psize", listing_psize, 0}, /* set paper size */
394 {"purgem", s_purgem, 0},
395 {"quad", cons, 8},
396 {"rep", s_rept, 0},
397 {"rept", s_rept, 0},
398 {"rva", s_rva, 4},
399 {"sbttl", listing_title, 1}, /* Subtitle of listing */
400 /* scl */
401 /* sect */
402 {"set", s_set, 0},
403 {"short", cons, 2},
404 {"single", float_cons, 'f'},
405 /* size */
406 {"space", s_space, 0},
407 {"skip", s_space, 0},
408 {"sleb128", s_leb128, 1},
409 {"spc", s_ignore, 0},
410 {"stabd", s_stab, 'd'},
411 {"stabn", s_stab, 'n'},
412 {"stabs", s_stab, 's'},
413 {"string", stringer, 1},
414 {"struct", s_struct, 0},
415 /* tag */
416 {"text", s_text, 0},
418 /* This is for gcc to use. It's only just been added (2/94), so gcc
419 won't be able to use it for a while -- probably a year or more.
420 But once this has been released, check with gcc maintainers
421 before deleting it or even changing the spelling. */
422 {"this_GCC_requires_the_GNU_assembler", s_ignore, 0},
423 /* If we're folding case -- done for some targets, not necessarily
424 all -- the above string in an input file will be converted to
425 this one. Match it either way... */
426 {"this_gcc_requires_the_gnu_assembler", s_ignore, 0},
428 {"title", listing_title, 0}, /* Listing title */
429 {"ttl", listing_title, 0},
430 /* type */
431 {"uleb128", s_leb128, 0},
432 /* use */
433 /* val */
434 {"xcom", s_comm, 0},
435 {"xdef", s_globl, 0},
436 {"xref", s_ignore, 0},
437 {"xstabs", s_xstab, 's'},
438 {"word", cons, 2},
439 {"zero", s_space, 0},
440 {NULL, NULL, 0} /* end sentinel */
443 static int pop_override_ok = 0;
444 static const char *pop_table_name;
446 void
447 pop_insert (table)
448 const pseudo_typeS *table;
450 const char *errtxt;
451 const pseudo_typeS *pop;
452 for (pop = table; pop->poc_name; pop++)
454 errtxt = hash_insert (po_hash, pop->poc_name, (char *) pop);
455 if (errtxt && (!pop_override_ok || strcmp (errtxt, "exists")))
456 as_fatal (_("error constructing %s pseudo-op table: %s"), pop_table_name,
457 errtxt);
461 #ifndef md_pop_insert
462 #define md_pop_insert() pop_insert(md_pseudo_table)
463 #endif
465 #ifndef obj_pop_insert
466 #define obj_pop_insert() pop_insert(obj_pseudo_table)
467 #endif
469 static void
470 pobegin ()
472 po_hash = hash_new ();
474 /* Do the target-specific pseudo ops. */
475 pop_table_name = "md";
476 md_pop_insert ();
478 /* Now object specific. Skip any that were in the target table. */
479 pop_table_name = "obj";
480 pop_override_ok = 1;
481 obj_pop_insert ();
483 /* Now portable ones. Skip any that we've seen already. */
484 pop_table_name = "standard";
485 pop_insert (potable);
488 #define HANDLE_CONDITIONAL_ASSEMBLY() \
489 if (ignore_input ()) \
491 while (! is_end_of_line[(unsigned char) *input_line_pointer++]) \
492 if (input_line_pointer == buffer_limit) \
493 break; \
494 continue; \
498 /* This function is used when scrubbing the characters between #APP
499 and #NO_APP. */
501 static char *scrub_string;
502 static char *scrub_string_end;
504 static int
505 scrub_from_string (buf, buflen)
506 char *buf;
507 int buflen;
509 int copy;
511 copy = scrub_string_end - scrub_string;
512 if (copy > buflen)
513 copy = buflen;
514 memcpy (buf, scrub_string, copy);
515 scrub_string += copy;
516 return copy;
519 /* read_a_source_file()
521 * We read the file, putting things into a web that
522 * represents what we have been reading.
524 void
525 read_a_source_file (name)
526 char *name;
528 register char c;
529 register char *s; /* string of symbol, '\0' appended */
530 register int temp;
531 pseudo_typeS *pop;
533 buffer = input_scrub_new_file (name);
535 listing_file (name);
536 listing_newline (NULL);
537 register_dependency (name);
539 /* Generate debugging information before we've read anything in to denote
540 this file as the "main" source file and not a subordinate one
541 (e.g. N_SO vs N_SOL in stabs). */
542 generate_file_debug ();
544 while ((buffer_limit = input_scrub_next_buffer (&input_line_pointer)) != 0)
545 { /* We have another line to parse. */
546 know (buffer_limit[-1] == '\n'); /* Must have a sentinel. */
547 contin: /* JF this goto is my fault I admit it.
548 Someone brave please re-write the whole
549 input section here? Pleeze??? */
550 while (input_line_pointer < buffer_limit)
552 /* We have more of this buffer to parse. */
555 * We now have input_line_pointer->1st char of next line.
556 * If input_line_pointer [-1] == '\n' then we just
557 * scanned another line: so bump line counters.
559 if (is_end_of_line[(unsigned char) input_line_pointer[-1]])
561 #ifdef md_start_line_hook
562 md_start_line_hook ();
563 #endif
565 if (input_line_pointer[-1] == '\n')
566 bump_line_counters ();
568 line_label = NULL;
570 if (LABELS_WITHOUT_COLONS || flag_m68k_mri)
572 /* Text at the start of a line must be a label, we
573 run down and stick a colon in. */
574 if (is_name_beginner (*input_line_pointer))
576 char *line_start = input_line_pointer;
577 char c;
578 int mri_line_macro;
580 LISTING_NEWLINE ();
581 HANDLE_CONDITIONAL_ASSEMBLY ();
583 c = get_symbol_end ();
585 /* In MRI mode, the EQU and MACRO pseudoops must
586 be handled specially. */
587 mri_line_macro = 0;
588 if (flag_m68k_mri)
590 char *rest = input_line_pointer + 1;
592 if (*rest == ':')
593 ++rest;
594 if (*rest == ' ' || *rest == '\t')
595 ++rest;
596 if ((strncasecmp (rest, "EQU", 3) == 0
597 || strncasecmp (rest, "SET", 3) == 0)
598 && (rest[3] == ' ' || rest[3] == '\t'))
600 input_line_pointer = rest + 3;
601 equals (line_start,
602 strncasecmp (rest, "SET", 3) == 0);
603 continue;
605 if (strncasecmp (rest, "MACRO", 5) == 0
606 && (rest[5] == ' '
607 || rest[5] == '\t'
608 || is_end_of_line[(unsigned char) rest[5]]))
609 mri_line_macro = 1;
612 /* In MRI mode, we need to handle the MACRO
613 pseudo-op specially: we don't want to put the
614 symbol in the symbol table. */
615 if (! mri_line_macro
616 #ifdef TC_START_LABEL_WITHOUT_COLON
617 && TC_START_LABEL_WITHOUT_COLON(c,
618 input_line_pointer)
619 #endif
621 line_label = colon (line_start);
622 else
623 line_label = symbol_create (line_start,
624 absolute_section,
625 (valueT) 0,
626 &zero_address_frag);
628 *input_line_pointer = c;
629 if (c == ':')
630 input_line_pointer++;
636 * We are at the begining of a line, or similar place.
637 * We expect a well-formed assembler statement.
638 * A "symbol-name:" is a statement.
640 * Depending on what compiler is used, the order of these tests
641 * may vary to catch most common case 1st.
642 * Each test is independent of all other tests at the (top) level.
643 * PLEASE make a compiler that doesn't use this assembler.
644 * It is crufty to waste a compiler's time encoding things for this
645 * assembler, which then wastes more time decoding it.
646 * (And communicating via (linear) files is silly!
647 * If you must pass stuff, please pass a tree!)
649 if ((c = *input_line_pointer++) == '\t'
650 || c == ' '
651 || c == '\f'
652 || c == 0)
654 c = *input_line_pointer++;
656 know (c != ' '); /* No further leading whitespace. */
658 #ifndef NO_LISTING
659 /* If listing is on, and we are expanding a macro, then give
660 the listing code the contents of the expanded line. */
661 if (listing)
663 if ((listing & LISTING_MACEXP) && macro_nest > 0)
665 char *copy;
666 int len;
668 /* Find the end of the current expanded macro line. */
669 for (s = input_line_pointer-1; *s ; ++s)
670 if (is_end_of_line[(unsigned char) *s])
671 break;
673 /* Copy it for safe keeping. Also give an indication of
674 how much macro nesting is involved at this point. */
675 len = s - (input_line_pointer-1);
676 copy = (char *) xmalloc (len + macro_nest + 2);
677 memset (copy, '>', macro_nest);
678 copy[macro_nest] = ' ';
679 memcpy (copy + macro_nest + 1, input_line_pointer-1, len);
680 copy[macro_nest+1+len] = '\0';
682 /* Install the line with the listing facility. */
683 listing_newline (copy);
685 else
686 listing_newline (NULL);
688 #endif
691 * C is the 1st significant character.
692 * Input_line_pointer points after that character.
694 if (is_name_beginner (c))
696 /* want user-defined label or pseudo/opcode */
697 HANDLE_CONDITIONAL_ASSEMBLY ();
699 s = --input_line_pointer;
700 c = get_symbol_end (); /* name's delimiter */
702 * C is character after symbol.
703 * That character's place in the input line is now '\0'.
704 * S points to the beginning of the symbol.
705 * [In case of pseudo-op, s->'.'.]
706 * Input_line_pointer->'\0' where c was.
708 if (TC_START_LABEL(c, input_line_pointer))
710 if (flag_m68k_mri)
712 char *rest = input_line_pointer + 1;
714 /* In MRI mode, \tsym: set 0 is permitted. */
716 if (*rest == ':')
717 ++rest;
718 if (*rest == ' ' || *rest == '\t')
719 ++rest;
720 if ((strncasecmp (rest, "EQU", 3) == 0
721 || strncasecmp (rest, "SET", 3) == 0)
722 && (rest[3] == ' ' || rest[3] == '\t'))
724 input_line_pointer = rest + 3;
725 equals (s, 1);
726 continue;
730 line_label = colon (s); /* user-defined label */
731 *input_line_pointer++ = ':'; /* Put ':' back for error messages' sake. */
732 /* Input_line_pointer->after ':'. */
733 SKIP_WHITESPACE ();
737 else if (c == '='
738 || ((c == ' ' || c == '\t')
739 && input_line_pointer[1] == '='
740 #ifdef TC_EQUAL_IN_INSN
741 && ! TC_EQUAL_IN_INSN (c, input_line_pointer)
742 #endif
745 equals (s, 1);
746 demand_empty_rest_of_line ();
748 else
749 { /* expect pseudo-op or machine instruction */
750 pop = NULL;
752 #define IGNORE_OPCODE_CASE
753 #ifdef IGNORE_OPCODE_CASE
755 char *s2 = s;
756 while (*s2)
758 if (isupper ((unsigned char) *s2))
759 *s2 = tolower (*s2);
760 s2++;
763 #endif
765 if (NO_PSEUDO_DOT || flag_m68k_mri)
767 /* The MRI assembler and the m88k use pseudo-ops
768 without a period. */
769 pop = (pseudo_typeS *) hash_find (po_hash, s);
770 if (pop != NULL && pop->poc_handler == NULL)
771 pop = NULL;
774 if (pop != NULL
775 || (! flag_m68k_mri && *s == '.'))
778 * PSEUDO - OP.
780 * WARNING: c has next char, which may be end-of-line.
781 * We lookup the pseudo-op table with s+1 because we
782 * already know that the pseudo-op begins with a '.'.
785 if (pop == NULL)
786 pop = (pseudo_typeS *) hash_find (po_hash, s + 1);
788 /* In MRI mode, we may need to insert an
789 automatic alignment directive. What a hack
790 this is. */
791 if (mri_pending_align
792 && (pop == NULL
793 || ! ((pop->poc_handler == cons
794 && pop->poc_val == 1)
795 || (pop->poc_handler == s_space
796 && pop->poc_val == 1)
797 #ifdef tc_conditional_pseudoop
798 || tc_conditional_pseudoop (pop)
799 #endif
800 || pop->poc_handler == s_if
801 || pop->poc_handler == s_ifdef
802 || pop->poc_handler == s_ifc
803 || pop->poc_handler == s_ifeqs
804 || pop->poc_handler == s_else
805 || pop->poc_handler == s_endif
806 || pop->poc_handler == s_globl
807 || pop->poc_handler == s_ignore)))
809 do_align (1, (char *) NULL, 0, 0);
810 mri_pending_align = 0;
811 if (line_label != NULL)
813 symbol_set_frag (line_label, frag_now);
814 S_SET_VALUE (line_label, frag_now_fix ());
818 /* Print the error msg now, while we still can */
819 if (pop == NULL)
821 as_bad (_("Unknown pseudo-op: `%s'"), s);
822 *input_line_pointer = c;
823 s_ignore (0);
824 continue;
827 /* Put it back for error messages etc. */
828 *input_line_pointer = c;
829 /* The following skip of whitespace is compulsory.
830 A well shaped space is sometimes all that separates
831 keyword from operands. */
832 if (c == ' ' || c == '\t')
833 input_line_pointer++;
835 * Input_line is restored.
836 * Input_line_pointer->1st non-blank char
837 * after pseudo-operation.
839 (*pop->poc_handler) (pop->poc_val);
841 /* If that was .end, just get out now. */
842 if (pop->poc_handler == s_end)
843 goto quit;
845 else
847 int inquote = 0;
848 #ifdef QUOTES_IN_INSN
849 int inescape = 0;
850 #endif
852 /* WARNING: c has char, which may be end-of-line. */
853 /* Also: input_line_pointer->`\0` where c was. */
854 *input_line_pointer = c;
855 while (!is_end_of_line[(unsigned char) *input_line_pointer]
856 || inquote
857 #ifdef TC_EOL_IN_INSN
858 || TC_EOL_IN_INSN (input_line_pointer)
859 #endif
862 if (flag_m68k_mri && *input_line_pointer == '\'')
863 inquote = ! inquote;
864 #ifdef QUOTES_IN_INSN
865 if (inescape)
866 inescape = 0;
867 else if (*input_line_pointer == '"')
868 inquote = ! inquote;
869 else if (*input_line_pointer == '\\')
870 inescape = 1;
871 #endif
872 input_line_pointer++;
875 c = *input_line_pointer;
876 *input_line_pointer = '\0';
878 generate_lineno_debug ();
880 if (macro_defined)
882 sb out;
883 const char *err;
884 macro_entry *macro;
886 if (check_macro (s, &out, '\0', &err, &macro))
888 if (err != NULL)
889 as_bad ("%s", err);
890 *input_line_pointer++ = c;
891 input_scrub_include_sb (&out,
892 input_line_pointer, 1);
893 sb_kill (&out);
894 buffer_limit =
895 input_scrub_next_buffer (&input_line_pointer);
896 #ifdef md_macro_info
897 md_macro_info (macro);
898 #endif
899 continue;
903 if (mri_pending_align)
905 do_align (1, (char *) NULL, 0, 0);
906 mri_pending_align = 0;
907 if (line_label != NULL)
909 symbol_set_frag (line_label, frag_now);
910 S_SET_VALUE (line_label, frag_now_fix ());
914 md_assemble (s); /* Assemble 1 instruction. */
916 *input_line_pointer++ = c;
918 /* We resume loop AFTER the end-of-line from
919 this instruction. */
920 } /* if (*s=='.') */
921 } /* if c==':' */
922 continue;
923 } /* if (is_name_beginner(c) */
926 /* Empty statement? */
927 if (is_end_of_line[(unsigned char) c])
928 continue;
930 if ((LOCAL_LABELS_DOLLAR || LOCAL_LABELS_FB)
931 && isdigit ((unsigned char) c))
933 /* local label ("4:") */
934 char *backup = input_line_pointer;
936 HANDLE_CONDITIONAL_ASSEMBLY ();
938 temp = c - '0';
940 while (isdigit ((unsigned char) *input_line_pointer))
942 temp = (temp * 10) + *input_line_pointer - '0';
943 ++input_line_pointer;
944 } /* read the whole number */
946 if (LOCAL_LABELS_DOLLAR
947 && *input_line_pointer == '$'
948 && *(input_line_pointer + 1) == ':')
950 input_line_pointer += 2;
952 if (dollar_label_defined (temp))
954 as_fatal (_("label \"%d$\" redefined"), temp);
957 define_dollar_label (temp);
958 colon (dollar_label_name (temp, 0));
959 continue;
962 if (LOCAL_LABELS_FB
963 && *input_line_pointer++ == ':')
965 fb_label_instance_inc (temp);
966 colon (fb_label_name (temp, 0));
967 continue;
970 input_line_pointer = backup;
971 } /* local label ("4:") */
973 if (c && strchr (line_comment_chars, c))
974 { /* Its a comment. Better say APP or NO_APP */
975 char *ends;
976 char *new_buf;
977 char *new_tmp;
978 unsigned int new_length;
979 char *tmp_buf = 0;
981 bump_line_counters ();
982 s = input_line_pointer;
983 if (strncmp (s, "APP\n", 4))
984 continue; /* We ignore it */
985 s += 4;
987 ends = strstr (s, "#NO_APP\n");
989 if (!ends)
991 unsigned int tmp_len;
992 unsigned int num;
994 /* The end of the #APP wasn't in this buffer. We
995 keep reading in buffers until we find the #NO_APP
996 that goes with this #APP There is one. The specs
997 guarentee it. . . */
998 tmp_len = buffer_limit - s;
999 tmp_buf = xmalloc (tmp_len + 1);
1000 memcpy (tmp_buf, s, tmp_len);
1003 new_tmp = input_scrub_next_buffer (&buffer);
1004 if (!new_tmp)
1005 break;
1006 else
1007 buffer_limit = new_tmp;
1008 input_line_pointer = buffer;
1009 ends = strstr (buffer, "#NO_APP\n");
1010 if (ends)
1011 num = ends - buffer;
1012 else
1013 num = buffer_limit - buffer;
1015 tmp_buf = xrealloc (tmp_buf, tmp_len + num);
1016 memcpy (tmp_buf + tmp_len, buffer, num);
1017 tmp_len += num;
1019 while (!ends);
1021 input_line_pointer = ends ? ends + 8 : NULL;
1023 s = tmp_buf;
1024 ends = s + tmp_len;
1027 else
1029 input_line_pointer = ends + 8;
1032 scrub_string = s;
1033 scrub_string_end = ends;
1035 new_length = ends - s;
1036 new_buf = (char *) xmalloc (new_length);
1037 new_tmp = new_buf;
1038 for (;;)
1040 int space;
1041 int size;
1043 space = (new_buf + new_length) - new_tmp;
1044 size = do_scrub_chars (scrub_from_string, new_tmp, space);
1046 if (size < space)
1048 new_tmp += size;
1049 break;
1052 new_buf = xrealloc (new_buf, new_length + 100);
1053 new_tmp = new_buf + new_length;
1054 new_length += 100;
1057 if (tmp_buf)
1058 free (tmp_buf);
1059 old_buffer = buffer;
1060 old_input = input_line_pointer;
1061 old_limit = buffer_limit;
1062 buffer = new_buf;
1063 input_line_pointer = new_buf;
1064 buffer_limit = new_tmp;
1065 continue;
1068 HANDLE_CONDITIONAL_ASSEMBLY ();
1070 #ifdef tc_unrecognized_line
1071 if (tc_unrecognized_line (c))
1072 continue;
1073 #endif
1075 /* as_warn("Junk character %d.",c); Now done by ignore_rest */
1076 input_line_pointer--; /* Report unknown char as ignored. */
1077 ignore_rest_of_line ();
1078 } /* while (input_line_pointer<buffer_limit) */
1080 #ifdef md_after_pass_hook
1081 md_after_pass_hook ();
1082 #endif
1084 if (old_buffer)
1086 free (buffer);
1087 bump_line_counters ();
1088 if (old_input != 0)
1090 buffer = old_buffer;
1091 input_line_pointer = old_input;
1092 buffer_limit = old_limit;
1093 old_buffer = 0;
1094 goto contin;
1097 } /* while (more buffers to scan) */
1099 quit:
1101 #ifdef md_cleanup
1102 md_cleanup();
1103 #endif
1104 input_scrub_close (); /* Close the input file */
1107 /* For most MRI pseudo-ops, the line actually ends at the first
1108 nonquoted space. This function looks for that point, stuffs a null
1109 in, and sets *STOPCP to the character that used to be there, and
1110 returns the location.
1112 Until I hear otherwise, I am going to assume that this is only true
1113 for the m68k MRI assembler. */
1115 char *
1116 mri_comment_field (stopcp)
1117 char *stopcp;
1119 #ifdef TC_M68K
1121 char *s;
1122 int inquote = 0;
1124 know (flag_m68k_mri);
1126 for (s = input_line_pointer;
1127 ((! is_end_of_line[(unsigned char) *s] && *s != ' ' && *s != '\t')
1128 || inquote);
1129 s++)
1131 if (*s == '\'')
1132 inquote = ! inquote;
1134 *stopcp = *s;
1135 *s = '\0';
1136 return s;
1138 #else
1140 char *s;
1142 for (s = input_line_pointer; ! is_end_of_line[(unsigned char) *s]; s++)
1144 *stopcp = *s;
1145 *s = '\0';
1146 return s;
1148 #endif
1152 /* Skip to the end of an MRI comment field. */
1154 void
1155 mri_comment_end (stop, stopc)
1156 char *stop;
1157 int stopc;
1159 know (flag_mri);
1161 input_line_pointer = stop;
1162 *stop = stopc;
1163 while (! is_end_of_line[(unsigned char) *input_line_pointer])
1164 ++input_line_pointer;
1167 void
1168 s_abort (ignore)
1169 int ignore ATTRIBUTE_UNUSED;
1171 as_fatal (_(".abort detected. Abandoning ship."));
1174 /* Guts of .align directive. N is the power of two to which to align.
1175 FILL may be NULL, or it may point to the bytes of the fill pattern.
1176 LEN is the length of whatever FILL points to, if anything. MAX is
1177 the maximum number of characters to skip when doing the alignment,
1178 or 0 if there is no maximum. */
1180 static void
1181 do_align (n, fill, len, max)
1182 int n;
1183 char *fill;
1184 int len;
1185 int max;
1187 char default_fill;
1189 #ifdef md_do_align
1190 md_do_align (n, fill, len, max, just_record_alignment);
1191 #endif
1193 if (fill == NULL)
1195 if (subseg_text_p (now_seg))
1196 default_fill = NOP_OPCODE;
1197 else
1198 default_fill = 0;
1199 fill = &default_fill;
1200 len = 1;
1203 /* Only make a frag if we HAVE to. . . */
1204 if (n != 0 && !need_pass_2)
1206 if (len <= 1)
1207 frag_align (n, *fill, max);
1208 else
1209 frag_align_pattern (n, fill, len, max);
1212 #ifdef md_do_align
1213 just_record_alignment:
1214 #endif
1216 record_alignment (now_seg, n - OCTETS_PER_BYTE_POWER);
1219 /* Handle the .align pseudo-op. A positive ARG is a default alignment
1220 (in bytes). A negative ARG is the negative of the length of the
1221 fill pattern. BYTES_P is non-zero if the alignment value should be
1222 interpreted as the byte boundary, rather than the power of 2. */
1224 static void
1225 s_align (arg, bytes_p)
1226 int arg;
1227 int bytes_p;
1229 register unsigned int align;
1230 char *stop = NULL;
1231 char stopc;
1232 offsetT fill = 0;
1233 int max;
1234 int fill_p;
1236 if (flag_mri)
1237 stop = mri_comment_field (&stopc);
1239 if (is_end_of_line[(unsigned char) *input_line_pointer])
1241 if (arg < 0)
1242 align = 0;
1243 else
1244 align = arg; /* Default value from pseudo-op table */
1246 else
1248 align = get_absolute_expression ();
1249 SKIP_WHITESPACE ();
1252 if (bytes_p)
1254 /* Convert to a power of 2. */
1255 if (align != 0)
1257 unsigned int i;
1259 for (i = 0; (align & 1) == 0; align >>= 1, ++i)
1261 if (align != 1)
1262 as_bad (_("Alignment not a power of 2"));
1263 align = i;
1267 if (align > 15)
1269 align = 15;
1270 as_bad (_("Alignment too large: %u assumed"), align);
1273 if (*input_line_pointer != ',')
1275 fill_p = 0;
1276 max = 0;
1278 else
1280 ++input_line_pointer;
1281 if (*input_line_pointer == ',')
1282 fill_p = 0;
1283 else
1285 fill = get_absolute_expression ();
1286 SKIP_WHITESPACE ();
1287 fill_p = 1;
1290 if (*input_line_pointer != ',')
1291 max = 0;
1292 else
1294 ++input_line_pointer;
1295 max = get_absolute_expression ();
1299 if (! fill_p)
1301 if (arg < 0)
1302 as_warn (_("expected fill pattern missing"));
1303 do_align (align, (char *) NULL, 0, max);
1305 else
1307 int fill_len;
1309 if (arg >= 0)
1310 fill_len = 1;
1311 else
1312 fill_len = - arg;
1313 if (fill_len <= 1)
1315 char fill_char;
1317 fill_char = fill;
1318 do_align (align, &fill_char, fill_len, max);
1320 else
1322 char ab[16];
1324 if ((size_t) fill_len > sizeof ab)
1325 abort ();
1326 md_number_to_chars (ab, fill, fill_len);
1327 do_align (align, ab, fill_len, max);
1331 demand_empty_rest_of_line ();
1333 if (flag_mri)
1334 mri_comment_end (stop, stopc);
1337 /* Handle the .align pseudo-op on machines where ".align 4" means
1338 align to a 4 byte boundary. */
1340 void
1341 s_align_bytes (arg)
1342 int arg;
1344 s_align (arg, 1);
1347 /* Handle the .align pseudo-op on machines where ".align 4" means align
1348 to a 2**4 boundary. */
1350 void
1351 s_align_ptwo (arg)
1352 int arg;
1354 s_align (arg, 0);
1357 void
1358 s_comm (ignore)
1359 int ignore ATTRIBUTE_UNUSED;
1361 register char *name;
1362 register char c;
1363 register char *p;
1364 offsetT temp;
1365 register symbolS *symbolP;
1366 char *stop = NULL;
1367 char stopc;
1369 if (flag_mri)
1370 stop = mri_comment_field (&stopc);
1372 name = input_line_pointer;
1373 c = get_symbol_end ();
1374 /* just after name is now '\0' */
1375 p = input_line_pointer;
1376 *p = c;
1377 SKIP_WHITESPACE ();
1378 if (*input_line_pointer != ',')
1380 as_bad (_("Expected comma after symbol-name: rest of line ignored."));
1381 ignore_rest_of_line ();
1382 if (flag_mri)
1383 mri_comment_end (stop, stopc);
1384 return;
1386 input_line_pointer++; /* skip ',' */
1387 if ((temp = get_absolute_expression ()) < 0)
1389 as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) temp);
1390 ignore_rest_of_line ();
1391 if (flag_mri)
1392 mri_comment_end (stop, stopc);
1393 return;
1395 *p = 0;
1396 symbolP = symbol_find_or_make (name);
1397 *p = c;
1398 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
1400 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
1401 S_GET_NAME (symbolP));
1402 ignore_rest_of_line ();
1403 if (flag_mri)
1404 mri_comment_end (stop, stopc);
1405 return;
1407 if (S_GET_VALUE (symbolP))
1409 if (S_GET_VALUE (symbolP) != (valueT) temp)
1410 as_bad (_("Length of .comm \"%s\" is already %ld. Not changed to %ld."),
1411 S_GET_NAME (symbolP),
1412 (long) S_GET_VALUE (symbolP),
1413 (long) temp);
1415 else
1417 S_SET_VALUE (symbolP, (valueT) temp);
1418 S_SET_EXTERNAL (symbolP);
1420 #ifdef OBJ_VMS
1422 extern int flag_one;
1423 if ( (!temp) || !flag_one)
1424 S_GET_OTHER(symbolP) = const_flag;
1426 #endif /* not OBJ_VMS */
1427 know (symbolP->sy_frag == &zero_address_frag);
1429 demand_empty_rest_of_line ();
1431 if (flag_mri)
1432 mri_comment_end (stop, stopc);
1433 } /* s_comm() */
1435 /* The MRI COMMON pseudo-op. We handle this by creating a common
1436 symbol with the appropriate name. We make s_space do the right
1437 thing by increasing the size. */
1439 void
1440 s_mri_common (small)
1441 int small ATTRIBUTE_UNUSED;
1443 char *name;
1444 char c;
1445 char *alc = NULL;
1446 symbolS *sym;
1447 offsetT align;
1448 char *stop = NULL;
1449 char stopc;
1451 if (! flag_mri)
1453 s_comm (0);
1454 return;
1457 stop = mri_comment_field (&stopc);
1459 SKIP_WHITESPACE ();
1461 name = input_line_pointer;
1462 if (! isdigit ((unsigned char) *name))
1463 c = get_symbol_end ();
1464 else
1468 ++input_line_pointer;
1470 while (isdigit ((unsigned char) *input_line_pointer));
1471 c = *input_line_pointer;
1472 *input_line_pointer = '\0';
1474 if (line_label != NULL)
1476 alc = (char *) xmalloc (strlen (S_GET_NAME (line_label))
1477 + (input_line_pointer - name)
1478 + 1);
1479 sprintf (alc, "%s%s", name, S_GET_NAME (line_label));
1480 name = alc;
1484 sym = symbol_find_or_make (name);
1485 *input_line_pointer = c;
1486 if (alc != NULL)
1487 free (alc);
1489 if (*input_line_pointer != ',')
1490 align = 0;
1491 else
1493 ++input_line_pointer;
1494 align = get_absolute_expression ();
1497 if (S_IS_DEFINED (sym) && ! S_IS_COMMON (sym))
1499 as_bad (_("attempt to re-define symbol `%s'"), S_GET_NAME (sym));
1500 ignore_rest_of_line ();
1501 mri_comment_end (stop, stopc);
1502 return;
1505 S_SET_EXTERNAL (sym);
1506 mri_common_symbol = sym;
1508 #ifdef S_SET_ALIGN
1509 if (align != 0)
1510 S_SET_ALIGN (sym, align);
1511 #endif
1513 if (line_label != NULL)
1515 expressionS exp;
1516 exp.X_op = O_symbol;
1517 exp.X_add_symbol = sym;
1518 exp.X_add_number = 0;
1519 symbol_set_value_expression (line_label, &exp);
1520 symbol_set_frag (line_label, &zero_address_frag);
1521 S_SET_SEGMENT (line_label, expr_section);
1524 /* FIXME: We just ignore the small argument, which distinguishes
1525 COMMON and COMMON.S. I don't know what we can do about it. */
1527 /* Ignore the type and hptype. */
1528 if (*input_line_pointer == ',')
1529 input_line_pointer += 2;
1530 if (*input_line_pointer == ',')
1531 input_line_pointer += 2;
1533 demand_empty_rest_of_line ();
1535 mri_comment_end (stop, stopc);
1538 void
1539 s_data (ignore)
1540 int ignore ATTRIBUTE_UNUSED;
1542 segT section;
1543 register int temp;
1545 temp = get_absolute_expression ();
1546 if (flag_readonly_data_in_text)
1548 section = text_section;
1549 temp += 1000;
1551 else
1552 section = data_section;
1554 subseg_set (section, (subsegT) temp);
1556 #ifdef OBJ_VMS
1557 const_flag = 0;
1558 #endif
1559 demand_empty_rest_of_line ();
1562 /* Handle the .appfile pseudo-op. This is automatically generated by
1563 do_scrub_chars when a preprocessor # line comment is seen with a
1564 file name. This default definition may be overridden by the object
1565 or CPU specific pseudo-ops. This function is also the default
1566 definition for .file; the APPFILE argument is 1 for .appfile, 0 for
1567 .file. */
1569 void
1570 s_app_file (appfile)
1571 int appfile;
1573 register char *s;
1574 int length;
1576 /* Some assemblers tolerate immediately following '"' */
1577 if ((s = demand_copy_string (&length)) != 0)
1579 /* If this is a fake .appfile, a fake newline was inserted into
1580 the buffer. Passing -2 to new_logical_line tells it to
1581 account for it. */
1582 int may_omit
1583 = (! new_logical_line (s, appfile ? -2 : -1) && appfile);
1585 /* In MRI mode, the preprocessor may have inserted an extraneous
1586 backquote. */
1587 if (flag_m68k_mri
1588 && *input_line_pointer == '\''
1589 && is_end_of_line[(unsigned char) input_line_pointer[1]])
1590 ++input_line_pointer;
1592 demand_empty_rest_of_line ();
1593 if (! may_omit)
1595 #ifdef LISTING
1596 if (listing)
1597 listing_source_file (s);
1598 #endif
1599 register_dependency (s);
1600 #ifdef obj_app_file
1601 obj_app_file (s);
1602 #endif
1607 /* Handle the .appline pseudo-op. This is automatically generated by
1608 do_scrub_chars when a preprocessor # line comment is seen. This
1609 default definition may be overridden by the object or CPU specific
1610 pseudo-ops. */
1612 void
1613 s_app_line (ignore)
1614 int ignore ATTRIBUTE_UNUSED;
1616 int l;
1618 /* The given number is that of the next line. */
1619 l = get_absolute_expression () - 1;
1620 if (l < 0)
1621 /* Some of the back ends can't deal with non-positive line numbers.
1622 Besides, it's silly. */
1623 as_warn (_("Line numbers must be positive; line number %d rejected."), l+1);
1624 else
1626 new_logical_line ((char *) NULL, l);
1627 #ifdef LISTING
1628 if (listing)
1629 listing_source_line (l);
1630 #endif
1632 demand_empty_rest_of_line ();
1635 /* Handle the .end pseudo-op. Actually, the real work is done in
1636 read_a_source_file. */
1638 void
1639 s_end (ignore)
1640 int ignore ATTRIBUTE_UNUSED;
1642 if (flag_mri)
1644 /* The MRI assembler permits the start symbol to follow .end,
1645 but we don't support that. */
1646 SKIP_WHITESPACE ();
1647 if (! is_end_of_line[(unsigned char) *input_line_pointer]
1648 && *input_line_pointer != '*'
1649 && *input_line_pointer != '!')
1650 as_warn (_("start address not supported"));
1654 /* Handle the .err pseudo-op. */
1656 void
1657 s_err (ignore)
1658 int ignore ATTRIBUTE_UNUSED;
1660 as_bad (_(".err encountered"));
1661 demand_empty_rest_of_line ();
1664 /* Handle the MRI fail pseudo-op. */
1666 void
1667 s_fail (ignore)
1668 int ignore ATTRIBUTE_UNUSED;
1670 offsetT temp;
1671 char *stop = NULL;
1672 char stopc;
1674 if (flag_mri)
1675 stop = mri_comment_field (&stopc);
1677 temp = get_absolute_expression ();
1678 if (temp >= 500)
1679 as_warn (_(".fail %ld encountered"), (long) temp);
1680 else
1681 as_bad (_(".fail %ld encountered"), (long) temp);
1683 demand_empty_rest_of_line ();
1685 if (flag_mri)
1686 mri_comment_end (stop, stopc);
1689 void
1690 s_fill (ignore)
1691 int ignore ATTRIBUTE_UNUSED;
1693 expressionS rep_exp;
1694 long size = 1;
1695 register long fill = 0;
1696 char *p;
1698 #ifdef md_flush_pending_output
1699 md_flush_pending_output ();
1700 #endif
1702 get_known_segmented_expression (&rep_exp);
1703 if (*input_line_pointer == ',')
1705 input_line_pointer++;
1706 size = get_absolute_expression ();
1707 if (*input_line_pointer == ',')
1709 input_line_pointer++;
1710 fill = get_absolute_expression ();
1714 /* This is to be compatible with BSD 4.2 AS, not for any rational reason. */
1715 #define BSD_FILL_SIZE_CROCK_8 (8)
1716 if (size > BSD_FILL_SIZE_CROCK_8)
1718 as_warn (_(".fill size clamped to %d."), BSD_FILL_SIZE_CROCK_8);
1719 size = BSD_FILL_SIZE_CROCK_8;
1721 if (size < 0)
1723 as_warn (_("Size negative: .fill ignored."));
1724 size = 0;
1726 else if (rep_exp.X_op == O_constant && rep_exp.X_add_number <= 0)
1728 if (rep_exp.X_add_number < 0)
1729 as_warn (_("Repeat < 0, .fill ignored"));
1730 size = 0;
1733 if (size && !need_pass_2)
1735 if (rep_exp.X_op == O_constant)
1737 p = frag_var (rs_fill, (int) size, (int) size,
1738 (relax_substateT) 0, (symbolS *) 0,
1739 (offsetT) rep_exp.X_add_number,
1740 (char *) 0);
1742 else
1744 /* We don't have a constant repeat count, so we can't use
1745 rs_fill. We can get the same results out of rs_space,
1746 but its argument is in bytes, so we must multiply the
1747 repeat count by size. */
1749 symbolS *rep_sym;
1750 rep_sym = make_expr_symbol (&rep_exp);
1751 if (size != 1)
1753 expressionS size_exp;
1754 size_exp.X_op = O_constant;
1755 size_exp.X_add_number = size;
1757 rep_exp.X_op = O_multiply;
1758 rep_exp.X_add_symbol = rep_sym;
1759 rep_exp.X_op_symbol = make_expr_symbol (&size_exp);
1760 rep_exp.X_add_number = 0;
1761 rep_sym = make_expr_symbol (&rep_exp);
1764 p = frag_var (rs_space, (int) size, (int) size,
1765 (relax_substateT) 0, rep_sym, (offsetT) 0, (char *) 0);
1767 memset (p, 0, (unsigned int) size);
1768 /* The magic number BSD_FILL_SIZE_CROCK_4 is from BSD 4.2 VAX
1769 * flavoured AS. The following bizzare behaviour is to be
1770 * compatible with above. I guess they tried to take up to 8
1771 * bytes from a 4-byte expression and they forgot to sign
1772 * extend. Un*x Sux. */
1773 #define BSD_FILL_SIZE_CROCK_4 (4)
1774 md_number_to_chars (p, (valueT) fill,
1775 (size > BSD_FILL_SIZE_CROCK_4
1776 ? BSD_FILL_SIZE_CROCK_4
1777 : (int) size));
1778 /* Note: .fill (),0 emits no frag (since we are asked to .fill 0 bytes)
1779 * but emits no error message because it seems a legal thing to do.
1780 * It is a degenerate case of .fill but could be emitted by a compiler.
1783 demand_empty_rest_of_line ();
1786 void
1787 s_globl (ignore)
1788 int ignore ATTRIBUTE_UNUSED;
1790 char *name;
1791 int c;
1792 symbolS *symbolP;
1793 char *stop = NULL;
1794 char stopc;
1796 if (flag_mri)
1797 stop = mri_comment_field (&stopc);
1801 name = input_line_pointer;
1802 c = get_symbol_end ();
1803 symbolP = symbol_find_or_make (name);
1804 S_SET_EXTERNAL (symbolP);
1806 *input_line_pointer = c;
1807 SKIP_WHITESPACE ();
1808 c = *input_line_pointer;
1809 if (c == ',')
1811 input_line_pointer++;
1812 SKIP_WHITESPACE ();
1813 if (*input_line_pointer == '\n')
1814 c = '\n';
1817 while (c == ',');
1819 demand_empty_rest_of_line ();
1821 if (flag_mri)
1822 mri_comment_end (stop, stopc);
1825 /* Handle the MRI IRP and IRPC pseudo-ops. */
1827 void
1828 s_irp (irpc)
1829 int irpc;
1831 char *file;
1832 unsigned int line;
1833 sb s;
1834 const char *err;
1835 sb out;
1837 as_where (&file, &line);
1839 sb_new (&s);
1840 while (! is_end_of_line[(unsigned char) *input_line_pointer])
1841 sb_add_char (&s, *input_line_pointer++);
1843 sb_new (&out);
1845 err = expand_irp (irpc, 0, &s, &out, get_line_sb, '\0');
1846 if (err != NULL)
1847 as_bad_where (file, line, "%s", err);
1849 sb_kill (&s);
1851 input_scrub_include_sb (&out, input_line_pointer, 1);
1852 sb_kill (&out);
1853 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
1856 /* Handle the .linkonce pseudo-op. This tells the assembler to mark
1857 the section to only be linked once. However, this is not supported
1858 by most object file formats. This takes an optional argument,
1859 which is what to do about duplicates. */
1861 void
1862 s_linkonce (ignore)
1863 int ignore ATTRIBUTE_UNUSED;
1865 enum linkonce_type type;
1867 SKIP_WHITESPACE ();
1869 type = LINKONCE_DISCARD;
1871 if (! is_end_of_line[(unsigned char) *input_line_pointer])
1873 char *s;
1874 char c;
1876 s = input_line_pointer;
1877 c = get_symbol_end ();
1878 if (strcasecmp (s, "discard") == 0)
1879 type = LINKONCE_DISCARD;
1880 else if (strcasecmp (s, "one_only") == 0)
1881 type = LINKONCE_ONE_ONLY;
1882 else if (strcasecmp (s, "same_size") == 0)
1883 type = LINKONCE_SAME_SIZE;
1884 else if (strcasecmp (s, "same_contents") == 0)
1885 type = LINKONCE_SAME_CONTENTS;
1886 else
1887 as_warn (_("unrecognized .linkonce type `%s'"), s);
1889 *input_line_pointer = c;
1892 #ifdef obj_handle_link_once
1893 obj_handle_link_once (type);
1894 #else /* ! defined (obj_handle_link_once) */
1895 #ifdef BFD_ASSEMBLER
1897 flagword flags;
1899 if ((bfd_applicable_section_flags (stdoutput) & SEC_LINK_ONCE) == 0)
1900 as_warn (_(".linkonce is not supported for this object file format"));
1902 flags = bfd_get_section_flags (stdoutput, now_seg);
1903 flags |= SEC_LINK_ONCE;
1904 switch (type)
1906 default:
1907 abort ();
1908 case LINKONCE_DISCARD:
1909 flags |= SEC_LINK_DUPLICATES_DISCARD;
1910 break;
1911 case LINKONCE_ONE_ONLY:
1912 flags |= SEC_LINK_DUPLICATES_ONE_ONLY;
1913 break;
1914 case LINKONCE_SAME_SIZE:
1915 flags |= SEC_LINK_DUPLICATES_SAME_SIZE;
1916 break;
1917 case LINKONCE_SAME_CONTENTS:
1918 flags |= SEC_LINK_DUPLICATES_SAME_CONTENTS;
1919 break;
1921 if (! bfd_set_section_flags (stdoutput, now_seg, flags))
1922 as_bad (_("bfd_set_section_flags: %s"),
1923 bfd_errmsg (bfd_get_error ()));
1925 #else /* ! defined (BFD_ASSEMBLER) */
1926 as_warn (_(".linkonce is not supported for this object file format"));
1927 #endif /* ! defined (BFD_ASSEMBLER) */
1928 #endif /* ! defined (obj_handle_link_once) */
1930 demand_empty_rest_of_line ();
1933 static void
1934 s_lcomm_internal (needs_align, bytes_p)
1935 /* 1 if this was a ".bss" directive, which may require a 3rd argument
1936 (alignment); 0 if it was an ".lcomm" (2 args only) */
1937 int needs_align;
1938 /* 1 if the alignment value should be interpreted as the byte boundary,
1939 rather than the power of 2. */
1940 int bytes_p;
1942 register char *name;
1943 register char c;
1944 register char *p;
1945 register int temp;
1946 register symbolS *symbolP;
1947 segT current_seg = now_seg;
1948 subsegT current_subseg = now_subseg;
1949 const int max_alignment = 15;
1950 int align = 0;
1951 segT bss_seg = bss_section;
1953 name = input_line_pointer;
1954 c = get_symbol_end ();
1955 p = input_line_pointer;
1956 *p = c;
1957 SKIP_WHITESPACE ();
1959 /* Accept an optional comma after the name. The comma used to be
1960 required, but Irix 5 cc does not generate it. */
1961 if (*input_line_pointer == ',')
1963 ++input_line_pointer;
1964 SKIP_WHITESPACE ();
1967 if (*input_line_pointer == '\n')
1969 as_bad (_("Missing size expression"));
1970 return;
1973 if ((temp = get_absolute_expression ()) < 0)
1975 as_warn (_("BSS length (%d.) <0! Ignored."), temp);
1976 ignore_rest_of_line ();
1977 return;
1980 #if defined (TC_MIPS) || defined (TC_ALPHA)
1981 if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour
1982 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
1984 /* For MIPS and Alpha ECOFF or ELF, small objects are put in .sbss. */
1985 if (temp <= bfd_get_gp_size (stdoutput))
1987 bss_seg = subseg_new (".sbss", 1);
1988 seg_info (bss_seg)->bss = 1;
1989 #ifdef BFD_ASSEMBLER
1990 if (! bfd_set_section_flags (stdoutput, bss_seg, SEC_ALLOC))
1991 as_warn (_("error setting flags for \".sbss\": %s"),
1992 bfd_errmsg (bfd_get_error ()));
1993 #endif
1996 #endif
1998 if (!needs_align)
2000 TC_IMPLICIT_LCOMM_ALIGNMENT (temp, align);
2002 /* Still zero unless TC_IMPLICIT_LCOMM_ALIGNMENT set it. */
2003 if (align)
2004 record_alignment(bss_seg, align);
2007 if (needs_align)
2009 align = 0;
2010 SKIP_WHITESPACE ();
2011 if (*input_line_pointer != ',')
2013 as_bad (_("Expected comma after size"));
2014 ignore_rest_of_line ();
2015 return;
2017 input_line_pointer++;
2018 SKIP_WHITESPACE ();
2019 if (*input_line_pointer == '\n')
2021 as_bad (_("Missing alignment"));
2022 return;
2024 align = get_absolute_expression ();
2025 if (bytes_p)
2027 /* Convert to a power of 2. */
2028 if (align != 0)
2030 unsigned int i;
2032 for (i = 0; (align & 1) == 0; align >>= 1, ++i)
2034 if (align != 1)
2035 as_bad (_("Alignment not a power of 2"));
2036 align = i;
2039 if (align > max_alignment)
2041 align = max_alignment;
2042 as_warn (_("Alignment too large: %d. assumed."), align);
2044 else if (align < 0)
2046 align = 0;
2047 as_warn (_("Alignment negative. 0 assumed."));
2049 record_alignment (bss_seg, align);
2050 } /* if needs align */
2051 else
2053 /* Assume some objects may require alignment on some systems. */
2054 #if defined (TC_ALPHA) && ! defined (VMS)
2055 if (temp > 1)
2057 align = ffs (temp) - 1;
2058 if (temp % (1 << align))
2059 abort ();
2061 #endif
2064 *p = 0;
2065 symbolP = symbol_find_or_make (name);
2066 *p = c;
2068 if (
2069 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT) \
2070 || defined (OBJ_BOUT) || defined (OBJ_MAYBE_BOUT))
2071 #ifdef BFD_ASSEMBLER
2072 (OUTPUT_FLAVOR != bfd_target_aout_flavour
2073 || (S_GET_OTHER (symbolP) == 0 && S_GET_DESC (symbolP) == 0)) &&
2074 #else
2075 (S_GET_OTHER (symbolP) == 0 && S_GET_DESC (symbolP) == 0) &&
2076 #endif
2077 #endif
2078 (S_GET_SEGMENT (symbolP) == bss_seg
2079 || (!S_IS_DEFINED (symbolP) && S_GET_VALUE (symbolP) == 0)))
2081 char *pfrag;
2083 subseg_set (bss_seg, 1);
2085 if (align)
2086 frag_align (align, 0, 0);
2087 /* detach from old frag */
2088 if (S_GET_SEGMENT (symbolP) == bss_seg)
2089 symbol_get_frag (symbolP)->fr_symbol = NULL;
2091 symbol_set_frag (symbolP, frag_now);
2092 pfrag = frag_var (rs_org, 1, 1, (relax_substateT)0, symbolP,
2093 (offsetT) temp, (char *) 0);
2094 *pfrag = 0;
2096 S_SET_SEGMENT (symbolP, bss_seg);
2098 #ifdef OBJ_COFF
2099 /* The symbol may already have been created with a preceding
2100 ".globl" directive -- be careful not to step on storage class
2101 in that case. Otherwise, set it to static. */
2102 if (S_GET_STORAGE_CLASS (symbolP) != C_EXT)
2104 S_SET_STORAGE_CLASS (symbolP, C_STAT);
2106 #endif /* OBJ_COFF */
2108 #ifdef S_SET_SIZE
2109 S_SET_SIZE (symbolP, temp);
2110 #endif
2112 else
2113 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
2114 S_GET_NAME (symbolP));
2116 subseg_set (current_seg, current_subseg);
2118 demand_empty_rest_of_line ();
2119 } /* s_lcomm_internal() */
2121 void
2122 s_lcomm (needs_align)
2123 int needs_align;
2125 s_lcomm_internal (needs_align, 0);
2128 void s_lcomm_bytes (needs_align)
2129 int needs_align;
2131 s_lcomm_internal (needs_align, 1);
2134 void
2135 s_lsym (ignore)
2136 int ignore ATTRIBUTE_UNUSED;
2138 register char *name;
2139 register char c;
2140 register char *p;
2141 expressionS exp;
2142 register symbolS *symbolP;
2144 /* we permit ANY defined expression: BSD4.2 demands constants */
2145 name = input_line_pointer;
2146 c = get_symbol_end ();
2147 p = input_line_pointer;
2148 *p = c;
2149 SKIP_WHITESPACE ();
2150 if (*input_line_pointer != ',')
2152 *p = 0;
2153 as_bad (_("Expected comma after name \"%s\""), name);
2154 *p = c;
2155 ignore_rest_of_line ();
2156 return;
2158 input_line_pointer++;
2159 expression (&exp);
2160 if (exp.X_op != O_constant
2161 && exp.X_op != O_register)
2163 as_bad (_("bad expression"));
2164 ignore_rest_of_line ();
2165 return;
2167 *p = 0;
2168 symbolP = symbol_find_or_make (name);
2170 /* FIXME-SOON I pulled a (&& symbolP->sy_other == 0 &&
2171 symbolP->sy_desc == 0) out of this test because coff doesn't have
2172 those fields, and I can't see when they'd ever be tripped. I
2173 don't think I understand why they were here so I may have
2174 introduced a bug. As recently as 1.37 didn't have this test
2175 anyway. xoxorich. */
2177 if (S_GET_SEGMENT (symbolP) == undefined_section
2178 && S_GET_VALUE (symbolP) == 0)
2180 /* The name might be an undefined .global symbol; be sure to
2181 keep the "external" bit. */
2182 S_SET_SEGMENT (symbolP,
2183 (exp.X_op == O_constant
2184 ? absolute_section
2185 : reg_section));
2186 S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
2188 else
2190 as_bad (_("Symbol %s already defined"), name);
2192 *p = c;
2193 demand_empty_rest_of_line ();
2194 } /* s_lsym() */
2196 /* Read a line into an sb. */
2198 static int
2199 get_line_sb (line)
2200 sb *line;
2202 char quote1, quote2, inquote;
2204 if (input_line_pointer[-1] == '\n')
2205 bump_line_counters ();
2207 if (input_line_pointer >= buffer_limit)
2209 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2210 if (buffer_limit == 0)
2211 return 0;
2214 /* If app.c sets any other characters to LEX_IS_STRINGQUOTE, this
2215 code needs to be changed. */
2216 if (! flag_m68k_mri)
2217 quote1 = '"';
2218 else
2219 quote1 = '\0';
2221 quote2 = '\0';
2222 if (flag_m68k_mri)
2223 quote2 = '\'';
2224 #ifdef LEX_IS_STRINGQUOTE
2225 quote2 = '\'';
2226 #endif
2228 inquote = '\0';
2229 while (! is_end_of_line[(unsigned char) *input_line_pointer]
2230 || (inquote != '\0' && *input_line_pointer != '\n'))
2232 if (inquote == *input_line_pointer)
2233 inquote = '\0';
2234 else if (inquote == '\0')
2236 if (*input_line_pointer == quote1)
2237 inquote = quote1;
2238 else if (*input_line_pointer == quote2)
2239 inquote = quote2;
2241 sb_add_char (line, *input_line_pointer++);
2243 while (input_line_pointer < buffer_limit
2244 && is_end_of_line[(unsigned char) *input_line_pointer])
2246 if (input_line_pointer[-1] == '\n')
2247 bump_line_counters ();
2248 ++input_line_pointer;
2250 return 1;
2253 /* Define a macro. This is an interface to macro.c, which is shared
2254 between gas and gasp. */
2256 void
2257 s_macro (ignore)
2258 int ignore ATTRIBUTE_UNUSED;
2260 char *file;
2261 unsigned int line;
2262 sb s;
2263 sb label;
2264 const char *err;
2265 const char *name;
2267 as_where (&file, &line);
2269 sb_new (&s);
2270 while (! is_end_of_line[(unsigned char) *input_line_pointer])
2271 sb_add_char (&s, *input_line_pointer++);
2273 sb_new (&label);
2274 if (line_label != NULL)
2275 sb_add_string (&label, S_GET_NAME (line_label));
2277 err = define_macro (0, &s, &label, get_line_sb, &name);
2278 if (err != NULL)
2279 as_bad_where (file, line, "%s", err);
2280 else
2282 if (line_label != NULL)
2284 S_SET_SEGMENT (line_label, undefined_section);
2285 S_SET_VALUE (line_label, 0);
2286 symbol_set_frag (line_label, &zero_address_frag);
2289 if (((NO_PSEUDO_DOT || flag_m68k_mri)
2290 && hash_find (po_hash, name) != NULL)
2291 || (! flag_m68k_mri
2292 && *name == '.'
2293 && hash_find (po_hash, name + 1) != NULL))
2294 as_warn (_("attempt to redefine pseudo-op `%s' ignored"),
2295 name);
2298 sb_kill (&s);
2301 /* Handle the .mexit pseudo-op, which immediately exits a macro
2302 expansion. */
2304 void
2305 s_mexit (ignore)
2306 int ignore ATTRIBUTE_UNUSED;
2308 cond_exit_macro (macro_nest);
2309 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2312 /* Switch in and out of MRI mode. */
2314 void
2315 s_mri (ignore)
2316 int ignore ATTRIBUTE_UNUSED;
2318 int on, old_flag;
2320 on = get_absolute_expression ();
2321 old_flag = flag_mri;
2322 if (on != 0)
2324 flag_mri = 1;
2325 #ifdef TC_M68K
2326 flag_m68k_mri = 1;
2327 #endif
2328 macro_mri_mode (1);
2330 else
2332 flag_mri = 0;
2333 #ifdef TC_M68K
2334 flag_m68k_mri = 0;
2335 #endif
2336 macro_mri_mode (0);
2339 /* Operator precedence changes in m68k MRI mode, so we need to
2340 update the operator rankings. */
2341 expr_set_precedence ();
2343 #ifdef MRI_MODE_CHANGE
2344 if (on != old_flag)
2345 MRI_MODE_CHANGE (on);
2346 #endif
2348 demand_empty_rest_of_line ();
2351 /* Handle changing the location counter. */
2353 static void
2354 do_org (segment, exp, fill)
2355 segT segment;
2356 expressionS *exp;
2357 int fill;
2359 if (segment != now_seg && segment != absolute_section)
2360 as_bad (_("invalid segment \"%s\"; segment \"%s\" assumed"),
2361 segment_name (segment), segment_name (now_seg));
2363 if (now_seg == absolute_section)
2365 if (fill != 0)
2366 as_warn (_("ignoring fill value in absolute section"));
2367 if (exp->X_op != O_constant)
2369 as_bad (_("only constant offsets supported in absolute section"));
2370 exp->X_add_number = 0;
2372 abs_section_offset = exp->X_add_number;
2374 else
2376 char *p;
2378 p = frag_var (rs_org, 1, 1, (relax_substateT) 0, exp->X_add_symbol,
2379 exp->X_add_number * OCTETS_PER_BYTE, (char *) NULL);
2380 *p = fill;
2384 void
2385 s_org (ignore)
2386 int ignore ATTRIBUTE_UNUSED;
2388 register segT segment;
2389 expressionS exp;
2390 register long temp_fill;
2392 #ifdef md_flush_pending_output
2393 md_flush_pending_output ();
2394 #endif
2396 /* The m68k MRI assembler has a different meaning for .org. It
2397 means to create an absolute section at a given address. We can't
2398 support that--use a linker script instead. */
2399 if (flag_m68k_mri)
2401 as_bad (_("MRI style ORG pseudo-op not supported"));
2402 ignore_rest_of_line ();
2403 return;
2406 /* Don't believe the documentation of BSD 4.2 AS. There is no such
2407 thing as a sub-segment-relative origin. Any absolute origin is
2408 given a warning, then assumed to be segment-relative. Any
2409 segmented origin expression ("foo+42") had better be in the right
2410 segment or the .org is ignored.
2412 BSD 4.2 AS warns if you try to .org backwards. We cannot because
2413 we never know sub-segment sizes when we are reading code. BSD
2414 will crash trying to emit negative numbers of filler bytes in
2415 certain .orgs. We don't crash, but see as-write for that code.
2417 Don't make frag if need_pass_2==1. */
2418 segment = get_known_segmented_expression (&exp);
2419 if (*input_line_pointer == ',')
2421 input_line_pointer++;
2422 temp_fill = get_absolute_expression ();
2424 else
2425 temp_fill = 0;
2427 if (!need_pass_2)
2428 do_org (segment, &exp, temp_fill);
2430 demand_empty_rest_of_line ();
2431 } /* s_org() */
2433 /* Handle parsing for the MRI SECT/SECTION pseudo-op. This should be
2434 called by the obj-format routine which handles section changing
2435 when in MRI mode. It will create a new section, and return it. It
2436 will set *TYPE to the section type: one of 'C' (code), 'D' (data),
2437 'M' (mixed), or 'R' (romable). If BFD_ASSEMBLER is defined, the
2438 flags will be set in the section. */
2440 void
2441 s_mri_sect (type)
2442 char *type ATTRIBUTE_UNUSED;
2444 #ifdef TC_M68K
2446 char *name;
2447 char c;
2448 segT seg;
2450 SKIP_WHITESPACE ();
2452 name = input_line_pointer;
2453 if (! isdigit ((unsigned char) *name))
2454 c = get_symbol_end ();
2455 else
2459 ++input_line_pointer;
2461 while (isdigit ((unsigned char) *input_line_pointer));
2462 c = *input_line_pointer;
2463 *input_line_pointer = '\0';
2466 name = xstrdup (name);
2468 *input_line_pointer = c;
2470 seg = subseg_new (name, 0);
2472 if (*input_line_pointer == ',')
2474 int align;
2476 ++input_line_pointer;
2477 align = get_absolute_expression ();
2478 record_alignment (seg, align);
2481 *type = 'C';
2482 if (*input_line_pointer == ',')
2484 c = *++input_line_pointer;
2485 c = toupper ((unsigned char) c);
2486 if (c == 'C' || c == 'D' || c == 'M' || c == 'R')
2487 *type = c;
2488 else
2489 as_bad (_("unrecognized section type"));
2490 ++input_line_pointer;
2492 #ifdef BFD_ASSEMBLER
2494 flagword flags;
2496 flags = SEC_NO_FLAGS;
2497 if (*type == 'C')
2498 flags = SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE;
2499 else if (*type == 'D' || *type == 'M')
2500 flags = SEC_ALLOC | SEC_LOAD | SEC_DATA;
2501 else if (*type == 'R')
2502 flags = SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_READONLY | SEC_ROM;
2503 if (flags != SEC_NO_FLAGS)
2505 if (! bfd_set_section_flags (stdoutput, seg, flags))
2506 as_warn (_("error setting flags for \"%s\": %s"),
2507 bfd_section_name (stdoutput, seg),
2508 bfd_errmsg (bfd_get_error ()));
2511 #endif
2514 /* Ignore the HP type. */
2515 if (*input_line_pointer == ',')
2516 input_line_pointer += 2;
2518 demand_empty_rest_of_line ();
2520 #else /* ! TC_M68K */
2521 #ifdef TC_I960
2523 char *name;
2524 char c;
2525 segT seg;
2527 SKIP_WHITESPACE ();
2529 name = input_line_pointer;
2530 c = get_symbol_end ();
2532 name = xstrdup (name);
2534 *input_line_pointer = c;
2536 seg = subseg_new (name, 0);
2538 if (*input_line_pointer != ',')
2539 *type = 'C';
2540 else
2542 char *sectype;
2544 ++input_line_pointer;
2545 SKIP_WHITESPACE ();
2546 sectype = input_line_pointer;
2547 c = get_symbol_end ();
2548 if (*sectype == '\0')
2549 *type = 'C';
2550 else if (strcasecmp (sectype, "text") == 0)
2551 *type = 'C';
2552 else if (strcasecmp (sectype, "data") == 0)
2553 *type = 'D';
2554 else if (strcasecmp (sectype, "romdata") == 0)
2555 *type = 'R';
2556 else
2557 as_warn (_("unrecognized section type `%s'"), sectype);
2558 *input_line_pointer = c;
2561 if (*input_line_pointer == ',')
2563 char *seccmd;
2565 ++input_line_pointer;
2566 SKIP_WHITESPACE ();
2567 seccmd = input_line_pointer;
2568 c = get_symbol_end ();
2569 if (strcasecmp (seccmd, "absolute") == 0)
2571 as_bad (_("absolute sections are not supported"));
2572 *input_line_pointer = c;
2573 ignore_rest_of_line ();
2574 return;
2576 else if (strcasecmp (seccmd, "align") == 0)
2578 int align;
2580 *input_line_pointer = c;
2581 align = get_absolute_expression ();
2582 record_alignment (seg, align);
2584 else
2586 as_warn (_("unrecognized section command `%s'"), seccmd);
2587 *input_line_pointer = c;
2591 demand_empty_rest_of_line ();
2593 #else /* ! TC_I960 */
2594 /* The MRI assembler seems to use different forms of .sect for
2595 different targets. */
2596 as_bad ("MRI mode not supported for this target");
2597 ignore_rest_of_line ();
2598 #endif /* ! TC_I960 */
2599 #endif /* ! TC_M68K */
2602 /* Handle the .print pseudo-op. */
2604 void
2605 s_print (ignore)
2606 int ignore ATTRIBUTE_UNUSED;
2608 char *s;
2609 int len;
2611 s = demand_copy_C_string (&len);
2612 printf ("%s\n", s);
2613 demand_empty_rest_of_line ();
2616 /* Handle the .purgem pseudo-op. */
2618 void
2619 s_purgem (ignore)
2620 int ignore ATTRIBUTE_UNUSED;
2622 if (is_it_end_of_statement ())
2624 demand_empty_rest_of_line ();
2625 return;
2630 char *name;
2631 char c;
2633 SKIP_WHITESPACE ();
2634 name = input_line_pointer;
2635 c = get_symbol_end ();
2636 delete_macro (name);
2637 *input_line_pointer = c;
2638 SKIP_WHITESPACE ();
2640 while (*input_line_pointer++ == ',');
2642 --input_line_pointer;
2643 demand_empty_rest_of_line ();
2646 /* Handle the .rept pseudo-op. */
2648 void
2649 s_rept (ignore)
2650 int ignore ATTRIBUTE_UNUSED;
2652 int count;
2654 count = get_absolute_expression ();
2656 do_repeat(count, "REPT", "ENDR");
2659 /* This function provides a generic repeat block implementation. It allows
2660 different directives to be used as the start/end keys. */
2662 void
2663 do_repeat (count, start, end)
2664 int count;
2665 const char *start;
2666 const char *end;
2668 sb one;
2669 sb many;
2671 sb_new (&one);
2672 if (! buffer_and_nest (start, end, &one, get_line_sb))
2674 as_bad (_("%s without %s"), start, end);
2675 return;
2678 sb_new (&many);
2679 while (count-- > 0)
2680 sb_add_sb (&many, &one);
2682 sb_kill (&one);
2684 input_scrub_include_sb (&many, input_line_pointer, 1);
2685 sb_kill (&many);
2686 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2689 /* Skip to end of current repeat loop; EXTRA indicates how many additional
2690 input buffers to skip. Assumes that conditionals preceding the loop end
2691 are properly nested.
2693 This function makes it easier to implement a premature "break" out of the
2694 loop. The EXTRA arg accounts for other buffers we might have inserted,
2695 such as line substitutions. */
2697 void
2698 end_repeat (extra)
2699 int extra;
2701 cond_exit_macro (macro_nest);
2702 while (extra-- >= 0)
2703 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2706 /* Handle the .equ, .equiv and .set directives. If EQUIV is 1, then
2707 this is .equiv, and it is an error if the symbol is already
2708 defined. */
2710 void
2711 s_set (equiv)
2712 int equiv;
2714 register char *name;
2715 register char delim;
2716 register char *end_name;
2717 register symbolS *symbolP;
2720 * Especial apologies for the random logic:
2721 * this just grew, and could be parsed much more simply!
2722 * Dean in haste.
2724 name = input_line_pointer;
2725 delim = get_symbol_end ();
2726 end_name = input_line_pointer;
2727 *end_name = delim;
2728 SKIP_WHITESPACE ();
2730 if (*input_line_pointer != ',')
2732 *end_name = 0;
2733 as_bad (_("Expected comma after name \"%s\""), name);
2734 *end_name = delim;
2735 ignore_rest_of_line ();
2736 return;
2739 input_line_pointer++;
2740 *end_name = 0;
2742 if (name[0] == '.' && name[1] == '\0')
2744 /* Turn '. = mumble' into a .org mumble */
2745 register segT segment;
2746 expressionS exp;
2748 segment = get_known_segmented_expression (&exp);
2750 if (!need_pass_2)
2751 do_org (segment, &exp, 0);
2753 *end_name = delim;
2754 return;
2757 if ((symbolP = symbol_find (name)) == NULL
2758 && (symbolP = md_undefined_symbol (name)) == NULL)
2760 #ifndef NO_LISTING
2761 /* When doing symbol listings, play games with dummy fragments living
2762 outside the normal fragment chain to record the file and line info
2763 for this symbol. */
2764 if (listing & LISTING_SYMBOLS)
2766 extern struct list_info_struct *listing_tail;
2767 fragS *dummy_frag = (fragS *) xmalloc (sizeof(fragS));
2768 memset (dummy_frag, 0, sizeof(fragS));
2769 dummy_frag->fr_type = rs_fill;
2770 dummy_frag->line = listing_tail;
2771 symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
2772 dummy_frag->fr_symbol = symbolP;
2774 else
2775 #endif
2776 symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
2778 #ifdef OBJ_COFF
2779 /* "set" symbols are local unless otherwise specified. */
2780 SF_SET_LOCAL (symbolP);
2781 #endif /* OBJ_COFF */
2783 } /* make a new symbol */
2785 symbol_table_insert (symbolP);
2787 *end_name = delim;
2789 if (equiv
2790 && S_IS_DEFINED (symbolP)
2791 && S_GET_SEGMENT (symbolP) != reg_section)
2792 as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
2794 pseudo_set (symbolP);
2795 demand_empty_rest_of_line ();
2796 } /* s_set() */
2798 void
2799 s_space (mult)
2800 int mult;
2802 expressionS exp;
2803 expressionS val;
2804 char *p = 0;
2805 char *stop = NULL;
2806 char stopc;
2807 int bytes;
2809 #ifdef md_flush_pending_output
2810 md_flush_pending_output ();
2811 #endif
2813 if (flag_mri)
2814 stop = mri_comment_field (&stopc);
2816 /* In m68k MRI mode, we need to align to a word boundary, unless
2817 this is ds.b. */
2818 if (flag_m68k_mri && mult > 1)
2820 if (now_seg == absolute_section)
2822 abs_section_offset += abs_section_offset & 1;
2823 if (line_label != NULL)
2824 S_SET_VALUE (line_label, abs_section_offset);
2826 else if (mri_common_symbol != NULL)
2828 valueT val;
2830 val = S_GET_VALUE (mri_common_symbol);
2831 if ((val & 1) != 0)
2833 S_SET_VALUE (mri_common_symbol, val + 1);
2834 if (line_label != NULL)
2836 expressionS *symexp;
2838 symexp = symbol_get_value_expression (line_label);
2839 know (symexp->X_op == O_symbol);
2840 know (symexp->X_add_symbol == mri_common_symbol);
2841 symexp->X_add_number += 1;
2845 else
2847 do_align (1, (char *) NULL, 0, 0);
2848 if (line_label != NULL)
2850 symbol_set_frag (line_label, frag_now);
2851 S_SET_VALUE (line_label, frag_now_fix ());
2856 bytes = mult;
2858 expression (&exp);
2860 SKIP_WHITESPACE ();
2861 if (*input_line_pointer == ',')
2863 ++input_line_pointer;
2864 expression (&val);
2866 else
2868 val.X_op = O_constant;
2869 val.X_add_number = 0;
2872 if (val.X_op != O_constant
2873 || val.X_add_number < - 0x80
2874 || val.X_add_number > 0xff
2875 || (mult != 0 && mult != 1 && val.X_add_number != 0))
2877 if (exp.X_op != O_constant)
2878 as_bad (_("Unsupported variable size or fill value"));
2879 else
2881 offsetT i;
2883 if (mult == 0)
2884 mult = 1;
2885 bytes = mult * exp.X_add_number;
2886 for (i = 0; i < exp.X_add_number; i++)
2887 emit_expr (&val, mult);
2890 else
2892 if (exp.X_op == O_constant)
2894 long repeat;
2896 repeat = exp.X_add_number;
2897 if (mult)
2898 repeat *= mult;
2899 bytes = repeat;
2900 if (repeat <= 0)
2902 if (! flag_mri)
2903 as_warn (_(".space repeat count is zero, ignored"));
2904 else if (repeat < 0)
2905 as_warn (_(".space repeat count is negative, ignored"));
2906 goto getout;
2909 /* If we are in the absolute section, just bump the offset. */
2910 if (now_seg == absolute_section)
2912 abs_section_offset += repeat;
2913 goto getout;
2916 /* If we are secretly in an MRI common section, then
2917 creating space just increases the size of the common
2918 symbol. */
2919 if (mri_common_symbol != NULL)
2921 S_SET_VALUE (mri_common_symbol,
2922 S_GET_VALUE (mri_common_symbol) + repeat);
2923 goto getout;
2926 if (!need_pass_2)
2927 p = frag_var (rs_fill, 1, 1, (relax_substateT) 0, (symbolS *) 0,
2928 (offsetT) repeat, (char *) 0);
2930 else
2932 if (now_seg == absolute_section)
2934 as_bad (_("space allocation too complex in absolute section"));
2935 subseg_set (text_section, 0);
2937 if (mri_common_symbol != NULL)
2939 as_bad (_("space allocation too complex in common section"));
2940 mri_common_symbol = NULL;
2942 if (!need_pass_2)
2943 p = frag_var (rs_space, 1, 1, (relax_substateT) 0,
2944 make_expr_symbol (&exp), (offsetT) 0, (char *) 0);
2947 if (p)
2948 *p = val.X_add_number;
2951 getout:
2953 /* In MRI mode, after an odd number of bytes, we must align to an
2954 even word boundary, unless the next instruction is a dc.b, ds.b
2955 or dcb.b. */
2956 if (flag_mri && (bytes & 1) != 0)
2957 mri_pending_align = 1;
2959 demand_empty_rest_of_line ();
2961 if (flag_mri)
2962 mri_comment_end (stop, stopc);
2965 /* This is like s_space, but the value is a floating point number with
2966 the given precision. This is for the MRI dcb.s pseudo-op and
2967 friends. */
2969 void
2970 s_float_space (float_type)
2971 int float_type;
2973 offsetT count;
2974 int flen;
2975 char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
2976 char *stop = NULL;
2977 char stopc;
2979 if (flag_mri)
2980 stop = mri_comment_field (&stopc);
2982 count = get_absolute_expression ();
2984 SKIP_WHITESPACE ();
2985 if (*input_line_pointer != ',')
2987 as_bad (_("missing value"));
2988 ignore_rest_of_line ();
2989 if (flag_mri)
2990 mri_comment_end (stop, stopc);
2991 return;
2994 ++input_line_pointer;
2996 SKIP_WHITESPACE ();
2998 /* Skip any 0{letter} that may be present. Don't even check if the
2999 * letter is legal. */
3000 if (input_line_pointer[0] == '0'
3001 && isalpha ((unsigned char) input_line_pointer[1]))
3002 input_line_pointer += 2;
3004 /* Accept :xxxx, where the x's are hex digits, for a floating point
3005 with the exact digits specified. */
3006 if (input_line_pointer[0] == ':')
3008 flen = hex_float (float_type, temp);
3009 if (flen < 0)
3011 ignore_rest_of_line ();
3012 if (flag_mri)
3013 mri_comment_end (stop, stopc);
3014 return;
3017 else
3019 char *err;
3021 err = md_atof (float_type, temp, &flen);
3022 know (flen <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
3023 know (flen > 0);
3024 if (err)
3026 as_bad (_("Bad floating literal: %s"), err);
3027 ignore_rest_of_line ();
3028 if (flag_mri)
3029 mri_comment_end (stop, stopc);
3030 return;
3034 while (--count >= 0)
3036 char *p;
3038 p = frag_more (flen);
3039 memcpy (p, temp, (unsigned int) flen);
3042 demand_empty_rest_of_line ();
3044 if (flag_mri)
3045 mri_comment_end (stop, stopc);
3048 /* Handle the .struct pseudo-op, as found in MIPS assemblers. */
3050 void
3051 s_struct (ignore)
3052 int ignore ATTRIBUTE_UNUSED;
3054 char *stop = NULL;
3055 char stopc;
3057 if (flag_mri)
3058 stop = mri_comment_field (&stopc);
3059 abs_section_offset = get_absolute_expression ();
3060 subseg_set (absolute_section, 0);
3061 demand_empty_rest_of_line ();
3062 if (flag_mri)
3063 mri_comment_end (stop, stopc);
3066 void
3067 s_text (ignore)
3068 int ignore ATTRIBUTE_UNUSED;
3070 register int temp;
3072 temp = get_absolute_expression ();
3073 subseg_set (text_section, (subsegT) temp);
3074 demand_empty_rest_of_line ();
3075 #ifdef OBJ_VMS
3076 const_flag &= ~IN_DEFAULT_SECTION;
3077 #endif
3078 } /* s_text() */
3081 void
3082 demand_empty_rest_of_line ()
3084 SKIP_WHITESPACE ();
3085 if (is_end_of_line[(unsigned char) *input_line_pointer])
3087 input_line_pointer++;
3089 else
3091 ignore_rest_of_line ();
3093 /* Return having already swallowed end-of-line. */
3094 } /* Return pointing just after end-of-line. */
3096 void
3097 ignore_rest_of_line () /* For suspect lines: gives warning. */
3099 if (!is_end_of_line[(unsigned char) *input_line_pointer])
3101 if (isprint ((unsigned char) *input_line_pointer))
3102 as_bad (_("Rest of line ignored. First ignored character is `%c'."),
3103 *input_line_pointer);
3104 else
3105 as_bad (_("Rest of line ignored. First ignored character valued 0x%x."),
3106 *input_line_pointer);
3107 while (input_line_pointer < buffer_limit
3108 && !is_end_of_line[(unsigned char) *input_line_pointer])
3110 input_line_pointer++;
3113 input_line_pointer++; /* Return pointing just after end-of-line. */
3114 know (is_end_of_line[(unsigned char) input_line_pointer[-1]]);
3117 void
3118 discard_rest_of_line ()
3120 while (input_line_pointer < buffer_limit
3121 && !is_end_of_line[(unsigned char) *input_line_pointer])
3123 input_line_pointer++;
3125 input_line_pointer++; /* Return pointing just after end-of-line. */
3126 know (is_end_of_line[(unsigned char) input_line_pointer[-1]]);
3130 * pseudo_set()
3132 * In: Pointer to a symbol.
3133 * Input_line_pointer->expression.
3135 * Out: Input_line_pointer->just after any whitespace after expression.
3136 * Tried to set symbol to value of expression.
3137 * Will change symbols type, value, and frag;
3139 void
3140 pseudo_set (symbolP)
3141 symbolS *symbolP;
3143 expressionS exp;
3144 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3145 int ext;
3146 #endif /* OBJ_AOUT or OBJ_BOUT */
3148 know (symbolP); /* NULL pointer is logic error. */
3149 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3150 ext = S_IS_EXTERNAL (symbolP);
3151 #endif /* OBJ_AOUT or OBJ_BOUT */
3153 (void) expression (&exp);
3155 if (exp.X_op == O_illegal)
3156 as_bad (_("illegal expression; zero assumed"));
3157 else if (exp.X_op == O_absent)
3158 as_bad (_("missing expression; zero assumed"));
3159 else if (exp.X_op == O_big)
3161 if (exp.X_add_number > 0)
3162 as_bad (_("bignum invalid; zero assumed"));
3163 else
3164 as_bad (_("floating point number invalid; zero assumed"));
3166 else if (exp.X_op == O_subtract
3167 && (S_GET_SEGMENT (exp.X_add_symbol)
3168 == S_GET_SEGMENT (exp.X_op_symbol))
3169 && SEG_NORMAL (S_GET_SEGMENT (exp.X_add_symbol))
3170 && (symbol_get_frag (exp.X_add_symbol)
3171 == symbol_get_frag (exp.X_op_symbol)))
3173 exp.X_op = O_constant;
3174 exp.X_add_number = (S_GET_VALUE (exp.X_add_symbol)
3175 - S_GET_VALUE (exp.X_op_symbol));
3178 switch (exp.X_op)
3180 case O_illegal:
3181 case O_absent:
3182 case O_big:
3183 exp.X_add_number = 0;
3184 /* Fall through. */
3185 case O_constant:
3186 S_SET_SEGMENT (symbolP, absolute_section);
3187 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3188 if (ext)
3189 S_SET_EXTERNAL (symbolP);
3190 else
3191 S_CLEAR_EXTERNAL (symbolP);
3192 #endif /* OBJ_AOUT or OBJ_BOUT */
3193 S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
3194 if (exp.X_op != O_constant)
3195 symbol_set_frag (symbolP, &zero_address_frag);
3196 break;
3198 case O_register:
3199 S_SET_SEGMENT (symbolP, reg_section);
3200 S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
3201 symbol_set_frag (symbolP, &zero_address_frag);
3202 break;
3204 case O_symbol:
3205 if (S_GET_SEGMENT (exp.X_add_symbol) == undefined_section
3206 || exp.X_add_number != 0)
3207 symbol_set_value_expression (symbolP, &exp);
3208 else if (symbol_section_p (symbolP))
3209 as_bad ("invalid attempt to set value of section symbol");
3210 else
3212 symbolS *s = exp.X_add_symbol;
3214 S_SET_SEGMENT (symbolP, S_GET_SEGMENT (s));
3215 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3216 if (ext)
3217 S_SET_EXTERNAL (symbolP);
3218 else
3219 S_CLEAR_EXTERNAL (symbolP);
3220 #endif /* OBJ_AOUT or OBJ_BOUT */
3221 S_SET_VALUE (symbolP,
3222 exp.X_add_number + S_GET_VALUE (s));
3223 symbol_set_frag (symbolP, symbol_get_frag (s));
3224 copy_symbol_attributes (symbolP, s);
3226 break;
3228 default:
3229 /* The value is some complex expression.
3230 FIXME: Should we set the segment to anything? */
3231 symbol_set_value_expression (symbolP, &exp);
3232 break;
3237 * cons()
3239 * CONStruct more frag of .bytes, or .words etc.
3240 * Should need_pass_2 be 1 then emit no frag(s).
3241 * This understands EXPRESSIONS.
3243 * Bug (?)
3245 * This has a split personality. We use expression() to read the
3246 * value. We can detect if the value won't fit in a byte or word.
3247 * But we can't detect if expression() discarded significant digits
3248 * in the case of a long. Not worth the crocks required to fix it.
3251 /* Select a parser for cons expressions. */
3253 /* Some targets need to parse the expression in various fancy ways.
3254 You can define TC_PARSE_CONS_EXPRESSION to do whatever you like
3255 (for example, the HPPA does this). Otherwise, you can define
3256 BITFIELD_CONS_EXPRESSIONS to permit bitfields to be specified, or
3257 REPEAT_CONS_EXPRESSIONS to permit repeat counts. If none of these
3258 are defined, which is the normal case, then only simple expressions
3259 are permitted. */
3261 #ifdef TC_M68K
3262 static void
3263 parse_mri_cons PARAMS ((expressionS *exp, unsigned int nbytes));
3264 #endif
3266 #ifndef TC_PARSE_CONS_EXPRESSION
3267 #ifdef BITFIELD_CONS_EXPRESSIONS
3268 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_bitfield_cons (EXP, NBYTES)
3269 static void
3270 parse_bitfield_cons PARAMS ((expressionS *exp, unsigned int nbytes));
3271 #endif
3272 #ifdef REPEAT_CONS_EXPRESSIONS
3273 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_repeat_cons (EXP, NBYTES)
3274 static void
3275 parse_repeat_cons PARAMS ((expressionS *exp, unsigned int nbytes));
3276 #endif
3278 /* If we haven't gotten one yet, just call expression. */
3279 #ifndef TC_PARSE_CONS_EXPRESSION
3280 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) expression (EXP)
3281 #endif
3282 #endif
3284 /* worker to do .byte etc statements */
3285 /* clobbers input_line_pointer, checks */
3286 /* end-of-line. */
3287 static void
3288 cons_worker (nbytes, rva)
3289 register int nbytes; /* 1=.byte, 2=.word, 4=.long */
3290 int rva;
3292 int c;
3293 expressionS exp;
3294 char *stop = NULL;
3295 char stopc;
3297 #ifdef md_flush_pending_output
3298 md_flush_pending_output ();
3299 #endif
3301 if (flag_mri)
3302 stop = mri_comment_field (&stopc);
3304 if (is_it_end_of_statement ())
3306 demand_empty_rest_of_line ();
3307 if (flag_mri)
3308 mri_comment_end (stop, stopc);
3309 return;
3312 #ifdef md_cons_align
3313 md_cons_align (nbytes);
3314 #endif
3316 c = 0;
3319 #ifdef TC_M68K
3320 if (flag_m68k_mri)
3321 parse_mri_cons (&exp, (unsigned int) nbytes);
3322 else
3323 #endif
3324 TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes);
3326 if (rva)
3328 if (exp.X_op == O_symbol)
3329 exp.X_op = O_symbol_rva;
3330 else
3331 as_fatal (_("rva without symbol"));
3333 emit_expr (&exp, (unsigned int) nbytes);
3334 ++c;
3336 while (*input_line_pointer++ == ',');
3338 /* In MRI mode, after an odd number of bytes, we must align to an
3339 even word boundary, unless the next instruction is a dc.b, ds.b
3340 or dcb.b. */
3341 if (flag_mri && nbytes == 1 && (c & 1) != 0)
3342 mri_pending_align = 1;
3344 input_line_pointer--; /* Put terminator back into stream. */
3346 demand_empty_rest_of_line ();
3348 if (flag_mri)
3349 mri_comment_end (stop, stopc);
3353 void
3354 cons (size)
3355 int size;
3357 cons_worker (size, 0);
3360 void
3361 s_rva (size)
3362 int size;
3364 cons_worker (size, 1);
3367 /* Put the contents of expression EXP into the object file using
3368 NBYTES bytes. If need_pass_2 is 1, this does nothing. */
3370 void
3371 emit_expr (exp, nbytes)
3372 expressionS *exp;
3373 unsigned int nbytes;
3375 operatorT op;
3376 register char *p;
3377 valueT extra_digit = 0;
3379 /* Don't do anything if we are going to make another pass. */
3380 if (need_pass_2)
3381 return;
3383 #ifndef NO_LISTING
3384 #ifdef OBJ_ELF
3385 /* When gcc emits DWARF 1 debugging pseudo-ops, a line number will
3386 appear as a four byte positive constant in the .line section,
3387 followed by a 2 byte 0xffff. Look for that case here. */
3389 static int dwarf_line = -1;
3391 if (strcmp (segment_name (now_seg), ".line") != 0)
3392 dwarf_line = -1;
3393 else if (dwarf_line >= 0
3394 && nbytes == 2
3395 && exp->X_op == O_constant
3396 && (exp->X_add_number == -1 || exp->X_add_number == 0xffff))
3397 listing_source_line ((unsigned int) dwarf_line);
3398 else if (nbytes == 4
3399 && exp->X_op == O_constant
3400 && exp->X_add_number >= 0)
3401 dwarf_line = exp->X_add_number;
3402 else
3403 dwarf_line = -1;
3406 /* When gcc emits DWARF 1 debugging pseudo-ops, a file name will
3407 appear as a 2 byte TAG_compile_unit (0x11) followed by a 2 byte
3408 AT_sibling (0x12) followed by a four byte address of the sibling
3409 followed by a 2 byte AT_name (0x38) followed by the name of the
3410 file. We look for that case here. */
3412 static int dwarf_file = 0;
3414 if (strcmp (segment_name (now_seg), ".debug") != 0)
3415 dwarf_file = 0;
3416 else if (dwarf_file == 0
3417 && nbytes == 2
3418 && exp->X_op == O_constant
3419 && exp->X_add_number == 0x11)
3420 dwarf_file = 1;
3421 else if (dwarf_file == 1
3422 && nbytes == 2
3423 && exp->X_op == O_constant
3424 && exp->X_add_number == 0x12)
3425 dwarf_file = 2;
3426 else if (dwarf_file == 2
3427 && nbytes == 4)
3428 dwarf_file = 3;
3429 else if (dwarf_file == 3
3430 && nbytes == 2
3431 && exp->X_op == O_constant
3432 && exp->X_add_number == 0x38)
3433 dwarf_file = 4;
3434 else
3435 dwarf_file = 0;
3437 /* The variable dwarf_file_string tells stringer that the string
3438 may be the name of the source file. */
3439 if (dwarf_file == 4)
3440 dwarf_file_string = 1;
3441 else
3442 dwarf_file_string = 0;
3444 #endif
3445 #endif
3447 if (check_eh_frame (exp, &nbytes))
3448 return;
3450 op = exp->X_op;
3452 /* Allow `.word 0' in the absolute section. */
3453 if (now_seg == absolute_section)
3455 if (op != O_constant || exp->X_add_number != 0)
3456 as_bad (_("attempt to store value in absolute section"));
3457 abs_section_offset += nbytes;
3458 return;
3461 /* Handle a negative bignum. */
3462 if (op == O_uminus
3463 && exp->X_add_number == 0
3464 && symbol_get_value_expression (exp->X_add_symbol)->X_op == O_big
3465 && symbol_get_value_expression (exp->X_add_symbol)->X_add_number > 0)
3467 int i;
3468 unsigned long carry;
3470 exp = symbol_get_value_expression (exp->X_add_symbol);
3472 /* Negate the bignum: one's complement each digit and add 1. */
3473 carry = 1;
3474 for (i = 0; i < exp->X_add_number; i++)
3476 unsigned long next;
3478 next = (((~ (generic_bignum[i] & LITTLENUM_MASK))
3479 & LITTLENUM_MASK)
3480 + carry);
3481 generic_bignum[i] = next & LITTLENUM_MASK;
3482 carry = next >> LITTLENUM_NUMBER_OF_BITS;
3485 /* We can ignore any carry out, because it will be handled by
3486 extra_digit if it is needed. */
3488 extra_digit = (valueT) -1;
3489 op = O_big;
3492 if (op == O_absent || op == O_illegal)
3494 as_warn (_("zero assumed for missing expression"));
3495 exp->X_add_number = 0;
3496 op = O_constant;
3498 else if (op == O_big && exp->X_add_number <= 0)
3500 as_bad (_("floating point number invalid; zero assumed"));
3501 exp->X_add_number = 0;
3502 op = O_constant;
3504 else if (op == O_register)
3506 as_warn (_("register value used as expression"));
3507 op = O_constant;
3510 p = frag_more ((int) nbytes);
3512 #ifndef WORKING_DOT_WORD
3513 /* If we have the difference of two symbols in a word, save it on
3514 the broken_words list. See the code in write.c. */
3515 if (op == O_subtract && nbytes == 2)
3517 struct broken_word *x;
3519 x = (struct broken_word *) xmalloc (sizeof (struct broken_word));
3520 x->next_broken_word = broken_words;
3521 broken_words = x;
3522 x->seg = now_seg;
3523 x->subseg = now_subseg;
3524 x->frag = frag_now;
3525 x->word_goes_here = p;
3526 x->dispfrag = 0;
3527 x->add = exp->X_add_symbol;
3528 x->sub = exp->X_op_symbol;
3529 x->addnum = exp->X_add_number;
3530 x->added = 0;
3531 new_broken_words++;
3532 return;
3534 #endif
3536 /* If we have an integer, but the number of bytes is too large to
3537 pass to md_number_to_chars, handle it as a bignum. */
3538 if (op == O_constant && nbytes > sizeof (valueT))
3540 valueT val;
3541 int gencnt;
3543 if (! exp->X_unsigned && exp->X_add_number < 0)
3544 extra_digit = (valueT) -1;
3545 val = (valueT) exp->X_add_number;
3546 gencnt = 0;
3549 generic_bignum[gencnt] = val & LITTLENUM_MASK;
3550 val >>= LITTLENUM_NUMBER_OF_BITS;
3551 ++gencnt;
3553 while (val != 0);
3554 op = exp->X_op = O_big;
3555 exp->X_add_number = gencnt;
3558 if (op == O_constant)
3560 register valueT get;
3561 register valueT use;
3562 register valueT mask;
3563 valueT hibit;
3564 register valueT unmask;
3566 /* JF << of >= number of bits in the object is undefined. In
3567 particular SPARC (Sun 4) has problems */
3568 if (nbytes >= sizeof (valueT))
3570 mask = 0;
3571 if (nbytes > sizeof (valueT))
3572 hibit = 0;
3573 else
3574 hibit = (valueT) 1 << (nbytes * BITS_PER_CHAR - 1);
3576 else
3578 /* Don't store these bits. */
3579 mask = ~(valueT) 0 << (BITS_PER_CHAR * nbytes);
3580 hibit = (valueT) 1 << (nbytes * BITS_PER_CHAR - 1);
3583 unmask = ~mask; /* Do store these bits. */
3585 #ifdef NEVER
3586 "Do this mod if you want every overflow check to assume SIGNED 2's complement data.";
3587 mask = ~(unmask >> 1); /* Includes sign bit now. */
3588 #endif
3590 get = exp->X_add_number;
3591 use = get & unmask;
3592 if ((get & mask) != 0
3593 && ((get & mask) != mask
3594 || (get & hibit) == 0))
3595 { /* Leading bits contain both 0s & 1s. */
3596 as_warn (_("Value 0x%lx truncated to 0x%lx."),
3597 (unsigned long) get, (unsigned long) use);
3599 /* put bytes in right order. */
3600 md_number_to_chars (p, use, (int) nbytes);
3602 else if (op == O_big)
3604 unsigned int size;
3605 LITTLENUM_TYPE *nums;
3607 know (nbytes % CHARS_PER_LITTLENUM == 0);
3609 size = exp->X_add_number * CHARS_PER_LITTLENUM;
3610 if (nbytes < size)
3612 as_warn (_("Bignum truncated to %d bytes"), nbytes);
3613 size = nbytes;
3616 if (target_big_endian)
3618 while (nbytes > size)
3620 md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
3621 nbytes -= CHARS_PER_LITTLENUM;
3622 p += CHARS_PER_LITTLENUM;
3625 nums = generic_bignum + size / CHARS_PER_LITTLENUM;
3626 while (size > 0)
3628 --nums;
3629 md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
3630 size -= CHARS_PER_LITTLENUM;
3631 p += CHARS_PER_LITTLENUM;
3634 else
3636 nums = generic_bignum;
3637 while (size > 0)
3639 md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
3640 ++nums;
3641 size -= CHARS_PER_LITTLENUM;
3642 p += CHARS_PER_LITTLENUM;
3643 nbytes -= CHARS_PER_LITTLENUM;
3646 while (nbytes > 0)
3648 md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
3649 nbytes -= CHARS_PER_LITTLENUM;
3650 p += CHARS_PER_LITTLENUM;
3654 else
3656 memset (p, 0, nbytes);
3658 /* Now we need to generate a fixS to record the symbol value.
3659 This is easy for BFD. For other targets it can be more
3660 complex. For very complex cases (currently, the HPPA and
3661 NS32K), you can define TC_CONS_FIX_NEW to do whatever you
3662 want. For simpler cases, you can define TC_CONS_RELOC to be
3663 the name of the reloc code that should be stored in the fixS.
3664 If neither is defined, the code uses NO_RELOC if it is
3665 defined, and otherwise uses 0. */
3667 #ifdef BFD_ASSEMBLER
3668 #ifdef TC_CONS_FIX_NEW
3669 TC_CONS_FIX_NEW (frag_now, p - frag_now->fr_literal, nbytes, exp);
3670 #else
3672 bfd_reloc_code_real_type r;
3674 switch (nbytes)
3676 case 1:
3677 r = BFD_RELOC_8;
3678 break;
3679 case 2:
3680 r = BFD_RELOC_16;
3681 break;
3682 case 4:
3683 r = BFD_RELOC_32;
3684 break;
3685 case 8:
3686 r = BFD_RELOC_64;
3687 break;
3688 default:
3689 as_bad (_("unsupported BFD relocation size %u"), nbytes);
3690 r = BFD_RELOC_32;
3691 break;
3693 fix_new_exp (frag_now, p - frag_now->fr_literal, (int) nbytes, exp,
3694 0, r);
3696 #endif
3697 #else
3698 #ifdef TC_CONS_FIX_NEW
3699 TC_CONS_FIX_NEW (frag_now, p - frag_now->fr_literal, nbytes, exp);
3700 #else
3701 /* Figure out which reloc number to use. Use TC_CONS_RELOC if
3702 it is defined, otherwise use NO_RELOC if it is defined,
3703 otherwise use 0. */
3704 #ifndef TC_CONS_RELOC
3705 #ifdef NO_RELOC
3706 #define TC_CONS_RELOC NO_RELOC
3707 #else
3708 #define TC_CONS_RELOC 0
3709 #endif
3710 #endif
3711 fix_new_exp (frag_now, p - frag_now->fr_literal, (int) nbytes, exp, 0,
3712 TC_CONS_RELOC);
3713 #endif /* TC_CONS_FIX_NEW */
3714 #endif /* BFD_ASSEMBLER */
3718 #ifdef BITFIELD_CONS_EXPRESSIONS
3720 /* i960 assemblers, (eg, asm960), allow bitfields after ".byte" as
3721 w:x,y:z, where w and y are bitwidths and x and y are values. They
3722 then pack them all together. We do a little better in that we allow
3723 them in words, longs, etc. and we'll pack them in target byte order
3724 for you.
3726 The rules are: pack least significat bit first, if a field doesn't
3727 entirely fit, put it in the next unit. Overflowing the bitfield is
3728 explicitly *not* even a warning. The bitwidth should be considered
3729 a "mask".
3731 To use this function the tc-XXX.h file should define
3732 BITFIELD_CONS_EXPRESSIONS. */
3734 static void
3735 parse_bitfield_cons (exp, nbytes)
3736 expressionS *exp;
3737 unsigned int nbytes;
3739 unsigned int bits_available = BITS_PER_CHAR * nbytes;
3740 char *hold = input_line_pointer;
3742 (void) expression (exp);
3744 if (*input_line_pointer == ':')
3745 { /* bitfields */
3746 long value = 0;
3748 for (;;)
3750 unsigned long width;
3752 if (*input_line_pointer != ':')
3754 input_line_pointer = hold;
3755 break;
3756 } /* next piece is not a bitfield */
3758 /* In the general case, we can't allow
3759 full expressions with symbol
3760 differences and such. The relocation
3761 entries for symbols not defined in this
3762 assembly would require arbitrary field
3763 widths, positions, and masks which most
3764 of our current object formats don't
3765 support.
3767 In the specific case where a symbol
3768 *is* defined in this assembly, we
3769 *could* build fixups and track it, but
3770 this could lead to confusion for the
3771 backends. I'm lazy. I'll take any
3772 SEG_ABSOLUTE. I think that means that
3773 you can use a previous .set or
3774 .equ type symbol. xoxorich. */
3776 if (exp->X_op == O_absent)
3778 as_warn (_("using a bit field width of zero"));
3779 exp->X_add_number = 0;
3780 exp->X_op = O_constant;
3781 } /* implied zero width bitfield */
3783 if (exp->X_op != O_constant)
3785 *input_line_pointer = '\0';
3786 as_bad (_("field width \"%s\" too complex for a bitfield"), hold);
3787 *input_line_pointer = ':';
3788 demand_empty_rest_of_line ();
3789 return;
3790 } /* too complex */
3792 if ((width = exp->X_add_number) > (BITS_PER_CHAR * nbytes))
3794 as_warn (_("field width %lu too big to fit in %d bytes: truncated to %d bits"),
3795 width, nbytes, (BITS_PER_CHAR * nbytes));
3796 width = BITS_PER_CHAR * nbytes;
3797 } /* too big */
3799 if (width > bits_available)
3801 /* FIXME-SOMEDAY: backing up and reparsing is wasteful. */
3802 input_line_pointer = hold;
3803 exp->X_add_number = value;
3804 break;
3805 } /* won't fit */
3807 hold = ++input_line_pointer; /* skip ':' */
3809 (void) expression (exp);
3810 if (exp->X_op != O_constant)
3812 char cache = *input_line_pointer;
3814 *input_line_pointer = '\0';
3815 as_bad (_("field value \"%s\" too complex for a bitfield"), hold);
3816 *input_line_pointer = cache;
3817 demand_empty_rest_of_line ();
3818 return;
3819 } /* too complex */
3821 value |= ((~(-1 << width) & exp->X_add_number)
3822 << ((BITS_PER_CHAR * nbytes) - bits_available));
3824 if ((bits_available -= width) == 0
3825 || is_it_end_of_statement ()
3826 || *input_line_pointer != ',')
3828 break;
3829 } /* all the bitfields we're gonna get */
3831 hold = ++input_line_pointer;
3832 (void) expression (exp);
3833 } /* forever loop */
3835 exp->X_add_number = value;
3836 exp->X_op = O_constant;
3837 exp->X_unsigned = 1;
3838 } /* if looks like a bitfield */
3839 } /* parse_bitfield_cons() */
3841 #endif /* BITFIELD_CONS_EXPRESSIONS */
3843 /* Handle an MRI style string expression. */
3845 #ifdef TC_M68K
3846 static void
3847 parse_mri_cons (exp, nbytes)
3848 expressionS *exp;
3849 unsigned int nbytes;
3851 if (*input_line_pointer != '\''
3852 && (input_line_pointer[1] != '\''
3853 || (*input_line_pointer != 'A'
3854 && *input_line_pointer != 'E')))
3855 TC_PARSE_CONS_EXPRESSION (exp, nbytes);
3856 else
3858 unsigned int scan;
3859 unsigned int result = 0;
3861 /* An MRI style string. Cut into as many bytes as will fit into
3862 a nbyte chunk, left justify if necessary, and separate with
3863 commas so we can try again later. */
3864 if (*input_line_pointer == 'A')
3865 ++input_line_pointer;
3866 else if (*input_line_pointer == 'E')
3868 as_bad (_("EBCDIC constants are not supported"));
3869 ++input_line_pointer;
3872 input_line_pointer++;
3873 for (scan = 0; scan < nbytes; scan++)
3875 if (*input_line_pointer == '\'')
3877 if (input_line_pointer[1] == '\'')
3879 input_line_pointer++;
3881 else
3882 break;
3884 result = (result << 8) | (*input_line_pointer++);
3887 /* Left justify */
3888 while (scan < nbytes)
3890 result <<= 8;
3891 scan++;
3893 /* Create correct expression */
3894 exp->X_op = O_constant;
3895 exp->X_add_number = result;
3896 /* Fake it so that we can read the next char too */
3897 if (input_line_pointer[0] != '\'' ||
3898 (input_line_pointer[0] == '\'' && input_line_pointer[1] == '\''))
3900 input_line_pointer -= 2;
3901 input_line_pointer[0] = ',';
3902 input_line_pointer[1] = '\'';
3904 else
3905 input_line_pointer++;
3908 #endif /* TC_M68K */
3910 #ifdef REPEAT_CONS_EXPRESSIONS
3912 /* Parse a repeat expression for cons. This is used by the MIPS
3913 assembler. The format is NUMBER:COUNT; NUMBER appears in the
3914 object file COUNT times.
3916 To use this for a target, define REPEAT_CONS_EXPRESSIONS. */
3918 static void
3919 parse_repeat_cons (exp, nbytes)
3920 expressionS *exp;
3921 unsigned int nbytes;
3923 expressionS count;
3924 register int i;
3926 expression (exp);
3928 if (*input_line_pointer != ':')
3930 /* No repeat count. */
3931 return;
3934 ++input_line_pointer;
3935 expression (&count);
3936 if (count.X_op != O_constant
3937 || count.X_add_number <= 0)
3939 as_warn (_("Unresolvable or nonpositive repeat count; using 1"));
3940 return;
3943 /* The cons function is going to output this expression once. So we
3944 output it count - 1 times. */
3945 for (i = count.X_add_number - 1; i > 0; i--)
3946 emit_expr (exp, nbytes);
3949 #endif /* REPEAT_CONS_EXPRESSIONS */
3951 /* Parse a floating point number represented as a hex constant. This
3952 permits users to specify the exact bits they want in the floating
3953 point number. */
3955 static int
3956 hex_float (float_type, bytes)
3957 int float_type;
3958 char *bytes;
3960 int length;
3961 int i;
3963 switch (float_type)
3965 case 'f':
3966 case 'F':
3967 case 's':
3968 case 'S':
3969 length = 4;
3970 break;
3972 case 'd':
3973 case 'D':
3974 case 'r':
3975 case 'R':
3976 length = 8;
3977 break;
3979 case 'x':
3980 case 'X':
3981 length = 12;
3982 break;
3984 case 'p':
3985 case 'P':
3986 length = 12;
3987 break;
3989 default:
3990 as_bad (_("Unknown floating type type '%c'"), float_type);
3991 return -1;
3994 /* It would be nice if we could go through expression to parse the
3995 hex constant, but if we get a bignum it's a pain to sort it into
3996 the buffer correctly. */
3997 i = 0;
3998 while (hex_p (*input_line_pointer) || *input_line_pointer == '_')
4000 int d;
4002 /* The MRI assembler accepts arbitrary underscores strewn about
4003 through the hex constant, so we ignore them as well. */
4004 if (*input_line_pointer == '_')
4006 ++input_line_pointer;
4007 continue;
4010 if (i >= length)
4012 as_warn (_("Floating point constant too large"));
4013 return -1;
4015 d = hex_value (*input_line_pointer) << 4;
4016 ++input_line_pointer;
4017 while (*input_line_pointer == '_')
4018 ++input_line_pointer;
4019 if (hex_p (*input_line_pointer))
4021 d += hex_value (*input_line_pointer);
4022 ++input_line_pointer;
4024 if (target_big_endian)
4025 bytes[i] = d;
4026 else
4027 bytes[length - i - 1] = d;
4028 ++i;
4031 if (i < length)
4033 if (target_big_endian)
4034 memset (bytes + i, 0, length - i);
4035 else
4036 memset (bytes, 0, length - i);
4039 return length;
4043 * float_cons()
4045 * CONStruct some more frag chars of .floats .ffloats etc.
4046 * Makes 0 or more new frags.
4047 * If need_pass_2 == 1, no frags are emitted.
4048 * This understands only floating literals, not expressions. Sorry.
4050 * A floating constant is defined by atof_generic(), except it is preceded
4051 * by 0d 0f 0g or 0h. After observing the STRANGE way my BSD AS does its
4052 * reading, I decided to be incompatible. This always tries to give you
4053 * rounded bits to the precision of the pseudo-op. Former AS did premature
4054 * truncatation, restored noisy bits instead of trailing 0s AND gave you
4055 * a choice of 2 flavours of noise according to which of 2 floating-point
4056 * scanners you directed AS to use.
4058 * In: input_line_pointer->whitespace before, or '0' of flonum.
4062 void
4063 float_cons (float_type)
4064 /* Clobbers input_line-pointer, checks end-of-line. */
4065 register int float_type; /* 'f':.ffloat ... 'F':.float ... */
4067 register char *p;
4068 int length; /* Number of chars in an object. */
4069 register char *err; /* Error from scanning floating literal. */
4070 char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
4072 if (is_it_end_of_statement ())
4074 demand_empty_rest_of_line ();
4075 return;
4078 #ifdef md_flush_pending_output
4079 md_flush_pending_output ();
4080 #endif
4084 /* input_line_pointer->1st char of a flonum (we hope!). */
4085 SKIP_WHITESPACE ();
4087 /* Skip any 0{letter} that may be present. Don't even check if the
4088 * letter is legal. Someone may invent a "z" format and this routine
4089 * has no use for such information. Lusers beware: you get
4090 * diagnostics if your input is ill-conditioned.
4092 if (input_line_pointer[0] == '0'
4093 && isalpha ((unsigned char) input_line_pointer[1]))
4094 input_line_pointer += 2;
4096 /* Accept :xxxx, where the x's are hex digits, for a floating
4097 point with the exact digits specified. */
4098 if (input_line_pointer[0] == ':')
4100 ++input_line_pointer;
4101 length = hex_float (float_type, temp);
4102 if (length < 0)
4104 ignore_rest_of_line ();
4105 return;
4108 else
4110 err = md_atof (float_type, temp, &length);
4111 know (length <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
4112 know (length > 0);
4113 if (err)
4115 as_bad (_("Bad floating literal: %s"), err);
4116 ignore_rest_of_line ();
4117 return;
4121 if (!need_pass_2)
4123 int count;
4125 count = 1;
4127 #ifdef REPEAT_CONS_EXPRESSIONS
4128 if (*input_line_pointer == ':')
4130 expressionS count_exp;
4132 ++input_line_pointer;
4133 expression (&count_exp);
4134 if (count_exp.X_op != O_constant
4135 || count_exp.X_add_number <= 0)
4137 as_warn (_("unresolvable or nonpositive repeat count; using 1"));
4139 else
4140 count = count_exp.X_add_number;
4142 #endif
4144 while (--count >= 0)
4146 p = frag_more (length);
4147 memcpy (p, temp, (unsigned int) length);
4150 SKIP_WHITESPACE ();
4152 while (*input_line_pointer++ == ',');
4154 --input_line_pointer; /* Put terminator back into stream. */
4155 demand_empty_rest_of_line ();
4156 } /* float_cons() */
4158 /* Return the size of a LEB128 value */
4160 static inline int
4161 sizeof_sleb128 (value)
4162 offsetT value;
4164 register int size = 0;
4165 register unsigned byte;
4169 byte = (value & 0x7f);
4170 /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
4171 Fortunately, we can structure things so that the extra work reduces
4172 to a noop on systems that do things "properly". */
4173 value = (value >> 7) | ~(-(offsetT)1 >> 7);
4174 size += 1;
4176 while (!(((value == 0) && ((byte & 0x40) == 0))
4177 || ((value == -1) && ((byte & 0x40) != 0))));
4179 return size;
4182 static inline int
4183 sizeof_uleb128 (value)
4184 valueT value;
4186 register int size = 0;
4187 register unsigned byte;
4191 byte = (value & 0x7f);
4192 value >>= 7;
4193 size += 1;
4195 while (value != 0);
4197 return size;
4201 sizeof_leb128 (value, sign)
4202 valueT value;
4203 int sign;
4205 if (sign)
4206 return sizeof_sleb128 ((offsetT) value);
4207 else
4208 return sizeof_uleb128 (value);
4211 /* Output a LEB128 value. */
4213 static inline int
4214 output_sleb128 (p, value)
4215 char *p;
4216 offsetT value;
4218 register char *orig = p;
4219 register int more;
4223 unsigned byte = (value & 0x7f);
4225 /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
4226 Fortunately, we can structure things so that the extra work reduces
4227 to a noop on systems that do things "properly". */
4228 value = (value >> 7) | ~(-(offsetT)1 >> 7);
4230 more = !((((value == 0) && ((byte & 0x40) == 0))
4231 || ((value == -1) && ((byte & 0x40) != 0))));
4232 if (more)
4233 byte |= 0x80;
4235 *p++ = byte;
4237 while (more);
4239 return p - orig;
4242 static inline int
4243 output_uleb128 (p, value)
4244 char *p;
4245 valueT value;
4247 char *orig = p;
4251 unsigned byte = (value & 0x7f);
4252 value >>= 7;
4253 if (value != 0)
4254 /* More bytes to follow. */
4255 byte |= 0x80;
4257 *p++ = byte;
4259 while (value != 0);
4261 return p - orig;
4265 output_leb128 (p, value, sign)
4266 char *p;
4267 valueT value;
4268 int sign;
4270 if (sign)
4271 return output_sleb128 (p, (offsetT) value);
4272 else
4273 return output_uleb128 (p, value);
4276 /* Do the same for bignums. We combine sizeof with output here in that
4277 we don't output for NULL values of P. It isn't really as critical as
4278 for "normal" values that this be streamlined. */
4280 static inline int
4281 output_big_sleb128 (p, bignum, size)
4282 char *p;
4283 LITTLENUM_TYPE *bignum;
4284 int size;
4286 char *orig = p;
4287 valueT val = 0;
4288 int loaded = 0;
4289 unsigned byte;
4291 /* Strip leading sign extensions off the bignum. */
4292 while (size > 0 && bignum[size-1] == (LITTLENUM_TYPE)-1)
4293 size--;
4297 if (loaded < 7 && size > 0)
4299 val |= (*bignum << loaded);
4300 loaded += 8 * CHARS_PER_LITTLENUM;
4301 size--;
4302 bignum++;
4305 byte = val & 0x7f;
4306 loaded -= 7;
4307 val >>= 7;
4309 if (size == 0)
4311 if ((val == 0 && (byte & 0x40) == 0)
4312 || (~(val | ~(((valueT)1 << loaded) - 1)) == 0
4313 && (byte & 0x40) != 0))
4314 byte |= 0x80;
4317 if (orig)
4318 *p = byte;
4319 p++;
4321 while (byte & 0x80);
4323 return p - orig;
4326 static inline int
4327 output_big_uleb128 (p, bignum, size)
4328 char *p;
4329 LITTLENUM_TYPE *bignum;
4330 int size;
4332 char *orig = p;
4333 valueT val = 0;
4334 int loaded = 0;
4335 unsigned byte;
4337 /* Strip leading zeros off the bignum. */
4338 /* XXX: Is this needed? */
4339 while (size > 0 && bignum[size-1] == 0)
4340 size--;
4344 if (loaded < 7 && size > 0)
4346 val |= (*bignum << loaded);
4347 loaded += 8 * CHARS_PER_LITTLENUM;
4348 size--;
4349 bignum++;
4352 byte = val & 0x7f;
4353 loaded -= 7;
4354 val >>= 7;
4356 if (size > 0 || val)
4357 byte |= 0x80;
4359 if (orig)
4360 *p = byte;
4361 p++;
4363 while (byte & 0x80);
4365 return p - orig;
4368 static int
4369 output_big_leb128 (p, bignum, size, sign)
4370 char *p;
4371 LITTLENUM_TYPE *bignum;
4372 int size, sign;
4374 if (sign)
4375 return output_big_sleb128 (p, bignum, size);
4376 else
4377 return output_big_uleb128 (p, bignum, size);
4380 /* Generate the appropriate fragments for a given expression to emit a
4381 leb128 value. */
4383 void
4384 emit_leb128_expr(exp, sign)
4385 expressionS *exp;
4386 int sign;
4388 operatorT op = exp->X_op;
4390 if (op == O_absent || op == O_illegal)
4392 as_warn (_("zero assumed for missing expression"));
4393 exp->X_add_number = 0;
4394 op = O_constant;
4396 else if (op == O_big && exp->X_add_number <= 0)
4398 as_bad (_("floating point number invalid; zero assumed"));
4399 exp->X_add_number = 0;
4400 op = O_constant;
4402 else if (op == O_register)
4404 as_warn (_("register value used as expression"));
4405 op = O_constant;
4408 if (op == O_constant)
4410 /* If we've got a constant, emit the thing directly right now. */
4412 valueT value = exp->X_add_number;
4413 int size;
4414 char *p;
4416 size = sizeof_leb128 (value, sign);
4417 p = frag_more (size);
4418 output_leb128 (p, value, sign);
4420 else if (op == O_big)
4422 /* O_big is a different sort of constant. */
4424 int size;
4425 char *p;
4427 size = output_big_leb128 (NULL, generic_bignum, exp->X_add_number, sign);
4428 p = frag_more (size);
4429 output_big_leb128 (p, generic_bignum, exp->X_add_number, sign);
4431 else
4433 /* Otherwise, we have to create a variable sized fragment and
4434 resolve things later. */
4436 frag_var (rs_leb128, sizeof_uleb128 (~(valueT)0), 0, sign,
4437 make_expr_symbol (exp), 0, (char *) NULL);
4441 /* Parse the .sleb128 and .uleb128 pseudos. */
4443 void
4444 s_leb128 (sign)
4445 int sign;
4447 expressionS exp;
4449 do {
4450 expression (&exp);
4451 emit_leb128_expr (&exp, sign);
4452 } while (*input_line_pointer++ == ',');
4454 input_line_pointer--;
4455 demand_empty_rest_of_line ();
4459 * stringer()
4461 * We read 0 or more ',' separated, double-quoted strings.
4463 * Caller should have checked need_pass_2 is FALSE because we don't check it.
4467 void
4468 stringer (append_zero) /* Worker to do .ascii etc statements. */
4469 /* Checks end-of-line. */
4470 register int append_zero; /* 0: don't append '\0', else 1 */
4472 register unsigned int c;
4473 char *start;
4475 #ifdef md_flush_pending_output
4476 md_flush_pending_output ();
4477 #endif
4480 * The following awkward logic is to parse ZERO or more strings,
4481 * comma separated. Recall a string expression includes spaces
4482 * before the opening '\"' and spaces after the closing '\"'.
4483 * We fake a leading ',' if there is (supposed to be)
4484 * a 1st, expression. We keep demanding expressions for each
4485 * ','.
4487 if (is_it_end_of_statement ())
4489 c = 0; /* Skip loop. */
4490 ++input_line_pointer; /* Compensate for end of loop. */
4492 else
4494 c = ','; /* Do loop. */
4496 while (c == ',' || c == '<' || c == '"')
4498 SKIP_WHITESPACE ();
4499 switch (*input_line_pointer)
4501 case '\"':
4502 ++input_line_pointer; /*->1st char of string. */
4503 start = input_line_pointer;
4504 while (is_a_char (c = next_char_of_string ()))
4506 FRAG_APPEND_1_CHAR (c);
4508 if (append_zero)
4510 FRAG_APPEND_1_CHAR (0);
4512 know (input_line_pointer[-1] == '\"');
4514 #ifndef NO_LISTING
4515 #ifdef OBJ_ELF
4516 /* In ELF, when gcc is emitting DWARF 1 debugging output, it
4517 will emit .string with a filename in the .debug section
4518 after a sequence of constants. See the comment in
4519 emit_expr for the sequence. emit_expr will set
4520 dwarf_file_string to non-zero if this string might be a
4521 source file name. */
4522 if (strcmp (segment_name (now_seg), ".debug") != 0)
4523 dwarf_file_string = 0;
4524 else if (dwarf_file_string)
4526 c = input_line_pointer[-1];
4527 input_line_pointer[-1] = '\0';
4528 listing_source_file (start);
4529 input_line_pointer[-1] = c;
4531 #endif
4532 #endif
4534 break;
4535 case '<':
4536 input_line_pointer++;
4537 c = get_single_number ();
4538 FRAG_APPEND_1_CHAR (c);
4539 if (*input_line_pointer != '>')
4541 as_bad (_("Expected <nn>"));
4543 input_line_pointer++;
4544 break;
4545 case ',':
4546 input_line_pointer++;
4547 break;
4549 SKIP_WHITESPACE ();
4550 c = *input_line_pointer;
4553 demand_empty_rest_of_line ();
4554 } /* stringer() */
4556 /* FIXME-SOMEDAY: I had trouble here on characters with the
4557 high bits set. We'll probably also have trouble with
4558 multibyte chars, wide chars, etc. Also be careful about
4559 returning values bigger than 1 byte. xoxorich. */
4561 unsigned int
4562 next_char_of_string ()
4564 register unsigned int c;
4566 c = *input_line_pointer++ & CHAR_MASK;
4567 switch (c)
4569 case '\"':
4570 c = NOT_A_CHAR;
4571 break;
4573 case '\n':
4574 as_warn (_("Unterminated string: Newline inserted."));
4575 bump_line_counters ();
4576 break;
4578 #ifndef NO_STRING_ESCAPES
4579 case '\\':
4580 switch (c = *input_line_pointer++)
4582 case 'b':
4583 c = '\b';
4584 break;
4586 case 'f':
4587 c = '\f';
4588 break;
4590 case 'n':
4591 c = '\n';
4592 break;
4594 case 'r':
4595 c = '\r';
4596 break;
4598 case 't':
4599 c = '\t';
4600 break;
4602 case 'v':
4603 c = '\013';
4604 break;
4606 case '\\':
4607 case '"':
4608 break; /* As itself. */
4610 case '0':
4611 case '1':
4612 case '2':
4613 case '3':
4614 case '4':
4615 case '5':
4616 case '6':
4617 case '7':
4618 case '8':
4619 case '9':
4621 long number;
4622 int i;
4624 for (i = 0, number = 0; isdigit (c) && i < 3; c = *input_line_pointer++, i++)
4626 number = number * 8 + c - '0';
4628 c = number & 0xff;
4630 --input_line_pointer;
4631 break;
4633 case 'x':
4634 case 'X':
4636 long number;
4638 number = 0;
4639 c = *input_line_pointer++;
4640 while (isxdigit (c))
4642 if (isdigit (c))
4643 number = number * 16 + c - '0';
4644 else if (isupper (c))
4645 number = number * 16 + c - 'A' + 10;
4646 else
4647 number = number * 16 + c - 'a' + 10;
4648 c = *input_line_pointer++;
4650 c = number & 0xff;
4651 --input_line_pointer;
4653 break;
4655 case '\n':
4656 /* To be compatible with BSD 4.2 as: give the luser a linefeed!! */
4657 as_warn (_("Unterminated string: Newline inserted."));
4658 c = '\n';
4659 bump_line_counters ();
4660 break;
4662 default:
4664 #ifdef ONLY_STANDARD_ESCAPES
4665 as_bad (_("Bad escaped character in string, '?' assumed"));
4666 c = '?';
4667 #endif /* ONLY_STANDARD_ESCAPES */
4669 break;
4670 } /* switch on escaped char */
4671 break;
4672 #endif /* ! defined (NO_STRING_ESCAPES) */
4674 default:
4675 break;
4676 } /* switch on char */
4677 return (c);
4678 } /* next_char_of_string() */
4680 static segT
4681 get_segmented_expression (expP)
4682 register expressionS *expP;
4684 register segT retval;
4686 retval = expression (expP);
4687 if (expP->X_op == O_illegal
4688 || expP->X_op == O_absent
4689 || expP->X_op == O_big)
4691 as_bad (_("expected address expression; zero assumed"));
4692 expP->X_op = O_constant;
4693 expP->X_add_number = 0;
4694 retval = absolute_section;
4696 return retval;
4699 static segT
4700 get_known_segmented_expression (expP)
4701 register expressionS *expP;
4703 register segT retval;
4705 if ((retval = get_segmented_expression (expP)) == undefined_section)
4707 /* There is no easy way to extract the undefined symbol from the
4708 expression. */
4709 if (expP->X_add_symbol != NULL
4710 && S_GET_SEGMENT (expP->X_add_symbol) != expr_section)
4711 as_warn (_("symbol \"%s\" undefined; zero assumed"),
4712 S_GET_NAME (expP->X_add_symbol));
4713 else
4714 as_warn (_("some symbol undefined; zero assumed"));
4715 retval = absolute_section;
4716 expP->X_op = O_constant;
4717 expP->X_add_number = 0;
4719 know (retval == absolute_section || SEG_NORMAL (retval));
4720 return (retval);
4721 } /* get_known_segmented_expression() */
4723 offsetT
4724 get_absolute_expression ()
4726 expressionS exp;
4728 expression (&exp);
4729 if (exp.X_op != O_constant)
4731 if (exp.X_op != O_absent)
4732 as_bad (_("bad or irreducible absolute expression; zero assumed"));
4733 exp.X_add_number = 0;
4735 return exp.X_add_number;
4738 char /* return terminator */
4739 get_absolute_expression_and_terminator (val_pointer)
4740 long *val_pointer; /* return value of expression */
4742 /* FIXME: val_pointer should probably be offsetT *. */
4743 *val_pointer = (long) get_absolute_expression ();
4744 return (*input_line_pointer++);
4748 * demand_copy_C_string()
4750 * Like demand_copy_string, but return NULL if the string contains any '\0's.
4751 * Give a warning if that happens.
4753 char *
4754 demand_copy_C_string (len_pointer)
4755 int *len_pointer;
4757 register char *s;
4759 if ((s = demand_copy_string (len_pointer)) != 0)
4761 register int len;
4763 for (len = *len_pointer; len > 0; len--)
4765 if (*s == 0)
4767 s = 0;
4768 len = 1;
4769 *len_pointer = 0;
4770 as_bad (_("This string may not contain \'\\0\'"));
4774 return s;
4778 * demand_copy_string()
4780 * Demand string, but return a safe (=private) copy of the string.
4781 * Return NULL if we can't read a string here.
4783 char *
4784 demand_copy_string (lenP)
4785 int *lenP;
4787 register unsigned int c;
4788 register int len;
4789 char *retval;
4791 len = 0;
4792 SKIP_WHITESPACE ();
4793 if (*input_line_pointer == '\"')
4795 input_line_pointer++; /* Skip opening quote. */
4797 while (is_a_char (c = next_char_of_string ()))
4799 obstack_1grow (&notes, c);
4800 len++;
4802 /* JF this next line is so demand_copy_C_string will return a
4803 null terminated string. */
4804 obstack_1grow (&notes, '\0');
4805 retval = obstack_finish (&notes);
4807 else
4809 as_warn (_("Missing string"));
4810 retval = NULL;
4811 ignore_rest_of_line ();
4813 *lenP = len;
4814 return (retval);
4815 } /* demand_copy_string() */
4818 * is_it_end_of_statement()
4820 * In: Input_line_pointer->next character.
4822 * Do: Skip input_line_pointer over all whitespace.
4824 * Out: 1 if input_line_pointer->end-of-line.
4826 int
4827 is_it_end_of_statement ()
4829 SKIP_WHITESPACE ();
4830 return (is_end_of_line[(unsigned char) *input_line_pointer]);
4831 } /* is_it_end_of_statement() */
4833 void
4834 equals (sym_name, reassign)
4835 char *sym_name;
4836 int reassign;
4838 register symbolS *symbolP; /* symbol we are working with */
4839 char *stop = NULL;
4840 char stopc;
4842 input_line_pointer++;
4843 if (*input_line_pointer == '=')
4844 input_line_pointer++;
4846 while (*input_line_pointer == ' ' || *input_line_pointer == '\t')
4847 input_line_pointer++;
4849 if (flag_mri)
4850 stop = mri_comment_field (&stopc);
4852 if (sym_name[0] == '.' && sym_name[1] == '\0')
4854 /* Turn '. = mumble' into a .org mumble */
4855 register segT segment;
4856 expressionS exp;
4858 segment = get_known_segmented_expression (&exp);
4859 if (!need_pass_2)
4860 do_org (segment, &exp, 0);
4862 else
4864 symbolP = symbol_find_or_make (sym_name);
4865 /* Permit register names to be redefined. */
4866 if (! reassign
4867 && S_IS_DEFINED (symbolP)
4868 && S_GET_SEGMENT (symbolP) != reg_section)
4869 as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
4870 pseudo_set (symbolP);
4873 if (flag_mri)
4875 ignore_rest_of_line (); /* check garbage after the expression */
4876 mri_comment_end (stop, stopc);
4878 } /* equals() */
4880 /* .include -- include a file at this point. */
4882 /* ARGSUSED */
4883 void
4884 s_include (arg)
4885 int arg ATTRIBUTE_UNUSED;
4887 char *filename;
4888 int i;
4889 FILE *try;
4890 char *path;
4892 if (! flag_m68k_mri)
4894 filename = demand_copy_string (&i);
4895 if (filename == NULL)
4897 /* demand_copy_string has already printed an error and
4898 called ignore_rest_of_line. */
4899 return;
4902 else
4904 SKIP_WHITESPACE ();
4905 i = 0;
4906 while (! is_end_of_line[(unsigned char) *input_line_pointer]
4907 && *input_line_pointer != ' '
4908 && *input_line_pointer != '\t')
4910 obstack_1grow (&notes, *input_line_pointer);
4911 ++input_line_pointer;
4912 ++i;
4914 obstack_1grow (&notes, '\0');
4915 filename = obstack_finish (&notes);
4916 while (! is_end_of_line[(unsigned char) *input_line_pointer])
4917 ++input_line_pointer;
4919 demand_empty_rest_of_line ();
4920 path = xmalloc ((unsigned long) i + include_dir_maxlen + 5 /* slop */ );
4921 for (i = 0; i < include_dir_count; i++)
4923 strcpy (path, include_dirs[i]);
4924 strcat (path, "/");
4925 strcat (path, filename);
4926 if (0 != (try = fopen (path, "r")))
4928 fclose (try);
4929 goto gotit;
4932 free (path);
4933 path = filename;
4934 gotit:
4935 /* malloc Storage leak when file is found on path. FIXME-SOMEDAY. */
4936 register_dependency (path);
4937 input_scrub_insert_file (path);
4938 } /* s_include() */
4940 void
4941 add_include_dir (path)
4942 char *path;
4944 int i;
4946 if (include_dir_count == 0)
4948 include_dirs = (char **) xmalloc (2 * sizeof (*include_dirs));
4949 include_dirs[0] = "."; /* Current dir */
4950 include_dir_count = 2;
4952 else
4954 include_dir_count++;
4955 include_dirs = (char **) realloc (include_dirs,
4956 include_dir_count * sizeof (*include_dirs));
4959 include_dirs[include_dir_count - 1] = path; /* New one */
4961 i = strlen (path);
4962 if (i > include_dir_maxlen)
4963 include_dir_maxlen = i;
4964 } /* add_include_dir() */
4966 /* Output debugging information to denote the source file. */
4968 static void
4969 generate_file_debug ()
4971 if (debug_type == DEBUG_STABS)
4972 stabs_generate_asm_file ();
4975 /* Output line number debugging information for the current source line. */
4977 void
4978 generate_lineno_debug ()
4980 #ifdef ECOFF_DEBUGGING
4981 /* ECOFF assemblers automatically generate debugging information.
4982 FIXME: This should probably be handled elsewhere. */
4983 if (debug_type == DEBUG_UNSPECIFIED)
4985 if (ECOFF_DEBUGGING && ecoff_no_current_file ())
4986 debug_type = DEBUG_ECOFF;
4987 else
4988 debug_type = DEBUG_NONE;
4990 #endif
4992 switch (debug_type)
4994 case DEBUG_UNSPECIFIED:
4995 case DEBUG_NONE:
4996 break;
4997 case DEBUG_STABS:
4998 stabs_generate_asm_lineno ();
4999 break;
5000 case DEBUG_ECOFF:
5001 ecoff_generate_asm_lineno ();
5002 break;
5003 case DEBUG_DWARF:
5004 case DEBUG_DWARF2:
5005 /* FIXME. */
5006 break;
5010 /* Output debugging information to mark a function entry point or end point.
5011 END_P is zero for .func, and non-zero for .endfunc. */
5013 void
5014 s_func (end_p)
5015 int end_p;
5017 do_s_func (end_p, NULL);
5020 /* Subroutine of s_func so targets can choose a different default prefix.
5021 If DEFAULT_PREFIX is NULL, use the target's "leading char". */
5023 void
5024 do_s_func (end_p, default_prefix)
5025 int end_p;
5026 const char *default_prefix;
5028 /* Record the current function so that we can issue an error message for
5029 misplaced .func,.endfunc, and also so that .endfunc needs no
5030 arguments. */
5031 static char *current_name;
5032 static char *current_label;
5034 if (end_p)
5036 if (current_name == NULL)
5038 as_bad (_("missing .func"));
5039 ignore_rest_of_line ();
5040 return;
5043 if (debug_type == DEBUG_STABS)
5044 stabs_generate_asm_endfunc (current_name, current_label);
5046 current_name = current_label = NULL;
5048 else /* ! end_p */
5050 char *name,*label;
5051 char delim1,delim2;
5053 if (current_name != NULL)
5055 as_bad (_(".endfunc missing for previous .func"));
5056 ignore_rest_of_line ();
5057 return;
5060 name = input_line_pointer;
5061 delim1 = get_symbol_end ();
5062 name = xstrdup (name);
5063 *input_line_pointer = delim1;
5064 SKIP_WHITESPACE ();
5065 if (*input_line_pointer != ',')
5067 if (default_prefix)
5068 asprintf (&label, "%s%s", default_prefix, name);
5069 else
5071 char leading_char = 0;
5072 #ifdef BFD_ASSEMBLER
5073 leading_char = bfd_get_symbol_leading_char (stdoutput);
5074 #endif
5075 /* Missing entry point, use function's name with the leading
5076 char prepended. */
5077 if (leading_char)
5078 asprintf (&label, "%c%s", leading_char, name);
5079 else
5080 label = name;
5083 else
5085 ++input_line_pointer;
5086 SKIP_WHITESPACE ();
5087 label = input_line_pointer;
5088 delim2 = get_symbol_end ();
5089 label = xstrdup (label);
5090 *input_line_pointer = delim2;
5093 if (debug_type == DEBUG_STABS)
5094 stabs_generate_asm_func (name, label);
5096 current_name = name;
5097 current_label = label;
5100 demand_empty_rest_of_line ();
5103 void
5104 s_ignore (arg)
5105 int arg ATTRIBUTE_UNUSED;
5107 while (!is_end_of_line[(unsigned char) *input_line_pointer])
5109 ++input_line_pointer;
5111 ++input_line_pointer;
5115 void
5116 read_print_statistics (file)
5117 FILE *file;
5119 hash_print_statistics (file, "pseudo-op table", po_hash);
5122 /* Inserts the given line into the input stream.
5124 This call avoids macro/conditionals nesting checking, since the contents of
5125 the line are assumed to replace the contents of a line already scanned.
5127 An appropriate use of this function would be substition of input lines when
5128 called by md_start_line_hook(). The given line is assumed to already be
5129 properly scrubbed. */
5131 void
5132 input_scrub_insert_line (line)
5133 const char *line;
5135 sb newline;
5136 sb_new (&newline);
5137 sb_add_string (&newline, line);
5138 input_scrub_include_sb (&newline, input_line_pointer, 0);
5139 sb_kill (&newline);
5140 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
5143 /* Insert a file into the input stream; the path must resolve to an actual
5144 file; no include path searching or dependency registering is performed. */
5146 void
5147 input_scrub_insert_file (path)
5148 char *path;
5150 input_scrub_include_file (path, input_line_pointer);
5151 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
5154 /* end of read.c */