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 #define MASK_CHAR (0xFF) /* If your chars aren't 8 bits, you will
24 change this a bit. But then, GNU isn't
25 spozed to run on your machine anyway.
26 (RMS is so shortsighted sometimes.)
29 #define MASK_CHAR ((int)(unsigned char)-1)
33 /* This is the largest known floating point format (for now). It will
34 grow when we do 4361 style flonums. */
36 #define MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT (16)
38 /* Routines that read assembler source text to build spagetti in memory.
39 Another group of these functions is in the expr.c module. */
52 #ifndef TC_START_LABEL
53 #define TC_START_LABEL(x,y) (x==':')
56 /* Set by the object-format or the target. */
57 #ifndef TC_IMPLICIT_LCOMM_ALIGNMENT
58 #define TC_IMPLICIT_LCOMM_ALIGNMENT(SIZE, P2VAR) \
62 else if ((SIZE) >= 4) \
64 else if ((SIZE) >= 2) \
71 /* The NOP_OPCODE is for the alignment fill value.
72 * fill it a nop instruction so that the disassembler does not choke
76 #define NOP_OPCODE 0x00
79 char *input_line_pointer
; /*->next char of source file to parse. */
81 #if BITS_PER_CHAR != 8
82 /* The following table is indexed by[(char)] and will break if
83 a char does not have exactly 256 states (hopefully 0:255!)! */
88 /* The m88k unfortunately uses @ as a label beginner. */
93 /* The RS/6000 assembler uses {,},[,] as parts of symbol names. */
98 /* The Delta 68k assembler permits % inside label names. */
103 /* The PowerPC Windows NT assemblers permits ? inside label names. */
108 /* The IA-64 assembler uses # as a suffix designating a symbol. We include
109 it in the symbol and strip it out in tc_canonicalize_symbol_name. */
114 /* The a29k assembler does not permits labels to start with $. */
119 /* The Delta 68k assembler permits ~ at start of label names. */
123 /* used by is_... macros. our ctype[] */
126 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* @ABCDEFGHIJKLMNO */
127 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ[\]^_ */
128 0, 0, 0, LEX_HASH
, LEX_DOLLAR
, LEX_PCT
, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* _!"#$%&'()*+,-./ */
129 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, LEX_QM
, /* 0123456789:;<=>? */
130 LEX_AT
, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* @ABCDEFGHIJKLMNO */
131 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR
, 0, LEX_BR
, 0, 3, /* PQRSTUVWXYZ[\]^_ */
132 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* `abcdefghijklmno */
133 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR
, 0, LEX_BR
, LEX_TILDE
, 0, /* pqrstuvwxyz{|}~. */
134 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
135 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
136 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
137 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
138 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
139 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
140 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
141 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
147 * Out: 1 if this character ends a line.
150 char is_end_of_line
[256] =
153 99, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, 99, Z_
, Z_
, 99, Z_
, Z_
, /* @abcdefghijklmno */
155 99, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, 99, Z_
, Z_
, Z_
, Z_
, Z_
, /* @abcdefghijklmno */
157 Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, /* */
159 Z_
,99, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, /* _!"#$%&'()*+,-./ */
160 Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, /* 0123456789:;<=>? */
162 Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, /* */
163 Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, 99, Z_
, Z_
, Z_
, Z_
, /* 0123456789:;<=>? */
165 Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, /* */
166 Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, /* */
167 Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, /* */
168 Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, /* */
169 Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, /* */
170 Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, /* */
171 Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, /* */
172 Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, /* */
173 Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, Z_
, /* */
177 /* Functions private to this file. */
179 static char *buffer
; /* 1st char of each buffer of lines is here. */
180 static char *buffer_limit
; /*->1 + last char in buffer. */
182 /* TARGET_BYTES_BIG_ENDIAN is required to be defined to either 0 or 1 in the
183 tc-<CPU>.h file. See the "Porting GAS" section of the internals manual. */
184 int target_big_endian
= TARGET_BYTES_BIG_ENDIAN
;
186 static char *old_buffer
; /* JF a hack */
187 static char *old_input
;
188 static char *old_limit
;
190 /* Variables for handling include file directory table. */
192 char **include_dirs
; /* Table of pointers to directories to
193 search for .include's */
194 int include_dir_count
; /* How many are in the table */
195 int include_dir_maxlen
= 1;/* Length of longest in table */
197 #ifndef WORKING_DOT_WORD
198 struct broken_word
*broken_words
;
199 int new_broken_words
;
202 /* The current offset into the absolute section. We don't try to
203 build frags in the absolute section, since no data can be stored
204 there. We just keep track of the current offset. */
205 addressT abs_section_offset
;
207 /* If this line had an MRI style label, it is stored in this variable.
208 This is used by some of the MRI pseudo-ops. */
211 /* This global variable is used to support MRI common sections. We
212 translate such sections into a common symbol. This variable is
213 non-NULL when we are in an MRI common section. */
214 symbolS
*mri_common_symbol
;
216 /* In MRI mode, after a dc.b pseudo-op with an odd number of bytes, we
217 need to align to an even byte boundary unless the next pseudo-op is
218 dc.b, ds.b, or dcb.b. This variable is set to 1 if an alignment
220 static int mri_pending_align
;
224 /* This variable is set to be non-zero if the next string we see might
225 be the name of the source file in DWARF debugging information. See
226 the comment in emit_expr for the format we look for. */
227 static int dwarf_file_string
;
231 static void cons_worker
PARAMS ((int, int));
232 static int scrub_from_string
PARAMS ((char *, int));
233 static void do_align
PARAMS ((int, char *, int, int));
234 static void s_align
PARAMS ((int, int));
235 static void s_lcomm_internal
PARAMS ((int, int));
236 static int hex_float
PARAMS ((int, char *));
237 static inline int sizeof_sleb128
PARAMS ((offsetT
));
238 static inline int sizeof_uleb128
PARAMS ((valueT
));
239 static inline int output_sleb128
PARAMS ((char *, offsetT
));
240 static inline int output_uleb128
PARAMS ((char *, valueT
));
241 static inline int output_big_sleb128
PARAMS ((char *, LITTLENUM_TYPE
*, int));
242 static inline int output_big_uleb128
PARAMS ((char *, LITTLENUM_TYPE
*, int));
243 static int output_big_leb128
PARAMS ((char *, LITTLENUM_TYPE
*, int, int));
244 static void do_org
PARAMS ((segT
, expressionS
*, int));
245 char *demand_copy_string
PARAMS ((int *lenP
));
246 static segT get_segmented_expression
PARAMS ((expressionS
*expP
));
247 static segT get_known_segmented_expression
PARAMS ((expressionS
* expP
));
248 static void pobegin
PARAMS ((void));
249 static int get_line_sb
PARAMS ((sb
*));
250 static void generate_file_debug
PARAMS ((void));
259 obj_read_begin_hook ();
261 /* Something close -- but not too close -- to a multiple of 1024.
262 The debugging malloc I'm using has 24 bytes of overhead. */
263 obstack_begin (¬es
, chunksize
);
264 obstack_begin (&cond_obstack
, chunksize
);
266 /* Use machine dependent syntax */
267 for (p
= line_separator_chars
; *p
; p
++)
268 is_end_of_line
[(unsigned char) *p
] = 1;
269 /* Use more. FIXME-SOMEDAY. */
275 /* set up pseudo-op tables */
277 static struct hash_control
*po_hash
;
279 static const pseudo_typeS potable
[] =
281 {"abort", s_abort
, 0},
282 {"align", s_align_ptwo
, 0},
283 {"ascii", stringer
, 0},
284 {"asciz", stringer
, 1},
285 {"balign", s_align_bytes
, 0},
286 {"balignw", s_align_bytes
, -2},
287 {"balignl", s_align_bytes
, -4},
291 {"common", s_mri_common
, 0},
292 {"common.s", s_mri_common
, 1},
296 {"dc.d", float_cons
, 'd'},
298 {"dc.s", float_cons
, 'f'},
300 {"dc.x", float_cons
, 'x'},
302 {"dcb.b", s_space
, 1},
303 {"dcb.d", s_float_space
, 'd'},
304 {"dcb.l", s_space
, 4},
305 {"dcb.s", s_float_space
, 'f'},
306 {"dcb.w", s_space
, 2},
307 {"dcb.x", s_float_space
, 'x'},
309 {"ds.b", s_space
, 1},
310 {"ds.d", s_space
, 8},
311 {"ds.l", s_space
, 4},
312 {"ds.p", s_space
, 12},
313 {"ds.s", s_space
, 4},
314 {"ds.w", s_space
, 2},
315 {"ds.x", s_space
, 12},
316 {"debug", s_ignore
, 0},
321 {"double", float_cons
, 'd'},
323 {"eject", listing_eject
, 0}, /* Formfeed listing */
325 {"elsec", s_else
, 0},
326 {"elseif", s_elseif
, (int) O_ne
},
328 {"endc", s_endif
, 0},
329 {"endfunc", s_func
, 1},
330 {"endif", s_endif
, 0},
335 {"exitm", s_mexit
, 0},
337 {"extern", s_ignore
, 0}, /* We treat all undef as ext */
338 {"appfile", s_app_file
, 1},
339 {"appline", s_app_line
, 0},
341 {"file", s_app_file
, 0},
343 {"float", float_cons
, 'f'},
344 {"format", s_ignore
, 0},
346 {"global", s_globl
, 0},
347 {"globl", s_globl
, 0},
349 {"if", s_if
, (int) O_ne
},
351 {"ifdef", s_ifdef
, 0},
352 {"ifeq", s_if
, (int) O_eq
},
353 {"ifeqs", s_ifeqs
, 0},
354 {"ifge", s_if
, (int) O_ge
},
355 {"ifgt", s_if
, (int) O_gt
},
356 {"ifle", s_if
, (int) O_le
},
357 {"iflt", s_if
, (int) O_lt
},
359 {"ifndef", s_ifdef
, 1},
360 {"ifne", s_if
, (int) O_ne
},
361 {"ifnes", s_ifeqs
, 1},
362 {"ifnotdef", s_ifdef
, 1},
363 {"include", s_include
, 0},
369 {"lcomm", s_lcomm
, 0},
370 {"lflags", listing_flags
, 0}, /* Listing flags */
371 {"linkonce", s_linkonce
, 0},
372 {"list", listing_list
, 1}, /* Turn listing on */
373 {"llen", listing_psize
, 1},
376 {"macro", s_macro
, 0},
377 {"mexit", s_mexit
, 0},
379 {".mri", s_mri
, 0}, /* Special case so .mri works in MRI mode. */
380 {"name", s_ignore
, 0},
381 {"noformat", s_ignore
, 0},
382 {"nolist", listing_list
, 0}, /* Turn listing off */
383 {"nopage", listing_nopage
, 0},
385 {"offset", s_struct
, 0},
387 {"p2align", s_align_ptwo
, 0},
388 {"p2alignw", s_align_ptwo
, -2},
389 {"p2alignl", s_align_ptwo
, -4},
390 {"page", listing_eject
, 0},
391 {"plen", listing_psize
, 0},
392 {"print", s_print
, 0},
393 {"psize", listing_psize
, 0}, /* set paper size */
394 {"purgem", s_purgem
, 0},
399 {"sbttl", listing_title
, 1}, /* Subtitle of listing */
404 {"single", float_cons
, 'f'},
406 {"space", s_space
, 0},
407 {"skip", s_space
, 0},
408 {"sleb128", s_leb128
, 1},
409 {"spc", s_ignore
, 0},
410 {"stabd", s_stab
, 'd'},
411 {"stabn", s_stab
, 'n'},
412 {"stabs", s_stab
, 's'},
413 {"string", stringer
, 1},
414 {"struct", s_struct
, 0},
418 /* This is for gcc to use. It's only just been added (2/94), so gcc
419 won't be able to use it for a while -- probably a year or more.
420 But once this has been released, check with gcc maintainers
421 before deleting it or even changing the spelling. */
422 {"this_GCC_requires_the_GNU_assembler", s_ignore
, 0},
423 /* If we're folding case -- done for some targets, not necessarily
424 all -- the above string in an input file will be converted to
425 this one. Match it either way... */
426 {"this_gcc_requires_the_gnu_assembler", s_ignore
, 0},
428 {"title", listing_title
, 0}, /* Listing title */
429 {"ttl", listing_title
, 0},
431 {"uleb128", s_leb128
, 0},
435 {"xdef", s_globl
, 0},
436 {"xref", s_ignore
, 0},
437 {"xstabs", s_xstab
, 's'},
439 {"zero", s_space
, 0},
440 {NULL
, NULL
, 0} /* end sentinel */
443 static int pop_override_ok
= 0;
444 static const char *pop_table_name
;
448 const pseudo_typeS
*table
;
451 const pseudo_typeS
*pop
;
452 for (pop
= table
; pop
->poc_name
; pop
++)
454 errtxt
= hash_insert (po_hash
, pop
->poc_name
, (char *) pop
);
455 if (errtxt
&& (!pop_override_ok
|| strcmp (errtxt
, "exists")))
456 as_fatal (_("error constructing %s pseudo-op table: %s"), pop_table_name
,
461 #ifndef md_pop_insert
462 #define md_pop_insert() pop_insert(md_pseudo_table)
465 #ifndef obj_pop_insert
466 #define obj_pop_insert() pop_insert(obj_pseudo_table)
472 po_hash
= hash_new ();
474 /* Do the target-specific pseudo ops. */
475 pop_table_name
= "md";
478 /* Now object specific. Skip any that were in the target table. */
479 pop_table_name
= "obj";
483 /* Now portable ones. Skip any that we've seen already. */
484 pop_table_name
= "standard";
485 pop_insert (potable
);
488 #define HANDLE_CONDITIONAL_ASSEMBLY() \
489 if (ignore_input ()) \
491 while (! is_end_of_line[(unsigned char) *input_line_pointer++]) \
492 if (input_line_pointer == buffer_limit) \
498 /* This function is used when scrubbing the characters between #APP
501 static char *scrub_string
;
502 static char *scrub_string_end
;
505 scrub_from_string (buf
, buflen
)
511 copy
= scrub_string_end
- scrub_string
;
514 memcpy (buf
, scrub_string
, copy
);
515 scrub_string
+= copy
;
519 /* read_a_source_file()
521 * We read the file, putting things into a web that
522 * represents what we have been reading.
525 read_a_source_file (name
)
529 register char *s
; /* string of symbol, '\0' appended */
533 buffer
= input_scrub_new_file (name
);
536 listing_newline (NULL
);
537 register_dependency (name
);
539 /* Generate debugging information before we've read anything in to denote
540 this file as the "main" source file and not a subordinate one
541 (e.g. N_SO vs N_SOL in stabs). */
542 generate_file_debug ();
544 while ((buffer_limit
= input_scrub_next_buffer (&input_line_pointer
)) != 0)
545 { /* We have another line to parse. */
546 know (buffer_limit
[-1] == '\n'); /* Must have a sentinel. */
547 contin
: /* JF this goto is my fault I admit it.
548 Someone brave please re-write the whole
549 input section here? Pleeze??? */
550 while (input_line_pointer
< buffer_limit
)
552 /* We have more of this buffer to parse. */
555 * We now have input_line_pointer->1st char of next line.
556 * If input_line_pointer [-1] == '\n' then we just
557 * scanned another line: so bump line counters.
559 if (is_end_of_line
[(unsigned char) input_line_pointer
[-1]])
561 #ifdef md_start_line_hook
562 md_start_line_hook ();
565 if (input_line_pointer
[-1] == '\n')
566 bump_line_counters ();
570 if (LABELS_WITHOUT_COLONS
|| flag_m68k_mri
)
572 /* Text at the start of a line must be a label, we
573 run down and stick a colon in. */
574 if (is_name_beginner (*input_line_pointer
))
576 char *line_start
= input_line_pointer
;
581 HANDLE_CONDITIONAL_ASSEMBLY ();
583 c
= get_symbol_end ();
585 /* In MRI mode, the EQU and MACRO pseudoops must
586 be handled specially. */
590 char *rest
= input_line_pointer
+ 1;
594 if (*rest
== ' ' || *rest
== '\t')
596 if ((strncasecmp (rest
, "EQU", 3) == 0
597 || strncasecmp (rest
, "SET", 3) == 0)
598 && (rest
[3] == ' ' || rest
[3] == '\t'))
600 input_line_pointer
= rest
+ 3;
602 strncasecmp (rest
, "SET", 3) == 0);
605 if (strncasecmp (rest
, "MACRO", 5) == 0
608 || is_end_of_line
[(unsigned char) rest
[5]]))
612 /* In MRI mode, we need to handle the MACRO
613 pseudo-op specially: we don't want to put the
614 symbol in the symbol table. */
616 #ifdef TC_START_LABEL_WITHOUT_COLON
617 && TC_START_LABEL_WITHOUT_COLON(c
,
621 line_label
= colon (line_start
);
623 line_label
= symbol_create (line_start
,
628 *input_line_pointer
= c
;
630 input_line_pointer
++;
636 * We are at the begining of a line, or similar place.
637 * We expect a well-formed assembler statement.
638 * A "symbol-name:" is a statement.
640 * Depending on what compiler is used, the order of these tests
641 * may vary to catch most common case 1st.
642 * Each test is independent of all other tests at the (top) level.
643 * PLEASE make a compiler that doesn't use this assembler.
644 * It is crufty to waste a compiler's time encoding things for this
645 * assembler, which then wastes more time decoding it.
646 * (And communicating via (linear) files is silly!
647 * If you must pass stuff, please pass a tree!)
649 if ((c
= *input_line_pointer
++) == '\t'
654 c
= *input_line_pointer
++;
656 know (c
!= ' '); /* No further leading whitespace. */
659 /* If listing is on, and we are expanding a macro, then give
660 the listing code the contents of the expanded line. */
663 if ((listing
& LISTING_MACEXP
) && macro_nest
> 0)
668 /* Find the end of the current expanded macro line. */
669 for (s
= input_line_pointer
-1; *s
; ++s
)
670 if (is_end_of_line
[(unsigned char) *s
])
673 /* Copy it for safe keeping. Also give an indication of
674 how much macro nesting is involved at this point. */
675 len
= s
- (input_line_pointer
-1);
676 copy
= (char *) xmalloc (len
+ macro_nest
+ 2);
677 memset (copy
, '>', macro_nest
);
678 copy
[macro_nest
] = ' ';
679 memcpy (copy
+ macro_nest
+ 1, input_line_pointer
-1, len
);
680 copy
[macro_nest
+1+len
] = '\0';
682 /* Install the line with the listing facility. */
683 listing_newline (copy
);
686 listing_newline (NULL
);
691 * C is the 1st significant character.
692 * Input_line_pointer points after that character.
694 if (is_name_beginner (c
))
696 /* want user-defined label or pseudo/opcode */
697 HANDLE_CONDITIONAL_ASSEMBLY ();
699 s
= --input_line_pointer
;
700 c
= get_symbol_end (); /* name's delimiter */
702 * C is character after symbol.
703 * That character's place in the input line is now '\0'.
704 * S points to the beginning of the symbol.
705 * [In case of pseudo-op, s->'.'.]
706 * Input_line_pointer->'\0' where c was.
708 if (TC_START_LABEL(c
, input_line_pointer
))
712 char *rest
= input_line_pointer
+ 1;
714 /* In MRI mode, \tsym: set 0 is permitted. */
718 if (*rest
== ' ' || *rest
== '\t')
720 if ((strncasecmp (rest
, "EQU", 3) == 0
721 || strncasecmp (rest
, "SET", 3) == 0)
722 && (rest
[3] == ' ' || rest
[3] == '\t'))
724 input_line_pointer
= rest
+ 3;
730 line_label
= colon (s
); /* user-defined label */
731 *input_line_pointer
++ = ':'; /* Put ':' back for error messages' sake. */
732 /* Input_line_pointer->after ':'. */
738 || ((c
== ' ' || c
== '\t')
739 && input_line_pointer
[1] == '='
740 #ifdef TC_EQUAL_IN_INSN
741 && ! TC_EQUAL_IN_INSN (c
, input_line_pointer
)
746 demand_empty_rest_of_line ();
749 { /* expect pseudo-op or machine instruction */
752 #define IGNORE_OPCODE_CASE
753 #ifdef IGNORE_OPCODE_CASE
758 if (isupper ((unsigned char) *s2
))
765 if (NO_PSEUDO_DOT
|| flag_m68k_mri
)
767 /* The MRI assembler and the m88k use pseudo-ops
769 pop
= (pseudo_typeS
*) hash_find (po_hash
, s
);
770 if (pop
!= NULL
&& pop
->poc_handler
== NULL
)
775 || (! flag_m68k_mri
&& *s
== '.'))
780 * WARNING: c has next char, which may be end-of-line.
781 * We lookup the pseudo-op table with s+1 because we
782 * already know that the pseudo-op begins with a '.'.
786 pop
= (pseudo_typeS
*) hash_find (po_hash
, s
+ 1);
788 /* In MRI mode, we may need to insert an
789 automatic alignment directive. What a hack
791 if (mri_pending_align
793 || ! ((pop
->poc_handler
== cons
794 && pop
->poc_val
== 1)
795 || (pop
->poc_handler
== s_space
796 && pop
->poc_val
== 1)
797 #ifdef tc_conditional_pseudoop
798 || tc_conditional_pseudoop (pop
)
800 || pop
->poc_handler
== s_if
801 || pop
->poc_handler
== s_ifdef
802 || pop
->poc_handler
== s_ifc
803 || pop
->poc_handler
== s_ifeqs
804 || pop
->poc_handler
== s_else
805 || pop
->poc_handler
== s_endif
806 || pop
->poc_handler
== s_globl
807 || pop
->poc_handler
== s_ignore
)))
809 do_align (1, (char *) NULL
, 0, 0);
810 mri_pending_align
= 0;
811 if (line_label
!= NULL
)
813 symbol_set_frag (line_label
, frag_now
);
814 S_SET_VALUE (line_label
, frag_now_fix ());
818 /* Print the error msg now, while we still can */
821 as_bad (_("Unknown pseudo-op: `%s'"), s
);
822 *input_line_pointer
= c
;
827 /* Put it back for error messages etc. */
828 *input_line_pointer
= c
;
829 /* The following skip of whitespace is compulsory.
830 A well shaped space is sometimes all that separates
831 keyword from operands. */
832 if (c
== ' ' || c
== '\t')
833 input_line_pointer
++;
835 * Input_line is restored.
836 * Input_line_pointer->1st non-blank char
837 * after pseudo-operation.
839 (*pop
->poc_handler
) (pop
->poc_val
);
841 /* If that was .end, just get out now. */
842 if (pop
->poc_handler
== s_end
)
848 #ifdef QUOTES_IN_INSN
852 /* WARNING: c has char, which may be end-of-line. */
853 /* Also: input_line_pointer->`\0` where c was. */
854 *input_line_pointer
= c
;
855 while (!is_end_of_line
[(unsigned char) *input_line_pointer
]
857 #ifdef TC_EOL_IN_INSN
858 || TC_EOL_IN_INSN (input_line_pointer
)
862 if (flag_m68k_mri
&& *input_line_pointer
== '\'')
864 #ifdef QUOTES_IN_INSN
867 else if (*input_line_pointer
== '"')
869 else if (*input_line_pointer
== '\\')
872 input_line_pointer
++;
875 c
= *input_line_pointer
;
876 *input_line_pointer
= '\0';
878 generate_lineno_debug ();
886 if (check_macro (s
, &out
, '\0', &err
, ¯o
))
890 *input_line_pointer
++ = c
;
891 input_scrub_include_sb (&out
,
892 input_line_pointer
, 1);
895 input_scrub_next_buffer (&input_line_pointer
);
897 md_macro_info (macro
);
903 if (mri_pending_align
)
905 do_align (1, (char *) NULL
, 0, 0);
906 mri_pending_align
= 0;
907 if (line_label
!= NULL
)
909 symbol_set_frag (line_label
, frag_now
);
910 S_SET_VALUE (line_label
, frag_now_fix ());
914 md_assemble (s
); /* Assemble 1 instruction. */
916 *input_line_pointer
++ = c
;
918 /* We resume loop AFTER the end-of-line from
923 } /* if (is_name_beginner(c) */
926 /* Empty statement? */
927 if (is_end_of_line
[(unsigned char) c
])
930 if ((LOCAL_LABELS_DOLLAR
|| LOCAL_LABELS_FB
)
931 && isdigit ((unsigned char) c
))
933 /* local label ("4:") */
934 char *backup
= input_line_pointer
;
936 HANDLE_CONDITIONAL_ASSEMBLY ();
940 while (isdigit ((unsigned char) *input_line_pointer
))
942 temp
= (temp
* 10) + *input_line_pointer
- '0';
943 ++input_line_pointer
;
944 } /* read the whole number */
946 if (LOCAL_LABELS_DOLLAR
947 && *input_line_pointer
== '$'
948 && *(input_line_pointer
+ 1) == ':')
950 input_line_pointer
+= 2;
952 if (dollar_label_defined (temp
))
954 as_fatal (_("label \"%d$\" redefined"), temp
);
957 define_dollar_label (temp
);
958 colon (dollar_label_name (temp
, 0));
963 && *input_line_pointer
++ == ':')
965 fb_label_instance_inc (temp
);
966 colon (fb_label_name (temp
, 0));
970 input_line_pointer
= backup
;
971 } /* local label ("4:") */
973 if (c
&& strchr (line_comment_chars
, c
))
974 { /* Its a comment. Better say APP or NO_APP */
978 unsigned int new_length
;
981 bump_line_counters ();
982 s
= input_line_pointer
;
983 if (strncmp (s
, "APP\n", 4))
984 continue; /* We ignore it */
987 ends
= strstr (s
, "#NO_APP\n");
991 unsigned int tmp_len
;
994 /* The end of the #APP wasn't in this buffer. We
995 keep reading in buffers until we find the #NO_APP
996 that goes with this #APP There is one. The specs
998 tmp_len
= buffer_limit
- s
;
999 tmp_buf
= xmalloc (tmp_len
+ 1);
1000 memcpy (tmp_buf
, s
, tmp_len
);
1003 new_tmp
= input_scrub_next_buffer (&buffer
);
1007 buffer_limit
= new_tmp
;
1008 input_line_pointer
= buffer
;
1009 ends
= strstr (buffer
, "#NO_APP\n");
1011 num
= ends
- buffer
;
1013 num
= buffer_limit
- buffer
;
1015 tmp_buf
= xrealloc (tmp_buf
, tmp_len
+ num
);
1016 memcpy (tmp_buf
+ tmp_len
, buffer
, num
);
1021 input_line_pointer
= ends
? ends
+ 8 : NULL
;
1029 input_line_pointer
= ends
+ 8;
1033 scrub_string_end
= ends
;
1035 new_length
= ends
- s
;
1036 new_buf
= (char *) xmalloc (new_length
);
1043 space
= (new_buf
+ new_length
) - new_tmp
;
1044 size
= do_scrub_chars (scrub_from_string
, new_tmp
, space
);
1052 new_buf
= xrealloc (new_buf
, new_length
+ 100);
1053 new_tmp
= new_buf
+ new_length
;
1059 old_buffer
= buffer
;
1060 old_input
= input_line_pointer
;
1061 old_limit
= buffer_limit
;
1063 input_line_pointer
= new_buf
;
1064 buffer_limit
= new_tmp
;
1068 HANDLE_CONDITIONAL_ASSEMBLY ();
1070 #ifdef tc_unrecognized_line
1071 if (tc_unrecognized_line (c
))
1075 /* as_warn("Junk character %d.",c); Now done by ignore_rest */
1076 input_line_pointer
--; /* Report unknown char as ignored. */
1077 ignore_rest_of_line ();
1078 } /* while (input_line_pointer<buffer_limit) */
1080 #ifdef md_after_pass_hook
1081 md_after_pass_hook ();
1087 bump_line_counters ();
1090 buffer
= old_buffer
;
1091 input_line_pointer
= old_input
;
1092 buffer_limit
= old_limit
;
1097 } /* while (more buffers to scan) */
1104 input_scrub_close (); /* Close the input file */
1107 /* For most MRI pseudo-ops, the line actually ends at the first
1108 nonquoted space. This function looks for that point, stuffs a null
1109 in, and sets *STOPCP to the character that used to be there, and
1110 returns the location.
1112 Until I hear otherwise, I am going to assume that this is only true
1113 for the m68k MRI assembler. */
1116 mri_comment_field (stopcp
)
1124 know (flag_m68k_mri
);
1126 for (s
= input_line_pointer
;
1127 ((! is_end_of_line
[(unsigned char) *s
] && *s
!= ' ' && *s
!= '\t')
1132 inquote
= ! inquote
;
1142 for (s
= input_line_pointer
; ! is_end_of_line
[(unsigned char) *s
]; s
++)
1152 /* Skip to the end of an MRI comment field. */
1155 mri_comment_end (stop
, stopc
)
1161 input_line_pointer
= stop
;
1163 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
1164 ++input_line_pointer
;
1169 int ignore ATTRIBUTE_UNUSED
;
1171 as_fatal (_(".abort detected. Abandoning ship."));
1174 /* Guts of .align directive. N is the power of two to which to align.
1175 FILL may be NULL, or it may point to the bytes of the fill pattern.
1176 LEN is the length of whatever FILL points to, if anything. MAX is
1177 the maximum number of characters to skip when doing the alignment,
1178 or 0 if there is no maximum. */
1181 do_align (n
, fill
, len
, max
)
1190 md_do_align (n
, fill
, len
, max
, just_record_alignment
);
1195 if (subseg_text_p (now_seg
))
1196 default_fill
= NOP_OPCODE
;
1199 fill
= &default_fill
;
1203 /* Only make a frag if we HAVE to. . . */
1204 if (n
!= 0 && !need_pass_2
)
1207 frag_align (n
, *fill
, max
);
1209 frag_align_pattern (n
, fill
, len
, max
);
1213 just_record_alignment
:
1216 record_alignment (now_seg
, n
- OCTETS_PER_BYTE_POWER
);
1219 /* Handle the .align pseudo-op. A positive ARG is a default alignment
1220 (in bytes). A negative ARG is the negative of the length of the
1221 fill pattern. BYTES_P is non-zero if the alignment value should be
1222 interpreted as the byte boundary, rather than the power of 2. */
1225 s_align (arg
, bytes_p
)
1229 register unsigned int align
;
1237 stop
= mri_comment_field (&stopc
);
1239 if (is_end_of_line
[(unsigned char) *input_line_pointer
])
1244 align
= arg
; /* Default value from pseudo-op table */
1248 align
= get_absolute_expression ();
1254 /* Convert to a power of 2. */
1259 for (i
= 0; (align
& 1) == 0; align
>>= 1, ++i
)
1262 as_bad (_("Alignment not a power of 2"));
1270 as_bad (_("Alignment too large: %u assumed"), align
);
1273 if (*input_line_pointer
!= ',')
1280 ++input_line_pointer
;
1281 if (*input_line_pointer
== ',')
1285 fill
= get_absolute_expression ();
1290 if (*input_line_pointer
!= ',')
1294 ++input_line_pointer
;
1295 max
= get_absolute_expression ();
1302 as_warn (_("expected fill pattern missing"));
1303 do_align (align
, (char *) NULL
, 0, max
);
1318 do_align (align
, &fill_char
, fill_len
, max
);
1324 if ((size_t) fill_len
> sizeof ab
)
1326 md_number_to_chars (ab
, fill
, fill_len
);
1327 do_align (align
, ab
, fill_len
, max
);
1331 demand_empty_rest_of_line ();
1334 mri_comment_end (stop
, stopc
);
1337 /* Handle the .align pseudo-op on machines where ".align 4" means
1338 align to a 4 byte boundary. */
1347 /* Handle the .align pseudo-op on machines where ".align 4" means align
1348 to a 2**4 boundary. */
1359 int ignore ATTRIBUTE_UNUSED
;
1361 register char *name
;
1365 register symbolS
*symbolP
;
1370 stop
= mri_comment_field (&stopc
);
1372 name
= input_line_pointer
;
1373 c
= get_symbol_end ();
1374 /* just after name is now '\0' */
1375 p
= input_line_pointer
;
1378 if (*input_line_pointer
!= ',')
1380 as_bad (_("Expected comma after symbol-name: rest of line ignored."));
1381 ignore_rest_of_line ();
1383 mri_comment_end (stop
, stopc
);
1386 input_line_pointer
++; /* skip ',' */
1387 if ((temp
= get_absolute_expression ()) < 0)
1389 as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) temp
);
1390 ignore_rest_of_line ();
1392 mri_comment_end (stop
, stopc
);
1396 symbolP
= symbol_find_or_make (name
);
1398 if (S_IS_DEFINED (symbolP
) && ! S_IS_COMMON (symbolP
))
1400 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
1401 S_GET_NAME (symbolP
));
1402 ignore_rest_of_line ();
1404 mri_comment_end (stop
, stopc
);
1407 if (S_GET_VALUE (symbolP
))
1409 if (S_GET_VALUE (symbolP
) != (valueT
) temp
)
1410 as_bad (_("Length of .comm \"%s\" is already %ld. Not changed to %ld."),
1411 S_GET_NAME (symbolP
),
1412 (long) S_GET_VALUE (symbolP
),
1417 S_SET_VALUE (symbolP
, (valueT
) temp
);
1418 S_SET_EXTERNAL (symbolP
);
1422 extern int flag_one
;
1423 if ( (!temp
) || !flag_one
)
1424 S_GET_OTHER(symbolP
) = const_flag
;
1426 #endif /* not OBJ_VMS */
1427 know (symbolP
->sy_frag
== &zero_address_frag
);
1429 demand_empty_rest_of_line ();
1432 mri_comment_end (stop
, stopc
);
1435 /* The MRI COMMON pseudo-op. We handle this by creating a common
1436 symbol with the appropriate name. We make s_space do the right
1437 thing by increasing the size. */
1440 s_mri_common (small
)
1441 int small ATTRIBUTE_UNUSED
;
1457 stop
= mri_comment_field (&stopc
);
1461 name
= input_line_pointer
;
1462 if (! isdigit ((unsigned char) *name
))
1463 c
= get_symbol_end ();
1468 ++input_line_pointer
;
1470 while (isdigit ((unsigned char) *input_line_pointer
));
1471 c
= *input_line_pointer
;
1472 *input_line_pointer
= '\0';
1474 if (line_label
!= NULL
)
1476 alc
= (char *) xmalloc (strlen (S_GET_NAME (line_label
))
1477 + (input_line_pointer
- name
)
1479 sprintf (alc
, "%s%s", name
, S_GET_NAME (line_label
));
1484 sym
= symbol_find_or_make (name
);
1485 *input_line_pointer
= c
;
1489 if (*input_line_pointer
!= ',')
1493 ++input_line_pointer
;
1494 align
= get_absolute_expression ();
1497 if (S_IS_DEFINED (sym
) && ! S_IS_COMMON (sym
))
1499 as_bad (_("attempt to re-define symbol `%s'"), S_GET_NAME (sym
));
1500 ignore_rest_of_line ();
1501 mri_comment_end (stop
, stopc
);
1505 S_SET_EXTERNAL (sym
);
1506 mri_common_symbol
= sym
;
1510 S_SET_ALIGN (sym
, align
);
1513 if (line_label
!= NULL
)
1516 exp
.X_op
= O_symbol
;
1517 exp
.X_add_symbol
= sym
;
1518 exp
.X_add_number
= 0;
1519 symbol_set_value_expression (line_label
, &exp
);
1520 symbol_set_frag (line_label
, &zero_address_frag
);
1521 S_SET_SEGMENT (line_label
, expr_section
);
1524 /* FIXME: We just ignore the small argument, which distinguishes
1525 COMMON and COMMON.S. I don't know what we can do about it. */
1527 /* Ignore the type and hptype. */
1528 if (*input_line_pointer
== ',')
1529 input_line_pointer
+= 2;
1530 if (*input_line_pointer
== ',')
1531 input_line_pointer
+= 2;
1533 demand_empty_rest_of_line ();
1535 mri_comment_end (stop
, stopc
);
1540 int ignore ATTRIBUTE_UNUSED
;
1545 temp
= get_absolute_expression ();
1546 if (flag_readonly_data_in_text
)
1548 section
= text_section
;
1552 section
= data_section
;
1554 subseg_set (section
, (subsegT
) temp
);
1559 demand_empty_rest_of_line ();
1562 /* Handle the .appfile pseudo-op. This is automatically generated by
1563 do_scrub_chars when a preprocessor # line comment is seen with a
1564 file name. This default definition may be overridden by the object
1565 or CPU specific pseudo-ops. This function is also the default
1566 definition for .file; the APPFILE argument is 1 for .appfile, 0 for
1570 s_app_file (appfile
)
1576 /* Some assemblers tolerate immediately following '"' */
1577 if ((s
= demand_copy_string (&length
)) != 0)
1579 /* If this is a fake .appfile, a fake newline was inserted into
1580 the buffer. Passing -2 to new_logical_line tells it to
1583 = (! new_logical_line (s
, appfile
? -2 : -1) && appfile
);
1585 /* In MRI mode, the preprocessor may have inserted an extraneous
1588 && *input_line_pointer
== '\''
1589 && is_end_of_line
[(unsigned char) input_line_pointer
[1]])
1590 ++input_line_pointer
;
1592 demand_empty_rest_of_line ();
1597 listing_source_file (s
);
1599 register_dependency (s
);
1607 /* Handle the .appline pseudo-op. This is automatically generated by
1608 do_scrub_chars when a preprocessor # line comment is seen. This
1609 default definition may be overridden by the object or CPU specific
1614 int ignore ATTRIBUTE_UNUSED
;
1618 /* The given number is that of the next line. */
1619 l
= get_absolute_expression () - 1;
1621 /* Some of the back ends can't deal with non-positive line numbers.
1622 Besides, it's silly. */
1623 as_warn (_("Line numbers must be positive; line number %d rejected."), l
+1);
1626 new_logical_line ((char *) NULL
, l
);
1629 listing_source_line (l
);
1632 demand_empty_rest_of_line ();
1635 /* Handle the .end pseudo-op. Actually, the real work is done in
1636 read_a_source_file. */
1640 int ignore ATTRIBUTE_UNUSED
;
1644 /* The MRI assembler permits the start symbol to follow .end,
1645 but we don't support that. */
1647 if (! is_end_of_line
[(unsigned char) *input_line_pointer
]
1648 && *input_line_pointer
!= '*'
1649 && *input_line_pointer
!= '!')
1650 as_warn (_("start address not supported"));
1654 /* Handle the .err pseudo-op. */
1658 int ignore ATTRIBUTE_UNUSED
;
1660 as_bad (_(".err encountered"));
1661 demand_empty_rest_of_line ();
1664 /* Handle the MRI fail pseudo-op. */
1668 int ignore ATTRIBUTE_UNUSED
;
1675 stop
= mri_comment_field (&stopc
);
1677 temp
= get_absolute_expression ();
1679 as_warn (_(".fail %ld encountered"), (long) temp
);
1681 as_bad (_(".fail %ld encountered"), (long) temp
);
1683 demand_empty_rest_of_line ();
1686 mri_comment_end (stop
, stopc
);
1691 int ignore ATTRIBUTE_UNUSED
;
1693 expressionS rep_exp
;
1695 register long fill
= 0;
1698 #ifdef md_flush_pending_output
1699 md_flush_pending_output ();
1702 get_known_segmented_expression (&rep_exp
);
1703 if (*input_line_pointer
== ',')
1705 input_line_pointer
++;
1706 size
= get_absolute_expression ();
1707 if (*input_line_pointer
== ',')
1709 input_line_pointer
++;
1710 fill
= get_absolute_expression ();
1714 /* This is to be compatible with BSD 4.2 AS, not for any rational reason. */
1715 #define BSD_FILL_SIZE_CROCK_8 (8)
1716 if (size
> BSD_FILL_SIZE_CROCK_8
)
1718 as_warn (_(".fill size clamped to %d."), BSD_FILL_SIZE_CROCK_8
);
1719 size
= BSD_FILL_SIZE_CROCK_8
;
1723 as_warn (_("Size negative: .fill ignored."));
1726 else if (rep_exp
.X_op
== O_constant
&& rep_exp
.X_add_number
<= 0)
1728 if (rep_exp
.X_add_number
< 0)
1729 as_warn (_("Repeat < 0, .fill ignored"));
1733 if (size
&& !need_pass_2
)
1735 if (rep_exp
.X_op
== O_constant
)
1737 p
= frag_var (rs_fill
, (int) size
, (int) size
,
1738 (relax_substateT
) 0, (symbolS
*) 0,
1739 (offsetT
) rep_exp
.X_add_number
,
1744 /* We don't have a constant repeat count, so we can't use
1745 rs_fill. We can get the same results out of rs_space,
1746 but its argument is in bytes, so we must multiply the
1747 repeat count by size. */
1750 rep_sym
= make_expr_symbol (&rep_exp
);
1753 expressionS size_exp
;
1754 size_exp
.X_op
= O_constant
;
1755 size_exp
.X_add_number
= size
;
1757 rep_exp
.X_op
= O_multiply
;
1758 rep_exp
.X_add_symbol
= rep_sym
;
1759 rep_exp
.X_op_symbol
= make_expr_symbol (&size_exp
);
1760 rep_exp
.X_add_number
= 0;
1761 rep_sym
= make_expr_symbol (&rep_exp
);
1764 p
= frag_var (rs_space
, (int) size
, (int) size
,
1765 (relax_substateT
) 0, rep_sym
, (offsetT
) 0, (char *) 0);
1767 memset (p
, 0, (unsigned int) size
);
1768 /* The magic number BSD_FILL_SIZE_CROCK_4 is from BSD 4.2 VAX
1769 * flavoured AS. The following bizzare behaviour is to be
1770 * compatible with above. I guess they tried to take up to 8
1771 * bytes from a 4-byte expression and they forgot to sign
1772 * extend. Un*x Sux. */
1773 #define BSD_FILL_SIZE_CROCK_4 (4)
1774 md_number_to_chars (p
, (valueT
) fill
,
1775 (size
> BSD_FILL_SIZE_CROCK_4
1776 ? BSD_FILL_SIZE_CROCK_4
1778 /* Note: .fill (),0 emits no frag (since we are asked to .fill 0 bytes)
1779 * but emits no error message because it seems a legal thing to do.
1780 * It is a degenerate case of .fill but could be emitted by a compiler.
1783 demand_empty_rest_of_line ();
1788 int ignore ATTRIBUTE_UNUSED
;
1797 stop
= mri_comment_field (&stopc
);
1801 name
= input_line_pointer
;
1802 c
= get_symbol_end ();
1803 symbolP
= symbol_find_or_make (name
);
1804 S_SET_EXTERNAL (symbolP
);
1806 *input_line_pointer
= c
;
1808 c
= *input_line_pointer
;
1811 input_line_pointer
++;
1813 if (*input_line_pointer
== '\n')
1819 demand_empty_rest_of_line ();
1822 mri_comment_end (stop
, stopc
);
1825 /* Handle the MRI IRP and IRPC pseudo-ops. */
1837 as_where (&file
, &line
);
1840 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
1841 sb_add_char (&s
, *input_line_pointer
++);
1845 err
= expand_irp (irpc
, 0, &s
, &out
, get_line_sb
, '\0');
1847 as_bad_where (file
, line
, "%s", err
);
1851 input_scrub_include_sb (&out
, input_line_pointer
, 1);
1853 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
1856 /* Handle the .linkonce pseudo-op. This tells the assembler to mark
1857 the section to only be linked once. However, this is not supported
1858 by most object file formats. This takes an optional argument,
1859 which is what to do about duplicates. */
1863 int ignore ATTRIBUTE_UNUSED
;
1865 enum linkonce_type type
;
1869 type
= LINKONCE_DISCARD
;
1871 if (! is_end_of_line
[(unsigned char) *input_line_pointer
])
1876 s
= input_line_pointer
;
1877 c
= get_symbol_end ();
1878 if (strcasecmp (s
, "discard") == 0)
1879 type
= LINKONCE_DISCARD
;
1880 else if (strcasecmp (s
, "one_only") == 0)
1881 type
= LINKONCE_ONE_ONLY
;
1882 else if (strcasecmp (s
, "same_size") == 0)
1883 type
= LINKONCE_SAME_SIZE
;
1884 else if (strcasecmp (s
, "same_contents") == 0)
1885 type
= LINKONCE_SAME_CONTENTS
;
1887 as_warn (_("unrecognized .linkonce type `%s'"), s
);
1889 *input_line_pointer
= c
;
1892 #ifdef obj_handle_link_once
1893 obj_handle_link_once (type
);
1894 #else /* ! defined (obj_handle_link_once) */
1895 #ifdef BFD_ASSEMBLER
1899 if ((bfd_applicable_section_flags (stdoutput
) & SEC_LINK_ONCE
) == 0)
1900 as_warn (_(".linkonce is not supported for this object file format"));
1902 flags
= bfd_get_section_flags (stdoutput
, now_seg
);
1903 flags
|= SEC_LINK_ONCE
;
1908 case LINKONCE_DISCARD
:
1909 flags
|= SEC_LINK_DUPLICATES_DISCARD
;
1911 case LINKONCE_ONE_ONLY
:
1912 flags
|= SEC_LINK_DUPLICATES_ONE_ONLY
;
1914 case LINKONCE_SAME_SIZE
:
1915 flags
|= SEC_LINK_DUPLICATES_SAME_SIZE
;
1917 case LINKONCE_SAME_CONTENTS
:
1918 flags
|= SEC_LINK_DUPLICATES_SAME_CONTENTS
;
1921 if (! bfd_set_section_flags (stdoutput
, now_seg
, flags
))
1922 as_bad (_("bfd_set_section_flags: %s"),
1923 bfd_errmsg (bfd_get_error ()));
1925 #else /* ! defined (BFD_ASSEMBLER) */
1926 as_warn (_(".linkonce is not supported for this object file format"));
1927 #endif /* ! defined (BFD_ASSEMBLER) */
1928 #endif /* ! defined (obj_handle_link_once) */
1930 demand_empty_rest_of_line ();
1934 s_lcomm_internal (needs_align
, bytes_p
)
1935 /* 1 if this was a ".bss" directive, which may require a 3rd argument
1936 (alignment); 0 if it was an ".lcomm" (2 args only) */
1938 /* 1 if the alignment value should be interpreted as the byte boundary,
1939 rather than the power of 2. */
1942 register char *name
;
1946 register symbolS
*symbolP
;
1947 segT current_seg
= now_seg
;
1948 subsegT current_subseg
= now_subseg
;
1949 const int max_alignment
= 15;
1951 segT bss_seg
= bss_section
;
1953 name
= input_line_pointer
;
1954 c
= get_symbol_end ();
1955 p
= input_line_pointer
;
1959 /* Accept an optional comma after the name. The comma used to be
1960 required, but Irix 5 cc does not generate it. */
1961 if (*input_line_pointer
== ',')
1963 ++input_line_pointer
;
1967 if (*input_line_pointer
== '\n')
1969 as_bad (_("Missing size expression"));
1973 if ((temp
= get_absolute_expression ()) < 0)
1975 as_warn (_("BSS length (%d.) <0! Ignored."), temp
);
1976 ignore_rest_of_line ();
1980 #if defined (TC_MIPS) || defined (TC_ALPHA)
1981 if (OUTPUT_FLAVOR
== bfd_target_ecoff_flavour
1982 || OUTPUT_FLAVOR
== bfd_target_elf_flavour
)
1984 /* For MIPS and Alpha ECOFF or ELF, small objects are put in .sbss. */
1985 if (temp
<= bfd_get_gp_size (stdoutput
))
1987 bss_seg
= subseg_new (".sbss", 1);
1988 seg_info (bss_seg
)->bss
= 1;
1989 #ifdef BFD_ASSEMBLER
1990 if (! bfd_set_section_flags (stdoutput
, bss_seg
, SEC_ALLOC
))
1991 as_warn (_("error setting flags for \".sbss\": %s"),
1992 bfd_errmsg (bfd_get_error ()));
2000 TC_IMPLICIT_LCOMM_ALIGNMENT (temp
, align
);
2002 /* Still zero unless TC_IMPLICIT_LCOMM_ALIGNMENT set it. */
2004 record_alignment(bss_seg
, align
);
2011 if (*input_line_pointer
!= ',')
2013 as_bad (_("Expected comma after size"));
2014 ignore_rest_of_line ();
2017 input_line_pointer
++;
2019 if (*input_line_pointer
== '\n')
2021 as_bad (_("Missing alignment"));
2024 align
= get_absolute_expression ();
2027 /* Convert to a power of 2. */
2032 for (i
= 0; (align
& 1) == 0; align
>>= 1, ++i
)
2035 as_bad (_("Alignment not a power of 2"));
2039 if (align
> max_alignment
)
2041 align
= max_alignment
;
2042 as_warn (_("Alignment too large: %d. assumed."), align
);
2047 as_warn (_("Alignment negative. 0 assumed."));
2049 record_alignment (bss_seg
, align
);
2050 } /* if needs align */
2053 /* Assume some objects may require alignment on some systems. */
2054 #if defined (TC_ALPHA) && ! defined (VMS)
2057 align
= ffs (temp
) - 1;
2058 if (temp
% (1 << align
))
2065 symbolP
= symbol_find_or_make (name
);
2069 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT) \
2070 || defined (OBJ_BOUT) || defined (OBJ_MAYBE_BOUT))
2071 #ifdef BFD_ASSEMBLER
2072 (OUTPUT_FLAVOR
!= bfd_target_aout_flavour
2073 || (S_GET_OTHER (symbolP
) == 0 && S_GET_DESC (symbolP
) == 0)) &&
2075 (S_GET_OTHER (symbolP
) == 0 && S_GET_DESC (symbolP
) == 0) &&
2078 (S_GET_SEGMENT (symbolP
) == bss_seg
2079 || (!S_IS_DEFINED (symbolP
) && S_GET_VALUE (symbolP
) == 0)))
2083 subseg_set (bss_seg
, 1);
2086 frag_align (align
, 0, 0);
2087 /* detach from old frag */
2088 if (S_GET_SEGMENT (symbolP
) == bss_seg
)
2089 symbol_get_frag (symbolP
)->fr_symbol
= NULL
;
2091 symbol_set_frag (symbolP
, frag_now
);
2092 pfrag
= frag_var (rs_org
, 1, 1, (relax_substateT
)0, symbolP
,
2093 (offsetT
) temp
, (char *) 0);
2096 S_SET_SEGMENT (symbolP
, bss_seg
);
2099 /* The symbol may already have been created with a preceding
2100 ".globl" directive -- be careful not to step on storage class
2101 in that case. Otherwise, set it to static. */
2102 if (S_GET_STORAGE_CLASS (symbolP
) != C_EXT
)
2104 S_SET_STORAGE_CLASS (symbolP
, C_STAT
);
2106 #endif /* OBJ_COFF */
2109 S_SET_SIZE (symbolP
, temp
);
2113 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
2114 S_GET_NAME (symbolP
));
2116 subseg_set (current_seg
, current_subseg
);
2118 demand_empty_rest_of_line ();
2119 } /* s_lcomm_internal() */
2122 s_lcomm (needs_align
)
2125 s_lcomm_internal (needs_align
, 0);
2128 void s_lcomm_bytes (needs_align
)
2131 s_lcomm_internal (needs_align
, 1);
2136 int ignore ATTRIBUTE_UNUSED
;
2138 register char *name
;
2142 register symbolS
*symbolP
;
2144 /* we permit ANY defined expression: BSD4.2 demands constants */
2145 name
= input_line_pointer
;
2146 c
= get_symbol_end ();
2147 p
= input_line_pointer
;
2150 if (*input_line_pointer
!= ',')
2153 as_bad (_("Expected comma after name \"%s\""), name
);
2155 ignore_rest_of_line ();
2158 input_line_pointer
++;
2160 if (exp
.X_op
!= O_constant
2161 && exp
.X_op
!= O_register
)
2163 as_bad (_("bad expression"));
2164 ignore_rest_of_line ();
2168 symbolP
= symbol_find_or_make (name
);
2170 /* FIXME-SOON I pulled a (&& symbolP->sy_other == 0 &&
2171 symbolP->sy_desc == 0) out of this test because coff doesn't have
2172 those fields, and I can't see when they'd ever be tripped. I
2173 don't think I understand why they were here so I may have
2174 introduced a bug. As recently as 1.37 didn't have this test
2175 anyway. xoxorich. */
2177 if (S_GET_SEGMENT (symbolP
) == undefined_section
2178 && S_GET_VALUE (symbolP
) == 0)
2180 /* The name might be an undefined .global symbol; be sure to
2181 keep the "external" bit. */
2182 S_SET_SEGMENT (symbolP
,
2183 (exp
.X_op
== O_constant
2186 S_SET_VALUE (symbolP
, (valueT
) exp
.X_add_number
);
2190 as_bad (_("Symbol %s already defined"), name
);
2193 demand_empty_rest_of_line ();
2196 /* Read a line into an sb. */
2202 char quote1
, quote2
, inquote
;
2204 if (input_line_pointer
[-1] == '\n')
2205 bump_line_counters ();
2207 if (input_line_pointer
>= buffer_limit
)
2209 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
2210 if (buffer_limit
== 0)
2214 /* If app.c sets any other characters to LEX_IS_STRINGQUOTE, this
2215 code needs to be changed. */
2216 if (! flag_m68k_mri
)
2224 #ifdef LEX_IS_STRINGQUOTE
2229 while (! is_end_of_line
[(unsigned char) *input_line_pointer
]
2230 || (inquote
!= '\0' && *input_line_pointer
!= '\n'))
2232 if (inquote
== *input_line_pointer
)
2234 else if (inquote
== '\0')
2236 if (*input_line_pointer
== quote1
)
2238 else if (*input_line_pointer
== quote2
)
2241 sb_add_char (line
, *input_line_pointer
++);
2243 while (input_line_pointer
< buffer_limit
2244 && is_end_of_line
[(unsigned char) *input_line_pointer
])
2246 if (input_line_pointer
[-1] == '\n')
2247 bump_line_counters ();
2248 ++input_line_pointer
;
2253 /* Define a macro. This is an interface to macro.c, which is shared
2254 between gas and gasp. */
2258 int ignore ATTRIBUTE_UNUSED
;
2267 as_where (&file
, &line
);
2270 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
2271 sb_add_char (&s
, *input_line_pointer
++);
2274 if (line_label
!= NULL
)
2275 sb_add_string (&label
, S_GET_NAME (line_label
));
2277 err
= define_macro (0, &s
, &label
, get_line_sb
, &name
);
2279 as_bad_where (file
, line
, "%s", err
);
2282 if (line_label
!= NULL
)
2284 S_SET_SEGMENT (line_label
, undefined_section
);
2285 S_SET_VALUE (line_label
, 0);
2286 symbol_set_frag (line_label
, &zero_address_frag
);
2289 if (((NO_PSEUDO_DOT
|| flag_m68k_mri
)
2290 && hash_find (po_hash
, name
) != NULL
)
2293 && hash_find (po_hash
, name
+ 1) != NULL
))
2294 as_warn (_("attempt to redefine pseudo-op `%s' ignored"),
2301 /* Handle the .mexit pseudo-op, which immediately exits a macro
2306 int ignore ATTRIBUTE_UNUSED
;
2308 cond_exit_macro (macro_nest
);
2309 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
2312 /* Switch in and out of MRI mode. */
2316 int ignore ATTRIBUTE_UNUSED
;
2320 on
= get_absolute_expression ();
2321 old_flag
= flag_mri
;
2339 /* Operator precedence changes in m68k MRI mode, so we need to
2340 update the operator rankings. */
2341 expr_set_precedence ();
2343 #ifdef MRI_MODE_CHANGE
2345 MRI_MODE_CHANGE (on
);
2348 demand_empty_rest_of_line ();
2351 /* Handle changing the location counter. */
2354 do_org (segment
, exp
, fill
)
2359 if (segment
!= now_seg
&& segment
!= absolute_section
)
2360 as_bad (_("invalid segment \"%s\"; segment \"%s\" assumed"),
2361 segment_name (segment
), segment_name (now_seg
));
2363 if (now_seg
== absolute_section
)
2366 as_warn (_("ignoring fill value in absolute section"));
2367 if (exp
->X_op
!= O_constant
)
2369 as_bad (_("only constant offsets supported in absolute section"));
2370 exp
->X_add_number
= 0;
2372 abs_section_offset
= exp
->X_add_number
;
2378 p
= frag_var (rs_org
, 1, 1, (relax_substateT
) 0, exp
->X_add_symbol
,
2379 exp
->X_add_number
* OCTETS_PER_BYTE
, (char *) NULL
);
2386 int ignore ATTRIBUTE_UNUSED
;
2388 register segT segment
;
2390 register long temp_fill
;
2392 #ifdef md_flush_pending_output
2393 md_flush_pending_output ();
2396 /* The m68k MRI assembler has a different meaning for .org. It
2397 means to create an absolute section at a given address. We can't
2398 support that--use a linker script instead. */
2401 as_bad (_("MRI style ORG pseudo-op not supported"));
2402 ignore_rest_of_line ();
2406 /* Don't believe the documentation of BSD 4.2 AS. There is no such
2407 thing as a sub-segment-relative origin. Any absolute origin is
2408 given a warning, then assumed to be segment-relative. Any
2409 segmented origin expression ("foo+42") had better be in the right
2410 segment or the .org is ignored.
2412 BSD 4.2 AS warns if you try to .org backwards. We cannot because
2413 we never know sub-segment sizes when we are reading code. BSD
2414 will crash trying to emit negative numbers of filler bytes in
2415 certain .orgs. We don't crash, but see as-write for that code.
2417 Don't make frag if need_pass_2==1. */
2418 segment
= get_known_segmented_expression (&exp
);
2419 if (*input_line_pointer
== ',')
2421 input_line_pointer
++;
2422 temp_fill
= get_absolute_expression ();
2428 do_org (segment
, &exp
, temp_fill
);
2430 demand_empty_rest_of_line ();
2433 /* Handle parsing for the MRI SECT/SECTION pseudo-op. This should be
2434 called by the obj-format routine which handles section changing
2435 when in MRI mode. It will create a new section, and return it. It
2436 will set *TYPE to the section type: one of 'C' (code), 'D' (data),
2437 'M' (mixed), or 'R' (romable). If BFD_ASSEMBLER is defined, the
2438 flags will be set in the section. */
2442 char *type ATTRIBUTE_UNUSED
;
2452 name
= input_line_pointer
;
2453 if (! isdigit ((unsigned char) *name
))
2454 c
= get_symbol_end ();
2459 ++input_line_pointer
;
2461 while (isdigit ((unsigned char) *input_line_pointer
));
2462 c
= *input_line_pointer
;
2463 *input_line_pointer
= '\0';
2466 name
= xstrdup (name
);
2468 *input_line_pointer
= c
;
2470 seg
= subseg_new (name
, 0);
2472 if (*input_line_pointer
== ',')
2476 ++input_line_pointer
;
2477 align
= get_absolute_expression ();
2478 record_alignment (seg
, align
);
2482 if (*input_line_pointer
== ',')
2484 c
= *++input_line_pointer
;
2485 c
= toupper ((unsigned char) c
);
2486 if (c
== 'C' || c
== 'D' || c
== 'M' || c
== 'R')
2489 as_bad (_("unrecognized section type"));
2490 ++input_line_pointer
;
2492 #ifdef BFD_ASSEMBLER
2496 flags
= SEC_NO_FLAGS
;
2498 flags
= SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
| SEC_CODE
;
2499 else if (*type
== 'D' || *type
== 'M')
2500 flags
= SEC_ALLOC
| SEC_LOAD
| SEC_DATA
;
2501 else if (*type
== 'R')
2502 flags
= SEC_ALLOC
| SEC_LOAD
| SEC_DATA
| SEC_READONLY
| SEC_ROM
;
2503 if (flags
!= SEC_NO_FLAGS
)
2505 if (! bfd_set_section_flags (stdoutput
, seg
, flags
))
2506 as_warn (_("error setting flags for \"%s\": %s"),
2507 bfd_section_name (stdoutput
, seg
),
2508 bfd_errmsg (bfd_get_error ()));
2514 /* Ignore the HP type. */
2515 if (*input_line_pointer
== ',')
2516 input_line_pointer
+= 2;
2518 demand_empty_rest_of_line ();
2520 #else /* ! TC_M68K */
2529 name
= input_line_pointer
;
2530 c
= get_symbol_end ();
2532 name
= xstrdup (name
);
2534 *input_line_pointer
= c
;
2536 seg
= subseg_new (name
, 0);
2538 if (*input_line_pointer
!= ',')
2544 ++input_line_pointer
;
2546 sectype
= input_line_pointer
;
2547 c
= get_symbol_end ();
2548 if (*sectype
== '\0')
2550 else if (strcasecmp (sectype
, "text") == 0)
2552 else if (strcasecmp (sectype
, "data") == 0)
2554 else if (strcasecmp (sectype
, "romdata") == 0)
2557 as_warn (_("unrecognized section type `%s'"), sectype
);
2558 *input_line_pointer
= c
;
2561 if (*input_line_pointer
== ',')
2565 ++input_line_pointer
;
2567 seccmd
= input_line_pointer
;
2568 c
= get_symbol_end ();
2569 if (strcasecmp (seccmd
, "absolute") == 0)
2571 as_bad (_("absolute sections are not supported"));
2572 *input_line_pointer
= c
;
2573 ignore_rest_of_line ();
2576 else if (strcasecmp (seccmd
, "align") == 0)
2580 *input_line_pointer
= c
;
2581 align
= get_absolute_expression ();
2582 record_alignment (seg
, align
);
2586 as_warn (_("unrecognized section command `%s'"), seccmd
);
2587 *input_line_pointer
= c
;
2591 demand_empty_rest_of_line ();
2593 #else /* ! TC_I960 */
2594 /* The MRI assembler seems to use different forms of .sect for
2595 different targets. */
2596 as_bad ("MRI mode not supported for this target");
2597 ignore_rest_of_line ();
2598 #endif /* ! TC_I960 */
2599 #endif /* ! TC_M68K */
2602 /* Handle the .print pseudo-op. */
2606 int ignore ATTRIBUTE_UNUSED
;
2611 s
= demand_copy_C_string (&len
);
2613 demand_empty_rest_of_line ();
2616 /* Handle the .purgem pseudo-op. */
2620 int ignore ATTRIBUTE_UNUSED
;
2622 if (is_it_end_of_statement ())
2624 demand_empty_rest_of_line ();
2634 name
= input_line_pointer
;
2635 c
= get_symbol_end ();
2636 delete_macro (name
);
2637 *input_line_pointer
= c
;
2640 while (*input_line_pointer
++ == ',');
2642 --input_line_pointer
;
2643 demand_empty_rest_of_line ();
2646 /* Handle the .rept pseudo-op. */
2650 int ignore ATTRIBUTE_UNUSED
;
2654 count
= get_absolute_expression ();
2656 do_repeat(count
, "REPT", "ENDR");
2659 /* This function provides a generic repeat block implementation. It allows
2660 different directives to be used as the start/end keys. */
2663 do_repeat (count
, start
, end
)
2672 if (! buffer_and_nest (start
, end
, &one
, get_line_sb
))
2674 as_bad (_("%s without %s"), start
, end
);
2680 sb_add_sb (&many
, &one
);
2684 input_scrub_include_sb (&many
, input_line_pointer
, 1);
2686 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
2689 /* Skip to end of current repeat loop; EXTRA indicates how many additional
2690 input buffers to skip. Assumes that conditionals preceding the loop end
2691 are properly nested.
2693 This function makes it easier to implement a premature "break" out of the
2694 loop. The EXTRA arg accounts for other buffers we might have inserted,
2695 such as line substitutions. */
2701 cond_exit_macro (macro_nest
);
2702 while (extra
-- >= 0)
2703 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
2706 /* Handle the .equ, .equiv and .set directives. If EQUIV is 1, then
2707 this is .equiv, and it is an error if the symbol is already
2714 register char *name
;
2715 register char delim
;
2716 register char *end_name
;
2717 register symbolS
*symbolP
;
2720 * Especial apologies for the random logic:
2721 * this just grew, and could be parsed much more simply!
2724 name
= input_line_pointer
;
2725 delim
= get_symbol_end ();
2726 end_name
= input_line_pointer
;
2730 if (*input_line_pointer
!= ',')
2733 as_bad (_("Expected comma after name \"%s\""), name
);
2735 ignore_rest_of_line ();
2739 input_line_pointer
++;
2742 if (name
[0] == '.' && name
[1] == '\0')
2744 /* Turn '. = mumble' into a .org mumble */
2745 register segT segment
;
2748 segment
= get_known_segmented_expression (&exp
);
2751 do_org (segment
, &exp
, 0);
2757 if ((symbolP
= symbol_find (name
)) == NULL
2758 && (symbolP
= md_undefined_symbol (name
)) == NULL
)
2761 /* When doing symbol listings, play games with dummy fragments living
2762 outside the normal fragment chain to record the file and line info
2764 if (listing
& LISTING_SYMBOLS
)
2766 extern struct list_info_struct
*listing_tail
;
2767 fragS
*dummy_frag
= (fragS
*) xmalloc (sizeof(fragS
));
2768 memset (dummy_frag
, 0, sizeof(fragS
));
2769 dummy_frag
->fr_type
= rs_fill
;
2770 dummy_frag
->line
= listing_tail
;
2771 symbolP
= symbol_new (name
, undefined_section
, 0, dummy_frag
);
2772 dummy_frag
->fr_symbol
= symbolP
;
2776 symbolP
= symbol_new (name
, undefined_section
, 0, &zero_address_frag
);
2779 /* "set" symbols are local unless otherwise specified. */
2780 SF_SET_LOCAL (symbolP
);
2781 #endif /* OBJ_COFF */
2783 } /* make a new symbol */
2785 symbol_table_insert (symbolP
);
2790 && S_IS_DEFINED (symbolP
)
2791 && S_GET_SEGMENT (symbolP
) != reg_section
)
2792 as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP
));
2794 pseudo_set (symbolP
);
2795 demand_empty_rest_of_line ();
2809 #ifdef md_flush_pending_output
2810 md_flush_pending_output ();
2814 stop
= mri_comment_field (&stopc
);
2816 /* In m68k MRI mode, we need to align to a word boundary, unless
2818 if (flag_m68k_mri
&& mult
> 1)
2820 if (now_seg
== absolute_section
)
2822 abs_section_offset
+= abs_section_offset
& 1;
2823 if (line_label
!= NULL
)
2824 S_SET_VALUE (line_label
, abs_section_offset
);
2826 else if (mri_common_symbol
!= NULL
)
2830 val
= S_GET_VALUE (mri_common_symbol
);
2833 S_SET_VALUE (mri_common_symbol
, val
+ 1);
2834 if (line_label
!= NULL
)
2836 expressionS
*symexp
;
2838 symexp
= symbol_get_value_expression (line_label
);
2839 know (symexp
->X_op
== O_symbol
);
2840 know (symexp
->X_add_symbol
== mri_common_symbol
);
2841 symexp
->X_add_number
+= 1;
2847 do_align (1, (char *) NULL
, 0, 0);
2848 if (line_label
!= NULL
)
2850 symbol_set_frag (line_label
, frag_now
);
2851 S_SET_VALUE (line_label
, frag_now_fix ());
2861 if (*input_line_pointer
== ',')
2863 ++input_line_pointer
;
2868 val
.X_op
= O_constant
;
2869 val
.X_add_number
= 0;
2872 if (val
.X_op
!= O_constant
2873 || val
.X_add_number
< - 0x80
2874 || val
.X_add_number
> 0xff
2875 || (mult
!= 0 && mult
!= 1 && val
.X_add_number
!= 0))
2877 if (exp
.X_op
!= O_constant
)
2878 as_bad (_("Unsupported variable size or fill value"));
2885 bytes
= mult
* exp
.X_add_number
;
2886 for (i
= 0; i
< exp
.X_add_number
; i
++)
2887 emit_expr (&val
, mult
);
2892 if (exp
.X_op
== O_constant
)
2896 repeat
= exp
.X_add_number
;
2903 as_warn (_(".space repeat count is zero, ignored"));
2904 else if (repeat
< 0)
2905 as_warn (_(".space repeat count is negative, ignored"));
2909 /* If we are in the absolute section, just bump the offset. */
2910 if (now_seg
== absolute_section
)
2912 abs_section_offset
+= repeat
;
2916 /* If we are secretly in an MRI common section, then
2917 creating space just increases the size of the common
2919 if (mri_common_symbol
!= NULL
)
2921 S_SET_VALUE (mri_common_symbol
,
2922 S_GET_VALUE (mri_common_symbol
) + repeat
);
2927 p
= frag_var (rs_fill
, 1, 1, (relax_substateT
) 0, (symbolS
*) 0,
2928 (offsetT
) repeat
, (char *) 0);
2932 if (now_seg
== absolute_section
)
2934 as_bad (_("space allocation too complex in absolute section"));
2935 subseg_set (text_section
, 0);
2937 if (mri_common_symbol
!= NULL
)
2939 as_bad (_("space allocation too complex in common section"));
2940 mri_common_symbol
= NULL
;
2943 p
= frag_var (rs_space
, 1, 1, (relax_substateT
) 0,
2944 make_expr_symbol (&exp
), (offsetT
) 0, (char *) 0);
2948 *p
= val
.X_add_number
;
2953 /* In MRI mode, after an odd number of bytes, we must align to an
2954 even word boundary, unless the next instruction is a dc.b, ds.b
2956 if (flag_mri
&& (bytes
& 1) != 0)
2957 mri_pending_align
= 1;
2959 demand_empty_rest_of_line ();
2962 mri_comment_end (stop
, stopc
);
2965 /* This is like s_space, but the value is a floating point number with
2966 the given precision. This is for the MRI dcb.s pseudo-op and
2970 s_float_space (float_type
)
2975 char temp
[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT
];
2980 stop
= mri_comment_field (&stopc
);
2982 count
= get_absolute_expression ();
2985 if (*input_line_pointer
!= ',')
2987 as_bad (_("missing value"));
2988 ignore_rest_of_line ();
2990 mri_comment_end (stop
, stopc
);
2994 ++input_line_pointer
;
2998 /* Skip any 0{letter} that may be present. Don't even check if the
2999 * letter is legal. */
3000 if (input_line_pointer
[0] == '0'
3001 && isalpha ((unsigned char) input_line_pointer
[1]))
3002 input_line_pointer
+= 2;
3004 /* Accept :xxxx, where the x's are hex digits, for a floating point
3005 with the exact digits specified. */
3006 if (input_line_pointer
[0] == ':')
3008 flen
= hex_float (float_type
, temp
);
3011 ignore_rest_of_line ();
3013 mri_comment_end (stop
, stopc
);
3021 err
= md_atof (float_type
, temp
, &flen
);
3022 know (flen
<= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT
);
3026 as_bad (_("Bad floating literal: %s"), err
);
3027 ignore_rest_of_line ();
3029 mri_comment_end (stop
, stopc
);
3034 while (--count
>= 0)
3038 p
= frag_more (flen
);
3039 memcpy (p
, temp
, (unsigned int) flen
);
3042 demand_empty_rest_of_line ();
3045 mri_comment_end (stop
, stopc
);
3048 /* Handle the .struct pseudo-op, as found in MIPS assemblers. */
3052 int ignore ATTRIBUTE_UNUSED
;
3058 stop
= mri_comment_field (&stopc
);
3059 abs_section_offset
= get_absolute_expression ();
3060 subseg_set (absolute_section
, 0);
3061 demand_empty_rest_of_line ();
3063 mri_comment_end (stop
, stopc
);
3068 int ignore ATTRIBUTE_UNUSED
;
3072 temp
= get_absolute_expression ();
3073 subseg_set (text_section
, (subsegT
) temp
);
3074 demand_empty_rest_of_line ();
3076 const_flag
&= ~IN_DEFAULT_SECTION
;
3082 demand_empty_rest_of_line ()
3085 if (is_end_of_line
[(unsigned char) *input_line_pointer
])
3087 input_line_pointer
++;
3091 ignore_rest_of_line ();
3093 /* Return having already swallowed end-of-line. */
3094 } /* Return pointing just after end-of-line. */
3097 ignore_rest_of_line () /* For suspect lines: gives warning. */
3099 if (!is_end_of_line
[(unsigned char) *input_line_pointer
])
3101 if (isprint ((unsigned char) *input_line_pointer
))
3102 as_bad (_("Rest of line ignored. First ignored character is `%c'."),
3103 *input_line_pointer
);
3105 as_bad (_("Rest of line ignored. First ignored character valued 0x%x."),
3106 *input_line_pointer
);
3107 while (input_line_pointer
< buffer_limit
3108 && !is_end_of_line
[(unsigned char) *input_line_pointer
])
3110 input_line_pointer
++;
3113 input_line_pointer
++; /* Return pointing just after end-of-line. */
3114 know (is_end_of_line
[(unsigned char) input_line_pointer
[-1]]);
3118 discard_rest_of_line ()
3120 while (input_line_pointer
< buffer_limit
3121 && !is_end_of_line
[(unsigned char) *input_line_pointer
])
3123 input_line_pointer
++;
3125 input_line_pointer
++; /* Return pointing just after end-of-line. */
3126 know (is_end_of_line
[(unsigned char) input_line_pointer
[-1]]);
3132 * In: Pointer to a symbol.
3133 * Input_line_pointer->expression.
3135 * Out: Input_line_pointer->just after any whitespace after expression.
3136 * Tried to set symbol to value of expression.
3137 * Will change symbols type, value, and frag;
3140 pseudo_set (symbolP
)
3144 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3146 #endif /* OBJ_AOUT or OBJ_BOUT */
3148 know (symbolP
); /* NULL pointer is logic error. */
3149 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3150 ext
= S_IS_EXTERNAL (symbolP
);
3151 #endif /* OBJ_AOUT or OBJ_BOUT */
3153 (void) expression (&exp
);
3155 if (exp
.X_op
== O_illegal
)
3156 as_bad (_("illegal expression; zero assumed"));
3157 else if (exp
.X_op
== O_absent
)
3158 as_bad (_("missing expression; zero assumed"));
3159 else if (exp
.X_op
== O_big
)
3161 if (exp
.X_add_number
> 0)
3162 as_bad (_("bignum invalid; zero assumed"));
3164 as_bad (_("floating point number invalid; zero assumed"));
3166 else if (exp
.X_op
== O_subtract
3167 && (S_GET_SEGMENT (exp
.X_add_symbol
)
3168 == S_GET_SEGMENT (exp
.X_op_symbol
))
3169 && SEG_NORMAL (S_GET_SEGMENT (exp
.X_add_symbol
))
3170 && (symbol_get_frag (exp
.X_add_symbol
)
3171 == symbol_get_frag (exp
.X_op_symbol
)))
3173 exp
.X_op
= O_constant
;
3174 exp
.X_add_number
= (S_GET_VALUE (exp
.X_add_symbol
)
3175 - S_GET_VALUE (exp
.X_op_symbol
));
3183 exp
.X_add_number
= 0;
3186 S_SET_SEGMENT (symbolP
, absolute_section
);
3187 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3189 S_SET_EXTERNAL (symbolP
);
3191 S_CLEAR_EXTERNAL (symbolP
);
3192 #endif /* OBJ_AOUT or OBJ_BOUT */
3193 S_SET_VALUE (symbolP
, (valueT
) exp
.X_add_number
);
3194 if (exp
.X_op
!= O_constant
)
3195 symbol_set_frag (symbolP
, &zero_address_frag
);
3199 S_SET_SEGMENT (symbolP
, reg_section
);
3200 S_SET_VALUE (symbolP
, (valueT
) exp
.X_add_number
);
3201 symbol_set_frag (symbolP
, &zero_address_frag
);
3205 if (S_GET_SEGMENT (exp
.X_add_symbol
) == undefined_section
3206 || exp
.X_add_number
!= 0)
3207 symbol_set_value_expression (symbolP
, &exp
);
3208 else if (symbol_section_p (symbolP
))
3209 as_bad ("invalid attempt to set value of section symbol");
3212 symbolS
*s
= exp
.X_add_symbol
;
3214 S_SET_SEGMENT (symbolP
, S_GET_SEGMENT (s
));
3215 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3217 S_SET_EXTERNAL (symbolP
);
3219 S_CLEAR_EXTERNAL (symbolP
);
3220 #endif /* OBJ_AOUT or OBJ_BOUT */
3221 S_SET_VALUE (symbolP
,
3222 exp
.X_add_number
+ S_GET_VALUE (s
));
3223 symbol_set_frag (symbolP
, symbol_get_frag (s
));
3224 copy_symbol_attributes (symbolP
, s
);
3229 /* The value is some complex expression.
3230 FIXME: Should we set the segment to anything? */
3231 symbol_set_value_expression (symbolP
, &exp
);
3239 * CONStruct more frag of .bytes, or .words etc.
3240 * Should need_pass_2 be 1 then emit no frag(s).
3241 * This understands EXPRESSIONS.
3245 * This has a split personality. We use expression() to read the
3246 * value. We can detect if the value won't fit in a byte or word.
3247 * But we can't detect if expression() discarded significant digits
3248 * in the case of a long. Not worth the crocks required to fix it.
3251 /* Select a parser for cons expressions. */
3253 /* Some targets need to parse the expression in various fancy ways.
3254 You can define TC_PARSE_CONS_EXPRESSION to do whatever you like
3255 (for example, the HPPA does this). Otherwise, you can define
3256 BITFIELD_CONS_EXPRESSIONS to permit bitfields to be specified, or
3257 REPEAT_CONS_EXPRESSIONS to permit repeat counts. If none of these
3258 are defined, which is the normal case, then only simple expressions
3263 parse_mri_cons
PARAMS ((expressionS
*exp
, unsigned int nbytes
));
3266 #ifndef TC_PARSE_CONS_EXPRESSION
3267 #ifdef BITFIELD_CONS_EXPRESSIONS
3268 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_bitfield_cons (EXP, NBYTES)
3270 parse_bitfield_cons
PARAMS ((expressionS
*exp
, unsigned int nbytes
));
3272 #ifdef REPEAT_CONS_EXPRESSIONS
3273 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_repeat_cons (EXP, NBYTES)
3275 parse_repeat_cons
PARAMS ((expressionS
*exp
, unsigned int nbytes
));
3278 /* If we haven't gotten one yet, just call expression. */
3279 #ifndef TC_PARSE_CONS_EXPRESSION
3280 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) expression (EXP)
3284 /* worker to do .byte etc statements */
3285 /* clobbers input_line_pointer, checks */
3288 cons_worker (nbytes
, rva
)
3289 register int nbytes
; /* 1=.byte, 2=.word, 4=.long */
3297 #ifdef md_flush_pending_output
3298 md_flush_pending_output ();
3302 stop
= mri_comment_field (&stopc
);
3304 if (is_it_end_of_statement ())
3306 demand_empty_rest_of_line ();
3308 mri_comment_end (stop
, stopc
);
3312 #ifdef md_cons_align
3313 md_cons_align (nbytes
);
3321 parse_mri_cons (&exp
, (unsigned int) nbytes
);
3324 TC_PARSE_CONS_EXPRESSION (&exp
, (unsigned int) nbytes
);
3328 if (exp
.X_op
== O_symbol
)
3329 exp
.X_op
= O_symbol_rva
;
3331 as_fatal (_("rva without symbol"));
3333 emit_expr (&exp
, (unsigned int) nbytes
);
3336 while (*input_line_pointer
++ == ',');
3338 /* In MRI mode, after an odd number of bytes, we must align to an
3339 even word boundary, unless the next instruction is a dc.b, ds.b
3341 if (flag_mri
&& nbytes
== 1 && (c
& 1) != 0)
3342 mri_pending_align
= 1;
3344 input_line_pointer
--; /* Put terminator back into stream. */
3346 demand_empty_rest_of_line ();
3349 mri_comment_end (stop
, stopc
);
3357 cons_worker (size
, 0);
3364 cons_worker (size
, 1);
3367 /* Put the contents of expression EXP into the object file using
3368 NBYTES bytes. If need_pass_2 is 1, this does nothing. */
3371 emit_expr (exp
, nbytes
)
3373 unsigned int nbytes
;
3377 valueT extra_digit
= 0;
3379 /* Don't do anything if we are going to make another pass. */
3385 /* When gcc emits DWARF 1 debugging pseudo-ops, a line number will
3386 appear as a four byte positive constant in the .line section,
3387 followed by a 2 byte 0xffff. Look for that case here. */
3389 static int dwarf_line
= -1;
3391 if (strcmp (segment_name (now_seg
), ".line") != 0)
3393 else if (dwarf_line
>= 0
3395 && exp
->X_op
== O_constant
3396 && (exp
->X_add_number
== -1 || exp
->X_add_number
== 0xffff))
3397 listing_source_line ((unsigned int) dwarf_line
);
3398 else if (nbytes
== 4
3399 && exp
->X_op
== O_constant
3400 && exp
->X_add_number
>= 0)
3401 dwarf_line
= exp
->X_add_number
;
3406 /* When gcc emits DWARF 1 debugging pseudo-ops, a file name will
3407 appear as a 2 byte TAG_compile_unit (0x11) followed by a 2 byte
3408 AT_sibling (0x12) followed by a four byte address of the sibling
3409 followed by a 2 byte AT_name (0x38) followed by the name of the
3410 file. We look for that case here. */
3412 static int dwarf_file
= 0;
3414 if (strcmp (segment_name (now_seg
), ".debug") != 0)
3416 else if (dwarf_file
== 0
3418 && exp
->X_op
== O_constant
3419 && exp
->X_add_number
== 0x11)
3421 else if (dwarf_file
== 1
3423 && exp
->X_op
== O_constant
3424 && exp
->X_add_number
== 0x12)
3426 else if (dwarf_file
== 2
3429 else if (dwarf_file
== 3
3431 && exp
->X_op
== O_constant
3432 && exp
->X_add_number
== 0x38)
3437 /* The variable dwarf_file_string tells stringer that the string
3438 may be the name of the source file. */
3439 if (dwarf_file
== 4)
3440 dwarf_file_string
= 1;
3442 dwarf_file_string
= 0;
3447 if (check_eh_frame (exp
, &nbytes
))
3452 /* Allow `.word 0' in the absolute section. */
3453 if (now_seg
== absolute_section
)
3455 if (op
!= O_constant
|| exp
->X_add_number
!= 0)
3456 as_bad (_("attempt to store value in absolute section"));
3457 abs_section_offset
+= nbytes
;
3461 /* Handle a negative bignum. */
3463 && exp
->X_add_number
== 0
3464 && symbol_get_value_expression (exp
->X_add_symbol
)->X_op
== O_big
3465 && symbol_get_value_expression (exp
->X_add_symbol
)->X_add_number
> 0)
3468 unsigned long carry
;
3470 exp
= symbol_get_value_expression (exp
->X_add_symbol
);
3472 /* Negate the bignum: one's complement each digit and add 1. */
3474 for (i
= 0; i
< exp
->X_add_number
; i
++)
3478 next
= (((~ (generic_bignum
[i
] & LITTLENUM_MASK
))
3481 generic_bignum
[i
] = next
& LITTLENUM_MASK
;
3482 carry
= next
>> LITTLENUM_NUMBER_OF_BITS
;
3485 /* We can ignore any carry out, because it will be handled by
3486 extra_digit if it is needed. */
3488 extra_digit
= (valueT
) -1;
3492 if (op
== O_absent
|| op
== O_illegal
)
3494 as_warn (_("zero assumed for missing expression"));
3495 exp
->X_add_number
= 0;
3498 else if (op
== O_big
&& exp
->X_add_number
<= 0)
3500 as_bad (_("floating point number invalid; zero assumed"));
3501 exp
->X_add_number
= 0;
3504 else if (op
== O_register
)
3506 as_warn (_("register value used as expression"));
3510 p
= frag_more ((int) nbytes
);
3512 #ifndef WORKING_DOT_WORD
3513 /* If we have the difference of two symbols in a word, save it on
3514 the broken_words list. See the code in write.c. */
3515 if (op
== O_subtract
&& nbytes
== 2)
3517 struct broken_word
*x
;
3519 x
= (struct broken_word
*) xmalloc (sizeof (struct broken_word
));
3520 x
->next_broken_word
= broken_words
;
3523 x
->subseg
= now_subseg
;
3525 x
->word_goes_here
= p
;
3527 x
->add
= exp
->X_add_symbol
;
3528 x
->sub
= exp
->X_op_symbol
;
3529 x
->addnum
= exp
->X_add_number
;
3536 /* If we have an integer, but the number of bytes is too large to
3537 pass to md_number_to_chars, handle it as a bignum. */
3538 if (op
== O_constant
&& nbytes
> sizeof (valueT
))
3543 if (! exp
->X_unsigned
&& exp
->X_add_number
< 0)
3544 extra_digit
= (valueT
) -1;
3545 val
= (valueT
) exp
->X_add_number
;
3549 generic_bignum
[gencnt
] = val
& LITTLENUM_MASK
;
3550 val
>>= LITTLENUM_NUMBER_OF_BITS
;
3554 op
= exp
->X_op
= O_big
;
3555 exp
->X_add_number
= gencnt
;
3558 if (op
== O_constant
)
3560 register valueT get
;
3561 register valueT use
;
3562 register valueT mask
;
3564 register valueT unmask
;
3566 /* JF << of >= number of bits in the object is undefined. In
3567 particular SPARC (Sun 4) has problems */
3568 if (nbytes
>= sizeof (valueT
))
3571 if (nbytes
> sizeof (valueT
))
3574 hibit
= (valueT
) 1 << (nbytes
* BITS_PER_CHAR
- 1);
3578 /* Don't store these bits. */
3579 mask
= ~(valueT
) 0 << (BITS_PER_CHAR
* nbytes
);
3580 hibit
= (valueT
) 1 << (nbytes
* BITS_PER_CHAR
- 1);
3583 unmask
= ~mask
; /* Do store these bits. */
3586 "Do this mod if you want every overflow check to assume SIGNED 2's complement data.";
3587 mask
= ~(unmask
>> 1); /* Includes sign bit now. */
3590 get
= exp
->X_add_number
;
3592 if ((get
& mask
) != 0
3593 && ((get
& mask
) != mask
3594 || (get
& hibit
) == 0))
3595 { /* Leading bits contain both 0s & 1s. */
3596 as_warn (_("Value 0x%lx truncated to 0x%lx."),
3597 (unsigned long) get
, (unsigned long) use
);
3599 /* put bytes in right order. */
3600 md_number_to_chars (p
, use
, (int) nbytes
);
3602 else if (op
== O_big
)
3605 LITTLENUM_TYPE
*nums
;
3607 know (nbytes
% CHARS_PER_LITTLENUM
== 0);
3609 size
= exp
->X_add_number
* CHARS_PER_LITTLENUM
;
3612 as_warn (_("Bignum truncated to %d bytes"), nbytes
);
3616 if (target_big_endian
)
3618 while (nbytes
> size
)
3620 md_number_to_chars (p
, extra_digit
, CHARS_PER_LITTLENUM
);
3621 nbytes
-= CHARS_PER_LITTLENUM
;
3622 p
+= CHARS_PER_LITTLENUM
;
3625 nums
= generic_bignum
+ size
/ CHARS_PER_LITTLENUM
;
3629 md_number_to_chars (p
, (valueT
) *nums
, CHARS_PER_LITTLENUM
);
3630 size
-= CHARS_PER_LITTLENUM
;
3631 p
+= CHARS_PER_LITTLENUM
;
3636 nums
= generic_bignum
;
3639 md_number_to_chars (p
, (valueT
) *nums
, CHARS_PER_LITTLENUM
);
3641 size
-= CHARS_PER_LITTLENUM
;
3642 p
+= CHARS_PER_LITTLENUM
;
3643 nbytes
-= CHARS_PER_LITTLENUM
;
3648 md_number_to_chars (p
, extra_digit
, CHARS_PER_LITTLENUM
);
3649 nbytes
-= CHARS_PER_LITTLENUM
;
3650 p
+= CHARS_PER_LITTLENUM
;
3656 memset (p
, 0, nbytes
);
3658 /* Now we need to generate a fixS to record the symbol value.
3659 This is easy for BFD. For other targets it can be more
3660 complex. For very complex cases (currently, the HPPA and
3661 NS32K), you can define TC_CONS_FIX_NEW to do whatever you
3662 want. For simpler cases, you can define TC_CONS_RELOC to be
3663 the name of the reloc code that should be stored in the fixS.
3664 If neither is defined, the code uses NO_RELOC if it is
3665 defined, and otherwise uses 0. */
3667 #ifdef BFD_ASSEMBLER
3668 #ifdef TC_CONS_FIX_NEW
3669 TC_CONS_FIX_NEW (frag_now
, p
- frag_now
->fr_literal
, nbytes
, exp
);
3672 bfd_reloc_code_real_type r
;
3689 as_bad (_("unsupported BFD relocation size %u"), nbytes
);
3693 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, (int) nbytes
, exp
,
3698 #ifdef TC_CONS_FIX_NEW
3699 TC_CONS_FIX_NEW (frag_now
, p
- frag_now
->fr_literal
, nbytes
, exp
);
3701 /* Figure out which reloc number to use. Use TC_CONS_RELOC if
3702 it is defined, otherwise use NO_RELOC if it is defined,
3704 #ifndef TC_CONS_RELOC
3706 #define TC_CONS_RELOC NO_RELOC
3708 #define TC_CONS_RELOC 0
3711 fix_new_exp (frag_now
, p
- frag_now
->fr_literal
, (int) nbytes
, exp
, 0,
3713 #endif /* TC_CONS_FIX_NEW */
3714 #endif /* BFD_ASSEMBLER */
3718 #ifdef BITFIELD_CONS_EXPRESSIONS
3720 /* i960 assemblers, (eg, asm960), allow bitfields after ".byte" as
3721 w:x,y:z, where w and y are bitwidths and x and y are values. They
3722 then pack them all together. We do a little better in that we allow
3723 them in words, longs, etc. and we'll pack them in target byte order
3726 The rules are: pack least significat bit first, if a field doesn't
3727 entirely fit, put it in the next unit. Overflowing the bitfield is
3728 explicitly *not* even a warning. The bitwidth should be considered
3731 To use this function the tc-XXX.h file should define
3732 BITFIELD_CONS_EXPRESSIONS. */
3735 parse_bitfield_cons (exp
, nbytes
)
3737 unsigned int nbytes
;
3739 unsigned int bits_available
= BITS_PER_CHAR
* nbytes
;
3740 char *hold
= input_line_pointer
;
3742 (void) expression (exp
);
3744 if (*input_line_pointer
== ':')
3750 unsigned long width
;
3752 if (*input_line_pointer
!= ':')
3754 input_line_pointer
= hold
;
3756 } /* next piece is not a bitfield */
3758 /* In the general case, we can't allow
3759 full expressions with symbol
3760 differences and such. The relocation
3761 entries for symbols not defined in this
3762 assembly would require arbitrary field
3763 widths, positions, and masks which most
3764 of our current object formats don't
3767 In the specific case where a symbol
3768 *is* defined in this assembly, we
3769 *could* build fixups and track it, but
3770 this could lead to confusion for the
3771 backends. I'm lazy. I'll take any
3772 SEG_ABSOLUTE. I think that means that
3773 you can use a previous .set or
3774 .equ type symbol. xoxorich. */
3776 if (exp
->X_op
== O_absent
)
3778 as_warn (_("using a bit field width of zero"));
3779 exp
->X_add_number
= 0;
3780 exp
->X_op
= O_constant
;
3781 } /* implied zero width bitfield */
3783 if (exp
->X_op
!= O_constant
)
3785 *input_line_pointer
= '\0';
3786 as_bad (_("field width \"%s\" too complex for a bitfield"), hold
);
3787 *input_line_pointer
= ':';
3788 demand_empty_rest_of_line ();
3792 if ((width
= exp
->X_add_number
) > (BITS_PER_CHAR
* nbytes
))
3794 as_warn (_("field width %lu too big to fit in %d bytes: truncated to %d bits"),
3795 width
, nbytes
, (BITS_PER_CHAR
* nbytes
));
3796 width
= BITS_PER_CHAR
* nbytes
;
3799 if (width
> bits_available
)
3801 /* FIXME-SOMEDAY: backing up and reparsing is wasteful. */
3802 input_line_pointer
= hold
;
3803 exp
->X_add_number
= value
;
3807 hold
= ++input_line_pointer
; /* skip ':' */
3809 (void) expression (exp
);
3810 if (exp
->X_op
!= O_constant
)
3812 char cache
= *input_line_pointer
;
3814 *input_line_pointer
= '\0';
3815 as_bad (_("field value \"%s\" too complex for a bitfield"), hold
);
3816 *input_line_pointer
= cache
;
3817 demand_empty_rest_of_line ();
3821 value
|= ((~(-1 << width
) & exp
->X_add_number
)
3822 << ((BITS_PER_CHAR
* nbytes
) - bits_available
));
3824 if ((bits_available
-= width
) == 0
3825 || is_it_end_of_statement ()
3826 || *input_line_pointer
!= ',')
3829 } /* all the bitfields we're gonna get */
3831 hold
= ++input_line_pointer
;
3832 (void) expression (exp
);
3833 } /* forever loop */
3835 exp
->X_add_number
= value
;
3836 exp
->X_op
= O_constant
;
3837 exp
->X_unsigned
= 1;
3838 } /* if looks like a bitfield */
3839 } /* parse_bitfield_cons() */
3841 #endif /* BITFIELD_CONS_EXPRESSIONS */
3843 /* Handle an MRI style string expression. */
3847 parse_mri_cons (exp
, nbytes
)
3849 unsigned int nbytes
;
3851 if (*input_line_pointer
!= '\''
3852 && (input_line_pointer
[1] != '\''
3853 || (*input_line_pointer
!= 'A'
3854 && *input_line_pointer
!= 'E')))
3855 TC_PARSE_CONS_EXPRESSION (exp
, nbytes
);
3859 unsigned int result
= 0;
3861 /* An MRI style string. Cut into as many bytes as will fit into
3862 a nbyte chunk, left justify if necessary, and separate with
3863 commas so we can try again later. */
3864 if (*input_line_pointer
== 'A')
3865 ++input_line_pointer
;
3866 else if (*input_line_pointer
== 'E')
3868 as_bad (_("EBCDIC constants are not supported"));
3869 ++input_line_pointer
;
3872 input_line_pointer
++;
3873 for (scan
= 0; scan
< nbytes
; scan
++)
3875 if (*input_line_pointer
== '\'')
3877 if (input_line_pointer
[1] == '\'')
3879 input_line_pointer
++;
3884 result
= (result
<< 8) | (*input_line_pointer
++);
3888 while (scan
< nbytes
)
3893 /* Create correct expression */
3894 exp
->X_op
= O_constant
;
3895 exp
->X_add_number
= result
;
3896 /* Fake it so that we can read the next char too */
3897 if (input_line_pointer
[0] != '\'' ||
3898 (input_line_pointer
[0] == '\'' && input_line_pointer
[1] == '\''))
3900 input_line_pointer
-= 2;
3901 input_line_pointer
[0] = ',';
3902 input_line_pointer
[1] = '\'';
3905 input_line_pointer
++;
3908 #endif /* TC_M68K */
3910 #ifdef REPEAT_CONS_EXPRESSIONS
3912 /* Parse a repeat expression for cons. This is used by the MIPS
3913 assembler. The format is NUMBER:COUNT; NUMBER appears in the
3914 object file COUNT times.
3916 To use this for a target, define REPEAT_CONS_EXPRESSIONS. */
3919 parse_repeat_cons (exp
, nbytes
)
3921 unsigned int nbytes
;
3928 if (*input_line_pointer
!= ':')
3930 /* No repeat count. */
3934 ++input_line_pointer
;
3935 expression (&count
);
3936 if (count
.X_op
!= O_constant
3937 || count
.X_add_number
<= 0)
3939 as_warn (_("Unresolvable or nonpositive repeat count; using 1"));
3943 /* The cons function is going to output this expression once. So we
3944 output it count - 1 times. */
3945 for (i
= count
.X_add_number
- 1; i
> 0; i
--)
3946 emit_expr (exp
, nbytes
);
3949 #endif /* REPEAT_CONS_EXPRESSIONS */
3951 /* Parse a floating point number represented as a hex constant. This
3952 permits users to specify the exact bits they want in the floating
3956 hex_float (float_type
, bytes
)
3990 as_bad (_("Unknown floating type type '%c'"), float_type
);
3994 /* It would be nice if we could go through expression to parse the
3995 hex constant, but if we get a bignum it's a pain to sort it into
3996 the buffer correctly. */
3998 while (hex_p (*input_line_pointer
) || *input_line_pointer
== '_')
4002 /* The MRI assembler accepts arbitrary underscores strewn about
4003 through the hex constant, so we ignore them as well. */
4004 if (*input_line_pointer
== '_')
4006 ++input_line_pointer
;
4012 as_warn (_("Floating point constant too large"));
4015 d
= hex_value (*input_line_pointer
) << 4;
4016 ++input_line_pointer
;
4017 while (*input_line_pointer
== '_')
4018 ++input_line_pointer
;
4019 if (hex_p (*input_line_pointer
))
4021 d
+= hex_value (*input_line_pointer
);
4022 ++input_line_pointer
;
4024 if (target_big_endian
)
4027 bytes
[length
- i
- 1] = d
;
4033 if (target_big_endian
)
4034 memset (bytes
+ i
, 0, length
- i
);
4036 memset (bytes
, 0, length
- i
);
4045 * CONStruct some more frag chars of .floats .ffloats etc.
4046 * Makes 0 or more new frags.
4047 * If need_pass_2 == 1, no frags are emitted.
4048 * This understands only floating literals, not expressions. Sorry.
4050 * A floating constant is defined by atof_generic(), except it is preceded
4051 * by 0d 0f 0g or 0h. After observing the STRANGE way my BSD AS does its
4052 * reading, I decided to be incompatible. This always tries to give you
4053 * rounded bits to the precision of the pseudo-op. Former AS did premature
4054 * truncatation, restored noisy bits instead of trailing 0s AND gave you
4055 * a choice of 2 flavours of noise according to which of 2 floating-point
4056 * scanners you directed AS to use.
4058 * In: input_line_pointer->whitespace before, or '0' of flonum.
4063 float_cons (float_type
)
4064 /* Clobbers input_line-pointer, checks end-of-line. */
4065 register int float_type
; /* 'f':.ffloat ... 'F':.float ... */
4068 int length
; /* Number of chars in an object. */
4069 register char *err
; /* Error from scanning floating literal. */
4070 char temp
[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT
];
4072 if (is_it_end_of_statement ())
4074 demand_empty_rest_of_line ();
4078 #ifdef md_flush_pending_output
4079 md_flush_pending_output ();
4084 /* input_line_pointer->1st char of a flonum (we hope!). */
4087 /* Skip any 0{letter} that may be present. Don't even check if the
4088 * letter is legal. Someone may invent a "z" format and this routine
4089 * has no use for such information. Lusers beware: you get
4090 * diagnostics if your input is ill-conditioned.
4092 if (input_line_pointer
[0] == '0'
4093 && isalpha ((unsigned char) input_line_pointer
[1]))
4094 input_line_pointer
+= 2;
4096 /* Accept :xxxx, where the x's are hex digits, for a floating
4097 point with the exact digits specified. */
4098 if (input_line_pointer
[0] == ':')
4100 ++input_line_pointer
;
4101 length
= hex_float (float_type
, temp
);
4104 ignore_rest_of_line ();
4110 err
= md_atof (float_type
, temp
, &length
);
4111 know (length
<= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT
);
4115 as_bad (_("Bad floating literal: %s"), err
);
4116 ignore_rest_of_line ();
4127 #ifdef REPEAT_CONS_EXPRESSIONS
4128 if (*input_line_pointer
== ':')
4130 expressionS count_exp
;
4132 ++input_line_pointer
;
4133 expression (&count_exp
);
4134 if (count_exp
.X_op
!= O_constant
4135 || count_exp
.X_add_number
<= 0)
4137 as_warn (_("unresolvable or nonpositive repeat count; using 1"));
4140 count
= count_exp
.X_add_number
;
4144 while (--count
>= 0)
4146 p
= frag_more (length
);
4147 memcpy (p
, temp
, (unsigned int) length
);
4152 while (*input_line_pointer
++ == ',');
4154 --input_line_pointer
; /* Put terminator back into stream. */
4155 demand_empty_rest_of_line ();
4156 } /* float_cons() */
4158 /* Return the size of a LEB128 value */
4161 sizeof_sleb128 (value
)
4164 register int size
= 0;
4165 register unsigned byte
;
4169 byte
= (value
& 0x7f);
4170 /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
4171 Fortunately, we can structure things so that the extra work reduces
4172 to a noop on systems that do things "properly". */
4173 value
= (value
>> 7) | ~(-(offsetT
)1 >> 7);
4176 while (!(((value
== 0) && ((byte
& 0x40) == 0))
4177 || ((value
== -1) && ((byte
& 0x40) != 0))));
4183 sizeof_uleb128 (value
)
4186 register int size
= 0;
4187 register unsigned byte
;
4191 byte
= (value
& 0x7f);
4201 sizeof_leb128 (value
, sign
)
4206 return sizeof_sleb128 ((offsetT
) value
);
4208 return sizeof_uleb128 (value
);
4211 /* Output a LEB128 value. */
4214 output_sleb128 (p
, value
)
4218 register char *orig
= p
;
4223 unsigned byte
= (value
& 0x7f);
4225 /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
4226 Fortunately, we can structure things so that the extra work reduces
4227 to a noop on systems that do things "properly". */
4228 value
= (value
>> 7) | ~(-(offsetT
)1 >> 7);
4230 more
= !((((value
== 0) && ((byte
& 0x40) == 0))
4231 || ((value
== -1) && ((byte
& 0x40) != 0))));
4243 output_uleb128 (p
, value
)
4251 unsigned byte
= (value
& 0x7f);
4254 /* More bytes to follow. */
4265 output_leb128 (p
, value
, sign
)
4271 return output_sleb128 (p
, (offsetT
) value
);
4273 return output_uleb128 (p
, value
);
4276 /* Do the same for bignums. We combine sizeof with output here in that
4277 we don't output for NULL values of P. It isn't really as critical as
4278 for "normal" values that this be streamlined. */
4281 output_big_sleb128 (p
, bignum
, size
)
4283 LITTLENUM_TYPE
*bignum
;
4291 /* Strip leading sign extensions off the bignum. */
4292 while (size
> 0 && bignum
[size
-1] == (LITTLENUM_TYPE
)-1)
4297 if (loaded
< 7 && size
> 0)
4299 val
|= (*bignum
<< loaded
);
4300 loaded
+= 8 * CHARS_PER_LITTLENUM
;
4311 if ((val
== 0 && (byte
& 0x40) == 0)
4312 || (~(val
| ~(((valueT
)1 << loaded
) - 1)) == 0
4313 && (byte
& 0x40) != 0))
4321 while (byte
& 0x80);
4327 output_big_uleb128 (p
, bignum
, size
)
4329 LITTLENUM_TYPE
*bignum
;
4337 /* Strip leading zeros off the bignum. */
4338 /* XXX: Is this needed? */
4339 while (size
> 0 && bignum
[size
-1] == 0)
4344 if (loaded
< 7 && size
> 0)
4346 val
|= (*bignum
<< loaded
);
4347 loaded
+= 8 * CHARS_PER_LITTLENUM
;
4356 if (size
> 0 || val
)
4363 while (byte
& 0x80);
4369 output_big_leb128 (p
, bignum
, size
, sign
)
4371 LITTLENUM_TYPE
*bignum
;
4375 return output_big_sleb128 (p
, bignum
, size
);
4377 return output_big_uleb128 (p
, bignum
, size
);
4380 /* Generate the appropriate fragments for a given expression to emit a
4384 emit_leb128_expr(exp
, sign
)
4388 operatorT op
= exp
->X_op
;
4390 if (op
== O_absent
|| op
== O_illegal
)
4392 as_warn (_("zero assumed for missing expression"));
4393 exp
->X_add_number
= 0;
4396 else if (op
== O_big
&& exp
->X_add_number
<= 0)
4398 as_bad (_("floating point number invalid; zero assumed"));
4399 exp
->X_add_number
= 0;
4402 else if (op
== O_register
)
4404 as_warn (_("register value used as expression"));
4408 if (op
== O_constant
)
4410 /* If we've got a constant, emit the thing directly right now. */
4412 valueT value
= exp
->X_add_number
;
4416 size
= sizeof_leb128 (value
, sign
);
4417 p
= frag_more (size
);
4418 output_leb128 (p
, value
, sign
);
4420 else if (op
== O_big
)
4422 /* O_big is a different sort of constant. */
4427 size
= output_big_leb128 (NULL
, generic_bignum
, exp
->X_add_number
, sign
);
4428 p
= frag_more (size
);
4429 output_big_leb128 (p
, generic_bignum
, exp
->X_add_number
, sign
);
4433 /* Otherwise, we have to create a variable sized fragment and
4434 resolve things later. */
4436 frag_var (rs_leb128
, sizeof_uleb128 (~(valueT
)0), 0, sign
,
4437 make_expr_symbol (exp
), 0, (char *) NULL
);
4441 /* Parse the .sleb128 and .uleb128 pseudos. */
4451 emit_leb128_expr (&exp
, sign
);
4452 } while (*input_line_pointer
++ == ',');
4454 input_line_pointer
--;
4455 demand_empty_rest_of_line ();
4461 * We read 0 or more ',' separated, double-quoted strings.
4463 * Caller should have checked need_pass_2 is FALSE because we don't check it.
4468 stringer (append_zero
) /* Worker to do .ascii etc statements. */
4469 /* Checks end-of-line. */
4470 register int append_zero
; /* 0: don't append '\0', else 1 */
4472 register unsigned int c
;
4475 #ifdef md_flush_pending_output
4476 md_flush_pending_output ();
4480 * The following awkward logic is to parse ZERO or more strings,
4481 * comma separated. Recall a string expression includes spaces
4482 * before the opening '\"' and spaces after the closing '\"'.
4483 * We fake a leading ',' if there is (supposed to be)
4484 * a 1st, expression. We keep demanding expressions for each
4487 if (is_it_end_of_statement ())
4489 c
= 0; /* Skip loop. */
4490 ++input_line_pointer
; /* Compensate for end of loop. */
4494 c
= ','; /* Do loop. */
4496 while (c
== ',' || c
== '<' || c
== '"')
4499 switch (*input_line_pointer
)
4502 ++input_line_pointer
; /*->1st char of string. */
4503 start
= input_line_pointer
;
4504 while (is_a_char (c
= next_char_of_string ()))
4506 FRAG_APPEND_1_CHAR (c
);
4510 FRAG_APPEND_1_CHAR (0);
4512 know (input_line_pointer
[-1] == '\"');
4516 /* In ELF, when gcc is emitting DWARF 1 debugging output, it
4517 will emit .string with a filename in the .debug section
4518 after a sequence of constants. See the comment in
4519 emit_expr for the sequence. emit_expr will set
4520 dwarf_file_string to non-zero if this string might be a
4521 source file name. */
4522 if (strcmp (segment_name (now_seg
), ".debug") != 0)
4523 dwarf_file_string
= 0;
4524 else if (dwarf_file_string
)
4526 c
= input_line_pointer
[-1];
4527 input_line_pointer
[-1] = '\0';
4528 listing_source_file (start
);
4529 input_line_pointer
[-1] = c
;
4536 input_line_pointer
++;
4537 c
= get_single_number ();
4538 FRAG_APPEND_1_CHAR (c
);
4539 if (*input_line_pointer
!= '>')
4541 as_bad (_("Expected <nn>"));
4543 input_line_pointer
++;
4546 input_line_pointer
++;
4550 c
= *input_line_pointer
;
4553 demand_empty_rest_of_line ();
4556 /* FIXME-SOMEDAY: I had trouble here on characters with the
4557 high bits set. We'll probably also have trouble with
4558 multibyte chars, wide chars, etc. Also be careful about
4559 returning values bigger than 1 byte. xoxorich. */
4562 next_char_of_string ()
4564 register unsigned int c
;
4566 c
= *input_line_pointer
++ & CHAR_MASK
;
4574 as_warn (_("Unterminated string: Newline inserted."));
4575 bump_line_counters ();
4578 #ifndef NO_STRING_ESCAPES
4580 switch (c
= *input_line_pointer
++)
4608 break; /* As itself. */
4624 for (i
= 0, number
= 0; isdigit (c
) && i
< 3; c
= *input_line_pointer
++, i
++)
4626 number
= number
* 8 + c
- '0';
4630 --input_line_pointer
;
4639 c
= *input_line_pointer
++;
4640 while (isxdigit (c
))
4643 number
= number
* 16 + c
- '0';
4644 else if (isupper (c
))
4645 number
= number
* 16 + c
- 'A' + 10;
4647 number
= number
* 16 + c
- 'a' + 10;
4648 c
= *input_line_pointer
++;
4651 --input_line_pointer
;
4656 /* To be compatible with BSD 4.2 as: give the luser a linefeed!! */
4657 as_warn (_("Unterminated string: Newline inserted."));
4659 bump_line_counters ();
4664 #ifdef ONLY_STANDARD_ESCAPES
4665 as_bad (_("Bad escaped character in string, '?' assumed"));
4667 #endif /* ONLY_STANDARD_ESCAPES */
4670 } /* switch on escaped char */
4672 #endif /* ! defined (NO_STRING_ESCAPES) */
4676 } /* switch on char */
4678 } /* next_char_of_string() */
4681 get_segmented_expression (expP
)
4682 register expressionS
*expP
;
4684 register segT retval
;
4686 retval
= expression (expP
);
4687 if (expP
->X_op
== O_illegal
4688 || expP
->X_op
== O_absent
4689 || expP
->X_op
== O_big
)
4691 as_bad (_("expected address expression; zero assumed"));
4692 expP
->X_op
= O_constant
;
4693 expP
->X_add_number
= 0;
4694 retval
= absolute_section
;
4700 get_known_segmented_expression (expP
)
4701 register expressionS
*expP
;
4703 register segT retval
;
4705 if ((retval
= get_segmented_expression (expP
)) == undefined_section
)
4707 /* There is no easy way to extract the undefined symbol from the
4709 if (expP
->X_add_symbol
!= NULL
4710 && S_GET_SEGMENT (expP
->X_add_symbol
) != expr_section
)
4711 as_warn (_("symbol \"%s\" undefined; zero assumed"),
4712 S_GET_NAME (expP
->X_add_symbol
));
4714 as_warn (_("some symbol undefined; zero assumed"));
4715 retval
= absolute_section
;
4716 expP
->X_op
= O_constant
;
4717 expP
->X_add_number
= 0;
4719 know (retval
== absolute_section
|| SEG_NORMAL (retval
));
4721 } /* get_known_segmented_expression() */
4724 get_absolute_expression ()
4729 if (exp
.X_op
!= O_constant
)
4731 if (exp
.X_op
!= O_absent
)
4732 as_bad (_("bad or irreducible absolute expression; zero assumed"));
4733 exp
.X_add_number
= 0;
4735 return exp
.X_add_number
;
4738 char /* return terminator */
4739 get_absolute_expression_and_terminator (val_pointer
)
4740 long *val_pointer
; /* return value of expression */
4742 /* FIXME: val_pointer should probably be offsetT *. */
4743 *val_pointer
= (long) get_absolute_expression ();
4744 return (*input_line_pointer
++);
4748 * demand_copy_C_string()
4750 * Like demand_copy_string, but return NULL if the string contains any '\0's.
4751 * Give a warning if that happens.
4754 demand_copy_C_string (len_pointer
)
4759 if ((s
= demand_copy_string (len_pointer
)) != 0)
4763 for (len
= *len_pointer
; len
> 0; len
--)
4770 as_bad (_("This string may not contain \'\\0\'"));
4778 * demand_copy_string()
4780 * Demand string, but return a safe (=private) copy of the string.
4781 * Return NULL if we can't read a string here.
4784 demand_copy_string (lenP
)
4787 register unsigned int c
;
4793 if (*input_line_pointer
== '\"')
4795 input_line_pointer
++; /* Skip opening quote. */
4797 while (is_a_char (c
= next_char_of_string ()))
4799 obstack_1grow (¬es
, c
);
4802 /* JF this next line is so demand_copy_C_string will return a
4803 null terminated string. */
4804 obstack_1grow (¬es
, '\0');
4805 retval
= obstack_finish (¬es
);
4809 as_warn (_("Missing string"));
4811 ignore_rest_of_line ();
4815 } /* demand_copy_string() */
4818 * is_it_end_of_statement()
4820 * In: Input_line_pointer->next character.
4822 * Do: Skip input_line_pointer over all whitespace.
4824 * Out: 1 if input_line_pointer->end-of-line.
4827 is_it_end_of_statement ()
4830 return (is_end_of_line
[(unsigned char) *input_line_pointer
]);
4831 } /* is_it_end_of_statement() */
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 ignore_rest_of_line (); /* check garbage after the expression */
4876 mri_comment_end (stop
, stopc
);
4880 /* .include -- include a file at this point. */
4885 int arg ATTRIBUTE_UNUSED
;
4892 if (! flag_m68k_mri
)
4894 filename
= demand_copy_string (&i
);
4895 if (filename
== NULL
)
4897 /* demand_copy_string has already printed an error and
4898 called ignore_rest_of_line. */
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
;
4914 obstack_1grow (¬es
, '\0');
4915 filename
= obstack_finish (¬es
);
4916 while (! is_end_of_line
[(unsigned char) *input_line_pointer
])
4917 ++input_line_pointer
;
4919 demand_empty_rest_of_line ();
4920 path
= xmalloc ((unsigned long) i
+ include_dir_maxlen
+ 5 /* slop */ );
4921 for (i
= 0; i
< include_dir_count
; i
++)
4923 strcpy (path
, include_dirs
[i
]);
4925 strcat (path
, filename
);
4926 if (0 != (try = fopen (path
, "r")))
4935 /* malloc Storage leak when file is found on path. FIXME-SOMEDAY. */
4936 register_dependency (path
);
4937 input_scrub_insert_file (path
);
4941 add_include_dir (path
)
4946 if (include_dir_count
== 0)
4948 include_dirs
= (char **) xmalloc (2 * sizeof (*include_dirs
));
4949 include_dirs
[0] = "."; /* Current dir */
4950 include_dir_count
= 2;
4954 include_dir_count
++;
4955 include_dirs
= (char **) realloc (include_dirs
,
4956 include_dir_count
* sizeof (*include_dirs
));
4959 include_dirs
[include_dir_count
- 1] = path
; /* New one */
4962 if (i
> include_dir_maxlen
)
4963 include_dir_maxlen
= i
;
4964 } /* add_include_dir() */
4966 /* Output debugging information to denote the source file. */
4969 generate_file_debug ()
4971 if (debug_type
== DEBUG_STABS
)
4972 stabs_generate_asm_file ();
4975 /* Output line number debugging information for the current source line. */
4978 generate_lineno_debug ()
4980 #ifdef ECOFF_DEBUGGING
4981 /* ECOFF assemblers automatically generate debugging information.
4982 FIXME: This should probably be handled elsewhere. */
4983 if (debug_type
== DEBUG_UNSPECIFIED
)
4985 if (ECOFF_DEBUGGING
&& ecoff_no_current_file ())
4986 debug_type
= DEBUG_ECOFF
;
4988 debug_type
= DEBUG_NONE
;
4994 case DEBUG_UNSPECIFIED
:
4998 stabs_generate_asm_lineno ();
5001 ecoff_generate_asm_lineno ();
5010 /* Output debugging information to mark a function entry point or end point.
5011 END_P is zero for .func, and non-zero for .endfunc. */
5017 do_s_func (end_p
, NULL
);
5020 /* Subroutine of s_func so targets can choose a different default prefix.
5021 If DEFAULT_PREFIX is NULL, use the target's "leading char". */
5024 do_s_func (end_p
, default_prefix
)
5026 const char *default_prefix
;
5028 /* Record the current function so that we can issue an error message for
5029 misplaced .func,.endfunc, and also so that .endfunc needs no
5031 static char *current_name
;
5032 static char *current_label
;
5036 if (current_name
== NULL
)
5038 as_bad (_("missing .func"));
5039 ignore_rest_of_line ();
5043 if (debug_type
== DEBUG_STABS
)
5044 stabs_generate_asm_endfunc (current_name
, current_label
);
5046 current_name
= current_label
= NULL
;
5053 if (current_name
!= NULL
)
5055 as_bad (_(".endfunc missing for previous .func"));
5056 ignore_rest_of_line ();
5060 name
= input_line_pointer
;
5061 delim1
= get_symbol_end ();
5062 name
= xstrdup (name
);
5063 *input_line_pointer
= delim1
;
5065 if (*input_line_pointer
!= ',')
5068 asprintf (&label
, "%s%s", default_prefix
, name
);
5071 char leading_char
= 0;
5072 #ifdef BFD_ASSEMBLER
5073 leading_char
= bfd_get_symbol_leading_char (stdoutput
);
5075 /* Missing entry point, use function's name with the leading
5078 asprintf (&label
, "%c%s", leading_char
, name
);
5085 ++input_line_pointer
;
5087 label
= input_line_pointer
;
5088 delim2
= get_symbol_end ();
5089 label
= xstrdup (label
);
5090 *input_line_pointer
= delim2
;
5093 if (debug_type
== DEBUG_STABS
)
5094 stabs_generate_asm_func (name
, label
);
5096 current_name
= name
;
5097 current_label
= label
;
5100 demand_empty_rest_of_line ();
5105 int arg ATTRIBUTE_UNUSED
;
5107 while (!is_end_of_line
[(unsigned char) *input_line_pointer
])
5109 ++input_line_pointer
;
5111 ++input_line_pointer
;
5116 read_print_statistics (file
)
5119 hash_print_statistics (file
, "pseudo-op table", po_hash
);
5122 /* Inserts the given line into the input stream.
5124 This call avoids macro/conditionals nesting checking, since the contents of
5125 the line are assumed to replace the contents of a line already scanned.
5127 An appropriate use of this function would be substition of input lines when
5128 called by md_start_line_hook(). The given line is assumed to already be
5129 properly scrubbed. */
5132 input_scrub_insert_line (line
)
5137 sb_add_string (&newline
, line
);
5138 input_scrub_include_sb (&newline
, input_line_pointer
, 0);
5140 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);
5143 /* Insert a file into the input stream; the path must resolve to an actual
5144 file; no include path searching or dependency registering is performed. */
5147 input_scrub_insert_file (path
)
5150 input_scrub_include_file (path
, input_line_pointer
);
5151 buffer_limit
= input_scrub_next_buffer (&input_line_pointer
);