1 /* read.c - read a source file -
2 Copyright (C) 1986, 87, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
3 2000 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
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 spagetti in memory.
36 Another group of these functions is in the expr.c module. */
49 #ifndef TC_START_LABEL
50 #define TC_START_LABEL(x,y) (x==':')
53 /* Set by the object-format or the target. */
54 #ifndef TC_IMPLICIT_LCOMM_ALIGNMENT
55 #define TC_IMPLICIT_LCOMM_ALIGNMENT(SIZE, P2VAR) \
60 else if ((SIZE) >= 4) \
62 else if ((SIZE) >= 2) \
70 /* The NOP_OPCODE is for the alignment fill value.
71 Fill it a nop instruction so that the disassembler does not choke
74 #define NOP_OPCODE 0x00
77 char *input_line_pointer
; /*->next char of source file to parse. */
79 #if BITS_PER_CHAR != 8
80 /* The following table is indexed by[(char)] and will break if
81 a char does not have exactly 256 states (hopefully 0:255!)! */
86 /* The m88k unfortunately uses @ as a label beginner. */
91 /* The RS/6000 assembler uses {,},[,] as parts of symbol names. */
96 /* The Delta 68k assembler permits % inside label names. */
101 /* The PowerPC Windows NT assemblers permits ? inside label names. */
106 /* The IA-64 assembler uses # as a suffix designating a symbol. We include
107 it in the symbol and strip it out in tc_canonicalize_symbol_name. */
112 /* The a29k assembler does not permits labels to start with $. */
117 /* The Delta 68k assembler permits ~ at start of label names. */
121 /* Used by is_... macros. our ctype[]. */
122 char lex_type
[256] = {
123 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* @ABCDEFGHIJKLMNO */
124 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ[\]^_ */
125 0, 0, 0, LEX_HASH
, LEX_DOLLAR
, LEX_PCT
, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* _!"#$%&'()*+,-./ */
126 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, LEX_QM
, /* 0123456789:;<=>? */
127 LEX_AT
, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* @ABCDEFGHIJKLMNO */
128 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR
, 0, LEX_BR
, 0, 3, /* PQRSTUVWXYZ[\]^_ */
129 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* `abcdefghijklmno */
130 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR
, 0, LEX_BR
, LEX_TILDE
, 0, /* pqrstuvwxyz{|}~. */
131 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
132 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
133 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
134 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
135 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
136 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
137 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
138 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
142 Out: 1 if this character ends a line. */
143 char is_end_of_line
[256] = {
145 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, /* @abcdefghijklmno */
147 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, /* @abcdefghijklmno */
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, /* 0123456789:;<=>? */
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, /* */
156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
157 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
158 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
159 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
160 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
161 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
162 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
163 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* */
166 #ifdef IGNORE_OPCODE_CASE
167 char original_case_string
[128];
170 /* Functions private to this file. */
172 static char *buffer
; /* 1st char of each buffer of lines is here. */
173 static char *buffer_limit
; /*->1 + last char in buffer. */
175 /* TARGET_BYTES_BIG_ENDIAN is required to be defined to either 0 or 1
176 in the tc-<CPU>.h file. See the "Porting GAS" section of the
178 int target_big_endian
= TARGET_BYTES_BIG_ENDIAN
;
180 static char *old_buffer
; /* JF a hack. */
181 static char *old_input
;
182 static char *old_limit
;
184 /* Variables for handling include file directory table. */
186 /* Table of pointers to directories to search for .include's. */
189 /* How many are in the table. */
190 int include_dir_count
;
192 /* Length of longest in table. */
193 int include_dir_maxlen
= 1;
195 #ifndef WORKING_DOT_WORD
196 struct broken_word
*broken_words
;
197 int new_broken_words
;
200 /* The current offset into the absolute section. We don't try to
201 build frags in the absolute section, since no data can be stored
202 there. We just keep track of the current offset. */
203 addressT abs_section_offset
;
205 /* If this line had an MRI style label, it is stored in this variable.
206 This is used by some of the MRI pseudo-ops. */
209 /* This global variable is used to support MRI common sections. We
210 translate such sections into a common symbol. This variable is
211 non-NULL when we are in an MRI common section. */
212 symbolS
*mri_common_symbol
;
214 /* In MRI mode, after a dc.b pseudo-op with an odd number of bytes, we
215 need to align to an even byte boundary unless the next pseudo-op is
216 dc.b, ds.b, or dcb.b. This variable is set to 1 if an alignment
218 static int mri_pending_align
;
222 /* This variable is set to be non-zero if the next string we see might
223 be the name of the source file in DWARF debugging information. See
224 the comment in emit_expr for the format we look for. */
225 static int dwarf_file_string
;
229 static void cons_worker
PARAMS ((int, int));
230 static int scrub_from_string
PARAMS ((char *, int));
231 static void do_align
PARAMS ((int, char *, int, int));
232 static void s_align
PARAMS ((int, int));
233 static void s_lcomm_internal
PARAMS ((int, int));
234 static int hex_float
PARAMS ((int, char *));
235 static inline int sizeof_sleb128
PARAMS ((offsetT
));
236 static inline int sizeof_uleb128
PARAMS ((valueT
));
237 static inline int output_sleb128
PARAMS ((char *, offsetT
));
238 static inline int output_uleb128
PARAMS ((char *, valueT
));
239 static inline int output_big_sleb128
PARAMS ((char *, LITTLENUM_TYPE
*, int));
240 static inline int output_big_uleb128
PARAMS ((char *, LITTLENUM_TYPE
*, int));
241 static int output_big_leb128
PARAMS ((char *, LITTLENUM_TYPE
*, int, int));
242 static void do_org
PARAMS ((segT
, expressionS
*, int));
243 char *demand_copy_string
PARAMS ((int *lenP
));
244 static segT get_segmented_expression
PARAMS ((expressionS
*expP
));
245 static segT get_known_segmented_expression
PARAMS ((expressionS
* expP
));
246 static void pobegin
PARAMS ((void));
247 static int get_line_sb
PARAMS ((sb
*));
248 static void generate_file_debug
PARAMS ((void));
256 obj_read_begin_hook ();
258 /* Something close -- but not too close -- to a multiple of 1024.
259 The debugging malloc I'm using has 24 bytes of overhead. */
260 obstack_begin (¬es
, chunksize
);
261 obstack_begin (&cond_obstack
, chunksize
);
263 /* Use machine dependent syntax. */
264 for (p
= line_separator_chars
; *p
; p
++)
265 is_end_of_line
[(unsigned char) *p
] = 1;
266 /* Use more. FIXME-SOMEDAY. */
272 /* Set up pseudo-op tables. */
274 static struct hash_control
*po_hash
;
276 static const pseudo_typeS potable
[] = {
277 {"abort", s_abort
, 0},
278 {"align", s_align_ptwo
, 0},
279 {"ascii", stringer
, 0},
280 {"asciz", stringer
, 1},
281 {"balign", s_align_bytes
, 0},
282 {"balignw", s_align_bytes
, -2},
283 {"balignl", s_align_bytes
, -4},
287 {"common", s_mri_common
, 0},
288 {"common.s", s_mri_common
, 1},
292 {"dc.d", float_cons
, 'd'},
294 {"dc.s", float_cons
, 'f'},
296 {"dc.x", float_cons
, 'x'},
298 {"dcb.b", s_space
, 1},
299 {"dcb.d", s_float_space
, 'd'},
300 {"dcb.l", s_space
, 4},
301 {"dcb.s", s_float_space
, 'f'},
302 {"dcb.w", s_space
, 2},
303 {"dcb.x", s_float_space
, 'x'},
305 {"ds.b", s_space
, 1},
306 {"ds.d", s_space
, 8},
307 {"ds.l", s_space
, 4},
308 {"ds.p", s_space
, 12},
309 {"ds.s", s_space
, 4},
310 {"ds.w", s_space
, 2},
311 {"ds.x", s_space
, 12},
312 {"debug", s_ignore
, 0},
317 {"double", float_cons
, 'd'},
319 {"eject", listing_eject
, 0}, /* Formfeed listing. */
321 {"elsec", s_else
, 0},
322 {"elseif", s_elseif
, (int) O_ne
},
324 {"endc", s_endif
, 0},
325 {"endfunc", s_func
, 1},
326 {"endif", s_endif
, 0},
331 {"exitm", s_mexit
, 0},
333 {"extern", s_ignore
, 0}, /* We treat all undef as ext. */
334 {"appfile", s_app_file
, 1},
335 {"appline", s_app_line
, 0},
337 {"file", s_app_file
, 0},
339 {"float", float_cons
, 'f'},
340 {"format", s_ignore
, 0},
342 {"global", s_globl
, 0},
343 {"globl", s_globl
, 0},
345 {"if", s_if
, (int) O_ne
},
347 {"ifdef", s_ifdef
, 0},
348 {"ifeq", s_if
, (int) O_eq
},
349 {"ifeqs", s_ifeqs
, 0},
350 {"ifge", s_if
, (int) O_ge
},
351 {"ifgt", s_if
, (int) O_gt
},
352 {"ifle", s_if
, (int) O_le
},
353 {"iflt", s_if
, (int) O_lt
},
355 {"ifndef", s_ifdef
, 1},
356 {"ifne", s_if
, (int) O_ne
},
357 {"ifnes", s_ifeqs
, 1},
358 {"ifnotdef", s_ifdef
, 1},
359 {"include", s_include
, 0},
365 {"lcomm", s_lcomm
, 0},
366 {"lflags", listing_flags
, 0}, /* Listing flags. */
367 {"linkonce", s_linkonce
, 0},
368 {"list", listing_list
, 1}, /* Turn listing on. */
369 {"llen", listing_psize
, 1},
372 {"macro", s_macro
, 0},
373 {"mexit", s_mexit
, 0},
375 {".mri", s_mri
, 0}, /* Special case so .mri works in MRI mode. */
376 {"name", s_ignore
, 0},
377 {"noformat", s_ignore
, 0},
378 {"nolist", listing_list
, 0}, /* Turn listing off. */
379 {"nopage", listing_nopage
, 0},
381 {"offset", s_struct
, 0},
383 {"p2align", s_align_ptwo
, 0},
384 {"p2alignw", s_align_ptwo
, -2},
385 {"p2alignl", s_align_ptwo
, -4},
386 {"page", listing_eject
, 0},
387 {"plen", listing_psize
, 0},
388 {"print", s_print
, 0},
389 {"psize", listing_psize
, 0}, /* Set paper size. */
390 {"purgem", s_purgem
, 0},
395 {"sbttl", listing_title
, 1}, /* Subtitle of listing. */
400 {"single", float_cons
, 'f'},
402 {"space", s_space
, 0},
403 {"skip", s_space
, 0},
404 {"sleb128", s_leb128
, 1},
405 {"spc", s_ignore
, 0},
406 {"stabd", s_stab
, 'd'},
407 {"stabn", s_stab
, 'n'},
408 {"stabs", s_stab
, 's'},
409 {"string", stringer
, 1},
410 {"struct", s_struct
, 0},
414 /* This is for gcc to use. It's only just been added (2/94), so gcc
415 won't be able to use it for a while -- probably a year or more.
416 But once this has been released, check with gcc maintainers
417 before deleting it or even changing the spelling. */
418 {"this_GCC_requires_the_GNU_assembler", s_ignore
, 0},
419 /* If we're folding case -- done for some targets, not necessarily
420 all -- the above string in an input file will be converted to
421 this one. Match it either way... */
422 {"this_gcc_requires_the_gnu_assembler", s_ignore
, 0},
424 {"title", listing_title
, 0}, /* Listing title. */
425 {"ttl", listing_title
, 0},
427 {"uleb128", s_leb128
, 0},
431 {"xdef", s_globl
, 0},
432 {"xref", s_ignore
, 0},
433 {"xstabs", s_xstab
, 's'},
435 {"zero", s_space
, 0},
436 {NULL
, NULL
, 0} /* End sentinel. */
439 static int pop_override_ok
= 0;
440 static const char *pop_table_name
;
444 const pseudo_typeS
*table
;
447 const pseudo_typeS
*pop
;
448 for (pop
= table
; pop
->poc_name
; pop
++)
450 errtxt
= hash_insert (po_hash
, pop
->poc_name
, (char *) pop
);
451 if (errtxt
&& (!pop_override_ok
|| strcmp (errtxt
, "exists")))
452 as_fatal (_("error constructing %s pseudo-op table: %s"), pop_table_name
,
457 #ifndef md_pop_insert
458 #define md_pop_insert() pop_insert(md_pseudo_table)
461 #ifndef obj_pop_insert
462 #define obj_pop_insert() pop_insert(obj_pseudo_table)
468 po_hash
= hash_new ();
470 /* Do the target-specific pseudo ops. */
471 pop_table_name
= "md";
474 /* Now object specific. Skip any that were in the target table. */
475 pop_table_name
= "obj";
479 /* Now portable ones. Skip any that we've seen already. */
480 pop_table_name
= "standard";
481 pop_insert (potable
);
484 #define HANDLE_CONDITIONAL_ASSEMBLY() \
485 if (ignore_input ()) \
487 while (!is_end_of_line[(unsigned char) *input_line_pointer++]) \
488 if (input_line_pointer == buffer_limit) \
493 /* This function is used when scrubbing the characters between #APP
496 static char *scrub_string
;
497 static char *scrub_string_end
;
500 scrub_from_string (buf
, buflen
)
506 copy
= scrub_string_end
- scrub_string
;
509 memcpy (buf
, scrub_string
, copy
);
510 scrub_string
+= copy
;
514 /* We read the file, putting things into a web that represents what we
515 have been reading. */
517 read_a_source_file (name
)
521 register char *s
; /* String of symbol, '\0' appended. */
529 buffer
= input_scrub_new_file (name
);
532 listing_newline (NULL
);
533 register_dependency (name
);
535 /* Generate debugging information before we've read anything in to denote
536 this file as the "main" source file and not a subordinate one
537 (e.g. N_SO vs N_SOL in stabs). */
538 generate_file_debug ();
540 while ((buffer_limit
= input_scrub_next_buffer (&input_line_pointer
)) != 0)
541 { /* We have another line to parse. */
542 know (buffer_limit
[-1] == '\n'); /* Must have a sentinel. */
543 contin
: /* JF this goto is my fault I admit it.
544 Someone brave please re-write the whole
545 input section here? Pleeze??? */
546 while (input_line_pointer
< buffer_limit
)
548 /* We have more of this buffer to parse. */
550 /* We now have input_line_pointer->1st char of next line.
551 If input_line_pointer [-1] == '\n' then we just
552 scanned another line: so bump line counters. */
553 if (is_end_of_line
[(unsigned char) input_line_pointer
[-1]])
555 #ifdef md_start_line_hook
556 md_start_line_hook ();
558 if (input_line_pointer
[-1] == '\n')
559 bump_line_counters ();
563 if (LABELS_WITHOUT_COLONS
|| flag_m68k_mri
)
565 /* Text at the start of a line must be a label, we
566 run down and stick a colon in. */
567 if (is_name_beginner (*input_line_pointer
))
569 char *line_start
= input_line_pointer
;
574 HANDLE_CONDITIONAL_ASSEMBLY ();
576 c
= get_symbol_end ();
578 /* In MRI mode, the EQU and MACRO pseudoops must
579 be handled specially. */
583 char *rest
= input_line_pointer
+ 1;
587 if (*rest
== ' ' || *rest
== '\t')
589 if ((strncasecmp (rest
, "EQU", 3) == 0
590 || strncasecmp (rest
, "SET", 3) == 0)
591 && (rest
[3] == ' ' || rest
[3] == '\t'))
593 input_line_pointer
= rest
+ 3;
595 strncasecmp (rest
, "SET", 3) == 0);
598 if (strncasecmp (rest
, "MACRO", 5) == 0
601 || is_end_of_line
[(unsigned char) rest
[5]]))
605 /* In MRI mode, we need to handle the MACRO
606 pseudo-op specially: we don't want to put the
607 symbol in the symbol table. */
609 #ifdef TC_START_LABEL_WITHOUT_COLON
610 && TC_START_LABEL_WITHOUT_COLON(c
,
614 line_label
= colon (line_start
);
616 line_label
= symbol_create (line_start
,
621 *input_line_pointer
= c
;
623 input_line_pointer
++;
628 /* We are at the begining of a line, or similar place.
629 We expect a well-formed assembler statement.
630 A "symbol-name:" is a statement.
632 Depending on what compiler is used, the order of these tests
633 may vary to catch most common case 1st.
634 Each test is independent of all other tests at the (top) level.
635 PLEASE make a compiler that doesn't use this assembler.
636 It is crufty to waste a compiler's time encoding things for this
637 assembler, which then wastes more time decoding it.
638 (And communicating via (linear) files is silly!
639 If you must pass stuff, please pass a tree!) */
640 if ((c
= *input_line_pointer
++) == '\t'
644 c
= *input_line_pointer
++;
646 know (c
!= ' '); /* No further leading whitespace. */
649 /* If listing is on, and we are expanding a macro, then give
650 the listing code the contents of the expanded line. */
653 if ((listing
& LISTING_MACEXP
) && macro_nest
> 0)
658 /* Find the end of the current expanded macro line. */
659 for (s
= input_line_pointer
- 1; *s
; ++s
)
660 if (is_end_of_line
[(unsigned char) *s
])
663 /* Copy it for safe keeping. Also give an indication of
664 how much macro nesting is involved at this point. */
665 len
= s
- (input_line_pointer
- 1);
666 copy
= (char *) xmalloc (len
+ macro_nest
+ 2);
667 memset (copy
, '>', macro_nest
);
668 copy
[macro_nest
] = ' ';
669 memcpy (copy
+ macro_nest
+ 1, input_line_pointer
- 1, len
);
670 copy
[macro_nest
+ 1 + len
] = '\0';
672 /* Install the line with the listing facility. */
673 listing_newline (copy
);
676 listing_newline (NULL
);
679 /* C is the 1st significant character.
680 Input_line_pointer points after that character. */
681 if (is_name_beginner (c
))
683 /* Want user-defined label or pseudo/opcode. */
684 HANDLE_CONDITIONAL_ASSEMBLY ();
686 s
= --input_line_pointer
;
687 c
= get_symbol_end (); /* name's delimiter. */
689 /* C is character after symbol.
690 That character's place in the input line is now '\0'.
691 S points to the beginning of the symbol.
692 [In case of pseudo-op, s->'.'.]
693 Input_line_pointer->'\0' where c was. */
694 if (TC_START_LABEL (c
, input_line_pointer
))
698 char *rest
= input_line_pointer
+ 1;
700 /* In MRI mode, \tsym: set 0 is permitted. */
704 if (*rest
== ' ' || *rest
== '\t')
707 if ((strncasecmp (rest
, "EQU", 3) == 0
708 || strncasecmp (rest
, "SET", 3) == 0)
709 && (rest
[3] == ' ' || rest
[3] == '\t'))
711 input_line_pointer
= rest
+ 3;
717 line_label
= colon (s
); /* User-defined label. */
718 /* Put ':' back for error messages' sake. */
719 *input_line_pointer
++ = ':';
720 /* Input_line_pointer->after ':'. */
724 || ((c
== ' ' || c
== '\t')
725 && input_line_pointer
[1] == '='
726 #ifdef TC_EQUAL_IN_INSN
727 && !TC_EQUAL_IN_INSN (c
, input_line_pointer
)
732 demand_empty_rest_of_line ();
736 /* Expect pseudo-op or machine instruction. */
739 #ifdef IGNORE_OPCODE_CASE
743 strncpy (original_case_string
, s2
, sizeof (original_case_string
));
744 original_case_string
[sizeof (original_case_string
) - 1] = 0;
748 if (isupper ((unsigned char) *s2
))
754 if (NO_PSEUDO_DOT
|| flag_m68k_mri
)
756 /* The MRI assembler and the m88k use pseudo-ops
758 pop
= (pseudo_typeS
*) hash_find (po_hash
, s
);
759 if (pop
!= NULL
&& pop
->poc_handler
== NULL
)
764 || (!flag_m68k_mri
&& *s
== '.'))
768 WARNING: c has next char, which may be end-of-line.
769 We lookup the pseudo-op table with s+1 because we
770 already know that the pseudo-op begins with a '.'. */
773 pop
= (pseudo_typeS
*) hash_find (po_hash
, s
+ 1);
775 /* In MRI mode, we may need to insert an
776 automatic alignment directive. What a hack
778 if (mri_pending_align
780 || !((pop
->poc_handler
== cons
781 && pop
->poc_val
== 1)
782 || (pop
->poc_handler
== s_space
783 && pop
->poc_val
== 1)
784 #ifdef tc_conditional_pseudoop
785 || tc_conditional_pseudoop (pop
)
787 || pop
->poc_handler
== s_if
788 || pop
->poc_handler
== s_ifdef
789 || pop
->poc_handler
== s_ifc
790 || pop
->poc_handler
== s_ifeqs
791 || pop
->poc_handler
== s_else
792 || pop
->poc_handler
== s_endif
793 || pop
->poc_handler
== s_globl
794 || pop
->poc_handler
== s_ignore
)))
796 do_align (1, (char *) NULL
, 0, 0);
797 mri_pending_align
= 0;
799 if (line_label
!= NULL
)
801 symbol_set_frag (line_label
, frag_now
);
802 S_SET_VALUE (line_label
, frag_now_fix ());
806 /* Print the error msg now, while we still can. */
809 as_bad (_("Unknown pseudo-op: `%s'"), s
);
810 *input_line_pointer
= c
;
815 /* Put it back for error messages etc. */
816 *input_line_pointer
= c
;
817 /* The following skip of whitespace is compulsory.
818 A well shaped space is sometimes all that separates
819 keyword from operands. */
820 if (c
== ' ' || c
== '\t')
821 input_line_pointer
++;
823 /* Input_line is restored.
824 Input_line_pointer->1st non-blank char
825 after pseudo-operation. */
826 (*pop
->poc_handler
) (pop
->poc_val
);
828 /* If that was .end, just get out now. */
829 if (pop
->poc_handler
== s_end
)
835 #ifdef QUOTES_IN_INSN
839 /* WARNING: c has char, which may be end-of-line. */
840 /* Also: input_line_pointer->`\0` where c was. */
841 *input_line_pointer
= c
;
842 while (!is_end_of_line
[(unsigned char) *input_line_pointer
]
844 #ifdef TC_EOL_IN_INSN
845 || TC_EOL_IN_INSN (input_line_pointer
)
849 if (flag_m68k_mri
&& *input_line_pointer
== '\'')
851 #ifdef QUOTES_IN_INSN
854 else if (*input_line_pointer
== '"')
856 else if (*input_line_pointer
== '\\')
859 input_line_pointer
++;
862 c
= *input_line_pointer
;
863 *input_line_pointer
= '\0';
865 generate_lineno_debug ();
873 if (check_macro (s
, &out
, '\0', &err
, ¯o
))
877 *input_line_pointer
++ = c
;
878 input_scrub_include_sb (&out
,
879 input_line_pointer
, 1);
882 input_scrub_next_buffer (&input_line_pointer
);
884 md_macro_info (macro
);
890 if (mri_pending_align
)
892 do_align (1, (char *) NULL
, 0, 0);
893 mri_pending_align
= 0;
894 if (line_label
!= NULL
)
896 symbol_set_frag (line_label
, frag_now
);
897 S_SET_VALUE (line_label
, frag_now_fix ());
901 md_assemble (s
); /* Assemble 1 instruction. */
903 *input_line_pointer
++ = c
;
905 /* We resume loop AFTER the end-of-line from
912 /* Empty statement? */
913 if (is_end_of_line
[(unsigned char) c
])
916 if ((LOCAL_LABELS_DOLLAR
|| LOCAL_LABELS_FB
)
917 && isdigit ((unsigned char) c
))
919 /* local label ("4:") */
920 char *backup
= input_line_pointer
;
922 HANDLE_CONDITIONAL_ASSEMBLY ();
926 /* Read the whole number. */
927 while (isdigit ((unsigned char) *input_line_pointer
))
929 temp
= (temp
* 10) + *input_line_pointer
- '0';
930 ++input_line_pointer
;
933 if (LOCAL_LABELS_DOLLAR
934 && *input_line_pointer
== '$'
935 && *(input_line_pointer
+ 1) == ':')
937 input_line_pointer
+= 2;
939 if (dollar_label_defined (temp
))
941 as_fatal (_("label \"%d$\" redefined"), temp
);
944 define_dollar_label (temp
);
945 colon (dollar_label_name (temp
, 0));
950 && *input_line_pointer
++ == ':')
952 fb_label_instance_inc (temp
);
953 colon (fb_label_name (temp
, 0));
957 input_line_pointer
= backup
;
958 } /* local label ("4:") */
960 if (c
&& strchr (line_comment_chars
, c
))
961 { /* Its a comment. Better say APP or NO_APP. */
965 unsigned int new_length
;
968 bump_line_counters ();
969 s
= input_line_pointer
;
970 if (strncmp (s
, "APP\n", 4))
971 continue; /* We ignore it */
974 ends
= strstr (s
, "#NO_APP\n");
978 unsigned int tmp_len
;
981 /* The end of the #APP wasn't in this buffer. We
982 keep reading in buffers until we find the #NO_APP
983 that goes with this #APP There is one. The specs
985 tmp_len
= buffer_limit
- s
;
986 tmp_buf
= xmalloc (tmp_len
+ 1);
987 memcpy (tmp_buf
, s
, tmp_len
);
990 new_tmp
= input_scrub_next_buffer (&buffer
);
994 buffer_limit
= new_tmp
;
995 input_line_pointer
= buffer
;
996 ends
= strstr (buffer
, "#NO_APP\n");
1000 num
= buffer_limit
- buffer
;
1002 tmp_buf
= xrealloc (tmp_buf
, tmp_len
+ num
);
1003 memcpy (tmp_buf
+ tmp_len
, buffer
, num
);
1008 input_line_pointer
= ends
? ends
+ 8 : NULL
;
1016 input_line_pointer
= ends
+ 8;
1020 scrub_string_end
= ends
;
1022 new_length
= ends
- s
;
1023 new_buf
= (char *) xmalloc (new_length
);
1030 space
= (new_buf
+ new_length
) - new_tmp
;
1031 size
= do_scrub_chars (scrub_from_string
, new_tmp
, space
);
1039 new_buf
= xrealloc (new_buf
, new_length
+ 100);
1040 new_tmp
= new_buf
+ new_length
;
1046 old_buffer
= buffer
;
1047 old_input
= input_line_pointer
;
1048 old_limit
= buffer_limit
;
1050 input_line_pointer
= new_buf
;
1051 buffer_limit
= new_tmp
;
1056 HANDLE_CONDITIONAL_ASSEMBLY ();
1058 #ifdef tc_unrecognized_line
1059 if (tc_unrecognized_line (c
))
1062 /* as_warn (_("Junk character %d."),c); Now done by ignore_rest. */
1063 input_line_pointer
--; /* Report unknown char as ignored. */
1064 ignore_rest_of_line ();
1067 #ifdef md_after_pass_hook
1068 md_after_pass_hook ();
1074 bump_line_counters ();
1077 buffer
= old_buffer
;
1078 input_line_pointer
= old_input
;
1079 buffer_limit
= old_limit
;
1091 /* Close the input file. */
1092 input_scrub_close ();
1093 #ifdef WARN_COMMENTS
1095 if (warn_comment
&& found_comment
)
1096 as_warn_where (found_comment_file
, found_comment
,
1097 "first comment found here");
1102 /* For most MRI pseudo-ops, the line actually ends at the first
1103 nonquoted space. This function looks for that point, stuffs a null
1104 in, and sets *STOPCP to the character that used to be there, and
1105 returns the location.
1107 Until I hear otherwise, I am going to assume that this is only true
1108 for the m68k MRI assembler. */
1111 mri_comment_field (stopcp
)
1118 know (flag_m68k_mri
);
1120 for (s
= input_line_pointer
;
1121 ((!is_end_of_line
[(unsigned char) *s
] && *s
!= ' ' && *s
!= '\t')
1129 for (s
= input_line_pointer
;
1130 !is_end_of_line
[(unsigned char) *s
];
1140 /* Skip to the end of an MRI comment field. */
1143 mri_comment_end (stop
, stopc
)
1149 input_line_pointer
= stop
;
1151 while (!is_end_of_line
[(unsigned char) *input_line_pointer
])
1152 ++input_line_pointer
;
1157 int ignore ATTRIBUTE_UNUSED
;
1159 as_fatal (_(".abort detected. Abandoning ship."));
1162 /* Guts of .align directive. N is the power of two to which to align.
1163 FILL may be NULL, or it may point to the bytes of the fill pattern.
1164 LEN is the length of whatever FILL points to, if anything. MAX is
1165 the maximum number of characters to skip when doing the alignment,
1166 or 0 if there is no maximum. */
1169 do_align (n
, fill
, len
, max
)
1178 md_do_align (n
, fill
, len
, max
, just_record_alignment
);
1183 if (subseg_text_p (now_seg
))
1184 default_fill
= NOP_OPCODE
;
1187 fill
= &default_fill
;
1191 /* Only make a frag if we HAVE to... */
1192 if (n
!= 0 && !need_pass_2
)
1195 frag_align (n
, *fill
, max
);
1197 frag_align_pattern (n
, fill
, len
, max
);
1201 just_record_alignment
:
1204 record_alignment (now_seg
, n
- OCTETS_PER_BYTE_POWER
);
1207 /* Handle the .align pseudo-op. A positive ARG is a default alignment
1208 (in bytes). A negative ARG is the negative of the length of the
1209 fill pattern. BYTES_P is non-zero if the alignment value should be
1210 interpreted as the byte boundary, rather than the power of 2. */
1213 s_align (arg
, bytes_p
)
1217 register unsigned int align
;
1225 stop
= mri_comment_field (&stopc
);
1227 if (is_end_of_line
[(unsigned char) *input_line_pointer
])
1232 align
= arg
; /* Default value from pseudo-op table. */
1236 align
= get_absolute_expression ();
1242 /* Convert to a power of 2. */
1247 for (i
= 0; (align
& 1) == 0; align
>>= 1, ++i
)
1250 as_bad (_("Alignment not a power of 2"));
1259 as_bad (_("Alignment too large: %u assumed"), align
);
1262 if (*input_line_pointer
!= ',')
1269 ++input_line_pointer
;
1270 if (*input_line_pointer
== ',')
1274 fill
= get_absolute_expression ();
1279 if (*input_line_pointer
!= ',')
1283 ++input_line_pointer
;
1284 max
= get_absolute_expression ();
1291 as_warn (_("expected fill pattern missing"));
1292 do_align (align
, (char *) NULL
, 0, max
);
1307 do_align (align
, &fill_char
, fill_len
, max
);
1313 if ((size_t) fill_len
> sizeof ab
)
1315 md_number_to_chars (ab
, fill
, fill_len
);
1316 do_align (align
, ab
, fill_len
, max
);
1320 demand_empty_rest_of_line ();
1323 mri_comment_end (stop
, stopc
);
1326 /* Handle the .align pseudo-op on machines where ".align 4" means
1327 align to a 4 byte boundary. */
1336 /* Handle the .align pseudo-op on machines where ".align 4" means align
1337 to a 2**4 boundary. */
1348 int ignore ATTRIBUTE_UNUSED
;
1350 register char *name
;
1354 register symbolS
*symbolP
;
1359 stop
= mri_comment_field (&stopc
);
1361 name
= input_line_pointer
;
1362 c
= get_symbol_end ();
1363 /* Just after name is now '\0'. */
1364 p
= input_line_pointer
;
1368 if (*input_line_pointer
!= ',')
1370 as_bad (_("Expected comma after symbol-name: rest of line ignored."));
1371 ignore_rest_of_line ();
1373 mri_comment_end (stop
, stopc
);
1377 input_line_pointer
++; /* skip ',' */
1379 if ((temp
= get_absolute_expression ()) < 0)
1381 as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) temp
);
1382 ignore_rest_of_line ();
1384 mri_comment_end (stop
, stopc
);
1389 symbolP
= symbol_find_or_make (name
);
1392 if (S_IS_DEFINED (symbolP
) && !S_IS_COMMON (symbolP
))
1394 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
1395 S_GET_NAME (symbolP
));
1396 ignore_rest_of_line ();
1398 mri_comment_end (stop
, stopc
);
1402 if (S_GET_VALUE (symbolP
))
1404 if (S_GET_VALUE (symbolP
) != (valueT
) temp
)
1405 as_bad (_("Length of .comm \"%s\" is already %ld. Not changed to %ld."),
1406 S_GET_NAME (symbolP
),
1407 (long) S_GET_VALUE (symbolP
),
1412 S_SET_VALUE (symbolP
, (valueT
) temp
);
1413 S_SET_EXTERNAL (symbolP
);
1417 extern int flag_one
;
1418 if (!temp
|| !flag_one
)
1419 S_GET_OTHER(symbolP
) = const_flag
;
1421 #endif /* not OBJ_VMS */
1422 know (symbolP
->sy_frag
== &zero_address_frag
);
1424 demand_empty_rest_of_line ();
1427 mri_comment_end (stop
, stopc
);
1430 /* The MRI COMMON pseudo-op. We handle this by creating a common
1431 symbol with the appropriate name. We make s_space do the right
1432 thing by increasing the size. */
1435 s_mri_common (small
)
1436 int small ATTRIBUTE_UNUSED
;
1452 stop
= mri_comment_field (&stopc
);
1456 name
= input_line_pointer
;
1457 if (!isdigit ((unsigned char) *name
))
1458 c
= get_symbol_end ();
1463 ++input_line_pointer
;
1465 while (isdigit ((unsigned char) *input_line_pointer
));
1467 c
= *input_line_pointer
;
1468 *input_line_pointer
= '\0';
1470 if (line_label
!= NULL
)
1472 alc
= (char *) xmalloc (strlen (S_GET_NAME (line_label
))
1473 + (input_line_pointer
- name
)
1475 sprintf (alc
, "%s%s", name
, S_GET_NAME (line_label
));
1480 sym
= symbol_find_or_make (name
);
1481 *input_line_pointer
= c
;
1485 if (*input_line_pointer
!= ',')
1489 ++input_line_pointer
;
1490 align
= get_absolute_expression ();
1493 if (S_IS_DEFINED (sym
) && !S_IS_COMMON (sym
))
1495 as_bad (_("attempt to re-define symbol `%s'"), S_GET_NAME (sym
));
1496 ignore_rest_of_line ();
1497 mri_comment_end (stop
, stopc
);
1501 S_SET_EXTERNAL (sym
);
1502 mri_common_symbol
= sym
;
1506 S_SET_ALIGN (sym
, align
);
1509 if (line_label
!= NULL
)
1512 exp
.X_op
= O_symbol
;
1513 exp
.X_add_symbol
= sym
;
1514 exp
.X_add_number
= 0;
1515 symbol_set_value_expression (line_label
, &exp
);
1516 symbol_set_frag (line_label
, &zero_address_frag
);
1517 S_SET_SEGMENT (line_label
, expr_section
);
1520 /* FIXME: We just ignore the small argument, which distinguishes
1521 COMMON and COMMON.S. I don't know what we can do about it. */
1523 /* Ignore the type and hptype. */
1524 if (*input_line_pointer
== ',')
1525 input_line_pointer
+= 2;
1526 if (*input_line_pointer
== ',')
1527 input_line_pointer
+= 2;
1529 demand_empty_rest_of_line ();
1531 mri_comment_end (stop
, stopc
);
1536 int ignore ATTRIBUTE_UNUSED
;
1541 temp
= get_absolute_expression ();
1542 if (flag_readonly_data_in_text
)
1544 section
= text_section
;
1548 section
= data_section
;
1550 subseg_set (section
, (subsegT
) temp
);
1555 demand_empty_rest_of_line ();
1558 /* Handle the .appfile pseudo-op. This is automatically generated by
1559 do_scrub_chars when a preprocessor # line comment is seen with a
1560 file name. This default definition may be overridden by the object
1561 or CPU specific pseudo-ops. This function is also the default
1562 definition for .file; the APPFILE argument is 1 for .appfile, 0 for
1566 s_app_file (appfile
)
1572 /* Some assemblers tolerate immediately following '"'. */
1573 if ((s
= demand_copy_string (&length
)) != 0)
1575 /* If this is a fake .appfile, a fake newline was inserted into
1576 the buffer. Passing -2 to new_logical_line tells it to
1579 = (!new_logical_line (s
, appfile
? -2 : -1) && appfile
);
1581 /* In MRI mode, the preprocessor may have inserted an extraneous
1584 && *input_line_pointer
== '\''
1585 && is_end_of_line
[(unsigned char) input_line_pointer
[1]])
1586 ++input_line_pointer
;
1588 demand_empty_rest_of_line ();
1593 listing_source_file (s
);
1595 register_dependency (s
);
1603 /* Handle the .appline pseudo-op. This is automatically generated by
1604 do_scrub_chars when a preprocessor # line comment is seen. This
1605 default definition may be overridden by the object or CPU specific
1610 int ignore ATTRIBUTE_UNUSED
;
1614 /* The given number is that of the next line. */
1615 l
= get_absolute_expression () - 1;
1617 /* Some of the back ends can't deal with non-positive line numbers.
1618 Besides, it's silly. */
1619 as_warn (_("Line numbers must be positive; line number %d rejected."),
1623 new_logical_line ((char *) NULL
, l
);
1626 listing_source_line (l
);
1629 demand_empty_rest_of_line ();
1632 /* Handle the .end pseudo-op. Actually, the real work is done in
1633 read_a_source_file. */
1637 int ignore ATTRIBUTE_UNUSED
;
1641 /* The MRI assembler permits the start symbol to follow .end,
1642 but we don't support that. */
1644 if (!is_end_of_line
[(unsigned char) *input_line_pointer
]
1645 && *input_line_pointer
!= '*'
1646 && *input_line_pointer
!= '!')
1647 as_warn (_("start address not supported"));
1651 /* Handle the .err pseudo-op. */
1655 int ignore ATTRIBUTE_UNUSED
;
1657 as_bad (_(".err encountered"));
1658 demand_empty_rest_of_line ();
1661 /* Handle the MRI fail pseudo-op. */
1665 int ignore ATTRIBUTE_UNUSED
;
1672 stop
= mri_comment_field (&stopc
);
1674 temp
= get_absolute_expression ();
1676 as_warn (_(".fail %ld encountered"), (long) temp
);
1678 as_bad (_(".fail %ld encountered"), (long) temp
);
1680 demand_empty_rest_of_line ();
1683 mri_comment_end (stop
, stopc
);
1688 int ignore ATTRIBUTE_UNUSED
;
1690 expressionS rep_exp
;
1692 register long fill
= 0;
1695 #ifdef md_flush_pending_output
1696 md_flush_pending_output ();
1699 get_known_segmented_expression (&rep_exp
);
1700 if (*input_line_pointer
== ',')
1702 input_line_pointer
++;
1703 size
= get_absolute_expression ();
1704 if (*input_line_pointer
== ',')
1706 input_line_pointer
++;
1707 fill
= get_absolute_expression ();
1711 /* This is to be compatible with BSD 4.2 AS, not for any rational reason. */
1712 #define BSD_FILL_SIZE_CROCK_8 (8)
1713 if (size
> BSD_FILL_SIZE_CROCK_8
)
1715 as_warn (_(".fill size clamped to %d."), BSD_FILL_SIZE_CROCK_8
);
1716 size
= BSD_FILL_SIZE_CROCK_8
;
1720 as_warn (_("Size negative: .fill ignored."));
1723 else if (rep_exp
.X_op
== O_constant
&& rep_exp
.X_add_number
<= 0)
1725 if (rep_exp
.X_add_number
< 0)
1726 as_warn (_("Repeat < 0, .fill ignored"));
1730 if (size
&& !need_pass_2
)
1732 if (rep_exp
.X_op
== O_constant
)
1734 p
= frag_var (rs_fill
, (int) size
, (int) size
,
1735 (relax_substateT
) 0, (symbolS
*) 0,
1736 (offsetT
) rep_exp
.X_add_number
,
1741 /* We don't have a constant repeat count, so we can't use
1742 rs_fill. We can get the same results out of rs_space,
1743 but its argument is in bytes, so we must multiply the
1744 repeat count by size. */
1747 rep_sym
= make_expr_symbol (&rep_exp
);
1750 expressionS size_exp
;
1751 size_exp
.X_op
= O_constant
;
1752 size_exp
.X_add_number
= size
;
1754 rep_exp
.X_op
= O_multiply
;
1755 rep_exp
.X_add_symbol
= rep_sym
;
1756 rep_exp
.X_op_symbol
= make_expr_symbol (&size_exp
);
1757 rep_exp
.X_add_number
= 0;
1758 rep_sym
= make_expr_symbol (&rep_exp
);
1761 p
= frag_var (rs_space
, (int) size
, (int) size
,
1762 (relax_substateT
) 0, rep_sym
, (offsetT
) 0, (char *) 0);
1765 memset (p
, 0, (unsigned int) size
);
1767 /* The magic number BSD_FILL_SIZE_CROCK_4 is from BSD 4.2 VAX
1768 flavoured AS. The following bizzare behaviour is to be
1769 compatible with above. I guess they tried to take up to 8
1770 bytes from a 4-byte expression and they forgot to sign
1771 extend. Un*x Sux. */
1772 #define BSD_FILL_SIZE_CROCK_4 (4)
1773 md_number_to_chars (p
, (valueT
) fill
,
1774 (size
> BSD_FILL_SIZE_CROCK_4
1775 ? BSD_FILL_SIZE_CROCK_4
1777 /* Note: .fill (),0 emits no frag (since we are asked to .fill 0 bytes)
1778 but emits no error message because it seems a legal thing to do.
1779 It is a degenerate case of .fill but could be emitted by a
1782 demand_empty_rest_of_line ();
1787 int ignore ATTRIBUTE_UNUSED
;
1796 stop
= mri_comment_field (&stopc
);
1800 name
= input_line_pointer
;
1801 c
= get_symbol_end ();
1802 symbolP
= symbol_find_or_make (name
);
1803 S_SET_EXTERNAL (symbolP
);
1805 *input_line_pointer
= c
;
1807 c
= *input_line_pointer
;
1810 input_line_pointer
++;
1812 if (*input_line_pointer
== '\n')
1818 demand_empty_rest_of_line ();
1821 mri_comment_end (stop
, stopc
);
1824 /* Handle the MRI IRP and IRPC pseudo-ops. */
1836 as_where (&file
, &line
);
1839 while (!is_end_of_line
[(unsigned char) *input_line_pointer
])
1840 sb_add_char (&s
, *input_line_pointer
++);
1844 err
= expand_irp (irpc
, 0, &s
, &out
, get_line_sb
, '\0');
1846 as_bad_where (file
, line
, "%s", err
);
1850 input_scrub_include_sb (&out
, input_line_pointer
, 1);
1852 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
1855 /* Handle the .linkonce pseudo-op. This tells the assembler to mark
1856 the section to only be linked once. However, this is not supported
1857 by most object file formats. This takes an optional argument,
1858 which is what to do about duplicates. */
1862 int ignore ATTRIBUTE_UNUSED
;
1864 enum linkonce_type type
;
1868 type
= LINKONCE_DISCARD
;
1870 if (!is_end_of_line
[(unsigned char) *input_line_pointer
])
1875 s
= input_line_pointer
;
1876 c
= get_symbol_end ();
1877 if (strcasecmp (s
, "discard") == 0)
1878 type
= LINKONCE_DISCARD
;
1879 else if (strcasecmp (s
, "one_only") == 0)
1880 type
= LINKONCE_ONE_ONLY
;
1881 else if (strcasecmp (s
, "same_size") == 0)
1882 type
= LINKONCE_SAME_SIZE
;
1883 else if (strcasecmp (s
, "same_contents") == 0)
1884 type
= LINKONCE_SAME_CONTENTS
;
1886 as_warn (_("unrecognized .linkonce type `%s'"), s
);
1888 *input_line_pointer
= c
;
1891 #ifdef obj_handle_link_once
1892 obj_handle_link_once (type
);
1893 #else /* ! defined (obj_handle_link_once) */
1894 #ifdef BFD_ASSEMBLER
1898 if ((bfd_applicable_section_flags (stdoutput
) & SEC_LINK_ONCE
) == 0)
1899 as_warn (_(".linkonce is not supported for this object file format"));
1901 flags
= bfd_get_section_flags (stdoutput
, now_seg
);
1902 flags
|= SEC_LINK_ONCE
;
1907 case LINKONCE_DISCARD
:
1908 flags
|= SEC_LINK_DUPLICATES_DISCARD
;
1910 case LINKONCE_ONE_ONLY
:
1911 flags
|= SEC_LINK_DUPLICATES_ONE_ONLY
;
1913 case LINKONCE_SAME_SIZE
:
1914 flags
|= SEC_LINK_DUPLICATES_SAME_SIZE
;
1916 case LINKONCE_SAME_CONTENTS
:
1917 flags
|= SEC_LINK_DUPLICATES_SAME_CONTENTS
;
1920 if (!bfd_set_section_flags (stdoutput
, now_seg
, flags
))
1921 as_bad (_("bfd_set_section_flags: %s"),
1922 bfd_errmsg (bfd_get_error ()));
1924 #else /* ! defined (BFD_ASSEMBLER) */
1925 as_warn (_(".linkonce is not supported for this object file format"));
1926 #endif /* ! defined (BFD_ASSEMBLER) */
1927 #endif /* ! defined (obj_handle_link_once) */
1929 demand_empty_rest_of_line ();
1933 s_lcomm_internal (needs_align
, bytes_p
)
1934 /* 1 if this was a ".bss" directive, which may require a 3rd argument
1935 (alignment); 0 if it was an ".lcomm" (2 args only). */
1937 /* 1 if the alignment value should be interpreted as the byte boundary,
1938 rather than the power of 2. */
1941 register char *name
;
1945 register symbolS
*symbolP
;
1946 segT current_seg
= now_seg
;
1947 subsegT current_subseg
= now_subseg
;
1948 const int max_alignment
= 15;
1950 segT bss_seg
= bss_section
;
1952 name
= input_line_pointer
;
1953 c
= get_symbol_end ();
1954 p
= input_line_pointer
;
1958 /* Accept an optional comma after the name. The comma used to be
1959 required, but Irix 5 cc does not generate it. */
1960 if (*input_line_pointer
== ',')
1962 ++input_line_pointer
;
1966 if (*input_line_pointer
== '\n')
1968 as_bad (_("Missing size expression"));
1972 if ((temp
= get_absolute_expression ()) < 0)
1974 as_warn (_("BSS length (%d.) <0! Ignored."), temp
);
1975 ignore_rest_of_line ();
1979 #if defined (TC_MIPS) || defined (TC_ALPHA)
1980 if (OUTPUT_FLAVOR
== bfd_target_ecoff_flavour
1981 || OUTPUT_FLAVOR
== bfd_target_elf_flavour
)
1983 /* For MIPS and Alpha ECOFF or ELF, small objects are put in .sbss. */
1984 if (temp
<= bfd_get_gp_size (stdoutput
))
1986 bss_seg
= subseg_new (".sbss", 1);
1987 seg_info (bss_seg
)->bss
= 1;
1988 #ifdef BFD_ASSEMBLER
1989 if (!bfd_set_section_flags (stdoutput
, bss_seg
, SEC_ALLOC
))
1990 as_warn (_("error setting flags for \".sbss\": %s"),
1991 bfd_errmsg (bfd_get_error ()));
1999 TC_IMPLICIT_LCOMM_ALIGNMENT (temp
, align
);
2001 /* Still zero unless TC_IMPLICIT_LCOMM_ALIGNMENT set it. */
2003 record_alignment (bss_seg
, align
);
2011 if (*input_line_pointer
!= ',')
2013 as_bad (_("Expected comma after size"));
2014 ignore_rest_of_line ();
2018 input_line_pointer
++;
2021 if (*input_line_pointer
== '\n')
2023 as_bad (_("Missing alignment"));
2027 align
= get_absolute_expression ();
2031 /* Convert to a power of 2. */
2036 for (i
= 0; (align
& 1) == 0; align
>>= 1, ++i
)
2039 as_bad (_("Alignment not a power of 2"));
2044 if (align
> max_alignment
)
2046 align
= max_alignment
;
2047 as_warn (_("Alignment too large: %d. assumed."), align
);
2052 as_warn (_("Alignment negative. 0 assumed."));
2055 record_alignment (bss_seg
, align
);
2059 /* Assume some objects may require alignment on some systems. */
2060 #if defined (TC_ALPHA) && ! defined (VMS)
2063 align
= ffs (temp
) - 1;
2064 if (temp
% (1 << align
))
2071 symbolP
= symbol_find_or_make (name
);
2075 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT) \
2076 || defined (OBJ_BOUT) || defined (OBJ_MAYBE_BOUT))
2077 #ifdef BFD_ASSEMBLER
2078 (OUTPUT_FLAVOR
!= bfd_target_aout_flavour
2079 || (S_GET_OTHER (symbolP
) == 0 && S_GET_DESC (symbolP
) == 0)) &&
2081 (S_GET_OTHER (symbolP
) == 0 && S_GET_DESC (symbolP
) == 0) &&
2084 (S_GET_SEGMENT (symbolP
) == bss_seg
2085 || (!S_IS_DEFINED (symbolP
) && S_GET_VALUE (symbolP
) == 0)))
2089 subseg_set (bss_seg
, 1);
2092 frag_align (align
, 0, 0);
2094 /* Detach from old frag. */
2095 if (S_GET_SEGMENT (symbolP
) == bss_seg
)
2096 symbol_get_frag (symbolP
)->fr_symbol
= NULL
;
2098 symbol_set_frag (symbolP
, frag_now
);
2099 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, symbolP
,
2100 (offsetT
) temp
, (char *) 0);
2103 S_SET_SEGMENT (symbolP
, bss_seg
);
2106 /* The symbol may already have been created with a preceding
2107 ".globl" directive -- be careful not to step on storage class
2108 in that case. Otherwise, set it to static. */
2109 if (S_GET_STORAGE_CLASS (symbolP
) != C_EXT
)
2111 S_SET_STORAGE_CLASS (symbolP
, C_STAT
);
2113 #endif /* OBJ_COFF */
2116 S_SET_SIZE (symbolP
, temp
);
2120 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
2121 S_GET_NAME (symbolP
));
2123 subseg_set (current_seg
, current_subseg
);
2125 demand_empty_rest_of_line ();
2129 s_lcomm (needs_align
)
2132 s_lcomm_internal (needs_align
, 0);
2136 s_lcomm_bytes (needs_align
)
2139 s_lcomm_internal (needs_align
, 1);
2144 int ignore ATTRIBUTE_UNUSED
;
2146 register char *name
;
2150 register symbolS
*symbolP
;
2152 /* We permit ANY defined expression: BSD4.2 demands constants. */
2153 name
= input_line_pointer
;
2154 c
= get_symbol_end ();
2155 p
= input_line_pointer
;
2159 if (*input_line_pointer
!= ',')
2162 as_bad (_("Expected comma after name \"%s\""), name
);
2164 ignore_rest_of_line ();
2168 input_line_pointer
++;
2171 if (exp
.X_op
!= O_constant
2172 && exp
.X_op
!= O_register
)
2174 as_bad (_("bad expression"));
2175 ignore_rest_of_line ();
2180 symbolP
= symbol_find_or_make (name
);
2182 /* FIXME-SOON I pulled a (&& symbolP->sy_other == 0 &&
2183 symbolP->sy_desc == 0) out of this test because coff doesn't have
2184 those fields, and I can't see when they'd ever be tripped. I
2185 don't think I understand why they were here so I may have
2186 introduced a bug. As recently as 1.37 didn't have this test
2187 anyway. xoxorich. */
2189 if (S_GET_SEGMENT (symbolP
) == undefined_section
2190 && S_GET_VALUE (symbolP
) == 0)
2192 /* The name might be an undefined .global symbol; be sure to
2193 keep the "external" bit. */
2194 S_SET_SEGMENT (symbolP
,
2195 (exp
.X_op
== O_constant
2198 S_SET_VALUE (symbolP
, (valueT
) exp
.X_add_number
);
2202 as_bad (_("Symbol %s already defined"), name
);
2206 demand_empty_rest_of_line ();
2209 /* Read a line into an sb. */
2215 char quote1
, quote2
, inquote
;
2217 if (input_line_pointer
[-1] == '\n')
2218 bump_line_counters ();
2220 if (input_line_pointer
>= buffer_limit
)
2222 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
2223 if (buffer_limit
== 0)
2227 /* If app.c sets any other characters to LEX_IS_STRINGQUOTE, this
2228 code needs to be changed. */
2237 #ifdef LEX_IS_STRINGQUOTE
2243 while (!is_end_of_line
[(unsigned char) *input_line_pointer
]
2244 || (inquote
!= '\0' && *input_line_pointer
!= '\n'))
2246 if (inquote
== *input_line_pointer
)
2248 else if (inquote
== '\0')
2250 if (*input_line_pointer
== quote1
)
2252 else if (*input_line_pointer
== quote2
)
2256 sb_add_char (line
, *input_line_pointer
++);
2259 while (input_line_pointer
< buffer_limit
2260 && is_end_of_line
[(unsigned char) *input_line_pointer
])
2262 if (input_line_pointer
[-1] == '\n')
2263 bump_line_counters ();
2264 ++input_line_pointer
;
2270 /* Define a macro. This is an interface to macro.c, which is shared
2271 between gas and gasp. */
2275 int ignore ATTRIBUTE_UNUSED
;
2284 as_where (&file
, &line
);
2287 while (!is_end_of_line
[(unsigned char) *input_line_pointer
])
2288 sb_add_char (&s
, *input_line_pointer
++);
2291 if (line_label
!= NULL
)
2292 sb_add_string (&label
, S_GET_NAME (line_label
));
2294 err
= define_macro (0, &s
, &label
, get_line_sb
, &name
);
2296 as_bad_where (file
, line
, "%s", err
);
2299 if (line_label
!= NULL
)
2301 S_SET_SEGMENT (line_label
, undefined_section
);
2302 S_SET_VALUE (line_label
, 0);
2303 symbol_set_frag (line_label
, &zero_address_frag
);
2306 if (((NO_PSEUDO_DOT
|| flag_m68k_mri
)
2307 && hash_find (po_hash
, name
) != NULL
)
2310 && hash_find (po_hash
, name
+ 1) != NULL
))
2311 as_warn (_("attempt to redefine pseudo-op `%s' ignored"),
2318 /* Handle the .mexit pseudo-op, which immediately exits a macro
2323 int ignore ATTRIBUTE_UNUSED
;
2325 cond_exit_macro (macro_nest
);
2326 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
2329 /* Switch in and out of MRI mode. */
2333 int ignore ATTRIBUTE_UNUSED
;
2337 on
= get_absolute_expression ();
2338 old_flag
= flag_mri
;
2356 /* Operator precedence changes in m68k MRI mode, so we need to
2357 update the operator rankings. */
2358 expr_set_precedence ();
2360 #ifdef MRI_MODE_CHANGE
2362 MRI_MODE_CHANGE (on
);
2365 demand_empty_rest_of_line ();
2368 /* Handle changing the location counter. */
2371 do_org (segment
, exp
, fill
)
2376 if (segment
!= now_seg
&& segment
!= absolute_section
)
2377 as_bad (_("invalid segment \"%s\"; segment \"%s\" assumed"),
2378 segment_name (segment
), segment_name (now_seg
));
2380 if (now_seg
== absolute_section
)
2383 as_warn (_("ignoring fill value in absolute section"));
2384 if (exp
->X_op
!= O_constant
)
2386 as_bad (_("only constant offsets supported in absolute section"));
2387 exp
->X_add_number
= 0;
2389 abs_section_offset
= exp
->X_add_number
;
2395 p
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, exp
->X_add_symbol
,
2396 exp
->X_add_number
* OCTETS_PER_BYTE
, (char *) NULL
);
2403 int ignore ATTRIBUTE_UNUSED
;
2405 register segT segment
;
2407 register long temp_fill
;
2409 #ifdef md_flush_pending_output
2410 md_flush_pending_output ();
2413 /* The m68k MRI assembler has a different meaning for .org. It
2414 means to create an absolute section at a given address. We can't
2415 support that--use a linker script instead. */
2418 as_bad (_("MRI style ORG pseudo-op not supported"));
2419 ignore_rest_of_line ();
2423 /* Don't believe the documentation of BSD 4.2 AS. There is no such
2424 thing as a sub-segment-relative origin. Any absolute origin is
2425 given a warning, then assumed to be segment-relative. Any
2426 segmented origin expression ("foo+42") had better be in the right
2427 segment or the .org is ignored.
2429 BSD 4.2 AS warns if you try to .org backwards. We cannot because
2430 we never know sub-segment sizes when we are reading code. BSD
2431 will crash trying to emit negative numbers of filler bytes in
2432 certain .orgs. We don't crash, but see as-write for that code.
2434 Don't make frag if need_pass_2==1. */
2435 segment
= get_known_segmented_expression (&exp
);
2436 if (*input_line_pointer
== ',')
2438 input_line_pointer
++;
2439 temp_fill
= get_absolute_expression ();
2445 do_org (segment
, &exp
, temp_fill
);
2447 demand_empty_rest_of_line ();
2450 /* Handle parsing for the MRI SECT/SECTION pseudo-op. This should be
2451 called by the obj-format routine which handles section changing
2452 when in MRI mode. It will create a new section, and return it. It
2453 will set *TYPE to the section type: one of 'C' (code), 'D' (data),
2454 'M' (mixed), or 'R' (romable). If BFD_ASSEMBLER is defined, the
2455 flags will be set in the section. */
2459 char *type ATTRIBUTE_UNUSED
;
2469 name
= input_line_pointer
;
2470 if (!isdigit ((unsigned char) *name
))
2471 c
= get_symbol_end ();
2476 ++input_line_pointer
;
2478 while (isdigit ((unsigned char) *input_line_pointer
));
2480 c
= *input_line_pointer
;
2481 *input_line_pointer
= '\0';
2484 name
= xstrdup (name
);
2486 *input_line_pointer
= c
;
2488 seg
= subseg_new (name
, 0);
2490 if (*input_line_pointer
== ',')
2494 ++input_line_pointer
;
2495 align
= get_absolute_expression ();
2496 record_alignment (seg
, align
);
2500 if (*input_line_pointer
== ',')
2502 c
= *++input_line_pointer
;
2503 c
= toupper ((unsigned char) c
);
2504 if (c
== 'C' || c
== 'D' || c
== 'M' || c
== 'R')
2507 as_bad (_("unrecognized section type"));
2508 ++input_line_pointer
;
2510 #ifdef BFD_ASSEMBLER
2514 flags
= SEC_NO_FLAGS
;
2516 flags
= SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
| SEC_CODE
;
2517 else if (*type
== 'D' || *type
== 'M')
2518 flags
= SEC_ALLOC
| SEC_LOAD
| SEC_DATA
;
2519 else if (*type
== 'R')
2520 flags
= SEC_ALLOC
| SEC_LOAD
| SEC_DATA
| SEC_READONLY
| SEC_ROM
;
2521 if (flags
!= SEC_NO_FLAGS
)
2523 if (!bfd_set_section_flags (stdoutput
, seg
, flags
))
2524 as_warn (_("error setting flags for \"%s\": %s"),
2525 bfd_section_name (stdoutput
, seg
),
2526 bfd_errmsg (bfd_get_error ()));
2532 /* Ignore the HP type. */
2533 if (*input_line_pointer
== ',')
2534 input_line_pointer
+= 2;
2536 demand_empty_rest_of_line ();
2538 #else /* ! TC_M68K */
2547 name
= input_line_pointer
;
2548 c
= get_symbol_end ();
2550 name
= xstrdup (name
);
2552 *input_line_pointer
= c
;
2554 seg
= subseg_new (name
, 0);
2556 if (*input_line_pointer
!= ',')
2562 ++input_line_pointer
;
2564 sectype
= input_line_pointer
;
2565 c
= get_symbol_end ();
2566 if (*sectype
== '\0')
2568 else if (strcasecmp (sectype
, "text") == 0)
2570 else if (strcasecmp (sectype
, "data") == 0)
2572 else if (strcasecmp (sectype
, "romdata") == 0)
2575 as_warn (_("unrecognized section type `%s'"), sectype
);
2576 *input_line_pointer
= c
;
2579 if (*input_line_pointer
== ',')
2583 ++input_line_pointer
;
2585 seccmd
= input_line_pointer
;
2586 c
= get_symbol_end ();
2587 if (strcasecmp (seccmd
, "absolute") == 0)
2589 as_bad (_("absolute sections are not supported"));
2590 *input_line_pointer
= c
;
2591 ignore_rest_of_line ();
2594 else if (strcasecmp (seccmd
, "align") == 0)
2598 *input_line_pointer
= c
;
2599 align
= get_absolute_expression ();
2600 record_alignment (seg
, align
);
2604 as_warn (_("unrecognized section command `%s'"), seccmd
);
2605 *input_line_pointer
= c
;
2609 demand_empty_rest_of_line ();
2611 #else /* ! TC_I960 */
2612 /* The MRI assembler seems to use different forms of .sect for
2613 different targets. */
2614 as_bad ("MRI mode not supported for this target");
2615 ignore_rest_of_line ();
2616 #endif /* ! TC_I960 */
2617 #endif /* ! TC_M68K */
2620 /* Handle the .print pseudo-op. */
2624 int ignore ATTRIBUTE_UNUSED
;
2629 s
= demand_copy_C_string (&len
);
2631 demand_empty_rest_of_line ();
2634 /* Handle the .purgem pseudo-op. */
2638 int ignore ATTRIBUTE_UNUSED
;
2640 if (is_it_end_of_statement ())
2642 demand_empty_rest_of_line ();
2652 name
= input_line_pointer
;
2653 c
= get_symbol_end ();
2654 delete_macro (name
);
2655 *input_line_pointer
= c
;
2658 while (*input_line_pointer
++ == ',');
2660 --input_line_pointer
;
2661 demand_empty_rest_of_line ();
2664 /* Handle the .rept pseudo-op. */
2668 int ignore ATTRIBUTE_UNUSED
;
2672 count
= get_absolute_expression ();
2674 do_repeat (count
, "REPT", "ENDR");
2677 /* This function provides a generic repeat block implementation. It allows
2678 different directives to be used as the start/end keys. */
2681 do_repeat (count
, start
, end
)
2690 if (!buffer_and_nest (start
, end
, &one
, get_line_sb
))
2692 as_bad (_("%s without %s"), start
, end
);
2698 sb_add_sb (&many
, &one
);
2702 input_scrub_include_sb (&many
, input_line_pointer
, 1);
2704 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
2707 /* Skip to end of current repeat loop; EXTRA indicates how many additional
2708 input buffers to skip. Assumes that conditionals preceding the loop end
2709 are properly nested.
2711 This function makes it easier to implement a premature "break" out of the
2712 loop. The EXTRA arg accounts for other buffers we might have inserted,
2713 such as line substitutions. */
2719 cond_exit_macro (macro_nest
);
2720 while (extra
-- >= 0)
2721 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
2724 /* Handle the .equ, .equiv and .set directives. If EQUIV is 1, then
2725 this is .equiv, and it is an error if the symbol is already
2732 register char *name
;
2733 register char delim
;
2734 register char *end_name
;
2735 register symbolS
*symbolP
;
2737 /* Especial apologies for the random logic:
2738 this just grew, and could be parsed much more simply!
2740 name
= input_line_pointer
;
2741 delim
= get_symbol_end ();
2742 end_name
= input_line_pointer
;
2746 if (*input_line_pointer
!= ',')
2749 as_bad (_("Expected comma after name \"%s\""), name
);
2751 ignore_rest_of_line ();
2755 input_line_pointer
++;
2758 if (name
[0] == '.' && name
[1] == '\0')
2760 /* Turn '. = mumble' into a .org mumble. */
2761 register segT segment
;
2764 segment
= get_known_segmented_expression (&exp
);
2767 do_org (segment
, &exp
, 0);
2773 if ((symbolP
= symbol_find (name
)) == NULL
2774 && (symbolP
= md_undefined_symbol (name
)) == NULL
)
2777 /* When doing symbol listings, play games with dummy fragments living
2778 outside the normal fragment chain to record the file and line info
2780 if (listing
& LISTING_SYMBOLS
)
2782 extern struct list_info_struct
*listing_tail
;
2783 fragS
*dummy_frag
= (fragS
*) xmalloc (sizeof (fragS
));
2784 memset (dummy_frag
, 0, sizeof (fragS
));
2785 dummy_frag
->fr_type
= rs_fill
;
2786 dummy_frag
->line
= listing_tail
;
2787 symbolP
= symbol_new (name
, undefined_section
, 0, dummy_frag
);
2788 dummy_frag
->fr_symbol
= symbolP
;
2792 symbolP
= symbol_new (name
, undefined_section
, 0, &zero_address_frag
);
2795 /* "set" symbols are local unless otherwise specified. */
2796 SF_SET_LOCAL (symbolP
);
2797 #endif /* OBJ_COFF */
2800 symbol_table_insert (symbolP
);
2805 && S_IS_DEFINED (symbolP
)
2806 && S_GET_SEGMENT (symbolP
) != reg_section
)
2807 as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP
));
2809 pseudo_set (symbolP
);
2810 demand_empty_rest_of_line ();
2824 #ifdef md_flush_pending_output
2825 md_flush_pending_output ();
2829 stop
= mri_comment_field (&stopc
);
2831 /* In m68k MRI mode, we need to align to a word boundary, unless
2833 if (flag_m68k_mri
&& mult
> 1)
2835 if (now_seg
== absolute_section
)
2837 abs_section_offset
+= abs_section_offset
& 1;
2838 if (line_label
!= NULL
)
2839 S_SET_VALUE (line_label
, abs_section_offset
);
2841 else if (mri_common_symbol
!= NULL
)
2845 val
= S_GET_VALUE (mri_common_symbol
);
2848 S_SET_VALUE (mri_common_symbol
, val
+ 1);
2849 if (line_label
!= NULL
)
2851 expressionS
*symexp
;
2853 symexp
= symbol_get_value_expression (line_label
);
2854 know (symexp
->X_op
== O_symbol
);
2855 know (symexp
->X_add_symbol
== mri_common_symbol
);
2856 symexp
->X_add_number
+= 1;
2862 do_align (1, (char *) NULL
, 0, 0);
2863 if (line_label
!= NULL
)
2865 symbol_set_frag (line_label
, frag_now
);
2866 S_SET_VALUE (line_label
, frag_now_fix ());
2876 if (*input_line_pointer
== ',')
2878 ++input_line_pointer
;
2883 val
.X_op
= O_constant
;
2884 val
.X_add_number
= 0;
2887 if (val
.X_op
!= O_constant
2888 || val
.X_add_number
< - 0x80
2889 || val
.X_add_number
> 0xff
2890 || (mult
!= 0 && mult
!= 1 && val
.X_add_number
!= 0))
2892 if (exp
.X_op
!= O_constant
)
2893 as_bad (_("Unsupported variable size or fill value"));
2900 bytes
= mult
* exp
.X_add_number
;
2901 for (i
= 0; i
< exp
.X_add_number
; i
++)
2902 emit_expr (&val
, mult
);
2907 if (exp
.X_op
== O_constant
)
2911 repeat
= exp
.X_add_number
;
2918 as_warn (_(".space repeat count is zero, ignored"));
2919 else if (repeat
< 0)
2920 as_warn (_(".space repeat count is negative, ignored"));
2924 /* If we are in the absolute section, just bump the offset. */
2925 if (now_seg
== absolute_section
)
2927 abs_section_offset
+= repeat
;
2931 /* If we are secretly in an MRI common section, then
2932 creating space just increases the size of the common
2934 if (mri_common_symbol
!= NULL
)
2936 S_SET_VALUE (mri_common_symbol
,
2937 S_GET_VALUE (mri_common_symbol
) + repeat
);
2942 p
= frag_var (rs_fill
, 1, 1, (relax_substateT
) 0, (symbolS
*) 0,
2943 (offsetT
) repeat
, (char *) 0);
2947 if (now_seg
== absolute_section
)
2949 as_bad (_("space allocation too complex in absolute section"));
2950 subseg_set (text_section
, 0);
2953 if (mri_common_symbol
!= NULL
)
2955 as_bad (_("space allocation too complex in common section"));
2956 mri_common_symbol
= NULL
;
2960 p
= frag_var (rs_space
, 1, 1, (relax_substateT
) 0,
2961 make_expr_symbol (&exp
), (offsetT
) 0, (char *) 0);
2965 *p
= val
.X_add_number
;
2970 /* In MRI mode, after an odd number of bytes, we must align to an
2971 even word boundary, unless the next instruction is a dc.b, ds.b
2973 if (flag_mri
&& (bytes
& 1) != 0)
2974 mri_pending_align
= 1;
2976 demand_empty_rest_of_line ();
2979 mri_comment_end (stop
, stopc
);
2982 /* This is like s_space, but the value is a floating point number with
2983 the given precision. This is for the MRI dcb.s pseudo-op and
2987 s_float_space (float_type
)
2992 char temp
[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT
];
2997 stop
= mri_comment_field (&stopc
);
2999 count
= get_absolute_expression ();
3002 if (*input_line_pointer
!= ',')
3004 as_bad (_("missing value"));
3005 ignore_rest_of_line ();
3007 mri_comment_end (stop
, stopc
);
3011 ++input_line_pointer
;
3015 /* Skip any 0{letter} that may be present. Don't even check if the
3016 * letter is legal. */
3017 if (input_line_pointer
[0] == '0'
3018 && isalpha ((unsigned char) input_line_pointer
[1]))
3019 input_line_pointer
+= 2;
3021 /* Accept :xxxx, where the x's are hex digits, for a floating point
3022 with the exact digits specified. */
3023 if (input_line_pointer
[0] == ':')
3025 flen
= hex_float (float_type
, temp
);
3028 ignore_rest_of_line ();
3030 mri_comment_end (stop
, stopc
);
3038 err
= md_atof (float_type
, temp
, &flen
);
3039 know (flen
<= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT
);
3043 as_bad (_("Bad floating literal: %s"), err
);
3044 ignore_rest_of_line ();
3046 mri_comment_end (stop
, stopc
);
3051 while (--count
>= 0)
3055 p
= frag_more (flen
);
3056 memcpy (p
, temp
, (unsigned int) flen
);
3059 demand_empty_rest_of_line ();
3062 mri_comment_end (stop
, stopc
);
3065 /* Handle the .struct pseudo-op, as found in MIPS assemblers. */
3069 int ignore ATTRIBUTE_UNUSED
;
3075 stop
= mri_comment_field (&stopc
);
3076 abs_section_offset
= get_absolute_expression ();
3077 subseg_set (absolute_section
, 0);
3078 demand_empty_rest_of_line ();
3080 mri_comment_end (stop
, stopc
);
3085 int ignore ATTRIBUTE_UNUSED
;
3089 temp
= get_absolute_expression ();
3090 subseg_set (text_section
, (subsegT
) temp
);
3091 demand_empty_rest_of_line ();
3093 const_flag
&= ~IN_DEFAULT_SECTION
;
3098 demand_empty_rest_of_line ()
3101 if (is_end_of_line
[(unsigned char) *input_line_pointer
])
3102 input_line_pointer
++;
3104 ignore_rest_of_line ();
3106 /* Return having already swallowed end-of-line. */
3110 ignore_rest_of_line ()
3112 /* For suspect lines: gives warning. */
3113 if (!is_end_of_line
[(unsigned char) *input_line_pointer
])
3115 if (isprint ((unsigned char) *input_line_pointer
))
3116 as_bad (_("Rest of line ignored. First ignored character is `%c'."),
3117 *input_line_pointer
);
3119 as_bad (_("Rest of line ignored. First ignored character valued 0x%x."),
3120 *input_line_pointer
);
3122 while (input_line_pointer
< buffer_limit
3123 && !is_end_of_line
[(unsigned char) *input_line_pointer
])
3124 input_line_pointer
++;
3127 input_line_pointer
++;
3129 /* Return pointing just after end-of-line. */
3130 know (is_end_of_line
[(unsigned char) input_line_pointer
[-1]]);
3134 discard_rest_of_line ()
3136 while (input_line_pointer
< buffer_limit
3137 && !is_end_of_line
[(unsigned char) *input_line_pointer
])
3138 input_line_pointer
++;
3140 input_line_pointer
++;
3142 /* Return pointing just after end-of-line. */
3143 know (is_end_of_line
[(unsigned char) input_line_pointer
[-1]]);
3146 /* In: Pointer to a symbol.
3147 Input_line_pointer->expression.
3149 Out: Input_line_pointer->just after any whitespace after expression.
3150 Tried to set symbol to value of expression.
3151 Will change symbols type, value, and frag; */
3154 pseudo_set (symbolP
)
3158 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3160 #endif /* OBJ_AOUT or OBJ_BOUT */
3162 know (symbolP
); /* NULL pointer is logic error. */
3163 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3164 ext
= S_IS_EXTERNAL (symbolP
);
3165 #endif /* OBJ_AOUT or OBJ_BOUT */
3167 (void) expression (&exp
);
3169 if (exp
.X_op
== O_illegal
)
3170 as_bad (_("illegal expression; zero assumed"));
3171 else if (exp
.X_op
== O_absent
)
3172 as_bad (_("missing expression; zero assumed"));
3173 else if (exp
.X_op
== O_big
)
3175 if (exp
.X_add_number
> 0)
3176 as_bad (_("bignum invalid; zero assumed"));
3178 as_bad (_("floating point number invalid; zero assumed"));
3180 else if (exp
.X_op
== O_subtract
3181 && (S_GET_SEGMENT (exp
.X_add_symbol
)
3182 == S_GET_SEGMENT (exp
.X_op_symbol
))
3183 && SEG_NORMAL (S_GET_SEGMENT (exp
.X_add_symbol
))
3184 && (symbol_get_frag (exp
.X_add_symbol
)
3185 == symbol_get_frag (exp
.X_op_symbol
)))
3187 exp
.X_op
= O_constant
;
3188 exp
.X_add_number
= (S_GET_VALUE (exp
.X_add_symbol
)
3189 - S_GET_VALUE (exp
.X_op_symbol
));
3197 exp
.X_add_number
= 0;
3200 S_SET_SEGMENT (symbolP
, absolute_section
);
3201 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3203 S_SET_EXTERNAL (symbolP
);
3205 S_CLEAR_EXTERNAL (symbolP
);
3206 #endif /* OBJ_AOUT or OBJ_BOUT */
3207 S_SET_VALUE (symbolP
, (valueT
) exp
.X_add_number
);
3208 if (exp
.X_op
!= O_constant
)
3209 symbol_set_frag (symbolP
, &zero_address_frag
);
3213 S_SET_SEGMENT (symbolP
, reg_section
);
3214 S_SET_VALUE (symbolP
, (valueT
) exp
.X_add_number
);
3215 symbol_set_frag (symbolP
, &zero_address_frag
);
3219 if (S_GET_SEGMENT (exp
.X_add_symbol
) == undefined_section
3220 || exp
.X_add_number
!= 0)
3221 symbol_set_value_expression (symbolP
, &exp
);
3222 else if (symbol_section_p (symbolP
))
3223 as_bad ("invalid attempt to set value of section symbol");
3226 symbolS
*s
= exp
.X_add_symbol
;
3228 S_SET_SEGMENT (symbolP
, S_GET_SEGMENT (s
));
3229 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3231 S_SET_EXTERNAL (symbolP
);
3233 S_CLEAR_EXTERNAL (symbolP
);
3234 #endif /* OBJ_AOUT or OBJ_BOUT */
3235 S_SET_VALUE (symbolP
,
3236 exp
.X_add_number
+ S_GET_VALUE (s
));
3237 symbol_set_frag (symbolP
, symbol_get_frag (s
));
3238 copy_symbol_attributes (symbolP
, s
);
3243 /* The value is some complex expression.
3244 FIXME: Should we set the segment to anything? */
3245 symbol_set_value_expression (symbolP
, &exp
);
3252 CONStruct more frag of .bytes, or .words etc.
3253 Should need_pass_2 be 1 then emit no frag(s).
3254 This understands EXPRESSIONS.
3258 This has a split personality. We use expression() to read the
3259 value. We can detect if the value won't fit in a byte or word.
3260 But we can't detect if expression() discarded significant digits
3261 in the case of a long. Not worth the crocks required to fix it. */
3263 /* Select a parser for cons expressions. */
3265 /* Some targets need to parse the expression in various fancy ways.
3266 You can define TC_PARSE_CONS_EXPRESSION to do whatever you like
3267 (for example, the HPPA does this). Otherwise, you can define
3268 BITFIELD_CONS_EXPRESSIONS to permit bitfields to be specified, or
3269 REPEAT_CONS_EXPRESSIONS to permit repeat counts. If none of these
3270 are defined, which is the normal case, then only simple expressions
3275 parse_mri_cons
PARAMS ((expressionS
*exp
, unsigned int nbytes
));
3278 #ifndef TC_PARSE_CONS_EXPRESSION
3279 #ifdef BITFIELD_CONS_EXPRESSIONS
3280 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_bitfield_cons (EXP, NBYTES)
3282 parse_bitfield_cons
PARAMS ((expressionS
*exp
, unsigned int nbytes
));
3284 #ifdef REPEAT_CONS_EXPRESSIONS
3285 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_repeat_cons (EXP, NBYTES)
3287 parse_repeat_cons
PARAMS ((expressionS
*exp
, unsigned int nbytes
));
3290 /* If we haven't gotten one yet, just call expression. */
3291 #ifndef TC_PARSE_CONS_EXPRESSION
3292 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) expression (EXP)
3296 /* Worker to do .byte etc statements.
3297 Clobbers input_line_pointer and checks end-of-line. */
3300 cons_worker (nbytes
, rva
)
3301 register int nbytes
; /* 1=.byte, 2=.word, 4=.long. */
3309 #ifdef md_flush_pending_output
3310 md_flush_pending_output ();
3314 stop
= mri_comment_field (&stopc
);
3316 if (is_it_end_of_statement ())
3318 demand_empty_rest_of_line ();
3320 mri_comment_end (stop
, stopc
);
3324 #ifdef md_cons_align
3325 md_cons_align (nbytes
);
3333 parse_mri_cons (&exp
, (unsigned int) nbytes
);
3336 TC_PARSE_CONS_EXPRESSION (&exp
, (unsigned int) nbytes
);
3340 if (exp
.X_op
== O_symbol
)
3341 exp
.X_op
= O_symbol_rva
;
3343 as_fatal (_("rva without symbol"));
3345 emit_expr (&exp
, (unsigned int) nbytes
);
3348 while (*input_line_pointer
++ == ',');
3350 /* In MRI mode, after an odd number of bytes, we must align to an
3351 even word boundary, unless the next instruction is a dc.b, ds.b
3353 if (flag_mri
&& nbytes
== 1 && (c
& 1) != 0)
3354 mri_pending_align
= 1;
3356 input_line_pointer
--; /* Put terminator back into stream. */
3358 demand_empty_rest_of_line ();
3361 mri_comment_end (stop
, stopc
);
3368 cons_worker (size
, 0);
3375 cons_worker (size
, 1);
3378 /* Put the contents of expression EXP into the object file using
3379 NBYTES bytes. If need_pass_2 is 1, this does nothing. */
3382 emit_expr (exp
, nbytes
)
3384 unsigned int nbytes
;
3388 valueT extra_digit
= 0;
3390 /* Don't do anything if we are going to make another pass. */
3396 /* When gcc emits DWARF 1 debugging pseudo-ops, a line number will
3397 appear as a four byte positive constant in the .line section,
3398 followed by a 2 byte 0xffff. Look for that case here. */
3400 static int dwarf_line
= -1;
3402 if (strcmp (segment_name (now_seg
), ".line") != 0)
3404 else if (dwarf_line
>= 0
3406 && exp
->X_op
== O_constant
3407 && (exp
->X_add_number
== -1 || exp
->X_add_number
== 0xffff))
3408 listing_source_line ((unsigned int) dwarf_line
);
3409 else if (nbytes
== 4
3410 && exp
->X_op
== O_constant
3411 && exp
->X_add_number
>= 0)
3412 dwarf_line
= exp
->X_add_number
;
3417 /* When gcc emits DWARF 1 debugging pseudo-ops, a file name will
3418 appear as a 2 byte TAG_compile_unit (0x11) followed by a 2 byte
3419 AT_sibling (0x12) followed by a four byte address of the sibling
3420 followed by a 2 byte AT_name (0x38) followed by the name of the
3421 file. We look for that case here. */
3423 static int dwarf_file
= 0;
3425 if (strcmp (segment_name (now_seg
), ".debug") != 0)
3427 else if (dwarf_file
== 0
3429 && exp
->X_op
== O_constant
3430 && exp
->X_add_number
== 0x11)
3432 else if (dwarf_file
== 1
3434 && exp
->X_op
== O_constant
3435 && exp
->X_add_number
== 0x12)
3437 else if (dwarf_file
== 2
3440 else if (dwarf_file
== 3
3442 && exp
->X_op
== O_constant
3443 && exp
->X_add_number
== 0x38)
3448 /* The variable dwarf_file_string tells stringer that the string
3449 may be the name of the source file. */
3450 if (dwarf_file
== 4)
3451 dwarf_file_string
= 1;
3453 dwarf_file_string
= 0;
3458 if (check_eh_frame (exp
, &nbytes
))
3463 /* Allow `.word 0' in the absolute section. */
3464 if (now_seg
== absolute_section
)
3466 if (op
!= O_constant
|| exp
->X_add_number
!= 0)
3467 as_bad (_("attempt to store value in absolute section"));
3468 abs_section_offset
+= nbytes
;
3472 /* Handle a negative bignum. */
3474 && exp
->X_add_number
== 0
3475 && symbol_get_value_expression (exp
->X_add_symbol
)->X_op
== O_big
3476 && symbol_get_value_expression (exp
->X_add_symbol
)->X_add_number
> 0)
3479 unsigned long carry
;
3481 exp
= symbol_get_value_expression (exp
->X_add_symbol
);
3483 /* Negate the bignum: one's complement each digit and add 1. */
3485 for (i
= 0; i
< exp
->X_add_number
; i
++)
3489 next
= (((~(generic_bignum
[i
] & LITTLENUM_MASK
))
3492 generic_bignum
[i
] = next
& LITTLENUM_MASK
;
3493 carry
= next
>> LITTLENUM_NUMBER_OF_BITS
;
3496 /* We can ignore any carry out, because it will be handled by
3497 extra_digit if it is needed. */
3499 extra_digit
= (valueT
) -1;
3503 if (op
== O_absent
|| op
== O_illegal
)
3505 as_warn (_("zero assumed for missing expression"));
3506 exp
->X_add_number
= 0;
3509 else if (op
== O_big
&& exp
->X_add_number
<= 0)
3511 as_bad (_("floating point number invalid; zero assumed"));
3512 exp
->X_add_number
= 0;
3515 else if (op
== O_register
)
3517 as_warn (_("register value used as expression"));
3521 p
= frag_more ((int) nbytes
);
3523 #ifndef WORKING_DOT_WORD
3524 /* If we have the difference of two symbols in a word, save it on
3525 the broken_words list. See the code in write.c. */
3526 if (op
== O_subtract
&& nbytes
== 2)
3528 struct broken_word
*x
;
3530 x
= (struct broken_word
*) xmalloc (sizeof (struct broken_word
));
3531 x
->next_broken_word
= broken_words
;
3534 x
->subseg
= now_subseg
;
3536 x
->word_goes_here
= p
;
3538 x
->add
= exp
->X_add_symbol
;
3539 x
->sub
= exp
->X_op_symbol
;
3540 x
->addnum
= exp
->X_add_number
;
3547 /* If we have an integer, but the number of bytes is too large to
3548 pass to md_number_to_chars, handle it as a bignum. */
3549 if (op
== O_constant
&& nbytes
> sizeof (valueT
))
3554 if (!exp
->X_unsigned
&& exp
->X_add_number
< 0)
3555 extra_digit
= (valueT
) -1;
3556 val
= (valueT
) exp
->X_add_number
;
3560 generic_bignum
[gencnt
] = val
& LITTLENUM_MASK
;
3561 val
>>= LITTLENUM_NUMBER_OF_BITS
;
3565 op
= exp
->X_op
= O_big
;
3566 exp
->X_add_number
= gencnt
;
3569 if (op
== O_constant
)
3571 register valueT get
;
3572 register valueT use
;
3573 register valueT mask
;
3575 register valueT unmask
;
3577 /* JF << of >= number of bits in the object is undefined. In
3578 particular SPARC (Sun 4) has problems. */
3579 if (nbytes
>= sizeof (valueT
))
3582 if (nbytes
> sizeof (valueT
))
3585 hibit
= (valueT
) 1 << (nbytes
* BITS_PER_CHAR
- 1);
3589 /* Don't store these bits. */
3590 mask
= ~(valueT
) 0 << (BITS_PER_CHAR
* nbytes
);
3591 hibit
= (valueT
) 1 << (nbytes
* BITS_PER_CHAR
- 1);
3594 unmask
= ~mask
; /* Do store these bits. */
3597 "Do this mod if you want every overflow check to assume SIGNED 2's complement data.";
3598 mask
= ~(unmask
>> 1); /* Includes sign bit now. */
3601 get
= exp
->X_add_number
;
3603 if ((get
& mask
) != 0
3604 && ((get
& mask
) != mask
3605 || (get
& hibit
) == 0))
3606 { /* Leading bits contain both 0s & 1s. */
3607 as_warn (_("Value 0x%lx truncated to 0x%lx."),
3608 (unsigned long) get
, (unsigned long) use
);
3610 /* Put bytes in right order. */
3611 md_number_to_chars (p
, use
, (int) nbytes
);
3613 else if (op
== O_big
)
3616 LITTLENUM_TYPE
*nums
;
3618 know (nbytes
% CHARS_PER_LITTLENUM
== 0);
3620 size
= exp
->X_add_number
* CHARS_PER_LITTLENUM
;
3623 as_warn (_("Bignum truncated to %d bytes"), nbytes
);
3627 if (target_big_endian
)
3629 while (nbytes
> size
)
3631 md_number_to_chars (p
, extra_digit
, CHARS_PER_LITTLENUM
);
3632 nbytes
-= CHARS_PER_LITTLENUM
;
3633 p
+= CHARS_PER_LITTLENUM
;
3636 nums
= generic_bignum
+ size
/ CHARS_PER_LITTLENUM
;
3640 md_number_to_chars (p
, (valueT
) *nums
, CHARS_PER_LITTLENUM
);
3641 size
-= CHARS_PER_LITTLENUM
;
3642 p
+= CHARS_PER_LITTLENUM
;
3647 nums
= generic_bignum
;
3650 md_number_to_chars (p
, (valueT
) *nums
, CHARS_PER_LITTLENUM
);
3652 size
-= CHARS_PER_LITTLENUM
;
3653 p
+= CHARS_PER_LITTLENUM
;
3654 nbytes
-= CHARS_PER_LITTLENUM
;
3659 md_number_to_chars (p
, extra_digit
, CHARS_PER_LITTLENUM
);
3660 nbytes
-= CHARS_PER_LITTLENUM
;
3661 p
+= CHARS_PER_LITTLENUM
;
3667 memset (p
, 0, nbytes
);
3669 /* Now we need to generate a fixS to record the symbol value.
3670 This is easy for BFD. For other targets it can be more
3671 complex. For very complex cases (currently, the HPPA and
3672 NS32K), you can define TC_CONS_FIX_NEW to do whatever you
3673 want. For simpler cases, you can define TC_CONS_RELOC to be
3674 the name of the reloc code that should be stored in the fixS.
3675 If neither is defined, the code uses NO_RELOC if it is
3676 defined, and otherwise uses 0. */
3678 #ifdef BFD_ASSEMBLER
3679 #ifdef TC_CONS_FIX_NEW
3680 TC_CONS_FIX_NEW (frag_now
, p
- frag_now
->fr_literal
, nbytes
, exp
);
3683 bfd_reloc_code_real_type r
;
3700 as_bad (_("unsupported BFD relocation size %u"), nbytes
);
3704 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, (int) nbytes
, exp
,
3709 #ifdef TC_CONS_FIX_NEW
3710 TC_CONS_FIX_NEW (frag_now
, p
- frag_now
->fr_literal
, nbytes
, exp
);
3712 /* Figure out which reloc number to use. Use TC_CONS_RELOC if
3713 it is defined, otherwise use NO_RELOC if it is defined,
3715 #ifndef TC_CONS_RELOC
3717 #define TC_CONS_RELOC NO_RELOC
3719 #define TC_CONS_RELOC 0
3722 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, (int) nbytes
, exp
, 0,
3724 #endif /* TC_CONS_FIX_NEW */
3725 #endif /* BFD_ASSEMBLER */
3729 #ifdef BITFIELD_CONS_EXPRESSIONS
3731 /* i960 assemblers, (eg, asm960), allow bitfields after ".byte" as
3732 w:x,y:z, where w and y are bitwidths and x and y are values. They
3733 then pack them all together. We do a little better in that we allow
3734 them in words, longs, etc. and we'll pack them in target byte order
3737 The rules are: pack least significat bit first, if a field doesn't
3738 entirely fit, put it in the next unit. Overflowing the bitfield is
3739 explicitly *not* even a warning. The bitwidth should be considered
3742 To use this function the tc-XXX.h file should define
3743 BITFIELD_CONS_EXPRESSIONS. */
3746 parse_bitfield_cons (exp
, nbytes
)
3748 unsigned int nbytes
;
3750 unsigned int bits_available
= BITS_PER_CHAR
* nbytes
;
3751 char *hold
= input_line_pointer
;
3753 (void) expression (exp
);
3755 if (*input_line_pointer
== ':')
3762 unsigned long width
;
3764 if (*input_line_pointer
!= ':')
3766 input_line_pointer
= hold
;
3768 } /* Next piece is not a bitfield. */
3770 /* In the general case, we can't allow
3771 full expressions with symbol
3772 differences and such. The relocation
3773 entries for symbols not defined in this
3774 assembly would require arbitrary field
3775 widths, positions, and masks which most
3776 of our current object formats don't
3779 In the specific case where a symbol
3780 *is* defined in this assembly, we
3781 *could* build fixups and track it, but
3782 this could lead to confusion for the
3783 backends. I'm lazy. I'll take any
3784 SEG_ABSOLUTE. I think that means that
3785 you can use a previous .set or
3786 .equ type symbol. xoxorich. */
3788 if (exp
->X_op
== O_absent
)
3790 as_warn (_("using a bit field width of zero"));
3791 exp
->X_add_number
= 0;
3792 exp
->X_op
= O_constant
;
3793 } /* Implied zero width bitfield. */
3795 if (exp
->X_op
!= O_constant
)
3797 *input_line_pointer
= '\0';
3798 as_bad (_("field width \"%s\" too complex for a bitfield"), hold
);
3799 *input_line_pointer
= ':';
3800 demand_empty_rest_of_line ();
3802 } /* Too complex. */
3804 if ((width
= exp
->X_add_number
) > (BITS_PER_CHAR
* nbytes
))
3806 as_warn (_("field width %lu too big to fit in %d bytes: truncated to %d bits"),
3807 width
, nbytes
, (BITS_PER_CHAR
* nbytes
));
3808 width
= BITS_PER_CHAR
* nbytes
;
3811 if (width
> bits_available
)
3813 /* FIXME-SOMEDAY: backing up and reparsing is wasteful. */
3814 input_line_pointer
= hold
;
3815 exp
->X_add_number
= value
;
3820 hold
= ++input_line_pointer
;
3822 (void) expression (exp
);
3823 if (exp
->X_op
!= O_constant
)
3825 char cache
= *input_line_pointer
;
3827 *input_line_pointer
= '\0';
3828 as_bad (_("field value \"%s\" too complex for a bitfield"), hold
);
3829 *input_line_pointer
= cache
;
3830 demand_empty_rest_of_line ();
3832 } /* Too complex. */
3834 value
|= ((~(-1 << width
) & exp
->X_add_number
)
3835 << ((BITS_PER_CHAR
* nbytes
) - bits_available
));
3837 if ((bits_available
-= width
) == 0
3838 || is_it_end_of_statement ()
3839 || *input_line_pointer
!= ',')
3842 } /* All the bitfields we're gonna get. */
3844 hold
= ++input_line_pointer
;
3845 (void) expression (exp
);
3848 exp
->X_add_number
= value
;
3849 exp
->X_op
= O_constant
;
3850 exp
->X_unsigned
= 1;
3854 #endif /* BITFIELD_CONS_EXPRESSIONS */
3856 /* Handle an MRI style string expression. */
3860 parse_mri_cons (exp
, nbytes
)
3862 unsigned int nbytes
;
3864 if (*input_line_pointer
!= '\''
3865 && (input_line_pointer
[1] != '\''
3866 || (*input_line_pointer
!= 'A'
3867 && *input_line_pointer
!= 'E')))
3868 TC_PARSE_CONS_EXPRESSION (exp
, nbytes
);
3872 unsigned int result
= 0;
3874 /* An MRI style string. Cut into as many bytes as will fit into
3875 a nbyte chunk, left justify if necessary, and separate with
3876 commas so we can try again later. */
3877 if (*input_line_pointer
== 'A')
3878 ++input_line_pointer
;
3879 else if (*input_line_pointer
== 'E')
3881 as_bad (_("EBCDIC constants are not supported"));
3882 ++input_line_pointer
;
3885 input_line_pointer
++;
3886 for (scan
= 0; scan
< nbytes
; scan
++)
3888 if (*input_line_pointer
== '\'')
3890 if (input_line_pointer
[1] == '\'')
3892 input_line_pointer
++;
3897 result
= (result
<< 8) | (*input_line_pointer
++);
3901 while (scan
< nbytes
)
3907 /* Create correct expression. */
3908 exp
->X_op
= O_constant
;
3909 exp
->X_add_number
= result
;
3911 /* Fake it so that we can read the next char too. */
3912 if (input_line_pointer
[0] != '\'' ||
3913 (input_line_pointer
[0] == '\'' && input_line_pointer
[1] == '\''))
3915 input_line_pointer
-= 2;
3916 input_line_pointer
[0] = ',';
3917 input_line_pointer
[1] = '\'';
3920 input_line_pointer
++;
3923 #endif /* TC_M68K */
3925 #ifdef REPEAT_CONS_EXPRESSIONS
3927 /* Parse a repeat expression for cons. This is used by the MIPS
3928 assembler. The format is NUMBER:COUNT; NUMBER appears in the
3929 object file COUNT times.
3931 To use this for a target, define REPEAT_CONS_EXPRESSIONS. */
3934 parse_repeat_cons (exp
, nbytes
)
3936 unsigned int nbytes
;
3943 if (*input_line_pointer
!= ':')
3945 /* No repeat count. */
3949 ++input_line_pointer
;
3950 expression (&count
);
3951 if (count
.X_op
!= O_constant
3952 || count
.X_add_number
<= 0)
3954 as_warn (_("Unresolvable or nonpositive repeat count; using 1"));
3958 /* The cons function is going to output this expression once. So we
3959 output it count - 1 times. */
3960 for (i
= count
.X_add_number
- 1; i
> 0; i
--)
3961 emit_expr (exp
, nbytes
);
3964 #endif /* REPEAT_CONS_EXPRESSIONS */
3966 /* Parse a floating point number represented as a hex constant. This
3967 permits users to specify the exact bits they want in the floating
3971 hex_float (float_type
, bytes
)
4005 as_bad (_("Unknown floating type type '%c'"), float_type
);
4009 /* It would be nice if we could go through expression to parse the
4010 hex constant, but if we get a bignum it's a pain to sort it into
4011 the buffer correctly. */
4013 while (hex_p (*input_line_pointer
) || *input_line_pointer
== '_')
4017 /* The MRI assembler accepts arbitrary underscores strewn about
4018 through the hex constant, so we ignore them as well. */
4019 if (*input_line_pointer
== '_')
4021 ++input_line_pointer
;
4027 as_warn (_("Floating point constant too large"));
4030 d
= hex_value (*input_line_pointer
) << 4;
4031 ++input_line_pointer
;
4032 while (*input_line_pointer
== '_')
4033 ++input_line_pointer
;
4034 if (hex_p (*input_line_pointer
))
4036 d
+= hex_value (*input_line_pointer
);
4037 ++input_line_pointer
;
4039 if (target_big_endian
)
4042 bytes
[length
- i
- 1] = d
;
4048 if (target_big_endian
)
4049 memset (bytes
+ i
, 0, length
- i
);
4051 memset (bytes
, 0, length
- i
);
4059 CONStruct some more frag chars of .floats .ffloats etc.
4060 Makes 0 or more new frags.
4061 If need_pass_2 == 1, no frags are emitted.
4062 This understands only floating literals, not expressions. Sorry.
4064 A floating constant is defined by atof_generic(), except it is preceded
4065 by 0d 0f 0g or 0h. After observing the STRANGE way my BSD AS does its
4066 reading, I decided to be incompatible. This always tries to give you
4067 rounded bits to the precision of the pseudo-op. Former AS did premature
4068 truncatation, restored noisy bits instead of trailing 0s AND gave you
4069 a choice of 2 flavours of noise according to which of 2 floating-point
4070 scanners you directed AS to use.
4072 In: input_line_pointer->whitespace before, or '0' of flonum. */
4075 float_cons (float_type
)
4076 /* Clobbers input_line-pointer, checks end-of-line. */
4077 register int float_type
; /* 'f':.ffloat ... 'F':.float ... */
4080 int length
; /* Number of chars in an object. */
4081 register char *err
; /* Error from scanning floating literal. */
4082 char temp
[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT
];
4084 if (is_it_end_of_statement ())
4086 demand_empty_rest_of_line ();
4090 #ifdef md_flush_pending_output
4091 md_flush_pending_output ();
4096 /* input_line_pointer->1st char of a flonum (we hope!). */
4099 /* Skip any 0{letter} that may be present. Don't even check if the
4100 letter is legal. Someone may invent a "z" format and this routine
4101 has no use for such information. Lusers beware: you get
4102 diagnostics if your input is ill-conditioned. */
4103 if (input_line_pointer
[0] == '0'
4104 && isalpha ((unsigned char) input_line_pointer
[1]))
4105 input_line_pointer
+= 2;
4107 /* Accept :xxxx, where the x's are hex digits, for a floating
4108 point with the exact digits specified. */
4109 if (input_line_pointer
[0] == ':')
4111 ++input_line_pointer
;
4112 length
= hex_float (float_type
, temp
);
4115 ignore_rest_of_line ();
4121 err
= md_atof (float_type
, temp
, &length
);
4122 know (length
<= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT
);
4126 as_bad (_("Bad floating literal: %s"), err
);
4127 ignore_rest_of_line ();
4138 #ifdef REPEAT_CONS_EXPRESSIONS
4139 if (*input_line_pointer
== ':')
4141 expressionS count_exp
;
4143 ++input_line_pointer
;
4144 expression (&count_exp
);
4146 if (count_exp
.X_op
!= O_constant
4147 || count_exp
.X_add_number
<= 0)
4148 as_warn (_("unresolvable or nonpositive repeat count; using 1"));
4150 count
= count_exp
.X_add_number
;
4154 while (--count
>= 0)
4156 p
= frag_more (length
);
4157 memcpy (p
, temp
, (unsigned int) length
);
4162 while (*input_line_pointer
++ == ',');
4164 /* Put terminator back into stream. */
4165 --input_line_pointer
;
4166 demand_empty_rest_of_line ();
4169 /* Return the size of a LEB128 value. */
4172 sizeof_sleb128 (value
)
4175 register int size
= 0;
4176 register unsigned byte
;
4180 byte
= (value
& 0x7f);
4181 /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
4182 Fortunately, we can structure things so that the extra work reduces
4183 to a noop on systems that do things "properly". */
4184 value
= (value
>> 7) | ~(-(offsetT
)1 >> 7);
4187 while (!(((value
== 0) && ((byte
& 0x40) == 0))
4188 || ((value
== -1) && ((byte
& 0x40) != 0))));
4194 sizeof_uleb128 (value
)
4197 register int size
= 0;
4198 register unsigned byte
;
4202 byte
= (value
& 0x7f);
4212 sizeof_leb128 (value
, sign
)
4217 return sizeof_sleb128 ((offsetT
) value
);
4219 return sizeof_uleb128 (value
);
4222 /* Output a LEB128 value. */
4225 output_sleb128 (p
, value
)
4229 register char *orig
= p
;
4234 unsigned byte
= (value
& 0x7f);
4236 /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
4237 Fortunately, we can structure things so that the extra work reduces
4238 to a noop on systems that do things "properly". */
4239 value
= (value
>> 7) | ~(-(offsetT
)1 >> 7);
4241 more
= !((((value
== 0) && ((byte
& 0x40) == 0))
4242 || ((value
== -1) && ((byte
& 0x40) != 0))));
4254 output_uleb128 (p
, value
)
4262 unsigned byte
= (value
& 0x7f);
4265 /* More bytes to follow. */
4276 output_leb128 (p
, value
, sign
)
4282 return output_sleb128 (p
, (offsetT
) value
);
4284 return output_uleb128 (p
, value
);
4287 /* Do the same for bignums. We combine sizeof with output here in that
4288 we don't output for NULL values of P. It isn't really as critical as
4289 for "normal" values that this be streamlined. */
4292 output_big_sleb128 (p
, bignum
, size
)
4294 LITTLENUM_TYPE
*bignum
;
4302 /* Strip leading sign extensions off the bignum. */
4303 while (size
> 0 && bignum
[size
- 1] == (LITTLENUM_TYPE
) -1)
4308 if (loaded
< 7 && size
> 0)
4310 val
|= (*bignum
<< loaded
);
4311 loaded
+= 8 * CHARS_PER_LITTLENUM
;
4322 if ((val
== 0 && (byte
& 0x40) == 0)
4323 || (~(val
| ~(((valueT
) 1 << loaded
) - 1)) == 0
4324 && (byte
& 0x40) != 0))
4332 while (byte
& 0x80);
4338 output_big_uleb128 (p
, bignum
, size
)
4340 LITTLENUM_TYPE
*bignum
;
4348 /* Strip leading zeros off the bignum. */
4349 /* XXX: Is this needed? */
4350 while (size
> 0 && bignum
[size
- 1] == 0)
4355 if (loaded
< 7 && size
> 0)
4357 val
|= (*bignum
<< loaded
);
4358 loaded
+= 8 * CHARS_PER_LITTLENUM
;
4367 if (size
> 0 || val
)
4374 while (byte
& 0x80);
4380 output_big_leb128 (p
, bignum
, size
, sign
)
4382 LITTLENUM_TYPE
*bignum
;
4386 return output_big_sleb128 (p
, bignum
, size
);
4388 return output_big_uleb128 (p
, bignum
, size
);
4391 /* Generate the appropriate fragments for a given expression to emit a
4395 emit_leb128_expr (exp
, sign
)
4399 operatorT op
= exp
->X_op
;
4401 if (op
== O_absent
|| op
== O_illegal
)
4403 as_warn (_("zero assumed for missing expression"));
4404 exp
->X_add_number
= 0;
4407 else if (op
== O_big
&& exp
->X_add_number
<= 0)
4409 as_bad (_("floating point number invalid; zero assumed"));
4410 exp
->X_add_number
= 0;
4413 else if (op
== O_register
)
4415 as_warn (_("register value used as expression"));
4419 if (op
== O_constant
)
4421 /* If we've got a constant, emit the thing directly right now. */
4423 valueT value
= exp
->X_add_number
;
4427 size
= sizeof_leb128 (value
, sign
);
4428 p
= frag_more (size
);
4429 output_leb128 (p
, value
, sign
);
4431 else if (op
== O_big
)
4433 /* O_big is a different sort of constant. */
4438 size
= output_big_leb128 (NULL
, generic_bignum
, exp
->X_add_number
, sign
);
4439 p
= frag_more (size
);
4440 output_big_leb128 (p
, generic_bignum
, exp
->X_add_number
, sign
);
4444 /* Otherwise, we have to create a variable sized fragment and
4445 resolve things later. */
4447 frag_var (rs_leb128
, sizeof_uleb128 (~(valueT
) 0), 0, sign
,
4448 make_expr_symbol (exp
), 0, (char *) NULL
);
4452 /* Parse the .sleb128 and .uleb128 pseudos. */
4463 emit_leb128_expr (&exp
, sign
);
4465 while (*input_line_pointer
++ == ',');
4467 input_line_pointer
--;
4468 demand_empty_rest_of_line ();
4471 /* We read 0 or more ',' separated, double-quoted strings.
4472 Caller should have checked need_pass_2 is FALSE because we don't
4476 stringer (append_zero
) /* Worker to do .ascii etc statements. */
4477 /* Checks end-of-line. */
4478 register int append_zero
; /* 0: don't append '\0', else 1. */
4480 register unsigned int c
;
4483 #ifdef md_flush_pending_output
4484 md_flush_pending_output ();
4487 /* The following awkward logic is to parse ZERO or more strings,
4488 comma separated. Recall a string expression includes spaces
4489 before the opening '\"' and spaces after the closing '\"'.
4490 We fake a leading ',' if there is (supposed to be)
4491 a 1st, expression. We keep demanding expressions for each ','. */
4492 if (is_it_end_of_statement ())
4494 c
= 0; /* Skip loop. */
4495 ++input_line_pointer
; /* Compensate for end of loop. */
4499 c
= ','; /* Do loop. */
4501 while (c
== ',' || c
== '<' || c
== '"')
4504 switch (*input_line_pointer
)
4507 ++input_line_pointer
; /*->1st char of string. */
4508 start
= input_line_pointer
;
4509 while (is_a_char (c
= next_char_of_string ()))
4511 FRAG_APPEND_1_CHAR (c
);
4515 FRAG_APPEND_1_CHAR (0);
4517 know (input_line_pointer
[-1] == '\"');
4521 /* In ELF, when gcc is emitting DWARF 1 debugging output, it
4522 will emit .string with a filename in the .debug section
4523 after a sequence of constants. See the comment in
4524 emit_expr for the sequence. emit_expr will set
4525 dwarf_file_string to non-zero if this string might be a
4526 source file name. */
4527 if (strcmp (segment_name (now_seg
), ".debug") != 0)
4528 dwarf_file_string
= 0;
4529 else if (dwarf_file_string
)
4531 c
= input_line_pointer
[-1];
4532 input_line_pointer
[-1] = '\0';
4533 listing_source_file (start
);
4534 input_line_pointer
[-1] = c
;
4541 input_line_pointer
++;
4542 c
= get_single_number ();
4543 FRAG_APPEND_1_CHAR (c
);
4544 if (*input_line_pointer
!= '>')
4546 as_bad (_("Expected <nn>"));
4548 input_line_pointer
++;
4551 input_line_pointer
++;
4555 c
= *input_line_pointer
;
4558 demand_empty_rest_of_line ();
4561 /* FIXME-SOMEDAY: I had trouble here on characters with the
4562 high bits set. We'll probably also have trouble with
4563 multibyte chars, wide chars, etc. Also be careful about
4564 returning values bigger than 1 byte. xoxorich. */
4567 next_char_of_string ()
4569 register unsigned int c
;
4571 c
= *input_line_pointer
++ & CHAR_MASK
;
4579 as_warn (_("Unterminated string: Newline inserted."));
4580 bump_line_counters ();
4583 #ifndef NO_STRING_ESCAPES
4585 switch (c
= *input_line_pointer
++)
4613 break; /* As itself. */
4629 for (i
= 0, number
= 0;
4630 isdigit (c
) && i
< 3;
4631 c
= *input_line_pointer
++, i
++)
4633 number
= number
* 8 + c
- '0';
4638 --input_line_pointer
;
4647 c
= *input_line_pointer
++;
4648 while (isxdigit (c
))
4651 number
= number
* 16 + c
- '0';
4652 else if (isupper (c
))
4653 number
= number
* 16 + c
- 'A' + 10;
4655 number
= number
* 16 + c
- 'a' + 10;
4656 c
= *input_line_pointer
++;
4659 --input_line_pointer
;
4664 /* To be compatible with BSD 4.2 as: give the luser a linefeed!! */
4665 as_warn (_("Unterminated string: Newline inserted."));
4667 bump_line_counters ();
4672 #ifdef ONLY_STANDARD_ESCAPES
4673 as_bad (_("Bad escaped character in string, '?' assumed"));
4675 #endif /* ONLY_STANDARD_ESCAPES */
4680 #endif /* ! defined (NO_STRING_ESCAPES) */
4689 get_segmented_expression (expP
)
4690 register expressionS
*expP
;
4692 register segT retval
;
4694 retval
= expression (expP
);
4695 if (expP
->X_op
== O_illegal
4696 || expP
->X_op
== O_absent
4697 || expP
->X_op
== O_big
)
4699 as_bad (_("expected address expression; zero assumed"));
4700 expP
->X_op
= O_constant
;
4701 expP
->X_add_number
= 0;
4702 retval
= absolute_section
;
4708 get_known_segmented_expression (expP
)
4709 register expressionS
*expP
;
4711 register segT retval
;
4713 if ((retval
= get_segmented_expression (expP
)) == undefined_section
)
4715 /* There is no easy way to extract the undefined symbol from the
4717 if (expP
->X_add_symbol
!= NULL
4718 && S_GET_SEGMENT (expP
->X_add_symbol
) != expr_section
)
4719 as_warn (_("symbol \"%s\" undefined; zero assumed"),
4720 S_GET_NAME (expP
->X_add_symbol
));
4722 as_warn (_("some symbol undefined; zero assumed"));
4723 retval
= absolute_section
;
4724 expP
->X_op
= O_constant
;
4725 expP
->X_add_number
= 0;
4727 know (retval
== absolute_section
|| SEG_NORMAL (retval
));
4732 get_absolute_expression ()
4737 if (exp
.X_op
!= O_constant
)
4739 if (exp
.X_op
!= O_absent
)
4740 as_bad (_("bad or irreducible absolute expression; zero assumed"));
4741 exp
.X_add_number
= 0;
4743 return exp
.X_add_number
;
4746 char /* Return terminator. */
4747 get_absolute_expression_and_terminator (val_pointer
)
4748 long *val_pointer
; /* Return value of expression. */
4750 /* FIXME: val_pointer should probably be offsetT *. */
4751 *val_pointer
= (long) get_absolute_expression ();
4752 return (*input_line_pointer
++);
4755 /* Like demand_copy_string, but return NULL if the string contains any '\0's.
4756 Give a warning if that happens. */
4759 demand_copy_C_string (len_pointer
)
4764 if ((s
= demand_copy_string (len_pointer
)) != 0)
4768 for (len
= *len_pointer
; len
> 0; len
--)
4775 as_bad (_("This string may not contain \'\\0\'"));
4783 /* Demand string, but return a safe (=private) copy of the string.
4784 Return NULL if we can't read a string here. */
4787 demand_copy_string (lenP
)
4790 register unsigned int c
;
4796 if (*input_line_pointer
== '\"')
4798 input_line_pointer
++; /* Skip opening quote. */
4800 while (is_a_char (c
= next_char_of_string ()))
4802 obstack_1grow (¬es
, c
);
4805 /* JF this next line is so demand_copy_C_string will return a
4806 null terminated string. */
4807 obstack_1grow (¬es
, '\0');
4808 retval
= obstack_finish (¬es
);
4812 as_warn (_("Missing string"));
4814 ignore_rest_of_line ();
4820 /* In: Input_line_pointer->next character.
4822 Do: Skip input_line_pointer over all whitespace.
4824 Out: 1 if input_line_pointer->end-of-line. */
4827 is_it_end_of_statement ()
4830 return (is_end_of_line
[(unsigned char) *input_line_pointer
]);
4834 equals (sym_name
, reassign
)
4838 register symbolS
*symbolP
; /* Symbol we are working with. */
4842 input_line_pointer
++;
4843 if (*input_line_pointer
== '=')
4844 input_line_pointer
++;
4846 while (*input_line_pointer
== ' ' || *input_line_pointer
== '\t')
4847 input_line_pointer
++;
4850 stop
= mri_comment_field (&stopc
);
4852 if (sym_name
[0] == '.' && sym_name
[1] == '\0')
4854 /* Turn '. = mumble' into a .org mumble. */
4855 register segT segment
;
4858 segment
= get_known_segmented_expression (&exp
);
4860 do_org (segment
, &exp
, 0);
4864 symbolP
= symbol_find_or_make (sym_name
);
4865 /* Permit register names to be redefined. */
4867 && S_IS_DEFINED (symbolP
)
4868 && S_GET_SEGMENT (symbolP
) != reg_section
)
4869 as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP
));
4870 pseudo_set (symbolP
);
4875 /* Check garbage after the expression. */
4876 ignore_rest_of_line ();
4877 mri_comment_end (stop
, stopc
);
4881 /* .include -- include a file at this point. */
4885 int arg ATTRIBUTE_UNUSED
;
4894 filename
= demand_copy_string (&i
);
4895 if (filename
== NULL
)
4897 /* demand_copy_string has already printed an error and
4898 called ignore_rest_of_line. */
4906 while (!is_end_of_line
[(unsigned char) *input_line_pointer
]
4907 && *input_line_pointer
!= ' '
4908 && *input_line_pointer
!= '\t')
4910 obstack_1grow (¬es
, *input_line_pointer
);
4911 ++input_line_pointer
;
4915 obstack_1grow (¬es
, '\0');
4916 filename
= obstack_finish (¬es
);
4917 while (!is_end_of_line
[(unsigned char) *input_line_pointer
])
4918 ++input_line_pointer
;
4921 demand_empty_rest_of_line ();
4922 path
= xmalloc ((unsigned long) i
+ include_dir_maxlen
+ 5 /* slop */ );
4924 for (i
= 0; i
< include_dir_count
; i
++)
4926 strcpy (path
, include_dirs
[i
]);
4928 strcat (path
, filename
);
4929 if (0 != (try = fopen (path
, "r")))
4939 /* malloc Storage leak when file is found on path. FIXME-SOMEDAY. */
4940 register_dependency (path
);
4941 input_scrub_insert_file (path
);
4945 add_include_dir (path
)
4950 if (include_dir_count
== 0)
4952 include_dirs
= (char **) xmalloc (2 * sizeof (*include_dirs
));
4953 include_dirs
[0] = "."; /* Current dir. */
4954 include_dir_count
= 2;
4958 include_dir_count
++;
4960 (char **) realloc (include_dirs
,
4961 include_dir_count
* sizeof (*include_dirs
));
4964 include_dirs
[include_dir_count
- 1] = path
; /* New one. */
4967 if (i
> include_dir_maxlen
)
4968 include_dir_maxlen
= i
;
4971 /* Output debugging information to denote the source file. */
4974 generate_file_debug ()
4976 if (debug_type
== DEBUG_STABS
)
4977 stabs_generate_asm_file ();
4980 /* Output line number debugging information for the current source line. */
4983 generate_lineno_debug ()
4985 #ifdef ECOFF_DEBUGGING
4986 /* ECOFF assemblers automatically generate debugging information.
4987 FIXME: This should probably be handled elsewhere. */
4988 if (debug_type
== DEBUG_UNSPECIFIED
)
4990 if (ECOFF_DEBUGGING
&& ecoff_no_current_file ())
4991 debug_type
= DEBUG_ECOFF
;
4993 debug_type
= DEBUG_NONE
;
4999 case DEBUG_UNSPECIFIED
:
5003 stabs_generate_asm_lineno ();
5006 ecoff_generate_asm_lineno ();
5010 /* This cannot safely be done in a generic manner. A single
5011 binary instruction word may span mutliple lines of assembler
5012 source and may occupy a variable number of bytes. Instead,
5013 if a port wishes to support DWARF2 line number generation by
5014 the assembler, it should add a call to dwarf2_generate_asm_lineno
5015 inside md_assemble() at whatever point is appropriate. Note,
5016 such a port should also define md_end and make sure that
5017 dwarf2_finish is called, to emit the accumulated line information. */
5022 /* Output debugging information to mark a function entry point or end point.
5023 END_P is zero for .func, and non-zero for .endfunc. */
5029 do_s_func (end_p
, NULL
);
5032 /* Subroutine of s_func so targets can choose a different default prefix.
5033 If DEFAULT_PREFIX is NULL, use the target's "leading char". */
5036 do_s_func (end_p
, default_prefix
)
5038 const char *default_prefix
;
5040 /* Record the current function so that we can issue an error message for
5041 misplaced .func,.endfunc, and also so that .endfunc needs no
5043 static char *current_name
;
5044 static char *current_label
;
5048 if (current_name
== NULL
)
5050 as_bad (_("missing .func"));
5051 ignore_rest_of_line ();
5055 if (debug_type
== DEBUG_STABS
)
5056 stabs_generate_asm_endfunc (current_name
, current_label
);
5058 current_name
= current_label
= NULL
;
5063 char delim1
, delim2
;
5065 if (current_name
!= NULL
)
5067 as_bad (_(".endfunc missing for previous .func"));
5068 ignore_rest_of_line ();
5072 name
= input_line_pointer
;
5073 delim1
= get_symbol_end ();
5074 name
= xstrdup (name
);
5075 *input_line_pointer
= delim1
;
5077 if (*input_line_pointer
!= ',')
5080 asprintf (&label
, "%s%s", default_prefix
, name
);
5083 char leading_char
= 0;
5084 #ifdef BFD_ASSEMBLER
5085 leading_char
= bfd_get_symbol_leading_char (stdoutput
);
5087 /* Missing entry point, use function's name with the leading
5090 asprintf (&label
, "%c%s", leading_char
, name
);
5097 ++input_line_pointer
;
5099 label
= input_line_pointer
;
5100 delim2
= get_symbol_end ();
5101 label
= xstrdup (label
);
5102 *input_line_pointer
= delim2
;
5105 if (debug_type
== DEBUG_STABS
)
5106 stabs_generate_asm_func (name
, label
);
5108 current_name
= name
;
5109 current_label
= label
;
5112 demand_empty_rest_of_line ();
5117 int arg ATTRIBUTE_UNUSED
;
5119 while (!is_end_of_line
[(unsigned char) *input_line_pointer
])
5121 ++input_line_pointer
;
5123 ++input_line_pointer
;
5127 read_print_statistics (file
)
5130 hash_print_statistics (file
, "pseudo-op table", po_hash
);
5133 /* Inserts the given line into the input stream.
5135 This call avoids macro/conditionals nesting checking, since the contents of
5136 the line are assumed to replace the contents of a line already scanned.
5138 An appropriate use of this function would be substition of input lines when
5139 called by md_start_line_hook(). The given line is assumed to already be
5140 properly scrubbed. */
5143 input_scrub_insert_line (line
)
5148 sb_add_string (&newline
, line
);
5149 input_scrub_include_sb (&newline
, input_line_pointer
, 0);
5151 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
5154 /* Insert a file into the input stream; the path must resolve to an actual
5155 file; no include path searching or dependency registering is performed. */
5158 input_scrub_insert_file (path
)
5161 input_scrub_include_file (path
, input_line_pointer
);
5162 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);