1 /* read.c - read a source file -
2 Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
3 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
23 /* If your chars aren't 8 bits, you will change this a bit.
24 But then, GNU isn't spozed to run on your machine anyway.
25 (RMS is so shortsighted sometimes.) */
26 #define MASK_CHAR (0xFF)
28 #define MASK_CHAR ((int)(unsigned char) -1)
31 /* This is the largest known floating point format (for now). It will
32 grow when we do 4361 style flonums. */
33 #define MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT (16)
35 /* Routines that read assembler source text to build spaghetti in memory.
36 Another group of these functions is in the expr.c module. */
39 #include "safe-ctype.h"
46 #include "dw2gencfi.h"
48 #ifndef TC_START_LABEL
49 #define TC_START_LABEL(x,y) (x == ':')
52 /* Set by the object-format or the target. */
53 #ifndef TC_IMPLICIT_LCOMM_ALIGNMENT
54 #define TC_IMPLICIT_LCOMM_ALIGNMENT(SIZE, P2VAR) \
59 else if ((SIZE) >= 4) \
61 else if ((SIZE) >= 2) \
69 char *input_line_pointer
; /*->next char of source file to parse. */
71 #if BITS_PER_CHAR != 8
72 /* The following table is indexed by[(char)] and will break if
73 a char does not have exactly 256 states (hopefully 0:255!)! */
78 /* The m88k unfortunately uses @ as a label beginner. */
83 /* The RS/6000 assembler uses {,},[,] as parts of symbol names. */
88 /* The Delta 68k assembler permits % inside label names. */
93 /* The PowerPC Windows NT assemblers permits ? inside label names. */
98 /* The IA-64 assembler uses # as a suffix designating a symbol. We include
99 it in the symbol and strip it out in tc_canonicalize_symbol_name. */
104 /* The a29k assembler does not permits labels to start with $. */
109 /* The Delta 68k assembler permits ~ at start of label names. */
113 /* Used by is_... macros. our ctype[]. */
114 char lex_type
[256] = {
115 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* @ABCDEFGHIJKLMNO */
116 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ[\]^_ */
117 0, 0, 0, LEX_HASH
, LEX_DOLLAR
, LEX_PCT
, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* _!"#$%&'()*+,-./ */
118 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, LEX_QM
, /* 0123456789:;<=>? */
119 LEX_AT
, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* @ABCDEFGHIJKLMNO */
120 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR
, 0, LEX_BR
, 0, 3, /* PQRSTUVWXYZ[\]^_ */
121 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* `abcdefghijklmno */
122 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR
, 0, LEX_BR
, LEX_TILDE
, 0, /* pqrstuvwxyz{|}~. */
123 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
124 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
125 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
126 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
127 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
128 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
129 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
130 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
134 Out: 1 if this character ends a line. */
135 char is_end_of_line
[256] = {
137 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, /* @abcdefghijklmno */
139 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, /* @abcdefghijklmno */
141 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
142 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* _!"#$%&'()*+,-./ */
143 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0123456789:;<=>? */
144 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
145 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
146 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
147 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
148 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
149 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
150 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
151 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
152 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
153 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
154 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
155 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* */
158 #ifndef TC_CASE_SENSITIVE
159 char original_case_string
[128];
162 /* Functions private to this file. */
164 static char *buffer
; /* 1st char of each buffer of lines is here. */
165 static char *buffer_limit
; /*->1 + last char in buffer. */
167 /* TARGET_BYTES_BIG_ENDIAN is required to be defined to either 0 or 1
168 in the tc-<CPU>.h file. See the "Porting GAS" section of the
170 int target_big_endian
= TARGET_BYTES_BIG_ENDIAN
;
172 /* Variables for handling include file directory table. */
174 /* Table of pointers to directories to search for .include's. */
177 /* How many are in the table. */
178 int include_dir_count
;
180 /* Length of longest in table. */
181 int include_dir_maxlen
= 1;
183 #ifndef WORKING_DOT_WORD
184 struct broken_word
*broken_words
;
185 int new_broken_words
;
188 /* The current offset into the absolute section. We don't try to
189 build frags in the absolute section, since no data can be stored
190 there. We just keep track of the current offset. */
191 addressT abs_section_offset
;
193 /* If this line had an MRI style label, it is stored in this variable.
194 This is used by some of the MRI pseudo-ops. */
197 /* This global variable is used to support MRI common sections. We
198 translate such sections into a common symbol. This variable is
199 non-NULL when we are in an MRI common section. */
200 symbolS
*mri_common_symbol
;
202 /* In MRI mode, after a dc.b pseudo-op with an odd number of bytes, we
203 need to align to an even byte boundary unless the next pseudo-op is
204 dc.b, ds.b, or dcb.b. This variable is set to 1 if an alignment
206 static int mri_pending_align
;
210 /* This variable is set to be non-zero if the next string we see might
211 be the name of the source file in DWARF debugging information. See
212 the comment in emit_expr for the format we look for. */
213 static int dwarf_file_string
;
217 static void do_align (int, char *, int, int);
218 static void s_align (int, int);
219 static void s_altmacro (int);
220 static int hex_float (int, char *);
221 static segT
get_known_segmented_expression (expressionS
* expP
);
222 static void pobegin (void);
223 static int get_line_sb (sb
*);
224 static void generate_file_debug (void);
232 obj_read_begin_hook ();
234 /* Something close -- but not too close -- to a multiple of 1024.
235 The debugging malloc I'm using has 24 bytes of overhead. */
236 obstack_begin (¬es
, chunksize
);
237 obstack_begin (&cond_obstack
, chunksize
);
239 /* Use machine dependent syntax. */
240 for (p
= line_separator_chars
; *p
; p
++)
241 is_end_of_line
[(unsigned char) *p
] = 1;
242 /* Use more. FIXME-SOMEDAY. */
248 /* Set up pseudo-op tables. */
250 static struct hash_control
*po_hash
;
252 static const pseudo_typeS potable
[] = {
253 {"abort", s_abort
, 0},
254 {"align", s_align_ptwo
, 0},
255 {"altmacro", s_altmacro
, 1},
256 {"ascii", stringer
, 0},
257 {"asciz", stringer
, 1},
258 {"balign", s_align_bytes
, 0},
259 {"balignw", s_align_bytes
, -2},
260 {"balignl", s_align_bytes
, -4},
264 {"common", s_mri_common
, 0},
265 {"common.s", s_mri_common
, 1},
269 {"dc.d", float_cons
, 'd'},
271 {"dc.s", float_cons
, 'f'},
273 {"dc.x", float_cons
, 'x'},
275 {"dcb.b", s_space
, 1},
276 {"dcb.d", s_float_space
, 'd'},
277 {"dcb.l", s_space
, 4},
278 {"dcb.s", s_float_space
, 'f'},
279 {"dcb.w", s_space
, 2},
280 {"dcb.x", s_float_space
, 'x'},
282 {"ds.b", s_space
, 1},
283 {"ds.d", s_space
, 8},
284 {"ds.l", s_space
, 4},
285 {"ds.p", s_space
, 12},
286 {"ds.s", s_space
, 4},
287 {"ds.w", s_space
, 2},
288 {"ds.x", s_space
, 12},
289 {"debug", s_ignore
, 0},
294 {"double", float_cons
, 'd'},
296 {"eject", listing_eject
, 0}, /* Formfeed listing. */
298 {"elsec", s_else
, 0},
299 {"elseif", s_elseif
, (int) O_ne
},
301 {"endc", s_endif
, 0},
302 {"endfunc", s_func
, 1},
303 {"endif", s_endif
, 0},
304 {"endr", s_bad_endr
, 0},
309 {"exitm", s_mexit
, 0},
311 {"extern", s_ignore
, 0}, /* We treat all undef as ext. */
312 {"appfile", s_app_file
, 1},
313 {"appline", s_app_line
, 0},
315 {"file", s_app_file
, 0},
317 {"float", float_cons
, 'f'},
318 {"format", s_ignore
, 0},
320 {"global", s_globl
, 0},
321 {"globl", s_globl
, 0},
323 {"if", s_if
, (int) O_ne
},
325 {"ifdef", s_ifdef
, 0},
326 {"ifeq", s_if
, (int) O_eq
},
327 {"ifeqs", s_ifeqs
, 0},
328 {"ifge", s_if
, (int) O_ge
},
329 {"ifgt", s_if
, (int) O_gt
},
330 {"ifle", s_if
, (int) O_le
},
331 {"iflt", s_if
, (int) O_lt
},
333 {"ifndef", s_ifdef
, 1},
334 {"ifne", s_if
, (int) O_ne
},
335 {"ifnes", s_ifeqs
, 1},
336 {"ifnotdef", s_ifdef
, 1},
337 {"incbin", s_incbin
, 0},
338 {"include", s_include
, 0},
344 {"lcomm", s_lcomm
, 0},
345 {"lflags", listing_flags
, 0}, /* Listing flags. */
346 {"linkonce", s_linkonce
, 0},
347 {"list", listing_list
, 1}, /* Turn listing on. */
348 {"llen", listing_psize
, 1},
351 {"macro", s_macro
, 0},
352 {"mexit", s_mexit
, 0},
354 {".mri", s_mri
, 0}, /* Special case so .mri works in MRI mode. */
355 {"name", s_ignore
, 0},
356 {"noaltmacro", s_altmacro
, 0},
357 {"noformat", s_ignore
, 0},
358 {"nolist", listing_list
, 0}, /* Turn listing off. */
359 {"nopage", listing_nopage
, 0},
361 {"offset", s_struct
, 0},
363 {"p2align", s_align_ptwo
, 0},
364 {"p2alignw", s_align_ptwo
, -2},
365 {"p2alignl", s_align_ptwo
, -4},
366 {"page", listing_eject
, 0},
367 {"plen", listing_psize
, 0},
368 {"print", s_print
, 0},
369 {"psize", listing_psize
, 0}, /* Set paper size. */
370 {"purgem", s_purgem
, 0},
375 {"sbttl", listing_title
, 1}, /* Subtitle of listing. */
380 {"single", float_cons
, 'f'},
382 {"space", s_space
, 0},
383 {"skip", s_space
, 0},
384 {"sleb128", s_leb128
, 1},
385 {"spc", s_ignore
, 0},
386 {"stabd", s_stab
, 'd'},
387 {"stabn", s_stab
, 'n'},
388 {"stabs", s_stab
, 's'},
389 {"string", stringer
, 1},
390 {"struct", s_struct
, 0},
394 /* This is for gcc to use. It's only just been added (2/94), so gcc
395 won't be able to use it for a while -- probably a year or more.
396 But once this has been released, check with gcc maintainers
397 before deleting it or even changing the spelling. */
398 {"this_GCC_requires_the_GNU_assembler", s_ignore
, 0},
399 /* If we're folding case -- done for some targets, not necessarily
400 all -- the above string in an input file will be converted to
401 this one. Match it either way... */
402 {"this_gcc_requires_the_gnu_assembler", s_ignore
, 0},
404 {"title", listing_title
, 0}, /* Listing title. */
405 {"ttl", listing_title
, 0},
407 {"uleb128", s_leb128
, 0},
411 {"xdef", s_globl
, 0},
412 {"xref", s_ignore
, 0},
413 {"xstabs", s_xstab
, 's'},
415 {"zero", s_space
, 0},
416 {NULL
, NULL
, 0} /* End sentinel. */
419 static int pop_override_ok
= 0;
420 static const char *pop_table_name
;
423 pop_insert (const pseudo_typeS
*table
)
426 const pseudo_typeS
*pop
;
427 for (pop
= table
; pop
->poc_name
; pop
++)
429 errtxt
= hash_insert (po_hash
, pop
->poc_name
, (char *) pop
);
430 if (errtxt
&& (!pop_override_ok
|| strcmp (errtxt
, "exists")))
431 as_fatal (_("error constructing %s pseudo-op table: %s"), pop_table_name
,
436 #ifndef md_pop_insert
437 #define md_pop_insert() pop_insert(md_pseudo_table)
440 #ifndef obj_pop_insert
441 #define obj_pop_insert() pop_insert(obj_pseudo_table)
444 #ifndef cfi_pop_insert
445 #define cfi_pop_insert() pop_insert(cfi_pseudo_table)
451 po_hash
= hash_new ();
453 /* Do the target-specific pseudo ops. */
454 pop_table_name
= "md";
457 /* Now object specific. Skip any that were in the target table. */
458 pop_table_name
= "obj";
462 /* Now portable ones. Skip any that we've seen already. */
463 pop_table_name
= "standard";
464 pop_insert (potable
);
466 #ifdef TARGET_USE_CFIPOP
467 pop_table_name
= "cfi";
473 #define HANDLE_CONDITIONAL_ASSEMBLY() \
474 if (ignore_input ()) \
476 while (!is_end_of_line[(unsigned char) *input_line_pointer++]) \
477 if (input_line_pointer == buffer_limit) \
482 /* This function is used when scrubbing the characters between #APP
485 static char *scrub_string
;
486 static char *scrub_string_end
;
489 scrub_from_string (char *buf
, int buflen
)
493 copy
= scrub_string_end
- scrub_string
;
496 memcpy (buf
, scrub_string
, copy
);
497 scrub_string
+= copy
;
501 /* We read the file, putting things into a web that represents what we
502 have been reading. */
504 read_a_source_file (char *name
)
507 register char *s
; /* String of symbol, '\0' appended. */
515 buffer
= input_scrub_new_file (name
);
518 listing_newline (NULL
);
519 register_dependency (name
);
521 /* Generate debugging information before we've read anything in to denote
522 this file as the "main" source file and not a subordinate one
523 (e.g. N_SO vs N_SOL in stabs). */
524 generate_file_debug ();
526 while ((buffer_limit
= input_scrub_next_buffer (&input_line_pointer
)) != 0)
527 { /* We have another line to parse. */
528 know (buffer_limit
[-1] == '\n'); /* Must have a sentinel. */
530 while (input_line_pointer
< buffer_limit
)
532 /* We have more of this buffer to parse. */
534 /* We now have input_line_pointer->1st char of next line.
535 If input_line_pointer [-1] == '\n' then we just
536 scanned another line: so bump line counters. */
537 if (is_end_of_line
[(unsigned char) input_line_pointer
[-1]])
539 #ifdef md_start_line_hook
540 md_start_line_hook ();
542 if (input_line_pointer
[-1] == '\n')
543 bump_line_counters ();
547 if (LABELS_WITHOUT_COLONS
|| flag_m68k_mri
)
549 /* Text at the start of a line must be a label, we
550 run down and stick a colon in. */
551 if (is_name_beginner (*input_line_pointer
))
553 char *line_start
= input_line_pointer
;
558 HANDLE_CONDITIONAL_ASSEMBLY ();
560 c
= get_symbol_end ();
562 /* In MRI mode, the EQU and MACRO pseudoops must
563 be handled specially. */
567 char *rest
= input_line_pointer
+ 1;
571 if (*rest
== ' ' || *rest
== '\t')
573 if ((strncasecmp (rest
, "EQU", 3) == 0
574 || strncasecmp (rest
, "SET", 3) == 0)
575 && (rest
[3] == ' ' || rest
[3] == '\t'))
577 input_line_pointer
= rest
+ 3;
579 strncasecmp (rest
, "SET", 3) == 0);
582 if (strncasecmp (rest
, "MACRO", 5) == 0
585 || is_end_of_line
[(unsigned char) rest
[5]]))
589 /* In MRI mode, we need to handle the MACRO
590 pseudo-op specially: we don't want to put the
591 symbol in the symbol table. */
593 #ifdef TC_START_LABEL_WITHOUT_COLON
594 && TC_START_LABEL_WITHOUT_COLON(c
,
598 line_label
= colon (line_start
);
600 line_label
= symbol_create (line_start
,
605 *input_line_pointer
= c
;
607 input_line_pointer
++;
612 /* We are at the beginning of a line, or similar place.
613 We expect a well-formed assembler statement.
614 A "symbol-name:" is a statement.
616 Depending on what compiler is used, the order of these tests
617 may vary to catch most common case 1st.
618 Each test is independent of all other tests at the (top) level.
619 PLEASE make a compiler that doesn't use this assembler.
620 It is crufty to waste a compiler's time encoding things for this
621 assembler, which then wastes more time decoding it.
622 (And communicating via (linear) files is silly!
623 If you must pass stuff, please pass a tree!) */
624 if ((c
= *input_line_pointer
++) == '\t'
628 c
= *input_line_pointer
++;
630 know (c
!= ' '); /* No further leading whitespace. */
633 /* If listing is on, and we are expanding a macro, then give
634 the listing code the contents of the expanded line. */
637 if ((listing
& LISTING_MACEXP
) && macro_nest
> 0)
642 /* Find the end of the current expanded macro line. */
643 for (s
= input_line_pointer
- 1; *s
; ++s
)
644 if (is_end_of_line
[(unsigned char) *s
])
647 /* Copy it for safe keeping. Also give an indication of
648 how much macro nesting is involved at this point. */
649 len
= s
- (input_line_pointer
- 1);
650 copy
= (char *) xmalloc (len
+ macro_nest
+ 2);
651 memset (copy
, '>', macro_nest
);
652 copy
[macro_nest
] = ' ';
653 memcpy (copy
+ macro_nest
+ 1, input_line_pointer
- 1, len
);
654 copy
[macro_nest
+ 1 + len
] = '\0';
656 /* Install the line with the listing facility. */
657 listing_newline (copy
);
660 listing_newline (NULL
);
663 /* C is the 1st significant character.
664 Input_line_pointer points after that character. */
665 if (is_name_beginner (c
))
667 /* Want user-defined label or pseudo/opcode. */
668 HANDLE_CONDITIONAL_ASSEMBLY ();
670 s
= --input_line_pointer
;
671 c
= get_symbol_end (); /* name's delimiter. */
673 /* C is character after symbol.
674 That character's place in the input line is now '\0'.
675 S points to the beginning of the symbol.
676 [In case of pseudo-op, s->'.'.]
677 Input_line_pointer->'\0' where c was. */
678 if (TC_START_LABEL (c
, input_line_pointer
))
682 char *rest
= input_line_pointer
+ 1;
684 /* In MRI mode, \tsym: set 0 is permitted. */
688 if (*rest
== ' ' || *rest
== '\t')
691 if ((strncasecmp (rest
, "EQU", 3) == 0
692 || strncasecmp (rest
, "SET", 3) == 0)
693 && (rest
[3] == ' ' || rest
[3] == '\t'))
695 input_line_pointer
= rest
+ 3;
701 line_label
= colon (s
); /* User-defined label. */
702 /* Put ':' back for error messages' sake. */
703 *input_line_pointer
++ = ':';
704 #ifdef tc_check_label
705 tc_check_label (line_label
);
707 /* Input_line_pointer->after ':'. */
711 || ((c
== ' ' || c
== '\t')
712 && input_line_pointer
[1] == '='
713 #ifdef TC_EQUAL_IN_INSN
714 && !TC_EQUAL_IN_INSN (c
, input_line_pointer
)
719 demand_empty_rest_of_line ();
723 /* Expect pseudo-op or machine instruction. */
726 #ifndef TC_CASE_SENSITIVE
730 strncpy (original_case_string
, s2
, sizeof (original_case_string
));
731 original_case_string
[sizeof (original_case_string
) - 1] = 0;
740 if (NO_PSEUDO_DOT
|| flag_m68k_mri
)
742 /* The MRI assembler and the m88k use pseudo-ops
744 pop
= (pseudo_typeS
*) hash_find (po_hash
, s
);
745 if (pop
!= NULL
&& pop
->poc_handler
== NULL
)
750 || (!flag_m68k_mri
&& *s
== '.'))
754 WARNING: c has next char, which may be end-of-line.
755 We lookup the pseudo-op table with s+1 because we
756 already know that the pseudo-op begins with a '.'. */
759 pop
= (pseudo_typeS
*) hash_find (po_hash
, s
+ 1);
760 if (pop
&& !pop
->poc_handler
)
763 /* In MRI mode, we may need to insert an
764 automatic alignment directive. What a hack
766 if (mri_pending_align
768 || !((pop
->poc_handler
== cons
769 && pop
->poc_val
== 1)
770 || (pop
->poc_handler
== s_space
771 && pop
->poc_val
== 1)
772 #ifdef tc_conditional_pseudoop
773 || tc_conditional_pseudoop (pop
)
775 || pop
->poc_handler
== s_if
776 || pop
->poc_handler
== s_ifdef
777 || pop
->poc_handler
== s_ifc
778 || pop
->poc_handler
== s_ifeqs
779 || pop
->poc_handler
== s_else
780 || pop
->poc_handler
== s_endif
781 || pop
->poc_handler
== s_globl
782 || pop
->poc_handler
== s_ignore
)))
784 do_align (1, (char *) NULL
, 0, 0);
785 mri_pending_align
= 0;
787 if (line_label
!= NULL
)
789 symbol_set_frag (line_label
, frag_now
);
790 S_SET_VALUE (line_label
, frag_now_fix ());
794 /* Print the error msg now, while we still can. */
797 as_bad (_("unknown pseudo-op: `%s'"), s
);
798 *input_line_pointer
= c
;
803 /* Put it back for error messages etc. */
804 *input_line_pointer
= c
;
805 /* The following skip of whitespace is compulsory.
806 A well shaped space is sometimes all that separates
807 keyword from operands. */
808 if (c
== ' ' || c
== '\t')
809 input_line_pointer
++;
811 /* Input_line is restored.
812 Input_line_pointer->1st non-blank char
813 after pseudo-operation. */
814 (*pop
->poc_handler
) (pop
->poc_val
);
816 /* If that was .end, just get out now. */
817 if (pop
->poc_handler
== s_end
)
823 #ifdef QUOTES_IN_INSN
827 /* WARNING: c has char, which may be end-of-line. */
828 /* Also: input_line_pointer->`\0` where c was. */
829 *input_line_pointer
= c
;
830 while (!is_end_of_line
[(unsigned char) *input_line_pointer
]
832 #ifdef TC_EOL_IN_INSN
833 || TC_EOL_IN_INSN (input_line_pointer
)
837 if (flag_m68k_mri
&& *input_line_pointer
== '\'')
839 #ifdef QUOTES_IN_INSN
842 else if (*input_line_pointer
== '"')
844 else if (*input_line_pointer
== '\\')
847 input_line_pointer
++;
850 c
= *input_line_pointer
;
851 *input_line_pointer
= '\0';
853 generate_lineno_debug ();
861 if (check_macro (s
, &out
, &err
, ¯o
))
865 *input_line_pointer
++ = c
;
866 input_scrub_include_sb (&out
,
867 input_line_pointer
, 1);
870 input_scrub_next_buffer (&input_line_pointer
);
872 md_macro_info (macro
);
878 if (mri_pending_align
)
880 do_align (1, (char *) NULL
, 0, 0);
881 mri_pending_align
= 0;
882 if (line_label
!= NULL
)
884 symbol_set_frag (line_label
, frag_now
);
885 S_SET_VALUE (line_label
, frag_now_fix ());
889 md_assemble (s
); /* Assemble 1 instruction. */
891 *input_line_pointer
++ = c
;
893 /* We resume loop AFTER the end-of-line from
900 /* Empty statement? */
901 if (is_end_of_line
[(unsigned char) c
])
904 if ((LOCAL_LABELS_DOLLAR
|| LOCAL_LABELS_FB
) && ISDIGIT (c
))
906 /* local label ("4:") */
907 char *backup
= input_line_pointer
;
909 HANDLE_CONDITIONAL_ASSEMBLY ();
913 /* Read the whole number. */
914 while (ISDIGIT (*input_line_pointer
))
916 temp
= (temp
* 10) + *input_line_pointer
- '0';
917 ++input_line_pointer
;
920 if (LOCAL_LABELS_DOLLAR
921 && *input_line_pointer
== '$'
922 && *(input_line_pointer
+ 1) == ':')
924 input_line_pointer
+= 2;
926 if (dollar_label_defined (temp
))
928 as_fatal (_("label \"%d$\" redefined"), temp
);
931 define_dollar_label (temp
);
932 colon (dollar_label_name (temp
, 0));
937 && *input_line_pointer
++ == ':')
939 fb_label_instance_inc (temp
);
940 colon (fb_label_name (temp
, 0));
944 input_line_pointer
= backup
;
945 } /* local label ("4:") */
947 if (c
&& strchr (line_comment_chars
, c
))
948 { /* Its a comment. Better say APP or NO_APP. */
953 unsigned int new_length
;
956 bump_line_counters ();
957 s
= input_line_pointer
;
958 if (strncmp (s
, "APP\n", 4))
959 continue; /* We ignore it */
963 ends
= strstr (s
, "#NO_APP\n");
967 unsigned int tmp_len
;
970 /* The end of the #APP wasn't in this buffer. We
971 keep reading in buffers until we find the #NO_APP
972 that goes with this #APP There is one. The specs
974 tmp_len
= buffer_limit
- s
;
975 tmp_buf
= xmalloc (tmp_len
+ 1);
976 memcpy (tmp_buf
, s
, tmp_len
);
979 new_tmp
= input_scrub_next_buffer (&buffer
);
983 buffer_limit
= new_tmp
;
984 input_line_pointer
= buffer
;
985 ends
= strstr (buffer
, "#NO_APP\n");
989 num
= buffer_limit
- buffer
;
991 tmp_buf
= xrealloc (tmp_buf
, tmp_len
+ num
);
992 memcpy (tmp_buf
+ tmp_len
, buffer
, num
);
997 input_line_pointer
= ends
? ends
+ 8 : NULL
;
1005 input_line_pointer
= ends
+ 8;
1009 scrub_string_end
= ends
;
1011 new_length
= ends
- s
;
1012 new_buf
= (char *) xmalloc (new_length
);
1019 space
= (new_buf
+ new_length
) - new_tmp
;
1020 size
= do_scrub_chars (scrub_from_string
, new_tmp
, space
);
1028 new_buf
= xrealloc (new_buf
, new_length
+ 100);
1029 new_tmp
= new_buf
+ new_length
;
1036 /* We've "scrubbed" input to the preferred format. In the
1037 process we may have consumed the whole of the remaining
1038 file (and included files). We handle this formatted
1039 input similar to that of macro expansion, letting
1040 actual macro expansion (possibly nested) and other
1041 input expansion work. Beware that in messages, line
1042 numbers and possibly file names will be incorrect. */
1043 sb_add_string (&sbuf
, new_buf
);
1044 input_scrub_include_sb (&sbuf
, input_line_pointer
, 0);
1046 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
1051 HANDLE_CONDITIONAL_ASSEMBLY ();
1053 #ifdef tc_unrecognized_line
1054 if (tc_unrecognized_line (c
))
1057 input_line_pointer
--;
1058 /* Report unknown char as ignored. */
1059 demand_empty_rest_of_line ();
1062 #ifdef md_after_pass_hook
1063 md_after_pass_hook ();
1072 /* Close the input file. */
1073 input_scrub_close ();
1074 #ifdef WARN_COMMENTS
1076 if (warn_comment
&& found_comment
)
1077 as_warn_where (found_comment_file
, found_comment
,
1078 "first comment found here");
1083 /* For most MRI pseudo-ops, the line actually ends at the first
1084 nonquoted space. This function looks for that point, stuffs a null
1085 in, and sets *STOPCP to the character that used to be there, and
1086 returns the location.
1088 Until I hear otherwise, I am going to assume that this is only true
1089 for the m68k MRI assembler. */
1092 mri_comment_field (char *stopcp
)
1098 know (flag_m68k_mri
);
1100 for (s
= input_line_pointer
;
1101 ((!is_end_of_line
[(unsigned char) *s
] && *s
!= ' ' && *s
!= '\t')
1109 for (s
= input_line_pointer
;
1110 !is_end_of_line
[(unsigned char) *s
];
1120 /* Skip to the end of an MRI comment field. */
1123 mri_comment_end (char *stop
, int stopc
)
1127 input_line_pointer
= stop
;
1129 while (!is_end_of_line
[(unsigned char) *input_line_pointer
])
1130 ++input_line_pointer
;
1134 s_abort (int ignore ATTRIBUTE_UNUSED
)
1136 as_fatal (_(".abort detected. Abandoning ship."));
1139 /* Guts of .align directive. N is the power of two to which to align.
1140 FILL may be NULL, or it may point to the bytes of the fill pattern.
1141 LEN is the length of whatever FILL points to, if anything. MAX is
1142 the maximum number of characters to skip when doing the alignment,
1143 or 0 if there is no maximum. */
1146 do_align (int n
, char *fill
, int len
, int max
)
1148 if (now_seg
== absolute_section
)
1152 if (*fill
++ != '\0')
1154 as_warn (_("ignoring fill value in absolute section"));
1161 #ifdef md_flush_pending_output
1162 md_flush_pending_output ();
1165 md_do_align (n
, fill
, len
, max
, just_record_alignment
);
1168 /* Only make a frag if we HAVE to... */
1169 if (n
!= 0 && !need_pass_2
)
1173 if (subseg_text_p (now_seg
))
1174 frag_align_code (n
, max
);
1176 frag_align (n
, 0, max
);
1179 frag_align (n
, *fill
, max
);
1181 frag_align_pattern (n
, fill
, len
, max
);
1185 just_record_alignment
: ATTRIBUTE_UNUSED_LABEL
1188 record_alignment (now_seg
, n
- OCTETS_PER_BYTE_POWER
);
1191 /* Handle the .align pseudo-op. A positive ARG is a default alignment
1192 (in bytes). A negative ARG is the negative of the length of the
1193 fill pattern. BYTES_P is non-zero if the alignment value should be
1194 interpreted as the byte boundary, rather than the power of 2. */
1197 s_align (int arg
, int bytes_p
)
1199 register unsigned int align
;
1207 stop
= mri_comment_field (&stopc
);
1209 if (is_end_of_line
[(unsigned char) *input_line_pointer
])
1214 align
= arg
; /* Default value from pseudo-op table. */
1218 align
= get_absolute_expression ();
1224 /* Convert to a power of 2. */
1229 for (i
= 0; (align
& 1) == 0; align
>>= 1, ++i
)
1232 as_bad (_("alignment not a power of 2"));
1241 as_warn (_("alignment too large: %u assumed"), align
);
1244 if (*input_line_pointer
!= ',')
1251 ++input_line_pointer
;
1252 if (*input_line_pointer
== ',')
1256 fill
= get_absolute_expression ();
1261 if (*input_line_pointer
!= ',')
1265 ++input_line_pointer
;
1266 max
= get_absolute_expression ();
1273 as_warn (_("expected fill pattern missing"));
1274 do_align (align
, (char *) NULL
, 0, max
);
1289 do_align (align
, &fill_char
, fill_len
, max
);
1295 if ((size_t) fill_len
> sizeof ab
)
1297 md_number_to_chars (ab
, fill
, fill_len
);
1298 do_align (align
, ab
, fill_len
, max
);
1302 demand_empty_rest_of_line ();
1305 mri_comment_end (stop
, stopc
);
1308 /* Handle the .align pseudo-op on machines where ".align 4" means
1309 align to a 4 byte boundary. */
1312 s_align_bytes (int arg
)
1317 /* Handle the .align pseudo-op on machines where ".align 4" means align
1318 to a 2**4 boundary. */
1321 s_align_ptwo (int arg
)
1326 /* Switch in and out of alternate macro mode. */
1331 demand_empty_rest_of_line ();
1332 macro_set_alternate (on
);
1336 s_comm_internal (int param
,
1337 symbolS
*(*comm_parse_extra
) (int, symbolS
*, addressT
))
1343 symbolS
*symbolP
= NULL
;
1349 stop
= mri_comment_field (&stopc
);
1351 name
= input_line_pointer
;
1352 c
= get_symbol_end ();
1353 /* Just after name is now '\0'. */
1354 p
= input_line_pointer
;
1359 as_bad (_("expected symbol name"));
1360 discard_rest_of_line ();
1366 /* Accept an optional comma after the name. The comma used to be
1367 required, but Irix 5 cc does not generate it for .lcomm. */
1368 if (*input_line_pointer
== ',')
1369 input_line_pointer
++;
1372 temp
= get_absolute_expr (&exp
);
1374 #ifdef BFD_ASSEMBLER
1375 size
&= ((offsetT
) 2 << (stdoutput
->arch_info
->bits_per_address
- 1)) - 1;
1377 if (exp
.X_op
== O_absent
)
1379 as_bad (_("missing size expression"));
1381 ignore_rest_of_line ();
1384 else if (temp
!= size
|| !exp
.X_unsigned
)
1386 as_warn (_("size (%ld) out of range, ignored"), (long) temp
);
1388 ignore_rest_of_line ();
1392 symbolP
= symbol_find_or_make (name
);
1393 if (S_IS_DEFINED (symbolP
) && !S_IS_COMMON (symbolP
))
1396 as_bad (_("symbol `%s' is already defined"), name
);
1398 ignore_rest_of_line ();
1402 size
= S_GET_VALUE (symbolP
);
1405 else if (size
!= temp
)
1406 as_warn (_("size of \"%s\" is already %ld; not changing to %ld"),
1407 name
, (long) size
, (long) temp
);
1410 if (comm_parse_extra
!= NULL
)
1411 symbolP
= (*comm_parse_extra
) (param
, symbolP
, size
);
1414 S_SET_VALUE (symbolP
, (valueT
) size
);
1415 S_SET_EXTERNAL (symbolP
);
1418 extern int flag_one
;
1419 if (size
== 0 || !flag_one
)
1420 S_GET_OTHER (symbolP
) = const_flag
;
1425 know (symbolP
== NULL
|| symbolP
->sy_frag
== &zero_address_frag
);
1426 demand_empty_rest_of_line ();
1429 mri_comment_end (stop
, stopc
);
1436 s_comm_internal (ignore
, NULL
);
1439 /* The MRI COMMON pseudo-op. We handle this by creating a common
1440 symbol with the appropriate name. We make s_space do the right
1441 thing by increasing the size. */
1444 s_mri_common (int small ATTRIBUTE_UNUSED
)
1460 stop
= mri_comment_field (&stopc
);
1464 name
= input_line_pointer
;
1465 if (!ISDIGIT (*name
))
1466 c
= get_symbol_end ();
1471 ++input_line_pointer
;
1473 while (ISDIGIT (*input_line_pointer
));
1475 c
= *input_line_pointer
;
1476 *input_line_pointer
= '\0';
1478 if (line_label
!= NULL
)
1480 alc
= (char *) xmalloc (strlen (S_GET_NAME (line_label
))
1481 + (input_line_pointer
- name
)
1483 sprintf (alc
, "%s%s", name
, S_GET_NAME (line_label
));
1488 sym
= symbol_find_or_make (name
);
1489 *input_line_pointer
= c
;
1493 if (*input_line_pointer
!= ',')
1497 ++input_line_pointer
;
1498 align
= get_absolute_expression ();
1501 if (S_IS_DEFINED (sym
) && !S_IS_COMMON (sym
))
1503 as_bad (_("symbol `%s' is already defined"), S_GET_NAME (sym
));
1504 ignore_rest_of_line ();
1505 mri_comment_end (stop
, stopc
);
1509 S_SET_EXTERNAL (sym
);
1510 mri_common_symbol
= sym
;
1514 S_SET_ALIGN (sym
, align
);
1517 if (line_label
!= NULL
)
1520 exp
.X_op
= O_symbol
;
1521 exp
.X_add_symbol
= sym
;
1522 exp
.X_add_number
= 0;
1523 symbol_set_value_expression (line_label
, &exp
);
1524 symbol_set_frag (line_label
, &zero_address_frag
);
1525 S_SET_SEGMENT (line_label
, expr_section
);
1528 /* FIXME: We just ignore the small argument, which distinguishes
1529 COMMON and COMMON.S. I don't know what we can do about it. */
1531 /* Ignore the type and hptype. */
1532 if (*input_line_pointer
== ',')
1533 input_line_pointer
+= 2;
1534 if (*input_line_pointer
== ',')
1535 input_line_pointer
+= 2;
1537 demand_empty_rest_of_line ();
1539 mri_comment_end (stop
, stopc
);
1543 s_data (int ignore ATTRIBUTE_UNUSED
)
1548 temp
= get_absolute_expression ();
1549 if (flag_readonly_data_in_text
)
1551 section
= text_section
;
1555 section
= data_section
;
1557 subseg_set (section
, (subsegT
) temp
);
1562 demand_empty_rest_of_line ();
1565 /* Handle the .appfile pseudo-op. This is automatically generated by
1566 do_scrub_chars when a preprocessor # line comment is seen with a
1567 file name. This default definition may be overridden by the object
1568 or CPU specific pseudo-ops. This function is also the default
1569 definition for .file; the APPFILE argument is 1 for .appfile, 0 for
1573 s_app_file_string (char *file
, int appfile
)
1577 listing_source_file (file
);
1579 register_dependency (file
);
1581 obj_app_file (file
, appfile
);
1586 s_app_file (int appfile
)
1591 /* Some assemblers tolerate immediately following '"'. */
1592 if ((s
= demand_copy_string (&length
)) != 0)
1594 /* If this is a fake .appfile, a fake newline was inserted into
1595 the buffer. Passing -2 to new_logical_line tells it to
1598 = (!new_logical_line (s
, appfile
? -2 : -1) && appfile
);
1600 /* In MRI mode, the preprocessor may have inserted an extraneous
1603 && *input_line_pointer
== '\''
1604 && is_end_of_line
[(unsigned char) input_line_pointer
[1]])
1605 ++input_line_pointer
;
1607 demand_empty_rest_of_line ();
1609 s_app_file_string (s
, appfile
);
1613 /* Handle the .appline pseudo-op. This is automatically generated by
1614 do_scrub_chars when a preprocessor # line comment is seen. This
1615 default definition may be overridden by the object or CPU specific
1619 s_app_line (int ignore ATTRIBUTE_UNUSED
)
1623 /* The given number is that of the next line. */
1624 l
= get_absolute_expression () - 1;
1626 /* Some of the back ends can't deal with non-positive line numbers.
1627 Besides, it's silly. */
1628 as_warn (_("line numbers must be positive; line number %d rejected"),
1632 new_logical_line ((char *) NULL
, l
);
1635 listing_source_line (l
);
1638 demand_empty_rest_of_line ();
1641 /* Handle the .end pseudo-op. Actually, the real work is done in
1642 read_a_source_file. */
1645 s_end (int ignore ATTRIBUTE_UNUSED
)
1649 /* The MRI assembler permits the start symbol to follow .end,
1650 but we don't support that. */
1652 if (!is_end_of_line
[(unsigned char) *input_line_pointer
]
1653 && *input_line_pointer
!= '*'
1654 && *input_line_pointer
!= '!')
1655 as_warn (_("start address not supported"));
1659 /* Handle the .err pseudo-op. */
1662 s_err (int ignore ATTRIBUTE_UNUSED
)
1664 as_bad (_(".err encountered"));
1665 demand_empty_rest_of_line ();
1668 /* Handle the MRI fail pseudo-op. */
1671 s_fail (int ignore ATTRIBUTE_UNUSED
)
1678 stop
= mri_comment_field (&stopc
);
1680 temp
= get_absolute_expression ();
1682 as_warn (_(".fail %ld encountered"), (long) temp
);
1684 as_bad (_(".fail %ld encountered"), (long) temp
);
1686 demand_empty_rest_of_line ();
1689 mri_comment_end (stop
, stopc
);
1693 s_fill (int ignore ATTRIBUTE_UNUSED
)
1695 expressionS rep_exp
;
1697 register long fill
= 0;
1700 #ifdef md_flush_pending_output
1701 md_flush_pending_output ();
1704 get_known_segmented_expression (&rep_exp
);
1705 if (*input_line_pointer
== ',')
1707 input_line_pointer
++;
1708 size
= get_absolute_expression ();
1709 if (*input_line_pointer
== ',')
1711 input_line_pointer
++;
1712 fill
= get_absolute_expression ();
1716 /* This is to be compatible with BSD 4.2 AS, not for any rational reason. */
1717 #define BSD_FILL_SIZE_CROCK_8 (8)
1718 if (size
> BSD_FILL_SIZE_CROCK_8
)
1720 as_warn (_(".fill size clamped to %d"), BSD_FILL_SIZE_CROCK_8
);
1721 size
= BSD_FILL_SIZE_CROCK_8
;
1725 as_warn (_("size negative; .fill ignored"));
1728 else if (rep_exp
.X_op
== O_constant
&& rep_exp
.X_add_number
<= 0)
1730 if (rep_exp
.X_add_number
< 0)
1731 as_warn (_("repeat < 0; .fill ignored"));
1735 if (size
&& !need_pass_2
)
1737 if (rep_exp
.X_op
== O_constant
)
1739 p
= frag_var (rs_fill
, (int) size
, (int) size
,
1740 (relax_substateT
) 0, (symbolS
*) 0,
1741 (offsetT
) rep_exp
.X_add_number
,
1746 /* We don't have a constant repeat count, so we can't use
1747 rs_fill. We can get the same results out of rs_space,
1748 but its argument is in bytes, so we must multiply the
1749 repeat count by size. */
1752 rep_sym
= make_expr_symbol (&rep_exp
);
1755 expressionS size_exp
;
1756 size_exp
.X_op
= O_constant
;
1757 size_exp
.X_add_number
= size
;
1759 rep_exp
.X_op
= O_multiply
;
1760 rep_exp
.X_add_symbol
= rep_sym
;
1761 rep_exp
.X_op_symbol
= make_expr_symbol (&size_exp
);
1762 rep_exp
.X_add_number
= 0;
1763 rep_sym
= make_expr_symbol (&rep_exp
);
1766 p
= frag_var (rs_space
, (int) size
, (int) size
,
1767 (relax_substateT
) 0, rep_sym
, (offsetT
) 0, (char *) 0);
1770 memset (p
, 0, (unsigned int) size
);
1772 /* The magic number BSD_FILL_SIZE_CROCK_4 is from BSD 4.2 VAX
1773 flavoured AS. The following bizarre behaviour is to be
1774 compatible with above. I guess they tried to take up to 8
1775 bytes from a 4-byte expression and they forgot to sign
1777 #define BSD_FILL_SIZE_CROCK_4 (4)
1778 md_number_to_chars (p
, (valueT
) fill
,
1779 (size
> BSD_FILL_SIZE_CROCK_4
1780 ? BSD_FILL_SIZE_CROCK_4
1782 /* Note: .fill (),0 emits no frag (since we are asked to .fill 0 bytes)
1783 but emits no error message because it seems a legal thing to do.
1784 It is a degenerate case of .fill but could be emitted by a
1787 demand_empty_rest_of_line ();
1791 s_globl (int ignore ATTRIBUTE_UNUSED
)
1800 stop
= mri_comment_field (&stopc
);
1804 name
= input_line_pointer
;
1805 c
= get_symbol_end ();
1806 symbolP
= symbol_find_or_make (name
);
1807 S_SET_EXTERNAL (symbolP
);
1809 *input_line_pointer
= c
;
1811 c
= *input_line_pointer
;
1814 input_line_pointer
++;
1816 if (is_end_of_line
[(unsigned char) *input_line_pointer
])
1822 demand_empty_rest_of_line ();
1825 mri_comment_end (stop
, stopc
);
1828 /* Handle the MRI IRP and IRPC pseudo-ops. */
1839 as_where (&file
, &line
);
1842 while (!is_end_of_line
[(unsigned char) *input_line_pointer
])
1843 sb_add_char (&s
, *input_line_pointer
++);
1847 err
= expand_irp (irpc
, 0, &s
, &out
, get_line_sb
);
1849 as_bad_where (file
, line
, "%s", err
);
1853 input_scrub_include_sb (&out
, input_line_pointer
, 1);
1855 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
1858 /* Handle the .linkonce pseudo-op. This tells the assembler to mark
1859 the section to only be linked once. However, this is not supported
1860 by most object file formats. This takes an optional argument,
1861 which is what to do about duplicates. */
1864 s_linkonce (int ignore ATTRIBUTE_UNUSED
)
1866 enum linkonce_type type
;
1870 type
= LINKONCE_DISCARD
;
1872 if (!is_end_of_line
[(unsigned char) *input_line_pointer
])
1877 s
= input_line_pointer
;
1878 c
= get_symbol_end ();
1879 if (strcasecmp (s
, "discard") == 0)
1880 type
= LINKONCE_DISCARD
;
1881 else if (strcasecmp (s
, "one_only") == 0)
1882 type
= LINKONCE_ONE_ONLY
;
1883 else if (strcasecmp (s
, "same_size") == 0)
1884 type
= LINKONCE_SAME_SIZE
;
1885 else if (strcasecmp (s
, "same_contents") == 0)
1886 type
= LINKONCE_SAME_CONTENTS
;
1888 as_warn (_("unrecognized .linkonce type `%s'"), s
);
1890 *input_line_pointer
= c
;
1893 #ifdef obj_handle_link_once
1894 obj_handle_link_once (type
);
1895 #else /* ! defined (obj_handle_link_once) */
1896 #ifdef BFD_ASSEMBLER
1900 if ((bfd_applicable_section_flags (stdoutput
) & SEC_LINK_ONCE
) == 0)
1901 as_warn (_(".linkonce is not supported for this object file format"));
1903 flags
= bfd_get_section_flags (stdoutput
, now_seg
);
1904 flags
|= SEC_LINK_ONCE
;
1909 case LINKONCE_DISCARD
:
1910 flags
|= SEC_LINK_DUPLICATES_DISCARD
;
1912 case LINKONCE_ONE_ONLY
:
1913 flags
|= SEC_LINK_DUPLICATES_ONE_ONLY
;
1915 case LINKONCE_SAME_SIZE
:
1916 flags
|= SEC_LINK_DUPLICATES_SAME_SIZE
;
1918 case LINKONCE_SAME_CONTENTS
:
1919 flags
|= SEC_LINK_DUPLICATES_SAME_CONTENTS
;
1922 if (!bfd_set_section_flags (stdoutput
, now_seg
, flags
))
1923 as_bad (_("bfd_set_section_flags: %s"),
1924 bfd_errmsg (bfd_get_error ()));
1926 #else /* ! defined (BFD_ASSEMBLER) */
1927 as_warn (_(".linkonce is not supported for this object file format"));
1928 #endif /* ! defined (BFD_ASSEMBLER) */
1929 #endif /* ! defined (obj_handle_link_once) */
1931 demand_empty_rest_of_line ();
1935 bss_alloc (symbolS
*symbolP
, addressT size
, int align
)
1938 segT current_seg
= now_seg
;
1939 subsegT current_subseg
= now_subseg
;
1940 segT bss_seg
= bss_section
;
1942 #if defined (TC_MIPS) || defined (TC_ALPHA)
1943 if (OUTPUT_FLAVOR
== bfd_target_ecoff_flavour
1944 || OUTPUT_FLAVOR
== bfd_target_elf_flavour
)
1946 /* For MIPS and Alpha ECOFF or ELF, small objects are put in .sbss. */
1947 if (size
<= bfd_get_gp_size (stdoutput
))
1949 bss_seg
= subseg_new (".sbss", 1);
1950 seg_info (bss_seg
)->bss
= 1;
1951 #ifdef BFD_ASSEMBLER
1952 if (!bfd_set_section_flags (stdoutput
, bss_seg
, SEC_ALLOC
))
1953 as_warn (_("error setting flags for \".sbss\": %s"),
1954 bfd_errmsg (bfd_get_error ()));
1959 subseg_set (bss_seg
, 1);
1963 record_alignment (bss_seg
, align
);
1964 frag_align (align
, 0, 0);
1967 /* Detach from old frag. */
1968 if (S_GET_SEGMENT (symbolP
) == bss_seg
)
1969 symbol_get_frag (symbolP
)->fr_symbol
= NULL
;
1971 symbol_set_frag (symbolP
, frag_now
);
1972 pfrag
= frag_var (rs_org
, 1, 1, 0, symbolP
, size
, NULL
);
1976 S_SET_SIZE (symbolP
, size
);
1978 S_SET_SEGMENT (symbolP
, bss_seg
);
1981 /* The symbol may already have been created with a preceding
1982 ".globl" directive -- be careful not to step on storage class
1983 in that case. Otherwise, set it to static. */
1984 if (S_GET_STORAGE_CLASS (symbolP
) != C_EXT
)
1985 S_SET_STORAGE_CLASS (symbolP
, C_STAT
);
1986 #endif /* OBJ_COFF */
1988 subseg_set (current_seg
, current_subseg
);
1992 parse_align (int align_bytes
)
1998 if (*input_line_pointer
!= ',')
2001 as_bad (_("expected alignment after size"));
2002 ignore_rest_of_line ();
2006 input_line_pointer
++;
2009 align
= get_absolute_expr (&exp
);
2010 if (exp
.X_op
== O_absent
)
2013 if (!exp
.X_unsigned
)
2015 as_warn (_("alignment negative; 0 assumed"));
2019 if (align_bytes
&& align
!= 0)
2021 /* convert to a power of 2 alignment */
2022 unsigned int alignp2
= 0;
2023 while ((align
& 1) == 0)
2024 align
>>= 1, ++alignp2
;
2027 as_bad (_("alignment not a power of 2"));
2028 ignore_rest_of_line ();
2036 /* Called from s_comm_internal after symbol name and size have been
2037 parsed. NEEDS_ALIGN is 0 if it was an ".lcomm" (2 args only),
2038 1 if this was a ".bss" directive which has a 3rd argument
2039 (alignment as a power of 2), or 2 if this was a ".bss" directive
2040 with alignment in bytes. */
2043 s_lcomm_internal (int needs_align
, symbolS
*symbolP
, addressT size
)
2049 align
= parse_align (needs_align
- 1);
2050 if (align
== (addressT
) -1)
2054 /* Assume some objects may require alignment on some systems. */
2055 TC_IMPLICIT_LCOMM_ALIGNMENT (size
, align
);
2057 bss_alloc (symbolP
, size
, align
);
2062 s_lcomm (int needs_align
)
2064 s_comm_internal (needs_align
, s_lcomm_internal
);
2068 s_lcomm_bytes (int needs_align
)
2070 s_comm_internal (needs_align
* 2, s_lcomm_internal
);
2074 s_lsym (int ignore ATTRIBUTE_UNUSED
)
2076 register char *name
;
2080 register symbolS
*symbolP
;
2082 /* We permit ANY defined expression: BSD4.2 demands constants. */
2083 name
= input_line_pointer
;
2084 c
= get_symbol_end ();
2085 p
= input_line_pointer
;
2090 as_bad (_("expected symbol name"));
2091 discard_rest_of_line ();
2097 if (*input_line_pointer
!= ',')
2100 as_bad (_("expected comma after \"%s\""), name
);
2102 ignore_rest_of_line ();
2106 input_line_pointer
++;
2109 if (exp
.X_op
!= O_constant
2110 && exp
.X_op
!= O_register
)
2112 as_bad (_("bad expression"));
2113 ignore_rest_of_line ();
2118 symbolP
= symbol_find_or_make (name
);
2120 /* FIXME-SOON I pulled a (&& symbolP->sy_other == 0 &&
2121 symbolP->sy_desc == 0) out of this test because coff doesn't have
2122 those fields, and I can't see when they'd ever be tripped. I
2123 don't think I understand why they were here so I may have
2124 introduced a bug. As recently as 1.37 didn't have this test
2125 anyway. xoxorich. */
2127 if (S_GET_SEGMENT (symbolP
) == undefined_section
2128 && S_GET_VALUE (symbolP
) == 0)
2130 /* The name might be an undefined .global symbol; be sure to
2131 keep the "external" bit. */
2132 S_SET_SEGMENT (symbolP
,
2133 (exp
.X_op
== O_constant
2136 S_SET_VALUE (symbolP
, (valueT
) exp
.X_add_number
);
2140 as_bad (_("symbol `%s' is already defined"), name
);
2144 demand_empty_rest_of_line ();
2147 /* Read a line into an sb. Returns the character that ended the line
2148 or zero if there are no more lines. */
2151 get_line_sb (sb
*line
)
2153 char quote1
, quote2
, inquote
;
2156 if (input_line_pointer
[-1] == '\n')
2157 bump_line_counters ();
2159 if (input_line_pointer
>= buffer_limit
)
2161 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
2162 if (buffer_limit
== 0)
2166 /* If app.c sets any other characters to LEX_IS_STRINGQUOTE, this
2167 code needs to be changed. */
2176 #ifdef LEX_IS_STRINGQUOTE
2182 while ((c
= * input_line_pointer
++) != 0
2183 && (!is_end_of_line
[c
]
2184 || (inquote
!= '\0' && c
!= '\n')))
2188 else if (inquote
== '\0')
2192 else if (c
== quote2
)
2196 sb_add_char (line
, c
);
2199 /* Don't skip multiple end-of-line characters, because that breaks support
2200 for the IA-64 stop bit (;;) which looks like two consecutive end-of-line
2201 characters but isn't. Instead just skip one end of line character and
2202 return the character skipped so that the caller can re-insert it if
2207 /* Define a macro. This is an interface to macro.c. */
2210 s_macro (int ignore ATTRIBUTE_UNUSED
)
2219 as_where (&file
, &line
);
2222 while (!is_end_of_line
[(unsigned char) *input_line_pointer
])
2223 sb_add_char (&s
, *input_line_pointer
++);
2226 if (line_label
!= NULL
)
2227 sb_add_string (&label
, S_GET_NAME (line_label
));
2229 err
= define_macro (0, &s
, &label
, get_line_sb
, &name
);
2231 as_bad_where (file
, line
, "%s", err
);
2234 if (line_label
!= NULL
)
2236 S_SET_SEGMENT (line_label
, undefined_section
);
2237 S_SET_VALUE (line_label
, 0);
2238 symbol_set_frag (line_label
, &zero_address_frag
);
2241 if (((NO_PSEUDO_DOT
|| flag_m68k_mri
)
2242 && hash_find (po_hash
, name
) != NULL
)
2245 && hash_find (po_hash
, name
+ 1) != NULL
))
2246 as_warn (_("attempt to redefine pseudo-op `%s' ignored"),
2253 /* Handle the .mexit pseudo-op, which immediately exits a macro
2257 s_mexit (int ignore ATTRIBUTE_UNUSED
)
2259 cond_exit_macro (macro_nest
);
2260 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
2263 /* Switch in and out of MRI mode. */
2266 s_mri (int ignore ATTRIBUTE_UNUSED
)
2270 on
= get_absolute_expression ();
2271 old_flag
= flag_mri
;
2289 /* Operator precedence changes in m68k MRI mode, so we need to
2290 update the operator rankings. */
2291 expr_set_precedence ();
2293 #ifdef MRI_MODE_CHANGE
2295 MRI_MODE_CHANGE (on
);
2298 demand_empty_rest_of_line ();
2301 /* Handle changing the location counter. */
2304 do_org (segT segment
, expressionS
*exp
, int fill
)
2306 if (segment
!= now_seg
&& segment
!= absolute_section
)
2307 as_bad (_("invalid segment \"%s\""), segment_name (segment
));
2309 if (now_seg
== absolute_section
)
2312 as_warn (_("ignoring fill value in absolute section"));
2313 if (exp
->X_op
!= O_constant
)
2315 as_bad (_("only constant offsets supported in absolute section"));
2316 exp
->X_add_number
= 0;
2318 abs_section_offset
= exp
->X_add_number
;
2323 symbolS
*sym
= exp
->X_add_symbol
;
2324 offsetT off
= exp
->X_add_number
* OCTETS_PER_BYTE
;
2326 if (exp
->X_op
!= O_constant
&& exp
->X_op
!= O_symbol
)
2328 /* Handle complex expressions. */
2329 sym
= make_expr_symbol (exp
);
2333 p
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, sym
, off
, (char *) 0);
2339 s_org (int ignore ATTRIBUTE_UNUSED
)
2341 register segT segment
;
2343 register long temp_fill
;
2345 #ifdef md_flush_pending_output
2346 md_flush_pending_output ();
2349 /* The m68k MRI assembler has a different meaning for .org. It
2350 means to create an absolute section at a given address. We can't
2351 support that--use a linker script instead. */
2354 as_bad (_("MRI style ORG pseudo-op not supported"));
2355 ignore_rest_of_line ();
2359 /* Don't believe the documentation of BSD 4.2 AS. There is no such
2360 thing as a sub-segment-relative origin. Any absolute origin is
2361 given a warning, then assumed to be segment-relative. Any
2362 segmented origin expression ("foo+42") had better be in the right
2363 segment or the .org is ignored.
2365 BSD 4.2 AS warns if you try to .org backwards. We cannot because
2366 we never know sub-segment sizes when we are reading code. BSD
2367 will crash trying to emit negative numbers of filler bytes in
2368 certain .orgs. We don't crash, but see as-write for that code.
2370 Don't make frag if need_pass_2==1. */
2371 segment
= get_known_segmented_expression (&exp
);
2372 if (*input_line_pointer
== ',')
2374 input_line_pointer
++;
2375 temp_fill
= get_absolute_expression ();
2381 do_org (segment
, &exp
, temp_fill
);
2383 demand_empty_rest_of_line ();
2386 /* Handle parsing for the MRI SECT/SECTION pseudo-op. This should be
2387 called by the obj-format routine which handles section changing
2388 when in MRI mode. It will create a new section, and return it. It
2389 will set *TYPE to the section type: one of 'C' (code), 'D' (data),
2390 'M' (mixed), or 'R' (romable). If BFD_ASSEMBLER is defined, the
2391 flags will be set in the section. */
2394 s_mri_sect (char *type ATTRIBUTE_UNUSED
)
2404 name
= input_line_pointer
;
2405 if (!ISDIGIT (*name
))
2406 c
= get_symbol_end ();
2411 ++input_line_pointer
;
2413 while (ISDIGIT (*input_line_pointer
));
2415 c
= *input_line_pointer
;
2416 *input_line_pointer
= '\0';
2419 name
= xstrdup (name
);
2421 *input_line_pointer
= c
;
2423 seg
= subseg_new (name
, 0);
2425 if (*input_line_pointer
== ',')
2429 ++input_line_pointer
;
2430 align
= get_absolute_expression ();
2431 record_alignment (seg
, align
);
2435 if (*input_line_pointer
== ',')
2437 c
= *++input_line_pointer
;
2439 if (c
== 'C' || c
== 'D' || c
== 'M' || c
== 'R')
2442 as_bad (_("unrecognized section type"));
2443 ++input_line_pointer
;
2445 #ifdef BFD_ASSEMBLER
2449 flags
= SEC_NO_FLAGS
;
2451 flags
= SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
| SEC_CODE
;
2452 else if (*type
== 'D' || *type
== 'M')
2453 flags
= SEC_ALLOC
| SEC_LOAD
| SEC_DATA
;
2454 else if (*type
== 'R')
2455 flags
= SEC_ALLOC
| SEC_LOAD
| SEC_DATA
| SEC_READONLY
| SEC_ROM
;
2456 if (flags
!= SEC_NO_FLAGS
)
2458 if (!bfd_set_section_flags (stdoutput
, seg
, flags
))
2459 as_warn (_("error setting flags for \"%s\": %s"),
2460 bfd_section_name (stdoutput
, seg
),
2461 bfd_errmsg (bfd_get_error ()));
2467 /* Ignore the HP type. */
2468 if (*input_line_pointer
== ',')
2469 input_line_pointer
+= 2;
2471 demand_empty_rest_of_line ();
2473 #else /* ! TC_M68K */
2482 name
= input_line_pointer
;
2483 c
= get_symbol_end ();
2485 name
= xstrdup (name
);
2487 *input_line_pointer
= c
;
2489 seg
= subseg_new (name
, 0);
2491 if (*input_line_pointer
!= ',')
2497 ++input_line_pointer
;
2499 sectype
= input_line_pointer
;
2500 c
= get_symbol_end ();
2501 if (*sectype
== '\0')
2503 else if (strcasecmp (sectype
, "text") == 0)
2505 else if (strcasecmp (sectype
, "data") == 0)
2507 else if (strcasecmp (sectype
, "romdata") == 0)
2510 as_warn (_("unrecognized section type `%s'"), sectype
);
2511 *input_line_pointer
= c
;
2514 if (*input_line_pointer
== ',')
2518 ++input_line_pointer
;
2520 seccmd
= input_line_pointer
;
2521 c
= get_symbol_end ();
2522 if (strcasecmp (seccmd
, "absolute") == 0)
2524 as_bad (_("absolute sections are not supported"));
2525 *input_line_pointer
= c
;
2526 ignore_rest_of_line ();
2529 else if (strcasecmp (seccmd
, "align") == 0)
2533 *input_line_pointer
= c
;
2534 align
= get_absolute_expression ();
2535 record_alignment (seg
, align
);
2539 as_warn (_("unrecognized section command `%s'"), seccmd
);
2540 *input_line_pointer
= c
;
2544 demand_empty_rest_of_line ();
2546 #else /* ! TC_I960 */
2547 /* The MRI assembler seems to use different forms of .sect for
2548 different targets. */
2549 as_bad ("MRI mode not supported for this target");
2550 ignore_rest_of_line ();
2551 #endif /* ! TC_I960 */
2552 #endif /* ! TC_M68K */
2555 /* Handle the .print pseudo-op. */
2558 s_print (int ignore ATTRIBUTE_UNUSED
)
2563 s
= demand_copy_C_string (&len
);
2566 demand_empty_rest_of_line ();
2569 /* Handle the .purgem pseudo-op. */
2572 s_purgem (int ignore ATTRIBUTE_UNUSED
)
2574 if (is_it_end_of_statement ())
2576 demand_empty_rest_of_line ();
2586 name
= input_line_pointer
;
2587 c
= get_symbol_end ();
2588 delete_macro (name
);
2589 *input_line_pointer
= c
;
2592 while (*input_line_pointer
++ == ',');
2594 --input_line_pointer
;
2595 demand_empty_rest_of_line ();
2598 /* Handle the .rept pseudo-op. */
2601 s_bad_endr (int ignore ATTRIBUTE_UNUSED
)
2603 as_warn (_(".endr encountered without preceeding .rept, .irc, or .irp"));
2604 demand_empty_rest_of_line ();
2607 /* Handle the .rept pseudo-op. */
2610 s_rept (int ignore ATTRIBUTE_UNUSED
)
2614 count
= get_absolute_expression ();
2616 do_repeat (count
, "REPT", "ENDR");
2619 /* This function provides a generic repeat block implementation. It allows
2620 different directives to be used as the start/end keys. */
2623 do_repeat (int count
, const char *start
, const char *end
)
2629 if (!buffer_and_nest (start
, end
, &one
, get_line_sb
))
2631 as_bad (_("%s without %s"), start
, end
);
2637 sb_add_sb (&many
, &one
);
2641 input_scrub_include_sb (&many
, input_line_pointer
, 1);
2643 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
2646 /* Skip to end of current repeat loop; EXTRA indicates how many additional
2647 input buffers to skip. Assumes that conditionals preceding the loop end
2648 are properly nested.
2650 This function makes it easier to implement a premature "break" out of the
2651 loop. The EXTRA arg accounts for other buffers we might have inserted,
2652 such as line substitutions. */
2655 end_repeat (int extra
)
2657 cond_exit_macro (macro_nest
);
2658 while (extra
-- >= 0)
2659 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
2662 /* Handle the .equ, .equiv and .set directives. If EQUIV is 1, then
2663 this is .equiv, and it is an error if the symbol is already
2669 register char *name
;
2670 register char delim
;
2671 register char *end_name
;
2672 register symbolS
*symbolP
;
2674 /* Especial apologies for the random logic:
2675 this just grew, and could be parsed much more simply!
2677 name
= input_line_pointer
;
2678 delim
= get_symbol_end ();
2679 end_name
= input_line_pointer
;
2682 if (name
== end_name
)
2684 as_bad (_("expected symbol name"));
2685 discard_rest_of_line ();
2691 if (*input_line_pointer
!= ',')
2694 as_bad (_("expected comma after \"%s\""), name
);
2696 ignore_rest_of_line ();
2700 input_line_pointer
++;
2703 if (name
[0] == '.' && name
[1] == '\0')
2705 /* Turn '. = mumble' into a .org mumble. */
2706 register segT segment
;
2709 segment
= get_known_segmented_expression (&exp
);
2712 do_org (segment
, &exp
, 0);
2718 if ((symbolP
= symbol_find (name
)) == NULL
2719 && (symbolP
= md_undefined_symbol (name
)) == NULL
)
2722 /* When doing symbol listings, play games with dummy fragments living
2723 outside the normal fragment chain to record the file and line info
2725 if (listing
& LISTING_SYMBOLS
)
2727 extern struct list_info_struct
*listing_tail
;
2728 fragS
*dummy_frag
= (fragS
*) xmalloc (sizeof (fragS
));
2729 memset (dummy_frag
, 0, sizeof (fragS
));
2730 dummy_frag
->fr_type
= rs_fill
;
2731 dummy_frag
->line
= listing_tail
;
2732 symbolP
= symbol_new (name
, undefined_section
, 0, dummy_frag
);
2733 dummy_frag
->fr_symbol
= symbolP
;
2737 symbolP
= symbol_new (name
, undefined_section
, 0, &zero_address_frag
);
2740 /* "set" symbols are local unless otherwise specified. */
2741 SF_SET_LOCAL (symbolP
);
2742 #endif /* OBJ_COFF */
2745 symbol_table_insert (symbolP
);
2750 && S_IS_DEFINED (symbolP
)
2751 && S_GET_SEGMENT (symbolP
) != reg_section
)
2752 as_bad (_("symbol `%s' is already defined"), S_GET_NAME (symbolP
));
2754 pseudo_set (symbolP
);
2755 demand_empty_rest_of_line ();
2768 #ifdef md_flush_pending_output
2769 md_flush_pending_output ();
2773 stop
= mri_comment_field (&stopc
);
2775 /* In m68k MRI mode, we need to align to a word boundary, unless
2777 if (flag_m68k_mri
&& mult
> 1)
2779 if (now_seg
== absolute_section
)
2781 abs_section_offset
+= abs_section_offset
& 1;
2782 if (line_label
!= NULL
)
2783 S_SET_VALUE (line_label
, abs_section_offset
);
2785 else if (mri_common_symbol
!= NULL
)
2789 val
= S_GET_VALUE (mri_common_symbol
);
2792 S_SET_VALUE (mri_common_symbol
, val
+ 1);
2793 if (line_label
!= NULL
)
2795 expressionS
*symexp
;
2797 symexp
= symbol_get_value_expression (line_label
);
2798 know (symexp
->X_op
== O_symbol
);
2799 know (symexp
->X_add_symbol
== mri_common_symbol
);
2800 symexp
->X_add_number
+= 1;
2806 do_align (1, (char *) NULL
, 0, 0);
2807 if (line_label
!= NULL
)
2809 symbol_set_frag (line_label
, frag_now
);
2810 S_SET_VALUE (line_label
, frag_now_fix ());
2820 if (*input_line_pointer
== ',')
2822 ++input_line_pointer
;
2827 val
.X_op
= O_constant
;
2828 val
.X_add_number
= 0;
2831 if (val
.X_op
!= O_constant
2832 || val
.X_add_number
< - 0x80
2833 || val
.X_add_number
> 0xff
2834 || (mult
!= 0 && mult
!= 1 && val
.X_add_number
!= 0))
2836 if (exp
.X_op
!= O_constant
)
2837 as_bad (_("unsupported variable size or fill value"));
2844 bytes
= mult
* exp
.X_add_number
;
2845 for (i
= 0; i
< exp
.X_add_number
; i
++)
2846 emit_expr (&val
, mult
);
2851 if (exp
.X_op
== O_constant
)
2855 repeat
= exp
.X_add_number
;
2862 as_warn (_(".space repeat count is zero, ignored"));
2863 else if (repeat
< 0)
2864 as_warn (_(".space repeat count is negative, ignored"));
2868 /* If we are in the absolute section, just bump the offset. */
2869 if (now_seg
== absolute_section
)
2871 abs_section_offset
+= repeat
;
2875 /* If we are secretly in an MRI common section, then
2876 creating space just increases the size of the common
2878 if (mri_common_symbol
!= NULL
)
2880 S_SET_VALUE (mri_common_symbol
,
2881 S_GET_VALUE (mri_common_symbol
) + repeat
);
2886 p
= frag_var (rs_fill
, 1, 1, (relax_substateT
) 0, (symbolS
*) 0,
2887 (offsetT
) repeat
, (char *) 0);
2891 if (now_seg
== absolute_section
)
2893 as_bad (_("space allocation too complex in absolute section"));
2894 subseg_set (text_section
, 0);
2897 if (mri_common_symbol
!= NULL
)
2899 as_bad (_("space allocation too complex in common section"));
2900 mri_common_symbol
= NULL
;
2904 p
= frag_var (rs_space
, 1, 1, (relax_substateT
) 0,
2905 make_expr_symbol (&exp
), (offsetT
) 0, (char *) 0);
2909 *p
= val
.X_add_number
;
2914 /* In MRI mode, after an odd number of bytes, we must align to an
2915 even word boundary, unless the next instruction is a dc.b, ds.b
2917 if (flag_mri
&& (bytes
& 1) != 0)
2918 mri_pending_align
= 1;
2920 demand_empty_rest_of_line ();
2923 mri_comment_end (stop
, stopc
);
2926 /* This is like s_space, but the value is a floating point number with
2927 the given precision. This is for the MRI dcb.s pseudo-op and
2931 s_float_space (int float_type
)
2935 char temp
[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT
];
2940 stop
= mri_comment_field (&stopc
);
2942 count
= get_absolute_expression ();
2945 if (*input_line_pointer
!= ',')
2947 as_bad (_("missing value"));
2948 ignore_rest_of_line ();
2950 mri_comment_end (stop
, stopc
);
2954 ++input_line_pointer
;
2958 /* Skip any 0{letter} that may be present. Don't even check if the
2959 * letter is legal. */
2960 if (input_line_pointer
[0] == '0'
2961 && ISALPHA (input_line_pointer
[1]))
2962 input_line_pointer
+= 2;
2964 /* Accept :xxxx, where the x's are hex digits, for a floating point
2965 with the exact digits specified. */
2966 if (input_line_pointer
[0] == ':')
2968 flen
= hex_float (float_type
, temp
);
2971 ignore_rest_of_line ();
2973 mri_comment_end (stop
, stopc
);
2981 err
= md_atof (float_type
, temp
, &flen
);
2982 know (flen
<= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT
);
2986 as_bad (_("bad floating literal: %s"), err
);
2987 ignore_rest_of_line ();
2989 mri_comment_end (stop
, stopc
);
2994 while (--count
>= 0)
2998 p
= frag_more (flen
);
2999 memcpy (p
, temp
, (unsigned int) flen
);
3002 demand_empty_rest_of_line ();
3005 mri_comment_end (stop
, stopc
);
3008 /* Handle the .struct pseudo-op, as found in MIPS assemblers. */
3011 s_struct (int ignore ATTRIBUTE_UNUSED
)
3017 stop
= mri_comment_field (&stopc
);
3018 abs_section_offset
= get_absolute_expression ();
3019 subseg_set (absolute_section
, 0);
3020 demand_empty_rest_of_line ();
3022 mri_comment_end (stop
, stopc
);
3026 s_text (int ignore ATTRIBUTE_UNUSED
)
3030 temp
= get_absolute_expression ();
3031 subseg_set (text_section
, (subsegT
) temp
);
3032 demand_empty_rest_of_line ();
3034 const_flag
&= ~IN_DEFAULT_SECTION
;
3039 /* Verify that we are at the end of a line. If not, issue an error and
3043 demand_empty_rest_of_line (void)
3046 if (is_end_of_line
[(unsigned char) *input_line_pointer
])
3047 input_line_pointer
++;
3050 if (ISPRINT (*input_line_pointer
))
3051 as_bad (_("junk at end of line, first unrecognized character is `%c'"),
3052 *input_line_pointer
);
3054 as_bad (_("junk at end of line, first unrecognized character valued 0x%x"),
3055 *input_line_pointer
);
3056 ignore_rest_of_line ();
3059 /* Return pointing just after end-of-line. */
3060 know (is_end_of_line
[(unsigned char) input_line_pointer
[-1]]);
3063 /* Silently advance to the end of line. Use this after already having
3064 issued an error about something bad. */
3067 ignore_rest_of_line (void)
3069 while (input_line_pointer
< buffer_limit
3070 && !is_end_of_line
[(unsigned char) *input_line_pointer
])
3071 input_line_pointer
++;
3073 input_line_pointer
++;
3075 /* Return pointing just after end-of-line. */
3076 know (is_end_of_line
[(unsigned char) input_line_pointer
[-1]]);
3080 discard_rest_of_line (void)
3082 while (input_line_pointer
< buffer_limit
3083 && !is_end_of_line
[(unsigned char) *input_line_pointer
])
3084 input_line_pointer
++;
3086 input_line_pointer
++;
3088 /* Return pointing just after end-of-line. */
3089 know (is_end_of_line
[(unsigned char) input_line_pointer
[-1]]);
3092 /* In: Pointer to a symbol.
3093 Input_line_pointer->expression.
3095 Out: Input_line_pointer->just after any whitespace after expression.
3096 Tried to set symbol to value of expression.
3097 Will change symbols type, value, and frag; */
3100 pseudo_set (symbolS
*symbolP
)
3103 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3105 #endif /* OBJ_AOUT or OBJ_BOUT */
3107 know (symbolP
); /* NULL pointer is logic error. */
3108 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3109 ext
= S_IS_EXTERNAL (symbolP
);
3110 #endif /* OBJ_AOUT or OBJ_BOUT */
3112 (void) expression (&exp
);
3114 if (exp
.X_op
== O_illegal
)
3115 as_bad (_("illegal expression"));
3116 else if (exp
.X_op
== O_absent
)
3117 as_bad (_("missing expression"));
3118 else if (exp
.X_op
== O_big
)
3120 if (exp
.X_add_number
> 0)
3121 as_bad (_("bignum invalid"));
3123 as_bad (_("floating point number invalid"));
3125 else if (exp
.X_op
== O_subtract
3126 && SEG_NORMAL (S_GET_SEGMENT (exp
.X_add_symbol
))
3127 && (symbol_get_frag (exp
.X_add_symbol
)
3128 == symbol_get_frag (exp
.X_op_symbol
)))
3130 exp
.X_op
= O_constant
;
3131 exp
.X_add_number
= (S_GET_VALUE (exp
.X_add_symbol
)
3132 - S_GET_VALUE (exp
.X_op_symbol
));
3140 exp
.X_add_number
= 0;
3143 S_SET_SEGMENT (symbolP
, absolute_section
);
3144 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3146 S_SET_EXTERNAL (symbolP
);
3148 S_CLEAR_EXTERNAL (symbolP
);
3149 #endif /* OBJ_AOUT or OBJ_BOUT */
3150 S_SET_VALUE (symbolP
, (valueT
) exp
.X_add_number
);
3151 if (exp
.X_op
!= O_constant
)
3152 symbol_set_frag (symbolP
, &zero_address_frag
);
3156 S_SET_SEGMENT (symbolP
, reg_section
);
3157 S_SET_VALUE (symbolP
, (valueT
) exp
.X_add_number
);
3158 symbol_set_frag (symbolP
, &zero_address_frag
);
3162 if (S_GET_SEGMENT (exp
.X_add_symbol
) == undefined_section
3163 || exp
.X_add_number
!= 0)
3164 symbol_set_value_expression (symbolP
, &exp
);
3165 else if (symbol_section_p (symbolP
))
3166 as_bad ("attempt to set value of section symbol");
3169 symbolS
*s
= exp
.X_add_symbol
;
3171 S_SET_SEGMENT (symbolP
, S_GET_SEGMENT (s
));
3172 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3174 S_SET_EXTERNAL (symbolP
);
3176 S_CLEAR_EXTERNAL (symbolP
);
3177 #endif /* OBJ_AOUT or OBJ_BOUT */
3178 S_SET_VALUE (symbolP
,
3179 exp
.X_add_number
+ S_GET_VALUE (s
));
3180 symbol_set_frag (symbolP
, symbol_get_frag (s
));
3181 copy_symbol_attributes (symbolP
, s
);
3186 /* The value is some complex expression.
3187 FIXME: Should we set the segment to anything? */
3188 symbol_set_value_expression (symbolP
, &exp
);
3195 CONStruct more frag of .bytes, or .words etc.
3196 Should need_pass_2 be 1 then emit no frag(s).
3197 This understands EXPRESSIONS.
3201 This has a split personality. We use expression() to read the
3202 value. We can detect if the value won't fit in a byte or word.
3203 But we can't detect if expression() discarded significant digits
3204 in the case of a long. Not worth the crocks required to fix it. */
3206 /* Select a parser for cons expressions. */
3208 /* Some targets need to parse the expression in various fancy ways.
3209 You can define TC_PARSE_CONS_EXPRESSION to do whatever you like
3210 (for example, the HPPA does this). Otherwise, you can define
3211 BITFIELD_CONS_EXPRESSIONS to permit bitfields to be specified, or
3212 REPEAT_CONS_EXPRESSIONS to permit repeat counts. If none of these
3213 are defined, which is the normal case, then only simple expressions
3218 parse_mri_cons (expressionS
*exp
, unsigned int nbytes
);
3221 #ifndef TC_PARSE_CONS_EXPRESSION
3222 #ifdef BITFIELD_CONS_EXPRESSIONS
3223 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_bitfield_cons (EXP, NBYTES)
3225 parse_bitfield_cons (expressionS
*exp
, unsigned int nbytes
);
3227 #ifdef REPEAT_CONS_EXPRESSIONS
3228 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_repeat_cons (EXP, NBYTES)
3230 parse_repeat_cons (expressionS
*exp
, unsigned int nbytes
);
3233 /* If we haven't gotten one yet, just call expression. */
3234 #ifndef TC_PARSE_CONS_EXPRESSION
3235 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) expression (EXP)
3240 do_parse_cons_expression (expressionS
*exp
,
3241 int nbytes ATTRIBUTE_UNUSED
)
3243 TC_PARSE_CONS_EXPRESSION (exp
, nbytes
);
3247 /* Worker to do .byte etc statements.
3248 Clobbers input_line_pointer and checks end-of-line. */
3251 cons_worker (register int nbytes
, /* 1=.byte, 2=.word, 4=.long. */
3259 #ifdef md_flush_pending_output
3260 md_flush_pending_output ();
3264 stop
= mri_comment_field (&stopc
);
3266 if (is_it_end_of_statement ())
3268 demand_empty_rest_of_line ();
3270 mri_comment_end (stop
, stopc
);
3274 #ifdef md_cons_align
3275 md_cons_align (nbytes
);
3283 parse_mri_cons (&exp
, (unsigned int) nbytes
);
3286 TC_PARSE_CONS_EXPRESSION (&exp
, (unsigned int) nbytes
);
3290 if (exp
.X_op
== O_symbol
)
3291 exp
.X_op
= O_symbol_rva
;
3293 as_fatal (_("rva without symbol"));
3295 emit_expr (&exp
, (unsigned int) nbytes
);
3298 while (*input_line_pointer
++ == ',');
3300 /* In MRI mode, after an odd number of bytes, we must align to an
3301 even word boundary, unless the next instruction is a dc.b, ds.b
3303 if (flag_mri
&& nbytes
== 1 && (c
& 1) != 0)
3304 mri_pending_align
= 1;
3306 input_line_pointer
--; /* Put terminator back into stream. */
3308 demand_empty_rest_of_line ();
3311 mri_comment_end (stop
, stopc
);
3317 cons_worker (size
, 0);
3323 cons_worker (size
, 1);
3326 /* Put the contents of expression EXP into the object file using
3327 NBYTES bytes. If need_pass_2 is 1, this does nothing. */
3330 emit_expr (expressionS
*exp
, unsigned int nbytes
)
3334 valueT extra_digit
= 0;
3336 /* Don't do anything if we are going to make another pass. */
3340 dot_value
= frag_now_fix ();
3344 /* When gcc emits DWARF 1 debugging pseudo-ops, a line number will
3345 appear as a four byte positive constant in the .line section,
3346 followed by a 2 byte 0xffff. Look for that case here. */
3348 static int dwarf_line
= -1;
3350 if (strcmp (segment_name (now_seg
), ".line") != 0)
3352 else if (dwarf_line
>= 0
3354 && exp
->X_op
== O_constant
3355 && (exp
->X_add_number
== -1 || exp
->X_add_number
== 0xffff))
3356 listing_source_line ((unsigned int) dwarf_line
);
3357 else if (nbytes
== 4
3358 && exp
->X_op
== O_constant
3359 && exp
->X_add_number
>= 0)
3360 dwarf_line
= exp
->X_add_number
;
3365 /* When gcc emits DWARF 1 debugging pseudo-ops, a file name will
3366 appear as a 2 byte TAG_compile_unit (0x11) followed by a 2 byte
3367 AT_sibling (0x12) followed by a four byte address of the sibling
3368 followed by a 2 byte AT_name (0x38) followed by the name of the
3369 file. We look for that case here. */
3371 static int dwarf_file
= 0;
3373 if (strcmp (segment_name (now_seg
), ".debug") != 0)
3375 else if (dwarf_file
== 0
3377 && exp
->X_op
== O_constant
3378 && exp
->X_add_number
== 0x11)
3380 else if (dwarf_file
== 1
3382 && exp
->X_op
== O_constant
3383 && exp
->X_add_number
== 0x12)
3385 else if (dwarf_file
== 2
3388 else if (dwarf_file
== 3
3390 && exp
->X_op
== O_constant
3391 && exp
->X_add_number
== 0x38)
3396 /* The variable dwarf_file_string tells stringer that the string
3397 may be the name of the source file. */
3398 if (dwarf_file
== 4)
3399 dwarf_file_string
= 1;
3401 dwarf_file_string
= 0;
3406 if (check_eh_frame (exp
, &nbytes
))
3411 /* Allow `.word 0' in the absolute section. */
3412 if (now_seg
== absolute_section
)
3414 if (op
!= O_constant
|| exp
->X_add_number
!= 0)
3415 as_bad (_("attempt to store value in absolute section"));
3416 abs_section_offset
+= nbytes
;
3420 /* Handle a negative bignum. */
3422 && exp
->X_add_number
== 0
3423 && symbol_get_value_expression (exp
->X_add_symbol
)->X_op
== O_big
3424 && symbol_get_value_expression (exp
->X_add_symbol
)->X_add_number
> 0)
3427 unsigned long carry
;
3429 exp
= symbol_get_value_expression (exp
->X_add_symbol
);
3431 /* Negate the bignum: one's complement each digit and add 1. */
3433 for (i
= 0; i
< exp
->X_add_number
; i
++)
3437 next
= (((~(generic_bignum
[i
] & LITTLENUM_MASK
))
3440 generic_bignum
[i
] = next
& LITTLENUM_MASK
;
3441 carry
= next
>> LITTLENUM_NUMBER_OF_BITS
;
3444 /* We can ignore any carry out, because it will be handled by
3445 extra_digit if it is needed. */
3447 extra_digit
= (valueT
) -1;
3451 if (op
== O_absent
|| op
== O_illegal
)
3453 as_warn (_("zero assumed for missing expression"));
3454 exp
->X_add_number
= 0;
3457 else if (op
== O_big
&& exp
->X_add_number
<= 0)
3459 as_bad (_("floating point number invalid"));
3460 exp
->X_add_number
= 0;
3463 else if (op
== O_register
)
3465 as_warn (_("register value used as expression"));
3469 p
= frag_more ((int) nbytes
);
3471 #ifndef WORKING_DOT_WORD
3472 /* If we have the difference of two symbols in a word, save it on
3473 the broken_words list. See the code in write.c. */
3474 if (op
== O_subtract
&& nbytes
== 2)
3476 struct broken_word
*x
;
3478 x
= (struct broken_word
*) xmalloc (sizeof (struct broken_word
));
3479 x
->next_broken_word
= broken_words
;
3482 x
->subseg
= now_subseg
;
3484 x
->word_goes_here
= p
;
3486 x
->add
= exp
->X_add_symbol
;
3487 x
->sub
= exp
->X_op_symbol
;
3488 x
->addnum
= exp
->X_add_number
;
3496 /* If we have an integer, but the number of bytes is too large to
3497 pass to md_number_to_chars, handle it as a bignum. */
3498 if (op
== O_constant
&& nbytes
> sizeof (valueT
))
3503 if (!exp
->X_unsigned
&& exp
->X_add_number
< 0)
3504 extra_digit
= (valueT
) -1;
3505 val
= (valueT
) exp
->X_add_number
;
3509 generic_bignum
[gencnt
] = val
& LITTLENUM_MASK
;
3510 val
>>= LITTLENUM_NUMBER_OF_BITS
;
3514 op
= exp
->X_op
= O_big
;
3515 exp
->X_add_number
= gencnt
;
3518 if (op
== O_constant
)
3520 register valueT get
;
3521 register valueT use
;
3522 register valueT mask
;
3524 register valueT unmask
;
3526 /* JF << of >= number of bits in the object is undefined. In
3527 particular SPARC (Sun 4) has problems. */
3528 if (nbytes
>= sizeof (valueT
))
3531 if (nbytes
> sizeof (valueT
))
3534 hibit
= (valueT
) 1 << (nbytes
* BITS_PER_CHAR
- 1);
3538 /* Don't store these bits. */
3539 mask
= ~(valueT
) 0 << (BITS_PER_CHAR
* nbytes
);
3540 hibit
= (valueT
) 1 << (nbytes
* BITS_PER_CHAR
- 1);
3543 unmask
= ~mask
; /* Do store these bits. */
3546 "Do this mod if you want every overflow check to assume SIGNED 2's complement data.";
3547 mask
= ~(unmask
>> 1); /* Includes sign bit now. */
3550 get
= exp
->X_add_number
;
3552 if ((get
& mask
) != 0
3553 && ((get
& mask
) != mask
3554 || (get
& hibit
) == 0))
3555 { /* Leading bits contain both 0s & 1s. */
3556 as_warn (_("value 0x%lx truncated to 0x%lx"),
3557 (unsigned long) get
, (unsigned long) use
);
3559 /* Put bytes in right order. */
3560 md_number_to_chars (p
, use
, (int) nbytes
);
3562 else if (op
== O_big
)
3565 LITTLENUM_TYPE
*nums
;
3567 know (nbytes
% CHARS_PER_LITTLENUM
== 0);
3569 size
= exp
->X_add_number
* CHARS_PER_LITTLENUM
;
3572 as_warn (_("bignum truncated to %d bytes"), nbytes
);
3576 if (target_big_endian
)
3578 while (nbytes
> size
)
3580 md_number_to_chars (p
, extra_digit
, CHARS_PER_LITTLENUM
);
3581 nbytes
-= CHARS_PER_LITTLENUM
;
3582 p
+= CHARS_PER_LITTLENUM
;
3585 nums
= generic_bignum
+ size
/ CHARS_PER_LITTLENUM
;
3586 while (size
>= CHARS_PER_LITTLENUM
)
3589 md_number_to_chars (p
, (valueT
) *nums
, CHARS_PER_LITTLENUM
);
3590 size
-= CHARS_PER_LITTLENUM
;
3591 p
+= CHARS_PER_LITTLENUM
;
3596 nums
= generic_bignum
;
3597 while (size
>= CHARS_PER_LITTLENUM
)
3599 md_number_to_chars (p
, (valueT
) *nums
, CHARS_PER_LITTLENUM
);
3601 size
-= CHARS_PER_LITTLENUM
;
3602 p
+= CHARS_PER_LITTLENUM
;
3603 nbytes
-= CHARS_PER_LITTLENUM
;
3606 while (nbytes
>= CHARS_PER_LITTLENUM
)
3608 md_number_to_chars (p
, extra_digit
, CHARS_PER_LITTLENUM
);
3609 nbytes
-= CHARS_PER_LITTLENUM
;
3610 p
+= CHARS_PER_LITTLENUM
;
3616 memset (p
, 0, nbytes
);
3618 /* Now we need to generate a fixS to record the symbol value.
3619 This is easy for BFD. For other targets it can be more
3620 complex. For very complex cases (currently, the HPPA and
3621 NS32K), you can define TC_CONS_FIX_NEW to do whatever you
3622 want. For simpler cases, you can define TC_CONS_RELOC to be
3623 the name of the reloc code that should be stored in the fixS.
3624 If neither is defined, the code uses NO_RELOC if it is
3625 defined, and otherwise uses 0. */
3627 #ifdef BFD_ASSEMBLER
3628 #ifdef TC_CONS_FIX_NEW
3629 TC_CONS_FIX_NEW (frag_now
, p
- frag_now
->fr_literal
, nbytes
, exp
);
3632 bfd_reloc_code_real_type r
;
3649 as_bad (_("unsupported BFD relocation size %u"), nbytes
);
3653 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, (int) nbytes
, exp
,
3658 #ifdef TC_CONS_FIX_NEW
3659 TC_CONS_FIX_NEW (frag_now
, p
- frag_now
->fr_literal
, nbytes
, exp
);
3661 /* Figure out which reloc number to use. Use TC_CONS_RELOC if
3662 it is defined, otherwise use NO_RELOC if it is defined,
3664 #ifndef TC_CONS_RELOC
3666 #define TC_CONS_RELOC NO_RELOC
3668 #define TC_CONS_RELOC 0
3671 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, (int) nbytes
, exp
, 0,
3673 #endif /* TC_CONS_FIX_NEW */
3674 #endif /* BFD_ASSEMBLER */
3678 #ifdef BITFIELD_CONS_EXPRESSIONS
3680 /* i960 assemblers, (eg, asm960), allow bitfields after ".byte" as
3681 w:x,y:z, where w and y are bitwidths and x and y are values. They
3682 then pack them all together. We do a little better in that we allow
3683 them in words, longs, etc. and we'll pack them in target byte order
3686 The rules are: pack least significant bit first, if a field doesn't
3687 entirely fit, put it in the next unit. Overflowing the bitfield is
3688 explicitly *not* even a warning. The bitwidth should be considered
3691 To use this function the tc-XXX.h file should define
3692 BITFIELD_CONS_EXPRESSIONS. */
3695 parse_bitfield_cons (exp
, nbytes
)
3697 unsigned int nbytes
;
3699 unsigned int bits_available
= BITS_PER_CHAR
* nbytes
;
3700 char *hold
= input_line_pointer
;
3702 (void) expression (exp
);
3704 if (*input_line_pointer
== ':')
3711 unsigned long width
;
3713 if (*input_line_pointer
!= ':')
3715 input_line_pointer
= hold
;
3717 } /* Next piece is not a bitfield. */
3719 /* In the general case, we can't allow
3720 full expressions with symbol
3721 differences and such. The relocation
3722 entries for symbols not defined in this
3723 assembly would require arbitrary field
3724 widths, positions, and masks which most
3725 of our current object formats don't
3728 In the specific case where a symbol
3729 *is* defined in this assembly, we
3730 *could* build fixups and track it, but
3731 this could lead to confusion for the
3732 backends. I'm lazy. I'll take any
3733 SEG_ABSOLUTE. I think that means that
3734 you can use a previous .set or
3735 .equ type symbol. xoxorich. */
3737 if (exp
->X_op
== O_absent
)
3739 as_warn (_("using a bit field width of zero"));
3740 exp
->X_add_number
= 0;
3741 exp
->X_op
= O_constant
;
3742 } /* Implied zero width bitfield. */
3744 if (exp
->X_op
!= O_constant
)
3746 *input_line_pointer
= '\0';
3747 as_bad (_("field width \"%s\" too complex for a bitfield"), hold
);
3748 *input_line_pointer
= ':';
3749 demand_empty_rest_of_line ();
3751 } /* Too complex. */
3753 if ((width
= exp
->X_add_number
) > (BITS_PER_CHAR
* nbytes
))
3755 as_warn (_("field width %lu too big to fit in %d bytes: truncated to %d bits"),
3756 width
, nbytes
, (BITS_PER_CHAR
* nbytes
));
3757 width
= BITS_PER_CHAR
* nbytes
;
3760 if (width
> bits_available
)
3762 /* FIXME-SOMEDAY: backing up and reparsing is wasteful. */
3763 input_line_pointer
= hold
;
3764 exp
->X_add_number
= value
;
3769 hold
= ++input_line_pointer
;
3771 (void) expression (exp
);
3772 if (exp
->X_op
!= O_constant
)
3774 char cache
= *input_line_pointer
;
3776 *input_line_pointer
= '\0';
3777 as_bad (_("field value \"%s\" too complex for a bitfield"), hold
);
3778 *input_line_pointer
= cache
;
3779 demand_empty_rest_of_line ();
3781 } /* Too complex. */
3783 value
|= ((~(-1 << width
) & exp
->X_add_number
)
3784 << ((BITS_PER_CHAR
* nbytes
) - bits_available
));
3786 if ((bits_available
-= width
) == 0
3787 || is_it_end_of_statement ()
3788 || *input_line_pointer
!= ',')
3791 } /* All the bitfields we're gonna get. */
3793 hold
= ++input_line_pointer
;
3794 (void) expression (exp
);
3797 exp
->X_add_number
= value
;
3798 exp
->X_op
= O_constant
;
3799 exp
->X_unsigned
= 1;
3803 #endif /* BITFIELD_CONS_EXPRESSIONS */
3805 /* Handle an MRI style string expression. */
3809 parse_mri_cons (exp
, nbytes
)
3811 unsigned int nbytes
;
3813 if (*input_line_pointer
!= '\''
3814 && (input_line_pointer
[1] != '\''
3815 || (*input_line_pointer
!= 'A'
3816 && *input_line_pointer
!= 'E')))
3817 TC_PARSE_CONS_EXPRESSION (exp
, nbytes
);
3821 unsigned int result
= 0;
3823 /* An MRI style string. Cut into as many bytes as will fit into
3824 a nbyte chunk, left justify if necessary, and separate with
3825 commas so we can try again later. */
3826 if (*input_line_pointer
== 'A')
3827 ++input_line_pointer
;
3828 else if (*input_line_pointer
== 'E')
3830 as_bad (_("EBCDIC constants are not supported"));
3831 ++input_line_pointer
;
3834 input_line_pointer
++;
3835 for (scan
= 0; scan
< nbytes
; scan
++)
3837 if (*input_line_pointer
== '\'')
3839 if (input_line_pointer
[1] == '\'')
3841 input_line_pointer
++;
3846 result
= (result
<< 8) | (*input_line_pointer
++);
3850 while (scan
< nbytes
)
3856 /* Create correct expression. */
3857 exp
->X_op
= O_constant
;
3858 exp
->X_add_number
= result
;
3860 /* Fake it so that we can read the next char too. */
3861 if (input_line_pointer
[0] != '\'' ||
3862 (input_line_pointer
[0] == '\'' && input_line_pointer
[1] == '\''))
3864 input_line_pointer
-= 2;
3865 input_line_pointer
[0] = ',';
3866 input_line_pointer
[1] = '\'';
3869 input_line_pointer
++;
3872 #endif /* TC_M68K */
3874 #ifdef REPEAT_CONS_EXPRESSIONS
3876 /* Parse a repeat expression for cons. This is used by the MIPS
3877 assembler. The format is NUMBER:COUNT; NUMBER appears in the
3878 object file COUNT times.
3880 To use this for a target, define REPEAT_CONS_EXPRESSIONS. */
3883 parse_repeat_cons (exp
, nbytes
)
3885 unsigned int nbytes
;
3892 if (*input_line_pointer
!= ':')
3894 /* No repeat count. */
3898 ++input_line_pointer
;
3899 expression (&count
);
3900 if (count
.X_op
!= O_constant
3901 || count
.X_add_number
<= 0)
3903 as_warn (_("unresolvable or nonpositive repeat count; using 1"));
3907 /* The cons function is going to output this expression once. So we
3908 output it count - 1 times. */
3909 for (i
= count
.X_add_number
- 1; i
> 0; i
--)
3910 emit_expr (exp
, nbytes
);
3913 #endif /* REPEAT_CONS_EXPRESSIONS */
3915 /* Parse a floating point number represented as a hex constant. This
3916 permits users to specify the exact bits they want in the floating
3920 hex_float (int float_type
, char *bytes
)
3952 as_bad (_("unknown floating type type '%c'"), float_type
);
3956 /* It would be nice if we could go through expression to parse the
3957 hex constant, but if we get a bignum it's a pain to sort it into
3958 the buffer correctly. */
3960 while (hex_p (*input_line_pointer
) || *input_line_pointer
== '_')
3964 /* The MRI assembler accepts arbitrary underscores strewn about
3965 through the hex constant, so we ignore them as well. */
3966 if (*input_line_pointer
== '_')
3968 ++input_line_pointer
;
3974 as_warn (_("floating point constant too large"));
3977 d
= hex_value (*input_line_pointer
) << 4;
3978 ++input_line_pointer
;
3979 while (*input_line_pointer
== '_')
3980 ++input_line_pointer
;
3981 if (hex_p (*input_line_pointer
))
3983 d
+= hex_value (*input_line_pointer
);
3984 ++input_line_pointer
;
3986 if (target_big_endian
)
3989 bytes
[length
- i
- 1] = d
;
3995 if (target_big_endian
)
3996 memset (bytes
+ i
, 0, length
- i
);
3998 memset (bytes
, 0, length
- i
);
4006 CONStruct some more frag chars of .floats .ffloats etc.
4007 Makes 0 or more new frags.
4008 If need_pass_2 == 1, no frags are emitted.
4009 This understands only floating literals, not expressions. Sorry.
4011 A floating constant is defined by atof_generic(), except it is preceded
4012 by 0d 0f 0g or 0h. After observing the STRANGE way my BSD AS does its
4013 reading, I decided to be incompatible. This always tries to give you
4014 rounded bits to the precision of the pseudo-op. Former AS did premature
4015 truncation, restored noisy bits instead of trailing 0s AND gave you
4016 a choice of 2 flavours of noise according to which of 2 floating-point
4017 scanners you directed AS to use.
4019 In: input_line_pointer->whitespace before, or '0' of flonum. */
4022 float_cons (/* Clobbers input_line-pointer, checks end-of-line. */
4023 register int float_type
/* 'f':.ffloat ... 'F':.float ... */)
4026 int length
; /* Number of chars in an object. */
4027 register char *err
; /* Error from scanning floating literal. */
4028 char temp
[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT
];
4030 if (is_it_end_of_statement ())
4032 demand_empty_rest_of_line ();
4036 #ifdef md_flush_pending_output
4037 md_flush_pending_output ();
4042 /* input_line_pointer->1st char of a flonum (we hope!). */
4045 /* Skip any 0{letter} that may be present. Don't even check if the
4046 letter is legal. Someone may invent a "z" format and this routine
4047 has no use for such information. Lusers beware: you get
4048 diagnostics if your input is ill-conditioned. */
4049 if (input_line_pointer
[0] == '0'
4050 && ISALPHA (input_line_pointer
[1]))
4051 input_line_pointer
+= 2;
4053 /* Accept :xxxx, where the x's are hex digits, for a floating
4054 point with the exact digits specified. */
4055 if (input_line_pointer
[0] == ':')
4057 ++input_line_pointer
;
4058 length
= hex_float (float_type
, temp
);
4061 ignore_rest_of_line ();
4067 err
= md_atof (float_type
, temp
, &length
);
4068 know (length
<= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT
);
4072 as_bad (_("bad floating literal: %s"), err
);
4073 ignore_rest_of_line ();
4084 #ifdef REPEAT_CONS_EXPRESSIONS
4085 if (*input_line_pointer
== ':')
4087 expressionS count_exp
;
4089 ++input_line_pointer
;
4090 expression (&count_exp
);
4092 if (count_exp
.X_op
!= O_constant
4093 || count_exp
.X_add_number
<= 0)
4094 as_warn (_("unresolvable or nonpositive repeat count; using 1"));
4096 count
= count_exp
.X_add_number
;
4100 while (--count
>= 0)
4102 p
= frag_more (length
);
4103 memcpy (p
, temp
, (unsigned int) length
);
4108 while (*input_line_pointer
++ == ',');
4110 /* Put terminator back into stream. */
4111 --input_line_pointer
;
4112 demand_empty_rest_of_line ();
4115 /* Return the size of a LEB128 value. */
4118 sizeof_sleb128 (offsetT value
)
4120 register int size
= 0;
4121 register unsigned byte
;
4125 byte
= (value
& 0x7f);
4126 /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
4127 Fortunately, we can structure things so that the extra work reduces
4128 to a noop on systems that do things "properly". */
4129 value
= (value
>> 7) | ~(-(offsetT
)1 >> 7);
4132 while (!(((value
== 0) && ((byte
& 0x40) == 0))
4133 || ((value
== -1) && ((byte
& 0x40) != 0))));
4139 sizeof_uleb128 (valueT value
)
4141 register int size
= 0;
4142 register unsigned byte
;
4146 byte
= (value
& 0x7f);
4156 sizeof_leb128 (valueT value
, int sign
)
4159 return sizeof_sleb128 ((offsetT
) value
);
4161 return sizeof_uleb128 (value
);
4164 /* Output a LEB128 value. */
4167 output_sleb128 (char *p
, offsetT value
)
4169 register char *orig
= p
;
4174 unsigned byte
= (value
& 0x7f);
4176 /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
4177 Fortunately, we can structure things so that the extra work reduces
4178 to a noop on systems that do things "properly". */
4179 value
= (value
>> 7) | ~(-(offsetT
)1 >> 7);
4181 more
= !((((value
== 0) && ((byte
& 0x40) == 0))
4182 || ((value
== -1) && ((byte
& 0x40) != 0))));
4194 output_uleb128 (char *p
, valueT value
)
4200 unsigned byte
= (value
& 0x7f);
4203 /* More bytes to follow. */
4214 output_leb128 (char *p
, valueT value
, int sign
)
4217 return output_sleb128 (p
, (offsetT
) value
);
4219 return output_uleb128 (p
, value
);
4222 /* Do the same for bignums. We combine sizeof with output here in that
4223 we don't output for NULL values of P. It isn't really as critical as
4224 for "normal" values that this be streamlined. */
4227 output_big_sleb128 (char *p
, LITTLENUM_TYPE
*bignum
, int size
)
4234 /* Strip leading sign extensions off the bignum. */
4235 while (size
> 0 && bignum
[size
- 1] == (LITTLENUM_TYPE
) -1)
4240 if (loaded
< 7 && size
> 0)
4242 val
|= (*bignum
<< loaded
);
4243 loaded
+= 8 * CHARS_PER_LITTLENUM
;
4254 if ((val
== 0 && (byte
& 0x40) == 0)
4255 || (~(val
| ~(((valueT
) 1 << loaded
) - 1)) == 0
4256 && (byte
& 0x40) != 0))
4264 while (byte
& 0x80);
4270 output_big_uleb128 (char *p
, LITTLENUM_TYPE
*bignum
, int size
)
4277 /* Strip leading zeros off the bignum. */
4278 /* XXX: Is this needed? */
4279 while (size
> 0 && bignum
[size
- 1] == 0)
4284 if (loaded
< 7 && size
> 0)
4286 val
|= (*bignum
<< loaded
);
4287 loaded
+= 8 * CHARS_PER_LITTLENUM
;
4296 if (size
> 0 || val
)
4303 while (byte
& 0x80);
4309 output_big_leb128 (char *p
, LITTLENUM_TYPE
*bignum
, int size
, int sign
)
4312 return output_big_sleb128 (p
, bignum
, size
);
4314 return output_big_uleb128 (p
, bignum
, size
);
4317 /* Generate the appropriate fragments for a given expression to emit a
4321 emit_leb128_expr (expressionS
*exp
, int sign
)
4323 operatorT op
= exp
->X_op
;
4326 if (op
== O_absent
|| op
== O_illegal
)
4328 as_warn (_("zero assumed for missing expression"));
4329 exp
->X_add_number
= 0;
4332 else if (op
== O_big
&& exp
->X_add_number
<= 0)
4334 as_bad (_("floating point number invalid"));
4335 exp
->X_add_number
= 0;
4338 else if (op
== O_register
)
4340 as_warn (_("register value used as expression"));
4344 /* Let check_eh_frame know that data is being emitted. nbytes == -1 is
4345 a signal that this is leb128 data. It shouldn't optimize this away. */
4347 if (check_eh_frame (exp
, &nbytes
))
4350 /* Let the backend know that subsequent data may be byte aligned. */
4351 #ifdef md_cons_align
4355 if (op
== O_constant
)
4357 /* If we've got a constant, emit the thing directly right now. */
4359 valueT value
= exp
->X_add_number
;
4363 size
= sizeof_leb128 (value
, sign
);
4364 p
= frag_more (size
);
4365 output_leb128 (p
, value
, sign
);
4367 else if (op
== O_big
)
4369 /* O_big is a different sort of constant. */
4374 size
= output_big_leb128 (NULL
, generic_bignum
, exp
->X_add_number
, sign
);
4375 p
= frag_more (size
);
4376 output_big_leb128 (p
, generic_bignum
, exp
->X_add_number
, sign
);
4380 /* Otherwise, we have to create a variable sized fragment and
4381 resolve things later. */
4383 frag_var (rs_leb128
, sizeof_uleb128 (~(valueT
) 0), 0, sign
,
4384 make_expr_symbol (exp
), 0, (char *) NULL
);
4388 /* Parse the .sleb128 and .uleb128 pseudos. */
4395 #ifdef md_flush_pending_output
4396 md_flush_pending_output ();
4402 emit_leb128_expr (&exp
, sign
);
4404 while (*input_line_pointer
++ == ',');
4406 input_line_pointer
--;
4407 demand_empty_rest_of_line ();
4410 /* We read 0 or more ',' separated, double-quoted strings.
4411 Caller should have checked need_pass_2 is FALSE because we don't
4415 stringer (/* Worker to do .ascii etc statements. */
4416 /* Checks end-of-line. */
4417 register int append_zero
/* 0: don't append '\0', else 1. */)
4419 register unsigned int c
;
4422 #ifdef md_flush_pending_output
4423 md_flush_pending_output ();
4426 /* The following awkward logic is to parse ZERO or more strings,
4427 comma separated. Recall a string expression includes spaces
4428 before the opening '\"' and spaces after the closing '\"'.
4429 We fake a leading ',' if there is (supposed to be)
4430 a 1st, expression. We keep demanding expressions for each ','. */
4431 if (is_it_end_of_statement ())
4433 c
= 0; /* Skip loop. */
4434 ++input_line_pointer
; /* Compensate for end of loop. */
4438 c
= ','; /* Do loop. */
4440 /* If we have been switched into the abs_section then we
4441 will not have an obstack onto which we can hang strings. */
4442 if (now_seg
== absolute_section
)
4444 as_bad (_("strings must be placed into a section"));
4446 ignore_rest_of_line ();
4449 while (c
== ',' || c
== '<' || c
== '"')
4452 switch (*input_line_pointer
)
4455 ++input_line_pointer
; /*->1st char of string. */
4456 start
= input_line_pointer
;
4457 while (is_a_char (c
= next_char_of_string ()))
4459 FRAG_APPEND_1_CHAR (c
);
4463 FRAG_APPEND_1_CHAR (0);
4465 know (input_line_pointer
[-1] == '\"');
4469 /* In ELF, when gcc is emitting DWARF 1 debugging output, it
4470 will emit .string with a filename in the .debug section
4471 after a sequence of constants. See the comment in
4472 emit_expr for the sequence. emit_expr will set
4473 dwarf_file_string to non-zero if this string might be a
4474 source file name. */
4475 if (strcmp (segment_name (now_seg
), ".debug") != 0)
4476 dwarf_file_string
= 0;
4477 else if (dwarf_file_string
)
4479 c
= input_line_pointer
[-1];
4480 input_line_pointer
[-1] = '\0';
4481 listing_source_file (start
);
4482 input_line_pointer
[-1] = c
;
4489 input_line_pointer
++;
4490 c
= get_single_number ();
4491 FRAG_APPEND_1_CHAR (c
);
4492 if (*input_line_pointer
!= '>')
4494 as_bad (_("expected <nn>"));
4496 input_line_pointer
++;
4499 input_line_pointer
++;
4503 c
= *input_line_pointer
;
4506 demand_empty_rest_of_line ();
4509 /* FIXME-SOMEDAY: I had trouble here on characters with the
4510 high bits set. We'll probably also have trouble with
4511 multibyte chars, wide chars, etc. Also be careful about
4512 returning values bigger than 1 byte. xoxorich. */
4515 next_char_of_string (void)
4517 register unsigned int c
;
4519 c
= *input_line_pointer
++ & CHAR_MASK
;
4527 as_warn (_("unterminated string; newline inserted"));
4528 bump_line_counters ();
4531 #ifndef NO_STRING_ESCAPES
4533 switch (c
= *input_line_pointer
++)
4561 break; /* As itself. */
4577 for (i
= 0, number
= 0;
4578 ISDIGIT (c
) && i
< 3;
4579 c
= *input_line_pointer
++, i
++)
4581 number
= number
* 8 + c
- '0';
4586 --input_line_pointer
;
4595 c
= *input_line_pointer
++;
4596 while (ISXDIGIT (c
))
4599 number
= number
* 16 + c
- '0';
4600 else if (ISUPPER (c
))
4601 number
= number
* 16 + c
- 'A' + 10;
4603 number
= number
* 16 + c
- 'a' + 10;
4604 c
= *input_line_pointer
++;
4607 --input_line_pointer
;
4612 /* To be compatible with BSD 4.2 as: give the luser a linefeed!! */
4613 as_warn (_("unterminated string; newline inserted"));
4615 bump_line_counters ();
4620 #ifdef ONLY_STANDARD_ESCAPES
4621 as_bad (_("bad escaped character in string"));
4623 #endif /* ONLY_STANDARD_ESCAPES */
4628 #endif /* ! defined (NO_STRING_ESCAPES) */
4637 get_segmented_expression (register expressionS
*expP
)
4639 register segT retval
;
4641 retval
= expression (expP
);
4642 if (expP
->X_op
== O_illegal
4643 || expP
->X_op
== O_absent
4644 || expP
->X_op
== O_big
)
4646 as_bad (_("expected address expression"));
4647 expP
->X_op
= O_constant
;
4648 expP
->X_add_number
= 0;
4649 retval
= absolute_section
;
4655 get_known_segmented_expression (register expressionS
*expP
)
4657 register segT retval
;
4659 if ((retval
= get_segmented_expression (expP
)) == undefined_section
)
4661 /* There is no easy way to extract the undefined symbol from the
4663 if (expP
->X_add_symbol
!= NULL
4664 && S_GET_SEGMENT (expP
->X_add_symbol
) != expr_section
)
4665 as_warn (_("symbol \"%s\" undefined; zero assumed"),
4666 S_GET_NAME (expP
->X_add_symbol
));
4668 as_warn (_("some symbol undefined; zero assumed"));
4669 retval
= absolute_section
;
4670 expP
->X_op
= O_constant
;
4671 expP
->X_add_number
= 0;
4673 know (retval
== absolute_section
|| SEG_NORMAL (retval
));
4678 get_absolute_expr (expressionS
*exp
)
4681 if (exp
->X_op
!= O_constant
)
4683 if (exp
->X_op
!= O_absent
)
4684 as_bad (_("bad or irreducible absolute expression"));
4685 exp
->X_add_number
= 0;
4687 return exp
->X_add_number
;
4691 get_absolute_expression (void)
4695 return get_absolute_expr (&exp
);
4698 char /* Return terminator. */
4699 get_absolute_expression_and_terminator (long *val_pointer
/* Return value of expression. */)
4701 /* FIXME: val_pointer should probably be offsetT *. */
4702 *val_pointer
= (long) get_absolute_expression ();
4703 return (*input_line_pointer
++);
4706 /* Like demand_copy_string, but return NULL if the string contains any '\0's.
4707 Give a warning if that happens. */
4710 demand_copy_C_string (int *len_pointer
)
4714 if ((s
= demand_copy_string (len_pointer
)) != 0)
4718 for (len
= *len_pointer
; len
> 0; len
--)
4725 as_bad (_("this string may not contain \'\\0\'"));
4733 /* Demand string, but return a safe (=private) copy of the string.
4734 Return NULL if we can't read a string here. */
4737 demand_copy_string (int *lenP
)
4739 register unsigned int c
;
4745 if (*input_line_pointer
== '\"')
4747 input_line_pointer
++; /* Skip opening quote. */
4749 while (is_a_char (c
= next_char_of_string ()))
4751 obstack_1grow (¬es
, c
);
4754 /* JF this next line is so demand_copy_C_string will return a
4755 null terminated string. */
4756 obstack_1grow (¬es
, '\0');
4757 retval
= obstack_finish (¬es
);
4761 as_bad (_("missing string"));
4763 ignore_rest_of_line ();
4769 /* In: Input_line_pointer->next character.
4771 Do: Skip input_line_pointer over all whitespace.
4773 Out: 1 if input_line_pointer->end-of-line. */
4776 is_it_end_of_statement (void)
4779 return (is_end_of_line
[(unsigned char) *input_line_pointer
]);
4783 equals (char *sym_name
, int reassign
)
4785 register symbolS
*symbolP
; /* Symbol we are working with. */
4789 input_line_pointer
++;
4790 if (*input_line_pointer
== '=')
4791 input_line_pointer
++;
4793 while (*input_line_pointer
== ' ' || *input_line_pointer
== '\t')
4794 input_line_pointer
++;
4797 stop
= mri_comment_field (&stopc
);
4799 if (sym_name
[0] == '.' && sym_name
[1] == '\0')
4801 /* Turn '. = mumble' into a .org mumble. */
4802 register segT segment
;
4805 segment
= get_known_segmented_expression (&exp
);
4807 do_org (segment
, &exp
, 0);
4814 symbolP
= symbol_find (sym_name
);
4815 local
= symbolP
== NULL
;
4817 #endif /* OBJ_COFF */
4818 symbolP
= symbol_find_or_make (sym_name
);
4819 /* Permit register names to be redefined. */
4821 && S_IS_DEFINED (symbolP
)
4822 && S_GET_SEGMENT (symbolP
) != reg_section
)
4823 as_bad (_("symbol `%s' is already defined"), S_GET_NAME (symbolP
));
4826 /* "set" symbols are local unless otherwise specified. */
4828 SF_SET_LOCAL (symbolP
);
4829 #endif /* OBJ_COFF */
4831 pseudo_set (symbolP
);
4836 /* Check garbage after the expression. */
4837 demand_empty_rest_of_line ();
4838 mri_comment_end (stop
, stopc
);
4842 /* .incbin -- include a file verbatim at the current location. */
4845 s_incbin (int x ATTRIBUTE_UNUSED
)
4856 #ifdef md_flush_pending_output
4857 md_flush_pending_output ();
4861 filename
= demand_copy_string (& len
);
4862 if (filename
== NULL
)
4867 /* Look for optional skip and count. */
4868 if (* input_line_pointer
== ',')
4870 ++ input_line_pointer
;
4871 skip
= get_absolute_expression ();
4875 if (* input_line_pointer
== ',')
4877 ++ input_line_pointer
;
4879 count
= get_absolute_expression ();
4881 as_warn (_(".incbin count zero, ignoring `%s'"), filename
);
4887 demand_empty_rest_of_line ();
4889 /* Try opening absolute path first, then try include dirs. */
4890 binfile
= fopen (filename
, FOPEN_RB
);
4891 if (binfile
== NULL
)
4895 path
= xmalloc ((unsigned long) len
+ include_dir_maxlen
+ 5);
4897 for (i
= 0; i
< include_dir_count
; i
++)
4899 sprintf (path
, "%s/%s", include_dirs
[i
], filename
);
4901 binfile
= fopen (path
, FOPEN_RB
);
4902 if (binfile
!= NULL
)
4906 if (binfile
== NULL
)
4907 as_bad (_("file not found: %s"), filename
);
4910 path
= xstrdup (filename
);
4916 register_dependency (path
);
4918 /* Compute the length of the file. */
4919 if (fseek (binfile
, 0, SEEK_END
) != 0)
4921 as_bad (_("seek to end of .incbin file failed `%s'"), path
);
4924 file_len
= ftell (binfile
);
4926 /* If a count was not specified use the size of the file. */
4930 if (skip
+ count
> file_len
)
4932 as_bad (_("skip (%ld) + count (%ld) larger than file size (%ld)"),
4933 skip
, count
, file_len
);
4937 if (fseek (binfile
, skip
, SEEK_SET
) != 0)
4939 as_bad (_("could not skip to %ld in file `%s'"), skip
, path
);
4943 /* Allocate frag space and store file contents in it. */
4944 binfrag
= frag_more (count
);
4946 bytes
= fread (binfrag
, 1, count
, binfile
);
4948 as_warn (_("truncated file `%s', %ld of %ld bytes read"),
4949 path
, bytes
, count
);
4952 if (binfile
!= NULL
)
4958 /* .include -- include a file at this point. */
4961 s_include (int arg ATTRIBUTE_UNUSED
)
4970 filename
= demand_copy_string (&i
);
4971 if (filename
== NULL
)
4973 /* demand_copy_string has already printed an error and
4974 called ignore_rest_of_line. */
4982 while (!is_end_of_line
[(unsigned char) *input_line_pointer
]
4983 && *input_line_pointer
!= ' '
4984 && *input_line_pointer
!= '\t')
4986 obstack_1grow (¬es
, *input_line_pointer
);
4987 ++input_line_pointer
;
4991 obstack_1grow (¬es
, '\0');
4992 filename
= obstack_finish (¬es
);
4993 while (!is_end_of_line
[(unsigned char) *input_line_pointer
])
4994 ++input_line_pointer
;
4997 demand_empty_rest_of_line ();
4998 path
= xmalloc ((unsigned long) i
+ include_dir_maxlen
+ 5 /* slop */ );
5000 for (i
= 0; i
< include_dir_count
; i
++)
5002 strcpy (path
, include_dirs
[i
]);
5004 strcat (path
, filename
);
5005 if (0 != (try = fopen (path
, FOPEN_RT
)))
5015 /* malloc Storage leak when file is found on path. FIXME-SOMEDAY. */
5016 register_dependency (path
);
5017 input_scrub_insert_file (path
);
5021 add_include_dir (char *path
)
5025 if (include_dir_count
== 0)
5027 include_dirs
= (char **) xmalloc (2 * sizeof (*include_dirs
));
5028 include_dirs
[0] = "."; /* Current dir. */
5029 include_dir_count
= 2;
5033 include_dir_count
++;
5035 (char **) realloc (include_dirs
,
5036 include_dir_count
* sizeof (*include_dirs
));
5039 include_dirs
[include_dir_count
- 1] = path
; /* New one. */
5042 if (i
> include_dir_maxlen
)
5043 include_dir_maxlen
= i
;
5046 /* Output debugging information to denote the source file. */
5049 generate_file_debug (void)
5051 if (debug_type
== DEBUG_STABS
)
5052 stabs_generate_asm_file ();
5055 /* Output line number debugging information for the current source line. */
5058 generate_lineno_debug (void)
5062 case DEBUG_UNSPECIFIED
:
5067 stabs_generate_asm_lineno ();
5070 ecoff_generate_asm_lineno ();
5073 /* ??? We could here indicate to dwarf2dbg.c that something
5074 has changed. However, since there is additional backend
5075 support that is required (calling dwarf2_emit_insn), we
5076 let dwarf2dbg.c call as_where on its own. */
5081 /* Output debugging information to mark a function entry point or end point.
5082 END_P is zero for .func, and non-zero for .endfunc. */
5087 do_s_func (end_p
, NULL
);
5090 /* Subroutine of s_func so targets can choose a different default prefix.
5091 If DEFAULT_PREFIX is NULL, use the target's "leading char". */
5094 do_s_func (int end_p
, const char *default_prefix
)
5096 /* Record the current function so that we can issue an error message for
5097 misplaced .func,.endfunc, and also so that .endfunc needs no
5099 static char *current_name
;
5100 static char *current_label
;
5104 if (current_name
== NULL
)
5106 as_bad (_("missing .func"));
5107 ignore_rest_of_line ();
5111 if (debug_type
== DEBUG_STABS
)
5112 stabs_generate_asm_endfunc (current_name
, current_label
);
5114 current_name
= current_label
= NULL
;
5119 char delim1
, delim2
;
5121 if (current_name
!= NULL
)
5123 as_bad (_(".endfunc missing for previous .func"));
5124 ignore_rest_of_line ();
5128 name
= input_line_pointer
;
5129 delim1
= get_symbol_end ();
5130 name
= xstrdup (name
);
5131 *input_line_pointer
= delim1
;
5133 if (*input_line_pointer
!= ',')
5136 asprintf (&label
, "%s%s", default_prefix
, name
);
5139 char leading_char
= 0;
5140 #ifdef BFD_ASSEMBLER
5141 leading_char
= bfd_get_symbol_leading_char (stdoutput
);
5143 /* Missing entry point, use function's name with the leading
5146 asprintf (&label
, "%c%s", leading_char
, name
);
5153 ++input_line_pointer
;
5155 label
= input_line_pointer
;
5156 delim2
= get_symbol_end ();
5157 label
= xstrdup (label
);
5158 *input_line_pointer
= delim2
;
5161 if (debug_type
== DEBUG_STABS
)
5162 stabs_generate_asm_func (name
, label
);
5164 current_name
= name
;
5165 current_label
= label
;
5168 demand_empty_rest_of_line ();
5172 s_ignore (int arg ATTRIBUTE_UNUSED
)
5174 while (!is_end_of_line
[(unsigned char) *input_line_pointer
])
5176 ++input_line_pointer
;
5178 ++input_line_pointer
;
5182 read_print_statistics (FILE *file
)
5184 hash_print_statistics (file
, "pseudo-op table", po_hash
);
5187 /* Inserts the given line into the input stream.
5189 This call avoids macro/conditionals nesting checking, since the contents of
5190 the line are assumed to replace the contents of a line already scanned.
5192 An appropriate use of this function would be substitution of input lines when
5193 called by md_start_line_hook(). The given line is assumed to already be
5194 properly scrubbed. */
5197 input_scrub_insert_line (const char *line
)
5201 sb_add_string (&newline
, line
);
5202 input_scrub_include_sb (&newline
, input_line_pointer
, 0);
5204 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
5207 /* Insert a file into the input stream; the path must resolve to an actual
5208 file; no include path searching or dependency registering is performed. */
5211 input_scrub_insert_file (char *path
)
5213 input_scrub_include_file (path
, input_line_pointer
);
5214 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);