* read.c (s_include): In MRI mode, don't expect quotes around the
[binutils-gdb.git] / gas / read.c
1 /* read.c - read a source file -
2 Copyright (C) 1986, 1987, 1990, 1991, 1993, 1994
3 Free Software Foundation, Inc.
4
5 This file is part of GAS, the GNU Assembler.
6
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.
11
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.
16
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. */
20
21 #if 0
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.)
26 */
27 #else
28 #define MASK_CHAR ((int)(unsigned char)-1)
29 #endif
30
31
32 /* This is the largest known floating point format (for now). It will
33 grow when we do 4361 style flonums. */
34
35 #define MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT (16)
36
37 /* Routines that read assembler source text to build spagetti in memory.
38 Another group of these functions is in the expr.c module. */
39
40 /* for isdigit() */
41 #include <ctype.h>
42
43 #include "as.h"
44 #include "subsegs.h"
45 #include "libiberty.h"
46 #include "obstack.h"
47 #include "listing.h"
48
49 #ifndef TC_START_LABEL
50 #define TC_START_LABEL(x,y) (x==':')
51 #endif
52
53 /* The NOP_OPCODE is for the alignment fill value.
54 * fill it a nop instruction so that the disassembler does not choke
55 * on it
56 */
57 #ifndef NOP_OPCODE
58 #define NOP_OPCODE 0x00
59 #endif
60
61 char *input_line_pointer; /*->next char of source file to parse. */
62
63 int generate_asm_lineno = 0; /* flag to generate line stab for .s file */
64
65 #if BITS_PER_CHAR != 8
66 /* The following table is indexed by[(char)] and will break if
67 a char does not have exactly 256 states (hopefully 0:255!)! */
68 die horribly;
69 #endif
70
71 #ifndef LEX_AT
72 /* The m88k unfortunately uses @ as a label beginner. */
73 #define LEX_AT 0
74 #endif
75
76 #ifndef LEX_BR
77 /* The RS/6000 assembler uses {,},[,] as parts of symbol names. */
78 #define LEX_BR 0
79 #endif
80
81 #ifndef LEX_PCT
82 /* The Delta 68k assembler permits % inside label names. */
83 #define LEX_PCT 0
84 #endif
85
86 /* used by is_... macros. our ctype[] */
87 char lex_type[256] =
88 {
89 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* @ABCDEFGHIJKLMNO */
90 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ[\]^_ */
91 0, 0, 0, 0, 3, LEX_PCT, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* _!"#$%&'()*+,-./ */
92 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 0123456789:;<=>? */
93 LEX_AT, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* @ABCDEFGHIJKLMNO */
94 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, 0, 3, /* PQRSTUVWXYZ[\]^_ */
95 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* `abcdefghijklmno */
96 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, 0, 0, /* pqrstuvwxyz{|}~. */
97 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
98 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
99 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
100 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
101 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
102 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
103 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
104 };
105
106
107 /*
108 * In: a character.
109 * Out: 1 if this character ends a line.
110 */
111 #define _ (0)
112 char is_end_of_line[256] =
113 {
114 #ifdef CR_EOL
115 _, _, _, _, _, _, _, _, _, _, 99, _, _, 99, _, _, /* @abcdefghijklmno */
116 #else
117 _, _, _, _, _, _, _, _, _, _, 99, _, _, _, _, _, /* @abcdefghijklmno */
118 #endif
119 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
120 #ifdef TC_HPPA
121 _,99, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* _!"#$%&'()*+,-./ */
122 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* 0123456789:;<=>? */
123 #else
124 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
125 _, _, _, _, _, _, _, _, _, _, _, 99, _, _, _, _, /* 0123456789:;<=>? */
126 #endif
127 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
128 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
129 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
130 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
131 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
132 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
133 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
134 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
135 _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */
136 };
137 #undef _
138
139 /* Functions private to this file. */
140
141 static char *buffer; /* 1st char of each buffer of lines is here. */
142 static char *buffer_limit; /*->1 + last char in buffer. */
143
144 #ifdef TARGET_BYTES_BIG_ENDIAN
145 /* Hack to deal with tc-*.h defining TARGET_BYTES_BIG_ENDIAN to empty
146 instead of to 0 or 1. */
147 #if 5 - TARGET_BYTES_BIG_ENDIAN - 5 == 10
148 #undef TARGET_BYTES_BIG_ENDIAN
149 #define TARGET_BYTES_BIG_ENDIAN 1
150 #endif
151 int target_big_endian = TARGET_BYTES_BIG_ENDIAN;
152 #else
153 int target_big_endian /* = 0 */;
154 #endif
155
156 static char *old_buffer; /* JF a hack */
157 static char *old_input;
158 static char *old_limit;
159
160 /* Variables for handling include file directory list. */
161
162 char **include_dirs; /* List of pointers to directories to
163 search for .include's */
164 int include_dir_count; /* How many are in the list */
165 int include_dir_maxlen = 1;/* Length of longest in list */
166
167 #ifndef WORKING_DOT_WORD
168 struct broken_word *broken_words;
169 int new_broken_words;
170 #endif
171
172 /* The current offset into the absolute section. We don't try to
173 build frags in the absolute section, since no data can be stored
174 there. We just keep track of the current offset. */
175 addressT abs_section_offset;
176
177 /* If this line had an MRI style label, it is stored in this variable.
178 This is used by some of the MRI pseudo-ops. */
179 symbolS *mri_line_label;
180
181 /* This global variable is used to support MRI common sections. We
182 translate such sections into a common symbol. This variable is
183 non-NULL when we are in an MRI common section. */
184 symbolS *mri_common_symbol;
185
186 /* In MRI mode, after a dc.b pseudo-op with an odd number of bytes, we
187 need to align to an even byte boundary unless the next pseudo-op is
188 dc.b, ds.b, or dcb.b. This variable is set to 1 if an alignment
189 may be needed. */
190 static int mri_pending_align;
191
192 static void do_align PARAMS ((int, char *));
193 static int hex_float PARAMS ((int, char *));
194 static void do_org PARAMS ((segT, expressionS *, int));
195 char *demand_copy_string PARAMS ((int *lenP));
196 int is_it_end_of_statement PARAMS ((void));
197 static segT get_segmented_expression PARAMS ((expressionS *expP));
198 static segT get_known_segmented_expression PARAMS ((expressionS * expP));
199 static void pobegin PARAMS ((void));
200 \f
201
202 void
203 read_begin ()
204 {
205 const char *p;
206
207 pobegin ();
208 obj_read_begin_hook ();
209
210 /* Something close -- but not too close -- to a multiple of 1024.
211 The debugging malloc I'm using has 24 bytes of overhead. */
212 obstack_begin (&notes, 5090);
213 obstack_begin (&cond_obstack, 990);
214
215 /* Use machine dependent syntax */
216 for (p = line_separator_chars; *p; p++)
217 is_end_of_line[(unsigned char) *p] = 1;
218 /* Use more. FIXME-SOMEDAY. */
219
220 if (flag_mri)
221 lex_type['?'] = 3;
222 }
223 \f
224 /* set up pseudo-op tables */
225
226 static struct hash_control *po_hash;
227
228 static const pseudo_typeS potable[] =
229 {
230 {"abort", s_abort, 0},
231 {"align", s_align_ptwo, 0},
232 {"ascii", stringer, 0},
233 {"asciz", stringer, 1},
234 {"balign", s_align_bytes, 0},
235 /* block */
236 {"byte", cons, 1},
237 {"comm", s_comm, 0},
238 {"common", s_mri_common, 0},
239 {"common.s", s_mri_common, 1},
240 {"data", s_data, 0},
241 {"dc", cons, 2},
242 {"dc.b", cons, 1},
243 {"dc.d", float_cons, 'd'},
244 {"dc.l", cons, 4},
245 {"dc.s", float_cons, 'f'},
246 {"dc.w", cons, 2},
247 {"dc.x", float_cons, 'x'},
248 {"dcb", s_space, 2},
249 {"dcb.b", s_space, 1},
250 {"dcb.d", s_float_space, 'd'},
251 {"dcb.l", s_space, 4},
252 {"dcb.s", s_float_space, 'f'},
253 {"dcb.w", s_space, 2},
254 {"dcb.x", s_float_space, 'x'},
255 {"ds", s_space, 2},
256 {"ds.b", s_space, 1},
257 {"ds.d", s_space, 8},
258 {"ds.l", s_space, 4},
259 {"ds.p", s_space, 12},
260 {"ds.s", s_space, 4},
261 {"ds.w", s_space, 2},
262 {"ds.x", s_space, 12},
263 #ifdef S_SET_DESC
264 {"desc", s_desc, 0},
265 #endif
266 /* dim */
267 {"double", float_cons, 'd'},
268 /* dsect */
269 {"eject", listing_eject, 0}, /* Formfeed listing */
270 {"else", s_else, 0},
271 {"elsec", s_else, 0},
272 {"end", s_end, 0},
273 {"endc", s_endif, 0},
274 {"endif", s_endif, 0},
275 /* endef */
276 {"equ", s_set, 0},
277 /* err */
278 /* extend */
279 {"extern", s_ignore, 0}, /* We treat all undef as ext */
280 {"appfile", s_app_file, 1},
281 {"appline", s_app_line, 0},
282 {"fail", s_fail, 0},
283 {"file", s_app_file, 0},
284 {"fill", s_fill, 0},
285 {"float", float_cons, 'f'},
286 {"format", s_ignore, 0},
287 {"global", s_globl, 0},
288 {"globl", s_globl, 0},
289 {"hword", cons, 2},
290 {"if", s_if, (int) O_ne},
291 {"ifdef", s_ifdef, 0},
292 {"ifeq", s_if, (int) O_eq},
293 {"ifeqs", s_ifeqs, 0},
294 {"ifge", s_if, (int) O_ge},
295 {"ifgt", s_if, (int) O_gt},
296 {"ifle", s_if, (int) O_le},
297 {"iflt", s_if, (int) O_lt},
298 {"ifndef", s_ifdef, 1},
299 {"ifne", s_if, (int) O_ne},
300 {"ifnes", s_ifeqs, 1},
301 {"ifnotdef", s_ifdef, 1},
302 {"include", s_include, 0},
303 {"int", cons, 4},
304 {"lcomm", s_lcomm, 0},
305 {"lflags", listing_flags, 0}, /* Listing flags */
306 {"list", listing_list, 1}, /* Turn listing on */
307 {"llen", listing_psize, 1},
308 {"long", cons, 4},
309 {"lsym", s_lsym, 0},
310 {"noformat", s_ignore, 0},
311 {"nolist", listing_list, 0}, /* Turn listing off */
312 {"nopage", listing_nopage, 0},
313 {"octa", cons, 16},
314 {"offset", s_struct, 0},
315 {"org", s_org, 0},
316 {"p2align", s_align_ptwo, 0},
317 {"page", listing_eject, 0},
318 {"plen", listing_psize, 0},
319 {"psize", listing_psize, 0}, /* set paper size */
320 /* print */
321 {"quad", cons, 8},
322 {"sbttl", listing_title, 1}, /* Subtitle of listing */
323 /* scl */
324 /* sect */
325 {"set", s_set, 0},
326 {"short", cons, 2},
327 {"single", float_cons, 'f'},
328 /* size */
329 {"space", s_space, 0},
330 {"spc", s_ignore, 0},
331 {"stabd", s_stab, 'd'},
332 {"stabn", s_stab, 'n'},
333 {"stabs", s_stab, 's'},
334 {"string", stringer, 1},
335 {"struct", s_struct, 0},
336 /* tag */
337 {"text", s_text, 0},
338
339 /* This is for gcc to use. It's only just been added (2/94), so gcc
340 won't be able to use it for a while -- probably a year or more.
341 But once this has been released, check with gcc maintainers
342 before deleting it or even changing the spelling. */
343 {"this_GCC_requires_the_GNU_assembler", s_ignore, 0},
344 /* If we're folding case -- done for some targets, not necessarily
345 all -- the above string in an input file will be converted to
346 this one. Match it either way... */
347 {"this_gcc_requires_the_gnu_assembler", s_ignore, 0},
348
349 {"title", listing_title, 0}, /* Listing title */
350 {"ttl", listing_title, 0},
351 /* type */
352 /* use */
353 /* val */
354 {"xcom", s_comm, 0},
355 {"xdef", s_globl, 0},
356 {"xref", s_ignore, 0},
357 {"xstabs", s_xstab, 's'},
358 {"word", cons, 2},
359 {"zero", s_space, 0},
360 {NULL} /* end sentinel */
361 };
362
363 static int pop_override_ok = 0;
364 static const char *pop_table_name;
365
366 void
367 pop_insert (table)
368 const pseudo_typeS *table;
369 {
370 const char *errtxt;
371 const pseudo_typeS *pop;
372 for (pop = table; pop->poc_name; pop++)
373 {
374 errtxt = hash_insert (po_hash, pop->poc_name, (char *) pop);
375 if (errtxt && (!pop_override_ok || strcmp (errtxt, "exists")))
376 as_fatal ("error constructing %s pseudo-op table", pop_table_name);
377 }
378 }
379
380 #ifndef md_pop_insert
381 #define md_pop_insert() pop_insert(md_pseudo_table)
382 #endif
383
384 #ifndef obj_pop_insert
385 #define obj_pop_insert() pop_insert(obj_pseudo_table)
386 #endif
387
388 static void
389 pobegin ()
390 {
391 po_hash = hash_new ();
392
393 /* Do the target-specific pseudo ops. */
394 pop_table_name = "md";
395 md_pop_insert ();
396
397 /* Now object specific. Skip any that were in the target table. */
398 pop_table_name = "obj";
399 pop_override_ok = 1;
400 obj_pop_insert ();
401
402 /* Now portable ones. Skip any that we've seen already. */
403 pop_table_name = "standard";
404 pop_insert (potable);
405 }
406 \f
407 #define HANDLE_CONDITIONAL_ASSEMBLY() \
408 if (ignore_input ()) \
409 { \
410 while (! is_end_of_line[(unsigned char) *input_line_pointer++]) \
411 if (input_line_pointer == buffer_limit) \
412 break; \
413 continue; \
414 }
415
416
417 /* read_a_source_file()
418 *
419 * We read the file, putting things into a web that
420 * represents what we have been reading.
421 */
422 void
423 read_a_source_file (name)
424 char *name;
425 {
426 register char c;
427 register char *s; /* string of symbol, '\0' appended */
428 register int temp;
429 pseudo_typeS *pop;
430
431 buffer = input_scrub_new_file (name);
432
433 listing_file (name);
434 listing_newline ("");
435
436 while ((buffer_limit = input_scrub_next_buffer (&input_line_pointer)) != 0)
437 { /* We have another line to parse. */
438 know (buffer_limit[-1] == '\n'); /* Must have a sentinel. */
439 contin: /* JF this goto is my fault I admit it.
440 Someone brave please re-write the whole
441 input section here? Pleeze??? */
442 while (input_line_pointer < buffer_limit)
443 {
444 /* We have more of this buffer to parse. */
445
446 /*
447 * We now have input_line_pointer->1st char of next line.
448 * If input_line_pointer [-1] == '\n' then we just
449 * scanned another line: so bump line counters.
450 */
451 if (is_end_of_line[(unsigned char) input_line_pointer[-1]])
452 {
453 #ifdef md_start_line_hook
454 md_start_line_hook ();
455 #endif
456
457 if (input_line_pointer[-1] == '\n')
458 bump_line_counters ();
459
460 if (flag_mri
461 #ifdef LABELS_WITHOUT_COLONS
462 || 1
463 #endif
464 )
465 {
466 mri_line_label = NULL;
467
468 /* Text at the start of a line must be a label, we
469 run down and stick a colon in. */
470 if (is_name_beginner (*input_line_pointer))
471 {
472 char *line_start = input_line_pointer;
473 char c = get_symbol_end ();
474
475 if (! ignore_input ())
476 {
477 /* In MRI mode, the EQU pseudoop must be
478 handled specially. */
479 if (flag_mri)
480 {
481 if (((strncasecmp (input_line_pointer + 1,
482 "EQU", 3) == 0)
483 || (strncasecmp (input_line_pointer + 1,
484 "SET", 3) == 0))
485 && (input_line_pointer[4] == ' '
486 || input_line_pointer[4] == '\t'))
487 {
488 input_line_pointer += 4;
489 equals (line_start);
490 continue;
491 }
492 }
493
494 mri_line_label = colon (line_start);
495 }
496
497 *input_line_pointer = c;
498 if (c == ':')
499 input_line_pointer++;
500 }
501 }
502 }
503
504 /*
505 * We are at the begining of a line, or similar place.
506 * We expect a well-formed assembler statement.
507 * A "symbol-name:" is a statement.
508 *
509 * Depending on what compiler is used, the order of these tests
510 * may vary to catch most common case 1st.
511 * Each test is independent of all other tests at the (top) level.
512 * PLEASE make a compiler that doesn't use this assembler.
513 * It is crufty to waste a compiler's time encoding things for this
514 * assembler, which then wastes more time decoding it.
515 * (And communicating via (linear) files is silly!
516 * If you must pass stuff, please pass a tree!)
517 */
518 if ((c = *input_line_pointer++) == '\t'
519 || c == ' '
520 || c == '\f'
521 || c == 0)
522 {
523 c = *input_line_pointer++;
524 }
525 know (c != ' '); /* No further leading whitespace. */
526 LISTING_NEWLINE ();
527 /*
528 * C is the 1st significant character.
529 * Input_line_pointer points after that character.
530 */
531 if (is_name_beginner (c))
532 {
533 /* want user-defined label or pseudo/opcode */
534 HANDLE_CONDITIONAL_ASSEMBLY ();
535
536 s = --input_line_pointer;
537 c = get_symbol_end (); /* name's delimiter */
538 /*
539 * C is character after symbol.
540 * That character's place in the input line is now '\0'.
541 * S points to the beginning of the symbol.
542 * [In case of pseudo-op, s->'.'.]
543 * Input_line_pointer->'\0' where c was.
544 */
545 if (TC_START_LABEL(c, input_line_pointer))
546 {
547 colon (s); /* user-defined label */
548 *input_line_pointer++ = ':'; /* Put ':' back for error messages' sake. */
549 /* Input_line_pointer->after ':'. */
550 SKIP_WHITESPACE ();
551
552
553 }
554 else if (c == '='
555 || (input_line_pointer[1] == '='
556 #ifdef TC_EQUAL_IN_INSN
557 && ! TC_EQUAL_IN_INSN (c, input_line_pointer)
558 #endif
559 ))
560 {
561 equals (s);
562 demand_empty_rest_of_line ();
563 }
564 else
565 { /* expect pseudo-op or machine instruction */
566 pop = NULL;
567
568 #define IGNORE_OPCODE_CASE
569 #ifdef IGNORE_OPCODE_CASE
570 {
571 char *s2 = s;
572 while (*s2)
573 {
574 if (isupper (*s2))
575 *s2 = tolower (*s2);
576 s2++;
577 }
578 }
579 #endif
580
581 if (flag_mri
582 #ifdef NO_PSEUDO_DOT
583 || 1
584 #endif
585 )
586 {
587 /* The MRI assembler and the m88k use pseudo-ops
588 without a period. */
589 pop = (pseudo_typeS *) hash_find (po_hash, s);
590 if (pop != NULL && pop->poc_handler == NULL)
591 pop = NULL;
592 }
593
594 if (pop != NULL || *s == '.')
595 {
596 /*
597 * PSEUDO - OP.
598 *
599 * WARNING: c has next char, which may be end-of-line.
600 * We lookup the pseudo-op table with s+1 because we
601 * already know that the pseudo-op begins with a '.'.
602 */
603
604 if (pop == NULL)
605 pop = (pseudo_typeS *) hash_find (po_hash, s + 1);
606
607 /* In MRI mode, we may need to insert an
608 automatic alignment directive. What a hack
609 this is. */
610 if (mri_pending_align
611 && (pop == NULL
612 || ! ((pop->poc_handler == cons
613 && pop->poc_val == 1)
614 || (pop->poc_handler == s_space
615 && pop->poc_val == 1))))
616 {
617 do_align (1, (char *) NULL);
618 mri_pending_align = 0;
619 }
620
621 /* Print the error msg now, while we still can */
622 if (pop == NULL)
623 {
624 as_bad ("Unknown pseudo-op: `%s'", s);
625 *input_line_pointer = c;
626 s_ignore (0);
627 continue;
628 }
629
630 /* Put it back for error messages etc. */
631 *input_line_pointer = c;
632 /* The following skip of whitespace is compulsory.
633 A well shaped space is sometimes all that separates
634 keyword from operands. */
635 if (c == ' ' || c == '\t')
636 input_line_pointer++;
637 /*
638 * Input_line is restored.
639 * Input_line_pointer->1st non-blank char
640 * after pseudo-operation.
641 */
642 (*pop->poc_handler) (pop->poc_val);
643
644 /* If that was .end, just get out now. */
645 if (pop->poc_handler == s_end)
646 goto quit;
647 }
648 else
649 { /* machine instruction */
650 if (mri_pending_align)
651 {
652 do_align (1, (char *) NULL);
653 mri_pending_align = 0;
654 }
655
656 /* WARNING: c has char, which may be end-of-line. */
657 /* Also: input_line_pointer->`\0` where c was. */
658 *input_line_pointer = c;
659 while (!is_end_of_line[(unsigned char) *input_line_pointer]
660 #ifdef TC_EOL_IN_INSN
661 || TC_EOL_IN_INSN (input_line_pointer)
662 #endif
663 )
664 {
665 input_line_pointer++;
666 }
667
668 c = *input_line_pointer;
669 *input_line_pointer = '\0';
670
671 #ifdef OBJ_GENERATE_ASM_LINENO
672 if (generate_asm_lineno == 0)
673 {
674 if (ecoff_no_current_file ())
675 generate_asm_lineno = 1;
676 }
677 if (generate_asm_lineno == 1)
678 {
679 unsigned int lineno;
680 char *s;
681
682 as_where (&s, &lineno);
683 OBJ_GENERATE_ASM_LINENO (s, lineno);
684 }
685 #endif
686
687 md_assemble (s); /* Assemble 1 instruction. */
688
689 *input_line_pointer++ = c;
690
691 /* We resume loop AFTER the end-of-line from
692 this instruction. */
693 } /* if (*s=='.') */
694 } /* if c==':' */
695 continue;
696 } /* if (is_name_beginner(c) */
697
698
699 /* Empty statement? */
700 if (is_end_of_line[(unsigned char) c])
701 continue;
702
703 if ((LOCAL_LABELS_DOLLAR || LOCAL_LABELS_FB)
704 && isdigit (c))
705 {
706 /* local label ("4:") */
707 char *backup = input_line_pointer;
708
709 HANDLE_CONDITIONAL_ASSEMBLY ();
710
711 temp = c - '0';
712
713 while (isdigit (*input_line_pointer))
714 {
715 temp = (temp * 10) + *input_line_pointer - '0';
716 ++input_line_pointer;
717 } /* read the whole number */
718
719 if (LOCAL_LABELS_DOLLAR
720 && *input_line_pointer == '$'
721 && *(input_line_pointer + 1) == ':')
722 {
723 input_line_pointer += 2;
724
725 if (dollar_label_defined (temp))
726 {
727 as_fatal ("label \"%d$\" redefined", temp);
728 }
729
730 define_dollar_label (temp);
731 colon (dollar_label_name (temp, 0));
732 continue;
733 }
734
735 if (LOCAL_LABELS_FB
736 && *input_line_pointer++ == ':')
737 {
738 fb_label_instance_inc (temp);
739 colon (fb_label_name (temp, 0));
740 continue;
741 }
742
743 input_line_pointer = backup;
744 } /* local label ("4:") */
745
746 if (c && strchr (line_comment_chars, c))
747 { /* Its a comment. Better say APP or NO_APP */
748 char *ends;
749 char *new_buf;
750 char *new_tmp;
751 unsigned int new_length;
752 char *tmp_buf = 0;
753 extern char *scrub_string, *scrub_last_string;
754
755 bump_line_counters ();
756 s = input_line_pointer;
757 if (strncmp (s, "APP\n", 4))
758 continue; /* We ignore it */
759 s += 4;
760
761 ends = strstr (s, "#NO_APP\n");
762
763 if (!ends)
764 {
765 unsigned int tmp_len;
766 unsigned int num;
767
768 /* The end of the #APP wasn't in this buffer. We
769 keep reading in buffers until we find the #NO_APP
770 that goes with this #APP There is one. The specs
771 guarentee it. . . */
772 tmp_len = buffer_limit - s;
773 tmp_buf = xmalloc (tmp_len + 1);
774 memcpy (tmp_buf, s, tmp_len);
775 do
776 {
777 new_tmp = input_scrub_next_buffer (&buffer);
778 if (!new_tmp)
779 break;
780 else
781 buffer_limit = new_tmp;
782 input_line_pointer = buffer;
783 ends = strstr (buffer, "#NO_APP\n");
784 if (ends)
785 num = ends - buffer;
786 else
787 num = buffer_limit - buffer;
788
789 tmp_buf = xrealloc (tmp_buf, tmp_len + num);
790 memcpy (tmp_buf + tmp_len, buffer, num);
791 tmp_len += num;
792 }
793 while (!ends);
794
795 input_line_pointer = ends ? ends + 8 : NULL;
796
797 s = tmp_buf;
798 ends = s + tmp_len;
799
800 }
801 else
802 {
803 input_line_pointer = ends + 8;
804 }
805 new_buf = xmalloc (100);
806 new_length = 100;
807 new_tmp = new_buf;
808
809 scrub_string = s;
810 scrub_last_string = ends;
811 for (;;)
812 {
813 int ch;
814
815 ch = do_scrub_next_char (scrub_from_string, scrub_to_string);
816 if (ch == EOF)
817 break;
818 *new_tmp++ = ch;
819 if (new_tmp == new_buf + new_length)
820 {
821 new_buf = xrealloc (new_buf, new_length + 100);
822 new_tmp = new_buf + new_length;
823 new_length += 100;
824 }
825 }
826
827 if (tmp_buf)
828 free (tmp_buf);
829 old_buffer = buffer;
830 old_input = input_line_pointer;
831 old_limit = buffer_limit;
832 buffer = new_buf;
833 input_line_pointer = new_buf;
834 buffer_limit = new_tmp;
835 continue;
836 }
837
838 HANDLE_CONDITIONAL_ASSEMBLY ();
839
840 /* as_warn("Junk character %d.",c); Now done by ignore_rest */
841 input_line_pointer--; /* Report unknown char as ignored. */
842 ignore_rest_of_line ();
843 } /* while (input_line_pointer<buffer_limit) */
844
845 #ifdef md_after_pass_hook
846 md_after_pass_hook ();
847 #endif
848
849 if (old_buffer)
850 {
851 bump_line_counters ();
852 if (old_input != 0)
853 {
854 buffer = old_buffer;
855 input_line_pointer = old_input;
856 buffer_limit = old_limit;
857 old_buffer = 0;
858 goto contin;
859 }
860 }
861 } /* while (more buffers to scan) */
862
863 quit:
864 input_scrub_close (); /* Close the input file */
865 }
866
867 void
868 s_abort (ignore)
869 int ignore;
870 {
871 as_fatal (".abort detected. Abandoning ship.");
872 }
873
874 /* Guts of .align directive. */
875 static void
876 do_align (n, fill)
877 int n;
878 char *fill;
879 {
880 #ifdef md_do_align
881 md_do_align (n, fill, just_record_alignment);
882 #endif
883 if (!fill)
884 {
885 /* @@ Fix this right for BFD! */
886 static char zero;
887 static char nop_opcode = NOP_OPCODE;
888
889 if (now_seg != data_section && now_seg != bss_section)
890 {
891 fill = &nop_opcode;
892 }
893 else
894 {
895 fill = &zero;
896 }
897 }
898 /* Only make a frag if we HAVE to. . . */
899 if (n && !need_pass_2)
900 frag_align (n, *fill);
901
902 #ifdef md_do_align
903 just_record_alignment:
904 #endif
905
906 record_alignment (now_seg, n);
907 }
908
909 /* For machines where ".align 4" means align to a 4 byte boundary. */
910 void
911 s_align_bytes (arg)
912 int arg;
913 {
914 register unsigned int temp;
915 char temp_fill;
916 unsigned int i = 0;
917 unsigned long max_alignment = 1 << 15;
918
919 if (is_end_of_line[(unsigned char) *input_line_pointer])
920 temp = arg; /* Default value from pseudo-op table */
921 else
922 temp = get_absolute_expression ();
923
924 if (temp > max_alignment)
925 {
926 as_bad ("Alignment too large: %d. assumed.", temp = max_alignment);
927 }
928
929 /* For the sparc, `.align (1<<n)' actually means `.align n' so we
930 have to convert it. */
931 if (temp != 0)
932 {
933 for (i = 0; (temp & 1) == 0; temp >>= 1, ++i)
934 ;
935 }
936 if (temp != 1)
937 as_bad ("Alignment not a power of 2");
938
939 temp = i;
940 if (*input_line_pointer == ',')
941 {
942 input_line_pointer++;
943 temp_fill = get_absolute_expression ();
944 do_align (temp, &temp_fill);
945 }
946 else
947 do_align (temp, (char *) 0);
948
949 demand_empty_rest_of_line ();
950 }
951
952 /* For machines where ".align 4" means align to 2**4 boundary. */
953 void
954 s_align_ptwo (ignore)
955 int ignore;
956 {
957 register int temp;
958 char temp_fill;
959 long max_alignment = 15;
960
961 temp = get_absolute_expression ();
962 if (temp > max_alignment)
963 as_bad ("Alignment too large: %d. assumed.", temp = max_alignment);
964 else if (temp < 0)
965 {
966 as_bad ("Alignment negative. 0 assumed.");
967 temp = 0;
968 }
969 if (*input_line_pointer == ',')
970 {
971 input_line_pointer++;
972 temp_fill = get_absolute_expression ();
973 do_align (temp, &temp_fill);
974 }
975 else
976 do_align (temp, (char *) 0);
977
978 demand_empty_rest_of_line ();
979 }
980
981 void
982 s_comm (ignore)
983 int ignore;
984 {
985 register char *name;
986 register char c;
987 register char *p;
988 offsetT temp;
989 register symbolS *symbolP;
990
991 name = input_line_pointer;
992 c = get_symbol_end ();
993 /* just after name is now '\0' */
994 p = input_line_pointer;
995 *p = c;
996 SKIP_WHITESPACE ();
997 if (*input_line_pointer != ',')
998 {
999 as_bad ("Expected comma after symbol-name: rest of line ignored.");
1000 ignore_rest_of_line ();
1001 return;
1002 }
1003 input_line_pointer++; /* skip ',' */
1004 if ((temp = get_absolute_expression ()) < 0)
1005 {
1006 as_warn (".COMMon length (%ld.) <0! Ignored.", (long) temp);
1007 ignore_rest_of_line ();
1008 return;
1009 }
1010 *p = 0;
1011 symbolP = symbol_find_or_make (name);
1012 *p = c;
1013 if (S_IS_DEFINED (symbolP))
1014 {
1015 as_bad ("Ignoring attempt to re-define symbol `%s'.",
1016 S_GET_NAME (symbolP));
1017 ignore_rest_of_line ();
1018 return;
1019 }
1020 if (S_GET_VALUE (symbolP))
1021 {
1022 if (S_GET_VALUE (symbolP) != (valueT) temp)
1023 as_bad ("Length of .comm \"%s\" is already %ld. Not changed to %ld.",
1024 S_GET_NAME (symbolP),
1025 (long) S_GET_VALUE (symbolP),
1026 (long) temp);
1027 }
1028 else
1029 {
1030 S_SET_VALUE (symbolP, (valueT) temp);
1031 S_SET_EXTERNAL (symbolP);
1032 }
1033 #ifdef OBJ_VMS
1034 {
1035 extern int flag_one;
1036 if ( (!temp) || !flag_one)
1037 S_GET_OTHER(symbolP) = const_flag;
1038 }
1039 #endif /* not OBJ_VMS */
1040 know (symbolP->sy_frag == &zero_address_frag);
1041 demand_empty_rest_of_line ();
1042 } /* s_comm() */
1043
1044 /* The MRI COMMON pseudo-op. We handle this by creating a common
1045 symbol with the appropriate name. We make s_space do the right
1046 thing by increasing the size. */
1047
1048 void
1049 s_mri_common (small)
1050 int small;
1051 {
1052 char *name;
1053 char c;
1054 char *alc = NULL;
1055 symbolS *sym;
1056 offsetT align;
1057
1058 if (! flag_mri)
1059 {
1060 s_comm (0);
1061 return;
1062 }
1063
1064 SKIP_WHITESPACE ();
1065
1066 name = input_line_pointer;
1067 if (! isdigit ((unsigned char) *name))
1068 c = get_symbol_end ();
1069 else
1070 {
1071 do
1072 {
1073 ++input_line_pointer;
1074 }
1075 while (isdigit ((unsigned char) *input_line_pointer));
1076 c = *input_line_pointer;
1077 *input_line_pointer = '\0';
1078
1079 if (mri_line_label != NULL)
1080 {
1081 alc = (char *) xmalloc (strlen (S_GET_NAME (mri_line_label))
1082 + (input_line_pointer - name)
1083 + 1);
1084 sprintf (alc, "%s%s", name, S_GET_NAME (mri_line_label));
1085 name = alc;
1086 }
1087 }
1088
1089 sym = symbol_find_or_make (name);
1090 *input_line_pointer = c;
1091 if (alc != NULL)
1092 free (alc);
1093
1094 if (*input_line_pointer != ',')
1095 align = 0;
1096 else
1097 {
1098 ++input_line_pointer;
1099 align = get_absolute_expression ();
1100 }
1101
1102 if (S_IS_DEFINED (sym))
1103 {
1104 #if defined (S_IS_COMMON) || defined (BFD_ASSEMBLER)
1105 if (! S_IS_COMMON (sym))
1106 #endif
1107 {
1108 as_bad ("attempt to re-define symbol `%s'", S_GET_NAME (sym));
1109 ignore_rest_of_line ();
1110 return;
1111 }
1112 }
1113
1114 S_SET_EXTERNAL (sym);
1115 mri_common_symbol = sym;
1116
1117 #ifdef S_SET_ALIGN
1118 if (align != 0)
1119 S_SET_ALIGN (sym, align);
1120 #endif
1121
1122 if (mri_line_label != NULL)
1123 {
1124 mri_line_label->sy_value.X_op = O_symbol;
1125 mri_line_label->sy_value.X_add_symbol = sym;
1126 mri_line_label->sy_value.X_add_number = S_GET_VALUE (sym);
1127 mri_line_label->sy_frag = &zero_address_frag;
1128 S_SET_SEGMENT (mri_line_label, expr_section);
1129 }
1130
1131 /* FIXME: We just ignore the small argument, which distinguishes
1132 COMMON and COMMON.S. I don't know what we can do about it. */
1133
1134 /* Ignore the type and hptype. */
1135 if (*input_line_pointer == ',')
1136 input_line_pointer += 2;
1137 if (*input_line_pointer == ',')
1138 input_line_pointer += 2;
1139 demand_empty_rest_of_line ();
1140 }
1141
1142 void
1143 s_data (ignore)
1144 int ignore;
1145 {
1146 segT section;
1147 register int temp;
1148
1149 temp = get_absolute_expression ();
1150 if (flag_readonly_data_in_text)
1151 {
1152 section = text_section;
1153 temp += 1000;
1154 }
1155 else
1156 section = data_section;
1157
1158 subseg_set (section, (subsegT) temp);
1159
1160 #ifdef OBJ_VMS
1161 const_flag = 0;
1162 #endif
1163 demand_empty_rest_of_line ();
1164 }
1165
1166 /* Handle the .appfile pseudo-op. This is automatically generated by
1167 do_scrub_next_char when a preprocessor # line comment is seen with
1168 a file name. This default definition may be overridden by the
1169 object or CPU specific pseudo-ops. This function is also the
1170 default definition for .file; the APPFILE argument is 1 for
1171 .appfile, 0 for .file. */
1172
1173 void
1174 s_app_file (appfile)
1175 int appfile;
1176 {
1177 register char *s;
1178 int length;
1179
1180 /* Some assemblers tolerate immediately following '"' */
1181 if ((s = demand_copy_string (&length)) != 0)
1182 {
1183 /* If this is a fake .appfile, a fake newline was inserted into
1184 the buffer. Passing -2 to new_logical_line tells it to
1185 account for it. */
1186 new_logical_line (s, appfile ? -2 : -1);
1187 demand_empty_rest_of_line ();
1188 #ifdef LISTING
1189 if (listing)
1190 listing_source_file (s);
1191 #endif
1192 }
1193 #ifdef obj_app_file
1194 obj_app_file (s);
1195 #endif
1196 }
1197
1198 /* Handle the .appline pseudo-op. This is automatically generated by
1199 do_scrub_next_char when a preprocessor # line comment is seen.
1200 This default definition may be overridden by the object or CPU
1201 specific pseudo-ops. */
1202
1203 void
1204 s_app_line (ignore)
1205 int ignore;
1206 {
1207 int l;
1208
1209 /* The given number is that of the next line. */
1210 l = get_absolute_expression () - 1;
1211 if (l < 0)
1212 /* Some of the back ends can't deal with non-positive line numbers.
1213 Besides, it's silly. */
1214 as_warn ("Line numbers must be positive; line number %d rejected.", l+1);
1215 else
1216 {
1217 new_logical_line ((char *) NULL, l);
1218 #ifdef LISTING
1219 if (listing)
1220 listing_source_line (l);
1221 #endif
1222 }
1223 demand_empty_rest_of_line ();
1224 }
1225
1226 /* Handle the .end pseudo-op. Actually, the real work is done in
1227 read_a_source_file. */
1228
1229 void
1230 s_end (ignore)
1231 int ignore;
1232 {
1233 if (flag_mri)
1234 {
1235 /* The MRI assembler permits the start symbol to follow .end,
1236 but we don't support that. */
1237 SKIP_WHITESPACE ();
1238 if (! is_end_of_line[(unsigned char) *input_line_pointer])
1239 as_warn ("start address not supported");
1240 }
1241 }
1242
1243 /* Handle the MRI fail pseudo-op. */
1244
1245 void
1246 s_fail (ignore)
1247 int ignore;
1248 {
1249 offsetT temp;
1250
1251 temp = get_absolute_expression ();
1252 if (temp >= 500)
1253 as_warn (".fail %ld encountered", (long) temp);
1254 else
1255 as_bad (".fail %ld encountered", (long) temp);
1256 demand_empty_rest_of_line ();
1257 }
1258
1259 void
1260 s_fill (ignore)
1261 int ignore;
1262 {
1263 long temp_repeat = 0;
1264 long temp_size = 1;
1265 register long temp_fill = 0;
1266 char *p;
1267
1268
1269 temp_repeat = get_absolute_expression ();
1270 if (*input_line_pointer == ',')
1271 {
1272 input_line_pointer++;
1273 temp_size = get_absolute_expression ();
1274 if (*input_line_pointer == ',')
1275 {
1276 input_line_pointer++;
1277 temp_fill = get_absolute_expression ();
1278 }
1279 }
1280 /* This is to be compatible with BSD 4.2 AS, not for any rational reason. */
1281 #define BSD_FILL_SIZE_CROCK_8 (8)
1282 if (temp_size > BSD_FILL_SIZE_CROCK_8)
1283 {
1284 as_warn (".fill size clamped to %d.", BSD_FILL_SIZE_CROCK_8);
1285 temp_size = BSD_FILL_SIZE_CROCK_8;
1286 }
1287 if (temp_size < 0)
1288 {
1289 as_warn ("Size negative: .fill ignored.");
1290 temp_size = 0;
1291 }
1292 else if (temp_repeat <= 0)
1293 {
1294 as_warn ("Repeat < 0, .fill ignored");
1295 temp_size = 0;
1296 }
1297
1298 if (temp_size && !need_pass_2)
1299 {
1300 p = frag_var (rs_fill, (int) temp_size, (int) temp_size, (relax_substateT) 0, (symbolS *) 0, temp_repeat, (char *) 0);
1301 memset (p, 0, (unsigned int) temp_size);
1302 /* The magic number BSD_FILL_SIZE_CROCK_4 is from BSD 4.2 VAX
1303 * flavoured AS. The following bizzare behaviour is to be
1304 * compatible with above. I guess they tried to take up to 8
1305 * bytes from a 4-byte expression and they forgot to sign
1306 * extend. Un*x Sux. */
1307 #define BSD_FILL_SIZE_CROCK_4 (4)
1308 md_number_to_chars (p, (valueT) temp_fill,
1309 (temp_size > BSD_FILL_SIZE_CROCK_4
1310 ? BSD_FILL_SIZE_CROCK_4
1311 : (int) temp_size));
1312 /* Note: .fill (),0 emits no frag (since we are asked to .fill 0 bytes)
1313 * but emits no error message because it seems a legal thing to do.
1314 * It is a degenerate case of .fill but could be emitted by a compiler.
1315 */
1316 }
1317 demand_empty_rest_of_line ();
1318 }
1319
1320 void
1321 s_globl (ignore)
1322 int ignore;
1323 {
1324 char *name;
1325 int c;
1326 symbolS *symbolP;
1327
1328 do
1329 {
1330 name = input_line_pointer;
1331 c = get_symbol_end ();
1332 symbolP = symbol_find_or_make (name);
1333 *input_line_pointer = c;
1334 SKIP_WHITESPACE ();
1335 S_SET_EXTERNAL (symbolP);
1336 if (c == ',')
1337 {
1338 input_line_pointer++;
1339 SKIP_WHITESPACE ();
1340 if (*input_line_pointer == '\n')
1341 c = '\n';
1342 }
1343 }
1344 while (c == ',');
1345 demand_empty_rest_of_line ();
1346 }
1347
1348 void
1349 s_lcomm (needs_align)
1350 /* 1 if this was a ".bss" directive, which may require a 3rd argument
1351 (alignment); 0 if it was an ".lcomm" (2 args only) */
1352 int needs_align;
1353 {
1354 register char *name;
1355 register char c;
1356 register char *p;
1357 register int temp;
1358 register symbolS *symbolP;
1359 segT current_seg = now_seg;
1360 subsegT current_subseg = now_subseg;
1361 const int max_alignment = 15;
1362 int align = 0;
1363 segT bss_seg = bss_section;
1364
1365 name = input_line_pointer;
1366 c = get_symbol_end ();
1367 p = input_line_pointer;
1368 *p = c;
1369 SKIP_WHITESPACE ();
1370
1371 /* Accept an optional comma after the name. The comma used to be
1372 required, but Irix 5 cc does not generate it. */
1373 if (*input_line_pointer == ',')
1374 {
1375 ++input_line_pointer;
1376 SKIP_WHITESPACE ();
1377 }
1378
1379 if (*input_line_pointer == '\n')
1380 {
1381 as_bad ("Missing size expression");
1382 return;
1383 }
1384
1385 if ((temp = get_absolute_expression ()) < 0)
1386 {
1387 as_warn ("BSS length (%d.) <0! Ignored.", temp);
1388 ignore_rest_of_line ();
1389 return;
1390 }
1391
1392 #if defined (TC_MIPS) || defined (TC_ALPHA)
1393 if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour
1394 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
1395 {
1396 /* For MIPS and Alpha ECOFF or ELF, small objects are put in .sbss. */
1397 if (temp <= bfd_get_gp_size (stdoutput))
1398 {
1399 bss_seg = subseg_new (".sbss", 1);
1400 seg_info (bss_seg)->bss = 1;
1401 }
1402 }
1403 #endif
1404 if (!needs_align)
1405 {
1406 /* FIXME. This needs to be machine independent. */
1407 if (temp >= 8)
1408 align = 3;
1409 else if (temp >= 4)
1410 align = 2;
1411 else if (temp >= 2)
1412 align = 1;
1413 else
1414 align = 0;
1415
1416 record_alignment(bss_seg, align);
1417 }
1418
1419 if (needs_align)
1420 {
1421 align = 0;
1422 SKIP_WHITESPACE ();
1423 if (*input_line_pointer != ',')
1424 {
1425 as_bad ("Expected comma after size");
1426 ignore_rest_of_line ();
1427 return;
1428 }
1429 input_line_pointer++;
1430 SKIP_WHITESPACE ();
1431 if (*input_line_pointer == '\n')
1432 {
1433 as_bad ("Missing alignment");
1434 return;
1435 }
1436 align = get_absolute_expression ();
1437 if (align > max_alignment)
1438 {
1439 align = max_alignment;
1440 as_warn ("Alignment too large: %d. assumed.", align);
1441 }
1442 else if (align < 0)
1443 {
1444 align = 0;
1445 as_warn ("Alignment negative. 0 assumed.");
1446 }
1447 record_alignment (bss_seg, align);
1448 } /* if needs align */
1449 else
1450 {
1451 /* Assume some objects may require alignment on some systems. */
1452 #ifdef TC_ALPHA
1453 if (temp > 1)
1454 {
1455 align = ffs (temp) - 1;
1456 if (temp % (1 << align))
1457 abort ();
1458 }
1459 #endif
1460 }
1461
1462 *p = 0;
1463 symbolP = symbol_find_or_make (name);
1464 *p = c;
1465
1466 if (
1467 #if defined(OBJ_AOUT) | defined(OBJ_BOUT)
1468 S_GET_OTHER (symbolP) == 0 &&
1469 S_GET_DESC (symbolP) == 0 &&
1470 #endif /* OBJ_AOUT or OBJ_BOUT */
1471 (S_GET_SEGMENT (symbolP) == bss_seg
1472 || (!S_IS_DEFINED (symbolP) && S_GET_VALUE (symbolP) == 0)))
1473 {
1474 char *pfrag;
1475
1476 subseg_set (bss_seg, 1);
1477
1478 if (align)
1479 frag_align (align, 0);
1480 /* detach from old frag */
1481 if (S_GET_SEGMENT (symbolP) == bss_seg)
1482 symbolP->sy_frag->fr_symbol = NULL;
1483
1484 symbolP->sy_frag = frag_now;
1485 pfrag = frag_var (rs_org, 1, 1, (relax_substateT)0, symbolP,
1486 temp, (char *)0);
1487 *pfrag = 0;
1488
1489 S_SET_SEGMENT (symbolP, bss_seg);
1490
1491 #ifdef OBJ_COFF
1492 /* The symbol may already have been created with a preceding
1493 ".globl" directive -- be careful not to step on storage class
1494 in that case. Otherwise, set it to static. */
1495 if (S_GET_STORAGE_CLASS (symbolP) != C_EXT)
1496 {
1497 S_SET_STORAGE_CLASS (symbolP, C_STAT);
1498 }
1499 #endif /* OBJ_COFF */
1500 }
1501 else
1502 as_bad ("Ignoring attempt to re-define symbol `%s'.",
1503 S_GET_NAME (symbolP));
1504
1505 subseg_set (current_seg, current_subseg);
1506
1507 demand_empty_rest_of_line ();
1508 } /* s_lcomm() */
1509
1510 void
1511 s_lsym (ignore)
1512 int ignore;
1513 {
1514 register char *name;
1515 register char c;
1516 register char *p;
1517 expressionS exp;
1518 register symbolS *symbolP;
1519
1520 /* we permit ANY defined expression: BSD4.2 demands constants */
1521 name = input_line_pointer;
1522 c = get_symbol_end ();
1523 p = input_line_pointer;
1524 *p = c;
1525 SKIP_WHITESPACE ();
1526 if (*input_line_pointer != ',')
1527 {
1528 *p = 0;
1529 as_bad ("Expected comma after name \"%s\"", name);
1530 *p = c;
1531 ignore_rest_of_line ();
1532 return;
1533 }
1534 input_line_pointer++;
1535 expression (&exp);
1536 if (exp.X_op != O_constant
1537 && exp.X_op != O_register)
1538 {
1539 as_bad ("bad expression");
1540 ignore_rest_of_line ();
1541 return;
1542 }
1543 *p = 0;
1544 symbolP = symbol_find_or_make (name);
1545
1546 /* FIXME-SOON I pulled a (&& symbolP->sy_other == 0 &&
1547 symbolP->sy_desc == 0) out of this test because coff doesn't have
1548 those fields, and I can't see when they'd ever be tripped. I
1549 don't think I understand why they were here so I may have
1550 introduced a bug. As recently as 1.37 didn't have this test
1551 anyway. xoxorich. */
1552
1553 if (S_GET_SEGMENT (symbolP) == undefined_section
1554 && S_GET_VALUE (symbolP) == 0)
1555 {
1556 /* The name might be an undefined .global symbol; be sure to
1557 keep the "external" bit. */
1558 S_SET_SEGMENT (symbolP,
1559 (exp.X_op == O_constant
1560 ? absolute_section
1561 : reg_section));
1562 S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
1563 }
1564 else
1565 {
1566 as_bad ("Symbol %s already defined", name);
1567 }
1568 *p = c;
1569 demand_empty_rest_of_line ();
1570 } /* s_lsym() */
1571
1572 /* Handle changing the location counter. */
1573
1574 static void
1575 do_org (segment, exp, fill)
1576 segT segment;
1577 expressionS *exp;
1578 int fill;
1579 {
1580 if (segment != now_seg && segment != absolute_section)
1581 as_bad ("invalid segment \"%s\"; segment \"%s\" assumed",
1582 segment_name (segment), segment_name (now_seg));
1583
1584 if (now_seg == absolute_section)
1585 {
1586 if (fill != 0)
1587 as_warn ("ignoring fill value in absolute section");
1588 if (exp->X_op != O_constant)
1589 {
1590 as_bad ("only constant offsets supported in absolute section");
1591 exp->X_add_number = 0;
1592 }
1593 abs_section_offset = exp->X_add_number;
1594 }
1595 else
1596 {
1597 char *p;
1598
1599 p = frag_var (rs_org, 1, 1, (relax_substateT) 0, exp->X_add_symbol,
1600 exp->X_add_number, (char *) NULL);
1601 *p = fill;
1602 }
1603 }
1604
1605 void
1606 s_org (ignore)
1607 int ignore;
1608 {
1609 register segT segment;
1610 expressionS exp;
1611 register long temp_fill;
1612
1613 /* The MRI assembler has a different meaning for .org. It means to
1614 create an absolute section at a given address. We can't support
1615 that--use a linker script instead. */
1616 if (flag_mri)
1617 {
1618 as_bad ("MRI style ORG pseudo-op not supported");
1619 ignore_rest_of_line ();
1620 return;
1621 }
1622
1623 /* Don't believe the documentation of BSD 4.2 AS. There is no such
1624 thing as a sub-segment-relative origin. Any absolute origin is
1625 given a warning, then assumed to be segment-relative. Any
1626 segmented origin expression ("foo+42") had better be in the right
1627 segment or the .org is ignored.
1628
1629 BSD 4.2 AS warns if you try to .org backwards. We cannot because
1630 we never know sub-segment sizes when we are reading code. BSD
1631 will crash trying to emit negative numbers of filler bytes in
1632 certain .orgs. We don't crash, but see as-write for that code.
1633
1634 Don't make frag if need_pass_2==1. */
1635 segment = get_known_segmented_expression (&exp);
1636 if (*input_line_pointer == ',')
1637 {
1638 input_line_pointer++;
1639 temp_fill = get_absolute_expression ();
1640 }
1641 else
1642 temp_fill = 0;
1643
1644 if (!need_pass_2)
1645 do_org (segment, &exp, temp_fill);
1646
1647 demand_empty_rest_of_line ();
1648 } /* s_org() */
1649
1650 /* Handle parsing for the MRI SECT/SECTION pseudo-op. This should be
1651 called by the obj-format routine which handles section changing
1652 when in MRI mode. It will create a new section, and return it. It
1653 will set *TYPE to the section type: one of '\0' (unspecified), 'C'
1654 (code), 'D' (data), 'M' (mixed), or 'R' (romable). If
1655 BFD_ASSEMBLER is defined, the flags will be set in the section. */
1656
1657 void
1658 s_mri_sect (type)
1659 char *type;
1660 {
1661 char *name;
1662 char c;
1663 segT seg;
1664
1665 SKIP_WHITESPACE ();
1666
1667 name = input_line_pointer;
1668 if (! isdigit ((unsigned char) *name))
1669 c = get_symbol_end ();
1670 else
1671 {
1672 do
1673 {
1674 ++input_line_pointer;
1675 }
1676 while (isdigit ((unsigned char) *input_line_pointer));
1677 c = *input_line_pointer;
1678 *input_line_pointer = '\0';
1679 }
1680
1681 name = strdup (name);
1682 if (name == NULL)
1683 as_fatal ("virtual memory exhausted");
1684
1685 *input_line_pointer = c;
1686
1687 seg = subseg_new (name, 0);
1688
1689 if (*input_line_pointer == ',')
1690 {
1691 int align;
1692
1693 ++input_line_pointer;
1694 align = get_absolute_expression ();
1695 record_alignment (seg, align);
1696 }
1697
1698 *type = '\0';
1699 if (*input_line_pointer == ',')
1700 {
1701 c = *++input_line_pointer;
1702 c = toupper ((unsigned char) c);
1703 if (c == 'C' || c == 'D' || c == 'M' || c == 'R')
1704 *type = c;
1705 else
1706 as_bad ("unrecognized section type");
1707 ++input_line_pointer;
1708
1709 #ifdef BFD_ASSEMBLER
1710 {
1711 flagword flags;
1712
1713 flags = SEC_NO_FLAGS;
1714 if (*type == 'C')
1715 flags = SEC_CODE;
1716 else if (*type == 'D')
1717 flags = SEC_DATA;
1718 else if (*type == 'R')
1719 flags = SEC_ROM;
1720 if (flags != SEC_NO_FLAGS)
1721 {
1722 if (! bfd_set_section_flags (stdoutput, seg, flags))
1723 as_warn ("error setting flags for \"%s\": %s",
1724 bfd_section_name (stdoutput, seg),
1725 bfd_errmsg (bfd_get_error ()));
1726 }
1727 }
1728 #endif
1729 }
1730
1731 /* Ignore the HP type. */
1732 if (*input_line_pointer == ',')
1733 input_line_pointer += 2;
1734
1735 demand_empty_rest_of_line ();
1736 }
1737
1738 void
1739 s_set (ignore)
1740 int ignore;
1741 {
1742 register char *name;
1743 register char delim;
1744 register char *end_name;
1745 register symbolS *symbolP;
1746
1747 /*
1748 * Especial apologies for the random logic:
1749 * this just grew, and could be parsed much more simply!
1750 * Dean in haste.
1751 */
1752 name = input_line_pointer;
1753 delim = get_symbol_end ();
1754 end_name = input_line_pointer;
1755 *end_name = delim;
1756 SKIP_WHITESPACE ();
1757
1758 if (*input_line_pointer != ',')
1759 {
1760 *end_name = 0;
1761 as_bad ("Expected comma after name \"%s\"", name);
1762 *end_name = delim;
1763 ignore_rest_of_line ();
1764 return;
1765 }
1766
1767 input_line_pointer++;
1768 *end_name = 0;
1769
1770 if (name[0] == '.' && name[1] == '\0')
1771 {
1772 /* Turn '. = mumble' into a .org mumble */
1773 register segT segment;
1774 expressionS exp;
1775
1776 segment = get_known_segmented_expression (&exp);
1777
1778 if (!need_pass_2)
1779 do_org (segment, &exp, 0);
1780
1781 *end_name = delim;
1782 return;
1783 }
1784
1785 if ((symbolP = symbol_find (name)) == NULL
1786 && (symbolP = md_undefined_symbol (name)) == NULL)
1787 {
1788 symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
1789 #ifdef OBJ_COFF
1790 /* "set" symbols are local unless otherwise specified. */
1791 SF_SET_LOCAL (symbolP);
1792 #endif /* OBJ_COFF */
1793
1794 } /* make a new symbol */
1795
1796 symbol_table_insert (symbolP);
1797
1798 *end_name = delim;
1799 pseudo_set (symbolP);
1800 demand_empty_rest_of_line ();
1801 } /* s_set() */
1802
1803 void
1804 s_space (mult)
1805 int mult;
1806 {
1807 expressionS exp;
1808 long temp_fill;
1809 char *p = 0;
1810
1811 #ifdef md_flush_pending_output
1812 md_flush_pending_output ();
1813 #endif
1814
1815 /* Just like .fill, but temp_size = 1 */
1816 expression (&exp);
1817 if (exp.X_op == O_constant)
1818 {
1819 long repeat;
1820
1821 repeat = exp.X_add_number;
1822 if (mult)
1823 repeat *= mult;
1824 if (repeat <= 0)
1825 {
1826 as_warn (".space repeat count is %s, ignored",
1827 repeat ? "negative" : "zero");
1828 ignore_rest_of_line ();
1829 return;
1830 }
1831
1832 /* If we are in the absolute section, just bump the offset. */
1833 if (now_seg == absolute_section)
1834 {
1835 abs_section_offset += repeat;
1836 demand_empty_rest_of_line ();
1837 return;
1838 }
1839
1840 /* If we are secretly in an MRI common section, then creating
1841 space just increases the size of the common symbol. */
1842 if (mri_common_symbol != NULL)
1843 {
1844 S_SET_VALUE (mri_common_symbol,
1845 S_GET_VALUE (mri_common_symbol) + repeat);
1846 demand_empty_rest_of_line ();
1847 return;
1848 }
1849
1850 if (!need_pass_2)
1851 p = frag_var (rs_fill, 1, 1, (relax_substateT) 0, (symbolS *) 0,
1852 repeat, (char *) 0);
1853 }
1854 else
1855 {
1856 if (now_seg == absolute_section)
1857 {
1858 as_bad ("space allocation too complex in absolute section");
1859 subseg_set (text_section, 0);
1860 }
1861 if (mri_common_symbol != NULL)
1862 {
1863 as_bad ("space allocation too complex in common section");
1864 mri_common_symbol = NULL;
1865 }
1866 if (!need_pass_2)
1867 p = frag_var (rs_space, 1, 1, (relax_substateT) 0,
1868 make_expr_symbol (&exp), 0L, (char *) 0);
1869 }
1870 SKIP_WHITESPACE ();
1871 if (*input_line_pointer == ',')
1872 {
1873 input_line_pointer++;
1874 temp_fill = get_absolute_expression ();
1875 }
1876 else
1877 {
1878 temp_fill = 0;
1879 }
1880 if (p)
1881 {
1882 *p = temp_fill;
1883 }
1884 demand_empty_rest_of_line ();
1885 }
1886
1887 /* This is like s_space, but the value is a floating point number with
1888 the given precision. This is for the MRI dcb.s pseudo-op and
1889 friends. */
1890
1891 void
1892 s_float_space (float_type)
1893 int float_type;
1894 {
1895 offsetT count;
1896 int flen;
1897 char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
1898
1899 count = get_absolute_expression ();
1900
1901 SKIP_WHITESPACE ();
1902 if (*input_line_pointer != ',')
1903 {
1904 as_bad ("missing value");
1905 ignore_rest_of_line ();
1906 return;
1907 }
1908
1909 ++input_line_pointer;
1910
1911 SKIP_WHITESPACE ();
1912
1913 /* Skip any 0{letter} that may be present. Don't even check if the
1914 * letter is legal. */
1915 if (input_line_pointer[0] == '0' && isalpha (input_line_pointer[1]))
1916 input_line_pointer += 2;
1917
1918 /* Accept :xxxx, where the x's are hex digits, for a floating point
1919 with the exact digits specified. */
1920 if (input_line_pointer[0] == ':')
1921 {
1922 flen = hex_float (float_type, temp);
1923 if (flen < 0)
1924 {
1925 ignore_rest_of_line ();
1926 return;
1927 }
1928 }
1929 else
1930 {
1931 char *err;
1932
1933 err = md_atof (float_type, temp, &flen);
1934 know (flen <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
1935 know (flen > 0);
1936 if (err)
1937 {
1938 as_bad ("Bad floating literal: %s", err);
1939 ignore_rest_of_line ();
1940 return;
1941 }
1942 }
1943
1944 while (--count >= 0)
1945 {
1946 char *p;
1947
1948 p = frag_more (flen);
1949 memcpy (p, temp, (unsigned int) flen);
1950 }
1951
1952 demand_empty_rest_of_line ();
1953 }
1954
1955 /* Handle the .struct pseudo-op, as found in MIPS assemblers. */
1956
1957 void
1958 s_struct (ignore)
1959 int ignore;
1960 {
1961 abs_section_offset = get_absolute_expression ();
1962 subseg_set (absolute_section, 0);
1963 demand_empty_rest_of_line ();
1964 }
1965
1966 void
1967 s_text (ignore)
1968 int ignore;
1969 {
1970 register int temp;
1971
1972 temp = get_absolute_expression ();
1973 subseg_set (text_section, (subsegT) temp);
1974 demand_empty_rest_of_line ();
1975 #ifdef OBJ_VMS
1976 const_flag &= ~IN_DEFAULT_SECTION;
1977 #endif
1978 } /* s_text() */
1979 \f
1980
1981 void
1982 demand_empty_rest_of_line ()
1983 {
1984 SKIP_WHITESPACE ();
1985 if (is_end_of_line[(unsigned char) *input_line_pointer])
1986 {
1987 input_line_pointer++;
1988 }
1989 else
1990 {
1991 ignore_rest_of_line ();
1992 }
1993 /* Return having already swallowed end-of-line. */
1994 } /* Return pointing just after end-of-line. */
1995
1996 void
1997 ignore_rest_of_line () /* For suspect lines: gives warning. */
1998 {
1999 if (!is_end_of_line[(unsigned char) *input_line_pointer])
2000 {
2001 if (isprint (*input_line_pointer))
2002 as_bad ("Rest of line ignored. First ignored character is `%c'.",
2003 *input_line_pointer);
2004 else
2005 as_bad ("Rest of line ignored. First ignored character valued 0x%x.",
2006 *input_line_pointer);
2007 while (input_line_pointer < buffer_limit
2008 && !is_end_of_line[(unsigned char) *input_line_pointer])
2009 {
2010 input_line_pointer++;
2011 }
2012 }
2013 input_line_pointer++; /* Return pointing just after end-of-line. */
2014 know (is_end_of_line[(unsigned char) input_line_pointer[-1]]);
2015 }
2016
2017 /*
2018 * pseudo_set()
2019 *
2020 * In: Pointer to a symbol.
2021 * Input_line_pointer->expression.
2022 *
2023 * Out: Input_line_pointer->just after any whitespace after expression.
2024 * Tried to set symbol to value of expression.
2025 * Will change symbols type, value, and frag;
2026 */
2027 void
2028 pseudo_set (symbolP)
2029 symbolS *symbolP;
2030 {
2031 expressionS exp;
2032 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
2033 int ext;
2034 #endif /* OBJ_AOUT or OBJ_BOUT */
2035
2036 know (symbolP); /* NULL pointer is logic error. */
2037 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
2038 ext = S_IS_EXTERNAL (symbolP);
2039 #endif /* OBJ_AOUT or OBJ_BOUT */
2040
2041 (void) expression (&exp);
2042
2043 if (exp.X_op == O_illegal)
2044 as_bad ("illegal expression; zero assumed");
2045 else if (exp.X_op == O_absent)
2046 as_bad ("missing expression; zero assumed");
2047 else if (exp.X_op == O_big)
2048 as_bad ("%s number invalid; zero assumed",
2049 exp.X_add_number > 0 ? "bignum" : "floating point");
2050 else if (exp.X_op == O_subtract
2051 && (S_GET_SEGMENT (exp.X_add_symbol)
2052 == S_GET_SEGMENT (exp.X_op_symbol))
2053 && SEG_NORMAL (S_GET_SEGMENT (exp.X_add_symbol))
2054 && exp.X_add_symbol->sy_frag == exp.X_op_symbol->sy_frag)
2055 {
2056 exp.X_op = O_constant;
2057 exp.X_add_number = (S_GET_VALUE (exp.X_add_symbol)
2058 - S_GET_VALUE (exp.X_op_symbol));
2059 }
2060
2061 switch (exp.X_op)
2062 {
2063 case O_illegal:
2064 case O_absent:
2065 case O_big:
2066 exp.X_add_number = 0;
2067 /* Fall through. */
2068 case O_constant:
2069 S_SET_SEGMENT (symbolP, absolute_section);
2070 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
2071 if (ext)
2072 S_SET_EXTERNAL (symbolP);
2073 else
2074 S_CLEAR_EXTERNAL (symbolP);
2075 #endif /* OBJ_AOUT or OBJ_BOUT */
2076 S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
2077 symbolP->sy_frag = &zero_address_frag;
2078 break;
2079
2080 case O_register:
2081 S_SET_SEGMENT (symbolP, reg_section);
2082 S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
2083 symbolP->sy_frag = &zero_address_frag;
2084 break;
2085
2086 case O_symbol:
2087 if (S_GET_SEGMENT (exp.X_add_symbol) == undefined_section
2088 || exp.X_add_number != 0)
2089 symbolP->sy_value = exp;
2090 else
2091 {
2092 symbolS *s = exp.X_add_symbol;
2093
2094 S_SET_SEGMENT (symbolP, S_GET_SEGMENT (s));
2095 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
2096 if (ext)
2097 S_SET_EXTERNAL (symbolP);
2098 else
2099 S_CLEAR_EXTERNAL (symbolP);
2100 #endif /* OBJ_AOUT or OBJ_BOUT */
2101 S_SET_VALUE (symbolP,
2102 exp.X_add_number + S_GET_VALUE (s));
2103 symbolP->sy_frag = s->sy_frag;
2104 copy_symbol_attributes (symbolP, s);
2105 }
2106 break;
2107
2108 default:
2109 /* The value is some complex expression.
2110 FIXME: Should we set the segment to anything? */
2111 symbolP->sy_value = exp;
2112 break;
2113 }
2114 }
2115 \f
2116 /*
2117 * cons()
2118 *
2119 * CONStruct more frag of .bytes, or .words etc.
2120 * Should need_pass_2 be 1 then emit no frag(s).
2121 * This understands EXPRESSIONS.
2122 *
2123 * Bug (?)
2124 *
2125 * This has a split personality. We use expression() to read the
2126 * value. We can detect if the value won't fit in a byte or word.
2127 * But we can't detect if expression() discarded significant digits
2128 * in the case of a long. Not worth the crocks required to fix it.
2129 */
2130
2131 /* Select a parser for cons expressions. */
2132
2133 /* Some targets need to parse the expression in various fancy ways.
2134 You can define TC_PARSE_CONS_EXPRESSION to do whatever you like
2135 (for example, the HPPA does this). Otherwise, you can define
2136 BITFIELD_CONS_EXPRESSIONS to permit bitfields to be specified, or
2137 REPEAT_CONS_EXPRESSIONS to permit repeat counts. If none of these
2138 are defined, which is the normal case, then only simple expressions
2139 are permitted. */
2140
2141 static void
2142 parse_mri_cons PARAMS ((expressionS *exp, unsigned int nbytes));
2143
2144 #ifndef TC_PARSE_CONS_EXPRESSION
2145 #ifdef BITFIELD_CONS_EXPRESSIONS
2146 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_bitfield_cons (EXP, NBYTES)
2147 static void
2148 parse_bitfield_cons PARAMS ((expressionS *exp, unsigned int nbytes));
2149 #endif
2150 #ifdef REPEAT_CONS_EXPRESSIONS
2151 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_repeat_cons (EXP, NBYTES)
2152 static void
2153 parse_repeat_cons PARAMS ((expressionS *exp, unsigned int nbytes));
2154 #endif
2155
2156 /* If we haven't gotten one yet, just call expression. */
2157 #ifndef TC_PARSE_CONS_EXPRESSION
2158 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) expression (EXP)
2159 #endif
2160 #endif
2161
2162 /* worker to do .byte etc statements */
2163 /* clobbers input_line_pointer, checks */
2164 /* end-of-line. */
2165 void
2166 cons (nbytes)
2167 register int nbytes; /* 1=.byte, 2=.word, 4=.long */
2168 {
2169 int c;
2170 expressionS exp;
2171
2172 #ifdef md_flush_pending_output
2173 md_flush_pending_output ();
2174 #endif
2175
2176 if (is_it_end_of_statement ())
2177 {
2178 demand_empty_rest_of_line ();
2179 return;
2180 }
2181
2182 c = 0;
2183 do
2184 {
2185 if (flag_mri)
2186 parse_mri_cons (&exp, (unsigned int) nbytes);
2187 else
2188 TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes);
2189 emit_expr (&exp, (unsigned int) nbytes);
2190 ++c;
2191 }
2192 while (*input_line_pointer++ == ',');
2193
2194 /* In MRI mode, after an odd number of bytes, we must align to an
2195 even word boundary, unless the next instruction is a dc.b, ds.b
2196 or dcb.b. */
2197 if (flag_mri && nbytes == 1 && (c & 1) != 0)
2198 mri_pending_align = 1;
2199
2200 input_line_pointer--; /* Put terminator back into stream. */
2201 demand_empty_rest_of_line ();
2202 }
2203
2204 /* Put the contents of expression EXP into the object file using
2205 NBYTES bytes. If need_pass_2 is 1, this does nothing. */
2206
2207 void
2208 emit_expr (exp, nbytes)
2209 expressionS *exp;
2210 unsigned int nbytes;
2211 {
2212 operatorT op;
2213 register char *p;
2214 valueT extra_digit = 0;
2215
2216 /* Don't do anything if we are going to make another pass. */
2217 if (need_pass_2)
2218 return;
2219
2220 op = exp->X_op;
2221
2222 /* Allow `.word 0' in the absolute section. */
2223 if (now_seg == absolute_section)
2224 {
2225 if (op != O_constant || exp->X_add_number != 0)
2226 as_bad ("attempt to store value in absolute section");
2227 abs_section_offset += nbytes;
2228 return;
2229 }
2230
2231 /* Handle a negative bignum. */
2232 if (op == O_uminus
2233 && exp->X_add_number == 0
2234 && exp->X_add_symbol->sy_value.X_op == O_big
2235 && exp->X_add_symbol->sy_value.X_add_number > 0)
2236 {
2237 int i;
2238 unsigned long carry;
2239
2240 exp = &exp->X_add_symbol->sy_value;
2241
2242 /* Negate the bignum: one's complement each digit and add 1. */
2243 carry = 1;
2244 for (i = 0; i < exp->X_add_number; i++)
2245 {
2246 unsigned long next;
2247
2248 next = (((~ (generic_bignum[i] & LITTLENUM_MASK))
2249 & LITTLENUM_MASK)
2250 + carry);
2251 generic_bignum[i] = next & LITTLENUM_MASK;
2252 carry = next >> LITTLENUM_NUMBER_OF_BITS;
2253 }
2254
2255 /* We can ignore any carry out, because it will be handled by
2256 extra_digit if it is needed. */
2257
2258 extra_digit = (valueT) -1;
2259 op = O_big;
2260 }
2261
2262 if (op == O_absent || op == O_illegal)
2263 {
2264 as_warn ("zero assumed for missing expression");
2265 exp->X_add_number = 0;
2266 op = O_constant;
2267 }
2268 else if (op == O_big && exp->X_add_number <= 0)
2269 {
2270 as_bad ("floating point number invalid; zero assumed");
2271 exp->X_add_number = 0;
2272 op = O_constant;
2273 }
2274 else if (op == O_register)
2275 {
2276 as_warn ("register value used as expression");
2277 op = O_constant;
2278 }
2279
2280 p = frag_more ((int) nbytes);
2281
2282 #ifndef WORKING_DOT_WORD
2283 /* If we have the difference of two symbols in a word, save it on
2284 the broken_words list. See the code in write.c. */
2285 if (op == O_subtract && nbytes == 2)
2286 {
2287 struct broken_word *x;
2288
2289 x = (struct broken_word *) xmalloc (sizeof (struct broken_word));
2290 x->next_broken_word = broken_words;
2291 broken_words = x;
2292 x->frag = frag_now;
2293 x->word_goes_here = p;
2294 x->dispfrag = 0;
2295 x->add = exp->X_add_symbol;
2296 x->sub = exp->X_op_symbol;
2297 x->addnum = exp->X_add_number;
2298 x->added = 0;
2299 new_broken_words++;
2300 return;
2301 }
2302 #endif
2303
2304 /* If we have an integer, but the number of bytes is too large to
2305 pass to md_number_to_chars, handle it as a bignum. */
2306 if (op == O_constant && nbytes > sizeof (valueT))
2307 {
2308 valueT val;
2309 int gencnt;
2310
2311 if (! exp->X_unsigned && exp->X_add_number < 0)
2312 extra_digit = (valueT) -1;
2313 val = (valueT) exp->X_add_number;
2314 gencnt = 0;
2315 do
2316 {
2317 generic_bignum[gencnt] = val & LITTLENUM_MASK;
2318 val >>= LITTLENUM_NUMBER_OF_BITS;
2319 ++gencnt;
2320 }
2321 while (val != 0);
2322 op = exp->X_op = O_big;
2323 exp->X_add_number = gencnt;
2324 }
2325
2326 if (op == O_constant)
2327 {
2328 register valueT get;
2329 register valueT use;
2330 register valueT mask;
2331 register valueT unmask;
2332
2333 /* JF << of >= number of bits in the object is undefined. In
2334 particular SPARC (Sun 4) has problems */
2335 if (nbytes >= sizeof (valueT))
2336 mask = 0;
2337 else
2338 mask = ~(valueT) 0 << (BITS_PER_CHAR * nbytes); /* Don't store these bits. */
2339
2340 unmask = ~mask; /* Do store these bits. */
2341
2342 #ifdef NEVER
2343 "Do this mod if you want every overflow check to assume SIGNED 2's complement data.";
2344 mask = ~(unmask >> 1); /* Includes sign bit now. */
2345 #endif
2346
2347 get = exp->X_add_number;
2348 use = get & unmask;
2349 if ((get & mask) != 0 && (get & mask) != mask)
2350 { /* Leading bits contain both 0s & 1s. */
2351 as_warn ("Value 0x%lx truncated to 0x%lx.", get, use);
2352 }
2353 /* put bytes in right order. */
2354 md_number_to_chars (p, use, (int) nbytes);
2355 }
2356 else if (op == O_big)
2357 {
2358 int size;
2359 LITTLENUM_TYPE *nums;
2360
2361 know (nbytes % CHARS_PER_LITTLENUM == 0);
2362
2363 size = exp->X_add_number * CHARS_PER_LITTLENUM;
2364 if (nbytes < size)
2365 {
2366 as_warn ("Bignum truncated to %d bytes", nbytes);
2367 size = nbytes;
2368 }
2369
2370 if (target_big_endian)
2371 {
2372 while (nbytes > size)
2373 {
2374 md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
2375 nbytes -= CHARS_PER_LITTLENUM;
2376 p += CHARS_PER_LITTLENUM;
2377 }
2378
2379 nums = generic_bignum + size / CHARS_PER_LITTLENUM;
2380 while (size > 0)
2381 {
2382 --nums;
2383 md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
2384 size -= CHARS_PER_LITTLENUM;
2385 p += CHARS_PER_LITTLENUM;
2386 }
2387 }
2388 else
2389 {
2390 nums = generic_bignum;
2391 while (size > 0)
2392 {
2393 md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
2394 ++nums;
2395 size -= CHARS_PER_LITTLENUM;
2396 p += CHARS_PER_LITTLENUM;
2397 nbytes -= CHARS_PER_LITTLENUM;
2398 }
2399
2400 while (nbytes > 0)
2401 {
2402 md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
2403 nbytes -= CHARS_PER_LITTLENUM;
2404 p += CHARS_PER_LITTLENUM;
2405 }
2406 }
2407 }
2408 else
2409 {
2410 memset (p, 0, nbytes);
2411
2412 /* Now we need to generate a fixS to record the symbol value.
2413 This is easy for BFD. For other targets it can be more
2414 complex. For very complex cases (currently, the HPPA and
2415 NS32K), you can define TC_CONS_FIX_NEW to do whatever you
2416 want. For simpler cases, you can define TC_CONS_RELOC to be
2417 the name of the reloc code that should be stored in the fixS.
2418 If neither is defined, the code uses NO_RELOC if it is
2419 defined, and otherwise uses 0. */
2420
2421 #ifdef BFD_ASSEMBLER
2422 #ifdef TC_CONS_FIX_NEW
2423 TC_CONS_FIX_NEW (frag_now, p - frag_now->fr_literal, nbytes, exp);
2424 #else
2425 fix_new_exp (frag_now, p - frag_now->fr_literal, (int) nbytes, exp, 0,
2426 /* @@ Should look at CPU word size. */
2427 nbytes == 2 ? BFD_RELOC_16
2428 : nbytes == 8 ? BFD_RELOC_64
2429 : BFD_RELOC_32);
2430 #endif
2431 #else
2432 #ifdef TC_CONS_FIX_NEW
2433 TC_CONS_FIX_NEW (frag_now, p - frag_now->fr_literal, nbytes, exp);
2434 #else
2435 /* Figure out which reloc number to use. Use TC_CONS_RELOC if
2436 it is defined, otherwise use NO_RELOC if it is defined,
2437 otherwise use 0. */
2438 #ifndef TC_CONS_RELOC
2439 #ifdef NO_RELOC
2440 #define TC_CONS_RELOC NO_RELOC
2441 #else
2442 #define TC_CONS_RELOC 0
2443 #endif
2444 #endif
2445 fix_new_exp (frag_now, p - frag_now->fr_literal, (int) nbytes, exp, 0,
2446 TC_CONS_RELOC);
2447 #endif /* TC_CONS_FIX_NEW */
2448 #endif /* BFD_ASSEMBLER */
2449 }
2450 }
2451 \f
2452 #ifdef BITFIELD_CONS_EXPRESSIONS
2453
2454 /* i960 assemblers, (eg, asm960), allow bitfields after ".byte" as
2455 w:x,y:z, where w and y are bitwidths and x and y are values. They
2456 then pack them all together. We do a little better in that we allow
2457 them in words, longs, etc. and we'll pack them in target byte order
2458 for you.
2459
2460 The rules are: pack least significat bit first, if a field doesn't
2461 entirely fit, put it in the next unit. Overflowing the bitfield is
2462 explicitly *not* even a warning. The bitwidth should be considered
2463 a "mask".
2464
2465 To use this function the tc-XXX.h file should define
2466 BITFIELD_CONS_EXPRESSIONS. */
2467
2468 static void
2469 parse_bitfield_cons (exp, nbytes)
2470 expressionS *exp;
2471 unsigned int nbytes;
2472 {
2473 unsigned int bits_available = BITS_PER_CHAR * nbytes;
2474 char *hold = input_line_pointer;
2475
2476 (void) expression (exp);
2477
2478 if (*input_line_pointer == ':')
2479 { /* bitfields */
2480 long value = 0;
2481
2482 for (;;)
2483 {
2484 unsigned long width;
2485
2486 if (*input_line_pointer != ':')
2487 {
2488 input_line_pointer = hold;
2489 break;
2490 } /* next piece is not a bitfield */
2491
2492 /* In the general case, we can't allow
2493 full expressions with symbol
2494 differences and such. The relocation
2495 entries for symbols not defined in this
2496 assembly would require arbitrary field
2497 widths, positions, and masks which most
2498 of our current object formats don't
2499 support.
2500
2501 In the specific case where a symbol
2502 *is* defined in this assembly, we
2503 *could* build fixups and track it, but
2504 this could lead to confusion for the
2505 backends. I'm lazy. I'll take any
2506 SEG_ABSOLUTE. I think that means that
2507 you can use a previous .set or
2508 .equ type symbol. xoxorich. */
2509
2510 if (exp->X_op == O_absent)
2511 {
2512 as_warn ("using a bit field width of zero");
2513 exp->X_add_number = 0;
2514 exp->X_op = O_constant;
2515 } /* implied zero width bitfield */
2516
2517 if (exp->X_op != O_constant)
2518 {
2519 *input_line_pointer = '\0';
2520 as_bad ("field width \"%s\" too complex for a bitfield", hold);
2521 *input_line_pointer = ':';
2522 demand_empty_rest_of_line ();
2523 return;
2524 } /* too complex */
2525
2526 if ((width = exp->X_add_number) > (BITS_PER_CHAR * nbytes))
2527 {
2528 as_warn ("field width %lu too big to fit in %d bytes: truncated to %d bits",
2529 width, nbytes, (BITS_PER_CHAR * nbytes));
2530 width = BITS_PER_CHAR * nbytes;
2531 } /* too big */
2532
2533 if (width > bits_available)
2534 {
2535 /* FIXME-SOMEDAY: backing up and reparsing is wasteful. */
2536 input_line_pointer = hold;
2537 exp->X_add_number = value;
2538 break;
2539 } /* won't fit */
2540
2541 hold = ++input_line_pointer; /* skip ':' */
2542
2543 (void) expression (exp);
2544 if (exp->X_op != O_constant)
2545 {
2546 char cache = *input_line_pointer;
2547
2548 *input_line_pointer = '\0';
2549 as_bad ("field value \"%s\" too complex for a bitfield", hold);
2550 *input_line_pointer = cache;
2551 demand_empty_rest_of_line ();
2552 return;
2553 } /* too complex */
2554
2555 value |= ((~(-1 << width) & exp->X_add_number)
2556 << ((BITS_PER_CHAR * nbytes) - bits_available));
2557
2558 if ((bits_available -= width) == 0
2559 || is_it_end_of_statement ()
2560 || *input_line_pointer != ',')
2561 {
2562 break;
2563 } /* all the bitfields we're gonna get */
2564
2565 hold = ++input_line_pointer;
2566 (void) expression (exp);
2567 } /* forever loop */
2568
2569 exp->X_add_number = value;
2570 exp->X_op = O_constant;
2571 exp->X_unsigned = 1;
2572 } /* if looks like a bitfield */
2573 } /* parse_bitfield_cons() */
2574
2575 #endif /* BITFIELD_CONS_EXPRESSIONS */
2576 \f
2577 /* Handle an MRI style string expression. */
2578
2579 static void
2580 parse_mri_cons (exp, nbytes)
2581 expressionS *exp;
2582 unsigned int nbytes;
2583 {
2584 if (*input_line_pointer != '\''
2585 && (input_line_pointer[1] != '\''
2586 || (*input_line_pointer != 'A'
2587 && *input_line_pointer != 'E')))
2588 TC_PARSE_CONS_EXPRESSION (exp, nbytes);
2589 else
2590 {
2591 int scan = 0;
2592 unsigned int result = 0;
2593
2594 /* An MRI style string. Cut into as many bytes as will fit into
2595 a nbyte chunk, left justify if necessary, and separate with
2596 commas so we can try again later. */
2597 if (*input_line_pointer == 'A')
2598 ++input_line_pointer;
2599 else if (*input_line_pointer == 'E')
2600 {
2601 as_bad ("EBCDIC constants are not supported");
2602 ++input_line_pointer;
2603 }
2604
2605 input_line_pointer++;
2606 for (scan = 0; scan < nbytes; scan++)
2607 {
2608 if (*input_line_pointer == '\'')
2609 {
2610 if (input_line_pointer[1] == '\'')
2611 {
2612 input_line_pointer++;
2613 }
2614 else
2615 break;
2616 }
2617 result = (result << 8) | (*input_line_pointer++);
2618 }
2619
2620 /* Left justify */
2621 while (scan < nbytes)
2622 {
2623 result <<= 8;
2624 scan++;
2625 }
2626 /* Create correct expression */
2627 exp->X_op = O_constant;
2628 exp->X_add_number = result;
2629 /* Fake it so that we can read the next char too */
2630 if (input_line_pointer[0] != '\'' ||
2631 (input_line_pointer[0] == '\'' && input_line_pointer[1] == '\''))
2632 {
2633 input_line_pointer -= 2;
2634 input_line_pointer[0] = ',';
2635 input_line_pointer[1] = '\'';
2636 }
2637 else
2638 input_line_pointer++;
2639 }
2640 }
2641 \f
2642 #ifdef REPEAT_CONS_EXPRESSIONS
2643
2644 /* Parse a repeat expression for cons. This is used by the MIPS
2645 assembler. The format is NUMBER:COUNT; NUMBER appears in the
2646 object file COUNT times.
2647
2648 To use this for a target, define REPEAT_CONS_EXPRESSIONS. */
2649
2650 static void
2651 parse_repeat_cons (exp, nbytes)
2652 expressionS *exp;
2653 unsigned int nbytes;
2654 {
2655 expressionS count;
2656 register int i;
2657
2658 expression (exp);
2659
2660 if (*input_line_pointer != ':')
2661 {
2662 /* No repeat count. */
2663 return;
2664 }
2665
2666 ++input_line_pointer;
2667 expression (&count);
2668 if (count.X_op != O_constant
2669 || count.X_add_number <= 0)
2670 {
2671 as_warn ("Unresolvable or nonpositive repeat count; using 1");
2672 return;
2673 }
2674
2675 /* The cons function is going to output this expression once. So we
2676 output it count - 1 times. */
2677 for (i = count.X_add_number - 1; i > 0; i--)
2678 emit_expr (exp, nbytes);
2679 }
2680
2681 #endif /* REPEAT_CONS_EXPRESSIONS */
2682 \f
2683 /* Parse a floating point number represented as a hex constant. This
2684 permits users to specify the exact bits they want in the floating
2685 point number. */
2686
2687 static int
2688 hex_float (float_type, bytes)
2689 int float_type;
2690 char *bytes;
2691 {
2692 int length;
2693 int i;
2694
2695 switch (float_type)
2696 {
2697 case 'f':
2698 case 'F':
2699 case 's':
2700 case 'S':
2701 length = 4;
2702 break;
2703
2704 case 'd':
2705 case 'D':
2706 case 'r':
2707 case 'R':
2708 length = 8;
2709 break;
2710
2711 case 'x':
2712 case 'X':
2713 length = 12;
2714 break;
2715
2716 case 'p':
2717 case 'P':
2718 length = 12;
2719 break;
2720
2721 default:
2722 as_bad ("Unknown floating type type '%c'", float_type);
2723 return -1;
2724 }
2725
2726 /* It would be nice if we could go through expression to parse the
2727 hex constant, but if we get a bignum it's a pain to sort it into
2728 the buffer correctly. */
2729 i = 0;
2730 while (hex_p (*input_line_pointer) || *input_line_pointer == '_')
2731 {
2732 int d;
2733
2734 /* The MRI assembler accepts arbitrary underscores strewn about
2735 through the hex constant, so we ignore them as well. */
2736 if (*input_line_pointer == '_')
2737 {
2738 ++input_line_pointer;
2739 continue;
2740 }
2741
2742 if (i >= length)
2743 {
2744 as_warn ("Floating point constant too large");
2745 return -1;
2746 }
2747 d = hex_value (*input_line_pointer) << 4;
2748 ++input_line_pointer;
2749 while (*input_line_pointer == '_')
2750 ++input_line_pointer;
2751 if (hex_p (*input_line_pointer))
2752 {
2753 d += hex_value (*input_line_pointer);
2754 ++input_line_pointer;
2755 }
2756 if (target_big_endian)
2757 bytes[i] = d;
2758 else
2759 bytes[length - i - 1] = d;
2760 ++i;
2761 }
2762
2763 if (i < length)
2764 {
2765 if (target_big_endian)
2766 memset (bytes + i, 0, length - i);
2767 else
2768 memset (bytes, 0, length - i);
2769 }
2770
2771 return length;
2772 }
2773
2774 /*
2775 * float_cons()
2776 *
2777 * CONStruct some more frag chars of .floats .ffloats etc.
2778 * Makes 0 or more new frags.
2779 * If need_pass_2 == 1, no frags are emitted.
2780 * This understands only floating literals, not expressions. Sorry.
2781 *
2782 * A floating constant is defined by atof_generic(), except it is preceded
2783 * by 0d 0f 0g or 0h. After observing the STRANGE way my BSD AS does its
2784 * reading, I decided to be incompatible. This always tries to give you
2785 * rounded bits to the precision of the pseudo-op. Former AS did premature
2786 * truncatation, restored noisy bits instead of trailing 0s AND gave you
2787 * a choice of 2 flavours of noise according to which of 2 floating-point
2788 * scanners you directed AS to use.
2789 *
2790 * In: input_line_pointer->whitespace before, or '0' of flonum.
2791 *
2792 */
2793
2794 void
2795 float_cons (float_type)
2796 /* Clobbers input_line-pointer, checks end-of-line. */
2797 register int float_type; /* 'f':.ffloat ... 'F':.float ... */
2798 {
2799 register char *p;
2800 int length; /* Number of chars in an object. */
2801 register char *err; /* Error from scanning floating literal. */
2802 char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
2803
2804 if (is_it_end_of_statement ())
2805 {
2806 demand_empty_rest_of_line ();
2807 return;
2808 }
2809
2810 do
2811 {
2812 /* input_line_pointer->1st char of a flonum (we hope!). */
2813 SKIP_WHITESPACE ();
2814
2815 /* Skip any 0{letter} that may be present. Don't even check if the
2816 * letter is legal. Someone may invent a "z" format and this routine
2817 * has no use for such information. Lusers beware: you get
2818 * diagnostics if your input is ill-conditioned.
2819 */
2820 if (input_line_pointer[0] == '0' && isalpha (input_line_pointer[1]))
2821 input_line_pointer += 2;
2822
2823 /* Accept :xxxx, where the x's are hex digits, for a floating
2824 point with the exact digits specified. */
2825 if (input_line_pointer[0] == ':')
2826 {
2827 ++input_line_pointer;
2828 length = hex_float (float_type, temp);
2829 if (length < 0)
2830 {
2831 ignore_rest_of_line ();
2832 return;
2833 }
2834 }
2835 else
2836 {
2837 err = md_atof (float_type, temp, &length);
2838 know (length <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
2839 know (length > 0);
2840 if (err)
2841 {
2842 as_bad ("Bad floating literal: %s", err);
2843 ignore_rest_of_line ();
2844 return;
2845 }
2846 }
2847
2848 if (!need_pass_2)
2849 {
2850 int count;
2851
2852 count = 1;
2853
2854 #ifdef REPEAT_CONS_EXPRESSIONS
2855 if (*input_line_pointer == ':')
2856 {
2857 expressionS count_exp;
2858
2859 ++input_line_pointer;
2860 expression (&count_exp);
2861 if (count_exp.X_op != O_constant
2862 || count_exp.X_add_number <= 0)
2863 {
2864 as_warn ("unresolvable or nonpositive repeat count; using 1");
2865 }
2866 else
2867 count = count_exp.X_add_number;
2868 }
2869 #endif
2870
2871 while (--count >= 0)
2872 {
2873 p = frag_more (length);
2874 memcpy (p, temp, (unsigned int) length);
2875 }
2876 }
2877 SKIP_WHITESPACE ();
2878 }
2879 while (*input_line_pointer++ == ',');
2880
2881 --input_line_pointer; /* Put terminator back into stream. */
2882 demand_empty_rest_of_line ();
2883 } /* float_cons() */
2884 \f
2885 /*
2886 * stringer()
2887 *
2888 * We read 0 or more ',' seperated, double-quoted strings.
2889 *
2890 * Caller should have checked need_pass_2 is FALSE because we don't check it.
2891 */
2892
2893
2894 void
2895 stringer (append_zero) /* Worker to do .ascii etc statements. */
2896 /* Checks end-of-line. */
2897 register int append_zero; /* 0: don't append '\0', else 1 */
2898 {
2899 register unsigned int c;
2900
2901 #ifdef md_flush_pending_output
2902 md_flush_pending_output ();
2903 #endif
2904
2905 /*
2906 * The following awkward logic is to parse ZERO or more strings,
2907 * comma seperated. Recall a string expression includes spaces
2908 * before the opening '\"' and spaces after the closing '\"'.
2909 * We fake a leading ',' if there is (supposed to be)
2910 * a 1st, expression. We keep demanding expressions for each
2911 * ','.
2912 */
2913 if (is_it_end_of_statement ())
2914 {
2915 c = 0; /* Skip loop. */
2916 ++input_line_pointer; /* Compensate for end of loop. */
2917 }
2918 else
2919 {
2920 c = ','; /* Do loop. */
2921 }
2922 while (c == ',' || c == '<' || c == '"')
2923 {
2924 SKIP_WHITESPACE ();
2925 switch (*input_line_pointer)
2926 {
2927 case '\"':
2928 ++input_line_pointer; /*->1st char of string. */
2929 while (is_a_char (c = next_char_of_string ()))
2930 {
2931 FRAG_APPEND_1_CHAR (c);
2932 }
2933 if (append_zero)
2934 {
2935 FRAG_APPEND_1_CHAR (0);
2936 }
2937 know (input_line_pointer[-1] == '\"');
2938 break;
2939 case '<':
2940 input_line_pointer++;
2941 c = get_single_number ();
2942 FRAG_APPEND_1_CHAR (c);
2943 if (*input_line_pointer != '>')
2944 {
2945 as_bad ("Expected <nn>");
2946 }
2947 input_line_pointer++;
2948 break;
2949 case ',':
2950 input_line_pointer++;
2951 break;
2952 }
2953 SKIP_WHITESPACE ();
2954 c = *input_line_pointer;
2955 }
2956
2957 demand_empty_rest_of_line ();
2958 } /* stringer() */
2959 \f
2960 /* FIXME-SOMEDAY: I had trouble here on characters with the
2961 high bits set. We'll probably also have trouble with
2962 multibyte chars, wide chars, etc. Also be careful about
2963 returning values bigger than 1 byte. xoxorich. */
2964
2965 unsigned int
2966 next_char_of_string ()
2967 {
2968 register unsigned int c;
2969
2970 c = *input_line_pointer++ & CHAR_MASK;
2971 switch (c)
2972 {
2973 case '\"':
2974 c = NOT_A_CHAR;
2975 break;
2976
2977 #ifndef NO_STRING_ESCAPES
2978 case '\\':
2979 switch (c = *input_line_pointer++)
2980 {
2981 case 'b':
2982 c = '\b';
2983 break;
2984
2985 case 'f':
2986 c = '\f';
2987 break;
2988
2989 case 'n':
2990 c = '\n';
2991 break;
2992
2993 case 'r':
2994 c = '\r';
2995 break;
2996
2997 case 't':
2998 c = '\t';
2999 break;
3000
3001 case 'v':
3002 c = '\013';
3003 break;
3004
3005 case '\\':
3006 case '"':
3007 break; /* As itself. */
3008
3009 case '0':
3010 case '1':
3011 case '2':
3012 case '3':
3013 case '4':
3014 case '5':
3015 case '6':
3016 case '7':
3017 case '8':
3018 case '9':
3019 {
3020 long number;
3021 int i;
3022
3023 for (i = 0, number = 0; isdigit (c) && i < 3; c = *input_line_pointer++, i++)
3024 {
3025 number = number * 8 + c - '0';
3026 }
3027 c = number & 0xff;
3028 }
3029 --input_line_pointer;
3030 break;
3031
3032 case 'x':
3033 case 'X':
3034 {
3035 long number;
3036
3037 number = 0;
3038 c = *input_line_pointer++;
3039 while (isxdigit (c))
3040 {
3041 if (isdigit (c))
3042 number = number * 16 + c - '0';
3043 else if (isupper (c))
3044 number = number * 16 + c - 'A' + 10;
3045 else
3046 number = number * 16 + c - 'a' + 10;
3047 c = *input_line_pointer++;
3048 }
3049 c = number & 0xff;
3050 --input_line_pointer;
3051 }
3052 break;
3053
3054 case '\n':
3055 /* To be compatible with BSD 4.2 as: give the luser a linefeed!! */
3056 as_warn ("Unterminated string: Newline inserted.");
3057 c = '\n';
3058 break;
3059
3060 default:
3061
3062 #ifdef ONLY_STANDARD_ESCAPES
3063 as_bad ("Bad escaped character in string, '?' assumed");
3064 c = '?';
3065 #endif /* ONLY_STANDARD_ESCAPES */
3066
3067 break;
3068 } /* switch on escaped char */
3069 break;
3070 #endif /* ! defined (NO_STRING_ESCAPES) */
3071
3072 default:
3073 break;
3074 } /* switch on char */
3075 return (c);
3076 } /* next_char_of_string() */
3077 \f
3078 static segT
3079 get_segmented_expression (expP)
3080 register expressionS *expP;
3081 {
3082 register segT retval;
3083
3084 retval = expression (expP);
3085 if (expP->X_op == O_illegal
3086 || expP->X_op == O_absent
3087 || expP->X_op == O_big)
3088 {
3089 as_bad ("expected address expression; zero assumed");
3090 expP->X_op = O_constant;
3091 expP->X_add_number = 0;
3092 retval = absolute_section;
3093 }
3094 return retval;
3095 }
3096
3097 static segT
3098 get_known_segmented_expression (expP)
3099 register expressionS *expP;
3100 {
3101 register segT retval;
3102
3103 if ((retval = get_segmented_expression (expP)) == undefined_section)
3104 {
3105 /* There is no easy way to extract the undefined symbol from the
3106 expression. */
3107 if (expP->X_add_symbol != NULL
3108 && S_GET_SEGMENT (expP->X_add_symbol) != expr_section)
3109 as_warn ("symbol \"%s\" undefined; zero assumed",
3110 S_GET_NAME (expP->X_add_symbol));
3111 else
3112 as_warn ("some symbol undefined; zero assumed");
3113 retval = absolute_section;
3114 expP->X_op = O_constant;
3115 expP->X_add_number = 0;
3116 }
3117 know (retval == absolute_section || SEG_NORMAL (retval));
3118 return (retval);
3119 } /* get_known_segmented_expression() */
3120
3121 offsetT
3122 get_absolute_expression ()
3123 {
3124 expressionS exp;
3125
3126 expression (&exp);
3127 if (exp.X_op != O_constant)
3128 {
3129 if (exp.X_op != O_absent)
3130 as_bad ("bad or irreducible absolute expression; zero assumed");
3131 exp.X_add_number = 0;
3132 }
3133 return exp.X_add_number;
3134 }
3135
3136 char /* return terminator */
3137 get_absolute_expression_and_terminator (val_pointer)
3138 long *val_pointer; /* return value of expression */
3139 {
3140 /* FIXME: val_pointer should probably be offsetT *. */
3141 *val_pointer = (long) get_absolute_expression ();
3142 return (*input_line_pointer++);
3143 }
3144 \f
3145 /*
3146 * demand_copy_C_string()
3147 *
3148 * Like demand_copy_string, but return NULL if the string contains any '\0's.
3149 * Give a warning if that happens.
3150 */
3151 char *
3152 demand_copy_C_string (len_pointer)
3153 int *len_pointer;
3154 {
3155 register char *s;
3156
3157 if ((s = demand_copy_string (len_pointer)) != 0)
3158 {
3159 register int len;
3160
3161 for (len = *len_pointer;
3162 len > 0;
3163 len--)
3164 {
3165 if (*s == 0)
3166 {
3167 s = 0;
3168 len = 1;
3169 *len_pointer = 0;
3170 as_bad ("This string may not contain \'\\0\'");
3171 }
3172 }
3173 }
3174 return (s);
3175 }
3176 \f
3177 /*
3178 * demand_copy_string()
3179 *
3180 * Demand string, but return a safe (=private) copy of the string.
3181 * Return NULL if we can't read a string here.
3182 */
3183 char *
3184 demand_copy_string (lenP)
3185 int *lenP;
3186 {
3187 register unsigned int c;
3188 register int len;
3189 char *retval;
3190
3191 len = 0;
3192 SKIP_WHITESPACE ();
3193 if (*input_line_pointer == '\"')
3194 {
3195 input_line_pointer++; /* Skip opening quote. */
3196
3197 while (is_a_char (c = next_char_of_string ()))
3198 {
3199 obstack_1grow (&notes, c);
3200 len++;
3201 }
3202 /* JF this next line is so demand_copy_C_string will return a null
3203 termanated string. */
3204 obstack_1grow (&notes, '\0');
3205 retval = obstack_finish (&notes);
3206 }
3207 else
3208 {
3209 as_warn ("Missing string");
3210 retval = NULL;
3211 ignore_rest_of_line ();
3212 }
3213 *lenP = len;
3214 return (retval);
3215 } /* demand_copy_string() */
3216 \f
3217 /*
3218 * is_it_end_of_statement()
3219 *
3220 * In: Input_line_pointer->next character.
3221 *
3222 * Do: Skip input_line_pointer over all whitespace.
3223 *
3224 * Out: 1 if input_line_pointer->end-of-line.
3225 */
3226 int
3227 is_it_end_of_statement ()
3228 {
3229 SKIP_WHITESPACE ();
3230 return (is_end_of_line[(unsigned char) *input_line_pointer]);
3231 } /* is_it_end_of_statement() */
3232
3233 void
3234 equals (sym_name)
3235 char *sym_name;
3236 {
3237 register symbolS *symbolP; /* symbol we are working with */
3238
3239 input_line_pointer++;
3240 if (*input_line_pointer == '=')
3241 input_line_pointer++;
3242
3243 while (*input_line_pointer == ' ' || *input_line_pointer == '\t')
3244 input_line_pointer++;
3245
3246 if (sym_name[0] == '.' && sym_name[1] == '\0')
3247 {
3248 /* Turn '. = mumble' into a .org mumble */
3249 register segT segment;
3250 expressionS exp;
3251
3252 segment = get_known_segmented_expression (&exp);
3253 if (!need_pass_2)
3254 do_org (segment, &exp, 0);
3255 }
3256 else
3257 {
3258 symbolP = symbol_find_or_make (sym_name);
3259 pseudo_set (symbolP);
3260 }
3261 } /* equals() */
3262
3263 /* .include -- include a file at this point. */
3264
3265 /* ARGSUSED */
3266 void
3267 s_include (arg)
3268 int arg;
3269 {
3270 char *newbuf;
3271 char *filename;
3272 int i;
3273 FILE *try;
3274 char *path;
3275
3276 if (! flag_mri)
3277 filename = demand_copy_string (&i);
3278 else
3279 {
3280 SKIP_WHITESPACE ();
3281 i = 0;
3282 while (! is_end_of_line[(unsigned char) *input_line_pointer]
3283 && *input_line_pointer != ' '
3284 && *input_line_pointer != '\t')
3285 {
3286 obstack_1grow (&notes, *input_line_pointer);
3287 ++input_line_pointer;
3288 ++i;
3289 }
3290 obstack_1grow (&notes, '\0');
3291 filename = obstack_finish (&notes);
3292 }
3293 demand_empty_rest_of_line ();
3294 path = xmalloc ((unsigned long) i + include_dir_maxlen + 5 /* slop */ );
3295 for (i = 0; i < include_dir_count; i++)
3296 {
3297 strcpy (path, include_dirs[i]);
3298 strcat (path, "/");
3299 strcat (path, filename);
3300 if (0 != (try = fopen (path, "r")))
3301 {
3302 fclose (try);
3303 goto gotit;
3304 }
3305 }
3306 free (path);
3307 path = filename;
3308 gotit:
3309 /* malloc Storage leak when file is found on path. FIXME-SOMEDAY. */
3310 newbuf = input_scrub_include_file (path, input_line_pointer);
3311 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
3312 } /* s_include() */
3313
3314 void
3315 add_include_dir (path)
3316 char *path;
3317 {
3318 int i;
3319
3320 if (include_dir_count == 0)
3321 {
3322 include_dirs = (char **) xmalloc (2 * sizeof (*include_dirs));
3323 include_dirs[0] = "."; /* Current dir */
3324 include_dir_count = 2;
3325 }
3326 else
3327 {
3328 include_dir_count++;
3329 include_dirs = (char **) realloc (include_dirs,
3330 include_dir_count * sizeof (*include_dirs));
3331 }
3332
3333 include_dirs[include_dir_count - 1] = path; /* New one */
3334
3335 i = strlen (path);
3336 if (i > include_dir_maxlen)
3337 include_dir_maxlen = i;
3338 } /* add_include_dir() */
3339
3340 void
3341 s_ignore (arg)
3342 int arg;
3343 {
3344 while (!is_end_of_line[(unsigned char) *input_line_pointer])
3345 {
3346 ++input_line_pointer;
3347 }
3348 ++input_line_pointer;
3349 }
3350
3351
3352 /* end of read.c */