1 /* read.c - read a source file -
2 Copyright (C) 1986, 87, 90, 91, 92, 93, 94, 95, 1996
3 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)
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
19 the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 #define MASK_CHAR (0xFF) /* If your chars aren't 8 bits, you will
23 change this a bit. But then, GNU isn't
24 spozed to run on your machine anyway.
25 (RMS is so shortsighted sometimes.)
28 #define MASK_CHAR ((int)(unsigned char)-1)
32 /* This is the largest known floating point format (for now). It will
33 grow when we do 4361 style flonums. */
35 #define MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT (16)
37 /* Routines that read assembler source text to build spagetti in memory.
38 Another group of these functions is in the expr.c module. */
47 #include "libiberty.h"
51 #ifndef TC_START_LABEL
52 #define TC_START_LABEL(x,y) (x==':')
55 /* The NOP_OPCODE is for the alignment fill value.
56 * fill it a nop instruction so that the disassembler does not choke
60 #define NOP_OPCODE 0x00
63 char *input_line_pointer; /*->next char of source file to parse. */
65 int generate_asm_lineno = 0; /* flag to generate line stab for .s file */
67 #if BITS_PER_CHAR != 8
68 /* The following table is indexed by[(char)] and will break if
69 a char does not have exactly 256 states (hopefully 0:255!)! */
74 /* The m88k unfortunately uses @ as a label beginner. */
79 /* The RS/6000 assembler uses {,},[,] as parts of symbol names. */
84 /* The Delta 68k assembler permits % inside label names. */
89 /* The PowerPC Windows NT assemblers permits ? inside label names. */
94 /* The a29k assembler does not permits labels to start with $. */
98 /* used by is_... macros. our ctype[] */
101 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* @ABCDEFGHIJKLMNO */
102 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ[\]^_ */
103 0, 0, 0, 0, LEX_DOLLAR, LEX_PCT, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* _!"#$%&'()*+,-./ */
104 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, LEX_QM, /* 0123456789:;<=>? */
105 LEX_AT, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* @ABCDEFGHIJKLMNO */
106 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, 0, 3, /* PQRSTUVWXYZ[\]^_ */
107 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* `abcdefghijklmno */
108 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, 0, 0, /* pqrstuvwxyz{|}~. */
109 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
110 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
111 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
112 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
113 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
114 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
115 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
121 * Out: 1 if this character ends a line.
124 char is_end_of_line[256] =
127 _, _, _, _, _, _, _, _, _, _, 99, _, _, 99, _, _, /* @abcdefghijklmno */
129 _, _, _, _, _, _, _, _, _, _, 99, _, _, _, _, _, /* @abcdefghijklmno */
131 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
133 _,99, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* _!"#$%&'()*+,-./ */
134 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* 0123456789:;<=>? */
136 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
137 _, _, _, _, _, _, _, _, _, _, _, 99, _, _, _, _, /* 0123456789:;<=>? */
139 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
140 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
141 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
142 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
143 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
144 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
145 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
146 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
147 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
151 /* Functions private to this file. */
153 static char *buffer; /* 1st char of each buffer of lines is here. */
154 static char *buffer_limit; /*->1 + last char in buffer. */
156 #ifdef TARGET_BYTES_BIG_ENDIAN
157 /* Hack to deal with tc-*.h defining TARGET_BYTES_BIG_ENDIAN to empty
158 instead of to 0 or 1. */
159 #if 5 - TARGET_BYTES_BIG_ENDIAN - 5 == 10
160 #undef TARGET_BYTES_BIG_ENDIAN
161 #define TARGET_BYTES_BIG_ENDIAN 1
163 int target_big_endian = TARGET_BYTES_BIG_ENDIAN;
165 int target_big_endian /* = 0 */;
168 static char *old_buffer; /* JF a hack */
169 static char *old_input;
170 static char *old_limit;
172 /* Variables for handling include file directory list. */
174 char **include_dirs; /* List of pointers to directories to
175 search for .include's */
176 int include_dir_count; /* How many are in the list */
177 int include_dir_maxlen = 1;/* Length of longest in list */
179 #ifndef WORKING_DOT_WORD
180 struct broken_word *broken_words;
181 int new_broken_words;
184 /* The current offset into the absolute section. We don't try to
185 build frags in the absolute section, since no data can be stored
186 there. We just keep track of the current offset. */
187 addressT abs_section_offset;
189 /* If this line had an MRI style label, it is stored in this variable.
190 This is used by some of the MRI pseudo-ops. */
193 /* This global variable is used to support MRI common sections. We
194 translate such sections into a common symbol. This variable is
195 non-NULL when we are in an MRI common section. */
196 symbolS *mri_common_symbol;
198 /* In MRI mode, after a dc.b pseudo-op with an odd number of bytes, we
199 need to align to an even byte boundary unless the next pseudo-op is
200 dc.b, ds.b, or dcb.b. This variable is set to 1 if an alignment
202 static int mri_pending_align;
204 static int scrub_from_string PARAMS ((char **));
205 static void do_align PARAMS ((int, char *));
206 static int hex_float PARAMS ((int, char *));
207 static void do_org PARAMS ((segT, expressionS *, int));
208 char *demand_copy_string PARAMS ((int *lenP));
209 int is_it_end_of_statement PARAMS ((void));
210 static segT get_segmented_expression PARAMS ((expressionS *expP));
211 static segT get_known_segmented_expression PARAMS ((expressionS * expP));
212 static void pobegin PARAMS ((void));
213 static int get_line_sb PARAMS ((sb *));
222 obj_read_begin_hook ();
224 /* Something close -- but not too close -- to a multiple of 1024.
225 The debugging malloc I'm using has 24 bytes of overhead. */
226 obstack_begin (¬es, chunksize);
227 obstack_begin (&cond_obstack, chunksize);
229 /* Use machine dependent syntax */
230 for (p = line_separator_chars; *p; p++)
231 is_end_of_line[(unsigned char) *p] = 1;
232 /* Use more. FIXME-SOMEDAY. */
238 /* set up pseudo-op tables */
240 static struct hash_control *po_hash;
242 static const pseudo_typeS potable[] =
244 {"abort", s_abort, 0},
245 {"align", s_align_ptwo, 0},
246 {"ascii", stringer, 0},
247 {"asciz", stringer, 1},
248 {"balign", s_align_bytes, 0},
252 {"common", s_mri_common, 0},
253 {"common.s", s_mri_common, 1},
257 {"dc.d", float_cons, 'd'},
259 {"dc.s", float_cons, 'f'},
261 {"dc.x", float_cons, 'x'},
263 {"dcb.b", s_space, 1},
264 {"dcb.d", s_float_space, 'd'},
265 {"dcb.l", s_space, 4},
266 {"dcb.s", s_float_space, 'f'},
267 {"dcb.w", s_space, 2},
268 {"dcb.x", s_float_space, 'x'},
270 {"ds.b", s_space, 1},
271 {"ds.d", s_space, 8},
272 {"ds.l", s_space, 4},
273 {"ds.p", s_space, 12},
274 {"ds.s", s_space, 4},
275 {"ds.w", s_space, 2},
276 {"ds.x", s_space, 12},
277 {"debug", s_ignore, 0},
282 {"double", float_cons, 'd'},
284 {"eject", listing_eject, 0}, /* Formfeed listing */
286 {"elsec", s_else, 0},
288 {"endc", s_endif, 0},
289 {"endif", s_endif, 0},
293 {"exitm", s_mexit, 0},
295 {"extern", s_ignore, 0}, /* We treat all undef as ext */
296 {"appfile", s_app_file, 1},
297 {"appline", s_app_line, 0},
299 {"file", s_app_file, 0},
301 {"float", float_cons, 'f'},
302 {"format", s_ignore, 0},
303 {"global", s_globl, 0},
304 {"globl", s_globl, 0},
306 {"if", s_if, (int) O_ne},
308 {"ifdef", s_ifdef, 0},
309 {"ifeq", s_if, (int) O_eq},
310 {"ifeqs", s_ifeqs, 0},
311 {"ifge", s_if, (int) O_ge},
312 {"ifgt", s_if, (int) O_gt},
313 {"ifle", s_if, (int) O_le},
314 {"iflt", s_if, (int) O_lt},
316 {"ifndef", s_ifdef, 1},
317 {"ifne", s_if, (int) O_ne},
318 {"ifnes", s_ifeqs, 1},
319 {"ifnotdef", s_ifdef, 1},
320 {"include", s_include, 0},
326 {"lcomm", s_lcomm, 0},
327 {"lflags", listing_flags, 0}, /* Listing flags */
328 {"list", listing_list, 1}, /* Turn listing on */
329 {"llen", listing_psize, 1},
332 {"macro", s_macro, 0},
333 {"mexit", s_mexit, 0},
334 {"name", s_ignore, 0},
335 {"noformat", s_ignore, 0},
336 {"nolist", listing_list, 0}, /* Turn listing off */
337 {"nopage", listing_nopage, 0},
339 {"offset", s_struct, 0},
341 {"p2align", s_align_ptwo, 0},
342 {"page", listing_eject, 0},
343 {"plen", listing_psize, 0},
344 {"print", s_print, 0},
345 {"psize", listing_psize, 0}, /* set paper size */
346 {"purgem", s_purgem, 0},
351 {"sbttl", listing_title, 1}, /* Subtitle of listing */
356 {"single", float_cons, 'f'},
358 {"space", s_space, 0},
359 {"spc", s_ignore, 0},
360 {"stabd", s_stab, 'd'},
361 {"stabn", s_stab, 'n'},
362 {"stabs", s_stab, 's'},
363 {"string", stringer, 1},
364 {"struct", s_struct, 0},
368 /* This is for gcc to use. It's only just been added (2/94), so gcc
369 won't be able to use it for a while -- probably a year or more.
370 But once this has been released, check with gcc maintainers
371 before deleting it or even changing the spelling. */
372 {"this_GCC_requires_the_GNU_assembler", s_ignore, 0},
373 /* If we're folding case -- done for some targets, not necessarily
374 all -- the above string in an input file will be converted to
375 this one. Match it either way... */
376 {"this_gcc_requires_the_gnu_assembler", s_ignore, 0},
378 {"title", listing_title, 0}, /* Listing title */
379 {"ttl", listing_title, 0},
384 {"xdef", s_globl, 0},
385 {"xref", s_ignore, 0},
386 {"xstabs", s_xstab, 's'},
388 {"zero", s_space, 0},
389 {NULL} /* end sentinel */
392 static int pop_override_ok = 0;
393 static const char *pop_table_name;
397 const pseudo_typeS *table;
400 const pseudo_typeS *pop;
401 for (pop = table; pop->poc_name; pop++)
403 errtxt = hash_insert (po_hash, pop->poc_name, (char *) pop);
404 if (errtxt && (!pop_override_ok || strcmp (errtxt, "exists")))
405 as_fatal ("error constructing %s pseudo-op table: %s", pop_table_name,
410 #ifndef md_pop_insert
411 #define md_pop_insert() pop_insert(md_pseudo_table)
414 #ifndef obj_pop_insert
415 #define obj_pop_insert() pop_insert(obj_pseudo_table)
421 po_hash = hash_new ();
423 /* Do the target-specific pseudo ops. */
424 pop_table_name = "md";
427 /* Now object specific. Skip any that were in the target table. */
428 pop_table_name = "obj";
432 /* Now portable ones. Skip any that we've seen already. */
433 pop_table_name = "standard";
434 pop_insert (potable);
437 #define HANDLE_CONDITIONAL_ASSEMBLY() \
438 if (ignore_input ()) \
440 while (! is_end_of_line[(unsigned char) *input_line_pointer++]) \
441 if (input_line_pointer == buffer_limit) \
447 /* This function is used when scrubbing the characters between #APP
450 static char *scrub_string;
451 static char *scrub_string_end;
454 scrub_from_string (from)
459 *from = scrub_string;
460 size = scrub_string_end - scrub_string;
461 scrub_string = scrub_string_end;
465 /* read_a_source_file()
467 * We read the file, putting things into a web that
468 * represents what we have been reading.
471 read_a_source_file (name)
475 register char *s; /* string of symbol, '\0' appended */
479 buffer = input_scrub_new_file (name);
482 listing_newline ("");
484 while ((buffer_limit = input_scrub_next_buffer (&input_line_pointer)) != 0)
485 { /* We have another line to parse. */
486 know (buffer_limit[-1] == '\n'); /* Must have a sentinel. */
487 contin: /* JF this goto is my fault I admit it.
488 Someone brave please re-write the whole
489 input section here? Pleeze??? */
490 while (input_line_pointer < buffer_limit)
492 /* We have more of this buffer to parse. */
495 * We now have input_line_pointer->1st char of next line.
496 * If input_line_pointer [-1] == '\n' then we just
497 * scanned another line: so bump line counters.
499 if (is_end_of_line[(unsigned char) input_line_pointer[-1]])
501 #ifdef md_start_line_hook
502 md_start_line_hook ();
505 if (input_line_pointer[-1] == '\n')
506 bump_line_counters ();
511 #ifdef LABELS_WITHOUT_COLONS
516 /* Text at the start of a line must be a label, we
517 run down and stick a colon in. */
518 if (is_name_beginner (*input_line_pointer))
520 char *line_start = input_line_pointer;
523 HANDLE_CONDITIONAL_ASSEMBLY ();
525 c = get_symbol_end ();
527 /* In MRI mode, the EQU pseudoop must be
528 handled specially. */
531 char *rest = input_line_pointer + 1;
535 if (*rest == ' ' || *rest == '\t')
537 if ((strncasecmp (rest, "EQU", 3) == 0
538 || strncasecmp (rest, "SET", 3) == 0)
539 && (rest[3] == ' ' || rest[3] == '\t'))
541 input_line_pointer = rest + 3;
547 line_label = colon (line_start);
549 *input_line_pointer = c;
551 input_line_pointer++;
557 * We are at the begining of a line, or similar place.
558 * We expect a well-formed assembler statement.
559 * A "symbol-name:" is a statement.
561 * Depending on what compiler is used, the order of these tests
562 * may vary to catch most common case 1st.
563 * Each test is independent of all other tests at the (top) level.
564 * PLEASE make a compiler that doesn't use this assembler.
565 * It is crufty to waste a compiler's time encoding things for this
566 * assembler, which then wastes more time decoding it.
567 * (And communicating via (linear) files is silly!
568 * If you must pass stuff, please pass a tree!)
570 if ((c = *input_line_pointer++) == '\t'
575 c = *input_line_pointer++;
577 know (c != ' '); /* No further leading whitespace. */
580 * C is the 1st significant character.
581 * Input_line_pointer points after that character.
583 if (is_name_beginner (c))
585 /* want user-defined label or pseudo/opcode */
586 HANDLE_CONDITIONAL_ASSEMBLY ();
588 s = --input_line_pointer;
589 c = get_symbol_end (); /* name's delimiter */
591 * C is character after symbol.
592 * That character's place in the input line is now '\0'.
593 * S points to the beginning of the symbol.
594 * [In case of pseudo-op, s->'.'.]
595 * Input_line_pointer->'\0' where c was.
597 if (TC_START_LABEL(c, input_line_pointer))
601 char *rest = input_line_pointer + 1;
603 /* In MRI mode, \tsym: set 0 is permitted. */
607 if (*rest == ' ' || *rest == '\t')
609 if ((strncasecmp (rest, "EQU", 3) == 0
610 || strncasecmp (rest, "SET", 3) == 0)
611 && (rest[3] == ' ' || rest[3] == '\t'))
613 input_line_pointer = rest + 3;
619 line_label = colon (s); /* user-defined label */
620 *input_line_pointer++ = ':'; /* Put ':' back for error messages' sake. */
621 /* Input_line_pointer->after ':'. */
627 || (input_line_pointer[1] == '='
628 #ifdef TC_EQUAL_IN_INSN
629 && ! TC_EQUAL_IN_INSN (c, input_line_pointer)
634 demand_empty_rest_of_line ();
637 { /* expect pseudo-op or machine instruction */
640 #define IGNORE_OPCODE_CASE
641 #ifdef IGNORE_OPCODE_CASE
659 /* The MRI assembler and the m88k use pseudo-ops
661 pop = (pseudo_typeS *) hash_find (po_hash, s);
662 if (pop != NULL && pop->poc_handler == NULL)
667 || (! flag_m68k_mri && *s == '.'))
672 * WARNING: c has next char, which may be end-of-line.
673 * We lookup the pseudo-op table with s+1 because we
674 * already know that the pseudo-op begins with a '.'.
678 pop = (pseudo_typeS *) hash_find (po_hash, s + 1);
680 /* In MRI mode, we may need to insert an
681 automatic alignment directive. What a hack
683 if (mri_pending_align
685 || ! ((pop->poc_handler == cons
686 && pop->poc_val == 1)
687 || (pop->poc_handler == s_space
688 && pop->poc_val == 1))))
690 do_align (1, (char *) NULL);
691 mri_pending_align = 0;
694 /* Print the error msg now, while we still can */
697 as_bad ("Unknown pseudo-op: `%s'", s);
698 *input_line_pointer = c;
703 /* Put it back for error messages etc. */
704 *input_line_pointer = c;
705 /* The following skip of whitespace is compulsory.
706 A well shaped space is sometimes all that separates
707 keyword from operands. */
708 if (c == ' ' || c == '\t')
709 input_line_pointer++;
711 * Input_line is restored.
712 * Input_line_pointer->1st non-blank char
713 * after pseudo-operation.
715 (*pop->poc_handler) (pop->poc_val);
717 /* If that was .end, just get out now. */
718 if (pop->poc_handler == s_end)
722 { /* machine instruction */
725 if (mri_pending_align)
727 do_align (1, (char *) NULL);
728 mri_pending_align = 0;
731 /* WARNING: c has char, which may be end-of-line. */
732 /* Also: input_line_pointer->`\0` where c was. */
733 *input_line_pointer = c;
734 while (!is_end_of_line[(unsigned char) *input_line_pointer]
736 #ifdef TC_EOL_IN_INSN
737 || TC_EOL_IN_INSN (input_line_pointer)
741 if (flag_m68k_mri && *input_line_pointer == '\'')
743 input_line_pointer++;
746 c = *input_line_pointer;
747 *input_line_pointer = '\0';
749 #ifdef OBJ_GENERATE_ASM_LINENO
750 if (generate_asm_lineno == 0)
752 if (ecoff_no_current_file ())
753 generate_asm_lineno = 1;
755 if (generate_asm_lineno == 1)
760 as_where (&s, &lineno);
761 OBJ_GENERATE_ASM_LINENO (s, lineno);
770 if (check_macro (s, &out, '\0', &err))
774 *input_line_pointer++ = c;
775 input_scrub_include_sb (&out,
779 input_scrub_next_buffer (&input_line_pointer);
784 md_assemble (s); /* Assemble 1 instruction. */
786 *input_line_pointer++ = c;
788 /* We resume loop AFTER the end-of-line from
793 } /* if (is_name_beginner(c) */
796 /* Empty statement? */
797 if (is_end_of_line[(unsigned char) c])
800 if ((LOCAL_LABELS_DOLLAR || LOCAL_LABELS_FB)
803 /* local label ("4:") */
804 char *backup = input_line_pointer;
806 HANDLE_CONDITIONAL_ASSEMBLY ();
810 while (isdigit (*input_line_pointer))
812 temp = (temp * 10) + *input_line_pointer - '0';
813 ++input_line_pointer;
814 } /* read the whole number */
816 if (LOCAL_LABELS_DOLLAR
817 && *input_line_pointer == '$'
818 && *(input_line_pointer + 1) == ':')
820 input_line_pointer += 2;
822 if (dollar_label_defined (temp))
824 as_fatal ("label \"%d$\" redefined", temp);
827 define_dollar_label (temp);
828 colon (dollar_label_name (temp, 0));
833 && *input_line_pointer++ == ':')
835 fb_label_instance_inc (temp);
836 colon (fb_label_name (temp, 0));
840 input_line_pointer = backup;
841 } /* local label ("4:") */
843 if (c && strchr (line_comment_chars, c))
844 { /* Its a comment. Better say APP or NO_APP */
848 unsigned int new_length;
851 bump_line_counters ();
852 s = input_line_pointer;
853 if (strncmp (s, "APP\n", 4))
854 continue; /* We ignore it */
857 ends = strstr (s, "#NO_APP\n");
861 unsigned int tmp_len;
864 /* The end of the #APP wasn't in this buffer. We
865 keep reading in buffers until we find the #NO_APP
866 that goes with this #APP There is one. The specs
868 tmp_len = buffer_limit - s;
869 tmp_buf = xmalloc (tmp_len + 1);
870 memcpy (tmp_buf, s, tmp_len);
873 new_tmp = input_scrub_next_buffer (&buffer);
877 buffer_limit = new_tmp;
878 input_line_pointer = buffer;
879 ends = strstr (buffer, "#NO_APP\n");
883 num = buffer_limit - buffer;
885 tmp_buf = xrealloc (tmp_buf, tmp_len + num);
886 memcpy (tmp_buf + tmp_len, buffer, num);
891 input_line_pointer = ends ? ends + 8 : NULL;
899 input_line_pointer = ends + 8;
903 scrub_string_end = ends;
905 new_length = ends - s;
906 new_buf = (char *) xmalloc (new_length);
913 space = (new_buf + new_length) - new_tmp;
914 size = do_scrub_chars (scrub_from_string, new_tmp, space);
922 new_buf = xrealloc (new_buf, new_length + 100);
923 new_tmp = new_buf + new_length;
930 old_input = input_line_pointer;
931 old_limit = buffer_limit;
933 input_line_pointer = new_buf;
934 buffer_limit = new_tmp;
938 HANDLE_CONDITIONAL_ASSEMBLY ();
940 #ifdef tc_unrecognized_line
941 if (tc_unrecognized_line (c))
945 /* as_warn("Junk character %d.",c); Now done by ignore_rest */
946 input_line_pointer--; /* Report unknown char as ignored. */
947 ignore_rest_of_line ();
948 } /* while (input_line_pointer<buffer_limit) */
950 #ifdef md_after_pass_hook
951 md_after_pass_hook ();
957 bump_line_counters ();
961 input_line_pointer = old_input;
962 buffer_limit = old_limit;
967 } /* while (more buffers to scan) */
970 input_scrub_close (); /* Close the input file */
973 /* For most MRI pseudo-ops, the line actually ends at the first
974 nonquoted space. This function looks for that point, stuffs a null
975 in, and sets *STOPCP to the character that used to be there, and
976 returns the location.
978 Until I hear otherwise, I am going to assume that this is only true
979 for the m68k MRI assembler. */
982 mri_comment_field (stopcp)
990 know (flag_m68k_mri);
992 for (s = input_line_pointer;
993 ((! is_end_of_line[(unsigned char) *s] && *s != ' ' && *s != '\t')
1008 for (s = input_line_pointer; ! is_end_of_line[(unsigned char) *s]; s++)
1018 /* Skip to the end of an MRI comment field. */
1021 mri_comment_end (stop, stopc)
1027 input_line_pointer = stop;
1029 while (! is_end_of_line[(unsigned char) *input_line_pointer])
1030 ++input_line_pointer;
1037 as_fatal (".abort detected. Abandoning ship.");
1040 /* Guts of .align directive. */
1047 md_do_align (n, fill, just_record_alignment);
1051 /* @@ Fix this right for BFD! */
1053 static char nop_opcode = NOP_OPCODE;
1055 if (now_seg != data_section && now_seg != bss_section)
1064 /* Only make a frag if we HAVE to. . . */
1065 if (n && !need_pass_2)
1066 frag_align (n, *fill);
1069 just_record_alignment:
1072 record_alignment (now_seg, n);
1075 /* For machines where ".align 4" means align to a 4 byte boundary. */
1080 register unsigned int temp;
1083 unsigned long max_alignment = 1 << 15;
1088 stop = mri_comment_field (&stopc);
1090 if (is_end_of_line[(unsigned char) *input_line_pointer])
1091 temp = arg; /* Default value from pseudo-op table */
1093 temp = get_absolute_expression ();
1095 if (temp > max_alignment)
1097 as_bad ("Alignment too large: %d. assumed.", temp = max_alignment);
1100 /* For the sparc, `.align (1<<n)' actually means `.align n' so we
1101 have to convert it. */
1104 for (i = 0; (temp & 1) == 0; temp >>= 1, ++i)
1108 as_bad ("Alignment not a power of 2");
1111 if (*input_line_pointer == ',')
1113 input_line_pointer++;
1114 temp_fill = get_absolute_expression ();
1115 do_align (temp, &temp_fill);
1118 do_align (temp, (char *) 0);
1121 mri_comment_end (stop, stopc);
1123 demand_empty_rest_of_line ();
1126 /* For machines where ".align 4" means align to 2**4 boundary. */
1128 s_align_ptwo (ignore)
1133 long max_alignment = 15;
1138 stop = mri_comment_field (&stopc);
1140 temp = get_absolute_expression ();
1141 if (temp > max_alignment)
1142 as_bad ("Alignment too large: %d. assumed.", temp = max_alignment);
1145 as_bad ("Alignment negative. 0 assumed.");
1148 if (*input_line_pointer == ',')
1150 input_line_pointer++;
1151 temp_fill = get_absolute_expression ();
1152 do_align (temp, &temp_fill);
1155 do_align (temp, (char *) 0);
1158 mri_comment_end (stop, stopc);
1160 demand_empty_rest_of_line ();
1167 register char *name;
1171 register symbolS *symbolP;
1176 stop = mri_comment_field (&stopc);
1178 name = input_line_pointer;
1179 c = get_symbol_end ();
1180 /* just after name is now '\0' */
1181 p = input_line_pointer;
1184 if (*input_line_pointer != ',')
1186 as_bad ("Expected comma after symbol-name: rest of line ignored.");
1188 mri_comment_end (stop, stopc);
1189 ignore_rest_of_line ();
1192 input_line_pointer++; /* skip ',' */
1193 if ((temp = get_absolute_expression ()) < 0)
1195 as_warn (".COMMon length (%ld.) <0! Ignored.", (long) temp);
1197 mri_comment_end (stop, stopc);
1198 ignore_rest_of_line ();
1202 symbolP = symbol_find_or_make (name);
1204 if (S_IS_DEFINED (symbolP))
1206 as_bad ("Ignoring attempt to re-define symbol `%s'.",
1207 S_GET_NAME (symbolP));
1209 mri_comment_end (stop, stopc);
1210 ignore_rest_of_line ();
1213 if (S_GET_VALUE (symbolP))
1215 if (S_GET_VALUE (symbolP) != (valueT) temp)
1216 as_bad ("Length of .comm \"%s\" is already %ld. Not changed to %ld.",
1217 S_GET_NAME (symbolP),
1218 (long) S_GET_VALUE (symbolP),
1223 S_SET_VALUE (symbolP, (valueT) temp);
1224 S_SET_EXTERNAL (symbolP);
1228 extern int flag_one;
1229 if ( (!temp) || !flag_one)
1230 S_GET_OTHER(symbolP) = const_flag;
1232 #endif /* not OBJ_VMS */
1233 know (symbolP->sy_frag == &zero_address_frag);
1236 mri_comment_end (stop, stopc);
1238 demand_empty_rest_of_line ();
1241 /* The MRI COMMON pseudo-op. We handle this by creating a common
1242 symbol with the appropriate name. We make s_space do the right
1243 thing by increasing the size. */
1246 s_mri_common (small)
1263 stop = mri_comment_field (&stopc);
1267 name = input_line_pointer;
1268 if (! isdigit ((unsigned char) *name))
1269 c = get_symbol_end ();
1274 ++input_line_pointer;
1276 while (isdigit ((unsigned char) *input_line_pointer));
1277 c = *input_line_pointer;
1278 *input_line_pointer = '\0';
1280 if (line_label != NULL)
1282 alc = (char *) xmalloc (strlen (S_GET_NAME (line_label))
1283 + (input_line_pointer - name)
1285 sprintf (alc, "%s%s", name, S_GET_NAME (line_label));
1290 sym = symbol_find_or_make (name);
1291 *input_line_pointer = c;
1295 if (*input_line_pointer != ',')
1299 ++input_line_pointer;
1300 align = get_absolute_expression ();
1303 if (S_IS_DEFINED (sym))
1305 #if defined (S_IS_COMMON) || defined (BFD_ASSEMBLER)
1306 if (! S_IS_COMMON (sym))
1309 as_bad ("attempt to re-define symbol `%s'", S_GET_NAME (sym));
1310 mri_comment_end (stop, stopc);
1311 ignore_rest_of_line ();
1316 S_SET_EXTERNAL (sym);
1317 mri_common_symbol = sym;
1321 S_SET_ALIGN (sym, align);
1324 if (line_label != NULL)
1326 line_label->sy_value.X_op = O_symbol;
1327 line_label->sy_value.X_add_symbol = sym;
1328 line_label->sy_value.X_add_number = S_GET_VALUE (sym);
1329 line_label->sy_frag = &zero_address_frag;
1330 S_SET_SEGMENT (line_label, expr_section);
1333 /* FIXME: We just ignore the small argument, which distinguishes
1334 COMMON and COMMON.S. I don't know what we can do about it. */
1336 /* Ignore the type and hptype. */
1337 if (*input_line_pointer == ',')
1338 input_line_pointer += 2;
1339 if (*input_line_pointer == ',')
1340 input_line_pointer += 2;
1342 mri_comment_end (stop, stopc);
1344 demand_empty_rest_of_line ();
1354 temp = get_absolute_expression ();
1355 if (flag_readonly_data_in_text)
1357 section = text_section;
1361 section = data_section;
1363 subseg_set (section, (subsegT) temp);
1368 demand_empty_rest_of_line ();
1371 /* Handle the .appfile pseudo-op. This is automatically generated by
1372 do_scrub_chars when a preprocessor # line comment is seen with a
1373 file name. This default definition may be overridden by the object
1374 or CPU specific pseudo-ops. This function is also the default
1375 definition for .file; the APPFILE argument is 1 for .appfile, 0 for
1379 s_app_file (appfile)
1385 /* Some assemblers tolerate immediately following '"' */
1386 if ((s = demand_copy_string (&length)) != 0)
1388 /* If this is a fake .appfile, a fake newline was inserted into
1389 the buffer. Passing -2 to new_logical_line tells it to
1391 new_logical_line (s, appfile ? -2 : -1);
1393 /* In MRI mode, the preprocessor may have inserted an extraneous
1396 && *input_line_pointer == '\''
1397 && is_end_of_line[(unsigned char) input_line_pointer[1]])
1398 ++input_line_pointer;
1400 demand_empty_rest_of_line ();
1403 listing_source_file (s);
1411 /* Handle the .appline pseudo-op. This is automatically generated by
1412 do_scrub_chars when a preprocessor # line comment is seen. This
1413 default definition may be overridden by the object or CPU specific
1422 /* The given number is that of the next line. */
1423 l = get_absolute_expression () - 1;
1425 /* Some of the back ends can't deal with non-positive line numbers.
1426 Besides, it's silly. */
1427 as_warn ("Line numbers must be positive; line number %d rejected.", l+1);
1430 new_logical_line ((char *) NULL, l);
1433 listing_source_line (l);
1436 demand_empty_rest_of_line ();
1439 /* Handle the .end pseudo-op. Actually, the real work is done in
1440 read_a_source_file. */
1448 /* The MRI assembler permits the start symbol to follow .end,
1449 but we don't support that. */
1451 if (! is_end_of_line[(unsigned char) *input_line_pointer]
1452 && *input_line_pointer != '*'
1453 && *input_line_pointer != '!')
1454 as_warn ("start address not supported");
1458 /* Handle the .err pseudo-op. */
1464 as_bad (".err encountered");
1465 demand_empty_rest_of_line ();
1468 /* Handle the MRI fail pseudo-op. */
1479 stop = mri_comment_field (&stopc);
1481 temp = get_absolute_expression ();
1483 as_warn (".fail %ld encountered", (long) temp);
1485 as_bad (".fail %ld encountered", (long) temp);
1488 mri_comment_end (stop, stopc);
1490 demand_empty_rest_of_line ();
1497 long temp_repeat = 0;
1499 register long temp_fill = 0;
1502 #ifdef md_flush_pending_output
1503 md_flush_pending_output ();
1506 temp_repeat = get_absolute_expression ();
1507 if (*input_line_pointer == ',')
1509 input_line_pointer++;
1510 temp_size = get_absolute_expression ();
1511 if (*input_line_pointer == ',')
1513 input_line_pointer++;
1514 temp_fill = get_absolute_expression ();
1517 /* This is to be compatible with BSD 4.2 AS, not for any rational reason. */
1518 #define BSD_FILL_SIZE_CROCK_8 (8)
1519 if (temp_size > BSD_FILL_SIZE_CROCK_8)
1521 as_warn (".fill size clamped to %d.", BSD_FILL_SIZE_CROCK_8);
1522 temp_size = BSD_FILL_SIZE_CROCK_8;
1526 as_warn ("Size negative: .fill ignored.");
1529 else if (temp_repeat <= 0)
1531 as_warn ("Repeat < 0, .fill ignored");
1535 if (temp_size && !need_pass_2)
1537 p = frag_var (rs_fill, (int) temp_size, (int) temp_size, (relax_substateT) 0, (symbolS *) 0, temp_repeat, (char *) 0);
1538 memset (p, 0, (unsigned int) temp_size);
1539 /* The magic number BSD_FILL_SIZE_CROCK_4 is from BSD 4.2 VAX
1540 * flavoured AS. The following bizzare behaviour is to be
1541 * compatible with above. I guess they tried to take up to 8
1542 * bytes from a 4-byte expression and they forgot to sign
1543 * extend. Un*x Sux. */
1544 #define BSD_FILL_SIZE_CROCK_4 (4)
1545 md_number_to_chars (p, (valueT) temp_fill,
1546 (temp_size > BSD_FILL_SIZE_CROCK_4
1547 ? BSD_FILL_SIZE_CROCK_4
1548 : (int) temp_size));
1549 /* Note: .fill (),0 emits no frag (since we are asked to .fill 0 bytes)
1550 * but emits no error message because it seems a legal thing to do.
1551 * It is a degenerate case of .fill but could be emitted by a compiler.
1554 demand_empty_rest_of_line ();
1568 stop = mri_comment_field (&stopc);
1572 name = input_line_pointer;
1573 c = get_symbol_end ();
1574 symbolP = symbol_find_or_make (name);
1575 *input_line_pointer = c;
1577 S_SET_EXTERNAL (symbolP);
1580 input_line_pointer++;
1582 if (*input_line_pointer == '\n')
1589 mri_comment_end (stop, stopc);
1591 demand_empty_rest_of_line ();
1594 /* Handle the MRI IRP and IRPC pseudo-ops. */
1606 as_where (&file, &line);
1609 while (! is_end_of_line[(unsigned char) *input_line_pointer])
1610 sb_add_char (&s, *input_line_pointer++);
1614 err = expand_irp (irpc, 0, &s, &out, get_line_sb, '\0');
1616 as_bad_where (file, line, "%s", err);
1620 input_scrub_include_sb (&out, input_line_pointer);
1622 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
1626 s_lcomm (needs_align)
1627 /* 1 if this was a ".bss" directive, which may require a 3rd argument
1628 (alignment); 0 if it was an ".lcomm" (2 args only) */
1631 register char *name;
1635 register symbolS *symbolP;
1636 segT current_seg = now_seg;
1637 subsegT current_subseg = now_subseg;
1638 const int max_alignment = 15;
1640 segT bss_seg = bss_section;
1642 name = input_line_pointer;
1643 c = get_symbol_end ();
1644 p = input_line_pointer;
1648 /* Accept an optional comma after the name. The comma used to be
1649 required, but Irix 5 cc does not generate it. */
1650 if (*input_line_pointer == ',')
1652 ++input_line_pointer;
1656 if (*input_line_pointer == '\n')
1658 as_bad ("Missing size expression");
1662 if ((temp = get_absolute_expression ()) < 0)
1664 as_warn ("BSS length (%d.) <0! Ignored.", temp);
1665 ignore_rest_of_line ();
1669 #if defined (TC_MIPS) || defined (TC_ALPHA)
1670 if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour
1671 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
1673 /* For MIPS and Alpha ECOFF or ELF, small objects are put in .sbss. */
1674 if (temp <= bfd_get_gp_size (stdoutput))
1676 bss_seg = subseg_new (".sbss", 1);
1677 seg_info (bss_seg)->bss = 1;
1683 /* FIXME. This needs to be machine independent. */
1693 record_alignment(bss_seg, align);
1700 if (*input_line_pointer != ',')
1702 as_bad ("Expected comma after size");
1703 ignore_rest_of_line ();
1706 input_line_pointer++;
1708 if (*input_line_pointer == '\n')
1710 as_bad ("Missing alignment");
1713 align = get_absolute_expression ();
1714 if (align > max_alignment)
1716 align = max_alignment;
1717 as_warn ("Alignment too large: %d. assumed.", align);
1722 as_warn ("Alignment negative. 0 assumed.");
1724 record_alignment (bss_seg, align);
1725 } /* if needs align */
1728 /* Assume some objects may require alignment on some systems. */
1732 align = ffs (temp) - 1;
1733 if (temp % (1 << align))
1740 symbolP = symbol_find_or_make (name);
1744 #if defined(OBJ_AOUT) | defined(OBJ_BOUT)
1745 S_GET_OTHER (symbolP) == 0 &&
1746 S_GET_DESC (symbolP) == 0 &&
1747 #endif /* OBJ_AOUT or OBJ_BOUT */
1748 (S_GET_SEGMENT (symbolP) == bss_seg
1749 || (!S_IS_DEFINED (symbolP) && S_GET_VALUE (symbolP) == 0)))
1753 subseg_set (bss_seg, 1);
1756 frag_align (align, 0);
1757 /* detach from old frag */
1758 if (S_GET_SEGMENT (symbolP) == bss_seg)
1759 symbolP->sy_frag->fr_symbol = NULL;
1761 symbolP->sy_frag = frag_now;
1762 pfrag = frag_var (rs_org, 1, 1, (relax_substateT)0, symbolP,
1766 S_SET_SEGMENT (symbolP, bss_seg);
1769 /* The symbol may already have been created with a preceding
1770 ".globl" directive -- be careful not to step on storage class
1771 in that case. Otherwise, set it to static. */
1772 if (S_GET_STORAGE_CLASS (symbolP) != C_EXT)
1774 S_SET_STORAGE_CLASS (symbolP, C_STAT);
1776 #endif /* OBJ_COFF */
1779 S_SET_SIZE (symbolP, temp);
1783 as_bad ("Ignoring attempt to re-define symbol `%s'.",
1784 S_GET_NAME (symbolP));
1786 subseg_set (current_seg, current_subseg);
1788 demand_empty_rest_of_line ();
1795 register char *name;
1799 register symbolS *symbolP;
1801 /* we permit ANY defined expression: BSD4.2 demands constants */
1802 name = input_line_pointer;
1803 c = get_symbol_end ();
1804 p = input_line_pointer;
1807 if (*input_line_pointer != ',')
1810 as_bad ("Expected comma after name \"%s\"", name);
1812 ignore_rest_of_line ();
1815 input_line_pointer++;
1817 if (exp.X_op != O_constant
1818 && exp.X_op != O_register)
1820 as_bad ("bad expression");
1821 ignore_rest_of_line ();
1825 symbolP = symbol_find_or_make (name);
1827 /* FIXME-SOON I pulled a (&& symbolP->sy_other == 0 &&
1828 symbolP->sy_desc == 0) out of this test because coff doesn't have
1829 those fields, and I can't see when they'd ever be tripped. I
1830 don't think I understand why they were here so I may have
1831 introduced a bug. As recently as 1.37 didn't have this test
1832 anyway. xoxorich. */
1834 if (S_GET_SEGMENT (symbolP) == undefined_section
1835 && S_GET_VALUE (symbolP) == 0)
1837 /* The name might be an undefined .global symbol; be sure to
1838 keep the "external" bit. */
1839 S_SET_SEGMENT (symbolP,
1840 (exp.X_op == O_constant
1843 S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
1847 as_bad ("Symbol %s already defined", name);
1850 demand_empty_rest_of_line ();
1853 /* Read a line into an sb. */
1859 if (input_line_pointer >= buffer_limit)
1861 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
1862 if (buffer_limit == 0)
1866 while (! is_end_of_line[(unsigned char) *input_line_pointer])
1867 sb_add_char (line, *input_line_pointer++);
1868 while (input_line_pointer < buffer_limit
1869 && is_end_of_line[(unsigned char) *input_line_pointer])
1871 if (*input_line_pointer == '\n')
1873 bump_line_counters ();
1876 ++input_line_pointer;
1881 /* Define a macro. This is an interface to macro.c, which is shared
1882 between gas and gasp. */
1894 as_where (&file, &line);
1897 while (! is_end_of_line[(unsigned char) *input_line_pointer])
1898 sb_add_char (&s, *input_line_pointer++);
1901 if (line_label != NULL)
1902 sb_add_string (&label, S_GET_NAME (line_label));
1904 demand_empty_rest_of_line ();
1906 err = define_macro (0, &s, &label, get_line_sb);
1908 as_bad_where (file, line, "%s", err);
1911 if (line_label != NULL)
1913 S_SET_SEGMENT (line_label, undefined_section);
1914 S_SET_VALUE (line_label, 0);
1915 line_label->sy_frag = &zero_address_frag;
1922 /* Handle the .mexit pseudo-op, which immediately exits a macro
1929 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
1932 /* Handle changing the location counter. */
1935 do_org (segment, exp, fill)
1940 if (segment != now_seg && segment != absolute_section)
1941 as_bad ("invalid segment \"%s\"; segment \"%s\" assumed",
1942 segment_name (segment), segment_name (now_seg));
1944 if (now_seg == absolute_section)
1947 as_warn ("ignoring fill value in absolute section");
1948 if (exp->X_op != O_constant)
1950 as_bad ("only constant offsets supported in absolute section");
1951 exp->X_add_number = 0;
1953 abs_section_offset = exp->X_add_number;
1959 p = frag_var (rs_org, 1, 1, (relax_substateT) 0, exp->X_add_symbol,
1960 exp->X_add_number, (char *) NULL);
1969 register segT segment;
1971 register long temp_fill;
1973 /* The m68k MRI assembler has a different meaning for .org. It
1974 means to create an absolute section at a given address. We can't
1975 support that--use a linker script instead. */
1978 as_bad ("MRI style ORG pseudo-op not supported");
1979 ignore_rest_of_line ();
1983 /* Don't believe the documentation of BSD 4.2 AS. There is no such
1984 thing as a sub-segment-relative origin. Any absolute origin is
1985 given a warning, then assumed to be segment-relative. Any
1986 segmented origin expression ("foo+42") had better be in the right
1987 segment or the .org is ignored.
1989 BSD 4.2 AS warns if you try to .org backwards. We cannot because
1990 we never know sub-segment sizes when we are reading code. BSD
1991 will crash trying to emit negative numbers of filler bytes in
1992 certain .orgs. We don't crash, but see as-write for that code.
1994 Don't make frag if need_pass_2==1. */
1995 segment = get_known_segmented_expression (&exp);
1996 if (*input_line_pointer == ',')
1998 input_line_pointer++;
1999 temp_fill = get_absolute_expression ();
2005 do_org (segment, &exp, temp_fill);
2007 demand_empty_rest_of_line ();
2010 /* Handle parsing for the MRI SECT/SECTION pseudo-op. This should be
2011 called by the obj-format routine which handles section changing
2012 when in MRI mode. It will create a new section, and return it. It
2013 will set *TYPE to the section type: one of '\0' (unspecified), 'C'
2014 (code), 'D' (data), 'M' (mixed), or 'R' (romable). If
2015 BFD_ASSEMBLER is defined, the flags will be set in the section. */
2029 name = input_line_pointer;
2030 if (! isdigit ((unsigned char) *name))
2031 c = get_symbol_end ();
2036 ++input_line_pointer;
2038 while (isdigit ((unsigned char) *input_line_pointer));
2039 c = *input_line_pointer;
2040 *input_line_pointer = '\0';
2043 name = strdup (name);
2045 as_fatal ("virtual memory exhausted");
2047 *input_line_pointer = c;
2049 seg = subseg_new (name, 0);
2051 if (*input_line_pointer == ',')
2055 ++input_line_pointer;
2056 align = get_absolute_expression ();
2057 record_alignment (seg, align);
2061 if (*input_line_pointer == ',')
2063 c = *++input_line_pointer;
2064 c = toupper ((unsigned char) c);
2065 if (c == 'C' || c == 'D' || c == 'M' || c == 'R')
2068 as_bad ("unrecognized section type");
2069 ++input_line_pointer;
2071 #ifdef BFD_ASSEMBLER
2075 flags = SEC_NO_FLAGS;
2078 else if (*type == 'D')
2080 else if (*type == 'R')
2082 if (flags != SEC_NO_FLAGS)
2084 if (! bfd_set_section_flags (stdoutput, seg, flags))
2085 as_warn ("error setting flags for \"%s\": %s",
2086 bfd_section_name (stdoutput, seg),
2087 bfd_errmsg (bfd_get_error ()));
2093 /* Ignore the HP type. */
2094 if (*input_line_pointer == ',')
2095 input_line_pointer += 2;
2097 demand_empty_rest_of_line ();
2099 #else /* ! TC_M68K */
2108 name = input_line_pointer;
2109 c = get_symbol_end ();
2111 name = strdup (name);
2113 as_fatal ("virtual memory exhausted");
2115 *input_line_pointer = c;
2117 seg = subseg_new (name, 0);
2119 if (*input_line_pointer != ',')
2125 ++input_line_pointer;
2127 sectype = input_line_pointer;
2128 c = get_symbol_end ();
2129 if (*sectype == '\0')
2131 else if (strcasecmp (sectype, "text") == 0)
2133 else if (strcasecmp (sectype, "data") == 0)
2135 else if (strcasecmp (sectype, "romdata") == 0)
2138 as_warn ("unrecognized section type `%s'", sectype);
2139 *input_line_pointer = c;
2142 if (*input_line_pointer == ',')
2146 ++input_line_pointer;
2148 seccmd = input_line_pointer;
2149 c = get_symbol_end ();
2150 if (strcasecmp (seccmd, "absolute") == 0)
2152 as_bad ("absolute sections are not supported");
2153 *input_line_pointer = c;
2154 ignore_rest_of_line ();
2157 else if (strcasecmp (seccmd, "align") == 0)
2161 *input_line_pointer = c;
2162 align = get_absolute_expression ();
2163 record_alignment (seg, align);
2167 as_warn ("unrecognized section command `%s'", seccmd);
2168 *input_line_pointer = c;
2172 demand_empty_rest_of_line ();
2174 #else /* ! TC_I960 */
2175 /* The MRI assembler seems to use different forms of .sect for
2176 different targets. */
2178 #endif /* ! TC_I960 */
2179 #endif /* ! TC_M68K */
2182 /* Handle the .print pseudo-op. */
2191 s = demand_copy_C_string (&len);
2193 demand_empty_rest_of_line ();
2196 /* Handle the .purgem pseudo-op. */
2202 if (is_it_end_of_statement ())
2204 demand_empty_rest_of_line ();
2214 name = input_line_pointer;
2215 c = get_symbol_end ();
2216 delete_macro (name);
2217 *input_line_pointer = c;
2220 while (*input_line_pointer++ == ',');
2222 --input_line_pointer;
2223 demand_empty_rest_of_line ();
2226 /* Handle the .rept pseudo-op. */
2236 count = get_absolute_expression ();
2239 if (! buffer_and_nest ("REPT", "ENDR", &one, get_line_sb))
2241 as_bad ("rept without endr");
2247 sb_add_sb (&many, &one);
2251 input_scrub_include_sb (&many, input_line_pointer);
2253 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2260 register char *name;
2261 register char delim;
2262 register char *end_name;
2263 register symbolS *symbolP;
2266 * Especial apologies for the random logic:
2267 * this just grew, and could be parsed much more simply!
2270 name = input_line_pointer;
2271 delim = get_symbol_end ();
2272 end_name = input_line_pointer;
2276 if (*input_line_pointer != ',')
2279 as_bad ("Expected comma after name \"%s\"", name);
2281 ignore_rest_of_line ();
2285 input_line_pointer++;
2288 if (name[0] == '.' && name[1] == '\0')
2290 /* Turn '. = mumble' into a .org mumble */
2291 register segT segment;
2294 segment = get_known_segmented_expression (&exp);
2297 do_org (segment, &exp, 0);
2303 if ((symbolP = symbol_find (name)) == NULL
2304 && (symbolP = md_undefined_symbol (name)) == NULL)
2306 symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
2308 /* "set" symbols are local unless otherwise specified. */
2309 SF_SET_LOCAL (symbolP);
2310 #endif /* OBJ_COFF */
2312 } /* make a new symbol */
2314 symbol_table_insert (symbolP);
2317 pseudo_set (symbolP);
2318 demand_empty_rest_of_line ();
2331 #ifdef md_flush_pending_output
2332 md_flush_pending_output ();
2336 stop = mri_comment_field (&stopc);
2338 /* Just like .fill, but temp_size = 1 */
2340 if (exp.X_op == O_constant)
2344 repeat = exp.X_add_number;
2349 if (! flag_mri || repeat < 0)
2350 as_warn (".space repeat count is %s, ignored",
2351 repeat ? "negative" : "zero");
2355 /* If we are in the absolute section, just bump the offset. */
2356 if (now_seg == absolute_section)
2358 abs_section_offset += repeat;
2362 /* If we are secretly in an MRI common section, then creating
2363 space just increases the size of the common symbol. */
2364 if (mri_common_symbol != NULL)
2366 S_SET_VALUE (mri_common_symbol,
2367 S_GET_VALUE (mri_common_symbol) + repeat);
2372 p = frag_var (rs_fill, 1, 1, (relax_substateT) 0, (symbolS *) 0,
2373 repeat, (char *) 0);
2377 if (now_seg == absolute_section)
2379 as_bad ("space allocation too complex in absolute section");
2380 subseg_set (text_section, 0);
2382 if (mri_common_symbol != NULL)
2384 as_bad ("space allocation too complex in common section");
2385 mri_common_symbol = NULL;
2388 p = frag_var (rs_space, 1, 1, (relax_substateT) 0,
2389 make_expr_symbol (&exp), 0L, (char *) 0);
2392 if (*input_line_pointer == ',')
2394 input_line_pointer++;
2395 temp_fill = get_absolute_expression ();
2408 mri_comment_end (stop, stopc);
2410 demand_empty_rest_of_line ();
2413 /* This is like s_space, but the value is a floating point number with
2414 the given precision. This is for the MRI dcb.s pseudo-op and
2418 s_float_space (float_type)
2423 char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
2428 stop = mri_comment_field (&stopc);
2430 count = get_absolute_expression ();
2433 if (*input_line_pointer != ',')
2435 as_bad ("missing value");
2437 mri_comment_end (stop, stopc);
2438 ignore_rest_of_line ();
2442 ++input_line_pointer;
2446 /* Skip any 0{letter} that may be present. Don't even check if the
2447 * letter is legal. */
2448 if (input_line_pointer[0] == '0' && isalpha (input_line_pointer[1]))
2449 input_line_pointer += 2;
2451 /* Accept :xxxx, where the x's are hex digits, for a floating point
2452 with the exact digits specified. */
2453 if (input_line_pointer[0] == ':')
2455 flen = hex_float (float_type, temp);
2459 mri_comment_end (stop, stopc);
2460 ignore_rest_of_line ();
2468 err = md_atof (float_type, temp, &flen);
2469 know (flen <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
2473 as_bad ("Bad floating literal: %s", err);
2475 mri_comment_end (stop, stopc);
2476 ignore_rest_of_line ();
2481 while (--count >= 0)
2485 p = frag_more (flen);
2486 memcpy (p, temp, (unsigned int) flen);
2490 mri_comment_end (stop, stopc);
2492 demand_empty_rest_of_line ();
2495 /* Handle the .struct pseudo-op, as found in MIPS assemblers. */
2505 stop = mri_comment_field (&stopc);
2506 abs_section_offset = get_absolute_expression ();
2507 subseg_set (absolute_section, 0);
2509 mri_comment_end (stop, stopc);
2510 demand_empty_rest_of_line ();
2519 temp = get_absolute_expression ();
2520 subseg_set (text_section, (subsegT) temp);
2521 demand_empty_rest_of_line ();
2523 const_flag &= ~IN_DEFAULT_SECTION;
2529 demand_empty_rest_of_line ()
2532 if (is_end_of_line[(unsigned char) *input_line_pointer])
2534 input_line_pointer++;
2538 ignore_rest_of_line ();
2540 /* Return having already swallowed end-of-line. */
2541 } /* Return pointing just after end-of-line. */
2544 ignore_rest_of_line () /* For suspect lines: gives warning. */
2546 if (!is_end_of_line[(unsigned char) *input_line_pointer])
2548 if (isprint (*input_line_pointer))
2549 as_bad ("Rest of line ignored. First ignored character is `%c'.",
2550 *input_line_pointer);
2552 as_bad ("Rest of line ignored. First ignored character valued 0x%x.",
2553 *input_line_pointer);
2554 while (input_line_pointer < buffer_limit
2555 && !is_end_of_line[(unsigned char) *input_line_pointer])
2557 input_line_pointer++;
2560 input_line_pointer++; /* Return pointing just after end-of-line. */
2561 know (is_end_of_line[(unsigned char) input_line_pointer[-1]]);
2567 * In: Pointer to a symbol.
2568 * Input_line_pointer->expression.
2570 * Out: Input_line_pointer->just after any whitespace after expression.
2571 * Tried to set symbol to value of expression.
2572 * Will change symbols type, value, and frag;
2575 pseudo_set (symbolP)
2579 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
2581 #endif /* OBJ_AOUT or OBJ_BOUT */
2583 know (symbolP); /* NULL pointer is logic error. */
2584 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
2585 ext = S_IS_EXTERNAL (symbolP);
2586 #endif /* OBJ_AOUT or OBJ_BOUT */
2588 (void) expression (&exp);
2590 if (exp.X_op == O_illegal)
2591 as_bad ("illegal expression; zero assumed");
2592 else if (exp.X_op == O_absent)
2593 as_bad ("missing expression; zero assumed");
2594 else if (exp.X_op == O_big)
2595 as_bad ("%s number invalid; zero assumed",
2596 exp.X_add_number > 0 ? "bignum" : "floating point");
2597 else if (exp.X_op == O_subtract
2598 && (S_GET_SEGMENT (exp.X_add_symbol)
2599 == S_GET_SEGMENT (exp.X_op_symbol))
2600 && SEG_NORMAL (S_GET_SEGMENT (exp.X_add_symbol))
2601 && exp.X_add_symbol->sy_frag == exp.X_op_symbol->sy_frag)
2603 exp.X_op = O_constant;
2604 exp.X_add_number = (S_GET_VALUE (exp.X_add_symbol)
2605 - S_GET_VALUE (exp.X_op_symbol));
2613 exp.X_add_number = 0;
2616 S_SET_SEGMENT (symbolP, absolute_section);
2617 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
2619 S_SET_EXTERNAL (symbolP);
2621 S_CLEAR_EXTERNAL (symbolP);
2622 #endif /* OBJ_AOUT or OBJ_BOUT */
2623 S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
2624 symbolP->sy_frag = &zero_address_frag;
2628 S_SET_SEGMENT (symbolP, reg_section);
2629 S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
2630 symbolP->sy_frag = &zero_address_frag;
2634 if (S_GET_SEGMENT (exp.X_add_symbol) == undefined_section
2635 || exp.X_add_number != 0)
2636 symbolP->sy_value = exp;
2639 symbolS *s = exp.X_add_symbol;
2641 S_SET_SEGMENT (symbolP, S_GET_SEGMENT (s));
2642 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
2644 S_SET_EXTERNAL (symbolP);
2646 S_CLEAR_EXTERNAL (symbolP);
2647 #endif /* OBJ_AOUT or OBJ_BOUT */
2648 S_SET_VALUE (symbolP,
2649 exp.X_add_number + S_GET_VALUE (s));
2650 symbolP->sy_frag = s->sy_frag;
2651 copy_symbol_attributes (symbolP, s);
2656 /* The value is some complex expression.
2657 FIXME: Should we set the segment to anything? */
2658 symbolP->sy_value = exp;
2666 * CONStruct more frag of .bytes, or .words etc.
2667 * Should need_pass_2 be 1 then emit no frag(s).
2668 * This understands EXPRESSIONS.
2672 * This has a split personality. We use expression() to read the
2673 * value. We can detect if the value won't fit in a byte or word.
2674 * But we can't detect if expression() discarded significant digits
2675 * in the case of a long. Not worth the crocks required to fix it.
2678 /* Select a parser for cons expressions. */
2680 /* Some targets need to parse the expression in various fancy ways.
2681 You can define TC_PARSE_CONS_EXPRESSION to do whatever you like
2682 (for example, the HPPA does this). Otherwise, you can define
2683 BITFIELD_CONS_EXPRESSIONS to permit bitfields to be specified, or
2684 REPEAT_CONS_EXPRESSIONS to permit repeat counts. If none of these
2685 are defined, which is the normal case, then only simple expressions
2689 parse_mri_cons PARAMS ((expressionS *exp, unsigned int nbytes));
2691 #ifndef TC_PARSE_CONS_EXPRESSION
2692 #ifdef BITFIELD_CONS_EXPRESSIONS
2693 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_bitfield_cons (EXP, NBYTES)
2695 parse_bitfield_cons PARAMS ((expressionS *exp, unsigned int nbytes));
2697 #ifdef REPEAT_CONS_EXPRESSIONS
2698 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_repeat_cons (EXP, NBYTES)
2700 parse_repeat_cons PARAMS ((expressionS *exp, unsigned int nbytes));
2703 /* If we haven't gotten one yet, just call expression. */
2704 #ifndef TC_PARSE_CONS_EXPRESSION
2705 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) expression (EXP)
2709 /* worker to do .byte etc statements */
2710 /* clobbers input_line_pointer, checks */
2713 cons_worker (nbytes, rva)
2714 register int nbytes; /* 1=.byte, 2=.word, 4=.long */
2722 #ifdef md_flush_pending_output
2723 md_flush_pending_output ();
2727 stop = mri_comment_field (&stopc);
2729 if (is_it_end_of_statement ())
2732 mri_comment_end (stop, stopc);
2733 demand_empty_rest_of_line ();
2741 parse_mri_cons (&exp, (unsigned int) nbytes);
2743 TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes);
2747 if (exp.X_op == O_symbol)
2748 exp.X_op = O_symbol_rva;
2750 as_fatal ("rva without symbol");
2752 emit_expr (&exp, (unsigned int) nbytes);
2755 while (*input_line_pointer++ == ',');
2757 /* In MRI mode, after an odd number of bytes, we must align to an
2758 even word boundary, unless the next instruction is a dc.b, ds.b
2760 if (flag_mri && nbytes == 1 && (c & 1) != 0)
2761 mri_pending_align = 1;
2763 input_line_pointer--; /* Put terminator back into stream. */
2766 mri_comment_end (stop, stopc);
2768 demand_empty_rest_of_line ();
2776 cons_worker (size, 0);
2783 cons_worker (size, 1);
2787 /* Put the contents of expression EXP into the object file using
2788 NBYTES bytes. If need_pass_2 is 1, this does nothing. */
2791 emit_expr (exp, nbytes)
2793 unsigned int nbytes;
2797 valueT extra_digit = 0;
2799 /* Don't do anything if we are going to make another pass. */
2805 /* Allow `.word 0' in the absolute section. */
2806 if (now_seg == absolute_section)
2808 if (op != O_constant || exp->X_add_number != 0)
2809 as_bad ("attempt to store value in absolute section");
2810 abs_section_offset += nbytes;
2814 /* Handle a negative bignum. */
2816 && exp->X_add_number == 0
2817 && exp->X_add_symbol->sy_value.X_op == O_big
2818 && exp->X_add_symbol->sy_value.X_add_number > 0)
2821 unsigned long carry;
2823 exp = &exp->X_add_symbol->sy_value;
2825 /* Negate the bignum: one's complement each digit and add 1. */
2827 for (i = 0; i < exp->X_add_number; i++)
2831 next = (((~ (generic_bignum[i] & LITTLENUM_MASK))
2834 generic_bignum[i] = next & LITTLENUM_MASK;
2835 carry = next >> LITTLENUM_NUMBER_OF_BITS;
2838 /* We can ignore any carry out, because it will be handled by
2839 extra_digit if it is needed. */
2841 extra_digit = (valueT) -1;
2845 if (op == O_absent || op == O_illegal)
2847 as_warn ("zero assumed for missing expression");
2848 exp->X_add_number = 0;
2851 else if (op == O_big && exp->X_add_number <= 0)
2853 as_bad ("floating point number invalid; zero assumed");
2854 exp->X_add_number = 0;
2857 else if (op == O_register)
2859 as_warn ("register value used as expression");
2863 p = frag_more ((int) nbytes);
2865 #ifndef WORKING_DOT_WORD
2866 /* If we have the difference of two symbols in a word, save it on
2867 the broken_words list. See the code in write.c. */
2868 if (op == O_subtract && nbytes == 2)
2870 struct broken_word *x;
2872 x = (struct broken_word *) xmalloc (sizeof (struct broken_word));
2873 x->next_broken_word = broken_words;
2876 x->word_goes_here = p;
2878 x->add = exp->X_add_symbol;
2879 x->sub = exp->X_op_symbol;
2880 x->addnum = exp->X_add_number;
2887 /* If we have an integer, but the number of bytes is too large to
2888 pass to md_number_to_chars, handle it as a bignum. */
2889 if (op == O_constant && nbytes > sizeof (valueT))
2894 if (! exp->X_unsigned && exp->X_add_number < 0)
2895 extra_digit = (valueT) -1;
2896 val = (valueT) exp->X_add_number;
2900 generic_bignum[gencnt] = val & LITTLENUM_MASK;
2901 val >>= LITTLENUM_NUMBER_OF_BITS;
2905 op = exp->X_op = O_big;
2906 exp->X_add_number = gencnt;
2909 if (op == O_constant)
2911 register valueT get;
2912 register valueT use;
2913 register valueT mask;
2914 register valueT unmask;
2916 /* JF << of >= number of bits in the object is undefined. In
2917 particular SPARC (Sun 4) has problems */
2918 if (nbytes >= sizeof (valueT))
2921 mask = ~(valueT) 0 << (BITS_PER_CHAR * nbytes); /* Don't store these bits. */
2923 unmask = ~mask; /* Do store these bits. */
2926 "Do this mod if you want every overflow check to assume SIGNED 2's complement data.";
2927 mask = ~(unmask >> 1); /* Includes sign bit now. */
2930 get = exp->X_add_number;
2932 if ((get & mask) != 0 && (get & mask) != mask)
2933 { /* Leading bits contain both 0s & 1s. */
2934 as_warn ("Value 0x%lx truncated to 0x%lx.", get, use);
2936 /* put bytes in right order. */
2937 md_number_to_chars (p, use, (int) nbytes);
2939 else if (op == O_big)
2942 LITTLENUM_TYPE *nums;
2944 know (nbytes % CHARS_PER_LITTLENUM == 0);
2946 size = exp->X_add_number * CHARS_PER_LITTLENUM;
2949 as_warn ("Bignum truncated to %d bytes", nbytes);
2953 if (target_big_endian)
2955 while (nbytes > size)
2957 md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
2958 nbytes -= CHARS_PER_LITTLENUM;
2959 p += CHARS_PER_LITTLENUM;
2962 nums = generic_bignum + size / CHARS_PER_LITTLENUM;
2966 md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
2967 size -= CHARS_PER_LITTLENUM;
2968 p += CHARS_PER_LITTLENUM;
2973 nums = generic_bignum;
2976 md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
2978 size -= CHARS_PER_LITTLENUM;
2979 p += CHARS_PER_LITTLENUM;
2980 nbytes -= CHARS_PER_LITTLENUM;
2985 md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
2986 nbytes -= CHARS_PER_LITTLENUM;
2987 p += CHARS_PER_LITTLENUM;
2993 memset (p, 0, nbytes);
2995 /* Now we need to generate a fixS to record the symbol value.
2996 This is easy for BFD. For other targets it can be more
2997 complex. For very complex cases (currently, the HPPA and
2998 NS32K), you can define TC_CONS_FIX_NEW to do whatever you
2999 want. For simpler cases, you can define TC_CONS_RELOC to be
3000 the name of the reloc code that should be stored in the fixS.
3001 If neither is defined, the code uses NO_RELOC if it is
3002 defined, and otherwise uses 0. */
3004 #ifdef BFD_ASSEMBLER
3005 #ifdef TC_CONS_FIX_NEW
3006 TC_CONS_FIX_NEW (frag_now, p - frag_now->fr_literal, nbytes, exp);
3008 fix_new_exp (frag_now, p - frag_now->fr_literal, (int) nbytes, exp, 0,
3009 /* @@ Should look at CPU word size. */
3010 nbytes == 2 ? BFD_RELOC_16
3011 : nbytes == 8 ? BFD_RELOC_64
3015 #ifdef TC_CONS_FIX_NEW
3016 TC_CONS_FIX_NEW (frag_now, p - frag_now->fr_literal, nbytes, exp);
3018 /* Figure out which reloc number to use. Use TC_CONS_RELOC if
3019 it is defined, otherwise use NO_RELOC if it is defined,
3021 #ifndef TC_CONS_RELOC
3023 #define TC_CONS_RELOC NO_RELOC
3025 #define TC_CONS_RELOC 0
3028 fix_new_exp (frag_now, p - frag_now->fr_literal, (int) nbytes, exp, 0,
3030 #endif /* TC_CONS_FIX_NEW */
3031 #endif /* BFD_ASSEMBLER */
3035 #ifdef BITFIELD_CONS_EXPRESSIONS
3037 /* i960 assemblers, (eg, asm960), allow bitfields after ".byte" as
3038 w:x,y:z, where w and y are bitwidths and x and y are values. They
3039 then pack them all together. We do a little better in that we allow
3040 them in words, longs, etc. and we'll pack them in target byte order
3043 The rules are: pack least significat bit first, if a field doesn't
3044 entirely fit, put it in the next unit. Overflowing the bitfield is
3045 explicitly *not* even a warning. The bitwidth should be considered
3048 To use this function the tc-XXX.h file should define
3049 BITFIELD_CONS_EXPRESSIONS. */
3052 parse_bitfield_cons (exp, nbytes)
3054 unsigned int nbytes;
3056 unsigned int bits_available = BITS_PER_CHAR * nbytes;
3057 char *hold = input_line_pointer;
3059 (void) expression (exp);
3061 if (*input_line_pointer == ':')
3067 unsigned long width;
3069 if (*input_line_pointer != ':')
3071 input_line_pointer = hold;
3073 } /* next piece is not a bitfield */
3075 /* In the general case, we can't allow
3076 full expressions with symbol
3077 differences and such. The relocation
3078 entries for symbols not defined in this
3079 assembly would require arbitrary field
3080 widths, positions, and masks which most
3081 of our current object formats don't
3084 In the specific case where a symbol
3085 *is* defined in this assembly, we
3086 *could* build fixups and track it, but
3087 this could lead to confusion for the
3088 backends. I'm lazy. I'll take any
3089 SEG_ABSOLUTE. I think that means that
3090 you can use a previous .set or
3091 .equ type symbol. xoxorich. */
3093 if (exp->X_op == O_absent)
3095 as_warn ("using a bit field width of zero");
3096 exp->X_add_number = 0;
3097 exp->X_op = O_constant;
3098 } /* implied zero width bitfield */
3100 if (exp->X_op != O_constant)
3102 *input_line_pointer = '\0';
3103 as_bad ("field width \"%s\" too complex for a bitfield", hold);
3104 *input_line_pointer = ':';
3105 demand_empty_rest_of_line ();
3109 if ((width = exp->X_add_number) > (BITS_PER_CHAR * nbytes))
3111 as_warn ("field width %lu too big to fit in %d bytes: truncated to %d bits",
3112 width, nbytes, (BITS_PER_CHAR * nbytes));
3113 width = BITS_PER_CHAR * nbytes;
3116 if (width > bits_available)
3118 /* FIXME-SOMEDAY: backing up and reparsing is wasteful. */
3119 input_line_pointer = hold;
3120 exp->X_add_number = value;
3124 hold = ++input_line_pointer; /* skip ':' */
3126 (void) expression (exp);
3127 if (exp->X_op != O_constant)
3129 char cache = *input_line_pointer;
3131 *input_line_pointer = '\0';
3132 as_bad ("field value \"%s\" too complex for a bitfield", hold);
3133 *input_line_pointer = cache;
3134 demand_empty_rest_of_line ();
3138 value |= ((~(-1 << width) & exp->X_add_number)
3139 << ((BITS_PER_CHAR * nbytes) - bits_available));
3141 if ((bits_available -= width) == 0
3142 || is_it_end_of_statement ()
3143 || *input_line_pointer != ',')
3146 } /* all the bitfields we're gonna get */
3148 hold = ++input_line_pointer;
3149 (void) expression (exp);
3150 } /* forever loop */
3152 exp->X_add_number = value;
3153 exp->X_op = O_constant;
3154 exp->X_unsigned = 1;
3155 } /* if looks like a bitfield */
3156 } /* parse_bitfield_cons() */
3158 #endif /* BITFIELD_CONS_EXPRESSIONS */
3160 /* Handle an MRI style string expression. */
3163 parse_mri_cons (exp, nbytes)
3165 unsigned int nbytes;
3167 if (*input_line_pointer != '\''
3168 && (input_line_pointer[1] != '\''
3169 || (*input_line_pointer != 'A'
3170 && *input_line_pointer != 'E')))
3171 TC_PARSE_CONS_EXPRESSION (exp, nbytes);
3175 unsigned int result = 0;
3177 /* An MRI style string. Cut into as many bytes as will fit into
3178 a nbyte chunk, left justify if necessary, and separate with
3179 commas so we can try again later. */
3180 if (*input_line_pointer == 'A')
3181 ++input_line_pointer;
3182 else if (*input_line_pointer == 'E')
3184 as_bad ("EBCDIC constants are not supported");
3185 ++input_line_pointer;
3188 input_line_pointer++;
3189 for (scan = 0; scan < nbytes; scan++)
3191 if (*input_line_pointer == '\'')
3193 if (input_line_pointer[1] == '\'')
3195 input_line_pointer++;
3200 result = (result << 8) | (*input_line_pointer++);
3204 while (scan < nbytes)
3209 /* Create correct expression */
3210 exp->X_op = O_constant;
3211 exp->X_add_number = result;
3212 /* Fake it so that we can read the next char too */
3213 if (input_line_pointer[0] != '\'' ||
3214 (input_line_pointer[0] == '\'' && input_line_pointer[1] == '\''))
3216 input_line_pointer -= 2;
3217 input_line_pointer[0] = ',';
3218 input_line_pointer[1] = '\'';
3221 input_line_pointer++;
3225 #ifdef REPEAT_CONS_EXPRESSIONS
3227 /* Parse a repeat expression for cons. This is used by the MIPS
3228 assembler. The format is NUMBER:COUNT; NUMBER appears in the
3229 object file COUNT times.
3231 To use this for a target, define REPEAT_CONS_EXPRESSIONS. */
3234 parse_repeat_cons (exp, nbytes)
3236 unsigned int nbytes;
3243 if (*input_line_pointer != ':')
3245 /* No repeat count. */
3249 ++input_line_pointer;
3250 expression (&count);
3251 if (count.X_op != O_constant
3252 || count.X_add_number <= 0)
3254 as_warn ("Unresolvable or nonpositive repeat count; using 1");
3258 /* The cons function is going to output this expression once. So we
3259 output it count - 1 times. */
3260 for (i = count.X_add_number - 1; i > 0; i--)
3261 emit_expr (exp, nbytes);
3264 #endif /* REPEAT_CONS_EXPRESSIONS */
3266 /* Parse a floating point number represented as a hex constant. This
3267 permits users to specify the exact bits they want in the floating
3271 hex_float (float_type, bytes)
3305 as_bad ("Unknown floating type type '%c'", float_type);
3309 /* It would be nice if we could go through expression to parse the
3310 hex constant, but if we get a bignum it's a pain to sort it into
3311 the buffer correctly. */
3313 while (hex_p (*input_line_pointer) || *input_line_pointer == '_')
3317 /* The MRI assembler accepts arbitrary underscores strewn about
3318 through the hex constant, so we ignore them as well. */
3319 if (*input_line_pointer == '_')
3321 ++input_line_pointer;
3327 as_warn ("Floating point constant too large");
3330 d = hex_value (*input_line_pointer) << 4;
3331 ++input_line_pointer;
3332 while (*input_line_pointer == '_')
3333 ++input_line_pointer;
3334 if (hex_p (*input_line_pointer))
3336 d += hex_value (*input_line_pointer);
3337 ++input_line_pointer;
3339 if (target_big_endian)
3342 bytes[length - i - 1] = d;
3348 if (target_big_endian)
3349 memset (bytes + i, 0, length - i);
3351 memset (bytes, 0, length - i);
3360 * CONStruct some more frag chars of .floats .ffloats etc.
3361 * Makes 0 or more new frags.
3362 * If need_pass_2 == 1, no frags are emitted.
3363 * This understands only floating literals, not expressions. Sorry.
3365 * A floating constant is defined by atof_generic(), except it is preceded
3366 * by 0d 0f 0g or 0h. After observing the STRANGE way my BSD AS does its
3367 * reading, I decided to be incompatible. This always tries to give you
3368 * rounded bits to the precision of the pseudo-op. Former AS did premature
3369 * truncatation, restored noisy bits instead of trailing 0s AND gave you
3370 * a choice of 2 flavours of noise according to which of 2 floating-point
3371 * scanners you directed AS to use.
3373 * In: input_line_pointer->whitespace before, or '0' of flonum.
3378 float_cons (float_type)
3379 /* Clobbers input_line-pointer, checks end-of-line. */
3380 register int float_type; /* 'f':.ffloat ... 'F':.float ... */
3383 int length; /* Number of chars in an object. */
3384 register char *err; /* Error from scanning floating literal. */
3385 char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
3387 if (is_it_end_of_statement ())
3389 demand_empty_rest_of_line ();
3395 /* input_line_pointer->1st char of a flonum (we hope!). */
3398 /* Skip any 0{letter} that may be present. Don't even check if the
3399 * letter is legal. Someone may invent a "z" format and this routine
3400 * has no use for such information. Lusers beware: you get
3401 * diagnostics if your input is ill-conditioned.
3403 if (input_line_pointer[0] == '0' && isalpha (input_line_pointer[1]))
3404 input_line_pointer += 2;
3406 /* Accept :xxxx, where the x's are hex digits, for a floating
3407 point with the exact digits specified. */
3408 if (input_line_pointer[0] == ':')
3410 ++input_line_pointer;
3411 length = hex_float (float_type, temp);
3414 ignore_rest_of_line ();
3420 err = md_atof (float_type, temp, &length);
3421 know (length <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
3425 as_bad ("Bad floating literal: %s", err);
3426 ignore_rest_of_line ();
3437 #ifdef REPEAT_CONS_EXPRESSIONS
3438 if (*input_line_pointer == ':')
3440 expressionS count_exp;
3442 ++input_line_pointer;
3443 expression (&count_exp);
3444 if (count_exp.X_op != O_constant
3445 || count_exp.X_add_number <= 0)
3447 as_warn ("unresolvable or nonpositive repeat count; using 1");
3450 count = count_exp.X_add_number;
3454 while (--count >= 0)
3456 p = frag_more (length);
3457 memcpy (p, temp, (unsigned int) length);
3462 while (*input_line_pointer++ == ',');
3464 --input_line_pointer; /* Put terminator back into stream. */
3465 demand_empty_rest_of_line ();
3466 } /* float_cons() */
3471 * We read 0 or more ',' seperated, double-quoted strings.
3473 * Caller should have checked need_pass_2 is FALSE because we don't check it.
3478 stringer (append_zero) /* Worker to do .ascii etc statements. */
3479 /* Checks end-of-line. */
3480 register int append_zero; /* 0: don't append '\0', else 1 */
3482 register unsigned int c;
3484 #ifdef md_flush_pending_output
3485 md_flush_pending_output ();
3489 * The following awkward logic is to parse ZERO or more strings,
3490 * comma seperated. Recall a string expression includes spaces
3491 * before the opening '\"' and spaces after the closing '\"'.
3492 * We fake a leading ',' if there is (supposed to be)
3493 * a 1st, expression. We keep demanding expressions for each
3496 if (is_it_end_of_statement ())
3498 c = 0; /* Skip loop. */
3499 ++input_line_pointer; /* Compensate for end of loop. */
3503 c = ','; /* Do loop. */
3505 while (c == ',' || c == '<' || c == '"')
3508 switch (*input_line_pointer)
3511 ++input_line_pointer; /*->1st char of string. */
3512 while (is_a_char (c = next_char_of_string ()))
3514 FRAG_APPEND_1_CHAR (c);
3518 FRAG_APPEND_1_CHAR (0);
3520 know (input_line_pointer[-1] == '\"');
3523 input_line_pointer++;
3524 c = get_single_number ();
3525 FRAG_APPEND_1_CHAR (c);
3526 if (*input_line_pointer != '>')
3528 as_bad ("Expected <nn>");
3530 input_line_pointer++;
3533 input_line_pointer++;
3537 c = *input_line_pointer;
3540 demand_empty_rest_of_line ();
3543 /* FIXME-SOMEDAY: I had trouble here on characters with the
3544 high bits set. We'll probably also have trouble with
3545 multibyte chars, wide chars, etc. Also be careful about
3546 returning values bigger than 1 byte. xoxorich. */
3549 next_char_of_string ()
3551 register unsigned int c;
3553 c = *input_line_pointer++ & CHAR_MASK;
3560 #ifndef NO_STRING_ESCAPES
3562 switch (c = *input_line_pointer++)
3590 break; /* As itself. */
3606 for (i = 0, number = 0; isdigit (c) && i < 3; c = *input_line_pointer++, i++)
3608 number = number * 8 + c - '0';
3612 --input_line_pointer;
3621 c = *input_line_pointer++;
3622 while (isxdigit (c))
3625 number = number * 16 + c - '0';
3626 else if (isupper (c))
3627 number = number * 16 + c - 'A' + 10;
3629 number = number * 16 + c - 'a' + 10;
3630 c = *input_line_pointer++;
3633 --input_line_pointer;
3638 /* To be compatible with BSD 4.2 as: give the luser a linefeed!! */
3639 as_warn ("Unterminated string: Newline inserted.");
3645 #ifdef ONLY_STANDARD_ESCAPES
3646 as_bad ("Bad escaped character in string, '?' assumed");
3648 #endif /* ONLY_STANDARD_ESCAPES */
3651 } /* switch on escaped char */
3653 #endif /* ! defined (NO_STRING_ESCAPES) */
3657 } /* switch on char */
3659 } /* next_char_of_string() */
3662 get_segmented_expression (expP)
3663 register expressionS *expP;
3665 register segT retval;
3667 retval = expression (expP);
3668 if (expP->X_op == O_illegal
3669 || expP->X_op == O_absent
3670 || expP->X_op == O_big)
3672 as_bad ("expected address expression; zero assumed");
3673 expP->X_op = O_constant;
3674 expP->X_add_number = 0;
3675 retval = absolute_section;
3681 get_known_segmented_expression (expP)
3682 register expressionS *expP;
3684 register segT retval;
3686 if ((retval = get_segmented_expression (expP)) == undefined_section)
3688 /* There is no easy way to extract the undefined symbol from the
3690 if (expP->X_add_symbol != NULL
3691 && S_GET_SEGMENT (expP->X_add_symbol) != expr_section)
3692 as_warn ("symbol \"%s\" undefined; zero assumed",
3693 S_GET_NAME (expP->X_add_symbol));
3695 as_warn ("some symbol undefined; zero assumed");
3696 retval = absolute_section;
3697 expP->X_op = O_constant;
3698 expP->X_add_number = 0;
3700 know (retval == absolute_section || SEG_NORMAL (retval));
3702 } /* get_known_segmented_expression() */
3705 get_absolute_expression ()
3710 if (exp.X_op != O_constant)
3712 if (exp.X_op != O_absent)
3713 as_bad ("bad or irreducible absolute expression; zero assumed");
3714 exp.X_add_number = 0;
3716 return exp.X_add_number;
3719 char /* return terminator */
3720 get_absolute_expression_and_terminator (val_pointer)
3721 long *val_pointer; /* return value of expression */
3723 /* FIXME: val_pointer should probably be offsetT *. */
3724 *val_pointer = (long) get_absolute_expression ();
3725 return (*input_line_pointer++);
3729 * demand_copy_C_string()
3731 * Like demand_copy_string, but return NULL if the string contains any '\0's.
3732 * Give a warning if that happens.
3735 demand_copy_C_string (len_pointer)
3740 if ((s = demand_copy_string (len_pointer)) != 0)
3744 for (len = *len_pointer; len > 0; len--)
3751 as_bad ("This string may not contain \'\\0\'");
3759 * demand_copy_string()
3761 * Demand string, but return a safe (=private) copy of the string.
3762 * Return NULL if we can't read a string here.
3765 demand_copy_string (lenP)
3768 register unsigned int c;
3774 if (*input_line_pointer == '\"')
3776 input_line_pointer++; /* Skip opening quote. */
3778 while (is_a_char (c = next_char_of_string ()))
3780 obstack_1grow (¬es, c);
3783 /* JF this next line is so demand_copy_C_string will return a
3784 null terminated string. */
3785 obstack_1grow (¬es, '\0');
3786 retval = obstack_finish (¬es);
3790 as_warn ("Missing string");
3792 ignore_rest_of_line ();
3796 } /* demand_copy_string() */
3799 * is_it_end_of_statement()
3801 * In: Input_line_pointer->next character.
3803 * Do: Skip input_line_pointer over all whitespace.
3805 * Out: 1 if input_line_pointer->end-of-line.
3808 is_it_end_of_statement ()
3811 return (is_end_of_line[(unsigned char) *input_line_pointer]);
3812 } /* is_it_end_of_statement() */
3818 register symbolS *symbolP; /* symbol we are working with */
3822 input_line_pointer++;
3823 if (*input_line_pointer == '=')
3824 input_line_pointer++;
3826 while (*input_line_pointer == ' ' || *input_line_pointer == '\t')
3827 input_line_pointer++;
3830 stop = mri_comment_field (&stopc);
3832 if (sym_name[0] == '.' && sym_name[1] == '\0')
3834 /* Turn '. = mumble' into a .org mumble */
3835 register segT segment;
3838 segment = get_known_segmented_expression (&exp);
3840 do_org (segment, &exp, 0);
3844 symbolP = symbol_find_or_make (sym_name);
3845 pseudo_set (symbolP);
3849 mri_comment_end (stop, stopc);
3852 /* .include -- include a file at this point. */
3865 if (! flag_m68k_mri)
3866 filename = demand_copy_string (&i);
3871 while (! is_end_of_line[(unsigned char) *input_line_pointer]
3872 && *input_line_pointer != ' '
3873 && *input_line_pointer != '\t')
3875 obstack_1grow (¬es, *input_line_pointer);
3876 ++input_line_pointer;
3879 obstack_1grow (¬es, '\0');
3880 filename = obstack_finish (¬es);
3881 while (! is_end_of_line[(unsigned char) *input_line_pointer])
3882 ++input_line_pointer;
3884 demand_empty_rest_of_line ();
3885 path = xmalloc ((unsigned long) i + include_dir_maxlen + 5 /* slop */ );
3886 for (i = 0; i < include_dir_count; i++)
3888 strcpy (path, include_dirs[i]);
3890 strcat (path, filename);
3891 if (0 != (try = fopen (path, "r")))
3900 /* malloc Storage leak when file is found on path. FIXME-SOMEDAY. */
3901 newbuf = input_scrub_include_file (path, input_line_pointer);
3902 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
3906 add_include_dir (path)
3911 if (include_dir_count == 0)
3913 include_dirs = (char **) xmalloc (2 * sizeof (*include_dirs));
3914 include_dirs[0] = "."; /* Current dir */
3915 include_dir_count = 2;
3919 include_dir_count++;
3920 include_dirs = (char **) realloc (include_dirs,
3921 include_dir_count * sizeof (*include_dirs));
3924 include_dirs[include_dir_count - 1] = path; /* New one */
3927 if (i > include_dir_maxlen)
3928 include_dir_maxlen = i;
3929 } /* add_include_dir() */
3935 while (!is_end_of_line[(unsigned char) *input_line_pointer])
3937 ++input_line_pointer;
3939 ++input_line_pointer;
3944 read_print_statistics (file)
3947 hash_print_statistics (file, "pseudo-op table", po_hash);