Add entry omited when Stephane Carrez's h68hc11 code was chaecked in.
[binutils.git] / gas / read.c
blob90c43ddc56b29d2573058ab5b1f3b696aa593dc4
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)
10 any later version.
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
20 02111-1307, USA. */
22 #if 0
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.)
28 #else
29 #define MASK_CHAR ((int)(unsigned char)-1)
30 #endif
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. */
41 /* for isdigit() */
42 #include <ctype.h>
44 #include "as.h"
45 #include "subsegs.h"
46 #include "sb.h"
47 #include "macro.h"
48 #include "obstack.h"
49 #include "listing.h"
50 #include "ecoff.h"
52 #ifndef TC_START_LABEL
53 #define TC_START_LABEL(x,y) (x==':')
54 #endif
56 /* Set by the object-format or the target. */
57 #ifndef TC_IMPLICIT_LCOMM_ALIGNMENT
58 #define TC_IMPLICIT_LCOMM_ALIGNMENT(SIZE, P2VAR) \
59 do { \
60 if ((SIZE) >= 8) \
61 (P2VAR) = 3; \
62 else if ((SIZE) >= 4) \
63 (P2VAR) = 2; \
64 else if ((SIZE) >= 2) \
65 (P2VAR) = 1; \
66 else \
67 (P2VAR) = 0; \
68 } while (0)
69 #endif
71 /* The NOP_OPCODE is for the alignment fill value.
72 * fill it a nop instruction so that the disassembler does not choke
73 * on it
75 #ifndef NOP_OPCODE
76 #define NOP_OPCODE 0x00
77 #endif
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!)! */
84 die horribly;
85 #endif
87 #ifndef LEX_AT
88 /* The m88k unfortunately uses @ as a label beginner. */
89 #define LEX_AT 0
90 #endif
92 #ifndef LEX_BR
93 /* The RS/6000 assembler uses {,},[,] as parts of symbol names. */
94 #define LEX_BR 0
95 #endif
97 #ifndef LEX_PCT
98 /* The Delta 68k assembler permits % inside label names. */
99 #define LEX_PCT 0
100 #endif
102 #ifndef LEX_QM
103 /* The PowerPC Windows NT assemblers permits ? inside label names. */
104 #define LEX_QM 0
105 #endif
107 #ifndef LEX_HASH
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. */
110 #define LEX_HASH 0
111 #endif
113 #ifndef LEX_DOLLAR
114 /* The a29k assembler does not permits labels to start with $. */
115 #define LEX_DOLLAR 3
116 #endif
118 #ifndef LEX_TILDE
119 /* The Delta 68k assembler permits ~ at start of label names. */
120 #define LEX_TILDE 0
121 #endif
123 /* used by is_... macros. our ctype[] */
124 char lex_type[256] =
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
146 * In: a character.
147 * Out: 1 if this character ends a line.
149 char is_end_of_line[256] =
151 #ifdef CR_EOL
152 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, /* @abcdefghijklmno */
153 #else
154 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, /* @abcdefghijklmno */
155 #endif
156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
157 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* _!"#$%&'()*+,-./ */
158 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0123456789:;<=>? */
159 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
160 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
161 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
162 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
163 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
164 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
165 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
166 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
167 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
168 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
169 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
170 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* */
173 /* Functions private to this file. */
175 static char *buffer; /* 1st char of each buffer of lines is here. */
176 static char *buffer_limit; /*->1 + last char in buffer. */
178 /* TARGET_BYTES_BIG_ENDIAN is required to be defined to either 0 or 1 in the
179 tc-<CPU>.h file. See the "Porting GAS" section of the internals manual. */
180 int target_big_endian = TARGET_BYTES_BIG_ENDIAN;
182 static char *old_buffer; /* JF a hack */
183 static char *old_input;
184 static char *old_limit;
186 /* Variables for handling include file directory table. */
188 char **include_dirs; /* Table of pointers to directories to
189 search for .include's */
190 int include_dir_count; /* How many are in the table */
191 int include_dir_maxlen = 1;/* Length of longest in table */
193 #ifndef WORKING_DOT_WORD
194 struct broken_word *broken_words;
195 int new_broken_words;
196 #endif
198 /* The current offset into the absolute section. We don't try to
199 build frags in the absolute section, since no data can be stored
200 there. We just keep track of the current offset. */
201 addressT abs_section_offset;
203 /* If this line had an MRI style label, it is stored in this variable.
204 This is used by some of the MRI pseudo-ops. */
205 symbolS *line_label;
207 /* This global variable is used to support MRI common sections. We
208 translate such sections into a common symbol. This variable is
209 non-NULL when we are in an MRI common section. */
210 symbolS *mri_common_symbol;
212 /* In MRI mode, after a dc.b pseudo-op with an odd number of bytes, we
213 need to align to an even byte boundary unless the next pseudo-op is
214 dc.b, ds.b, or dcb.b. This variable is set to 1 if an alignment
215 may be needed. */
216 static int mri_pending_align;
218 #ifndef NO_LISTING
219 #ifdef OBJ_ELF
220 /* This variable is set to be non-zero if the next string we see might
221 be the name of the source file in DWARF debugging information. See
222 the comment in emit_expr for the format we look for. */
223 static int dwarf_file_string;
224 #endif
225 #endif
227 static void cons_worker PARAMS ((int, int));
228 static int scrub_from_string PARAMS ((char *, int));
229 static void do_align PARAMS ((int, char *, int, int));
230 static void s_align PARAMS ((int, int));
231 static void s_lcomm_internal PARAMS ((int, int));
232 static int hex_float PARAMS ((int, char *));
233 static inline int sizeof_sleb128 PARAMS ((offsetT));
234 static inline int sizeof_uleb128 PARAMS ((valueT));
235 static inline int output_sleb128 PARAMS ((char *, offsetT));
236 static inline int output_uleb128 PARAMS ((char *, valueT));
237 static inline int output_big_sleb128 PARAMS ((char *, LITTLENUM_TYPE *, int));
238 static inline int output_big_uleb128 PARAMS ((char *, LITTLENUM_TYPE *, int));
239 static int output_big_leb128 PARAMS ((char *, LITTLENUM_TYPE *, int, int));
240 static void do_org PARAMS ((segT, expressionS *, int));
241 char *demand_copy_string PARAMS ((int *lenP));
242 static segT get_segmented_expression PARAMS ((expressionS *expP));
243 static segT get_known_segmented_expression PARAMS ((expressionS * expP));
244 static void pobegin PARAMS ((void));
245 static int get_line_sb PARAMS ((sb *));
246 static void generate_file_debug PARAMS ((void));
249 void
250 read_begin ()
252 const char *p;
254 pobegin ();
255 obj_read_begin_hook ();
257 /* Something close -- but not too close -- to a multiple of 1024.
258 The debugging malloc I'm using has 24 bytes of overhead. */
259 obstack_begin (&notes, chunksize);
260 obstack_begin (&cond_obstack, chunksize);
262 /* Use machine dependent syntax */
263 for (p = line_separator_chars; *p; p++)
264 is_end_of_line[(unsigned char) *p] = 1;
265 /* Use more. FIXME-SOMEDAY. */
267 if (flag_mri)
268 lex_type['?'] = 3;
271 /* set up pseudo-op tables */
273 static struct hash_control *po_hash;
275 static const pseudo_typeS potable[] =
277 {"abort", s_abort, 0},
278 {"align", s_align_ptwo, 0},
279 {"ascii", stringer, 0},
280 {"asciz", stringer, 1},
281 {"balign", s_align_bytes, 0},
282 {"balignw", s_align_bytes, -2},
283 {"balignl", s_align_bytes, -4},
284 /* block */
285 {"byte", cons, 1},
286 {"comm", s_comm, 0},
287 {"common", s_mri_common, 0},
288 {"common.s", s_mri_common, 1},
289 {"data", s_data, 0},
290 {"dc", cons, 2},
291 {"dc.b", cons, 1},
292 {"dc.d", float_cons, 'd'},
293 {"dc.l", cons, 4},
294 {"dc.s", float_cons, 'f'},
295 {"dc.w", cons, 2},
296 {"dc.x", float_cons, 'x'},
297 {"dcb", s_space, 2},
298 {"dcb.b", s_space, 1},
299 {"dcb.d", s_float_space, 'd'},
300 {"dcb.l", s_space, 4},
301 {"dcb.s", s_float_space, 'f'},
302 {"dcb.w", s_space, 2},
303 {"dcb.x", s_float_space, 'x'},
304 {"ds", s_space, 2},
305 {"ds.b", s_space, 1},
306 {"ds.d", s_space, 8},
307 {"ds.l", s_space, 4},
308 {"ds.p", s_space, 12},
309 {"ds.s", s_space, 4},
310 {"ds.w", s_space, 2},
311 {"ds.x", s_space, 12},
312 {"debug", s_ignore, 0},
313 #ifdef S_SET_DESC
314 {"desc", s_desc, 0},
315 #endif
316 /* dim */
317 {"double", float_cons, 'd'},
318 /* dsect */
319 {"eject", listing_eject, 0}, /* Formfeed listing */
320 {"else", s_else, 0},
321 {"elsec", s_else, 0},
322 {"elseif", s_elseif, (int) O_ne},
323 {"end", s_end, 0},
324 {"endc", s_endif, 0},
325 {"endfunc", s_func, 1},
326 {"endif", s_endif, 0},
327 /* endef */
328 {"equ", s_set, 0},
329 {"equiv", s_set, 1},
330 {"err", s_err, 0},
331 {"exitm", s_mexit, 0},
332 /* extend */
333 {"extern", s_ignore, 0}, /* We treat all undef as ext */
334 {"appfile", s_app_file, 1},
335 {"appline", s_app_line, 0},
336 {"fail", s_fail, 0},
337 {"file", s_app_file, 0},
338 {"fill", s_fill, 0},
339 {"float", float_cons, 'f'},
340 {"format", s_ignore, 0},
341 {"func", s_func, 0},
342 {"global", s_globl, 0},
343 {"globl", s_globl, 0},
344 {"hword", cons, 2},
345 {"if", s_if, (int) O_ne},
346 {"ifc", s_ifc, 0},
347 {"ifdef", s_ifdef, 0},
348 {"ifeq", s_if, (int) O_eq},
349 {"ifeqs", s_ifeqs, 0},
350 {"ifge", s_if, (int) O_ge},
351 {"ifgt", s_if, (int) O_gt},
352 {"ifle", s_if, (int) O_le},
353 {"iflt", s_if, (int) O_lt},
354 {"ifnc", s_ifc, 1},
355 {"ifndef", s_ifdef, 1},
356 {"ifne", s_if, (int) O_ne},
357 {"ifnes", s_ifeqs, 1},
358 {"ifnotdef", s_ifdef, 1},
359 {"include", s_include, 0},
360 {"int", cons, 4},
361 {"irp", s_irp, 0},
362 {"irep", s_irp, 0},
363 {"irpc", s_irp, 1},
364 {"irepc", s_irp, 1},
365 {"lcomm", s_lcomm, 0},
366 {"lflags", listing_flags, 0}, /* Listing flags */
367 {"linkonce", s_linkonce, 0},
368 {"list", listing_list, 1}, /* Turn listing on */
369 {"llen", listing_psize, 1},
370 {"long", cons, 4},
371 {"lsym", s_lsym, 0},
372 {"macro", s_macro, 0},
373 {"mexit", s_mexit, 0},
374 {"mri", s_mri, 0},
375 {".mri", s_mri, 0}, /* Special case so .mri works in MRI mode. */
376 {"name", s_ignore, 0},
377 {"noformat", s_ignore, 0},
378 {"nolist", listing_list, 0}, /* Turn listing off */
379 {"nopage", listing_nopage, 0},
380 {"octa", cons, 16},
381 {"offset", s_struct, 0},
382 {"org", s_org, 0},
383 {"p2align", s_align_ptwo, 0},
384 {"p2alignw", s_align_ptwo, -2},
385 {"p2alignl", s_align_ptwo, -4},
386 {"page", listing_eject, 0},
387 {"plen", listing_psize, 0},
388 {"print", s_print, 0},
389 {"psize", listing_psize, 0}, /* set paper size */
390 {"purgem", s_purgem, 0},
391 {"quad", cons, 8},
392 {"rep", s_rept, 0},
393 {"rept", s_rept, 0},
394 {"rva", s_rva, 4},
395 {"sbttl", listing_title, 1}, /* Subtitle of listing */
396 /* scl */
397 /* sect */
398 {"set", s_set, 0},
399 {"short", cons, 2},
400 {"single", float_cons, 'f'},
401 /* size */
402 {"space", s_space, 0},
403 {"skip", s_space, 0},
404 {"sleb128", s_leb128, 1},
405 {"spc", s_ignore, 0},
406 {"stabd", s_stab, 'd'},
407 {"stabn", s_stab, 'n'},
408 {"stabs", s_stab, 's'},
409 {"string", stringer, 1},
410 {"struct", s_struct, 0},
411 /* tag */
412 {"text", s_text, 0},
414 /* This is for gcc to use. It's only just been added (2/94), so gcc
415 won't be able to use it for a while -- probably a year or more.
416 But once this has been released, check with gcc maintainers
417 before deleting it or even changing the spelling. */
418 {"this_GCC_requires_the_GNU_assembler", s_ignore, 0},
419 /* If we're folding case -- done for some targets, not necessarily
420 all -- the above string in an input file will be converted to
421 this one. Match it either way... */
422 {"this_gcc_requires_the_gnu_assembler", s_ignore, 0},
424 {"title", listing_title, 0}, /* Listing title */
425 {"ttl", listing_title, 0},
426 /* type */
427 {"uleb128", s_leb128, 0},
428 /* use */
429 /* val */
430 {"xcom", s_comm, 0},
431 {"xdef", s_globl, 0},
432 {"xref", s_ignore, 0},
433 {"xstabs", s_xstab, 's'},
434 {"word", cons, 2},
435 {"zero", s_space, 0},
436 {NULL, NULL, 0} /* end sentinel */
439 static int pop_override_ok = 0;
440 static const char *pop_table_name;
442 void
443 pop_insert (table)
444 const pseudo_typeS *table;
446 const char *errtxt;
447 const pseudo_typeS *pop;
448 for (pop = table; pop->poc_name; pop++)
450 errtxt = hash_insert (po_hash, pop->poc_name, (char *) pop);
451 if (errtxt && (!pop_override_ok || strcmp (errtxt, "exists")))
452 as_fatal (_("error constructing %s pseudo-op table: %s"), pop_table_name,
453 errtxt);
457 #ifndef md_pop_insert
458 #define md_pop_insert() pop_insert(md_pseudo_table)
459 #endif
461 #ifndef obj_pop_insert
462 #define obj_pop_insert() pop_insert(obj_pseudo_table)
463 #endif
465 static void
466 pobegin ()
468 po_hash = hash_new ();
470 /* Do the target-specific pseudo ops. */
471 pop_table_name = "md";
472 md_pop_insert ();
474 /* Now object specific. Skip any that were in the target table. */
475 pop_table_name = "obj";
476 pop_override_ok = 1;
477 obj_pop_insert ();
479 /* Now portable ones. Skip any that we've seen already. */
480 pop_table_name = "standard";
481 pop_insert (potable);
484 #define HANDLE_CONDITIONAL_ASSEMBLY() \
485 if (ignore_input ()) \
487 while (! is_end_of_line[(unsigned char) *input_line_pointer++]) \
488 if (input_line_pointer == buffer_limit) \
489 break; \
490 continue; \
494 /* This function is used when scrubbing the characters between #APP
495 and #NO_APP. */
497 static char *scrub_string;
498 static char *scrub_string_end;
500 static int
501 scrub_from_string (buf, buflen)
502 char *buf;
503 int buflen;
505 int copy;
507 copy = scrub_string_end - scrub_string;
508 if (copy > buflen)
509 copy = buflen;
510 memcpy (buf, scrub_string, copy);
511 scrub_string += copy;
512 return copy;
515 /* read_a_source_file()
517 * We read the file, putting things into a web that
518 * represents what we have been reading.
520 void
521 read_a_source_file (name)
522 char *name;
524 register char c;
525 register char *s; /* string of symbol, '\0' appended */
526 register int temp;
527 pseudo_typeS *pop;
529 buffer = input_scrub_new_file (name);
531 listing_file (name);
532 listing_newline (NULL);
533 register_dependency (name);
535 /* Generate debugging information before we've read anything in to denote
536 this file as the "main" source file and not a subordinate one
537 (e.g. N_SO vs N_SOL in stabs). */
538 generate_file_debug ();
540 while ((buffer_limit = input_scrub_next_buffer (&input_line_pointer)) != 0)
541 { /* We have another line to parse. */
542 know (buffer_limit[-1] == '\n'); /* Must have a sentinel. */
543 contin: /* JF this goto is my fault I admit it.
544 Someone brave please re-write the whole
545 input section here? Pleeze??? */
546 while (input_line_pointer < buffer_limit)
548 /* We have more of this buffer to parse. */
551 * We now have input_line_pointer->1st char of next line.
552 * If input_line_pointer [-1] == '\n' then we just
553 * scanned another line: so bump line counters.
555 if (is_end_of_line[(unsigned char) input_line_pointer[-1]])
557 #ifdef md_start_line_hook
558 md_start_line_hook ();
559 #endif
561 if (input_line_pointer[-1] == '\n')
562 bump_line_counters ();
564 line_label = NULL;
566 if (LABELS_WITHOUT_COLONS || flag_m68k_mri)
568 /* Text at the start of a line must be a label, we
569 run down and stick a colon in. */
570 if (is_name_beginner (*input_line_pointer))
572 char *line_start = input_line_pointer;
573 char c;
574 int mri_line_macro;
576 LISTING_NEWLINE ();
577 HANDLE_CONDITIONAL_ASSEMBLY ();
579 c = get_symbol_end ();
581 /* In MRI mode, the EQU and MACRO pseudoops must
582 be handled specially. */
583 mri_line_macro = 0;
584 if (flag_m68k_mri)
586 char *rest = input_line_pointer + 1;
588 if (*rest == ':')
589 ++rest;
590 if (*rest == ' ' || *rest == '\t')
591 ++rest;
592 if ((strncasecmp (rest, "EQU", 3) == 0
593 || strncasecmp (rest, "SET", 3) == 0)
594 && (rest[3] == ' ' || rest[3] == '\t'))
596 input_line_pointer = rest + 3;
597 equals (line_start,
598 strncasecmp (rest, "SET", 3) == 0);
599 continue;
601 if (strncasecmp (rest, "MACRO", 5) == 0
602 && (rest[5] == ' '
603 || rest[5] == '\t'
604 || is_end_of_line[(unsigned char) rest[5]]))
605 mri_line_macro = 1;
608 /* In MRI mode, we need to handle the MACRO
609 pseudo-op specially: we don't want to put the
610 symbol in the symbol table. */
611 if (! mri_line_macro
612 #ifdef TC_START_LABEL_WITHOUT_COLON
613 && TC_START_LABEL_WITHOUT_COLON(c,
614 input_line_pointer)
615 #endif
617 line_label = colon (line_start);
618 else
619 line_label = symbol_create (line_start,
620 absolute_section,
621 (valueT) 0,
622 &zero_address_frag);
624 *input_line_pointer = c;
625 if (c == ':')
626 input_line_pointer++;
632 * We are at the begining of a line, or similar place.
633 * We expect a well-formed assembler statement.
634 * A "symbol-name:" is a statement.
636 * Depending on what compiler is used, the order of these tests
637 * may vary to catch most common case 1st.
638 * Each test is independent of all other tests at the (top) level.
639 * PLEASE make a compiler that doesn't use this assembler.
640 * It is crufty to waste a compiler's time encoding things for this
641 * assembler, which then wastes more time decoding it.
642 * (And communicating via (linear) files is silly!
643 * If you must pass stuff, please pass a tree!)
645 if ((c = *input_line_pointer++) == '\t'
646 || c == ' '
647 || c == '\f'
648 || c == 0)
650 c = *input_line_pointer++;
652 know (c != ' '); /* No further leading whitespace. */
654 #ifndef NO_LISTING
655 /* If listing is on, and we are expanding a macro, then give
656 the listing code the contents of the expanded line. */
657 if (listing)
659 if ((listing & LISTING_MACEXP) && macro_nest > 0)
661 char *copy;
662 int len;
664 /* Find the end of the current expanded macro line. */
665 for (s = input_line_pointer-1; *s ; ++s)
666 if (is_end_of_line[(unsigned char) *s])
667 break;
669 /* Copy it for safe keeping. Also give an indication of
670 how much macro nesting is involved at this point. */
671 len = s - (input_line_pointer-1);
672 copy = (char *) xmalloc (len + macro_nest + 2);
673 memset (copy, '>', macro_nest);
674 copy[macro_nest] = ' ';
675 memcpy (copy + macro_nest + 1, input_line_pointer-1, len);
676 copy[macro_nest+1+len] = '\0';
678 /* Install the line with the listing facility. */
679 listing_newline (copy);
681 else
682 listing_newline (NULL);
684 #endif
687 * C is the 1st significant character.
688 * Input_line_pointer points after that character.
690 if (is_name_beginner (c))
692 /* want user-defined label or pseudo/opcode */
693 HANDLE_CONDITIONAL_ASSEMBLY ();
695 s = --input_line_pointer;
696 c = get_symbol_end (); /* name's delimiter */
698 * C is character after symbol.
699 * That character's place in the input line is now '\0'.
700 * S points to the beginning of the symbol.
701 * [In case of pseudo-op, s->'.'.]
702 * Input_line_pointer->'\0' where c was.
704 if (TC_START_LABEL(c, input_line_pointer))
706 if (flag_m68k_mri)
708 char *rest = input_line_pointer + 1;
710 /* In MRI mode, \tsym: set 0 is permitted. */
712 if (*rest == ':')
713 ++rest;
714 if (*rest == ' ' || *rest == '\t')
715 ++rest;
716 if ((strncasecmp (rest, "EQU", 3) == 0
717 || strncasecmp (rest, "SET", 3) == 0)
718 && (rest[3] == ' ' || rest[3] == '\t'))
720 input_line_pointer = rest + 3;
721 equals (s, 1);
722 continue;
726 line_label = colon (s); /* user-defined label */
727 *input_line_pointer++ = ':'; /* Put ':' back for error messages' sake. */
728 /* Input_line_pointer->after ':'. */
729 SKIP_WHITESPACE ();
733 else if (c == '='
734 || ((c == ' ' || c == '\t')
735 && input_line_pointer[1] == '='
736 #ifdef TC_EQUAL_IN_INSN
737 && ! TC_EQUAL_IN_INSN (c, input_line_pointer)
738 #endif
741 equals (s, 1);
742 demand_empty_rest_of_line ();
744 else
745 { /* expect pseudo-op or machine instruction */
746 pop = NULL;
748 #define IGNORE_OPCODE_CASE
749 #ifdef IGNORE_OPCODE_CASE
751 char *s2 = s;
752 while (*s2)
754 if (isupper ((unsigned char) *s2))
755 *s2 = tolower (*s2);
756 s2++;
759 #endif
761 if (NO_PSEUDO_DOT || flag_m68k_mri)
763 /* The MRI assembler and the m88k use pseudo-ops
764 without a period. */
765 pop = (pseudo_typeS *) hash_find (po_hash, s);
766 if (pop != NULL && pop->poc_handler == NULL)
767 pop = NULL;
770 if (pop != NULL
771 || (! flag_m68k_mri && *s == '.'))
774 * PSEUDO - OP.
776 * WARNING: c has next char, which may be end-of-line.
777 * We lookup the pseudo-op table with s+1 because we
778 * already know that the pseudo-op begins with a '.'.
781 if (pop == NULL)
782 pop = (pseudo_typeS *) hash_find (po_hash, s + 1);
784 /* In MRI mode, we may need to insert an
785 automatic alignment directive. What a hack
786 this is. */
787 if (mri_pending_align
788 && (pop == NULL
789 || ! ((pop->poc_handler == cons
790 && pop->poc_val == 1)
791 || (pop->poc_handler == s_space
792 && pop->poc_val == 1)
793 #ifdef tc_conditional_pseudoop
794 || tc_conditional_pseudoop (pop)
795 #endif
796 || pop->poc_handler == s_if
797 || pop->poc_handler == s_ifdef
798 || pop->poc_handler == s_ifc
799 || pop->poc_handler == s_ifeqs
800 || pop->poc_handler == s_else
801 || pop->poc_handler == s_endif
802 || pop->poc_handler == s_globl
803 || pop->poc_handler == s_ignore)))
805 do_align (1, (char *) NULL, 0, 0);
806 mri_pending_align = 0;
807 if (line_label != NULL)
809 symbol_set_frag (line_label, frag_now);
810 S_SET_VALUE (line_label, frag_now_fix ());
814 /* Print the error msg now, while we still can */
815 if (pop == NULL)
817 as_bad (_("Unknown pseudo-op: `%s'"), s);
818 *input_line_pointer = c;
819 s_ignore (0);
820 continue;
823 /* Put it back for error messages etc. */
824 *input_line_pointer = c;
825 /* The following skip of whitespace is compulsory.
826 A well shaped space is sometimes all that separates
827 keyword from operands. */
828 if (c == ' ' || c == '\t')
829 input_line_pointer++;
831 * Input_line is restored.
832 * Input_line_pointer->1st non-blank char
833 * after pseudo-operation.
835 (*pop->poc_handler) (pop->poc_val);
837 /* If that was .end, just get out now. */
838 if (pop->poc_handler == s_end)
839 goto quit;
841 else
843 int inquote = 0;
844 #ifdef QUOTES_IN_INSN
845 int inescape = 0;
846 #endif
848 /* WARNING: c has char, which may be end-of-line. */
849 /* Also: input_line_pointer->`\0` where c was. */
850 *input_line_pointer = c;
851 while (!is_end_of_line[(unsigned char) *input_line_pointer]
852 || inquote
853 #ifdef TC_EOL_IN_INSN
854 || TC_EOL_IN_INSN (input_line_pointer)
855 #endif
858 if (flag_m68k_mri && *input_line_pointer == '\'')
859 inquote = ! inquote;
860 #ifdef QUOTES_IN_INSN
861 if (inescape)
862 inescape = 0;
863 else if (*input_line_pointer == '"')
864 inquote = ! inquote;
865 else if (*input_line_pointer == '\\')
866 inescape = 1;
867 #endif
868 input_line_pointer++;
871 c = *input_line_pointer;
872 *input_line_pointer = '\0';
874 generate_lineno_debug ();
876 if (macro_defined)
878 sb out;
879 const char *err;
880 macro_entry *macro;
882 if (check_macro (s, &out, '\0', &err, &macro))
884 if (err != NULL)
885 as_bad ("%s", err);
886 *input_line_pointer++ = c;
887 input_scrub_include_sb (&out,
888 input_line_pointer, 1);
889 sb_kill (&out);
890 buffer_limit =
891 input_scrub_next_buffer (&input_line_pointer);
892 #ifdef md_macro_info
893 md_macro_info (macro);
894 #endif
895 continue;
899 if (mri_pending_align)
901 do_align (1, (char *) NULL, 0, 0);
902 mri_pending_align = 0;
903 if (line_label != NULL)
905 symbol_set_frag (line_label, frag_now);
906 S_SET_VALUE (line_label, frag_now_fix ());
910 md_assemble (s); /* Assemble 1 instruction. */
912 *input_line_pointer++ = c;
914 /* We resume loop AFTER the end-of-line from
915 this instruction. */
916 } /* if (*s=='.') */
917 } /* if c==':' */
918 continue;
919 } /* if (is_name_beginner(c) */
922 /* Empty statement? */
923 if (is_end_of_line[(unsigned char) c])
924 continue;
926 if ((LOCAL_LABELS_DOLLAR || LOCAL_LABELS_FB)
927 && isdigit ((unsigned char) c))
929 /* local label ("4:") */
930 char *backup = input_line_pointer;
932 HANDLE_CONDITIONAL_ASSEMBLY ();
934 temp = c - '0';
936 while (isdigit ((unsigned char) *input_line_pointer))
938 temp = (temp * 10) + *input_line_pointer - '0';
939 ++input_line_pointer;
940 } /* read the whole number */
942 if (LOCAL_LABELS_DOLLAR
943 && *input_line_pointer == '$'
944 && *(input_line_pointer + 1) == ':')
946 input_line_pointer += 2;
948 if (dollar_label_defined (temp))
950 as_fatal (_("label \"%d$\" redefined"), temp);
953 define_dollar_label (temp);
954 colon (dollar_label_name (temp, 0));
955 continue;
958 if (LOCAL_LABELS_FB
959 && *input_line_pointer++ == ':')
961 fb_label_instance_inc (temp);
962 colon (fb_label_name (temp, 0));
963 continue;
966 input_line_pointer = backup;
967 } /* local label ("4:") */
969 if (c && strchr (line_comment_chars, c))
970 { /* Its a comment. Better say APP or NO_APP */
971 char *ends;
972 char *new_buf;
973 char *new_tmp;
974 unsigned int new_length;
975 char *tmp_buf = 0;
977 bump_line_counters ();
978 s = input_line_pointer;
979 if (strncmp (s, "APP\n", 4))
980 continue; /* We ignore it */
981 s += 4;
983 ends = strstr (s, "#NO_APP\n");
985 if (!ends)
987 unsigned int tmp_len;
988 unsigned int num;
990 /* The end of the #APP wasn't in this buffer. We
991 keep reading in buffers until we find the #NO_APP
992 that goes with this #APP There is one. The specs
993 guarentee it. . . */
994 tmp_len = buffer_limit - s;
995 tmp_buf = xmalloc (tmp_len + 1);
996 memcpy (tmp_buf, s, tmp_len);
999 new_tmp = input_scrub_next_buffer (&buffer);
1000 if (!new_tmp)
1001 break;
1002 else
1003 buffer_limit = new_tmp;
1004 input_line_pointer = buffer;
1005 ends = strstr (buffer, "#NO_APP\n");
1006 if (ends)
1007 num = ends - buffer;
1008 else
1009 num = buffer_limit - buffer;
1011 tmp_buf = xrealloc (tmp_buf, tmp_len + num);
1012 memcpy (tmp_buf + tmp_len, buffer, num);
1013 tmp_len += num;
1015 while (!ends);
1017 input_line_pointer = ends ? ends + 8 : NULL;
1019 s = tmp_buf;
1020 ends = s + tmp_len;
1023 else
1025 input_line_pointer = ends + 8;
1028 scrub_string = s;
1029 scrub_string_end = ends;
1031 new_length = ends - s;
1032 new_buf = (char *) xmalloc (new_length);
1033 new_tmp = new_buf;
1034 for (;;)
1036 int space;
1037 int size;
1039 space = (new_buf + new_length) - new_tmp;
1040 size = do_scrub_chars (scrub_from_string, new_tmp, space);
1042 if (size < space)
1044 new_tmp += size;
1045 break;
1048 new_buf = xrealloc (new_buf, new_length + 100);
1049 new_tmp = new_buf + new_length;
1050 new_length += 100;
1053 if (tmp_buf)
1054 free (tmp_buf);
1055 old_buffer = buffer;
1056 old_input = input_line_pointer;
1057 old_limit = buffer_limit;
1058 buffer = new_buf;
1059 input_line_pointer = new_buf;
1060 buffer_limit = new_tmp;
1061 continue;
1064 HANDLE_CONDITIONAL_ASSEMBLY ();
1066 #ifdef tc_unrecognized_line
1067 if (tc_unrecognized_line (c))
1068 continue;
1069 #endif
1071 /* as_warn("Junk character %d.",c); Now done by ignore_rest */
1072 input_line_pointer--; /* Report unknown char as ignored. */
1073 ignore_rest_of_line ();
1074 } /* while (input_line_pointer<buffer_limit) */
1076 #ifdef md_after_pass_hook
1077 md_after_pass_hook ();
1078 #endif
1080 if (old_buffer)
1082 free (buffer);
1083 bump_line_counters ();
1084 if (old_input != 0)
1086 buffer = old_buffer;
1087 input_line_pointer = old_input;
1088 buffer_limit = old_limit;
1089 old_buffer = 0;
1090 goto contin;
1093 } /* while (more buffers to scan) */
1095 quit:
1097 #ifdef md_cleanup
1098 md_cleanup();
1099 #endif
1100 input_scrub_close (); /* Close the input file */
1103 /* For most MRI pseudo-ops, the line actually ends at the first
1104 nonquoted space. This function looks for that point, stuffs a null
1105 in, and sets *STOPCP to the character that used to be there, and
1106 returns the location.
1108 Until I hear otherwise, I am going to assume that this is only true
1109 for the m68k MRI assembler. */
1111 char *
1112 mri_comment_field (stopcp)
1113 char *stopcp;
1115 #ifdef TC_M68K
1117 char *s;
1118 int inquote = 0;
1120 know (flag_m68k_mri);
1122 for (s = input_line_pointer;
1123 ((! is_end_of_line[(unsigned char) *s] && *s != ' ' && *s != '\t')
1124 || inquote);
1125 s++)
1127 if (*s == '\'')
1128 inquote = ! inquote;
1130 *stopcp = *s;
1131 *s = '\0';
1132 return s;
1134 #else
1136 char *s;
1138 for (s = input_line_pointer; ! is_end_of_line[(unsigned char) *s]; s++)
1140 *stopcp = *s;
1141 *s = '\0';
1142 return s;
1144 #endif
1148 /* Skip to the end of an MRI comment field. */
1150 void
1151 mri_comment_end (stop, stopc)
1152 char *stop;
1153 int stopc;
1155 know (flag_mri);
1157 input_line_pointer = stop;
1158 *stop = stopc;
1159 while (! is_end_of_line[(unsigned char) *input_line_pointer])
1160 ++input_line_pointer;
1163 void
1164 s_abort (ignore)
1165 int ignore ATTRIBUTE_UNUSED;
1167 as_fatal (_(".abort detected. Abandoning ship."));
1170 /* Guts of .align directive. N is the power of two to which to align.
1171 FILL may be NULL, or it may point to the bytes of the fill pattern.
1172 LEN is the length of whatever FILL points to, if anything. MAX is
1173 the maximum number of characters to skip when doing the alignment,
1174 or 0 if there is no maximum. */
1176 static void
1177 do_align (n, fill, len, max)
1178 int n;
1179 char *fill;
1180 int len;
1181 int max;
1183 char default_fill;
1185 #ifdef md_do_align
1186 md_do_align (n, fill, len, max, just_record_alignment);
1187 #endif
1189 if (fill == NULL)
1191 if (subseg_text_p (now_seg))
1192 default_fill = NOP_OPCODE;
1193 else
1194 default_fill = 0;
1195 fill = &default_fill;
1196 len = 1;
1199 /* Only make a frag if we HAVE to. . . */
1200 if (n != 0 && !need_pass_2)
1202 if (len <= 1)
1203 frag_align (n, *fill, max);
1204 else
1205 frag_align_pattern (n, fill, len, max);
1208 #ifdef md_do_align
1209 just_record_alignment:
1210 #endif
1212 record_alignment (now_seg, n - OCTETS_PER_BYTE_POWER);
1215 /* Handle the .align pseudo-op. A positive ARG is a default alignment
1216 (in bytes). A negative ARG is the negative of the length of the
1217 fill pattern. BYTES_P is non-zero if the alignment value should be
1218 interpreted as the byte boundary, rather than the power of 2. */
1220 static void
1221 s_align (arg, bytes_p)
1222 int arg;
1223 int bytes_p;
1225 register unsigned int align;
1226 char *stop = NULL;
1227 char stopc;
1228 offsetT fill = 0;
1229 int max;
1230 int fill_p;
1232 if (flag_mri)
1233 stop = mri_comment_field (&stopc);
1235 if (is_end_of_line[(unsigned char) *input_line_pointer])
1237 if (arg < 0)
1238 align = 0;
1239 else
1240 align = arg; /* Default value from pseudo-op table */
1242 else
1244 align = get_absolute_expression ();
1245 SKIP_WHITESPACE ();
1248 if (bytes_p)
1250 /* Convert to a power of 2. */
1251 if (align != 0)
1253 unsigned int i;
1255 for (i = 0; (align & 1) == 0; align >>= 1, ++i)
1257 if (align != 1)
1258 as_bad (_("Alignment not a power of 2"));
1259 align = i;
1263 if (align > 15)
1265 align = 15;
1266 as_bad (_("Alignment too large: %u assumed"), align);
1269 if (*input_line_pointer != ',')
1271 fill_p = 0;
1272 max = 0;
1274 else
1276 ++input_line_pointer;
1277 if (*input_line_pointer == ',')
1278 fill_p = 0;
1279 else
1281 fill = get_absolute_expression ();
1282 SKIP_WHITESPACE ();
1283 fill_p = 1;
1286 if (*input_line_pointer != ',')
1287 max = 0;
1288 else
1290 ++input_line_pointer;
1291 max = get_absolute_expression ();
1295 if (! fill_p)
1297 if (arg < 0)
1298 as_warn (_("expected fill pattern missing"));
1299 do_align (align, (char *) NULL, 0, max);
1301 else
1303 int fill_len;
1305 if (arg >= 0)
1306 fill_len = 1;
1307 else
1308 fill_len = - arg;
1309 if (fill_len <= 1)
1311 char fill_char;
1313 fill_char = fill;
1314 do_align (align, &fill_char, fill_len, max);
1316 else
1318 char ab[16];
1320 if ((size_t) fill_len > sizeof ab)
1321 abort ();
1322 md_number_to_chars (ab, fill, fill_len);
1323 do_align (align, ab, fill_len, max);
1327 demand_empty_rest_of_line ();
1329 if (flag_mri)
1330 mri_comment_end (stop, stopc);
1333 /* Handle the .align pseudo-op on machines where ".align 4" means
1334 align to a 4 byte boundary. */
1336 void
1337 s_align_bytes (arg)
1338 int arg;
1340 s_align (arg, 1);
1343 /* Handle the .align pseudo-op on machines where ".align 4" means align
1344 to a 2**4 boundary. */
1346 void
1347 s_align_ptwo (arg)
1348 int arg;
1350 s_align (arg, 0);
1353 void
1354 s_comm (ignore)
1355 int ignore ATTRIBUTE_UNUSED;
1357 register char *name;
1358 register char c;
1359 register char *p;
1360 offsetT temp;
1361 register symbolS *symbolP;
1362 char *stop = NULL;
1363 char stopc;
1365 if (flag_mri)
1366 stop = mri_comment_field (&stopc);
1368 name = input_line_pointer;
1369 c = get_symbol_end ();
1370 /* just after name is now '\0' */
1371 p = input_line_pointer;
1372 *p = c;
1373 SKIP_WHITESPACE ();
1374 if (*input_line_pointer != ',')
1376 as_bad (_("Expected comma after symbol-name: rest of line ignored."));
1377 ignore_rest_of_line ();
1378 if (flag_mri)
1379 mri_comment_end (stop, stopc);
1380 return;
1382 input_line_pointer++; /* skip ',' */
1383 if ((temp = get_absolute_expression ()) < 0)
1385 as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) temp);
1386 ignore_rest_of_line ();
1387 if (flag_mri)
1388 mri_comment_end (stop, stopc);
1389 return;
1391 *p = 0;
1392 symbolP = symbol_find_or_make (name);
1393 *p = c;
1394 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
1396 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
1397 S_GET_NAME (symbolP));
1398 ignore_rest_of_line ();
1399 if (flag_mri)
1400 mri_comment_end (stop, stopc);
1401 return;
1403 if (S_GET_VALUE (symbolP))
1405 if (S_GET_VALUE (symbolP) != (valueT) temp)
1406 as_bad (_("Length of .comm \"%s\" is already %ld. Not changed to %ld."),
1407 S_GET_NAME (symbolP),
1408 (long) S_GET_VALUE (symbolP),
1409 (long) temp);
1411 else
1413 S_SET_VALUE (symbolP, (valueT) temp);
1414 S_SET_EXTERNAL (symbolP);
1416 #ifdef OBJ_VMS
1418 extern int flag_one;
1419 if ( (!temp) || !flag_one)
1420 S_GET_OTHER(symbolP) = const_flag;
1422 #endif /* not OBJ_VMS */
1423 know (symbolP->sy_frag == &zero_address_frag);
1425 demand_empty_rest_of_line ();
1427 if (flag_mri)
1428 mri_comment_end (stop, stopc);
1429 } /* s_comm() */
1431 /* The MRI COMMON pseudo-op. We handle this by creating a common
1432 symbol with the appropriate name. We make s_space do the right
1433 thing by increasing the size. */
1435 void
1436 s_mri_common (small)
1437 int small ATTRIBUTE_UNUSED;
1439 char *name;
1440 char c;
1441 char *alc = NULL;
1442 symbolS *sym;
1443 offsetT align;
1444 char *stop = NULL;
1445 char stopc;
1447 if (! flag_mri)
1449 s_comm (0);
1450 return;
1453 stop = mri_comment_field (&stopc);
1455 SKIP_WHITESPACE ();
1457 name = input_line_pointer;
1458 if (! isdigit ((unsigned char) *name))
1459 c = get_symbol_end ();
1460 else
1464 ++input_line_pointer;
1466 while (isdigit ((unsigned char) *input_line_pointer));
1467 c = *input_line_pointer;
1468 *input_line_pointer = '\0';
1470 if (line_label != NULL)
1472 alc = (char *) xmalloc (strlen (S_GET_NAME (line_label))
1473 + (input_line_pointer - name)
1474 + 1);
1475 sprintf (alc, "%s%s", name, S_GET_NAME (line_label));
1476 name = alc;
1480 sym = symbol_find_or_make (name);
1481 *input_line_pointer = c;
1482 if (alc != NULL)
1483 free (alc);
1485 if (*input_line_pointer != ',')
1486 align = 0;
1487 else
1489 ++input_line_pointer;
1490 align = get_absolute_expression ();
1493 if (S_IS_DEFINED (sym) && ! S_IS_COMMON (sym))
1495 as_bad (_("attempt to re-define symbol `%s'"), S_GET_NAME (sym));
1496 ignore_rest_of_line ();
1497 mri_comment_end (stop, stopc);
1498 return;
1501 S_SET_EXTERNAL (sym);
1502 mri_common_symbol = sym;
1504 #ifdef S_SET_ALIGN
1505 if (align != 0)
1506 S_SET_ALIGN (sym, align);
1507 #endif
1509 if (line_label != NULL)
1511 expressionS exp;
1512 exp.X_op = O_symbol;
1513 exp.X_add_symbol = sym;
1514 exp.X_add_number = 0;
1515 symbol_set_value_expression (line_label, &exp);
1516 symbol_set_frag (line_label, &zero_address_frag);
1517 S_SET_SEGMENT (line_label, expr_section);
1520 /* FIXME: We just ignore the small argument, which distinguishes
1521 COMMON and COMMON.S. I don't know what we can do about it. */
1523 /* Ignore the type and hptype. */
1524 if (*input_line_pointer == ',')
1525 input_line_pointer += 2;
1526 if (*input_line_pointer == ',')
1527 input_line_pointer += 2;
1529 demand_empty_rest_of_line ();
1531 mri_comment_end (stop, stopc);
1534 void
1535 s_data (ignore)
1536 int ignore ATTRIBUTE_UNUSED;
1538 segT section;
1539 register int temp;
1541 temp = get_absolute_expression ();
1542 if (flag_readonly_data_in_text)
1544 section = text_section;
1545 temp += 1000;
1547 else
1548 section = data_section;
1550 subseg_set (section, (subsegT) temp);
1552 #ifdef OBJ_VMS
1553 const_flag = 0;
1554 #endif
1555 demand_empty_rest_of_line ();
1558 /* Handle the .appfile pseudo-op. This is automatically generated by
1559 do_scrub_chars when a preprocessor # line comment is seen with a
1560 file name. This default definition may be overridden by the object
1561 or CPU specific pseudo-ops. This function is also the default
1562 definition for .file; the APPFILE argument is 1 for .appfile, 0 for
1563 .file. */
1565 void
1566 s_app_file (appfile)
1567 int appfile;
1569 register char *s;
1570 int length;
1572 /* Some assemblers tolerate immediately following '"' */
1573 if ((s = demand_copy_string (&length)) != 0)
1575 /* If this is a fake .appfile, a fake newline was inserted into
1576 the buffer. Passing -2 to new_logical_line tells it to
1577 account for it. */
1578 int may_omit
1579 = (! new_logical_line (s, appfile ? -2 : -1) && appfile);
1581 /* In MRI mode, the preprocessor may have inserted an extraneous
1582 backquote. */
1583 if (flag_m68k_mri
1584 && *input_line_pointer == '\''
1585 && is_end_of_line[(unsigned char) input_line_pointer[1]])
1586 ++input_line_pointer;
1588 demand_empty_rest_of_line ();
1589 if (! may_omit)
1591 #ifdef LISTING
1592 if (listing)
1593 listing_source_file (s);
1594 #endif
1595 register_dependency (s);
1596 #ifdef obj_app_file
1597 obj_app_file (s);
1598 #endif
1603 /* Handle the .appline pseudo-op. This is automatically generated by
1604 do_scrub_chars when a preprocessor # line comment is seen. This
1605 default definition may be overridden by the object or CPU specific
1606 pseudo-ops. */
1608 void
1609 s_app_line (ignore)
1610 int ignore ATTRIBUTE_UNUSED;
1612 int l;
1614 /* The given number is that of the next line. */
1615 l = get_absolute_expression () - 1;
1616 if (l < 0)
1617 /* Some of the back ends can't deal with non-positive line numbers.
1618 Besides, it's silly. */
1619 as_warn (_("Line numbers must be positive; line number %d rejected."), l+1);
1620 else
1622 new_logical_line ((char *) NULL, l);
1623 #ifdef LISTING
1624 if (listing)
1625 listing_source_line (l);
1626 #endif
1628 demand_empty_rest_of_line ();
1631 /* Handle the .end pseudo-op. Actually, the real work is done in
1632 read_a_source_file. */
1634 void
1635 s_end (ignore)
1636 int ignore ATTRIBUTE_UNUSED;
1638 if (flag_mri)
1640 /* The MRI assembler permits the start symbol to follow .end,
1641 but we don't support that. */
1642 SKIP_WHITESPACE ();
1643 if (! is_end_of_line[(unsigned char) *input_line_pointer]
1644 && *input_line_pointer != '*'
1645 && *input_line_pointer != '!')
1646 as_warn (_("start address not supported"));
1650 /* Handle the .err pseudo-op. */
1652 void
1653 s_err (ignore)
1654 int ignore ATTRIBUTE_UNUSED;
1656 as_bad (_(".err encountered"));
1657 demand_empty_rest_of_line ();
1660 /* Handle the MRI fail pseudo-op. */
1662 void
1663 s_fail (ignore)
1664 int ignore ATTRIBUTE_UNUSED;
1666 offsetT temp;
1667 char *stop = NULL;
1668 char stopc;
1670 if (flag_mri)
1671 stop = mri_comment_field (&stopc);
1673 temp = get_absolute_expression ();
1674 if (temp >= 500)
1675 as_warn (_(".fail %ld encountered"), (long) temp);
1676 else
1677 as_bad (_(".fail %ld encountered"), (long) temp);
1679 demand_empty_rest_of_line ();
1681 if (flag_mri)
1682 mri_comment_end (stop, stopc);
1685 void
1686 s_fill (ignore)
1687 int ignore ATTRIBUTE_UNUSED;
1689 expressionS rep_exp;
1690 long size = 1;
1691 register long fill = 0;
1692 char *p;
1694 #ifdef md_flush_pending_output
1695 md_flush_pending_output ();
1696 #endif
1698 get_known_segmented_expression (&rep_exp);
1699 if (*input_line_pointer == ',')
1701 input_line_pointer++;
1702 size = get_absolute_expression ();
1703 if (*input_line_pointer == ',')
1705 input_line_pointer++;
1706 fill = get_absolute_expression ();
1710 /* This is to be compatible with BSD 4.2 AS, not for any rational reason. */
1711 #define BSD_FILL_SIZE_CROCK_8 (8)
1712 if (size > BSD_FILL_SIZE_CROCK_8)
1714 as_warn (_(".fill size clamped to %d."), BSD_FILL_SIZE_CROCK_8);
1715 size = BSD_FILL_SIZE_CROCK_8;
1717 if (size < 0)
1719 as_warn (_("Size negative: .fill ignored."));
1720 size = 0;
1722 else if (rep_exp.X_op == O_constant && rep_exp.X_add_number <= 0)
1724 if (rep_exp.X_add_number < 0)
1725 as_warn (_("Repeat < 0, .fill ignored"));
1726 size = 0;
1729 if (size && !need_pass_2)
1731 if (rep_exp.X_op == O_constant)
1733 p = frag_var (rs_fill, (int) size, (int) size,
1734 (relax_substateT) 0, (symbolS *) 0,
1735 (offsetT) rep_exp.X_add_number,
1736 (char *) 0);
1738 else
1740 /* We don't have a constant repeat count, so we can't use
1741 rs_fill. We can get the same results out of rs_space,
1742 but its argument is in bytes, so we must multiply the
1743 repeat count by size. */
1745 symbolS *rep_sym;
1746 rep_sym = make_expr_symbol (&rep_exp);
1747 if (size != 1)
1749 expressionS size_exp;
1750 size_exp.X_op = O_constant;
1751 size_exp.X_add_number = size;
1753 rep_exp.X_op = O_multiply;
1754 rep_exp.X_add_symbol = rep_sym;
1755 rep_exp.X_op_symbol = make_expr_symbol (&size_exp);
1756 rep_exp.X_add_number = 0;
1757 rep_sym = make_expr_symbol (&rep_exp);
1760 p = frag_var (rs_space, (int) size, (int) size,
1761 (relax_substateT) 0, rep_sym, (offsetT) 0, (char *) 0);
1763 memset (p, 0, (unsigned int) size);
1764 /* The magic number BSD_FILL_SIZE_CROCK_4 is from BSD 4.2 VAX
1765 * flavoured AS. The following bizzare behaviour is to be
1766 * compatible with above. I guess they tried to take up to 8
1767 * bytes from a 4-byte expression and they forgot to sign
1768 * extend. Un*x Sux. */
1769 #define BSD_FILL_SIZE_CROCK_4 (4)
1770 md_number_to_chars (p, (valueT) fill,
1771 (size > BSD_FILL_SIZE_CROCK_4
1772 ? BSD_FILL_SIZE_CROCK_4
1773 : (int) size));
1774 /* Note: .fill (),0 emits no frag (since we are asked to .fill 0 bytes)
1775 * but emits no error message because it seems a legal thing to do.
1776 * It is a degenerate case of .fill but could be emitted by a compiler.
1779 demand_empty_rest_of_line ();
1782 void
1783 s_globl (ignore)
1784 int ignore ATTRIBUTE_UNUSED;
1786 char *name;
1787 int c;
1788 symbolS *symbolP;
1789 char *stop = NULL;
1790 char stopc;
1792 if (flag_mri)
1793 stop = mri_comment_field (&stopc);
1797 name = input_line_pointer;
1798 c = get_symbol_end ();
1799 symbolP = symbol_find_or_make (name);
1800 S_SET_EXTERNAL (symbolP);
1802 *input_line_pointer = c;
1803 SKIP_WHITESPACE ();
1804 c = *input_line_pointer;
1805 if (c == ',')
1807 input_line_pointer++;
1808 SKIP_WHITESPACE ();
1809 if (*input_line_pointer == '\n')
1810 c = '\n';
1813 while (c == ',');
1815 demand_empty_rest_of_line ();
1817 if (flag_mri)
1818 mri_comment_end (stop, stopc);
1821 /* Handle the MRI IRP and IRPC pseudo-ops. */
1823 void
1824 s_irp (irpc)
1825 int irpc;
1827 char *file;
1828 unsigned int line;
1829 sb s;
1830 const char *err;
1831 sb out;
1833 as_where (&file, &line);
1835 sb_new (&s);
1836 while (! is_end_of_line[(unsigned char) *input_line_pointer])
1837 sb_add_char (&s, *input_line_pointer++);
1839 sb_new (&out);
1841 err = expand_irp (irpc, 0, &s, &out, get_line_sb, '\0');
1842 if (err != NULL)
1843 as_bad_where (file, line, "%s", err);
1845 sb_kill (&s);
1847 input_scrub_include_sb (&out, input_line_pointer, 1);
1848 sb_kill (&out);
1849 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
1852 /* Handle the .linkonce pseudo-op. This tells the assembler to mark
1853 the section to only be linked once. However, this is not supported
1854 by most object file formats. This takes an optional argument,
1855 which is what to do about duplicates. */
1857 void
1858 s_linkonce (ignore)
1859 int ignore ATTRIBUTE_UNUSED;
1861 enum linkonce_type type;
1863 SKIP_WHITESPACE ();
1865 type = LINKONCE_DISCARD;
1867 if (! is_end_of_line[(unsigned char) *input_line_pointer])
1869 char *s;
1870 char c;
1872 s = input_line_pointer;
1873 c = get_symbol_end ();
1874 if (strcasecmp (s, "discard") == 0)
1875 type = LINKONCE_DISCARD;
1876 else if (strcasecmp (s, "one_only") == 0)
1877 type = LINKONCE_ONE_ONLY;
1878 else if (strcasecmp (s, "same_size") == 0)
1879 type = LINKONCE_SAME_SIZE;
1880 else if (strcasecmp (s, "same_contents") == 0)
1881 type = LINKONCE_SAME_CONTENTS;
1882 else
1883 as_warn (_("unrecognized .linkonce type `%s'"), s);
1885 *input_line_pointer = c;
1888 #ifdef obj_handle_link_once
1889 obj_handle_link_once (type);
1890 #else /* ! defined (obj_handle_link_once) */
1891 #ifdef BFD_ASSEMBLER
1893 flagword flags;
1895 if ((bfd_applicable_section_flags (stdoutput) & SEC_LINK_ONCE) == 0)
1896 as_warn (_(".linkonce is not supported for this object file format"));
1898 flags = bfd_get_section_flags (stdoutput, now_seg);
1899 flags |= SEC_LINK_ONCE;
1900 switch (type)
1902 default:
1903 abort ();
1904 case LINKONCE_DISCARD:
1905 flags |= SEC_LINK_DUPLICATES_DISCARD;
1906 break;
1907 case LINKONCE_ONE_ONLY:
1908 flags |= SEC_LINK_DUPLICATES_ONE_ONLY;
1909 break;
1910 case LINKONCE_SAME_SIZE:
1911 flags |= SEC_LINK_DUPLICATES_SAME_SIZE;
1912 break;
1913 case LINKONCE_SAME_CONTENTS:
1914 flags |= SEC_LINK_DUPLICATES_SAME_CONTENTS;
1915 break;
1917 if (! bfd_set_section_flags (stdoutput, now_seg, flags))
1918 as_bad (_("bfd_set_section_flags: %s"),
1919 bfd_errmsg (bfd_get_error ()));
1921 #else /* ! defined (BFD_ASSEMBLER) */
1922 as_warn (_(".linkonce is not supported for this object file format"));
1923 #endif /* ! defined (BFD_ASSEMBLER) */
1924 #endif /* ! defined (obj_handle_link_once) */
1926 demand_empty_rest_of_line ();
1929 static void
1930 s_lcomm_internal (needs_align, bytes_p)
1931 /* 1 if this was a ".bss" directive, which may require a 3rd argument
1932 (alignment); 0 if it was an ".lcomm" (2 args only) */
1933 int needs_align;
1934 /* 1 if the alignment value should be interpreted as the byte boundary,
1935 rather than the power of 2. */
1936 int bytes_p;
1938 register char *name;
1939 register char c;
1940 register char *p;
1941 register int temp;
1942 register symbolS *symbolP;
1943 segT current_seg = now_seg;
1944 subsegT current_subseg = now_subseg;
1945 const int max_alignment = 15;
1946 int align = 0;
1947 segT bss_seg = bss_section;
1949 name = input_line_pointer;
1950 c = get_symbol_end ();
1951 p = input_line_pointer;
1952 *p = c;
1953 SKIP_WHITESPACE ();
1955 /* Accept an optional comma after the name. The comma used to be
1956 required, but Irix 5 cc does not generate it. */
1957 if (*input_line_pointer == ',')
1959 ++input_line_pointer;
1960 SKIP_WHITESPACE ();
1963 if (*input_line_pointer == '\n')
1965 as_bad (_("Missing size expression"));
1966 return;
1969 if ((temp = get_absolute_expression ()) < 0)
1971 as_warn (_("BSS length (%d.) <0! Ignored."), temp);
1972 ignore_rest_of_line ();
1973 return;
1976 #if defined (TC_MIPS) || defined (TC_ALPHA)
1977 if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour
1978 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
1980 /* For MIPS and Alpha ECOFF or ELF, small objects are put in .sbss. */
1981 if (temp <= bfd_get_gp_size (stdoutput))
1983 bss_seg = subseg_new (".sbss", 1);
1984 seg_info (bss_seg)->bss = 1;
1985 #ifdef BFD_ASSEMBLER
1986 if (! bfd_set_section_flags (stdoutput, bss_seg, SEC_ALLOC))
1987 as_warn (_("error setting flags for \".sbss\": %s"),
1988 bfd_errmsg (bfd_get_error ()));
1989 #endif
1992 #endif
1994 if (!needs_align)
1996 TC_IMPLICIT_LCOMM_ALIGNMENT (temp, align);
1998 /* Still zero unless TC_IMPLICIT_LCOMM_ALIGNMENT set it. */
1999 if (align)
2000 record_alignment(bss_seg, align);
2003 if (needs_align)
2005 align = 0;
2006 SKIP_WHITESPACE ();
2007 if (*input_line_pointer != ',')
2009 as_bad (_("Expected comma after size"));
2010 ignore_rest_of_line ();
2011 return;
2013 input_line_pointer++;
2014 SKIP_WHITESPACE ();
2015 if (*input_line_pointer == '\n')
2017 as_bad (_("Missing alignment"));
2018 return;
2020 align = get_absolute_expression ();
2021 if (bytes_p)
2023 /* Convert to a power of 2. */
2024 if (align != 0)
2026 unsigned int i;
2028 for (i = 0; (align & 1) == 0; align >>= 1, ++i)
2030 if (align != 1)
2031 as_bad (_("Alignment not a power of 2"));
2032 align = i;
2035 if (align > max_alignment)
2037 align = max_alignment;
2038 as_warn (_("Alignment too large: %d. assumed."), align);
2040 else if (align < 0)
2042 align = 0;
2043 as_warn (_("Alignment negative. 0 assumed."));
2045 record_alignment (bss_seg, align);
2046 } /* if needs align */
2047 else
2049 /* Assume some objects may require alignment on some systems. */
2050 #if defined (TC_ALPHA) && ! defined (VMS)
2051 if (temp > 1)
2053 align = ffs (temp) - 1;
2054 if (temp % (1 << align))
2055 abort ();
2057 #endif
2060 *p = 0;
2061 symbolP = symbol_find_or_make (name);
2062 *p = c;
2064 if (
2065 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT) \
2066 || defined (OBJ_BOUT) || defined (OBJ_MAYBE_BOUT))
2067 #ifdef BFD_ASSEMBLER
2068 (OUTPUT_FLAVOR != bfd_target_aout_flavour
2069 || (S_GET_OTHER (symbolP) == 0 && S_GET_DESC (symbolP) == 0)) &&
2070 #else
2071 (S_GET_OTHER (symbolP) == 0 && S_GET_DESC (symbolP) == 0) &&
2072 #endif
2073 #endif
2074 (S_GET_SEGMENT (symbolP) == bss_seg
2075 || (!S_IS_DEFINED (symbolP) && S_GET_VALUE (symbolP) == 0)))
2077 char *pfrag;
2079 subseg_set (bss_seg, 1);
2081 if (align)
2082 frag_align (align, 0, 0);
2083 /* detach from old frag */
2084 if (S_GET_SEGMENT (symbolP) == bss_seg)
2085 symbol_get_frag (symbolP)->fr_symbol = NULL;
2087 symbol_set_frag (symbolP, frag_now);
2088 pfrag = frag_var (rs_org, 1, 1, (relax_substateT)0, symbolP,
2089 (offsetT) temp, (char *) 0);
2090 *pfrag = 0;
2092 S_SET_SEGMENT (symbolP, bss_seg);
2094 #ifdef OBJ_COFF
2095 /* The symbol may already have been created with a preceding
2096 ".globl" directive -- be careful not to step on storage class
2097 in that case. Otherwise, set it to static. */
2098 if (S_GET_STORAGE_CLASS (symbolP) != C_EXT)
2100 S_SET_STORAGE_CLASS (symbolP, C_STAT);
2102 #endif /* OBJ_COFF */
2104 #ifdef S_SET_SIZE
2105 S_SET_SIZE (symbolP, temp);
2106 #endif
2108 else
2109 as_bad (_("Ignoring attempt to re-define symbol `%s'."),
2110 S_GET_NAME (symbolP));
2112 subseg_set (current_seg, current_subseg);
2114 demand_empty_rest_of_line ();
2115 } /* s_lcomm_internal() */
2117 void
2118 s_lcomm (needs_align)
2119 int needs_align;
2121 s_lcomm_internal (needs_align, 0);
2124 void s_lcomm_bytes (needs_align)
2125 int needs_align;
2127 s_lcomm_internal (needs_align, 1);
2130 void
2131 s_lsym (ignore)
2132 int ignore ATTRIBUTE_UNUSED;
2134 register char *name;
2135 register char c;
2136 register char *p;
2137 expressionS exp;
2138 register symbolS *symbolP;
2140 /* we permit ANY defined expression: BSD4.2 demands constants */
2141 name = input_line_pointer;
2142 c = get_symbol_end ();
2143 p = input_line_pointer;
2144 *p = c;
2145 SKIP_WHITESPACE ();
2146 if (*input_line_pointer != ',')
2148 *p = 0;
2149 as_bad (_("Expected comma after name \"%s\""), name);
2150 *p = c;
2151 ignore_rest_of_line ();
2152 return;
2154 input_line_pointer++;
2155 expression (&exp);
2156 if (exp.X_op != O_constant
2157 && exp.X_op != O_register)
2159 as_bad (_("bad expression"));
2160 ignore_rest_of_line ();
2161 return;
2163 *p = 0;
2164 symbolP = symbol_find_or_make (name);
2166 /* FIXME-SOON I pulled a (&& symbolP->sy_other == 0 &&
2167 symbolP->sy_desc == 0) out of this test because coff doesn't have
2168 those fields, and I can't see when they'd ever be tripped. I
2169 don't think I understand why they were here so I may have
2170 introduced a bug. As recently as 1.37 didn't have this test
2171 anyway. xoxorich. */
2173 if (S_GET_SEGMENT (symbolP) == undefined_section
2174 && S_GET_VALUE (symbolP) == 0)
2176 /* The name might be an undefined .global symbol; be sure to
2177 keep the "external" bit. */
2178 S_SET_SEGMENT (symbolP,
2179 (exp.X_op == O_constant
2180 ? absolute_section
2181 : reg_section));
2182 S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
2184 else
2186 as_bad (_("Symbol %s already defined"), name);
2188 *p = c;
2189 demand_empty_rest_of_line ();
2190 } /* s_lsym() */
2192 /* Read a line into an sb. */
2194 static int
2195 get_line_sb (line)
2196 sb *line;
2198 char quote1, quote2, inquote;
2200 if (input_line_pointer[-1] == '\n')
2201 bump_line_counters ();
2203 if (input_line_pointer >= buffer_limit)
2205 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2206 if (buffer_limit == 0)
2207 return 0;
2210 /* If app.c sets any other characters to LEX_IS_STRINGQUOTE, this
2211 code needs to be changed. */
2212 if (! flag_m68k_mri)
2213 quote1 = '"';
2214 else
2215 quote1 = '\0';
2217 quote2 = '\0';
2218 if (flag_m68k_mri)
2219 quote2 = '\'';
2220 #ifdef LEX_IS_STRINGQUOTE
2221 quote2 = '\'';
2222 #endif
2224 inquote = '\0';
2225 while (! is_end_of_line[(unsigned char) *input_line_pointer]
2226 || (inquote != '\0' && *input_line_pointer != '\n'))
2228 if (inquote == *input_line_pointer)
2229 inquote = '\0';
2230 else if (inquote == '\0')
2232 if (*input_line_pointer == quote1)
2233 inquote = quote1;
2234 else if (*input_line_pointer == quote2)
2235 inquote = quote2;
2237 sb_add_char (line, *input_line_pointer++);
2239 while (input_line_pointer < buffer_limit
2240 && is_end_of_line[(unsigned char) *input_line_pointer])
2242 if (input_line_pointer[-1] == '\n')
2243 bump_line_counters ();
2244 ++input_line_pointer;
2246 return 1;
2249 /* Define a macro. This is an interface to macro.c, which is shared
2250 between gas and gasp. */
2252 void
2253 s_macro (ignore)
2254 int ignore ATTRIBUTE_UNUSED;
2256 char *file;
2257 unsigned int line;
2258 sb s;
2259 sb label;
2260 const char *err;
2261 const char *name;
2263 as_where (&file, &line);
2265 sb_new (&s);
2266 while (! is_end_of_line[(unsigned char) *input_line_pointer])
2267 sb_add_char (&s, *input_line_pointer++);
2269 sb_new (&label);
2270 if (line_label != NULL)
2271 sb_add_string (&label, S_GET_NAME (line_label));
2273 err = define_macro (0, &s, &label, get_line_sb, &name);
2274 if (err != NULL)
2275 as_bad_where (file, line, "%s", err);
2276 else
2278 if (line_label != NULL)
2280 S_SET_SEGMENT (line_label, undefined_section);
2281 S_SET_VALUE (line_label, 0);
2282 symbol_set_frag (line_label, &zero_address_frag);
2285 if (((NO_PSEUDO_DOT || flag_m68k_mri)
2286 && hash_find (po_hash, name) != NULL)
2287 || (! flag_m68k_mri
2288 && *name == '.'
2289 && hash_find (po_hash, name + 1) != NULL))
2290 as_warn (_("attempt to redefine pseudo-op `%s' ignored"),
2291 name);
2294 sb_kill (&s);
2297 /* Handle the .mexit pseudo-op, which immediately exits a macro
2298 expansion. */
2300 void
2301 s_mexit (ignore)
2302 int ignore ATTRIBUTE_UNUSED;
2304 cond_exit_macro (macro_nest);
2305 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2308 /* Switch in and out of MRI mode. */
2310 void
2311 s_mri (ignore)
2312 int ignore ATTRIBUTE_UNUSED;
2314 int on, old_flag;
2316 on = get_absolute_expression ();
2317 old_flag = flag_mri;
2318 if (on != 0)
2320 flag_mri = 1;
2321 #ifdef TC_M68K
2322 flag_m68k_mri = 1;
2323 #endif
2324 macro_mri_mode (1);
2326 else
2328 flag_mri = 0;
2329 #ifdef TC_M68K
2330 flag_m68k_mri = 0;
2331 #endif
2332 macro_mri_mode (0);
2335 /* Operator precedence changes in m68k MRI mode, so we need to
2336 update the operator rankings. */
2337 expr_set_precedence ();
2339 #ifdef MRI_MODE_CHANGE
2340 if (on != old_flag)
2341 MRI_MODE_CHANGE (on);
2342 #endif
2344 demand_empty_rest_of_line ();
2347 /* Handle changing the location counter. */
2349 static void
2350 do_org (segment, exp, fill)
2351 segT segment;
2352 expressionS *exp;
2353 int fill;
2355 if (segment != now_seg && segment != absolute_section)
2356 as_bad (_("invalid segment \"%s\"; segment \"%s\" assumed"),
2357 segment_name (segment), segment_name (now_seg));
2359 if (now_seg == absolute_section)
2361 if (fill != 0)
2362 as_warn (_("ignoring fill value in absolute section"));
2363 if (exp->X_op != O_constant)
2365 as_bad (_("only constant offsets supported in absolute section"));
2366 exp->X_add_number = 0;
2368 abs_section_offset = exp->X_add_number;
2370 else
2372 char *p;
2374 p = frag_var (rs_org, 1, 1, (relax_substateT) 0, exp->X_add_symbol,
2375 exp->X_add_number * OCTETS_PER_BYTE, (char *) NULL);
2376 *p = fill;
2380 void
2381 s_org (ignore)
2382 int ignore ATTRIBUTE_UNUSED;
2384 register segT segment;
2385 expressionS exp;
2386 register long temp_fill;
2388 #ifdef md_flush_pending_output
2389 md_flush_pending_output ();
2390 #endif
2392 /* The m68k MRI assembler has a different meaning for .org. It
2393 means to create an absolute section at a given address. We can't
2394 support that--use a linker script instead. */
2395 if (flag_m68k_mri)
2397 as_bad (_("MRI style ORG pseudo-op not supported"));
2398 ignore_rest_of_line ();
2399 return;
2402 /* Don't believe the documentation of BSD 4.2 AS. There is no such
2403 thing as a sub-segment-relative origin. Any absolute origin is
2404 given a warning, then assumed to be segment-relative. Any
2405 segmented origin expression ("foo+42") had better be in the right
2406 segment or the .org is ignored.
2408 BSD 4.2 AS warns if you try to .org backwards. We cannot because
2409 we never know sub-segment sizes when we are reading code. BSD
2410 will crash trying to emit negative numbers of filler bytes in
2411 certain .orgs. We don't crash, but see as-write for that code.
2413 Don't make frag if need_pass_2==1. */
2414 segment = get_known_segmented_expression (&exp);
2415 if (*input_line_pointer == ',')
2417 input_line_pointer++;
2418 temp_fill = get_absolute_expression ();
2420 else
2421 temp_fill = 0;
2423 if (!need_pass_2)
2424 do_org (segment, &exp, temp_fill);
2426 demand_empty_rest_of_line ();
2427 } /* s_org() */
2429 /* Handle parsing for the MRI SECT/SECTION pseudo-op. This should be
2430 called by the obj-format routine which handles section changing
2431 when in MRI mode. It will create a new section, and return it. It
2432 will set *TYPE to the section type: one of 'C' (code), 'D' (data),
2433 'M' (mixed), or 'R' (romable). If BFD_ASSEMBLER is defined, the
2434 flags will be set in the section. */
2436 void
2437 s_mri_sect (type)
2438 char *type ATTRIBUTE_UNUSED;
2440 #ifdef TC_M68K
2442 char *name;
2443 char c;
2444 segT seg;
2446 SKIP_WHITESPACE ();
2448 name = input_line_pointer;
2449 if (! isdigit ((unsigned char) *name))
2450 c = get_symbol_end ();
2451 else
2455 ++input_line_pointer;
2457 while (isdigit ((unsigned char) *input_line_pointer));
2458 c = *input_line_pointer;
2459 *input_line_pointer = '\0';
2462 name = xstrdup (name);
2464 *input_line_pointer = c;
2466 seg = subseg_new (name, 0);
2468 if (*input_line_pointer == ',')
2470 int align;
2472 ++input_line_pointer;
2473 align = get_absolute_expression ();
2474 record_alignment (seg, align);
2477 *type = 'C';
2478 if (*input_line_pointer == ',')
2480 c = *++input_line_pointer;
2481 c = toupper ((unsigned char) c);
2482 if (c == 'C' || c == 'D' || c == 'M' || c == 'R')
2483 *type = c;
2484 else
2485 as_bad (_("unrecognized section type"));
2486 ++input_line_pointer;
2488 #ifdef BFD_ASSEMBLER
2490 flagword flags;
2492 flags = SEC_NO_FLAGS;
2493 if (*type == 'C')
2494 flags = SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE;
2495 else if (*type == 'D' || *type == 'M')
2496 flags = SEC_ALLOC | SEC_LOAD | SEC_DATA;
2497 else if (*type == 'R')
2498 flags = SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_READONLY | SEC_ROM;
2499 if (flags != SEC_NO_FLAGS)
2501 if (! bfd_set_section_flags (stdoutput, seg, flags))
2502 as_warn (_("error setting flags for \"%s\": %s"),
2503 bfd_section_name (stdoutput, seg),
2504 bfd_errmsg (bfd_get_error ()));
2507 #endif
2510 /* Ignore the HP type. */
2511 if (*input_line_pointer == ',')
2512 input_line_pointer += 2;
2514 demand_empty_rest_of_line ();
2516 #else /* ! TC_M68K */
2517 #ifdef TC_I960
2519 char *name;
2520 char c;
2521 segT seg;
2523 SKIP_WHITESPACE ();
2525 name = input_line_pointer;
2526 c = get_symbol_end ();
2528 name = xstrdup (name);
2530 *input_line_pointer = c;
2532 seg = subseg_new (name, 0);
2534 if (*input_line_pointer != ',')
2535 *type = 'C';
2536 else
2538 char *sectype;
2540 ++input_line_pointer;
2541 SKIP_WHITESPACE ();
2542 sectype = input_line_pointer;
2543 c = get_symbol_end ();
2544 if (*sectype == '\0')
2545 *type = 'C';
2546 else if (strcasecmp (sectype, "text") == 0)
2547 *type = 'C';
2548 else if (strcasecmp (sectype, "data") == 0)
2549 *type = 'D';
2550 else if (strcasecmp (sectype, "romdata") == 0)
2551 *type = 'R';
2552 else
2553 as_warn (_("unrecognized section type `%s'"), sectype);
2554 *input_line_pointer = c;
2557 if (*input_line_pointer == ',')
2559 char *seccmd;
2561 ++input_line_pointer;
2562 SKIP_WHITESPACE ();
2563 seccmd = input_line_pointer;
2564 c = get_symbol_end ();
2565 if (strcasecmp (seccmd, "absolute") == 0)
2567 as_bad (_("absolute sections are not supported"));
2568 *input_line_pointer = c;
2569 ignore_rest_of_line ();
2570 return;
2572 else if (strcasecmp (seccmd, "align") == 0)
2574 int align;
2576 *input_line_pointer = c;
2577 align = get_absolute_expression ();
2578 record_alignment (seg, align);
2580 else
2582 as_warn (_("unrecognized section command `%s'"), seccmd);
2583 *input_line_pointer = c;
2587 demand_empty_rest_of_line ();
2589 #else /* ! TC_I960 */
2590 /* The MRI assembler seems to use different forms of .sect for
2591 different targets. */
2592 as_bad ("MRI mode not supported for this target");
2593 ignore_rest_of_line ();
2594 #endif /* ! TC_I960 */
2595 #endif /* ! TC_M68K */
2598 /* Handle the .print pseudo-op. */
2600 void
2601 s_print (ignore)
2602 int ignore ATTRIBUTE_UNUSED;
2604 char *s;
2605 int len;
2607 s = demand_copy_C_string (&len);
2608 printf ("%s\n", s);
2609 demand_empty_rest_of_line ();
2612 /* Handle the .purgem pseudo-op. */
2614 void
2615 s_purgem (ignore)
2616 int ignore ATTRIBUTE_UNUSED;
2618 if (is_it_end_of_statement ())
2620 demand_empty_rest_of_line ();
2621 return;
2626 char *name;
2627 char c;
2629 SKIP_WHITESPACE ();
2630 name = input_line_pointer;
2631 c = get_symbol_end ();
2632 delete_macro (name);
2633 *input_line_pointer = c;
2634 SKIP_WHITESPACE ();
2636 while (*input_line_pointer++ == ',');
2638 --input_line_pointer;
2639 demand_empty_rest_of_line ();
2642 /* Handle the .rept pseudo-op. */
2644 void
2645 s_rept (ignore)
2646 int ignore ATTRIBUTE_UNUSED;
2648 int count;
2650 count = get_absolute_expression ();
2652 do_repeat(count, "REPT", "ENDR");
2655 /* This function provides a generic repeat block implementation. It allows
2656 different directives to be used as the start/end keys. */
2658 void
2659 do_repeat (count, start, end)
2660 int count;
2661 const char *start;
2662 const char *end;
2664 sb one;
2665 sb many;
2667 sb_new (&one);
2668 if (! buffer_and_nest (start, end, &one, get_line_sb))
2670 as_bad (_("%s without %s"), start, end);
2671 return;
2674 sb_new (&many);
2675 while (count-- > 0)
2676 sb_add_sb (&many, &one);
2678 sb_kill (&one);
2680 input_scrub_include_sb (&many, input_line_pointer, 1);
2681 sb_kill (&many);
2682 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2685 /* Skip to end of current repeat loop; EXTRA indicates how many additional
2686 input buffers to skip. Assumes that conditionals preceding the loop end
2687 are properly nested.
2689 This function makes it easier to implement a premature "break" out of the
2690 loop. The EXTRA arg accounts for other buffers we might have inserted,
2691 such as line substitutions. */
2693 void
2694 end_repeat (extra)
2695 int extra;
2697 cond_exit_macro (macro_nest);
2698 while (extra-- >= 0)
2699 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2702 /* Handle the .equ, .equiv and .set directives. If EQUIV is 1, then
2703 this is .equiv, and it is an error if the symbol is already
2704 defined. */
2706 void
2707 s_set (equiv)
2708 int equiv;
2710 register char *name;
2711 register char delim;
2712 register char *end_name;
2713 register symbolS *symbolP;
2716 * Especial apologies for the random logic:
2717 * this just grew, and could be parsed much more simply!
2718 * Dean in haste.
2720 name = input_line_pointer;
2721 delim = get_symbol_end ();
2722 end_name = input_line_pointer;
2723 *end_name = delim;
2724 SKIP_WHITESPACE ();
2726 if (*input_line_pointer != ',')
2728 *end_name = 0;
2729 as_bad (_("Expected comma after name \"%s\""), name);
2730 *end_name = delim;
2731 ignore_rest_of_line ();
2732 return;
2735 input_line_pointer++;
2736 *end_name = 0;
2738 if (name[0] == '.' && name[1] == '\0')
2740 /* Turn '. = mumble' into a .org mumble */
2741 register segT segment;
2742 expressionS exp;
2744 segment = get_known_segmented_expression (&exp);
2746 if (!need_pass_2)
2747 do_org (segment, &exp, 0);
2749 *end_name = delim;
2750 return;
2753 if ((symbolP = symbol_find (name)) == NULL
2754 && (symbolP = md_undefined_symbol (name)) == NULL)
2756 #ifndef NO_LISTING
2757 /* When doing symbol listings, play games with dummy fragments living
2758 outside the normal fragment chain to record the file and line info
2759 for this symbol. */
2760 if (listing & LISTING_SYMBOLS)
2762 extern struct list_info_struct *listing_tail;
2763 fragS *dummy_frag = (fragS *) xmalloc (sizeof(fragS));
2764 memset (dummy_frag, 0, sizeof(fragS));
2765 dummy_frag->fr_type = rs_fill;
2766 dummy_frag->line = listing_tail;
2767 symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
2768 dummy_frag->fr_symbol = symbolP;
2770 else
2771 #endif
2772 symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
2774 #ifdef OBJ_COFF
2775 /* "set" symbols are local unless otherwise specified. */
2776 SF_SET_LOCAL (symbolP);
2777 #endif /* OBJ_COFF */
2779 } /* make a new symbol */
2781 symbol_table_insert (symbolP);
2783 *end_name = delim;
2785 if (equiv
2786 && S_IS_DEFINED (symbolP)
2787 && S_GET_SEGMENT (symbolP) != reg_section)
2788 as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
2790 pseudo_set (symbolP);
2791 demand_empty_rest_of_line ();
2792 } /* s_set() */
2794 void
2795 s_space (mult)
2796 int mult;
2798 expressionS exp;
2799 expressionS val;
2800 char *p = 0;
2801 char *stop = NULL;
2802 char stopc;
2803 int bytes;
2805 #ifdef md_flush_pending_output
2806 md_flush_pending_output ();
2807 #endif
2809 if (flag_mri)
2810 stop = mri_comment_field (&stopc);
2812 /* In m68k MRI mode, we need to align to a word boundary, unless
2813 this is ds.b. */
2814 if (flag_m68k_mri && mult > 1)
2816 if (now_seg == absolute_section)
2818 abs_section_offset += abs_section_offset & 1;
2819 if (line_label != NULL)
2820 S_SET_VALUE (line_label, abs_section_offset);
2822 else if (mri_common_symbol != NULL)
2824 valueT val;
2826 val = S_GET_VALUE (mri_common_symbol);
2827 if ((val & 1) != 0)
2829 S_SET_VALUE (mri_common_symbol, val + 1);
2830 if (line_label != NULL)
2832 expressionS *symexp;
2834 symexp = symbol_get_value_expression (line_label);
2835 know (symexp->X_op == O_symbol);
2836 know (symexp->X_add_symbol == mri_common_symbol);
2837 symexp->X_add_number += 1;
2841 else
2843 do_align (1, (char *) NULL, 0, 0);
2844 if (line_label != NULL)
2846 symbol_set_frag (line_label, frag_now);
2847 S_SET_VALUE (line_label, frag_now_fix ());
2852 bytes = mult;
2854 expression (&exp);
2856 SKIP_WHITESPACE ();
2857 if (*input_line_pointer == ',')
2859 ++input_line_pointer;
2860 expression (&val);
2862 else
2864 val.X_op = O_constant;
2865 val.X_add_number = 0;
2868 if (val.X_op != O_constant
2869 || val.X_add_number < - 0x80
2870 || val.X_add_number > 0xff
2871 || (mult != 0 && mult != 1 && val.X_add_number != 0))
2873 if (exp.X_op != O_constant)
2874 as_bad (_("Unsupported variable size or fill value"));
2875 else
2877 offsetT i;
2879 if (mult == 0)
2880 mult = 1;
2881 bytes = mult * exp.X_add_number;
2882 for (i = 0; i < exp.X_add_number; i++)
2883 emit_expr (&val, mult);
2886 else
2888 if (exp.X_op == O_constant)
2890 long repeat;
2892 repeat = exp.X_add_number;
2893 if (mult)
2894 repeat *= mult;
2895 bytes = repeat;
2896 if (repeat <= 0)
2898 if (! flag_mri)
2899 as_warn (_(".space repeat count is zero, ignored"));
2900 else if (repeat < 0)
2901 as_warn (_(".space repeat count is negative, ignored"));
2902 goto getout;
2905 /* If we are in the absolute section, just bump the offset. */
2906 if (now_seg == absolute_section)
2908 abs_section_offset += repeat;
2909 goto getout;
2912 /* If we are secretly in an MRI common section, then
2913 creating space just increases the size of the common
2914 symbol. */
2915 if (mri_common_symbol != NULL)
2917 S_SET_VALUE (mri_common_symbol,
2918 S_GET_VALUE (mri_common_symbol) + repeat);
2919 goto getout;
2922 if (!need_pass_2)
2923 p = frag_var (rs_fill, 1, 1, (relax_substateT) 0, (symbolS *) 0,
2924 (offsetT) repeat, (char *) 0);
2926 else
2928 if (now_seg == absolute_section)
2930 as_bad (_("space allocation too complex in absolute section"));
2931 subseg_set (text_section, 0);
2933 if (mri_common_symbol != NULL)
2935 as_bad (_("space allocation too complex in common section"));
2936 mri_common_symbol = NULL;
2938 if (!need_pass_2)
2939 p = frag_var (rs_space, 1, 1, (relax_substateT) 0,
2940 make_expr_symbol (&exp), (offsetT) 0, (char *) 0);
2943 if (p)
2944 *p = val.X_add_number;
2947 getout:
2949 /* In MRI mode, after an odd number of bytes, we must align to an
2950 even word boundary, unless the next instruction is a dc.b, ds.b
2951 or dcb.b. */
2952 if (flag_mri && (bytes & 1) != 0)
2953 mri_pending_align = 1;
2955 demand_empty_rest_of_line ();
2957 if (flag_mri)
2958 mri_comment_end (stop, stopc);
2961 /* This is like s_space, but the value is a floating point number with
2962 the given precision. This is for the MRI dcb.s pseudo-op and
2963 friends. */
2965 void
2966 s_float_space (float_type)
2967 int float_type;
2969 offsetT count;
2970 int flen;
2971 char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
2972 char *stop = NULL;
2973 char stopc;
2975 if (flag_mri)
2976 stop = mri_comment_field (&stopc);
2978 count = get_absolute_expression ();
2980 SKIP_WHITESPACE ();
2981 if (*input_line_pointer != ',')
2983 as_bad (_("missing value"));
2984 ignore_rest_of_line ();
2985 if (flag_mri)
2986 mri_comment_end (stop, stopc);
2987 return;
2990 ++input_line_pointer;
2992 SKIP_WHITESPACE ();
2994 /* Skip any 0{letter} that may be present. Don't even check if the
2995 * letter is legal. */
2996 if (input_line_pointer[0] == '0'
2997 && isalpha ((unsigned char) input_line_pointer[1]))
2998 input_line_pointer += 2;
3000 /* Accept :xxxx, where the x's are hex digits, for a floating point
3001 with the exact digits specified. */
3002 if (input_line_pointer[0] == ':')
3004 flen = hex_float (float_type, temp);
3005 if (flen < 0)
3007 ignore_rest_of_line ();
3008 if (flag_mri)
3009 mri_comment_end (stop, stopc);
3010 return;
3013 else
3015 char *err;
3017 err = md_atof (float_type, temp, &flen);
3018 know (flen <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
3019 know (flen > 0);
3020 if (err)
3022 as_bad (_("Bad floating literal: %s"), err);
3023 ignore_rest_of_line ();
3024 if (flag_mri)
3025 mri_comment_end (stop, stopc);
3026 return;
3030 while (--count >= 0)
3032 char *p;
3034 p = frag_more (flen);
3035 memcpy (p, temp, (unsigned int) flen);
3038 demand_empty_rest_of_line ();
3040 if (flag_mri)
3041 mri_comment_end (stop, stopc);
3044 /* Handle the .struct pseudo-op, as found in MIPS assemblers. */
3046 void
3047 s_struct (ignore)
3048 int ignore ATTRIBUTE_UNUSED;
3050 char *stop = NULL;
3051 char stopc;
3053 if (flag_mri)
3054 stop = mri_comment_field (&stopc);
3055 abs_section_offset = get_absolute_expression ();
3056 subseg_set (absolute_section, 0);
3057 demand_empty_rest_of_line ();
3058 if (flag_mri)
3059 mri_comment_end (stop, stopc);
3062 void
3063 s_text (ignore)
3064 int ignore ATTRIBUTE_UNUSED;
3066 register int temp;
3068 temp = get_absolute_expression ();
3069 subseg_set (text_section, (subsegT) temp);
3070 demand_empty_rest_of_line ();
3071 #ifdef OBJ_VMS
3072 const_flag &= ~IN_DEFAULT_SECTION;
3073 #endif
3074 } /* s_text() */
3077 void
3078 demand_empty_rest_of_line ()
3080 SKIP_WHITESPACE ();
3081 if (is_end_of_line[(unsigned char) *input_line_pointer])
3083 input_line_pointer++;
3085 else
3087 ignore_rest_of_line ();
3089 /* Return having already swallowed end-of-line. */
3090 } /* Return pointing just after end-of-line. */
3092 void
3093 ignore_rest_of_line () /* For suspect lines: gives warning. */
3095 if (!is_end_of_line[(unsigned char) *input_line_pointer])
3097 if (isprint ((unsigned char) *input_line_pointer))
3098 as_bad (_("Rest of line ignored. First ignored character is `%c'."),
3099 *input_line_pointer);
3100 else
3101 as_bad (_("Rest of line ignored. First ignored character valued 0x%x."),
3102 *input_line_pointer);
3103 while (input_line_pointer < buffer_limit
3104 && !is_end_of_line[(unsigned char) *input_line_pointer])
3106 input_line_pointer++;
3109 input_line_pointer++; /* Return pointing just after end-of-line. */
3110 know (is_end_of_line[(unsigned char) input_line_pointer[-1]]);
3113 void
3114 discard_rest_of_line ()
3116 while (input_line_pointer < buffer_limit
3117 && !is_end_of_line[(unsigned char) *input_line_pointer])
3119 input_line_pointer++;
3121 input_line_pointer++; /* Return pointing just after end-of-line. */
3122 know (is_end_of_line[(unsigned char) input_line_pointer[-1]]);
3126 * pseudo_set()
3128 * In: Pointer to a symbol.
3129 * Input_line_pointer->expression.
3131 * Out: Input_line_pointer->just after any whitespace after expression.
3132 * Tried to set symbol to value of expression.
3133 * Will change symbols type, value, and frag;
3135 void
3136 pseudo_set (symbolP)
3137 symbolS *symbolP;
3139 expressionS exp;
3140 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3141 int ext;
3142 #endif /* OBJ_AOUT or OBJ_BOUT */
3144 know (symbolP); /* NULL pointer is logic error. */
3145 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3146 ext = S_IS_EXTERNAL (symbolP);
3147 #endif /* OBJ_AOUT or OBJ_BOUT */
3149 (void) expression (&exp);
3151 if (exp.X_op == O_illegal)
3152 as_bad (_("illegal expression; zero assumed"));
3153 else if (exp.X_op == O_absent)
3154 as_bad (_("missing expression; zero assumed"));
3155 else if (exp.X_op == O_big)
3157 if (exp.X_add_number > 0)
3158 as_bad (_("bignum invalid; zero assumed"));
3159 else
3160 as_bad (_("floating point number invalid; zero assumed"));
3162 else if (exp.X_op == O_subtract
3163 && (S_GET_SEGMENT (exp.X_add_symbol)
3164 == S_GET_SEGMENT (exp.X_op_symbol))
3165 && SEG_NORMAL (S_GET_SEGMENT (exp.X_add_symbol))
3166 && (symbol_get_frag (exp.X_add_symbol)
3167 == symbol_get_frag (exp.X_op_symbol)))
3169 exp.X_op = O_constant;
3170 exp.X_add_number = (S_GET_VALUE (exp.X_add_symbol)
3171 - S_GET_VALUE (exp.X_op_symbol));
3174 switch (exp.X_op)
3176 case O_illegal:
3177 case O_absent:
3178 case O_big:
3179 exp.X_add_number = 0;
3180 /* Fall through. */
3181 case O_constant:
3182 S_SET_SEGMENT (symbolP, absolute_section);
3183 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3184 if (ext)
3185 S_SET_EXTERNAL (symbolP);
3186 else
3187 S_CLEAR_EXTERNAL (symbolP);
3188 #endif /* OBJ_AOUT or OBJ_BOUT */
3189 S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
3190 if (exp.X_op != O_constant)
3191 symbol_set_frag (symbolP, &zero_address_frag);
3192 break;
3194 case O_register:
3195 S_SET_SEGMENT (symbolP, reg_section);
3196 S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
3197 symbol_set_frag (symbolP, &zero_address_frag);
3198 break;
3200 case O_symbol:
3201 if (S_GET_SEGMENT (exp.X_add_symbol) == undefined_section
3202 || exp.X_add_number != 0)
3203 symbol_set_value_expression (symbolP, &exp);
3204 else if (symbol_section_p (symbolP))
3205 as_bad ("invalid attempt to set value of section symbol");
3206 else
3208 symbolS *s = exp.X_add_symbol;
3210 S_SET_SEGMENT (symbolP, S_GET_SEGMENT (s));
3211 #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
3212 if (ext)
3213 S_SET_EXTERNAL (symbolP);
3214 else
3215 S_CLEAR_EXTERNAL (symbolP);
3216 #endif /* OBJ_AOUT or OBJ_BOUT */
3217 S_SET_VALUE (symbolP,
3218 exp.X_add_number + S_GET_VALUE (s));
3219 symbol_set_frag (symbolP, symbol_get_frag (s));
3220 copy_symbol_attributes (symbolP, s);
3222 break;
3224 default:
3225 /* The value is some complex expression.
3226 FIXME: Should we set the segment to anything? */
3227 symbol_set_value_expression (symbolP, &exp);
3228 break;
3233 * cons()
3235 * CONStruct more frag of .bytes, or .words etc.
3236 * Should need_pass_2 be 1 then emit no frag(s).
3237 * This understands EXPRESSIONS.
3239 * Bug (?)
3241 * This has a split personality. We use expression() to read the
3242 * value. We can detect if the value won't fit in a byte or word.
3243 * But we can't detect if expression() discarded significant digits
3244 * in the case of a long. Not worth the crocks required to fix it.
3247 /* Select a parser for cons expressions. */
3249 /* Some targets need to parse the expression in various fancy ways.
3250 You can define TC_PARSE_CONS_EXPRESSION to do whatever you like
3251 (for example, the HPPA does this). Otherwise, you can define
3252 BITFIELD_CONS_EXPRESSIONS to permit bitfields to be specified, or
3253 REPEAT_CONS_EXPRESSIONS to permit repeat counts. If none of these
3254 are defined, which is the normal case, then only simple expressions
3255 are permitted. */
3257 #ifdef TC_M68K
3258 static void
3259 parse_mri_cons PARAMS ((expressionS *exp, unsigned int nbytes));
3260 #endif
3262 #ifndef TC_PARSE_CONS_EXPRESSION
3263 #ifdef BITFIELD_CONS_EXPRESSIONS
3264 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_bitfield_cons (EXP, NBYTES)
3265 static void
3266 parse_bitfield_cons PARAMS ((expressionS *exp, unsigned int nbytes));
3267 #endif
3268 #ifdef REPEAT_CONS_EXPRESSIONS
3269 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_repeat_cons (EXP, NBYTES)
3270 static void
3271 parse_repeat_cons PARAMS ((expressionS *exp, unsigned int nbytes));
3272 #endif
3274 /* If we haven't gotten one yet, just call expression. */
3275 #ifndef TC_PARSE_CONS_EXPRESSION
3276 #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) expression (EXP)
3277 #endif
3278 #endif
3280 /* worker to do .byte etc statements */
3281 /* clobbers input_line_pointer, checks */
3282 /* end-of-line. */
3283 static void
3284 cons_worker (nbytes, rva)
3285 register int nbytes; /* 1=.byte, 2=.word, 4=.long */
3286 int rva;
3288 int c;
3289 expressionS exp;
3290 char *stop = NULL;
3291 char stopc;
3293 #ifdef md_flush_pending_output
3294 md_flush_pending_output ();
3295 #endif
3297 if (flag_mri)
3298 stop = mri_comment_field (&stopc);
3300 if (is_it_end_of_statement ())
3302 demand_empty_rest_of_line ();
3303 if (flag_mri)
3304 mri_comment_end (stop, stopc);
3305 return;
3308 #ifdef md_cons_align
3309 md_cons_align (nbytes);
3310 #endif
3312 c = 0;
3315 #ifdef TC_M68K
3316 if (flag_m68k_mri)
3317 parse_mri_cons (&exp, (unsigned int) nbytes);
3318 else
3319 #endif
3320 TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes);
3322 if (rva)
3324 if (exp.X_op == O_symbol)
3325 exp.X_op = O_symbol_rva;
3326 else
3327 as_fatal (_("rva without symbol"));
3329 emit_expr (&exp, (unsigned int) nbytes);
3330 ++c;
3332 while (*input_line_pointer++ == ',');
3334 /* In MRI mode, after an odd number of bytes, we must align to an
3335 even word boundary, unless the next instruction is a dc.b, ds.b
3336 or dcb.b. */
3337 if (flag_mri && nbytes == 1 && (c & 1) != 0)
3338 mri_pending_align = 1;
3340 input_line_pointer--; /* Put terminator back into stream. */
3342 demand_empty_rest_of_line ();
3344 if (flag_mri)
3345 mri_comment_end (stop, stopc);
3349 void
3350 cons (size)
3351 int size;
3353 cons_worker (size, 0);
3356 void
3357 s_rva (size)
3358 int size;
3360 cons_worker (size, 1);
3363 /* Put the contents of expression EXP into the object file using
3364 NBYTES bytes. If need_pass_2 is 1, this does nothing. */
3366 void
3367 emit_expr (exp, nbytes)
3368 expressionS *exp;
3369 unsigned int nbytes;
3371 operatorT op;
3372 register char *p;
3373 valueT extra_digit = 0;
3375 /* Don't do anything if we are going to make another pass. */
3376 if (need_pass_2)
3377 return;
3379 #ifndef NO_LISTING
3380 #ifdef OBJ_ELF
3381 /* When gcc emits DWARF 1 debugging pseudo-ops, a line number will
3382 appear as a four byte positive constant in the .line section,
3383 followed by a 2 byte 0xffff. Look for that case here. */
3385 static int dwarf_line = -1;
3387 if (strcmp (segment_name (now_seg), ".line") != 0)
3388 dwarf_line = -1;
3389 else if (dwarf_line >= 0
3390 && nbytes == 2
3391 && exp->X_op == O_constant
3392 && (exp->X_add_number == -1 || exp->X_add_number == 0xffff))
3393 listing_source_line ((unsigned int) dwarf_line);
3394 else if (nbytes == 4
3395 && exp->X_op == O_constant
3396 && exp->X_add_number >= 0)
3397 dwarf_line = exp->X_add_number;
3398 else
3399 dwarf_line = -1;
3402 /* When gcc emits DWARF 1 debugging pseudo-ops, a file name will
3403 appear as a 2 byte TAG_compile_unit (0x11) followed by a 2 byte
3404 AT_sibling (0x12) followed by a four byte address of the sibling
3405 followed by a 2 byte AT_name (0x38) followed by the name of the
3406 file. We look for that case here. */
3408 static int dwarf_file = 0;
3410 if (strcmp (segment_name (now_seg), ".debug") != 0)
3411 dwarf_file = 0;
3412 else if (dwarf_file == 0
3413 && nbytes == 2
3414 && exp->X_op == O_constant
3415 && exp->X_add_number == 0x11)
3416 dwarf_file = 1;
3417 else if (dwarf_file == 1
3418 && nbytes == 2
3419 && exp->X_op == O_constant
3420 && exp->X_add_number == 0x12)
3421 dwarf_file = 2;
3422 else if (dwarf_file == 2
3423 && nbytes == 4)
3424 dwarf_file = 3;
3425 else if (dwarf_file == 3
3426 && nbytes == 2
3427 && exp->X_op == O_constant
3428 && exp->X_add_number == 0x38)
3429 dwarf_file = 4;
3430 else
3431 dwarf_file = 0;
3433 /* The variable dwarf_file_string tells stringer that the string
3434 may be the name of the source file. */
3435 if (dwarf_file == 4)
3436 dwarf_file_string = 1;
3437 else
3438 dwarf_file_string = 0;
3440 #endif
3441 #endif
3443 if (check_eh_frame (exp, &nbytes))
3444 return;
3446 op = exp->X_op;
3448 /* Allow `.word 0' in the absolute section. */
3449 if (now_seg == absolute_section)
3451 if (op != O_constant || exp->X_add_number != 0)
3452 as_bad (_("attempt to store value in absolute section"));
3453 abs_section_offset += nbytes;
3454 return;
3457 /* Handle a negative bignum. */
3458 if (op == O_uminus
3459 && exp->X_add_number == 0
3460 && symbol_get_value_expression (exp->X_add_symbol)->X_op == O_big
3461 && symbol_get_value_expression (exp->X_add_symbol)->X_add_number > 0)
3463 int i;
3464 unsigned long carry;
3466 exp = symbol_get_value_expression (exp->X_add_symbol);
3468 /* Negate the bignum: one's complement each digit and add 1. */
3469 carry = 1;
3470 for (i = 0; i < exp->X_add_number; i++)
3472 unsigned long next;
3474 next = (((~ (generic_bignum[i] & LITTLENUM_MASK))
3475 & LITTLENUM_MASK)
3476 + carry);
3477 generic_bignum[i] = next & LITTLENUM_MASK;
3478 carry = next >> LITTLENUM_NUMBER_OF_BITS;
3481 /* We can ignore any carry out, because it will be handled by
3482 extra_digit if it is needed. */
3484 extra_digit = (valueT) -1;
3485 op = O_big;
3488 if (op == O_absent || op == O_illegal)
3490 as_warn (_("zero assumed for missing expression"));
3491 exp->X_add_number = 0;
3492 op = O_constant;
3494 else if (op == O_big && exp->X_add_number <= 0)
3496 as_bad (_("floating point number invalid; zero assumed"));
3497 exp->X_add_number = 0;
3498 op = O_constant;
3500 else if (op == O_register)
3502 as_warn (_("register value used as expression"));
3503 op = O_constant;
3506 p = frag_more ((int) nbytes);
3508 #ifndef WORKING_DOT_WORD
3509 /* If we have the difference of two symbols in a word, save it on
3510 the broken_words list. See the code in write.c. */
3511 if (op == O_subtract && nbytes == 2)
3513 struct broken_word *x;
3515 x = (struct broken_word *) xmalloc (sizeof (struct broken_word));
3516 x->next_broken_word = broken_words;
3517 broken_words = x;
3518 x->seg = now_seg;
3519 x->subseg = now_subseg;
3520 x->frag = frag_now;
3521 x->word_goes_here = p;
3522 x->dispfrag = 0;
3523 x->add = exp->X_add_symbol;
3524 x->sub = exp->X_op_symbol;
3525 x->addnum = exp->X_add_number;
3526 x->added = 0;
3527 new_broken_words++;
3528 return;
3530 #endif
3532 /* If we have an integer, but the number of bytes is too large to
3533 pass to md_number_to_chars, handle it as a bignum. */
3534 if (op == O_constant && nbytes > sizeof (valueT))
3536 valueT val;
3537 int gencnt;
3539 if (! exp->X_unsigned && exp->X_add_number < 0)
3540 extra_digit = (valueT) -1;
3541 val = (valueT) exp->X_add_number;
3542 gencnt = 0;
3545 generic_bignum[gencnt] = val & LITTLENUM_MASK;
3546 val >>= LITTLENUM_NUMBER_OF_BITS;
3547 ++gencnt;
3549 while (val != 0);
3550 op = exp->X_op = O_big;
3551 exp->X_add_number = gencnt;
3554 if (op == O_constant)
3556 register valueT get;
3557 register valueT use;
3558 register valueT mask;
3559 valueT hibit;
3560 register valueT unmask;
3562 /* JF << of >= number of bits in the object is undefined. In
3563 particular SPARC (Sun 4) has problems */
3564 if (nbytes >= sizeof (valueT))
3566 mask = 0;
3567 if (nbytes > sizeof (valueT))
3568 hibit = 0;
3569 else
3570 hibit = (valueT) 1 << (nbytes * BITS_PER_CHAR - 1);
3572 else
3574 /* Don't store these bits. */
3575 mask = ~(valueT) 0 << (BITS_PER_CHAR * nbytes);
3576 hibit = (valueT) 1 << (nbytes * BITS_PER_CHAR - 1);
3579 unmask = ~mask; /* Do store these bits. */
3581 #ifdef NEVER
3582 "Do this mod if you want every overflow check to assume SIGNED 2's complement data.";
3583 mask = ~(unmask >> 1); /* Includes sign bit now. */
3584 #endif
3586 get = exp->X_add_number;
3587 use = get & unmask;
3588 if ((get & mask) != 0
3589 && ((get & mask) != mask
3590 || (get & hibit) == 0))
3591 { /* Leading bits contain both 0s & 1s. */
3592 as_warn (_("Value 0x%lx truncated to 0x%lx."),
3593 (unsigned long) get, (unsigned long) use);
3595 /* put bytes in right order. */
3596 md_number_to_chars (p, use, (int) nbytes);
3598 else if (op == O_big)
3600 unsigned int size;
3601 LITTLENUM_TYPE *nums;
3603 know (nbytes % CHARS_PER_LITTLENUM == 0);
3605 size = exp->X_add_number * CHARS_PER_LITTLENUM;
3606 if (nbytes < size)
3608 as_warn (_("Bignum truncated to %d bytes"), nbytes);
3609 size = nbytes;
3612 if (target_big_endian)
3614 while (nbytes > size)
3616 md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
3617 nbytes -= CHARS_PER_LITTLENUM;
3618 p += CHARS_PER_LITTLENUM;
3621 nums = generic_bignum + size / CHARS_PER_LITTLENUM;
3622 while (size > 0)
3624 --nums;
3625 md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
3626 size -= CHARS_PER_LITTLENUM;
3627 p += CHARS_PER_LITTLENUM;
3630 else
3632 nums = generic_bignum;
3633 while (size > 0)
3635 md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
3636 ++nums;
3637 size -= CHARS_PER_LITTLENUM;
3638 p += CHARS_PER_LITTLENUM;
3639 nbytes -= CHARS_PER_LITTLENUM;
3642 while (nbytes > 0)
3644 md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
3645 nbytes -= CHARS_PER_LITTLENUM;
3646 p += CHARS_PER_LITTLENUM;
3650 else
3652 memset (p, 0, nbytes);
3654 /* Now we need to generate a fixS to record the symbol value.
3655 This is easy for BFD. For other targets it can be more
3656 complex. For very complex cases (currently, the HPPA and
3657 NS32K), you can define TC_CONS_FIX_NEW to do whatever you
3658 want. For simpler cases, you can define TC_CONS_RELOC to be
3659 the name of the reloc code that should be stored in the fixS.
3660 If neither is defined, the code uses NO_RELOC if it is
3661 defined, and otherwise uses 0. */
3663 #ifdef BFD_ASSEMBLER
3664 #ifdef TC_CONS_FIX_NEW
3665 TC_CONS_FIX_NEW (frag_now, p - frag_now->fr_literal, nbytes, exp);
3666 #else
3668 bfd_reloc_code_real_type r;
3670 switch (nbytes)
3672 case 1:
3673 r = BFD_RELOC_8;
3674 break;
3675 case 2:
3676 r = BFD_RELOC_16;
3677 break;
3678 case 4:
3679 r = BFD_RELOC_32;
3680 break;
3681 case 8:
3682 r = BFD_RELOC_64;
3683 break;
3684 default:
3685 as_bad (_("unsupported BFD relocation size %u"), nbytes);
3686 r = BFD_RELOC_32;
3687 break;
3689 fix_new_exp (frag_now, p - frag_now->fr_literal, (int) nbytes, exp,
3690 0, r);
3692 #endif
3693 #else
3694 #ifdef TC_CONS_FIX_NEW
3695 TC_CONS_FIX_NEW (frag_now, p - frag_now->fr_literal, nbytes, exp);
3696 #else
3697 /* Figure out which reloc number to use. Use TC_CONS_RELOC if
3698 it is defined, otherwise use NO_RELOC if it is defined,
3699 otherwise use 0. */
3700 #ifndef TC_CONS_RELOC
3701 #ifdef NO_RELOC
3702 #define TC_CONS_RELOC NO_RELOC
3703 #else
3704 #define TC_CONS_RELOC 0
3705 #endif
3706 #endif
3707 fix_new_exp (frag_now, p - frag_now->fr_literal, (int) nbytes, exp, 0,
3708 TC_CONS_RELOC);
3709 #endif /* TC_CONS_FIX_NEW */
3710 #endif /* BFD_ASSEMBLER */
3714 #ifdef BITFIELD_CONS_EXPRESSIONS
3716 /* i960 assemblers, (eg, asm960), allow bitfields after ".byte" as
3717 w:x,y:z, where w and y are bitwidths and x and y are values. They
3718 then pack them all together. We do a little better in that we allow
3719 them in words, longs, etc. and we'll pack them in target byte order
3720 for you.
3722 The rules are: pack least significat bit first, if a field doesn't
3723 entirely fit, put it in the next unit. Overflowing the bitfield is
3724 explicitly *not* even a warning. The bitwidth should be considered
3725 a "mask".
3727 To use this function the tc-XXX.h file should define
3728 BITFIELD_CONS_EXPRESSIONS. */
3730 static void
3731 parse_bitfield_cons (exp, nbytes)
3732 expressionS *exp;
3733 unsigned int nbytes;
3735 unsigned int bits_available = BITS_PER_CHAR * nbytes;
3736 char *hold = input_line_pointer;
3738 (void) expression (exp);
3740 if (*input_line_pointer == ':')
3741 { /* bitfields */
3742 long value = 0;
3744 for (;;)
3746 unsigned long width;
3748 if (*input_line_pointer != ':')
3750 input_line_pointer = hold;
3751 break;
3752 } /* next piece is not a bitfield */
3754 /* In the general case, we can't allow
3755 full expressions with symbol
3756 differences and such. The relocation
3757 entries for symbols not defined in this
3758 assembly would require arbitrary field
3759 widths, positions, and masks which most
3760 of our current object formats don't
3761 support.
3763 In the specific case where a symbol
3764 *is* defined in this assembly, we
3765 *could* build fixups and track it, but
3766 this could lead to confusion for the
3767 backends. I'm lazy. I'll take any
3768 SEG_ABSOLUTE. I think that means that
3769 you can use a previous .set or
3770 .equ type symbol. xoxorich. */
3772 if (exp->X_op == O_absent)
3774 as_warn (_("using a bit field width of zero"));
3775 exp->X_add_number = 0;
3776 exp->X_op = O_constant;
3777 } /* implied zero width bitfield */
3779 if (exp->X_op != O_constant)
3781 *input_line_pointer = '\0';
3782 as_bad (_("field width \"%s\" too complex for a bitfield"), hold);
3783 *input_line_pointer = ':';
3784 demand_empty_rest_of_line ();
3785 return;
3786 } /* too complex */
3788 if ((width = exp->X_add_number) > (BITS_PER_CHAR * nbytes))
3790 as_warn (_("field width %lu too big to fit in %d bytes: truncated to %d bits"),
3791 width, nbytes, (BITS_PER_CHAR * nbytes));
3792 width = BITS_PER_CHAR * nbytes;
3793 } /* too big */
3795 if (width > bits_available)
3797 /* FIXME-SOMEDAY: backing up and reparsing is wasteful. */
3798 input_line_pointer = hold;
3799 exp->X_add_number = value;
3800 break;
3801 } /* won't fit */
3803 hold = ++input_line_pointer; /* skip ':' */
3805 (void) expression (exp);
3806 if (exp->X_op != O_constant)
3808 char cache = *input_line_pointer;
3810 *input_line_pointer = '\0';
3811 as_bad (_("field value \"%s\" too complex for a bitfield"), hold);
3812 *input_line_pointer = cache;
3813 demand_empty_rest_of_line ();
3814 return;
3815 } /* too complex */
3817 value |= ((~(-1 << width) & exp->X_add_number)
3818 << ((BITS_PER_CHAR * nbytes) - bits_available));
3820 if ((bits_available -= width) == 0
3821 || is_it_end_of_statement ()
3822 || *input_line_pointer != ',')
3824 break;
3825 } /* all the bitfields we're gonna get */
3827 hold = ++input_line_pointer;
3828 (void) expression (exp);
3829 } /* forever loop */
3831 exp->X_add_number = value;
3832 exp->X_op = O_constant;
3833 exp->X_unsigned = 1;
3834 } /* if looks like a bitfield */
3835 } /* parse_bitfield_cons() */
3837 #endif /* BITFIELD_CONS_EXPRESSIONS */
3839 /* Handle an MRI style string expression. */
3841 #ifdef TC_M68K
3842 static void
3843 parse_mri_cons (exp, nbytes)
3844 expressionS *exp;
3845 unsigned int nbytes;
3847 if (*input_line_pointer != '\''
3848 && (input_line_pointer[1] != '\''
3849 || (*input_line_pointer != 'A'
3850 && *input_line_pointer != 'E')))
3851 TC_PARSE_CONS_EXPRESSION (exp, nbytes);
3852 else
3854 unsigned int scan;
3855 unsigned int result = 0;
3857 /* An MRI style string. Cut into as many bytes as will fit into
3858 a nbyte chunk, left justify if necessary, and separate with
3859 commas so we can try again later. */
3860 if (*input_line_pointer == 'A')
3861 ++input_line_pointer;
3862 else if (*input_line_pointer == 'E')
3864 as_bad (_("EBCDIC constants are not supported"));
3865 ++input_line_pointer;
3868 input_line_pointer++;
3869 for (scan = 0; scan < nbytes; scan++)
3871 if (*input_line_pointer == '\'')
3873 if (input_line_pointer[1] == '\'')
3875 input_line_pointer++;
3877 else
3878 break;
3880 result = (result << 8) | (*input_line_pointer++);
3883 /* Left justify */
3884 while (scan < nbytes)
3886 result <<= 8;
3887 scan++;
3889 /* Create correct expression */
3890 exp->X_op = O_constant;
3891 exp->X_add_number = result;
3892 /* Fake it so that we can read the next char too */
3893 if (input_line_pointer[0] != '\'' ||
3894 (input_line_pointer[0] == '\'' && input_line_pointer[1] == '\''))
3896 input_line_pointer -= 2;
3897 input_line_pointer[0] = ',';
3898 input_line_pointer[1] = '\'';
3900 else
3901 input_line_pointer++;
3904 #endif /* TC_M68K */
3906 #ifdef REPEAT_CONS_EXPRESSIONS
3908 /* Parse a repeat expression for cons. This is used by the MIPS
3909 assembler. The format is NUMBER:COUNT; NUMBER appears in the
3910 object file COUNT times.
3912 To use this for a target, define REPEAT_CONS_EXPRESSIONS. */
3914 static void
3915 parse_repeat_cons (exp, nbytes)
3916 expressionS *exp;
3917 unsigned int nbytes;
3919 expressionS count;
3920 register int i;
3922 expression (exp);
3924 if (*input_line_pointer != ':')
3926 /* No repeat count. */
3927 return;
3930 ++input_line_pointer;
3931 expression (&count);
3932 if (count.X_op != O_constant
3933 || count.X_add_number <= 0)
3935 as_warn (_("Unresolvable or nonpositive repeat count; using 1"));
3936 return;
3939 /* The cons function is going to output this expression once. So we
3940 output it count - 1 times. */
3941 for (i = count.X_add_number - 1; i > 0; i--)
3942 emit_expr (exp, nbytes);
3945 #endif /* REPEAT_CONS_EXPRESSIONS */
3947 /* Parse a floating point number represented as a hex constant. This
3948 permits users to specify the exact bits they want in the floating
3949 point number. */
3951 static int
3952 hex_float (float_type, bytes)
3953 int float_type;
3954 char *bytes;
3956 int length;
3957 int i;
3959 switch (float_type)
3961 case 'f':
3962 case 'F':
3963 case 's':
3964 case 'S':
3965 length = 4;
3966 break;
3968 case 'd':
3969 case 'D':
3970 case 'r':
3971 case 'R':
3972 length = 8;
3973 break;
3975 case 'x':
3976 case 'X':
3977 length = 12;
3978 break;
3980 case 'p':
3981 case 'P':
3982 length = 12;
3983 break;
3985 default:
3986 as_bad (_("Unknown floating type type '%c'"), float_type);
3987 return -1;
3990 /* It would be nice if we could go through expression to parse the
3991 hex constant, but if we get a bignum it's a pain to sort it into
3992 the buffer correctly. */
3993 i = 0;
3994 while (hex_p (*input_line_pointer) || *input_line_pointer == '_')
3996 int d;
3998 /* The MRI assembler accepts arbitrary underscores strewn about
3999 through the hex constant, so we ignore them as well. */
4000 if (*input_line_pointer == '_')
4002 ++input_line_pointer;
4003 continue;
4006 if (i >= length)
4008 as_warn (_("Floating point constant too large"));
4009 return -1;
4011 d = hex_value (*input_line_pointer) << 4;
4012 ++input_line_pointer;
4013 while (*input_line_pointer == '_')
4014 ++input_line_pointer;
4015 if (hex_p (*input_line_pointer))
4017 d += hex_value (*input_line_pointer);
4018 ++input_line_pointer;
4020 if (target_big_endian)
4021 bytes[i] = d;
4022 else
4023 bytes[length - i - 1] = d;
4024 ++i;
4027 if (i < length)
4029 if (target_big_endian)
4030 memset (bytes + i, 0, length - i);
4031 else
4032 memset (bytes, 0, length - i);
4035 return length;
4039 * float_cons()
4041 * CONStruct some more frag chars of .floats .ffloats etc.
4042 * Makes 0 or more new frags.
4043 * If need_pass_2 == 1, no frags are emitted.
4044 * This understands only floating literals, not expressions. Sorry.
4046 * A floating constant is defined by atof_generic(), except it is preceded
4047 * by 0d 0f 0g or 0h. After observing the STRANGE way my BSD AS does its
4048 * reading, I decided to be incompatible. This always tries to give you
4049 * rounded bits to the precision of the pseudo-op. Former AS did premature
4050 * truncatation, restored noisy bits instead of trailing 0s AND gave you
4051 * a choice of 2 flavours of noise according to which of 2 floating-point
4052 * scanners you directed AS to use.
4054 * In: input_line_pointer->whitespace before, or '0' of flonum.
4058 void
4059 float_cons (float_type)
4060 /* Clobbers input_line-pointer, checks end-of-line. */
4061 register int float_type; /* 'f':.ffloat ... 'F':.float ... */
4063 register char *p;
4064 int length; /* Number of chars in an object. */
4065 register char *err; /* Error from scanning floating literal. */
4066 char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
4068 if (is_it_end_of_statement ())
4070 demand_empty_rest_of_line ();
4071 return;
4074 #ifdef md_flush_pending_output
4075 md_flush_pending_output ();
4076 #endif
4080 /* input_line_pointer->1st char of a flonum (we hope!). */
4081 SKIP_WHITESPACE ();
4083 /* Skip any 0{letter} that may be present. Don't even check if the
4084 * letter is legal. Someone may invent a "z" format and this routine
4085 * has no use for such information. Lusers beware: you get
4086 * diagnostics if your input is ill-conditioned.
4088 if (input_line_pointer[0] == '0'
4089 && isalpha ((unsigned char) input_line_pointer[1]))
4090 input_line_pointer += 2;
4092 /* Accept :xxxx, where the x's are hex digits, for a floating
4093 point with the exact digits specified. */
4094 if (input_line_pointer[0] == ':')
4096 ++input_line_pointer;
4097 length = hex_float (float_type, temp);
4098 if (length < 0)
4100 ignore_rest_of_line ();
4101 return;
4104 else
4106 err = md_atof (float_type, temp, &length);
4107 know (length <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
4108 know (length > 0);
4109 if (err)
4111 as_bad (_("Bad floating literal: %s"), err);
4112 ignore_rest_of_line ();
4113 return;
4117 if (!need_pass_2)
4119 int count;
4121 count = 1;
4123 #ifdef REPEAT_CONS_EXPRESSIONS
4124 if (*input_line_pointer == ':')
4126 expressionS count_exp;
4128 ++input_line_pointer;
4129 expression (&count_exp);
4130 if (count_exp.X_op != O_constant
4131 || count_exp.X_add_number <= 0)
4133 as_warn (_("unresolvable or nonpositive repeat count; using 1"));
4135 else
4136 count = count_exp.X_add_number;
4138 #endif
4140 while (--count >= 0)
4142 p = frag_more (length);
4143 memcpy (p, temp, (unsigned int) length);
4146 SKIP_WHITESPACE ();
4148 while (*input_line_pointer++ == ',');
4150 --input_line_pointer; /* Put terminator back into stream. */
4151 demand_empty_rest_of_line ();
4152 } /* float_cons() */
4154 /* Return the size of a LEB128 value */
4156 static inline int
4157 sizeof_sleb128 (value)
4158 offsetT value;
4160 register int size = 0;
4161 register unsigned byte;
4165 byte = (value & 0x7f);
4166 /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
4167 Fortunately, we can structure things so that the extra work reduces
4168 to a noop on systems that do things "properly". */
4169 value = (value >> 7) | ~(-(offsetT)1 >> 7);
4170 size += 1;
4172 while (!(((value == 0) && ((byte & 0x40) == 0))
4173 || ((value == -1) && ((byte & 0x40) != 0))));
4175 return size;
4178 static inline int
4179 sizeof_uleb128 (value)
4180 valueT value;
4182 register int size = 0;
4183 register unsigned byte;
4187 byte = (value & 0x7f);
4188 value >>= 7;
4189 size += 1;
4191 while (value != 0);
4193 return size;
4197 sizeof_leb128 (value, sign)
4198 valueT value;
4199 int sign;
4201 if (sign)
4202 return sizeof_sleb128 ((offsetT) value);
4203 else
4204 return sizeof_uleb128 (value);
4207 /* Output a LEB128 value. */
4209 static inline int
4210 output_sleb128 (p, value)
4211 char *p;
4212 offsetT value;
4214 register char *orig = p;
4215 register int more;
4219 unsigned byte = (value & 0x7f);
4221 /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
4222 Fortunately, we can structure things so that the extra work reduces
4223 to a noop on systems that do things "properly". */
4224 value = (value >> 7) | ~(-(offsetT)1 >> 7);
4226 more = !((((value == 0) && ((byte & 0x40) == 0))
4227 || ((value == -1) && ((byte & 0x40) != 0))));
4228 if (more)
4229 byte |= 0x80;
4231 *p++ = byte;
4233 while (more);
4235 return p - orig;
4238 static inline int
4239 output_uleb128 (p, value)
4240 char *p;
4241 valueT value;
4243 char *orig = p;
4247 unsigned byte = (value & 0x7f);
4248 value >>= 7;
4249 if (value != 0)
4250 /* More bytes to follow. */
4251 byte |= 0x80;
4253 *p++ = byte;
4255 while (value != 0);
4257 return p - orig;
4261 output_leb128 (p, value, sign)
4262 char *p;
4263 valueT value;
4264 int sign;
4266 if (sign)
4267 return output_sleb128 (p, (offsetT) value);
4268 else
4269 return output_uleb128 (p, value);
4272 /* Do the same for bignums. We combine sizeof with output here in that
4273 we don't output for NULL values of P. It isn't really as critical as
4274 for "normal" values that this be streamlined. */
4276 static inline int
4277 output_big_sleb128 (p, bignum, size)
4278 char *p;
4279 LITTLENUM_TYPE *bignum;
4280 int size;
4282 char *orig = p;
4283 valueT val = 0;
4284 int loaded = 0;
4285 unsigned byte;
4287 /* Strip leading sign extensions off the bignum. */
4288 while (size > 0 && bignum[size-1] == (LITTLENUM_TYPE)-1)
4289 size--;
4293 if (loaded < 7 && size > 0)
4295 val |= (*bignum << loaded);
4296 loaded += 8 * CHARS_PER_LITTLENUM;
4297 size--;
4298 bignum++;
4301 byte = val & 0x7f;
4302 loaded -= 7;
4303 val >>= 7;
4305 if (size == 0)
4307 if ((val == 0 && (byte & 0x40) == 0)
4308 || (~(val | ~(((valueT)1 << loaded) - 1)) == 0
4309 && (byte & 0x40) != 0))
4310 byte |= 0x80;
4313 if (orig)
4314 *p = byte;
4315 p++;
4317 while (byte & 0x80);
4319 return p - orig;
4322 static inline int
4323 output_big_uleb128 (p, bignum, size)
4324 char *p;
4325 LITTLENUM_TYPE *bignum;
4326 int size;
4328 char *orig = p;
4329 valueT val = 0;
4330 int loaded = 0;
4331 unsigned byte;
4333 /* Strip leading zeros off the bignum. */
4334 /* XXX: Is this needed? */
4335 while (size > 0 && bignum[size-1] == 0)
4336 size--;
4340 if (loaded < 7 && size > 0)
4342 val |= (*bignum << loaded);
4343 loaded += 8 * CHARS_PER_LITTLENUM;
4344 size--;
4345 bignum++;
4348 byte = val & 0x7f;
4349 loaded -= 7;
4350 val >>= 7;
4352 if (size > 0 || val)
4353 byte |= 0x80;
4355 if (orig)
4356 *p = byte;
4357 p++;
4359 while (byte & 0x80);
4361 return p - orig;
4364 static int
4365 output_big_leb128 (p, bignum, size, sign)
4366 char *p;
4367 LITTLENUM_TYPE *bignum;
4368 int size, sign;
4370 if (sign)
4371 return output_big_sleb128 (p, bignum, size);
4372 else
4373 return output_big_uleb128 (p, bignum, size);
4376 /* Generate the appropriate fragments for a given expression to emit a
4377 leb128 value. */
4379 void
4380 emit_leb128_expr(exp, sign)
4381 expressionS *exp;
4382 int sign;
4384 operatorT op = exp->X_op;
4386 if (op == O_absent || op == O_illegal)
4388 as_warn (_("zero assumed for missing expression"));
4389 exp->X_add_number = 0;
4390 op = O_constant;
4392 else if (op == O_big && exp->X_add_number <= 0)
4394 as_bad (_("floating point number invalid; zero assumed"));
4395 exp->X_add_number = 0;
4396 op = O_constant;
4398 else if (op == O_register)
4400 as_warn (_("register value used as expression"));
4401 op = O_constant;
4404 if (op == O_constant)
4406 /* If we've got a constant, emit the thing directly right now. */
4408 valueT value = exp->X_add_number;
4409 int size;
4410 char *p;
4412 size = sizeof_leb128 (value, sign);
4413 p = frag_more (size);
4414 output_leb128 (p, value, sign);
4416 else if (op == O_big)
4418 /* O_big is a different sort of constant. */
4420 int size;
4421 char *p;
4423 size = output_big_leb128 (NULL, generic_bignum, exp->X_add_number, sign);
4424 p = frag_more (size);
4425 output_big_leb128 (p, generic_bignum, exp->X_add_number, sign);
4427 else
4429 /* Otherwise, we have to create a variable sized fragment and
4430 resolve things later. */
4432 frag_var (rs_leb128, sizeof_uleb128 (~(valueT)0), 0, sign,
4433 make_expr_symbol (exp), 0, (char *) NULL);
4437 /* Parse the .sleb128 and .uleb128 pseudos. */
4439 void
4440 s_leb128 (sign)
4441 int sign;
4443 expressionS exp;
4445 do {
4446 expression (&exp);
4447 emit_leb128_expr (&exp, sign);
4448 } while (*input_line_pointer++ == ',');
4450 input_line_pointer--;
4451 demand_empty_rest_of_line ();
4455 * stringer()
4457 * We read 0 or more ',' separated, double-quoted strings.
4459 * Caller should have checked need_pass_2 is FALSE because we don't check it.
4463 void
4464 stringer (append_zero) /* Worker to do .ascii etc statements. */
4465 /* Checks end-of-line. */
4466 register int append_zero; /* 0: don't append '\0', else 1 */
4468 register unsigned int c;
4469 char *start;
4471 #ifdef md_flush_pending_output
4472 md_flush_pending_output ();
4473 #endif
4476 * The following awkward logic is to parse ZERO or more strings,
4477 * comma separated. Recall a string expression includes spaces
4478 * before the opening '\"' and spaces after the closing '\"'.
4479 * We fake a leading ',' if there is (supposed to be)
4480 * a 1st, expression. We keep demanding expressions for each
4481 * ','.
4483 if (is_it_end_of_statement ())
4485 c = 0; /* Skip loop. */
4486 ++input_line_pointer; /* Compensate for end of loop. */
4488 else
4490 c = ','; /* Do loop. */
4492 while (c == ',' || c == '<' || c == '"')
4494 SKIP_WHITESPACE ();
4495 switch (*input_line_pointer)
4497 case '\"':
4498 ++input_line_pointer; /*->1st char of string. */
4499 start = input_line_pointer;
4500 while (is_a_char (c = next_char_of_string ()))
4502 FRAG_APPEND_1_CHAR (c);
4504 if (append_zero)
4506 FRAG_APPEND_1_CHAR (0);
4508 know (input_line_pointer[-1] == '\"');
4510 #ifndef NO_LISTING
4511 #ifdef OBJ_ELF
4512 /* In ELF, when gcc is emitting DWARF 1 debugging output, it
4513 will emit .string with a filename in the .debug section
4514 after a sequence of constants. See the comment in
4515 emit_expr for the sequence. emit_expr will set
4516 dwarf_file_string to non-zero if this string might be a
4517 source file name. */
4518 if (strcmp (segment_name (now_seg), ".debug") != 0)
4519 dwarf_file_string = 0;
4520 else if (dwarf_file_string)
4522 c = input_line_pointer[-1];
4523 input_line_pointer[-1] = '\0';
4524 listing_source_file (start);
4525 input_line_pointer[-1] = c;
4527 #endif
4528 #endif
4530 break;
4531 case '<':
4532 input_line_pointer++;
4533 c = get_single_number ();
4534 FRAG_APPEND_1_CHAR (c);
4535 if (*input_line_pointer != '>')
4537 as_bad (_("Expected <nn>"));
4539 input_line_pointer++;
4540 break;
4541 case ',':
4542 input_line_pointer++;
4543 break;
4545 SKIP_WHITESPACE ();
4546 c = *input_line_pointer;
4549 demand_empty_rest_of_line ();
4550 } /* stringer() */
4552 /* FIXME-SOMEDAY: I had trouble here on characters with the
4553 high bits set. We'll probably also have trouble with
4554 multibyte chars, wide chars, etc. Also be careful about
4555 returning values bigger than 1 byte. xoxorich. */
4557 unsigned int
4558 next_char_of_string ()
4560 register unsigned int c;
4562 c = *input_line_pointer++ & CHAR_MASK;
4563 switch (c)
4565 case '\"':
4566 c = NOT_A_CHAR;
4567 break;
4569 case '\n':
4570 as_warn (_("Unterminated string: Newline inserted."));
4571 bump_line_counters ();
4572 break;
4574 #ifndef NO_STRING_ESCAPES
4575 case '\\':
4576 switch (c = *input_line_pointer++)
4578 case 'b':
4579 c = '\b';
4580 break;
4582 case 'f':
4583 c = '\f';
4584 break;
4586 case 'n':
4587 c = '\n';
4588 break;
4590 case 'r':
4591 c = '\r';
4592 break;
4594 case 't':
4595 c = '\t';
4596 break;
4598 case 'v':
4599 c = '\013';
4600 break;
4602 case '\\':
4603 case '"':
4604 break; /* As itself. */
4606 case '0':
4607 case '1':
4608 case '2':
4609 case '3':
4610 case '4':
4611 case '5':
4612 case '6':
4613 case '7':
4614 case '8':
4615 case '9':
4617 long number;
4618 int i;
4620 for (i = 0, number = 0; isdigit (c) && i < 3; c = *input_line_pointer++, i++)
4622 number = number * 8 + c - '0';
4624 c = number & 0xff;
4626 --input_line_pointer;
4627 break;
4629 case 'x':
4630 case 'X':
4632 long number;
4634 number = 0;
4635 c = *input_line_pointer++;
4636 while (isxdigit (c))
4638 if (isdigit (c))
4639 number = number * 16 + c - '0';
4640 else if (isupper (c))
4641 number = number * 16 + c - 'A' + 10;
4642 else
4643 number = number * 16 + c - 'a' + 10;
4644 c = *input_line_pointer++;
4646 c = number & 0xff;
4647 --input_line_pointer;
4649 break;
4651 case '\n':
4652 /* To be compatible with BSD 4.2 as: give the luser a linefeed!! */
4653 as_warn (_("Unterminated string: Newline inserted."));
4654 c = '\n';
4655 bump_line_counters ();
4656 break;
4658 default:
4660 #ifdef ONLY_STANDARD_ESCAPES
4661 as_bad (_("Bad escaped character in string, '?' assumed"));
4662 c = '?';
4663 #endif /* ONLY_STANDARD_ESCAPES */
4665 break;
4666 } /* switch on escaped char */
4667 break;
4668 #endif /* ! defined (NO_STRING_ESCAPES) */
4670 default:
4671 break;
4672 } /* switch on char */
4673 return (c);
4674 } /* next_char_of_string() */
4676 static segT
4677 get_segmented_expression (expP)
4678 register expressionS *expP;
4680 register segT retval;
4682 retval = expression (expP);
4683 if (expP->X_op == O_illegal
4684 || expP->X_op == O_absent
4685 || expP->X_op == O_big)
4687 as_bad (_("expected address expression; zero assumed"));
4688 expP->X_op = O_constant;
4689 expP->X_add_number = 0;
4690 retval = absolute_section;
4692 return retval;
4695 static segT
4696 get_known_segmented_expression (expP)
4697 register expressionS *expP;
4699 register segT retval;
4701 if ((retval = get_segmented_expression (expP)) == undefined_section)
4703 /* There is no easy way to extract the undefined symbol from the
4704 expression. */
4705 if (expP->X_add_symbol != NULL
4706 && S_GET_SEGMENT (expP->X_add_symbol) != expr_section)
4707 as_warn (_("symbol \"%s\" undefined; zero assumed"),
4708 S_GET_NAME (expP->X_add_symbol));
4709 else
4710 as_warn (_("some symbol undefined; zero assumed"));
4711 retval = absolute_section;
4712 expP->X_op = O_constant;
4713 expP->X_add_number = 0;
4715 know (retval == absolute_section || SEG_NORMAL (retval));
4716 return (retval);
4717 } /* get_known_segmented_expression() */
4719 offsetT
4720 get_absolute_expression ()
4722 expressionS exp;
4724 expression (&exp);
4725 if (exp.X_op != O_constant)
4727 if (exp.X_op != O_absent)
4728 as_bad (_("bad or irreducible absolute expression; zero assumed"));
4729 exp.X_add_number = 0;
4731 return exp.X_add_number;
4734 char /* return terminator */
4735 get_absolute_expression_and_terminator (val_pointer)
4736 long *val_pointer; /* return value of expression */
4738 /* FIXME: val_pointer should probably be offsetT *. */
4739 *val_pointer = (long) get_absolute_expression ();
4740 return (*input_line_pointer++);
4744 * demand_copy_C_string()
4746 * Like demand_copy_string, but return NULL if the string contains any '\0's.
4747 * Give a warning if that happens.
4749 char *
4750 demand_copy_C_string (len_pointer)
4751 int *len_pointer;
4753 register char *s;
4755 if ((s = demand_copy_string (len_pointer)) != 0)
4757 register int len;
4759 for (len = *len_pointer; len > 0; len--)
4761 if (*s == 0)
4763 s = 0;
4764 len = 1;
4765 *len_pointer = 0;
4766 as_bad (_("This string may not contain \'\\0\'"));
4770 return s;
4774 * demand_copy_string()
4776 * Demand string, but return a safe (=private) copy of the string.
4777 * Return NULL if we can't read a string here.
4779 char *
4780 demand_copy_string (lenP)
4781 int *lenP;
4783 register unsigned int c;
4784 register int len;
4785 char *retval;
4787 len = 0;
4788 SKIP_WHITESPACE ();
4789 if (*input_line_pointer == '\"')
4791 input_line_pointer++; /* Skip opening quote. */
4793 while (is_a_char (c = next_char_of_string ()))
4795 obstack_1grow (&notes, c);
4796 len++;
4798 /* JF this next line is so demand_copy_C_string will return a
4799 null terminated string. */
4800 obstack_1grow (&notes, '\0');
4801 retval = obstack_finish (&notes);
4803 else
4805 as_warn (_("Missing string"));
4806 retval = NULL;
4807 ignore_rest_of_line ();
4809 *lenP = len;
4810 return (retval);
4811 } /* demand_copy_string() */
4814 * is_it_end_of_statement()
4816 * In: Input_line_pointer->next character.
4818 * Do: Skip input_line_pointer over all whitespace.
4820 * Out: 1 if input_line_pointer->end-of-line.
4822 int
4823 is_it_end_of_statement ()
4825 SKIP_WHITESPACE ();
4826 return (is_end_of_line[(unsigned char) *input_line_pointer]);
4827 } /* is_it_end_of_statement() */
4829 void
4830 equals (sym_name, reassign)
4831 char *sym_name;
4832 int reassign;
4834 register symbolS *symbolP; /* symbol we are working with */
4835 char *stop = NULL;
4836 char stopc;
4838 input_line_pointer++;
4839 if (*input_line_pointer == '=')
4840 input_line_pointer++;
4842 while (*input_line_pointer == ' ' || *input_line_pointer == '\t')
4843 input_line_pointer++;
4845 if (flag_mri)
4846 stop = mri_comment_field (&stopc);
4848 if (sym_name[0] == '.' && sym_name[1] == '\0')
4850 /* Turn '. = mumble' into a .org mumble */
4851 register segT segment;
4852 expressionS exp;
4854 segment = get_known_segmented_expression (&exp);
4855 if (!need_pass_2)
4856 do_org (segment, &exp, 0);
4858 else
4860 symbolP = symbol_find_or_make (sym_name);
4861 /* Permit register names to be redefined. */
4862 if (! reassign
4863 && S_IS_DEFINED (symbolP)
4864 && S_GET_SEGMENT (symbolP) != reg_section)
4865 as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
4866 pseudo_set (symbolP);
4869 if (flag_mri)
4871 ignore_rest_of_line (); /* check garbage after the expression */
4872 mri_comment_end (stop, stopc);
4874 } /* equals() */
4876 /* .include -- include a file at this point. */
4878 /* ARGSUSED */
4879 void
4880 s_include (arg)
4881 int arg ATTRIBUTE_UNUSED;
4883 char *filename;
4884 int i;
4885 FILE *try;
4886 char *path;
4888 if (! flag_m68k_mri)
4890 filename = demand_copy_string (&i);
4891 if (filename == NULL)
4893 /* demand_copy_string has already printed an error and
4894 called ignore_rest_of_line. */
4895 return;
4898 else
4900 SKIP_WHITESPACE ();
4901 i = 0;
4902 while (! is_end_of_line[(unsigned char) *input_line_pointer]
4903 && *input_line_pointer != ' '
4904 && *input_line_pointer != '\t')
4906 obstack_1grow (&notes, *input_line_pointer);
4907 ++input_line_pointer;
4908 ++i;
4910 obstack_1grow (&notes, '\0');
4911 filename = obstack_finish (&notes);
4912 while (! is_end_of_line[(unsigned char) *input_line_pointer])
4913 ++input_line_pointer;
4915 demand_empty_rest_of_line ();
4916 path = xmalloc ((unsigned long) i + include_dir_maxlen + 5 /* slop */ );
4917 for (i = 0; i < include_dir_count; i++)
4919 strcpy (path, include_dirs[i]);
4920 strcat (path, "/");
4921 strcat (path, filename);
4922 if (0 != (try = fopen (path, "r")))
4924 fclose (try);
4925 goto gotit;
4928 free (path);
4929 path = filename;
4930 gotit:
4931 /* malloc Storage leak when file is found on path. FIXME-SOMEDAY. */
4932 register_dependency (path);
4933 input_scrub_insert_file (path);
4934 } /* s_include() */
4936 void
4937 add_include_dir (path)
4938 char *path;
4940 int i;
4942 if (include_dir_count == 0)
4944 include_dirs = (char **) xmalloc (2 * sizeof (*include_dirs));
4945 include_dirs[0] = "."; /* Current dir */
4946 include_dir_count = 2;
4948 else
4950 include_dir_count++;
4951 include_dirs = (char **) realloc (include_dirs,
4952 include_dir_count * sizeof (*include_dirs));
4955 include_dirs[include_dir_count - 1] = path; /* New one */
4957 i = strlen (path);
4958 if (i > include_dir_maxlen)
4959 include_dir_maxlen = i;
4960 } /* add_include_dir() */
4962 /* Output debugging information to denote the source file. */
4964 static void
4965 generate_file_debug ()
4967 if (debug_type == DEBUG_STABS)
4968 stabs_generate_asm_file ();
4971 /* Output line number debugging information for the current source line. */
4973 void
4974 generate_lineno_debug ()
4976 #ifdef ECOFF_DEBUGGING
4977 /* ECOFF assemblers automatically generate debugging information.
4978 FIXME: This should probably be handled elsewhere. */
4979 if (debug_type == DEBUG_UNSPECIFIED)
4981 if (ECOFF_DEBUGGING && ecoff_no_current_file ())
4982 debug_type = DEBUG_ECOFF;
4983 else
4984 debug_type = DEBUG_NONE;
4986 #endif
4988 switch (debug_type)
4990 case DEBUG_UNSPECIFIED:
4991 case DEBUG_NONE:
4992 break;
4993 case DEBUG_STABS:
4994 stabs_generate_asm_lineno ();
4995 break;
4996 case DEBUG_ECOFF:
4997 ecoff_generate_asm_lineno ();
4998 break;
4999 case DEBUG_DWARF:
5000 case DEBUG_DWARF2:
5001 /* FIXME. */
5002 break;
5006 /* Output debugging information to mark a function entry point or end point.
5007 END_P is zero for .func, and non-zero for .endfunc. */
5009 void
5010 s_func (end_p)
5011 int end_p;
5013 do_s_func (end_p, NULL);
5016 /* Subroutine of s_func so targets can choose a different default prefix.
5017 If DEFAULT_PREFIX is NULL, use the target's "leading char". */
5019 void
5020 do_s_func (end_p, default_prefix)
5021 int end_p;
5022 const char *default_prefix;
5024 /* Record the current function so that we can issue an error message for
5025 misplaced .func,.endfunc, and also so that .endfunc needs no
5026 arguments. */
5027 static char *current_name;
5028 static char *current_label;
5030 if (end_p)
5032 if (current_name == NULL)
5034 as_bad (_("missing .func"));
5035 ignore_rest_of_line ();
5036 return;
5039 if (debug_type == DEBUG_STABS)
5040 stabs_generate_asm_endfunc (current_name, current_label);
5042 current_name = current_label = NULL;
5044 else /* ! end_p */
5046 char *name,*label;
5047 char delim1,delim2;
5049 if (current_name != NULL)
5051 as_bad (_(".endfunc missing for previous .func"));
5052 ignore_rest_of_line ();
5053 return;
5056 name = input_line_pointer;
5057 delim1 = get_symbol_end ();
5058 name = xstrdup (name);
5059 *input_line_pointer = delim1;
5060 SKIP_WHITESPACE ();
5061 if (*input_line_pointer != ',')
5063 if (default_prefix)
5064 asprintf (&label, "%s%s", default_prefix, name);
5065 else
5067 char leading_char = 0;
5068 #ifdef BFD_ASSEMBLER
5069 leading_char = bfd_get_symbol_leading_char (stdoutput);
5070 #endif
5071 /* Missing entry point, use function's name with the leading
5072 char prepended. */
5073 if (leading_char)
5074 asprintf (&label, "%c%s", leading_char, name);
5075 else
5076 label = name;
5079 else
5081 ++input_line_pointer;
5082 SKIP_WHITESPACE ();
5083 label = input_line_pointer;
5084 delim2 = get_symbol_end ();
5085 label = xstrdup (label);
5086 *input_line_pointer = delim2;
5089 if (debug_type == DEBUG_STABS)
5090 stabs_generate_asm_func (name, label);
5092 current_name = name;
5093 current_label = label;
5096 demand_empty_rest_of_line ();
5099 void
5100 s_ignore (arg)
5101 int arg ATTRIBUTE_UNUSED;
5103 while (!is_end_of_line[(unsigned char) *input_line_pointer])
5105 ++input_line_pointer;
5107 ++input_line_pointer;
5111 void
5112 read_print_statistics (file)
5113 FILE *file;
5115 hash_print_statistics (file, "pseudo-op table", po_hash);
5118 /* Inserts the given line into the input stream.
5120 This call avoids macro/conditionals nesting checking, since the contents of
5121 the line are assumed to replace the contents of a line already scanned.
5123 An appropriate use of this function would be substition of input lines when
5124 called by md_start_line_hook(). The given line is assumed to already be
5125 properly scrubbed. */
5127 void
5128 input_scrub_insert_line (line)
5129 const char *line;
5131 sb newline;
5132 sb_new (&newline);
5133 sb_add_string (&newline, line);
5134 input_scrub_include_sb (&newline, input_line_pointer, 0);
5135 sb_kill (&newline);
5136 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
5139 /* Insert a file into the input stream; the path must resolve to an actual
5140 file; no include path searching or dependency registering is performed. */
5142 void
5143 input_scrub_insert_file (path)
5144 char *path;
5146 input_scrub_include_file (path, input_line_pointer);
5147 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
5150 /* end of read.c */