]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/read.c
Automatic date update in version.in
[thirdparty/binutils-gdb.git] / gas / read.c
CommitLineData
252b5132 1/* read.c - read a source file -
fd67aa11 2 Copyright (C) 1986-2024 Free Software Foundation, Inc.
252b5132 3
ec2655a6 4 This file is part of GAS, the GNU Assembler.
252b5132 5
ec2655a6
NC
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
252b5132 10
ec2655a6
NC
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
252b5132 15
ec2655a6
NC
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19 02110-1301, USA. */
252b5132 20
59c871b4 21/* If your chars aren't 8 bits, you will change this a bit (eg. to 0xFF).
33eaf5de 22 But then, GNU isn't supposed to run on your machine anyway.
041ff4dd 23 (RMS is so shortsighted sometimes.) */
041ff4dd 24#define MASK_CHAR ((int)(unsigned char) -1)
252b5132 25
252b5132 26/* This is the largest known floating point format (for now). It will
041ff4dd 27 grow when we do 4361 style flonums. */
252b5132
RH
28#define MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT (16)
29
47eebc20 30/* Routines that read assembler source text to build spaghetti in memory.
252b5132
RH
31 Another group of these functions is in the expr.c module. */
32
252b5132 33#include "as.h"
3882b010 34#include "safe-ctype.h"
252b5132
RH
35#include "subsegs.h"
36#include "sb.h"
37#include "macro.h"
38#include "obstack.h"
252b5132 39#include "ecoff.h"
54cfded0 40#include "dw2gencfi.h"
c02a969d 41#include "scfidw2gen.h"
ba646820 42#include "codeview.h"
7bfd842d 43#include "wchar.h"
adb9ac5f 44#include "filenames.h"
c7defc53 45#include "ginsn.h"
252b5132 46
d27aad4e
AC
47#include <limits.h>
48
252b5132 49#ifndef TC_START_LABEL
2e57ce7b 50#define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) (NEXT_CHAR == ':')
252b5132
RH
51#endif
52
8684e216
HPN
53/* Set by the object-format or the target. */
54#ifndef TC_IMPLICIT_LCOMM_ALIGNMENT
d6415f6c 55#define TC_IMPLICIT_LCOMM_ALIGNMENT(SIZE, P2VAR) \
041ff4dd 56 do \
d6415f6c
AM
57 { \
58 if ((SIZE) >= 8) \
59 (P2VAR) = 3; \
60 else if ((SIZE) >= 4) \
61 (P2VAR) = 2; \
62 else if ((SIZE) >= 2) \
63 (P2VAR) = 1; \
64 else \
65 (P2VAR) = 0; \
041ff4dd
NC
66 } \
67 while (0)
8684e216
HPN
68#endif
69
041ff4dd 70char *input_line_pointer; /*->next char of source file to parse. */
5b7c81bd 71bool input_from_string = false;
252b5132
RH
72
73#if BITS_PER_CHAR != 8
74/* The following table is indexed by[(char)] and will break if
75 a char does not have exactly 256 states (hopefully 0:255!)! */
76die horribly;
77#endif
78
79#ifndef LEX_AT
252b5132
RH
80#define LEX_AT 0
81#endif
82
83#ifndef LEX_BR
84/* The RS/6000 assembler uses {,},[,] as parts of symbol names. */
85#define LEX_BR 0
86#endif
87
88#ifndef LEX_PCT
89/* The Delta 68k assembler permits % inside label names. */
90#define LEX_PCT 0
91#endif
92
93#ifndef LEX_QM
94/* The PowerPC Windows NT assemblers permits ? inside label names. */
95#define LEX_QM 0
96#endif
97
58b5739a 98#ifndef LEX_HASH
800eeca4
JW
99/* The IA-64 assembler uses # as a suffix designating a symbol. We include
100 it in the symbol and strip it out in tc_canonicalize_symbol_name. */
58b5739a
RH
101#define LEX_HASH 0
102#endif
103
252b5132 104#ifndef LEX_DOLLAR
252b5132
RH
105#define LEX_DOLLAR 3
106#endif
107
108#ifndef LEX_TILDE
109/* The Delta 68k assembler permits ~ at start of label names. */
110#define LEX_TILDE 0
111#endif
112
041ff4dd 113/* Used by is_... macros. our ctype[]. */
ef99799a 114char lex_type[256] = {
252b5132
RH
115 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* @ABCDEFGHIJKLMNO */
116 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ[\]^_ */
58b5739a 117 0, 0, 0, LEX_HASH, LEX_DOLLAR, LEX_PCT, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* _!"#$%&'()*+,-./ */
252b5132
RH
118 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, LEX_QM, /* 0123456789:;<=>? */
119 LEX_AT, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* @ABCDEFGHIJKLMNO */
120 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, 0, 3, /* PQRSTUVWXYZ[\]^_ */
121 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* `abcdefghijklmno */
041ff4dd 122 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, LEX_TILDE, 0, /* pqrstuvwxyz{|}~. */
252b5132
RH
123 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
124 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
125 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
126 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
127 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
128 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
129 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
130 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
131};
132
041ff4dd 133/* In: a character.
d67ffd56
L
134 Out: 1 if this character ends a line.
135 2 if this character is a line separator. */
ef99799a 136char is_end_of_line[256] = {
252b5132 137#ifdef CR_EOL
b75c0c92 138 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, /* @abcdefghijklmno */
252b5132 139#else
b75c0c92 140 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, /* @abcdefghijklmno */
252b5132 141#endif
b75c0c92
AM
142 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
143 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* _!"#$%&'()*+,-./ */
ac743b2c 144 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0123456789:;<=>? */
b75c0c92
AM
145 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
146 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
147 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
148 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
149 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
150 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
151 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
152 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
153 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
0b545448
AM
154 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
155 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* */
252b5132 157};
252b5132 158
a8a3b3b2 159#ifndef TC_CASE_SENSITIVE
37d8bb27
NC
160char original_case_string[128];
161#endif
162
041ff4dd 163/* Functions private to this file. */
252b5132 164
041ff4dd
NC
165static char *buffer; /* 1st char of each buffer of lines is here. */
166static char *buffer_limit; /*->1 + last char in buffer. */
252b5132 167
041ff4dd
NC
168/* TARGET_BYTES_BIG_ENDIAN is required to be defined to either 0 or 1
169 in the tc-<CPU>.h file. See the "Porting GAS" section of the
170 internals manual. */
252b5132
RH
171int target_big_endian = TARGET_BYTES_BIG_ENDIAN;
172
041ff4dd 173/* Variables for handling include file directory table. */
252b5132 174
041ff4dd 175/* Table of pointers to directories to search for .include's. */
e0471c16 176const char **include_dirs;
041ff4dd
NC
177
178/* How many are in the table. */
adb9ac5f 179size_t include_dir_count;
041ff4dd
NC
180
181/* Length of longest in table. */
adb9ac5f 182size_t include_dir_maxlen;
252b5132
RH
183
184#ifndef WORKING_DOT_WORD
185struct broken_word *broken_words;
186int new_broken_words;
187#endif
188
189/* The current offset into the absolute section. We don't try to
190 build frags in the absolute section, since no data can be stored
191 there. We just keep track of the current offset. */
192addressT abs_section_offset;
193
194/* If this line had an MRI style label, it is stored in this variable.
195 This is used by some of the MRI pseudo-ops. */
196symbolS *line_label;
197
198/* This global variable is used to support MRI common sections. We
199 translate such sections into a common symbol. This variable is
200 non-NULL when we are in an MRI common section. */
201symbolS *mri_common_symbol;
202
203/* In MRI mode, after a dc.b pseudo-op with an odd number of bytes, we
204 need to align to an even byte boundary unless the next pseudo-op is
205 dc.b, ds.b, or dcb.b. This variable is set to 1 if an alignment
206 may be needed. */
207static int mri_pending_align;
208
f049c189
AM
209/* Record the current function so that we can issue an error message for
210 misplaced .func,.endfunc, and also so that .endfunc needs no
211 arguments. */
212static char *current_name;
213static char *current_label;
214
252b5132
RH
215#ifndef NO_LISTING
216#ifdef OBJ_ELF
f049c189
AM
217static int dwarf_file;
218static int dwarf_line;
219
252b5132
RH
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. */
223static int dwarf_file_string;
224#endif
225#endif
226
fa94de6b
RM
227/* If the target defines the md_frag_max_var hook then we know
228 enough to implement the .bundle_align_mode features. */
229#ifdef md_frag_max_var
230# define HANDLE_BUNDLE
231#endif
232
233#ifdef HANDLE_BUNDLE
234/* .bundle_align_mode sets this. Normally it's zero. When nonzero,
235 it's the exponent of the bundle size, and aligned instruction bundle
236 mode is in effect. */
237static unsigned int bundle_align_p2;
238
239/* These are set by .bundle_lock and .bundle_unlock. .bundle_lock sets
240 bundle_lock_frag to frag_now and then starts a new frag with
241 frag_align_code. At the same time, bundle_lock_frain gets frchain_now,
242 so that .bundle_unlock can verify that we didn't change segments.
243 .bundle_unlock resets both to NULL. If we detect a bundling violation,
244 then we reset bundle_lock_frchain to NULL as an indicator that we've
245 already diagnosed the error with as_bad and don't need a cascade of
246 redundant errors, but bundle_lock_frag remains set to indicate that
247 we are expecting to see .bundle_unlock. */
248static fragS *bundle_lock_frag;
249static frchainS *bundle_lock_frchain;
d416e51d
RM
250
251/* This is incremented by .bundle_lock and decremented by .bundle_unlock,
252 to allow nesting. */
253static unsigned int bundle_lock_depth;
fa94de6b
RM
254#endif
255
87c245cc 256static void do_s_func (int end_p, const char *default_prefix);
39e6acbd 257static void s_align (int, int);
caa32fe5 258static void s_altmacro (int);
057f53c1 259static void s_bad_end (int);
05e9452c 260static void s_reloc (int);
39e6acbd 261static int hex_float (int, char *);
39e6acbd
KH
262static segT get_known_segmented_expression (expressionS * expP);
263static void pobegin (void);
b1822093 264static void poend (void);
39a45edc 265static size_t get_non_macro_line_sb (sb *);
39e6acbd 266static void generate_file_debug (void);
7592cfd7 267static char *_find_end_of_line (char *, int, int, int);
252b5132 268\f
252b5132 269void
39e6acbd 270read_begin (void)
252b5132
RH
271{
272 const char *p;
273
274 pobegin ();
275 obj_read_begin_hook ();
276
252b5132
RH
277 obstack_begin (&cond_obstack, chunksize);
278
2e6976a8
DG
279#ifndef tc_line_separator_chars
280#define tc_line_separator_chars line_separator_chars
281#endif
041ff4dd 282 /* Use machine dependent syntax. */
2e6976a8 283 for (p = tc_line_separator_chars; *p; p++)
d67ffd56 284 is_end_of_line[(unsigned char) *p] = 2;
041ff4dd 285 /* Use more. FIXME-SOMEDAY. */
252b5132
RH
286
287 if (flag_mri)
288 lex_type['?'] = 3;
24b7e8b1 289 stabs_begin ();
f049c189
AM
290
291#ifndef WORKING_DOT_WORD
292 broken_words = NULL;
293 new_broken_words = 0;
294#endif
295
296 abs_section_offset = 0;
297
298 line_label = NULL;
299 mri_common_symbol = NULL;
300 mri_pending_align = 0;
301
302 current_name = NULL;
303 current_label = NULL;
304
305#ifndef NO_LISTING
306#ifdef OBJ_ELF
307 dwarf_file = 0;
308 dwarf_line = -1;
309 dwarf_file_string = 0;
310#endif
311#endif
312
313#ifdef HANDLE_BUNDLE
314 bundle_align_p2 = 0;
315 bundle_lock_frag = NULL;
316 bundle_lock_frchain = NULL;
317 bundle_lock_depth = 0;
318#endif
252b5132 319}
b1822093
AM
320
321void
322read_end (void)
323{
24b7e8b1 324 stabs_end ();
b1822093 325 poend ();
af3d7ab7 326 _obstack_free (&cond_obstack, NULL);
6f860418
AM
327 free (current_name);
328 free (current_label);
b1822093 329}
252b5132 330\f
cc1bc22a 331#ifndef TC_ADDRESS_BYTES
cc1bc22a
AM
332#define TC_ADDRESS_BYTES address_bytes
333
334static inline int
335address_bytes (void)
336{
337 /* Choose smallest of 1, 2, 4, 8 bytes that is large enough to
338 contain an address. */
339 int n = (stdoutput->arch_info->bits_per_address - 1) / 8;
340 n |= n >> 1;
341 n |= n >> 2;
342 n += 1;
343 return n;
344}
345#endif
cc1bc22a 346
041ff4dd 347/* Set up pseudo-op tables. */
252b5132 348
d1cffdc3 349static htab_t po_hash;
252b5132 350
ef99799a 351static const pseudo_typeS potable[] = {
252b5132
RH
352 {"abort", s_abort, 0},
353 {"align", s_align_ptwo, 0},
caa32fe5 354 {"altmacro", s_altmacro, 1},
38a57ae7
NC
355 {"ascii", stringer, 8+0},
356 {"asciz", stringer, 8+1},
252b5132
RH
357 {"balign", s_align_bytes, 0},
358 {"balignw", s_align_bytes, -2},
359 {"balignl", s_align_bytes, -4},
041ff4dd 360/* block */
fa94de6b
RM
361#ifdef HANDLE_BUNDLE
362 {"bundle_align_mode", s_bundle_align_mode, 0},
363 {"bundle_lock", s_bundle_lock, 0},
364 {"bundle_unlock", s_bundle_unlock, 0},
365#endif
252b5132
RH
366 {"byte", cons, 1},
367 {"comm", s_comm, 0},
368 {"common", s_mri_common, 0},
369 {"common.s", s_mri_common, 1},
370 {"data", s_data, 0},
371 {"dc", cons, 2},
cc1bc22a 372 {"dc.a", cons, 0},
252b5132
RH
373 {"dc.b", cons, 1},
374 {"dc.d", float_cons, 'd'},
375 {"dc.l", cons, 4},
376 {"dc.s", float_cons, 'f'},
377 {"dc.w", cons, 2},
378 {"dc.x", float_cons, 'x'},
379 {"dcb", s_space, 2},
380 {"dcb.b", s_space, 1},
381 {"dcb.d", s_float_space, 'd'},
382 {"dcb.l", s_space, 4},
383 {"dcb.s", s_float_space, 'f'},
384 {"dcb.w", s_space, 2},
385 {"dcb.x", s_float_space, 'x'},
386 {"ds", s_space, 2},
387 {"ds.b", s_space, 1},
388 {"ds.d", s_space, 8},
389 {"ds.l", s_space, 4},
e74e2b4c 390 {"ds.p", s_space, 'p'},
252b5132
RH
391 {"ds.s", s_space, 4},
392 {"ds.w", s_space, 2},
e74e2b4c 393 {"ds.x", s_space, 'x'},
252b5132
RH
394 {"debug", s_ignore, 0},
395#ifdef S_SET_DESC
396 {"desc", s_desc, 0},
397#endif
041ff4dd 398/* dim */
252b5132 399 {"double", float_cons, 'd'},
041ff4dd
NC
400/* dsect */
401 {"eject", listing_eject, 0}, /* Formfeed listing. */
252b5132
RH
402 {"else", s_else, 0},
403 {"elsec", s_else, 0},
3fd9f047 404 {"elseif", s_elseif, (int) O_ne},
252b5132
RH
405 {"end", s_end, 0},
406 {"endc", s_endif, 0},
407 {"endfunc", s_func, 1},
408 {"endif", s_endif, 0},
057f53c1
JB
409 {"endm", s_bad_end, 0},
410 {"endr", s_bad_end, 1},
041ff4dd 411/* endef */
252b5132
RH
412 {"equ", s_set, 0},
413 {"equiv", s_set, 1},
9497f5ac 414 {"eqv", s_set, -1},
252b5132 415 {"err", s_err, 0},
d190d046 416 {"error", s_errwarn, 1},
252b5132 417 {"exitm", s_mexit, 0},
041ff4dd
NC
418/* extend */
419 {"extern", s_ignore, 0}, /* We treat all undef as ext. */
252b5132 420 {"fail", s_fail, 0},
c39e89c3 421 {"file", s_file, 0},
252b5132
RH
422 {"fill", s_fill, 0},
423 {"float", float_cons, 'f'},
424 {"format", s_ignore, 0},
425 {"func", s_func, 0},
426 {"global", s_globl, 0},
427 {"globl", s_globl, 0},
428 {"hword", cons, 2},
429 {"if", s_if, (int) O_ne},
26aca5f6 430 {"ifb", s_ifb, 1},
252b5132
RH
431 {"ifc", s_ifc, 0},
432 {"ifdef", s_ifdef, 0},
433 {"ifeq", s_if, (int) O_eq},
434 {"ifeqs", s_ifeqs, 0},
435 {"ifge", s_if, (int) O_ge},
436 {"ifgt", s_if, (int) O_gt},
437 {"ifle", s_if, (int) O_le},
438 {"iflt", s_if, (int) O_lt},
26aca5f6 439 {"ifnb", s_ifb, 0},
252b5132
RH
440 {"ifnc", s_ifc, 1},
441 {"ifndef", s_ifdef, 1},
442 {"ifne", s_if, (int) O_ne},
443 {"ifnes", s_ifeqs, 1},
444 {"ifnotdef", s_ifdef, 1},
7e005732 445 {"incbin", s_incbin, 0},
252b5132
RH
446 {"include", s_include, 0},
447 {"int", cons, 4},
448 {"irp", s_irp, 0},
449 {"irep", s_irp, 0},
450 {"irpc", s_irp, 1},
451 {"irepc", s_irp, 1},
452 {"lcomm", s_lcomm, 0},
c2069bb2 453 {"lflags", s_ignore, 0}, /* Listing flags. */
c39e89c3 454 {"linefile", s_linefile, 0},
252b5132 455 {"linkonce", s_linkonce, 0},
041ff4dd 456 {"list", listing_list, 1}, /* Turn listing on. */
252b5132
RH
457 {"llen", listing_psize, 1},
458 {"long", cons, 4},
459 {"lsym", s_lsym, 0},
460 {"macro", s_macro, 0},
461 {"mexit", s_mexit, 0},
462 {"mri", s_mri, 0},
463 {".mri", s_mri, 0}, /* Special case so .mri works in MRI mode. */
464 {"name", s_ignore, 0},
caa32fe5 465 {"noaltmacro", s_altmacro, 0},
252b5132 466 {"noformat", s_ignore, 0},
041ff4dd 467 {"nolist", listing_list, 0}, /* Turn listing off. */
252b5132 468 {"nopage", listing_nopage, 0},
b1766e7c 469 {"nop", s_nop, 0},
8f065d3b 470 {"nops", s_nops, 0},
252b5132
RH
471 {"octa", cons, 16},
472 {"offset", s_struct, 0},
473 {"org", s_org, 0},
474 {"p2align", s_align_ptwo, 0},
475 {"p2alignw", s_align_ptwo, -2},
476 {"p2alignl", s_align_ptwo, -4},
477 {"page", listing_eject, 0},
478 {"plen", listing_psize, 0},
479 {"print", s_print, 0},
041ff4dd 480 {"psize", listing_psize, 0}, /* Set paper size. */
252b5132
RH
481 {"purgem", s_purgem, 0},
482 {"quad", cons, 8},
05e9452c 483 {"reloc", s_reloc, 0},
252b5132
RH
484 {"rep", s_rept, 0},
485 {"rept", s_rept, 0},
486 {"rva", s_rva, 4},
041ff4dd
NC
487 {"sbttl", listing_title, 1}, /* Subtitle of listing. */
488/* scl */
489/* sect */
252b5132
RH
490 {"set", s_set, 0},
491 {"short", cons, 2},
492 {"single", float_cons, 'f'},
041ff4dd 493/* size */
252b5132
RH
494 {"space", s_space, 0},
495 {"skip", s_space, 0},
496 {"sleb128", s_leb128, 1},
497 {"spc", s_ignore, 0},
498 {"stabd", s_stab, 'd'},
499 {"stabn", s_stab, 'n'},
500 {"stabs", s_stab, 's'},
38a57ae7
NC
501 {"string", stringer, 8+1},
502 {"string8", stringer, 8+1},
503 {"string16", stringer, 16+1},
504 {"string32", stringer, 32+1},
505 {"string64", stringer, 64+1},
252b5132 506 {"struct", s_struct, 0},
041ff4dd 507/* tag */
252b5132
RH
508 {"text", s_text, 0},
509
510 /* This is for gcc to use. It's only just been added (2/94), so gcc
511 won't be able to use it for a while -- probably a year or more.
512 But once this has been released, check with gcc maintainers
513 before deleting it or even changing the spelling. */
514 {"this_GCC_requires_the_GNU_assembler", s_ignore, 0},
515 /* If we're folding case -- done for some targets, not necessarily
516 all -- the above string in an input file will be converted to
517 this one. Match it either way... */
518 {"this_gcc_requires_the_gnu_assembler", s_ignore, 0},
519
041ff4dd 520 {"title", listing_title, 0}, /* Listing title. */
252b5132 521 {"ttl", listing_title, 0},
041ff4dd 522/* type */
252b5132 523 {"uleb128", s_leb128, 0},
041ff4dd
NC
524/* use */
525/* val */
252b5132
RH
526 {"xcom", s_comm, 0},
527 {"xdef", s_globl, 0},
528 {"xref", s_ignore, 0},
529 {"xstabs", s_xstab, 's'},
d190d046 530 {"warning", s_errwarn, 0},
06e77878 531 {"weakref", s_weakref, 0},
252b5132
RH
532 {"word", cons, 2},
533 {"zero", s_space, 0},
5fda40b2
MF
534 {"2byte", cons, 2},
535 {"4byte", cons, 4},
536 {"8byte", cons, 8},
041ff4dd 537 {NULL, NULL, 0} /* End sentinel. */
252b5132
RH
538};
539
87c245cc
BE
540static offsetT
541get_absolute_expr (expressionS *exp)
542{
9497f5ac 543 expression_and_evaluate (exp);
9136aa49 544
87c245cc
BE
545 if (exp->X_op != O_constant)
546 {
547 if (exp->X_op != O_absent)
548 as_bad (_("bad or irreducible absolute expression"));
549 exp->X_add_number = 0;
550 }
551 return exp->X_add_number;
552}
553
554offsetT
555get_absolute_expression (void)
556{
557 expressionS exp;
558
559 return get_absolute_expr (&exp);
560}
561
f049c189 562static int pop_override_ok;
252b5132
RH
563static const char *pop_table_name;
564
565void
39e6acbd 566pop_insert (const pseudo_typeS *table)
252b5132 567{
252b5132
RH
568 const pseudo_typeS *pop;
569 for (pop = table; pop->poc_name; pop++)
570 {
d1cffdc3 571 if (str_hash_insert (po_hash, pop->poc_name, pop, 0) != NULL)
fe0e921f 572 {
fe0e921f
AM
573 if (!pop_override_ok)
574 as_fatal (_("error constructing %s pseudo-op table"),
575 pop_table_name);
576 }
252b5132
RH
577 }
578}
579
580#ifndef md_pop_insert
581#define md_pop_insert() pop_insert(md_pseudo_table)
582#endif
583
584#ifndef obj_pop_insert
585#define obj_pop_insert() pop_insert(obj_pseudo_table)
586#endif
587
54cfded0
AM
588#ifndef cfi_pop_insert
589#define cfi_pop_insert() pop_insert(cfi_pseudo_table)
590#endif
591
c02a969d
IB
592#ifndef scfi_pop_insert
593#define scfi_pop_insert() pop_insert(scfi_pseudo_table)
594#endif
595
041ff4dd 596static void
39e6acbd 597pobegin (void)
252b5132 598{
d1cffdc3 599 po_hash = str_htab_create ();
252b5132 600
041ff4dd 601 /* Do the target-specific pseudo ops. */
252b5132 602 pop_table_name = "md";
f049c189 603 pop_override_ok = 0;
252b5132
RH
604 md_pop_insert ();
605
041ff4dd 606 /* Now object specific. Skip any that were in the target table. */
252b5132
RH
607 pop_table_name = "obj";
608 pop_override_ok = 1;
609 obj_pop_insert ();
610
041ff4dd 611 /* Now portable ones. Skip any that we've seen already. */
252b5132
RH
612 pop_table_name = "standard";
613 pop_insert (potable);
d6415f6c 614
d58a1929 615 /* Now CFI ones. */
c02a969d
IB
616#if defined (TARGET_USE_SCFI) && defined (TARGET_USE_GINSN)
617 if (flag_synth_cfi)
618 {
619 pop_table_name = "scfi";
620 scfi_pop_insert ();
621 }
622 else
623#endif
624 {
625 pop_table_name = "cfi";
626 cfi_pop_insert ();
627 }
252b5132 628}
b1822093
AM
629
630static void
631poend (void)
632{
633 htab_delete (po_hash);
634}
252b5132 635\f
e74211b6 636#define HANDLE_CONDITIONAL_ASSEMBLY(num_read) \
252b5132
RH
637 if (ignore_input ()) \
638 { \
e74211b6
JB
639 char *eol = find_end_of_line (input_line_pointer - (num_read), \
640 flag_m68k_mri); \
40a4d956
JB
641 input_line_pointer = (input_line_pointer <= buffer_limit \
642 && eol >= buffer_limit) \
643 ? buffer_limit \
644 : eol + 1; \
252b5132
RH
645 continue; \
646 }
647
5e75c3ab
JB
648/* Helper function of read_a_source_file, which tries to expand a macro. */
649static int
650try_macro (char term, const char *line)
651{
652 sb out;
653 const char *err;
654 macro_entry *macro;
655
656 if (check_macro (line, &out, &err, &macro))
657 {
658 if (err != NULL)
659 as_bad ("%s", err);
660 *input_line_pointer++ = term;
661 input_scrub_include_sb (&out,
657edeab 662 input_line_pointer, expanding_macro);
5e75c3ab
JB
663 sb_kill (&out);
664 buffer_limit =
665 input_scrub_next_buffer (&input_line_pointer);
666#ifdef md_macro_info
667 md_macro_info (macro);
668#endif
669 return 1;
670 }
671 return 0;
672}
673
fa94de6b
RM
674#ifdef HANDLE_BUNDLE
675/* Start a new instruction bundle. Returns the rs_align_code frag that
676 will be used to align the new bundle. */
677static fragS *
678start_bundle (void)
679{
680 fragS *frag = frag_now;
681
682 frag_align_code (0, 0);
683
684 while (frag->fr_type != rs_align_code)
685 frag = frag->fr_next;
686
687 gas_assert (frag != frag_now);
688
689 return frag;
690}
691
692/* Calculate the maximum size after relaxation of the region starting
693 at the given frag and extending through frag_now (which is unfinished). */
694static unsigned int
695pending_bundle_size (fragS *frag)
696{
697 unsigned int offset = frag->fr_fix;
698 unsigned int size = 0;
699
700 gas_assert (frag != frag_now);
701 gas_assert (frag->fr_type == rs_align_code);
702
703 while (frag != frag_now)
704 {
705 /* This should only happen in what will later become an error case. */
706 if (frag == NULL)
707 return 0;
708
709 size += frag->fr_fix;
710 if (frag->fr_type == rs_machine_dependent)
711 size += md_frag_max_var (frag);
712
713 frag = frag->fr_next;
714 }
715
716 gas_assert (frag == frag_now);
717 size += frag_now_fix ();
718 if (frag->fr_type == rs_machine_dependent)
719 size += md_frag_max_var (frag);
720
721 gas_assert (size >= offset);
722
723 return size - offset;
724}
725
726/* Finish off the frag created to ensure bundle alignment. */
727static void
728finish_bundle (fragS *frag, unsigned int size)
729{
730 gas_assert (bundle_align_p2 > 0);
731 gas_assert (frag->fr_type == rs_align_code);
732
733 if (size > 1)
734 {
735 /* If there is more than a single byte, then we need to set up the
736 alignment frag. Otherwise we leave it at its initial state from
737 calling frag_align_code (0, 0), so that it does nothing. */
738 frag->fr_offset = bundle_align_p2;
739 frag->fr_subtype = size - 1;
740 }
741
742 /* We do this every time rather than just in s_bundle_align_mode
743 so that we catch any affected section without needing hooks all
744 over for all paths that do section changes. It's cheap enough. */
9136aa49
DG
745 if (bundle_align_p2 > OCTETS_PER_BYTE_POWER)
746 record_alignment (now_seg, bundle_align_p2 - OCTETS_PER_BYTE_POWER);
fa94de6b
RM
747}
748
749/* Assemble one instruction. This takes care of the bundle features
750 around calling md_assemble. */
751static void
752assemble_one (char *line)
753{
8d3eaee6 754 fragS *insn_start_frag = NULL;
fa94de6b
RM
755
756 if (bundle_lock_frchain != NULL && bundle_lock_frchain != frchain_now)
757 {
758 as_bad (_("cannot change section or subsection inside .bundle_lock"));
759 /* Clearing this serves as a marker that we have already complained. */
760 bundle_lock_frchain = NULL;
761 }
762
763 if (bundle_lock_frchain == NULL && bundle_align_p2 > 0)
764 insn_start_frag = start_bundle ();
765
766 md_assemble (line);
767
768 if (bundle_lock_frchain != NULL)
769 {
770 /* Make sure this hasn't pushed the locked sequence
771 past the bundle size. */
772 unsigned int bundle_size = pending_bundle_size (bundle_lock_frag);
e54e9ac5
AM
773 if (bundle_size > 1U << bundle_align_p2)
774 as_bad (_ (".bundle_lock sequence at %u bytes, "
775 "but .bundle_align_mode limit is %u bytes"),
fa94de6b
RM
776 bundle_size, 1U << bundle_align_p2);
777 }
778 else if (bundle_align_p2 > 0)
779 {
780 unsigned int insn_size = pending_bundle_size (insn_start_frag);
781
e54e9ac5
AM
782 if (insn_size > 1U << bundle_align_p2)
783 as_bad (_("single instruction is %u bytes long, "
784 "but .bundle_align_mode limit is %u bytes"),
785 insn_size, 1U << bundle_align_p2);
fa94de6b
RM
786
787 finish_bundle (insn_start_frag, insn_size);
788 }
789}
790
791#else /* !HANDLE_BUNDLE */
792
793# define assemble_one(line) md_assemble(line)
794
795#endif /* HANDLE_BUNDLE */
796
5b7c81bd 797static bool
9136aa49
DG
798in_bss (void)
799{
fd361982 800 flagword flags = bfd_section_flags (now_seg);
9136aa49
DG
801
802 return (flags & SEC_ALLOC) && !(flags & (SEC_LOAD | SEC_HAS_CONTENTS));
803}
804
805/* Guts of .align directive:
806 N is the power of two to which to align. A value of zero is accepted but
807 ignored: the default alignment of the section will be at least this.
808 FILL may be NULL, or it may point to the bytes of the fill pattern.
809 LEN is the length of whatever FILL points to, if anything. If LEN is zero
810 but FILL is not NULL then LEN is treated as if it were one.
811 MAX is the maximum number of characters to skip when doing the alignment,
812 or 0 if there is no maximum. */
813
f86f5863 814void
9136aa49
DG
815do_align (unsigned int n, char *fill, unsigned int len, unsigned int max)
816{
817 if (now_seg == absolute_section || in_bss ())
818 {
819 if (fill != NULL)
820 while (len-- > 0)
821 if (*fill++ != '\0')
822 {
823 if (now_seg == absolute_section)
824 as_warn (_("ignoring fill value in absolute section"));
825 else
826 as_warn (_("ignoring fill value in section `%s'"),
827 segment_name (now_seg));
828 break;
829 }
830 fill = NULL;
831 len = 0;
832 }
833
834#ifdef md_flush_pending_output
835 md_flush_pending_output ();
836#endif
837
838#ifdef md_do_align
839 md_do_align (n, fill, len, max, just_record_alignment);
840#endif
841
842 /* Only make a frag if we HAVE to... */
843 if ((n > OCTETS_PER_BYTE_POWER) && !need_pass_2)
844 {
845 if (fill == NULL)
846 {
847 if (subseg_text_p (now_seg))
848 frag_align_code (n, max);
849 else
850 frag_align (n, 0, max);
851 }
852 else if (len <= 1)
853 frag_align (n, *fill, max);
854 else
855 frag_align_pattern (n, fill, len, max);
856 }
857
858#ifdef md_do_align
859 just_record_alignment: ATTRIBUTE_UNUSED_LABEL
860#endif
861
862 if (n > OCTETS_PER_BYTE_POWER)
863 record_alignment (now_seg, n - OCTETS_PER_BYTE_POWER);
864}
865
041ff4dd
NC
866/* We read the file, putting things into a web that represents what we
867 have been reading. */
868void
e0471c16 869read_a_source_file (const char *name)
252b5132 870{
d02603dc
NC
871 char nul_char;
872 char next_char;
91d6fa6a 873 char *s; /* String of symbol, '\0' appended. */
d27aad4e 874 long temp;
32e4c1c2 875 const pseudo_typeS *pop;
252b5132 876
4c400d5e
AM
877#ifdef WARN_COMMENTS
878 found_comment = 0;
879#endif
880
252b5132
RH
881 buffer = input_scrub_new_file (name);
882
883 listing_file (name);
884 listing_newline (NULL);
885 register_dependency (name);
886
887 /* Generate debugging information before we've read anything in to denote
888 this file as the "main" source file and not a subordinate one
889 (e.g. N_SO vs N_SOL in stabs). */
890 generate_file_debug ();
891
892 while ((buffer_limit = input_scrub_next_buffer (&input_line_pointer)) != 0)
041ff4dd 893 { /* We have another line to parse. */
5e75c3ab
JB
894#ifndef NO_LISTING
895 /* In order to avoid listing macro expansion lines with labels
896 multiple times, keep track of which line was last issued. */
f049c189 897 char *last_eol = NULL;
5e75c3ab 898
5e75c3ab 899#endif
252b5132
RH
900 while (input_line_pointer < buffer_limit)
901 {
5b7c81bd 902 bool was_new_line;
041ff4dd 903 /* We have more of this buffer to parse. */
252b5132 904
041ff4dd
NC
905 /* We now have input_line_pointer->1st char of next line.
906 If input_line_pointer [-1] == '\n' then we just
907 scanned another line: so bump line counters. */
f19df8f7
AM
908 was_new_line = is_end_of_line[(unsigned char) input_line_pointer[-1]];
909 if (was_new_line)
252b5132 910 {
4a826962 911 symbol_set_value_now (&dot_symbol);
252b5132
RH
912#ifdef md_start_line_hook
913 md_start_line_hook ();
914#endif
252b5132
RH
915 if (input_line_pointer[-1] == '\n')
916 bump_line_counters ();
f19df8f7 917 }
252b5132 918
f19df8f7
AM
919#ifndef NO_LISTING
920 /* If listing is on, and we are expanding a macro, then give
921 the listing code the contents of the expanded line. */
922 if (listing)
923 {
924 if ((listing & LISTING_MACEXP) && macro_nest > 0)
925 {
926 /* Find the end of the current expanded macro line. */
927 s = find_end_of_line (input_line_pointer, flag_m68k_mri);
928
c62e507e
JB
929 if (s != last_eol
930 && !startswith (input_line_pointer,
931 !flag_m68k_mri ? " .linefile "
932 : " linefile "))
f19df8f7
AM
933 {
934 char *copy;
53f2b36a 935 size_t len;
f19df8f7
AM
936
937 last_eol = s;
938 /* Copy it for safe keeping. Also give an indication of
939 how much macro nesting is involved at this point. */
940 len = s - input_line_pointer;
8860a416 941 copy = XNEWVEC (char, len + macro_nest + 2);
f19df8f7
AM
942 memset (copy, '>', macro_nest);
943 copy[macro_nest] = ' ';
944 memcpy (copy + macro_nest + 1, input_line_pointer, len);
945 copy[macro_nest + 1 + len] = '\0';
946
947 /* Install the line with the listing facility. */
948 listing_newline (copy);
949 }
950 }
951 else
952 listing_newline (NULL);
953 }
954#endif
955 if (was_new_line)
956 {
252b5132
RH
957 line_label = NULL;
958
abd63a32 959 if (LABELS_WITHOUT_COLONS || flag_m68k_mri)
252b5132 960 {
d02603dc 961 next_char = * input_line_pointer;
252b5132
RH
962 /* Text at the start of a line must be a label, we
963 run down and stick a colon in. */
d02603dc 964 if (is_name_beginner (next_char) || next_char == '"')
252b5132 965 {
d02603dc 966 char *line_start;
252b5132
RH
967 int mri_line_macro;
968
e74211b6 969 HANDLE_CONDITIONAL_ASSEMBLY (0);
252b5132 970
d02603dc
NC
971 nul_char = get_symbol_name (& line_start);
972 next_char = (nul_char == '"' ? input_line_pointer[1] : nul_char);
252b5132
RH
973
974 /* In MRI mode, the EQU and MACRO pseudoops must
975 be handled specially. */
976 mri_line_macro = 0;
977 if (flag_m68k_mri)
978 {
979 char *rest = input_line_pointer + 1;
980
981 if (*rest == ':')
982 ++rest;
983 if (*rest == ' ' || *rest == '\t')
984 ++rest;
985 if ((strncasecmp (rest, "EQU", 3) == 0
986 || strncasecmp (rest, "SET", 3) == 0)
987 && (rest[3] == ' ' || rest[3] == '\t'))
988 {
989 input_line_pointer = rest + 3;
990 equals (line_start,
991 strncasecmp (rest, "SET", 3) == 0);
992 continue;
993 }
994 if (strncasecmp (rest, "MACRO", 5) == 0
995 && (rest[5] == ' '
996 || rest[5] == '\t'
997 || is_end_of_line[(unsigned char) rest[5]]))
998 mri_line_macro = 1;
999 }
1000
1001 /* In MRI mode, we need to handle the MACRO
d6415f6c
AM
1002 pseudo-op specially: we don't want to put the
1003 symbol in the symbol table. */
041ff4dd 1004 if (!mri_line_macro
a25c045a 1005#ifdef TC_START_LABEL_WITHOUT_COLON
2e57ce7b 1006 && TC_START_LABEL_WITHOUT_COLON (nul_char, next_char)
a25c045a 1007#endif
ef99799a 1008 )
252b5132
RH
1009 line_label = colon (line_start);
1010 else
1011 line_label = symbol_create (line_start,
1012 absolute_section,
e01e1cee 1013 &zero_address_frag, 0);
252b5132 1014
d02603dc
NC
1015 next_char = restore_line_pointer (nul_char);
1016 if (next_char == ':')
252b5132
RH
1017 input_line_pointer++;
1018 }
1019 }
1020 }
1021
47eebc20 1022 /* We are at the beginning of a line, or similar place.
041ff4dd
NC
1023 We expect a well-formed assembler statement.
1024 A "symbol-name:" is a statement.
f0e652b4 1025
041ff4dd
NC
1026 Depending on what compiler is used, the order of these tests
1027 may vary to catch most common case 1st.
d2bdaea8
AM
1028 Each test is independent of all other tests at the (top)
1029 level. */
1030 do
d02603dc
NC
1031 nul_char = next_char = *input_line_pointer++;
1032 while (next_char == '\t' || next_char == ' ' || next_char == '\f');
252b5132 1033
041ff4dd
NC
1034 /* C is the 1st significant character.
1035 Input_line_pointer points after that character. */
d02603dc 1036 if (is_name_beginner (next_char) || next_char == '"')
252b5132 1037 {
d02603dc
NC
1038 char *rest;
1039
041ff4dd 1040 /* Want user-defined label or pseudo/opcode. */
e74211b6 1041 HANDLE_CONDITIONAL_ASSEMBLY (1);
252b5132 1042
d02603dc
NC
1043 --input_line_pointer;
1044 nul_char = get_symbol_name (& s); /* name's delimiter. */
1045 next_char = (nul_char == '"' ? input_line_pointer[1] : nul_char);
1046 rest = input_line_pointer + (nul_char == '"' ? 2 : 1);
041ff4dd 1047
d02603dc
NC
1048 /* NEXT_CHAR is character after symbol.
1049 The end of symbol in the input line is now '\0'.
d6415f6c
AM
1050 S points to the beginning of the symbol.
1051 [In case of pseudo-op, s->'.'.]
d02603dc 1052 Input_line_pointer->'\0' where NUL_CHAR was. */
2e57ce7b 1053 if (TC_START_LABEL (s, nul_char, next_char))
252b5132
RH
1054 {
1055 if (flag_m68k_mri)
1056 {
252b5132 1057 /* In MRI mode, \tsym: set 0 is permitted. */
252b5132
RH
1058 if (*rest == ':')
1059 ++rest;
f0e652b4 1060
252b5132
RH
1061 if (*rest == ' ' || *rest == '\t')
1062 ++rest;
f0e652b4 1063
252b5132
RH
1064 if ((strncasecmp (rest, "EQU", 3) == 0
1065 || strncasecmp (rest, "SET", 3) == 0)
1066 && (rest[3] == ' ' || rest[3] == '\t'))
1067 {
1068 input_line_pointer = rest + 3;
1069 equals (s, 1);
1070 continue;
1071 }
1072 }
1073
041ff4dd 1074 line_label = colon (s); /* User-defined label. */
d02603dc
NC
1075 restore_line_pointer (nul_char);
1076 ++ input_line_pointer;
a645d1eb
L
1077#ifdef tc_check_label
1078 tc_check_label (line_label);
1079#endif
041ff4dd 1080 /* Input_line_pointer->after ':'. */
252b5132 1081 SKIP_WHITESPACE ();
252b5132 1082 }
d02603dc
NC
1083 else if ((next_char == '=' && *rest == '=')
1084 || ((next_char == ' ' || next_char == '\t')
1085 && rest[0] == '='
1086 && rest[1] == '='))
9497f5ac
NC
1087 {
1088 equals (s, -1);
1089 demand_empty_rest_of_line ();
1090 }
d02603dc
NC
1091 else if ((next_char == '='
1092 || ((next_char == ' ' || next_char == '\t')
1093 && *rest == '='))
ee3c9814 1094#ifdef TC_EQUAL_IN_INSN
d02603dc 1095 && !TC_EQUAL_IN_INSN (next_char, s)
ee3c9814 1096#endif
fa94de6b 1097 )
252b5132
RH
1098 {
1099 equals (s, 1);
1100 demand_empty_rest_of_line ();
1101 }
1102 else
041ff4dd
NC
1103 {
1104 /* Expect pseudo-op or machine instruction. */
252b5132
RH
1105 pop = NULL;
1106
a8a3b3b2 1107#ifndef TC_CASE_SENSITIVE
252b5132
RH
1108 {
1109 char *s2 = s;
37d8bb27 1110
42135cad
AM
1111 strncpy (original_case_string, s2,
1112 sizeof (original_case_string) - 1);
37d8bb27 1113 original_case_string[sizeof (original_case_string) - 1] = 0;
ef99799a 1114
252b5132
RH
1115 while (*s2)
1116 {
3882b010 1117 *s2 = TOLOWER (*s2);
252b5132
RH
1118 s2++;
1119 }
1120 }
1121#endif
abd63a32 1122 if (NO_PSEUDO_DOT || flag_m68k_mri)
252b5132 1123 {
7be1c489
AM
1124 /* The MRI assembler uses pseudo-ops without
1125 a period. */
d1cffdc3 1126 pop = str_hash_find (po_hash, s);
252b5132
RH
1127 if (pop != NULL && pop->poc_handler == NULL)
1128 pop = NULL;
1129 }
1130
1131 if (pop != NULL
041ff4dd 1132 || (!flag_m68k_mri && *s == '.'))
252b5132 1133 {
041ff4dd 1134 /* PSEUDO - OP.
f0e652b4 1135
d02603dc 1136 WARNING: next_char may be end-of-line.
d6415f6c
AM
1137 We lookup the pseudo-op table with s+1 because we
1138 already know that the pseudo-op begins with a '.'. */
252b5132
RH
1139
1140 if (pop == NULL)
d1cffdc3 1141 pop = str_hash_find (po_hash, s + 1);
e4475e39
NS
1142 if (pop && !pop->poc_handler)
1143 pop = NULL;
252b5132
RH
1144
1145 /* In MRI mode, we may need to insert an
d6415f6c
AM
1146 automatic alignment directive. What a hack
1147 this is. */
252b5132
RH
1148 if (mri_pending_align
1149 && (pop == NULL
041ff4dd
NC
1150 || !((pop->poc_handler == cons
1151 && pop->poc_val == 1)
1152 || (pop->poc_handler == s_space
1153 && pop->poc_val == 1)
252b5132 1154#ifdef tc_conditional_pseudoop
041ff4dd 1155 || tc_conditional_pseudoop (pop)
252b5132 1156#endif
041ff4dd
NC
1157 || pop->poc_handler == s_if
1158 || pop->poc_handler == s_ifdef
1159 || pop->poc_handler == s_ifc
1160 || pop->poc_handler == s_ifeqs
1161 || pop->poc_handler == s_else
1162 || pop->poc_handler == s_endif
1163 || pop->poc_handler == s_globl
1164 || pop->poc_handler == s_ignore)))
252b5132
RH
1165 {
1166 do_align (1, (char *) NULL, 0, 0);
1167 mri_pending_align = 0;
f0e652b4 1168
252b5132
RH
1169 if (line_label != NULL)
1170 {
2b47531b 1171 symbol_set_frag (line_label, frag_now);
252b5132
RH
1172 S_SET_VALUE (line_label, frag_now_fix ());
1173 }
1174 }
1175
041ff4dd 1176 /* Print the error msg now, while we still can. */
252b5132
RH
1177 if (pop == NULL)
1178 {
5e75c3ab
JB
1179 char *end = input_line_pointer;
1180
d02603dc 1181 (void) restore_line_pointer (nul_char);
252b5132 1182 s_ignore (0);
d02603dc 1183 nul_char = next_char = *--input_line_pointer;
5e75c3ab 1184 *input_line_pointer = '\0';
d02603dc 1185 if (! macro_defined || ! try_macro (next_char, s))
5e75c3ab
JB
1186 {
1187 *end = '\0';
1188 as_bad (_("unknown pseudo-op: `%s'"), s);
d02603dc 1189 *input_line_pointer++ = nul_char;
5e75c3ab 1190 }
252b5132
RH
1191 continue;
1192 }
1193
041ff4dd 1194 /* Put it back for error messages etc. */
d02603dc 1195 next_char = restore_line_pointer (nul_char);
252b5132
RH
1196 /* The following skip of whitespace is compulsory.
1197 A well shaped space is sometimes all that separates
041ff4dd 1198 keyword from operands. */
d02603dc 1199 if (next_char == ' ' || next_char == '\t')
252b5132 1200 input_line_pointer++;
041ff4dd
NC
1201
1202 /* Input_line is restored.
d6415f6c
AM
1203 Input_line_pointer->1st non-blank char
1204 after pseudo-operation. */
252b5132
RH
1205 (*pop->poc_handler) (pop->poc_val);
1206
1207 /* If that was .end, just get out now. */
1208 if (pop->poc_handler == s_end)
1209 goto quit;
1210 }
1211 else
1212 {
d02603dc
NC
1213 /* WARNING: next_char may be end-of-line. */
1214 /* Also: input_line_pointer->`\0` where nul_char was. */
1215 (void) restore_line_pointer (nul_char);
7592cfd7 1216 input_line_pointer = _find_end_of_line (input_line_pointer, flag_m68k_mri, 1, 0);
d02603dc 1217 next_char = nul_char = *input_line_pointer;
252b5132
RH
1218 *input_line_pointer = '\0';
1219
1220 generate_lineno_debug ();
1221
d02603dc 1222 if (macro_defined && try_macro (next_char, s))
5e75c3ab 1223 continue;
252b5132
RH
1224
1225 if (mri_pending_align)
1226 {
1227 do_align (1, (char *) NULL, 0, 0);
1228 mri_pending_align = 0;
1229 if (line_label != NULL)
1230 {
2b47531b 1231 symbol_set_frag (line_label, frag_now);
252b5132
RH
1232 S_SET_VALUE (line_label, frag_now_fix ());
1233 }
1234 }
1235
fa94de6b 1236 assemble_one (s); /* Assemble 1 instruction. */
252b5132 1237
3be64886
NC
1238 /* PR 19630: The backend may have set ilp to NULL
1239 if it encountered a catastrophic failure. */
1240 if (input_line_pointer == NULL)
1241 as_fatal (_("unable to continue with assembly."));
1242
d02603dc 1243 *input_line_pointer++ = nul_char;
252b5132
RH
1244
1245 /* We resume loop AFTER the end-of-line from
041ff4dd
NC
1246 this instruction. */
1247 }
1248 }
252b5132 1249 continue;
041ff4dd 1250 }
252b5132
RH
1251
1252 /* Empty statement? */
d02603dc 1253 if (is_end_of_line[(unsigned char) next_char])
252b5132
RH
1254 continue;
1255
d02603dc 1256 if ((LOCAL_LABELS_DOLLAR || LOCAL_LABELS_FB) && ISDIGIT (next_char))
252b5132 1257 {
041ff4dd 1258 /* local label ("4:") */
252b5132
RH
1259 char *backup = input_line_pointer;
1260
e74211b6 1261 HANDLE_CONDITIONAL_ASSEMBLY (1);
252b5132 1262
d02603dc
NC
1263 temp = next_char - '0';
1264
041ff4dd 1265 /* Read the whole number. */
3882b010 1266 while (ISDIGIT (*input_line_pointer))
252b5132 1267 {
d27aad4e 1268 const long digit = *input_line_pointer - '0';
226749d5
JB
1269
1270 /* Don't accept labels which look like octal numbers. */
1271 if (temp == 0)
1272 break;
19f7966e 1273 if (temp > (INT_MAX - digit) / 10)
d27aad4e
AC
1274 {
1275 as_bad (_("local label too large near %s"), backup);
1276 temp = -1;
1277 break;
1278 }
1279 temp = temp * 10 + digit;
252b5132 1280 ++input_line_pointer;
041ff4dd 1281 }
252b5132 1282
d27aad4e
AC
1283 /* Overflow: stop processing the label. */
1284 if (temp == -1)
7bb178ec
L
1285 {
1286 ignore_rest_of_line ();
1287 continue;
1288 }
d27aad4e 1289
252b5132
RH
1290 if (LOCAL_LABELS_DOLLAR
1291 && *input_line_pointer == '$'
1292 && *(input_line_pointer + 1) == ':')
1293 {
1294 input_line_pointer += 2;
1295
1296 if (dollar_label_defined (temp))
1297 {
d27aad4e 1298 as_fatal (_("label \"%ld$\" redefined"), temp);
252b5132
RH
1299 }
1300
1301 define_dollar_label (temp);
1302 colon (dollar_label_name (temp, 0));
1303 continue;
1304 }
1305
1306 if (LOCAL_LABELS_FB
1307 && *input_line_pointer++ == ':')
1308 {
1309 fb_label_instance_inc (temp);
1310 colon (fb_label_name (temp, 0));
1311 continue;
1312 }
1313
1314 input_line_pointer = backup;
d02603dc 1315 }
252b5132 1316
d02603dc 1317 if (next_char && strchr (line_comment_chars, next_char))
041ff4dd 1318 { /* Its a comment. Better say APP or NO_APP. */
64e55042 1319 sb sbuf;
252b5132 1320 char *ends;
53f2b36a 1321 size_t len;
252b5132 1322
252b5132 1323 s = input_line_pointer;
d34049e8 1324 if (!startswith (s, "APP\n"))
601e61cd
NC
1325 {
1326 /* We ignore it. */
1327 ignore_rest_of_line ();
1328 continue;
1329 }
1330 bump_line_counters ();
252b5132
RH
1331 s += 4;
1332
1333 ends = strstr (s, "#NO_APP\n");
53f2b36a 1334 len = ends ? ends - s : buffer_limit - s;
252b5132 1335
53f2b36a
AM
1336 sb_build (&sbuf, len + 100);
1337 sb_add_buffer (&sbuf, s, len);
252b5132
RH
1338 if (!ends)
1339 {
252b5132
RH
1340 /* The end of the #APP wasn't in this buffer. We
1341 keep reading in buffers until we find the #NO_APP
1342 that goes with this #APP There is one. The specs
47eebc20 1343 guarantee it... */
252b5132
RH
1344 do
1345 {
53f2b36a
AM
1346 buffer_limit = input_scrub_next_buffer (&buffer);
1347 if (!buffer_limit)
252b5132 1348 break;
252b5132 1349 ends = strstr (buffer, "#NO_APP\n");
53f2b36a
AM
1350 len = ends ? ends - buffer : buffer_limit - buffer;
1351 sb_add_buffer (&sbuf, buffer, len);
252b5132
RH
1352 }
1353 while (!ends);
252b5132
RH
1354 }
1355
53f2b36a 1356 input_line_pointer = ends ? ends + 8 : NULL;
657edeab 1357 input_scrub_include_sb (&sbuf, input_line_pointer, expanding_none);
64e55042
HPN
1358 sb_kill (&sbuf);
1359 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
252b5132
RH
1360 continue;
1361 }
1362
e74211b6 1363 HANDLE_CONDITIONAL_ASSEMBLY (1);
252b5132
RH
1364
1365#ifdef tc_unrecognized_line
d02603dc 1366 if (tc_unrecognized_line (next_char))
252b5132
RH
1367 continue;
1368#endif
0e389e77 1369 input_line_pointer--;
601e61cd 1370 /* Report unknown char as error. */
c95b35a9 1371 demand_empty_rest_of_line ();
041ff4dd 1372 }
041ff4dd 1373 }
252b5132
RH
1374
1375 quit:
04648e65 1376 symbol_set_value_now (&dot_symbol);
252b5132 1377
fa94de6b
RM
1378#ifdef HANDLE_BUNDLE
1379 if (bundle_lock_frag != NULL)
1380 {
1381 as_bad_where (bundle_lock_frag->fr_file, bundle_lock_frag->fr_line,
1382 _(".bundle_lock with no matching .bundle_unlock"));
1383 bundle_lock_frag = NULL;
1384 bundle_lock_frchain = NULL;
d416e51d 1385 bundle_lock_depth = 0;
fa94de6b
RM
1386 }
1387#endif
1388
c7defc53
IB
1389 if (flag_synth_cfi)
1390 ginsn_data_end (symbol_temp_new_now ());
1391
252b5132 1392#ifdef md_cleanup
041ff4dd 1393 md_cleanup ();
252b5132 1394#endif
041ff4dd
NC
1395 /* Close the input file. */
1396 input_scrub_close ();
4c400d5e
AM
1397#ifdef WARN_COMMENTS
1398 {
1399 if (warn_comment && found_comment)
1400 as_warn_where (found_comment_file, found_comment,
1401 "first comment found here");
1402 }
1403#endif
252b5132
RH
1404}
1405
e5604d79 1406/* Convert O_constant expression EXP into the equivalent O_big representation.
956a6ba3 1407 Take the sign of the number from SIGN rather than X_add_number. */
e5604d79
RS
1408
1409static void
956a6ba3 1410convert_to_bignum (expressionS *exp, int sign)
e5604d79
RS
1411{
1412 valueT value;
1413 unsigned int i;
1414
1415 value = exp->X_add_number;
1416 for (i = 0; i < sizeof (exp->X_add_number) / CHARS_PER_LITTLENUM; i++)
1417 {
1418 generic_bignum[i] = value & LITTLENUM_MASK;
1419 value >>= LITTLENUM_NUMBER_OF_BITS;
1420 }
1421 /* Add a sequence of sign bits if the top bit of X_add_number is not
1422 the sign of the original value. */
956a6ba3
JB
1423 if ((exp->X_add_number < 0) == !sign)
1424 generic_bignum[i++] = sign ? LITTLENUM_MASK : 0;
e5604d79
RS
1425 exp->X_op = O_big;
1426 exp->X_add_number = i;
1427}
1428
252b5132
RH
1429/* For most MRI pseudo-ops, the line actually ends at the first
1430 nonquoted space. This function looks for that point, stuffs a null
1431 in, and sets *STOPCP to the character that used to be there, and
1432 returns the location.
1433
1434 Until I hear otherwise, I am going to assume that this is only true
1435 for the m68k MRI assembler. */
1436
1437char *
39e6acbd 1438mri_comment_field (char *stopcp)
252b5132 1439{
252b5132 1440 char *s;
041ff4dd 1441#ifdef TC_M68K
252b5132
RH
1442 int inquote = 0;
1443
1444 know (flag_m68k_mri);
1445
1446 for (s = input_line_pointer;
041ff4dd 1447 ((!is_end_of_line[(unsigned char) *s] && *s != ' ' && *s != '\t')
252b5132
RH
1448 || inquote);
1449 s++)
1450 {
1451 if (*s == '\'')
041ff4dd 1452 inquote = !inquote;
252b5132 1453 }
252b5132 1454#else
041ff4dd
NC
1455 for (s = input_line_pointer;
1456 !is_end_of_line[(unsigned char) *s];
1457 s++)
252b5132 1458 ;
041ff4dd 1459#endif
252b5132
RH
1460 *stopcp = *s;
1461 *s = '\0';
f0e652b4 1462
252b5132 1463 return s;
252b5132
RH
1464}
1465
1466/* Skip to the end of an MRI comment field. */
1467
1468void
39e6acbd 1469mri_comment_end (char *stop, int stopc)
252b5132
RH
1470{
1471 know (flag_mri);
1472
1473 input_line_pointer = stop;
1474 *stop = stopc;
041ff4dd 1475 while (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132
RH
1476 ++input_line_pointer;
1477}
1478
041ff4dd 1479void
39e6acbd 1480s_abort (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
1481{
1482 as_fatal (_(".abort detected. Abandoning ship."));
1483}
1484
252b5132
RH
1485/* Handle the .align pseudo-op. A positive ARG is a default alignment
1486 (in bytes). A negative ARG is the negative of the length of the
1487 fill pattern. BYTES_P is non-zero if the alignment value should be
1488 interpreted as the byte boundary, rather than the power of 2. */
11ec4ba9
DS
1489#ifndef TC_ALIGN_LIMIT
1490#define TC_ALIGN_LIMIT (stdoutput->arch_info->bits_per_address - 1)
1491#endif
9ebd302d 1492
252b5132 1493static void
9136aa49 1494s_align (signed int arg, int bytes_p)
252b5132 1495{
11ec4ba9 1496 unsigned int align_limit = TC_ALIGN_LIMIT;
90320e40 1497 addressT align;
252b5132 1498 char *stop = NULL;
fb25138b 1499 char stopc = 0;
252b5132 1500 offsetT fill = 0;
9136aa49 1501 unsigned int max;
252b5132
RH
1502 int fill_p;
1503
1504 if (flag_mri)
1505 stop = mri_comment_field (&stopc);
1506
1507 if (is_end_of_line[(unsigned char) *input_line_pointer])
1508 {
1509 if (arg < 0)
1510 align = 0;
1511 else
041ff4dd 1512 align = arg; /* Default value from pseudo-op table. */
252b5132
RH
1513 }
1514 else
1515 {
1516 align = get_absolute_expression ();
1517 SKIP_WHITESPACE ();
db2ed2e0
AM
1518
1519#ifdef TC_ALIGN_ZERO_IS_DEFAULT
1520 if (arg > 0 && align == 0)
1521 align = arg;
1522#endif
252b5132
RH
1523 }
1524
1525 if (bytes_p)
1526 {
1527 /* Convert to a power of 2. */
1528 if (align != 0)
1529 {
1530 unsigned int i;
1531
1532 for (i = 0; (align & 1) == 0; align >>= 1, ++i)
1533 ;
1534 if (align != 1)
0e389e77 1535 as_bad (_("alignment not a power of 2"));
f0e652b4 1536
252b5132
RH
1537 align = i;
1538 }
1539 }
1540
b617dc20 1541 if (align > align_limit)
252b5132 1542 {
b617dc20 1543 align = align_limit;
90320e40 1544 as_warn (_("alignment too large: %u assumed"), align_limit);
252b5132
RH
1545 }
1546
1547 if (*input_line_pointer != ',')
1548 {
1549 fill_p = 0;
1550 max = 0;
1551 }
1552 else
1553 {
1554 ++input_line_pointer;
1555 if (*input_line_pointer == ',')
1556 fill_p = 0;
1557 else
1558 {
1559 fill = get_absolute_expression ();
1560 SKIP_WHITESPACE ();
1561 fill_p = 1;
1562 }
1563
1564 if (*input_line_pointer != ',')
1565 max = 0;
1566 else
1567 {
1568 ++input_line_pointer;
1569 max = get_absolute_expression ();
1570 }
1571 }
1572
041ff4dd 1573 if (!fill_p)
252b5132
RH
1574 {
1575 if (arg < 0)
1576 as_warn (_("expected fill pattern missing"));
1577 do_align (align, (char *) NULL, 0, max);
1578 }
1579 else
1580 {
9136aa49 1581 unsigned int fill_len;
252b5132
RH
1582
1583 if (arg >= 0)
1584 fill_len = 1;
1585 else
041ff4dd 1586 fill_len = -arg;
9136aa49 1587
252b5132
RH
1588 if (fill_len <= 1)
1589 {
9136aa49 1590 char fill_char = 0;
252b5132
RH
1591
1592 fill_char = fill;
1593 do_align (align, &fill_char, fill_len, max);
1594 }
1595 else
1596 {
1597 char ab[16];
1598
1599 if ((size_t) fill_len > sizeof ab)
9136aa49
DG
1600 {
1601 as_warn (_("fill pattern too long, truncating to %u"),
1602 (unsigned) sizeof ab);
1603 fill_len = sizeof ab;
1604 }
1605
252b5132
RH
1606 md_number_to_chars (ab, fill, fill_len);
1607 do_align (align, ab, fill_len, max);
1608 }
1609 }
1610
1611 demand_empty_rest_of_line ();
1612
1613 if (flag_mri)
1614 mri_comment_end (stop, stopc);
1615}
1616
1617/* Handle the .align pseudo-op on machines where ".align 4" means
1618 align to a 4 byte boundary. */
1619
041ff4dd 1620void
39e6acbd 1621s_align_bytes (int arg)
252b5132
RH
1622{
1623 s_align (arg, 1);
1624}
1625
1626/* Handle the .align pseudo-op on machines where ".align 4" means align
1627 to a 2**4 boundary. */
1628
041ff4dd 1629void
39e6acbd 1630s_align_ptwo (int arg)
252b5132
RH
1631{
1632 s_align (arg, 0);
1633}
1634
caa32fe5
NC
1635/* Switch in and out of alternate macro mode. */
1636
b38ead21 1637static void
caa32fe5
NC
1638s_altmacro (int on)
1639{
1640 demand_empty_rest_of_line ();
1250cd63 1641 flag_macro_alternate = on;
caa32fe5
NC
1642}
1643
7bfd842d
NC
1644/* Read a symbol name from input_line_pointer.
1645
1646 Stores the symbol name in a buffer and returns a pointer to this buffer.
1647 The buffer is xalloc'ed. It is the caller's responsibility to free
1648 this buffer.
1649
1650 The name is not left in the i_l_p buffer as it may need processing
1651 to handle escape characters.
1652
1653 Advances i_l_p to the next non-whitespace character.
1654
1655 If a symbol name could not be read, the routine issues an error
1656 messages, skips to the end of the line and returns NULL. */
1657
69602580 1658char *
7bfd842d
NC
1659read_symbol_name (void)
1660{
1661 char * name;
1662 char * start;
1663 char c;
1664
1665 c = *input_line_pointer++;
1666
1667 if (c == '"')
1668 {
1669#define SYM_NAME_CHUNK_LEN 128
1670 ptrdiff_t len = SYM_NAME_CHUNK_LEN;
1671 char * name_end;
1672 unsigned int C;
1673
8860a416 1674 start = name = XNEWVEC (char, len + 1);
7bfd842d
NC
1675
1676 name_end = name + SYM_NAME_CHUNK_LEN;
1677
1678 while (is_a_char (C = next_char_of_string ()))
1679 {
1680 if (name >= name_end)
1681 {
1682 ptrdiff_t sofar;
1683
1684 sofar = name - start;
1685 len += SYM_NAME_CHUNK_LEN;
8860a416 1686 start = XRESIZEVEC (char, start, len + 1);
7bfd842d
NC
1687 name_end = start + len;
1688 name = start + sofar;
1689 }
34bca508 1690
7bfd842d
NC
1691 *name++ = (char) C;
1692 }
1693 *name = 0;
1694
1695 /* Since quoted symbol names can contain non-ASCII characters,
1696 check the string and warn if it cannot be recognised by the
1697 current character set. */
5858ac62
NC
1698 /* PR 29447: mbstowcs ignores the third (length) parameter when
1699 the first (destination) parameter is NULL. For clarity sake
1700 therefore we pass 0 rather than 'len' as the third parameter. */
1701 if (mbstowcs (NULL, name, 0) == (size_t) -1)
7bfd842d
NC
1702 as_warn (_("symbol name not recognised in the current locale"));
1703 }
2469b3c5 1704 else if (is_name_beginner (c) || (input_from_string && c == FAKE_LABEL_CHAR))
7bfd842d
NC
1705 {
1706 ptrdiff_t len;
1707
1708 name = input_line_pointer - 1;
1709
2469b3c5 1710 /* We accept FAKE_LABEL_CHAR in a name in case this is
7bfd842d
NC
1711 being called with a constructed string. */
1712 while (is_part_of_name (c = *input_line_pointer++)
2469b3c5 1713 || (input_from_string && c == FAKE_LABEL_CHAR))
7bfd842d
NC
1714 ;
1715
1716 len = (input_line_pointer - name) - 1;
8860a416 1717 start = XNEWVEC (char, len + 1);
7bfd842d
NC
1718
1719 memcpy (start, name, len);
1720 start[len] = 0;
1721
1722 /* Skip a name ender char if one is present. */
1723 if (! is_name_ender (c))
1724 --input_line_pointer;
1725 }
1726 else
1727 name = start = NULL;
1728
1729 if (name == start)
1730 {
1731 as_bad (_("expected symbol name"));
1732 ignore_rest_of_line ();
9f6e5897 1733 free (start);
7bfd842d
NC
1734 return NULL;
1735 }
34bca508 1736
7bfd842d
NC
1737 SKIP_WHITESPACE ();
1738
1739 return start;
1740}
1741
1742
e13bab5a
AM
1743symbolS *
1744s_comm_internal (int param,
1745 symbolS *(*comm_parse_extra) (int, symbolS *, addressT))
252b5132 1746{
e13bab5a 1747 char *name;
e13bab5a
AM
1748 offsetT temp, size;
1749 symbolS *symbolP = NULL;
252b5132 1750 char *stop = NULL;
fb25138b 1751 char stopc = 0;
e13bab5a 1752 expressionS exp;
252b5132
RH
1753
1754 if (flag_mri)
1755 stop = mri_comment_field (&stopc);
1756
7bfd842d
NC
1757 if ((name = read_symbol_name ()) == NULL)
1758 goto out;
f0e652b4 1759
e13bab5a
AM
1760 /* Accept an optional comma after the name. The comma used to be
1761 required, but Irix 5 cc does not generate it for .lcomm. */
1762 if (*input_line_pointer == ',')
1763 input_line_pointer++;
1764
e13bab5a
AM
1765 temp = get_absolute_expr (&exp);
1766 size = temp;
65879393 1767 size &= ((addressT) 2 << (stdoutput->arch_info->bits_per_address - 1)) - 1;
e13bab5a 1768 if (exp.X_op == O_absent)
252b5132 1769 {
e13bab5a 1770 as_bad (_("missing size expression"));
252b5132 1771 ignore_rest_of_line ();
e13bab5a 1772 goto out;
252b5132 1773 }
95b83567 1774 else if (temp != size || (!exp.X_unsigned && exp.X_add_number < 0))
252b5132 1775 {
e13bab5a 1776 as_warn (_("size (%ld) out of range, ignored"), (long) temp);
252b5132 1777 ignore_rest_of_line ();
e13bab5a 1778 goto out;
252b5132 1779 }
f0e652b4 1780
252b5132 1781 symbolP = symbol_find_or_make (name);
92757bc9
JB
1782 if ((S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
1783 && !S_IS_COMMON (symbolP))
252b5132 1784 {
92757bc9
JB
1785 if (!S_IS_VOLATILE (symbolP))
1786 {
1787 symbolP = NULL;
1788 as_bad (_("symbol `%s' is already defined"), name);
92757bc9
JB
1789 ignore_rest_of_line ();
1790 goto out;
1791 }
89cdfe57 1792 symbolP = symbol_clone (symbolP, 1);
92757bc9
JB
1793 S_SET_SEGMENT (symbolP, undefined_section);
1794 S_SET_VALUE (symbolP, 0);
1795 symbol_set_frag (symbolP, &zero_address_frag);
1796 S_CLEAR_VOLATILE (symbolP);
252b5132 1797 }
f0e652b4 1798
e13bab5a
AM
1799 size = S_GET_VALUE (symbolP);
1800 if (size == 0)
1801 size = temp;
1802 else if (size != temp)
1803 as_warn (_("size of \"%s\" is already %ld; not changing to %ld"),
1804 name, (long) size, (long) temp);
1805
e13bab5a
AM
1806 if (comm_parse_extra != NULL)
1807 symbolP = (*comm_parse_extra) (param, symbolP, size);
252b5132
RH
1808 else
1809 {
e13bab5a 1810 S_SET_VALUE (symbolP, (valueT) size);
252b5132 1811 S_SET_EXTERNAL (symbolP);
9eda1ce9 1812 S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
e13bab5a 1813 }
252b5132
RH
1814
1815 demand_empty_rest_of_line ();
e13bab5a 1816 out:
252b5132
RH
1817 if (flag_mri)
1818 mri_comment_end (stop, stopc);
9fbb53c7 1819 free (name);
e13bab5a
AM
1820 return symbolP;
1821}
1822
1823void
1824s_comm (int ignore)
1825{
1826 s_comm_internal (ignore, NULL);
1827}
252b5132
RH
1828
1829/* The MRI COMMON pseudo-op. We handle this by creating a common
1830 symbol with the appropriate name. We make s_space do the right
1831 thing by increasing the size. */
1832
1833void
39e6acbd 1834s_mri_common (int small ATTRIBUTE_UNUSED)
252b5132
RH
1835{
1836 char *name;
1837 char c;
1838 char *alc = NULL;
1839 symbolS *sym;
1840 offsetT align;
1841 char *stop = NULL;
fb25138b 1842 char stopc = 0;
252b5132 1843
041ff4dd 1844 if (!flag_mri)
252b5132
RH
1845 {
1846 s_comm (0);
1847 return;
1848 }
1849
1850 stop = mri_comment_field (&stopc);
1851
1852 SKIP_WHITESPACE ();
1853
1854 name = input_line_pointer;
3882b010 1855 if (!ISDIGIT (*name))
d02603dc 1856 c = get_symbol_name (& name);
252b5132
RH
1857 else
1858 {
1859 do
1860 {
1861 ++input_line_pointer;
1862 }
3882b010 1863 while (ISDIGIT (*input_line_pointer));
f0e652b4 1864
252b5132
RH
1865 c = *input_line_pointer;
1866 *input_line_pointer = '\0';
1867
1868 if (line_label != NULL)
1869 {
8860a416
TS
1870 alc = XNEWVEC (char, strlen (S_GET_NAME (line_label))
1871 + (input_line_pointer - name) + 1);
252b5132
RH
1872 sprintf (alc, "%s%s", name, S_GET_NAME (line_label));
1873 name = alc;
1874 }
1875 }
1876
1877 sym = symbol_find_or_make (name);
d02603dc 1878 c = restore_line_pointer (c);
9fbb53c7 1879 free (alc);
252b5132
RH
1880
1881 if (*input_line_pointer != ',')
1882 align = 0;
1883 else
1884 {
1885 ++input_line_pointer;
1886 align = get_absolute_expression ();
1887 }
1888
041ff4dd 1889 if (S_IS_DEFINED (sym) && !S_IS_COMMON (sym))
252b5132 1890 {
0e389e77 1891 as_bad (_("symbol `%s' is already defined"), S_GET_NAME (sym));
252b5132
RH
1892 mri_comment_end (stop, stopc);
1893 return;
1894 }
1895
1896 S_SET_EXTERNAL (sym);
9eda1ce9 1897 S_SET_SEGMENT (sym, bfd_com_section_ptr);
252b5132
RH
1898 mri_common_symbol = sym;
1899
1900#ifdef S_SET_ALIGN
1901 if (align != 0)
1902 S_SET_ALIGN (sym, align);
87975d2a
AM
1903#else
1904 (void) align;
252b5132
RH
1905#endif
1906
1907 if (line_label != NULL)
1908 {
2b47531b
ILT
1909 expressionS exp;
1910 exp.X_op = O_symbol;
1911 exp.X_add_symbol = sym;
1912 exp.X_add_number = 0;
1913 symbol_set_value_expression (line_label, &exp);
1914 symbol_set_frag (line_label, &zero_address_frag);
252b5132
RH
1915 S_SET_SEGMENT (line_label, expr_section);
1916 }
1917
1918 /* FIXME: We just ignore the small argument, which distinguishes
1919 COMMON and COMMON.S. I don't know what we can do about it. */
1920
1921 /* Ignore the type and hptype. */
1922 if (*input_line_pointer == ',')
1923 input_line_pointer += 2;
1924 if (*input_line_pointer == ',')
1925 input_line_pointer += 2;
1926
1927 demand_empty_rest_of_line ();
1928
1929 mri_comment_end (stop, stopc);
1930}
1931
1932void
39e6acbd 1933s_data (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
1934{
1935 segT section;
3d540e93 1936 int temp;
252b5132
RH
1937
1938 temp = get_absolute_expression ();
1939 if (flag_readonly_data_in_text)
1940 {
1941 section = text_section;
1942 temp += 1000;
1943 }
1944 else
1945 section = data_section;
1946
1947 subseg_set (section, (subsegT) temp);
1948
252b5132
RH
1949 demand_empty_rest_of_line ();
1950}
1951
c39e89c3
JB
1952/* Handle the .file pseudo-op. This default definition may be overridden by
1953 the object or CPU specific pseudo-ops. */
252b5132 1954
ecb4347a 1955void
c39e89c3 1956s_file_string (char *file)
ecb4347a
DJ
1957{
1958#ifdef LISTING
1959 if (listing)
1960 listing_source_file (file);
1961#endif
1962 register_dependency (file);
1963#ifdef obj_app_file
c39e89c3 1964 obj_app_file (file);
ecb4347a
DJ
1965#endif
1966}
1967
041ff4dd 1968void
c39e89c3 1969s_file (int ignore ATTRIBUTE_UNUSED)
252b5132 1970{
3d540e93 1971 char *s;
252b5132
RH
1972 int length;
1973
041ff4dd 1974 /* Some assemblers tolerate immediately following '"'. */
252b5132
RH
1975 if ((s = demand_copy_string (&length)) != 0)
1976 {
c39e89c3 1977 new_logical_line_flags (s, -1, 1);
252b5132
RH
1978
1979 /* In MRI mode, the preprocessor may have inserted an extraneous
d6415f6c 1980 backquote. */
252b5132
RH
1981 if (flag_m68k_mri
1982 && *input_line_pointer == '\''
1983 && is_end_of_line[(unsigned char) input_line_pointer[1]])
1984 ++input_line_pointer;
1985
1986 demand_empty_rest_of_line ();
c39e89c3 1987 s_file_string (s);
252b5132
RH
1988 }
1989}
1990
9c705561 1991static bool
e9fc6c21
AO
1992get_linefile_number (int *flag)
1993{
9c705561
JB
1994 expressionS exp;
1995
e9fc6c21
AO
1996 SKIP_WHITESPACE ();
1997
1998 if (*input_line_pointer < '0' || *input_line_pointer > '9')
9c705561
JB
1999 return false;
2000
85aaf32e
JB
2001 /* Don't mistakenly interpret octal numbers as line numbers. */
2002 if (*input_line_pointer == '0')
2003 {
2004 *flag = 0;
2005 ++input_line_pointer;
2006 return true;
2007 }
2008
9c705561
JB
2009 expression_and_evaluate (&exp);
2010 if (exp.X_op != O_constant)
2011 return false;
2012
2013#if defined (BFD64) || LONG_MAX > INT_MAX
2014 if (exp.X_add_number < INT_MIN || exp.X_add_number > INT_MAX)
2015 return false;
2016#endif
e9fc6c21 2017
9c705561 2018 *flag = exp.X_add_number;
e9fc6c21 2019
9c705561 2020 return true;
e9fc6c21
AO
2021}
2022
c39e89c3 2023/* Handle the .linefile pseudo-op. This is automatically generated by
252b5132
RH
2024 do_scrub_chars when a preprocessor # line comment is seen. This
2025 default definition may be overridden by the object or CPU specific
2026 pseudo-ops. */
2027
2028void
c39e89c3 2029s_linefile (int ignore ATTRIBUTE_UNUSED)
252b5132 2030{
e9fc6c21 2031 char *file = NULL;
2ee1792b 2032 int linenum, flags = 0;
252b5132
RH
2033
2034 /* The given number is that of the next line. */
c39e89c3 2035 if (!get_linefile_number (&linenum))
e9fc6c21
AO
2036 {
2037 ignore_rest_of_line ();
2038 return;
2039 }
2040
969f6a63 2041 if (linenum < 0)
252b5132 2042 /* Some of the back ends can't deal with non-positive line numbers.
47837f8e
NC
2043 Besides, it's silly. GCC however will generate a line number of
2044 zero when it is pre-processing builtins for assembler-with-cpp files:
2045
fa94de6b 2046 # 0 "<built-in>"
47837f8e
NC
2047
2048 We do not want to barf on this, especially since such files are used
2049 in the GCC and GDB testsuites. So we check for negative line numbers
2050 rather than non-positive line numbers. */
0e389e77 2051 as_warn (_("line numbers must be positive; line number %d rejected"),
969f6a63 2052 linenum);
252b5132
RH
2053 else
2054 {
93e914b2
AO
2055 int length = 0;
2056
c39e89c3 2057 SKIP_WHITESPACE ();
e9fc6c21 2058
c39e89c3
JB
2059 if (*input_line_pointer == '"')
2060 file = demand_copy_string (&length);
2061 else if (*input_line_pointer == '.')
2062 {
2063 /* buffer_and_nest() may insert this form. */
2064 ++input_line_pointer;
2065 flags = 1 << 3;
93e914b2
AO
2066 }
2067
c39e89c3
JB
2068 if (file)
2069 {
2070 int this_flag;
2071
2072 while (get_linefile_number (&this_flag))
2073 switch (this_flag)
2074 {
2075 /* From GCC's cpp documentation:
2076 1: start of a new file.
2077 2: returning to a file after having included another file.
2078 3: following text comes from a system header file.
2079 4: following text should be treated as extern "C".
2080
2081 4 is nonsensical for the assembler; 3, we don't care about,
2082 so we ignore it just in case a system header file is
2083 included while preprocessing assembly. So 1 and 2 are all
2084 we care about, and they are mutually incompatible.
2085 new_logical_line_flags() demands this. */
2086 case 1:
2087 case 2:
2088 if (flags && flags != (1 << this_flag))
2089 as_warn (_("incompatible flag %i in line directive"),
2090 this_flag);
2091 else
2092 flags |= 1 << this_flag;
2093 break;
2094
2095 case 3:
2096 case 4:
2097 /* We ignore these. */
2098 break;
2099
2100 default:
2101 as_warn (_("unsupported flag %i in line directive"),
2102 this_flag);
2103 break;
2104 }
2105
2106 if (!is_end_of_line[(unsigned char)*input_line_pointer])
2107 file = NULL;
2108 }
2109
2110 if (file || flags)
e9fc6c21 2111 {
7545aa2d
JB
2112 demand_empty_rest_of_line ();
2113
2114 /* read_a_source_file() will bump the line number only if the line
2115 is terminated by '\n'. */
2116 if (input_line_pointer[-1] == '\n')
2117 linenum--;
2118
969f6a63 2119 new_logical_line_flags (file, linenum, flags);
252b5132 2120#ifdef LISTING
e9fc6c21 2121 if (listing)
969f6a63 2122 listing_source_line (linenum);
252b5132 2123#endif
7545aa2d 2124 return;
e9fc6c21 2125 }
252b5132 2126 }
7545aa2d 2127 ignore_rest_of_line ();
252b5132
RH
2128}
2129
2130/* Handle the .end pseudo-op. Actually, the real work is done in
2131 read_a_source_file. */
2132
2133void
39e6acbd 2134s_end (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
2135{
2136 if (flag_mri)
2137 {
2138 /* The MRI assembler permits the start symbol to follow .end,
d6415f6c 2139 but we don't support that. */
252b5132 2140 SKIP_WHITESPACE ();
041ff4dd 2141 if (!is_end_of_line[(unsigned char) *input_line_pointer]
252b5132
RH
2142 && *input_line_pointer != '*'
2143 && *input_line_pointer != '!')
2144 as_warn (_("start address not supported"));
2145 }
2146}
2147
2148/* Handle the .err pseudo-op. */
2149
2150void
39e6acbd 2151s_err (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
2152{
2153 as_bad (_(".err encountered"));
2154 demand_empty_rest_of_line ();
d190d046
HPN
2155}
2156
2157/* Handle the .error and .warning pseudo-ops. */
2158
2159void
2160s_errwarn (int err)
2161{
2162 int len;
2163 /* The purpose for the conditional assignment is not to
2164 internationalize the directive itself, but that we need a
2165 self-contained message, one that can be passed like the
2166 demand_copy_C_string return value, and with no assumption on the
2167 location of the name of the directive within the message. */
6d4af3c2 2168 const char *msg
d190d046
HPN
2169 = (err ? _(".error directive invoked in source file")
2170 : _(".warning directive invoked in source file"));
2171
2172 if (!is_it_end_of_statement ())
2173 {
2174 if (*input_line_pointer != '\"')
2175 {
2176 as_bad (_("%s argument must be a string"),
2177 err ? ".error" : ".warning");
40a4d956 2178 ignore_rest_of_line ();
d190d046
HPN
2179 return;
2180 }
2181
2182 msg = demand_copy_C_string (&len);
2183 if (msg == NULL)
2184 return;
2185 }
2186
2187 if (err)
2188 as_bad ("%s", msg);
2189 else
2190 as_warn ("%s", msg);
2191 demand_empty_rest_of_line ();
252b5132
RH
2192}
2193
2194/* Handle the MRI fail pseudo-op. */
2195
2196void
39e6acbd 2197s_fail (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
2198{
2199 offsetT temp;
2200 char *stop = NULL;
fb25138b 2201 char stopc = 0;
252b5132
RH
2202
2203 if (flag_mri)
2204 stop = mri_comment_field (&stopc);
2205
2206 temp = get_absolute_expression ();
2207 if (temp >= 500)
2208 as_warn (_(".fail %ld encountered"), (long) temp);
2209 else
2210 as_bad (_(".fail %ld encountered"), (long) temp);
2211
2212 demand_empty_rest_of_line ();
2213
2214 if (flag_mri)
2215 mri_comment_end (stop, stopc);
2216}
2217
041ff4dd 2218void
39e6acbd 2219s_fill (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
2220{
2221 expressionS rep_exp;
2222 long size = 1;
3d540e93 2223 long fill = 0;
252b5132
RH
2224 char *p;
2225
2226#ifdef md_flush_pending_output
2227 md_flush_pending_output ();
2228#endif
2229
cc3f603a
JM
2230#ifdef md_cons_align
2231 md_cons_align (1);
2232#endif
2233
4f2358bc 2234 expression (&rep_exp);
252b5132
RH
2235 if (*input_line_pointer == ',')
2236 {
2237 input_line_pointer++;
2238 size = get_absolute_expression ();
2239 if (*input_line_pointer == ',')
2240 {
2241 input_line_pointer++;
2242 fill = get_absolute_expression ();
2243 }
2244 }
2245
2246 /* This is to be compatible with BSD 4.2 AS, not for any rational reason. */
2247#define BSD_FILL_SIZE_CROCK_8 (8)
2248 if (size > BSD_FILL_SIZE_CROCK_8)
2249 {
0e389e77 2250 as_warn (_(".fill size clamped to %d"), BSD_FILL_SIZE_CROCK_8);
252b5132
RH
2251 size = BSD_FILL_SIZE_CROCK_8;
2252 }
2253 if (size < 0)
2254 {
0e389e77 2255 as_warn (_("size negative; .fill ignored"));
252b5132
RH
2256 size = 0;
2257 }
2258 else if (rep_exp.X_op == O_constant && rep_exp.X_add_number <= 0)
2259 {
2260 if (rep_exp.X_add_number < 0)
0e389e77 2261 as_warn (_("repeat < 0; .fill ignored"));
252b5132
RH
2262 size = 0;
2263 }
d09f4d4a 2264 else if (size && !need_pass_2)
252b5132 2265 {
d09f4d4a 2266 if (now_seg == absolute_section && rep_exp.X_op != O_constant)
ec9ab52c 2267 {
d09f4d4a
AM
2268 as_bad (_("non-constant fill count for absolute section"));
2269 size = 0;
2270 }
2271 else if (now_seg == absolute_section && fill && rep_exp.X_add_number != 0)
2272 {
2273 as_bad (_("attempt to fill absolute section with non-zero value"));
2274 size = 0;
ec9ab52c
JB
2275 }
2276 else if (fill
2277 && (rep_exp.X_op != O_constant || rep_exp.X_add_number != 0)
2278 && in_bss ())
d09f4d4a
AM
2279 {
2280 as_bad (_("attempt to fill section `%s' with non-zero value"),
2281 segment_name (now_seg));
2282 size = 0;
2283 }
2284 }
2285
2286 if (size && !need_pass_2)
2287 {
2288 if (now_seg == absolute_section)
2289 abs_section_offset += rep_exp.X_add_number * size;
ec9ab52c 2290
252b5132
RH
2291 if (rep_exp.X_op == O_constant)
2292 {
2293 p = frag_var (rs_fill, (int) size, (int) size,
2294 (relax_substateT) 0, (symbolS *) 0,
2295 (offsetT) rep_exp.X_add_number,
2296 (char *) 0);
2297 }
2298 else
2299 {
2300 /* We don't have a constant repeat count, so we can't use
2301 rs_fill. We can get the same results out of rs_space,
2302 but its argument is in bytes, so we must multiply the
2303 repeat count by size. */
2304
2305 symbolS *rep_sym;
2306 rep_sym = make_expr_symbol (&rep_exp);
2307 if (size != 1)
2308 {
2309 expressionS size_exp;
2310 size_exp.X_op = O_constant;
2311 size_exp.X_add_number = size;
2312
2313 rep_exp.X_op = O_multiply;
2314 rep_exp.X_add_symbol = rep_sym;
2315 rep_exp.X_op_symbol = make_expr_symbol (&size_exp);
2316 rep_exp.X_add_number = 0;
2317 rep_sym = make_expr_symbol (&rep_exp);
2318 }
2319
2320 p = frag_var (rs_space, (int) size, (int) size,
2321 (relax_substateT) 0, rep_sym, (offsetT) 0, (char *) 0);
2322 }
f0e652b4 2323
252b5132 2324 memset (p, 0, (unsigned int) size);
f0e652b4 2325
252b5132 2326 /* The magic number BSD_FILL_SIZE_CROCK_4 is from BSD 4.2 VAX
d6415f6c
AM
2327 flavoured AS. The following bizarre behaviour is to be
2328 compatible with above. I guess they tried to take up to 8
2329 bytes from a 4-byte expression and they forgot to sign
2330 extend. */
252b5132
RH
2331#define BSD_FILL_SIZE_CROCK_4 (4)
2332 md_number_to_chars (p, (valueT) fill,
2333 (size > BSD_FILL_SIZE_CROCK_4
2334 ? BSD_FILL_SIZE_CROCK_4
2335 : (int) size));
2336 /* Note: .fill (),0 emits no frag (since we are asked to .fill 0 bytes)
d6415f6c
AM
2337 but emits no error message because it seems a legal thing to do.
2338 It is a degenerate case of .fill but could be emitted by a
041ff4dd 2339 compiler. */
252b5132
RH
2340 }
2341 demand_empty_rest_of_line ();
2342}
2343
041ff4dd 2344void
39e6acbd 2345s_globl (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
2346{
2347 char *name;
2348 int c;
2349 symbolS *symbolP;
2350 char *stop = NULL;
fb25138b 2351 char stopc = 0;
252b5132
RH
2352
2353 if (flag_mri)
2354 stop = mri_comment_field (&stopc);
2355
2356 do
2357 {
7bfd842d
NC
2358 if ((name = read_symbol_name ()) == NULL)
2359 return;
2360
252b5132 2361 symbolP = symbol_find_or_make (name);
58b5739a
RH
2362 S_SET_EXTERNAL (symbolP);
2363
252b5132 2364 SKIP_WHITESPACE ();
58b5739a 2365 c = *input_line_pointer;
252b5132
RH
2366 if (c == ',')
2367 {
2368 input_line_pointer++;
2369 SKIP_WHITESPACE ();
0e389e77 2370 if (is_end_of_line[(unsigned char) *input_line_pointer])
252b5132
RH
2371 c = '\n';
2372 }
7bfd842d
NC
2373
2374 free (name);
252b5132
RH
2375 }
2376 while (c == ',');
2377
2378 demand_empty_rest_of_line ();
2379
2380 if (flag_mri)
2381 mri_comment_end (stop, stopc);
2382}
2383
2384/* Handle the MRI IRP and IRPC pseudo-ops. */
2385
2386void
39e6acbd 2387s_irp (int irpc)
252b5132 2388{
3b4dbbbf
TS
2389 char * eol;
2390 const char * file;
252b5132
RH
2391 unsigned int line;
2392 sb s;
2393 const char *err;
2394 sb out;
2395
3b4dbbbf 2396 file = as_where (&line);
252b5132 2397
40a4d956 2398 eol = find_end_of_line (input_line_pointer, 0);
d2ae702c 2399 sb_build (&s, eol - input_line_pointer);
40a4d956
JB
2400 sb_add_buffer (&s, input_line_pointer, eol - input_line_pointer);
2401 input_line_pointer = eol;
252b5132
RH
2402
2403 sb_new (&out);
2404
7592cfd7 2405 err = expand_irp (irpc, 0, &s, &out, get_non_macro_line_sb);
252b5132
RH
2406 if (err != NULL)
2407 as_bad_where (file, line, "%s", err);
2408
2409 sb_kill (&s);
2410
657edeab 2411 input_scrub_include_sb (&out, input_line_pointer, expanding_repeat);
252b5132
RH
2412 sb_kill (&out);
2413 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2414}
2415
2416/* Handle the .linkonce pseudo-op. This tells the assembler to mark
2417 the section to only be linked once. However, this is not supported
2418 by most object file formats. This takes an optional argument,
2419 which is what to do about duplicates. */
2420
2421void
39e6acbd 2422s_linkonce (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
2423{
2424 enum linkonce_type type;
2425
2426 SKIP_WHITESPACE ();
2427
2428 type = LINKONCE_DISCARD;
2429
041ff4dd 2430 if (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132
RH
2431 {
2432 char *s;
2433 char c;
2434
d02603dc 2435 c = get_symbol_name (& s);
252b5132
RH
2436 if (strcasecmp (s, "discard") == 0)
2437 type = LINKONCE_DISCARD;
2438 else if (strcasecmp (s, "one_only") == 0)
2439 type = LINKONCE_ONE_ONLY;
2440 else if (strcasecmp (s, "same_size") == 0)
2441 type = LINKONCE_SAME_SIZE;
2442 else if (strcasecmp (s, "same_contents") == 0)
2443 type = LINKONCE_SAME_CONTENTS;
2444 else
2445 as_warn (_("unrecognized .linkonce type `%s'"), s);
2446
d02603dc 2447 (void) restore_line_pointer (c);
252b5132
RH
2448 }
2449
2450#ifdef obj_handle_link_once
2451 obj_handle_link_once (type);
2452#else /* ! defined (obj_handle_link_once) */
252b5132
RH
2453 {
2454 flagword flags;
2455
2456 if ((bfd_applicable_section_flags (stdoutput) & SEC_LINK_ONCE) == 0)
2457 as_warn (_(".linkonce is not supported for this object file format"));
2458
fd361982 2459 flags = bfd_section_flags (now_seg);
252b5132
RH
2460 flags |= SEC_LINK_ONCE;
2461 switch (type)
2462 {
2463 default:
2464 abort ();
2465 case LINKONCE_DISCARD:
2466 flags |= SEC_LINK_DUPLICATES_DISCARD;
2467 break;
2468 case LINKONCE_ONE_ONLY:
2469 flags |= SEC_LINK_DUPLICATES_ONE_ONLY;
2470 break;
2471 case LINKONCE_SAME_SIZE:
2472 flags |= SEC_LINK_DUPLICATES_SAME_SIZE;
2473 break;
2474 case LINKONCE_SAME_CONTENTS:
2475 flags |= SEC_LINK_DUPLICATES_SAME_CONTENTS;
2476 break;
2477 }
fd361982 2478 if (!bfd_set_section_flags (now_seg, flags))
252b5132
RH
2479 as_bad (_("bfd_set_section_flags: %s"),
2480 bfd_errmsg (bfd_get_error ()));
2481 }
252b5132
RH
2482#endif /* ! defined (obj_handle_link_once) */
2483
2484 demand_empty_rest_of_line ();
2485}
2486
e13bab5a 2487void
9136aa49 2488bss_alloc (symbolS *symbolP, addressT size, unsigned int align)
252b5132 2489{
e13bab5a 2490 char *pfrag;
252b5132
RH
2491 segT current_seg = now_seg;
2492 subsegT current_subseg = now_subseg;
252b5132
RH
2493 segT bss_seg = bss_section;
2494
252b5132
RH
2495#if defined (TC_MIPS) || defined (TC_ALPHA)
2496 if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour
2497 || OUTPUT_FLAVOR == bfd_target_elf_flavour)
2498 {
2499 /* For MIPS and Alpha ECOFF or ELF, small objects are put in .sbss. */
e13bab5a 2500 if (size <= bfd_get_gp_size (stdoutput))
252b5132
RH
2501 {
2502 bss_seg = subseg_new (".sbss", 1);
2503 seg_info (bss_seg)->bss = 1;
a4dd6c97 2504 if (!bfd_set_section_flags (bss_seg, SEC_ALLOC | SEC_SMALL_DATA))
252b5132
RH
2505 as_warn (_("error setting flags for \".sbss\": %s"),
2506 bfd_errmsg (bfd_get_error ()));
252b5132
RH
2507 }
2508 }
2509#endif
e13bab5a 2510 subseg_set (bss_seg, 1);
8684e216 2511
9136aa49 2512 if (align > OCTETS_PER_BYTE_POWER)
041ff4dd 2513 {
e13bab5a
AM
2514 record_alignment (bss_seg, align);
2515 frag_align (align, 0, 0);
041ff4dd 2516 }
252b5132 2517
e13bab5a
AM
2518 /* Detach from old frag. */
2519 if (S_GET_SEGMENT (symbolP) == bss_seg)
2520 symbol_get_frag (symbolP)->fr_symbol = NULL;
f0e652b4 2521
e13bab5a 2522 symbol_set_frag (symbolP, frag_now);
5947daaf 2523 pfrag = frag_var (rs_org, 1, 1, 0, symbolP, size * OCTETS_PER_BYTE, NULL);
e13bab5a 2524 *pfrag = 0;
f0e652b4 2525
e13bab5a
AM
2526#ifdef S_SET_SIZE
2527 S_SET_SIZE (symbolP, size);
2528#endif
2529 S_SET_SEGMENT (symbolP, bss_seg);
f0e652b4 2530
e13bab5a
AM
2531#ifdef OBJ_COFF
2532 /* The symbol may already have been created with a preceding
2533 ".globl" directive -- be careful not to step on storage class
2534 in that case. Otherwise, set it to static. */
2535 if (S_GET_STORAGE_CLASS (symbolP) != C_EXT)
2536 S_SET_STORAGE_CLASS (symbolP, C_STAT);
2537#endif /* OBJ_COFF */
f0e652b4 2538
e13bab5a
AM
2539 subseg_set (current_seg, current_subseg);
2540}
f0e652b4 2541
e13bab5a
AM
2542offsetT
2543parse_align (int align_bytes)
2544{
2545 expressionS exp;
2546 addressT align;
252b5132 2547
e13bab5a
AM
2548 SKIP_WHITESPACE ();
2549 if (*input_line_pointer != ',')
2550 {
2551 no_align:
2552 as_bad (_("expected alignment after size"));
2553 ignore_rest_of_line ();
2554 return -1;
2555 }
f0e652b4 2556
e13bab5a
AM
2557 input_line_pointer++;
2558 SKIP_WHITESPACE ();
f0e652b4 2559
e13bab5a
AM
2560 align = get_absolute_expr (&exp);
2561 if (exp.X_op == O_absent)
2562 goto no_align;
2563
95b83567 2564 if (!exp.X_unsigned && exp.X_add_number < 0)
e13bab5a
AM
2565 {
2566 as_warn (_("alignment negative; 0 assumed"));
2567 align = 0;
041ff4dd 2568 }
e13bab5a
AM
2569
2570 if (align_bytes && align != 0)
252b5132 2571 {
e13bab5a
AM
2572 /* convert to a power of 2 alignment */
2573 unsigned int alignp2 = 0;
2574 while ((align & 1) == 0)
2575 align >>= 1, ++alignp2;
2576 if (align != 1)
252b5132 2577 {
e13bab5a
AM
2578 as_bad (_("alignment not a power of 2"));
2579 ignore_rest_of_line ();
2580 return -1;
252b5132 2581 }
e13bab5a 2582 align = alignp2;
252b5132 2583 }
e13bab5a
AM
2584 return align;
2585}
252b5132 2586
e13bab5a
AM
2587/* Called from s_comm_internal after symbol name and size have been
2588 parsed. NEEDS_ALIGN is 0 if it was an ".lcomm" (2 args only),
2589 1 if this was a ".bss" directive which has a 3rd argument
2590 (alignment as a power of 2), or 2 if this was a ".bss" directive
2591 with alignment in bytes. */
252b5132 2592
13c56984 2593symbolS *
e13bab5a
AM
2594s_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
2595{
2596 addressT align = 0;
252b5132 2597
e13bab5a
AM
2598 if (needs_align)
2599 {
2600 align = parse_align (needs_align - 1);
2601 if (align == (addressT) -1)
2602 return NULL;
252b5132
RH
2603 }
2604 else
e13bab5a
AM
2605 /* Assume some objects may require alignment on some systems. */
2606 TC_IMPLICIT_LCOMM_ALIGNMENT (size, align);
252b5132 2607
e13bab5a
AM
2608 bss_alloc (symbolP, size, align);
2609 return symbolP;
041ff4dd 2610}
252b5132
RH
2611
2612void
39e6acbd 2613s_lcomm (int needs_align)
252b5132 2614{
e13bab5a 2615 s_comm_internal (needs_align, s_lcomm_internal);
252b5132
RH
2616}
2617
041ff4dd 2618void
39e6acbd 2619s_lcomm_bytes (int needs_align)
252b5132 2620{
e13bab5a 2621 s_comm_internal (needs_align * 2, s_lcomm_internal);
252b5132
RH
2622}
2623
041ff4dd 2624void
39e6acbd 2625s_lsym (int ignore ATTRIBUTE_UNUSED)
252b5132 2626{
3d540e93 2627 char *name;
252b5132 2628 expressionS exp;
3d540e93 2629 symbolS *symbolP;
252b5132 2630
041ff4dd 2631 /* We permit ANY defined expression: BSD4.2 demands constants. */
7bfd842d
NC
2632 if ((name = read_symbol_name ()) == NULL)
2633 return;
f0e652b4 2634
252b5132
RH
2635 if (*input_line_pointer != ',')
2636 {
0e389e77 2637 as_bad (_("expected comma after \"%s\""), name);
7bfd842d 2638 goto err_out;
252b5132 2639 }
f0e652b4 2640
252b5132 2641 input_line_pointer++;
9497f5ac 2642 expression_and_evaluate (&exp);
f0e652b4 2643
252b5132
RH
2644 if (exp.X_op != O_constant
2645 && exp.X_op != O_register)
2646 {
2647 as_bad (_("bad expression"));
7bfd842d 2648 goto err_out;
252b5132 2649 }
f0e652b4 2650
252b5132
RH
2651 symbolP = symbol_find_or_make (name);
2652
86ebace2 2653 if (S_GET_SEGMENT (symbolP) == undefined_section)
252b5132
RH
2654 {
2655 /* The name might be an undefined .global symbol; be sure to
041ff4dd 2656 keep the "external" bit. */
252b5132
RH
2657 S_SET_SEGMENT (symbolP,
2658 (exp.X_op == O_constant
2659 ? absolute_section
2660 : reg_section));
2661 S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
2662 }
2663 else
2664 {
0e389e77 2665 as_bad (_("symbol `%s' is already defined"), name);
252b5132 2666 }
f0e652b4 2667
252b5132 2668 demand_empty_rest_of_line ();
7bfd842d
NC
2669 free (name);
2670 return;
2671
2672 err_out:
2673 ignore_rest_of_line ();
2674 free (name);
2675 return;
041ff4dd 2676}
252b5132 2677
0822d075
NC
2678/* Read a line into an sb. Returns the character that ended the line
2679 or zero if there are no more lines. */
252b5132
RH
2680
2681static int
7592cfd7 2682get_line_sb (sb *line, int in_macro)
252b5132 2683{
40a4d956 2684 char *eol;
252b5132
RH
2685
2686 if (input_line_pointer[-1] == '\n')
2687 bump_line_counters ();
2688
2689 if (input_line_pointer >= buffer_limit)
2690 {
2691 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2692 if (buffer_limit == 0)
2693 return 0;
2694 }
2695
7592cfd7 2696 eol = _find_end_of_line (input_line_pointer, flag_m68k_mri, 0, in_macro);
40a4d956
JB
2697 sb_add_buffer (line, input_line_pointer, eol - input_line_pointer);
2698 input_line_pointer = eol;
f0e652b4 2699
0822d075
NC
2700 /* Don't skip multiple end-of-line characters, because that breaks support
2701 for the IA-64 stop bit (;;) which looks like two consecutive end-of-line
2702 characters but isn't. Instead just skip one end of line character and
2703 return the character skipped so that the caller can re-insert it if
2704 necessary. */
40a4d956 2705 return *input_line_pointer++;
252b5132
RH
2706}
2707
39a45edc 2708static size_t
7592cfd7
NC
2709get_non_macro_line_sb (sb *line)
2710{
2711 return get_line_sb (line, 0);
2712}
2713
39a45edc 2714static size_t
7592cfd7
NC
2715get_macro_line_sb (sb *line)
2716{
2717 return get_line_sb (line, 1);
2718}
2719
fea17916 2720/* Define a macro. This is an interface to macro.c. */
252b5132
RH
2721
2722void
39e6acbd 2723s_macro (int ignore ATTRIBUTE_UNUSED)
252b5132 2724{
3b4dbbbf 2725 char *eol;
252b5132 2726 sb s;
c026360c 2727 macro_entry *macro;
252b5132 2728
40a4d956 2729 eol = find_end_of_line (input_line_pointer, 0);
d2ae702c 2730 sb_build (&s, eol - input_line_pointer);
40a4d956
JB
2731 sb_add_buffer (&s, input_line_pointer, eol - input_line_pointer);
2732 input_line_pointer = eol;
252b5132 2733
252b5132 2734 if (line_label != NULL)
360e86f1
JB
2735 {
2736 sb label;
d2ae702c 2737 size_t len;
c026360c 2738 const char *name;
252b5132 2739
d2ae702c
L
2740 name = S_GET_NAME (line_label);
2741 len = strlen (name);
2742 sb_build (&label, len);
2743 sb_add_buffer (&label, name, len);
c026360c 2744 macro = define_macro (&s, &label, get_macro_line_sb);
360e86f1
JB
2745 sb_kill (&label);
2746 }
2747 else
c026360c
AM
2748 macro = define_macro (&s, NULL, get_macro_line_sb);
2749 if (macro != NULL)
252b5132
RH
2750 {
2751 if (line_label != NULL)
2752 {
5e75c3ab 2753 S_SET_SEGMENT (line_label, absolute_section);
252b5132 2754 S_SET_VALUE (line_label, 0);
2b47531b 2755 symbol_set_frag (line_label, &zero_address_frag);
252b5132
RH
2756 }
2757
abd63a32 2758 if (((NO_PSEUDO_DOT || flag_m68k_mri)
c026360c 2759 && str_hash_find (po_hash, macro->name) != NULL)
041ff4dd 2760 || (!flag_m68k_mri
c026360c
AM
2761 && macro->name[0] == '.'
2762 && str_hash_find (po_hash, macro->name + 1) != NULL))
2763 {
2764 as_warn_where (macro->file, macro->line,
2765 _("attempt to redefine pseudo-op `%s' ignored"),
2766 macro->name);
2767 str_hash_delete (macro_hash, macro->name);
2768 }
252b5132
RH
2769 }
2770
2771 sb_kill (&s);
2772}
2773
2774/* Handle the .mexit pseudo-op, which immediately exits a macro
2775 expansion. */
2776
2777void
39e6acbd 2778s_mexit (int ignore ATTRIBUTE_UNUSED)
252b5132 2779{
5808f4a6
NC
2780 if (macro_nest)
2781 {
2782 cond_exit_macro (macro_nest);
2783 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2784 }
2785 else
2786 as_warn (_("ignoring macro exit outside a macro definition."));
252b5132
RH
2787}
2788
2789/* Switch in and out of MRI mode. */
2790
2791void
39e6acbd 2792s_mri (int ignore ATTRIBUTE_UNUSED)
252b5132 2793{
3d540e93
NC
2794 int on;
2795#ifdef MRI_MODE_CHANGE
2796 int old_flag;
2797#endif
252b5132
RH
2798
2799 on = get_absolute_expression ();
3d540e93 2800#ifdef MRI_MODE_CHANGE
252b5132 2801 old_flag = flag_mri;
3d540e93 2802#endif
252b5132
RH
2803 if (on != 0)
2804 {
2805 flag_mri = 1;
2806#ifdef TC_M68K
2807 flag_m68k_mri = 1;
2808#endif
252b5132
RH
2809 }
2810 else
2811 {
2812 flag_mri = 0;
abd63a32 2813#ifdef TC_M68K
252b5132 2814 flag_m68k_mri = 0;
abd63a32 2815#endif
252b5132
RH
2816 }
2817
2818 /* Operator precedence changes in m68k MRI mode, so we need to
2819 update the operator rankings. */
2820 expr_set_precedence ();
2821
2822#ifdef MRI_MODE_CHANGE
2823 if (on != old_flag)
2824 MRI_MODE_CHANGE (on);
2825#endif
2826
2827 demand_empty_rest_of_line ();
2828}
2829
2830/* Handle changing the location counter. */
2831
2832static void
39e6acbd 2833do_org (segT segment, expressionS *exp, int fill)
252b5132 2834{
259af69e
AM
2835 if (segment != now_seg
2836 && segment != absolute_section
2837 && segment != expr_section)
0e389e77 2838 as_bad (_("invalid segment \"%s\""), segment_name (segment));
252b5132
RH
2839
2840 if (now_seg == absolute_section)
2841 {
2842 if (fill != 0)
2843 as_warn (_("ignoring fill value in absolute section"));
2844 if (exp->X_op != O_constant)
2845 {
2846 as_bad (_("only constant offsets supported in absolute section"));
2847 exp->X_add_number = 0;
2848 }
2849 abs_section_offset = exp->X_add_number;
2850 }
2851 else
2852 {
2853 char *p;
2289f85d
AM
2854 symbolS *sym = exp->X_add_symbol;
2855 offsetT off = exp->X_add_number * OCTETS_PER_BYTE;
252b5132 2856
ec9ab52c
JB
2857 if (fill && in_bss ())
2858 as_warn (_("ignoring fill value in section `%s'"),
2859 segment_name (now_seg));
2860
2289f85d
AM
2861 if (exp->X_op != O_constant && exp->X_op != O_symbol)
2862 {
2863 /* Handle complex expressions. */
2864 sym = make_expr_symbol (exp);
2865 off = 0;
2866 }
2867
2868 p = frag_var (rs_org, 1, 1, (relax_substateT) 0, sym, off, (char *) 0);
252b5132
RH
2869 *p = fill;
2870 }
2871}
2872
041ff4dd 2873void
39e6acbd 2874s_org (int ignore ATTRIBUTE_UNUSED)
252b5132 2875{
3d540e93 2876 segT segment;
252b5132 2877 expressionS exp;
3d540e93 2878 long temp_fill;
252b5132
RH
2879
2880#ifdef md_flush_pending_output
2881 md_flush_pending_output ();
2882#endif
2883
2884 /* The m68k MRI assembler has a different meaning for .org. It
2885 means to create an absolute section at a given address. We can't
2886 support that--use a linker script instead. */
2887 if (flag_m68k_mri)
2888 {
2889 as_bad (_("MRI style ORG pseudo-op not supported"));
2890 ignore_rest_of_line ();
2891 return;
2892 }
2893
2894 /* Don't believe the documentation of BSD 4.2 AS. There is no such
2895 thing as a sub-segment-relative origin. Any absolute origin is
2896 given a warning, then assumed to be segment-relative. Any
2897 segmented origin expression ("foo+42") had better be in the right
2898 segment or the .org is ignored.
2899
2900 BSD 4.2 AS warns if you try to .org backwards. We cannot because
2901 we never know sub-segment sizes when we are reading code. BSD
2902 will crash trying to emit negative numbers of filler bytes in
2903 certain .orgs. We don't crash, but see as-write for that code.
2904
2905 Don't make frag if need_pass_2==1. */
2906 segment = get_known_segmented_expression (&exp);
2907 if (*input_line_pointer == ',')
2908 {
2909 input_line_pointer++;
2910 temp_fill = get_absolute_expression ();
2911 }
2912 else
2913 temp_fill = 0;
2914
2915 if (!need_pass_2)
2916 do_org (segment, &exp, temp_fill);
2917
2918 demand_empty_rest_of_line ();
041ff4dd 2919}
252b5132
RH
2920
2921/* Handle parsing for the MRI SECT/SECTION pseudo-op. This should be
2922 called by the obj-format routine which handles section changing
2923 when in MRI mode. It will create a new section, and return it. It
2924 will set *TYPE to the section type: one of 'C' (code), 'D' (data),
7be1c489 2925 'M' (mixed), or 'R' (romable). The flags will be set in the section. */
252b5132
RH
2926
2927void
39e6acbd 2928s_mri_sect (char *type ATTRIBUTE_UNUSED)
252b5132
RH
2929{
2930#ifdef TC_M68K
2931
2932 char *name;
2933 char c;
2934 segT seg;
2935
2936 SKIP_WHITESPACE ();
041ff4dd 2937
252b5132 2938 name = input_line_pointer;
3882b010 2939 if (!ISDIGIT (*name))
d02603dc 2940 c = get_symbol_name (& name);
252b5132
RH
2941 else
2942 {
2943 do
2944 {
2945 ++input_line_pointer;
2946 }
3882b010 2947 while (ISDIGIT (*input_line_pointer));
f0e652b4 2948
252b5132
RH
2949 c = *input_line_pointer;
2950 *input_line_pointer = '\0';
2951 }
2952
2953 name = xstrdup (name);
2954
d02603dc 2955 c = restore_line_pointer (c);
252b5132
RH
2956
2957 seg = subseg_new (name, 0);
2958
d02603dc 2959 if (c == ',')
252b5132 2960 {
9136aa49 2961 unsigned int align;
252b5132
RH
2962
2963 ++input_line_pointer;
2964 align = get_absolute_expression ();
2965 record_alignment (seg, align);
2966 }
2967
2968 *type = 'C';
2969 if (*input_line_pointer == ',')
2970 {
2971 c = *++input_line_pointer;
3882b010 2972 c = TOUPPER (c);
252b5132
RH
2973 if (c == 'C' || c == 'D' || c == 'M' || c == 'R')
2974 *type = c;
2975 else
2976 as_bad (_("unrecognized section type"));
2977 ++input_line_pointer;
2978
252b5132
RH
2979 {
2980 flagword flags;
2981
2982 flags = SEC_NO_FLAGS;
2983 if (*type == 'C')
2984 flags = SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE;
2985 else if (*type == 'D' || *type == 'M')
2986 flags = SEC_ALLOC | SEC_LOAD | SEC_DATA;
2987 else if (*type == 'R')
2988 flags = SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_READONLY | SEC_ROM;
2989 if (flags != SEC_NO_FLAGS)
2990 {
fd361982 2991 if (!bfd_set_section_flags (seg, flags))
252b5132 2992 as_warn (_("error setting flags for \"%s\": %s"),
fd361982 2993 bfd_section_name (seg),
252b5132
RH
2994 bfd_errmsg (bfd_get_error ()));
2995 }
2996 }
252b5132
RH
2997 }
2998
2999 /* Ignore the HP type. */
3000 if (*input_line_pointer == ',')
3001 input_line_pointer += 2;
3002
3003 demand_empty_rest_of_line ();
3004
3005#else /* ! TC_M68K */
252b5132
RH
3006 /* The MRI assembler seems to use different forms of .sect for
3007 different targets. */
3008 as_bad ("MRI mode not supported for this target");
3009 ignore_rest_of_line ();
252b5132
RH
3010#endif /* ! TC_M68K */
3011}
3012
3013/* Handle the .print pseudo-op. */
3014
3015void
39e6acbd 3016s_print (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
3017{
3018 char *s;
3019 int len;
3020
3021 s = demand_copy_C_string (&len);
d6415f6c
AM
3022 if (s != NULL)
3023 printf ("%s\n", s);
252b5132
RH
3024 demand_empty_rest_of_line ();
3025}
3026
3027/* Handle the .purgem pseudo-op. */
3028
3029void
39e6acbd 3030s_purgem (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
3031{
3032 if (is_it_end_of_statement ())
3033 {
3034 demand_empty_rest_of_line ();
3035 return;
3036 }
3037
3038 do
3039 {
3040 char *name;
3041 char c;
3042
3043 SKIP_WHITESPACE ();
d02603dc 3044 c = get_symbol_name (& name);
252b5132
RH
3045 delete_macro (name);
3046 *input_line_pointer = c;
d02603dc 3047 SKIP_WHITESPACE_AFTER_NAME ();
252b5132
RH
3048 }
3049 while (*input_line_pointer++ == ',');
3050
3051 --input_line_pointer;
3052 demand_empty_rest_of_line ();
3053}
3054
057f53c1 3055/* Handle the .endm/.endr pseudo-ops. */
252b5132 3056
057f53c1
JB
3057static void
3058s_bad_end (int endr)
7f28ab9d 3059{
cc643b88 3060 as_warn (_(".end%c encountered without preceding %s"),
057f53c1
JB
3061 endr ? 'r' : 'm',
3062 endr ? ".rept, .irp, or .irpc" : ".macro");
7f28ab9d
NC
3063 demand_empty_rest_of_line ();
3064}
3065
3066/* Handle the .rept pseudo-op. */
3067
252b5132 3068void
39e6acbd 3069s_rept (int ignore ATTRIBUTE_UNUSED)
252b5132 3070{
808811a3 3071 size_t count;
252b5132 3072
808811a3 3073 count = (size_t) get_absolute_expression ();
252b5132 3074
7e6d6b62 3075 do_repeat (count, "REPT", "ENDR", NULL);
6dc19fc4
TW
3076}
3077
3078/* This function provides a generic repeat block implementation. It allows
7e6d6b62
JB
3079 different directives to be used as the start/end keys. Any text matching
3080 the optional EXPANDER in the block is replaced by the remaining iteration
3081 count. */
6dc19fc4
TW
3082
3083void
7e6d6b62
JB
3084do_repeat (size_t count, const char *start, const char *end,
3085 const char *expander)
6dc19fc4
TW
3086{
3087 sb one;
3088 sb many;
3089
808811a3
NC
3090 if (((ssize_t) count) < 0)
3091 {
3092 as_bad (_("negative count for %s - ignored"), start);
3093 count = 0;
3094 }
3095
252b5132 3096 sb_new (&one);
7592cfd7 3097 if (!buffer_and_nest (start, end, &one, get_non_macro_line_sb))
252b5132 3098 {
6dc19fc4 3099 as_bad (_("%s without %s"), start, end);
0eb3224b 3100 sb_kill (&one);
252b5132
RH
3101 return;
3102 }
3103
7e6d6b62 3104 if (expander == NULL || strstr (one.ptr, expander) == NULL)
808811a3 3105 {
7e6d6b62
JB
3106 sb_build (&many, count * one.len);
3107 while (count-- > 0)
3108 sb_add_sb (&many, &one);
808811a3 3109 }
7e6d6b62 3110 else
c7927a3c 3111 {
7e6d6b62 3112 sb_new (&many);
c7927a3c 3113
c7927a3c
NC
3114 while (count -- > 0)
3115 {
3116 int len;
3117 char * sub;
3118 sb processed;
3119
d2ae702c 3120 sb_build (& processed, one.len);
c7927a3c
NC
3121 sb_add_sb (& processed, & one);
3122 sub = strstr (processed.ptr, expander);
808811a3 3123 len = sprintf (sub, "%lu", (unsigned long) count);
c7927a3c 3124 gas_assert (len < 8);
9dcbfff1
AS
3125 memmove (sub + len, sub + 8,
3126 processed.ptr + processed.len - (sub + 8));
c7927a3c
NC
3127 processed.len -= (8 - len);
3128 sb_add_sb (& many, & processed);
3129 sb_kill (& processed);
3130 }
3131 }
c7927a3c
NC
3132
3133 sb_kill (&one);
3134
657edeab 3135 input_scrub_include_sb (&many, input_line_pointer, expanding_repeat);
c7927a3c
NC
3136 sb_kill (&many);
3137 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
3138}
3139
6dc19fc4
TW
3140/* Skip to end of current repeat loop; EXTRA indicates how many additional
3141 input buffers to skip. Assumes that conditionals preceding the loop end
041ff4dd 3142 are properly nested.
6dc19fc4
TW
3143
3144 This function makes it easier to implement a premature "break" out of the
3145 loop. The EXTRA arg accounts for other buffers we might have inserted,
041ff4dd 3146 such as line substitutions. */
6dc19fc4
TW
3147
3148void
39e6acbd 3149end_repeat (int extra)
6dc19fc4
TW
3150{
3151 cond_exit_macro (macro_nest);
3152 while (extra-- >= 0)
3153 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
3154}
3155
be95a9c1 3156static void
9497f5ac 3157assign_symbol (char *name, int mode)
be95a9c1
AM
3158{
3159 symbolS *symbolP;
3160
3161 if (name[0] == '.' && name[1] == '\0')
3162 {
3163 /* Turn '. = mumble' into a .org mumble. */
3164 segT segment;
3165 expressionS exp;
3166
3167 segment = get_known_segmented_expression (&exp);
3168
3169 if (!need_pass_2)
3170 do_org (segment, &exp, 0);
3171
3172 return;
3173 }
3174
3175 if ((symbolP = symbol_find (name)) == NULL
3176 && (symbolP = md_undefined_symbol (name)) == NULL)
3177 {
3178 symbolP = symbol_find_or_make (name);
3179#ifndef NO_LISTING
3180 /* When doing symbol listings, play games with dummy fragments living
3181 outside the normal fragment chain to record the file and line info
3182 for this symbol. */
3183 if (listing & LISTING_SYMBOLS)
3184 {
3185 extern struct list_info_struct *listing_tail;
714ccdeb 3186 fragS *dummy_frag = notes_calloc (1, sizeof (*dummy_frag));
be95a9c1
AM
3187 dummy_frag->line = listing_tail;
3188 dummy_frag->fr_symbol = symbolP;
3189 symbol_set_frag (symbolP, dummy_frag);
3190 }
3191#endif
76bd66cf 3192#if defined (OBJ_COFF) && !defined (TE_PE)
31d20a21
AM
3193 /* "set" symbols are local unless otherwise specified. */
3194 SF_SET_LOCAL (symbolP);
be95a9c1
AM
3195#endif
3196 }
3197
6a2b6326 3198 if (S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
9497f5ac 3199 {
9497f5ac 3200 if ((mode != 0 || !S_IS_VOLATILE (symbolP))
6885131b 3201 && !S_CAN_BE_REDEFINED (symbolP))
9497f5ac
NC
3202 {
3203 as_bad (_("symbol `%s' is already defined"), name);
62bd6b5f
AM
3204 ignore_rest_of_line ();
3205 input_line_pointer--;
3206 return;
9497f5ac
NC
3207 }
3208 /* If the symbol is volatile, copy the symbol and replace the
3209 original with the copy, so that previous uses of the symbol will
3210 retain the value of the symbol at the point of use. */
89cdfe57 3211 else if (S_IS_VOLATILE (symbolP))
9497f5ac
NC
3212 symbolP = symbol_clone (symbolP, 1);
3213 }
3214
3215 if (mode == 0)
3216 S_SET_VOLATILE (symbolP);
3217 else if (mode < 0)
3218 S_SET_FORWARD_REF (symbolP);
be95a9c1
AM
3219
3220 pseudo_set (symbolP);
be95a9c1
AM
3221}
3222
9497f5ac
NC
3223/* Handle the .equ, .equiv, .eqv, and .set directives. If EQUIV is 1,
3224 then this is .equiv, and it is an error if the symbol is already
3225 defined. If EQUIV is -1, the symbol additionally is a forward
3226 reference. */
252b5132 3227
041ff4dd 3228void
39e6acbd 3229s_set (int equiv)
252b5132 3230{
be95a9c1 3231 char *name;
252b5132 3232
041ff4dd
NC
3233 /* Especial apologies for the random logic:
3234 this just grew, and could be parsed much more simply!
3235 Dean in haste. */
7bfd842d
NC
3236 if ((name = read_symbol_name ()) == NULL)
3237 return;
252b5132
RH
3238
3239 if (*input_line_pointer != ',')
3240 {
0e389e77 3241 as_bad (_("expected comma after \"%s\""), name);
252b5132 3242 ignore_rest_of_line ();
7bfd842d 3243 free (name);
252b5132
RH
3244 return;
3245 }
3246
3247 input_line_pointer++;
be95a9c1 3248 assign_symbol (name, equiv);
31d20a21 3249 demand_empty_rest_of_line ();
7bfd842d 3250 free (name);
041ff4dd 3251}
252b5132 3252
041ff4dd 3253void
39e6acbd 3254s_space (int mult)
252b5132
RH
3255{
3256 expressionS exp;
3257 expressionS val;
3258 char *p = 0;
3259 char *stop = NULL;
fb25138b 3260 char stopc = 0;
252b5132
RH
3261 int bytes;
3262
3263#ifdef md_flush_pending_output
3264 md_flush_pending_output ();
3265#endif
3266
e74e2b4c
JB
3267 switch (mult)
3268 {
3269 case 'x':
3270#ifdef X_PRECISION
3271# ifndef P_PRECISION
3272# define P_PRECISION X_PRECISION
3273# define P_PRECISION_PAD X_PRECISION_PAD
3274# endif
3275 mult = (X_PRECISION + X_PRECISION_PAD) * sizeof (LITTLENUM_TYPE);
3276 if (!mult)
3277#endif
3278 mult = 12;
3279 break;
3280
3281 case 'p':
3282#ifdef P_PRECISION
3283 mult = (P_PRECISION + P_PRECISION_PAD) * sizeof (LITTLENUM_TYPE);
3284 if (!mult)
3285#endif
3286 mult = 12;
3287 break;
3288 }
3289
cc3f603a
JM
3290#ifdef md_cons_align
3291 md_cons_align (1);
3292#endif
3293
252b5132
RH
3294 if (flag_mri)
3295 stop = mri_comment_field (&stopc);
3296
3297 /* In m68k MRI mode, we need to align to a word boundary, unless
3298 this is ds.b. */
3299 if (flag_m68k_mri && mult > 1)
3300 {
3301 if (now_seg == absolute_section)
3302 {
3303 abs_section_offset += abs_section_offset & 1;
3304 if (line_label != NULL)
3305 S_SET_VALUE (line_label, abs_section_offset);
3306 }
3307 else if (mri_common_symbol != NULL)
3308 {
91d6fa6a 3309 valueT mri_val;
252b5132 3310
91d6fa6a
NC
3311 mri_val = S_GET_VALUE (mri_common_symbol);
3312 if ((mri_val & 1) != 0)
252b5132 3313 {
91d6fa6a 3314 S_SET_VALUE (mri_common_symbol, mri_val + 1);
252b5132
RH
3315 if (line_label != NULL)
3316 {
2b47531b
ILT
3317 expressionS *symexp;
3318
3319 symexp = symbol_get_value_expression (line_label);
3320 know (symexp->X_op == O_symbol);
3321 know (symexp->X_add_symbol == mri_common_symbol);
3322 symexp->X_add_number += 1;
252b5132
RH
3323 }
3324 }
3325 }
3326 else
3327 {
3328 do_align (1, (char *) NULL, 0, 0);
3329 if (line_label != NULL)
3330 {
2b47531b 3331 symbol_set_frag (line_label, frag_now);
252b5132
RH
3332 S_SET_VALUE (line_label, frag_now_fix ());
3333 }
3334 }
3335 }
3336
3337 bytes = mult;
3338
3339 expression (&exp);
3340
3341 SKIP_WHITESPACE ();
3342 if (*input_line_pointer == ',')
3343 {
3344 ++input_line_pointer;
3345 expression (&val);
3346 }
3347 else
3348 {
3349 val.X_op = O_constant;
3350 val.X_add_number = 0;
3351 }
3352
ec9ab52c
JB
3353 if ((val.X_op != O_constant
3354 || val.X_add_number < - 0x80
3355 || val.X_add_number > 0xff
3356 || (mult != 0 && mult != 1 && val.X_add_number != 0))
3357 && (now_seg != absolute_section && !in_bss ()))
252b5132 3358 {
9497f5ac 3359 resolve_expression (&exp);
252b5132 3360 if (exp.X_op != O_constant)
0e389e77 3361 as_bad (_("unsupported variable size or fill value"));
252b5132
RH
3362 else
3363 {
3364 offsetT i;
3365
005304aa
NC
3366 /* PR 20901: Check for excessive values.
3367 FIXME: 1<<10 is an arbitrary limit. Maybe use maxpagesize instead ? */
3368 if (exp.X_add_number < 0 || exp.X_add_number > (1 << 10))
5eecd862 3369 as_bad (_("size value for space directive too large: %lx"),
005304aa
NC
3370 (long) exp.X_add_number);
3371 else
3372 {
3373 if (mult == 0)
3374 mult = 1;
3375 bytes = mult * exp.X_add_number;
3376
3377 for (i = 0; i < exp.X_add_number; i++)
3378 emit_expr (&val, mult);
3379 }
252b5132
RH
3380 }
3381 }
3382 else
3383 {
9497f5ac
NC
3384 if (now_seg == absolute_section || mri_common_symbol != NULL)
3385 resolve_expression (&exp);
3386
252b5132
RH
3387 if (exp.X_op == O_constant)
3388 {
d80081ef
AM
3389 addressT repeat = exp.X_add_number;
3390 addressT total;
252b5132 3391
d80081ef
AM
3392 bytes = 0;
3393 if ((offsetT) repeat < 0)
3394 {
3395 as_warn (_(".space repeat count is negative, ignored"));
3396 goto getout;
3397 }
3398 if (repeat == 0)
252b5132 3399 {
2d150871
RO
3400 if (!flag_mri)
3401 as_warn (_(".space repeat count is zero, ignored"));
252b5132
RH
3402 goto getout;
3403 }
d80081ef
AM
3404 if ((unsigned int) mult <= 1)
3405 total = repeat;
3406 else if (gas_mul_overflow (repeat, mult, &total)
3407 || (offsetT) total < 0)
3408 {
3409 as_warn (_(".space repeat count overflow, ignored"));
3410 goto getout;
3411 }
3412 bytes = total;
252b5132
RH
3413
3414 /* If we are in the absolute section, just bump the offset. */
3415 if (now_seg == absolute_section)
3416 {
ec9ab52c
JB
3417 if (val.X_op != O_constant || val.X_add_number != 0)
3418 as_warn (_("ignoring fill value in absolute section"));
d80081ef 3419 abs_section_offset += total;
252b5132
RH
3420 goto getout;
3421 }
3422
3423 /* If we are secretly in an MRI common section, then
3424 creating space just increases the size of the common
3425 symbol. */
3426 if (mri_common_symbol != NULL)
3427 {
3428 S_SET_VALUE (mri_common_symbol,
d80081ef 3429 S_GET_VALUE (mri_common_symbol) + total);
252b5132
RH
3430 goto getout;
3431 }
3432
3433 if (!need_pass_2)
3434 p = frag_var (rs_fill, 1, 1, (relax_substateT) 0, (symbolS *) 0,
d80081ef 3435 (offsetT) total, (char *) 0);
252b5132
RH
3436 }
3437 else
3438 {
3439 if (now_seg == absolute_section)
3440 {
3441 as_bad (_("space allocation too complex in absolute section"));
3442 subseg_set (text_section, 0);
3443 }
f0e652b4 3444
252b5132
RH
3445 if (mri_common_symbol != NULL)
3446 {
3447 as_bad (_("space allocation too complex in common section"));
3448 mri_common_symbol = NULL;
3449 }
f0e652b4 3450
252b5132
RH
3451 if (!need_pass_2)
3452 p = frag_var (rs_space, 1, 1, (relax_substateT) 0,
3453 make_expr_symbol (&exp), (offsetT) 0, (char *) 0);
3454 }
3455
ec9ab52c
JB
3456 if ((val.X_op != O_constant || val.X_add_number != 0) && in_bss ())
3457 as_warn (_("ignoring fill value in section `%s'"),
3458 segment_name (now_seg));
3459 else if (p)
252b5132
RH
3460 *p = val.X_add_number;
3461 }
3462
3463 getout:
3464
3465 /* In MRI mode, after an odd number of bytes, we must align to an
3466 even word boundary, unless the next instruction is a dc.b, ds.b
3467 or dcb.b. */
3468 if (flag_mri && (bytes & 1) != 0)
3469 mri_pending_align = 1;
3470
3471 demand_empty_rest_of_line ();
3472
3473 if (flag_mri)
3474 mri_comment_end (stop, stopc);
3475}
3476
b1766e7c
NC
3477void
3478s_nop (int ignore ATTRIBUTE_UNUSED)
3479{
058430b4
AM
3480 expressionS exp;
3481 fragS *start;
3482 addressT start_off;
3483 offsetT frag_off;
3484
b1766e7c
NC
3485#ifdef md_flush_pending_output
3486 md_flush_pending_output ();
3487#endif
3488
b1766e7c 3489 SKIP_WHITESPACE ();
058430b4 3490 expression (&exp);
b1766e7c
NC
3491 demand_empty_rest_of_line ();
3492
058430b4
AM
3493 start = frag_now;
3494 start_off = frag_now_fix ();
3495 do
3496 {
b1766e7c 3497#ifdef md_emit_single_noop
058430b4 3498 md_emit_single_noop;
b1766e7c 3499#else
058430b4 3500 char *nop;
b1766e7c
NC
3501
3502#ifndef md_single_noop_insn
3503#define md_single_noop_insn "nop"
3504#endif
058430b4
AM
3505 /* md_assemble might modify its argument, so
3506 we must pass it a string that is writable. */
3507 if (asprintf (&nop, "%s", md_single_noop_insn) < 0)
3508 as_fatal ("%s", xstrerror (errno));
b1766e7c 3509
058430b4
AM
3510 /* Some targets assume that they can update input_line_pointer
3511 inside md_assemble, and, worse, that they can leave it
3512 assigned to the string pointer that was provided as an
3513 argument. So preserve ilp here. */
3514 char *saved_ilp = input_line_pointer;
3515 md_assemble (nop);
3516 input_line_pointer = saved_ilp;
3517 free (nop);
3518#endif
3519#ifdef md_flush_pending_output
3520 md_flush_pending_output ();
b1766e7c 3521#endif
058430b4
AM
3522 } while (exp.X_op == O_constant
3523 && exp.X_add_number > 0
3524 && frag_offset_ignore_align_p (start, frag_now, &frag_off)
3525 && frag_off + frag_now_fix () < start_off + exp.X_add_number);
b1766e7c
NC
3526}
3527
62a02d25 3528void
8f065d3b 3529s_nops (int ignore ATTRIBUTE_UNUSED)
62a02d25
L
3530{
3531 expressionS exp;
3532 expressionS val;
3533
3534#ifdef md_flush_pending_output
3535 md_flush_pending_output ();
3536#endif
3537
b1766e7c 3538 SKIP_WHITESPACE ();
62a02d25 3539 expression (&exp);
b1766e7c
NC
3540 /* Note - this expression is tested for an absolute value in
3541 write.c:relax_segment(). */
62a02d25 3542
b1766e7c 3543 SKIP_WHITESPACE ();
62a02d25
L
3544 if (*input_line_pointer == ',')
3545 {
3546 ++input_line_pointer;
3547 expression (&val);
3548 }
3549 else
3550 {
3551 val.X_op = O_constant;
3552 val.X_add_number = 0;
3553 }
3554
b1766e7c 3555 if (val.X_op != O_constant)
62a02d25 3556 {
b1766e7c
NC
3557 as_bad (_("unsupported variable nop control in .nops directive"));
3558 val.X_op = O_constant;
3559 val.X_add_number = 0;
3560 }
3561 else if (val.X_add_number < 0)
3562 {
3563 as_warn (_("negative nop control byte, ignored"));
3564 val.X_add_number = 0;
62a02d25 3565 }
62a02d25
L
3566
3567 demand_empty_rest_of_line ();
b1766e7c
NC
3568
3569 if (need_pass_2)
3570 /* Ignore this directive if we are going to perform a second pass. */
3571 return;
3572
3573 /* Store the no-op instruction control byte in the first byte of frag. */
3574 char *p;
3575 symbolS *sym = make_expr_symbol (&exp);
3576 p = frag_var (rs_space_nop, 1, 1, (relax_substateT) 0,
3577 sym, (offsetT) 0, (char *) 0);
3578 *p = val.X_add_number;
62a02d25
L
3579}
3580
bcd17d4f
JB
3581/* Obtain the size of a floating point number, given a type. */
3582
3583static int
3584float_length (int float_type, int *pad_p)
3585{
3586 int length, pad = 0;
3587
3588 switch (float_type)
3589 {
3590 case 'b':
3591 case 'B':
3592 case 'h':
3593 case 'H':
3594 length = 2;
3595 break;
3596
3597 case 'f':
3598 case 'F':
3599 case 's':
3600 case 'S':
3601 length = 4;
3602 break;
3603
3604 case 'd':
3605 case 'D':
3606 case 'r':
3607 case 'R':
3608 length = 8;
3609 break;
3610
3611 case 'x':
3612 case 'X':
3613#ifdef X_PRECISION
3614 length = X_PRECISION * sizeof (LITTLENUM_TYPE);
3615 pad = X_PRECISION_PAD * sizeof (LITTLENUM_TYPE);
3616 if (!length)
3617#endif
3618 length = 12;
3619 break;
3620
3621 case 'p':
3622 case 'P':
3623#ifdef P_PRECISION
3624 length = P_PRECISION * sizeof (LITTLENUM_TYPE);
3625 pad = P_PRECISION_PAD * sizeof (LITTLENUM_TYPE);
3626 if (!length)
3627#endif
3628 length = 12;
3629 break;
3630
3631 default:
3632 as_bad (_("unknown floating type '%c'"), float_type);
3633 length = -1;
3634 break;
3635 }
3636
3637 if (pad_p)
3638 *pad_p = pad;
3639
3640 return length;
3641}
3642
bb32eac5
JB
3643static int
3644parse_one_float (int float_type, char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT])
3645{
3646 int length;
3647
3648 SKIP_WHITESPACE ();
3649
3650 /* Skip any 0{letter} that may be present. Don't even check if the
3651 letter is legal. Someone may invent a "z" format and this routine
3652 has no use for such information. Lusers beware: you get
3653 diagnostics if your input is ill-conditioned. */
3654 if (input_line_pointer[0] == '0'
3655 && ISALPHA (input_line_pointer[1]))
3656 input_line_pointer += 2;
3657
3658 /* Accept :xxxx, where the x's are hex digits, for a floating point
3659 with the exact digits specified. */
3660 if (input_line_pointer[0] == ':')
3661 {
3662 ++input_line_pointer;
3663 length = hex_float (float_type, temp);
3664 if (length < 0)
3665 {
3666 ignore_rest_of_line ();
3667 return length;
3668 }
3669 }
3670 else
3671 {
3672 const char *err;
3673
3674 err = md_atof (float_type, temp, &length);
3675 know (length <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
3676 know (err != NULL || length > 0);
3677 if (err)
3678 {
3679 as_bad (_("bad floating literal: %s"), err);
3680 ignore_rest_of_line ();
3681 return -1;
3682 }
3683 }
3684
3685 return length;
3686}
3687
252b5132
RH
3688/* This is like s_space, but the value is a floating point number with
3689 the given precision. This is for the MRI dcb.s pseudo-op and
3690 friends. */
3691
3692void
39e6acbd 3693s_float_space (int float_type)
252b5132
RH
3694{
3695 offsetT count;
3696 int flen;
3697 char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
3698 char *stop = NULL;
fb25138b 3699 char stopc = 0;
252b5132 3700
cc3f603a
JM
3701#ifdef md_cons_align
3702 md_cons_align (1);
3703#endif
3704
252b5132
RH
3705 if (flag_mri)
3706 stop = mri_comment_field (&stopc);
3707
3708 count = get_absolute_expression ();
3709
3710 SKIP_WHITESPACE ();
3711 if (*input_line_pointer != ',')
3712 {
bcd17d4f
JB
3713 int pad;
3714
3715 flen = float_length (float_type, &pad);
3716 if (flen >= 0)
3717 memset (temp, 0, flen += pad);
252b5132 3718 }
bcd17d4f
JB
3719 else
3720 {
3721 ++input_line_pointer;
252b5132 3722
bcd17d4f
JB
3723 flen = parse_one_float (float_type, temp);
3724 }
252b5132 3725
bb32eac5 3726 if (flen < 0)
252b5132 3727 {
bb32eac5
JB
3728 if (flag_mri)
3729 mri_comment_end (stop, stopc);
3730 return;
252b5132
RH
3731 }
3732
3733 while (--count >= 0)
3734 {
3735 char *p;
3736
3737 p = frag_more (flen);
3738 memcpy (p, temp, (unsigned int) flen);
3739 }
3740
3741 demand_empty_rest_of_line ();
3742
3743 if (flag_mri)
3744 mri_comment_end (stop, stopc);
3745}
3746
3747/* Handle the .struct pseudo-op, as found in MIPS assemblers. */
3748
3749void
39e6acbd 3750s_struct (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
3751{
3752 char *stop = NULL;
fb25138b 3753 char stopc = 0;
252b5132
RH
3754
3755 if (flag_mri)
3756 stop = mri_comment_field (&stopc);
3757 abs_section_offset = get_absolute_expression ();
a2902af6
TS
3758#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
3759 /* The ELF backend needs to know that we are changing sections, so
3760 that .previous works correctly. */
f43abd2b 3761 if (IS_ELF)
a2902af6
TS
3762 obj_elf_section_change_hook ();
3763#endif
252b5132
RH
3764 subseg_set (absolute_section, 0);
3765 demand_empty_rest_of_line ();
3766 if (flag_mri)
3767 mri_comment_end (stop, stopc);
3768}
3769
3770void
39e6acbd 3771s_text (int ignore ATTRIBUTE_UNUSED)
252b5132 3772{
3d540e93 3773 int temp;
252b5132
RH
3774
3775 temp = get_absolute_expression ();
3776 subseg_set (text_section, (subsegT) temp);
3777 demand_empty_rest_of_line ();
041ff4dd 3778}
06e77878
AO
3779
3780/* .weakref x, y sets x as an alias to y that, as long as y is not
3781 referenced directly, will cause y to become a weak symbol. */
3782void
3783s_weakref (int ignore ATTRIBUTE_UNUSED)
3784{
3785 char *name;
06e77878
AO
3786 symbolS *symbolP;
3787 symbolS *symbolP2;
3788 expressionS exp;
3789
7bfd842d
NC
3790 if ((name = read_symbol_name ()) == NULL)
3791 return;
06e77878
AO
3792
3793 symbolP = symbol_find_or_make (name);
3794
b54788f8
AO
3795 if (S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
3796 {
89cdfe57 3797 if (!S_IS_VOLATILE (symbolP))
92757bc9
JB
3798 {
3799 as_bad (_("symbol `%s' is already defined"), name);
7bfd842d 3800 goto err_out;
92757bc9 3801 }
89cdfe57 3802 symbolP = symbol_clone (symbolP, 1);
92757bc9 3803 S_CLEAR_VOLATILE (symbolP);
b54788f8
AO
3804 }
3805
06e77878
AO
3806 SKIP_WHITESPACE ();
3807
3808 if (*input_line_pointer != ',')
3809 {
06e77878 3810 as_bad (_("expected comma after \"%s\""), name);
7bfd842d 3811 goto err_out;
06e77878
AO
3812 }
3813
3814 input_line_pointer++;
3815
3816 SKIP_WHITESPACE ();
7bfd842d 3817 free (name);
06e77878 3818
7bfd842d
NC
3819 if ((name = read_symbol_name ()) == NULL)
3820 return;
06e77878
AO
3821
3822 if ((symbolP2 = symbol_find_noref (name, 1)) == NULL
3823 && (symbolP2 = md_undefined_symbol (name)) == NULL)
3824 {
3825 symbolP2 = symbol_find_or_make (name);
3826 S_SET_WEAKREFD (symbolP2);
3827 }
3828 else
3829 {
3830 symbolS *symp = symbolP2;
3831
3832 while (S_IS_WEAKREFR (symp) && symp != symbolP)
3833 {
3834 expressionS *expP = symbol_get_value_expression (symp);
3835
9c2799c2 3836 gas_assert (expP->X_op == O_symbol
06e77878
AO
3837 && expP->X_add_number == 0);
3838 symp = expP->X_add_symbol;
3839 }
3840 if (symp == symbolP)
3841 {
3842 char *loop;
3843
3844 loop = concat (S_GET_NAME (symbolP),
1bf57e9f 3845 " => ", S_GET_NAME (symbolP2), (const char *) NULL);
06e77878
AO
3846
3847 symp = symbolP2;
3848 while (symp != symbolP)
3849 {
3850 char *old_loop = loop;
7bfd842d 3851
06e77878 3852 symp = symbol_get_value_expression (symp)->X_add_symbol;
1bf57e9f
AM
3853 loop = concat (loop, " => ", S_GET_NAME (symp),
3854 (const char *) NULL);
06e77878
AO
3855 free (old_loop);
3856 }
3857
3858 as_bad (_("%s: would close weakref loop: %s"),
3859 S_GET_NAME (symbolP), loop);
3860
3861 free (loop);
7bfd842d 3862 free (name);
06e77878
AO
3863 ignore_rest_of_line ();
3864 return;
3865 }
3866
3867 /* Short-circuiting instead of just checking here might speed
3868 things up a tiny little bit, but loop error messages would
3869 miss intermediate links. */
3870 /* symbolP2 = symp; */
3871 }
3872
06e77878
AO
3873 memset (&exp, 0, sizeof (exp));
3874 exp.X_op = O_symbol;
3875 exp.X_add_symbol = symbolP2;
3876
3877 S_SET_SEGMENT (symbolP, undefined_section);
3878 symbol_set_value_expression (symbolP, &exp);
3879 symbol_set_frag (symbolP, &zero_address_frag);
3880 S_SET_WEAKREFR (symbolP);
3881
3882 demand_empty_rest_of_line ();
7bfd842d
NC
3883 free (name);
3884 return;
3885
3886 err_out:
3887 ignore_rest_of_line ();
3888 free (name);
3889 return;
06e77878 3890}
252b5132 3891\f
c95b35a9
NS
3892
3893/* Verify that we are at the end of a line. If not, issue an error and
bdcd4568
AM
3894 skip to EOL. This function may leave input_line_pointer one past
3895 buffer_limit, so should not be called from places that may
3896 dereference input_line_pointer unconditionally. Note that when the
3897 gas parser is switched to handling a string (where buffer_limit
3898 should be the size of the string excluding the NUL terminator) this
3899 will be one past the NUL; is_end_of_line(0) returns true. */
c95b35a9 3900
041ff4dd 3901void
39e6acbd 3902demand_empty_rest_of_line (void)
252b5132
RH
3903{
3904 SKIP_WHITESPACE ();
bdcd4568
AM
3905 if (input_line_pointer > buffer_limit)
3906 return;
252b5132 3907 if (is_end_of_line[(unsigned char) *input_line_pointer])
041ff4dd 3908 input_line_pointer++;
252b5132 3909 else
252b5132 3910 {
3882b010 3911 if (ISPRINT (*input_line_pointer))
c95b35a9 3912 as_bad (_("junk at end of line, first unrecognized character is `%c'"),
0e389e77 3913 *input_line_pointer);
252b5132 3914 else
c95b35a9 3915 as_bad (_("junk at end of line, first unrecognized character valued 0x%x"),
0e389e77 3916 *input_line_pointer);
c95b35a9 3917 ignore_rest_of_line ();
252b5132 3918 }
c95b35a9 3919 /* Return pointing just after end-of-line. */
c95b35a9
NS
3920}
3921
3922/* Silently advance to the end of line. Use this after already having
bdcd4568
AM
3923 issued an error about something bad. Like demand_empty_rest_of_line,
3924 this function may leave input_line_pointer one after buffer_limit;
3925 Don't call it from within expression parsing code in an attempt to
3926 silence further errors. */
c95b35a9
NS
3927
3928void
3929ignore_rest_of_line (void)
3930{
bdcd4568 3931 while (input_line_pointer <= buffer_limit)
0d1064fa
AM
3932 if (is_end_of_line[(unsigned char) *input_line_pointer++])
3933 break;
041ff4dd 3934 /* Return pointing just after end-of-line. */
252b5132
RH
3935}
3936
be95a9c1
AM
3937/* Sets frag for given symbol to zero_address_frag, except when the
3938 symbol frag is already set to a dummy listing frag. */
3939
3940static void
3941set_zero_frag (symbolS *symbolP)
3942{
3943 if (symbol_get_frag (symbolP)->fr_type != rs_dummy)
3944 symbol_set_frag (symbolP, &zero_address_frag);
3945}
3946
041ff4dd 3947/* In: Pointer to a symbol.
d6415f6c 3948 Input_line_pointer->expression.
f0e652b4 3949
041ff4dd 3950 Out: Input_line_pointer->just after any whitespace after expression.
d6415f6c
AM
3951 Tried to set symbol to value of expression.
3952 Will change symbols type, value, and frag; */
041ff4dd 3953
252b5132 3954void
39e6acbd 3955pseudo_set (symbolS *symbolP)
252b5132
RH
3956{
3957 expressionS exp;
be95a9c1 3958 segT seg;
252b5132 3959
041ff4dd 3960 know (symbolP); /* NULL pointer is logic error. */
252b5132 3961
9497f5ac
NC
3962 if (!S_IS_FORWARD_REF (symbolP))
3963 (void) expression (&exp);
3964 else
3965 (void) deferred_expression (&exp);
252b5132
RH
3966
3967 if (exp.X_op == O_illegal)
0e389e77 3968 as_bad (_("illegal expression"));
252b5132 3969 else if (exp.X_op == O_absent)
0e389e77 3970 as_bad (_("missing expression"));
252b5132
RH
3971 else if (exp.X_op == O_big)
3972 {
3973 if (exp.X_add_number > 0)
0e389e77 3974 as_bad (_("bignum invalid"));
252b5132 3975 else
0e389e77 3976 as_bad (_("floating point number invalid"));
252b5132
RH
3977 }
3978 else if (exp.X_op == O_subtract
9497f5ac 3979 && !S_IS_FORWARD_REF (symbolP)
252b5132 3980 && SEG_NORMAL (S_GET_SEGMENT (exp.X_add_symbol))
2b47531b
ILT
3981 && (symbol_get_frag (exp.X_add_symbol)
3982 == symbol_get_frag (exp.X_op_symbol)))
252b5132
RH
3983 {
3984 exp.X_op = O_constant;
3985 exp.X_add_number = (S_GET_VALUE (exp.X_add_symbol)
3986 - S_GET_VALUE (exp.X_op_symbol));
3987 }
3988
be95a9c1
AM
3989 if (symbol_section_p (symbolP))
3990 {
3991 as_bad ("attempt to set value of section symbol");
3992 return;
3993 }
be95a9c1 3994
252b5132
RH
3995 switch (exp.X_op)
3996 {
3997 case O_illegal:
3998 case O_absent:
3999 case O_big:
4000 exp.X_add_number = 0;
4001 /* Fall through. */
4002 case O_constant:
4003 S_SET_SEGMENT (symbolP, absolute_section);
252b5132 4004 S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
be95a9c1 4005 set_zero_frag (symbolP);
252b5132
RH
4006 break;
4007
4008 case O_register:
97c4f2d9 4009#ifndef TC_GLOBAL_REGISTER_SYMBOL_OK
d0548f34
L
4010 if (S_IS_EXTERNAL (symbolP))
4011 {
4012 as_bad ("can't equate global symbol `%s' with register name",
4013 S_GET_NAME (symbolP));
4014 return;
4015 }
97c4f2d9 4016#endif
d50c498a
JB
4017 /* Make sure symbol_equated_p() recognizes the symbol as an equate. */
4018 exp.X_add_symbol = make_expr_symbol (&exp);
4019 exp.X_add_number = 0;
4020 exp.X_op = O_symbol;
00b37cc4 4021 symbol_set_value_expression (symbolP, &exp);
252b5132 4022 S_SET_SEGMENT (symbolP, reg_section);
be95a9c1 4023 set_zero_frag (symbolP);
252b5132
RH
4024 break;
4025
4026 case O_symbol:
be95a9c1
AM
4027 seg = S_GET_SEGMENT (exp.X_add_symbol);
4028 /* For x=undef+const, create an expression symbol.
4029 For x=x+const, just update x except when x is an undefined symbol
4030 For x=defined+const, evaluate x. */
4031 if (symbolP == exp.X_add_symbol
4032 && (seg != undefined_section
4033 || !symbol_constant_p (symbolP)))
4034 {
4035 *symbol_X_add_number (symbolP) += exp.X_add_number;
4036 break;
4037 }
9497f5ac 4038 else if (!S_IS_FORWARD_REF (symbolP) && seg != undefined_section)
252b5132
RH
4039 {
4040 symbolS *s = exp.X_add_symbol;
4041
60938e80 4042 if (S_IS_COMMON (s))
76db0a2e 4043 as_bad (_("`%s' can't be equated to common symbol `%s'"),
60938e80
L
4044 S_GET_NAME (symbolP), S_GET_NAME (s));
4045
be95a9c1
AM
4046 S_SET_SEGMENT (symbolP, seg);
4047 S_SET_VALUE (symbolP, exp.X_add_number + S_GET_VALUE (s));
2b47531b 4048 symbol_set_frag (symbolP, symbol_get_frag (s));
252b5132 4049 copy_symbol_attributes (symbolP, s);
be95a9c1 4050 break;
252b5132 4051 }
66bd02d3
AM
4052 S_SET_SEGMENT (symbolP, undefined_section);
4053 symbol_set_value_expression (symbolP, &exp);
f08e1e19 4054 copy_symbol_attributes (symbolP, exp.X_add_symbol);
66bd02d3
AM
4055 set_zero_frag (symbolP);
4056 break;
252b5132
RH
4057
4058 default:
aba4aa7d
AM
4059 /* The value is some complex expression. */
4060 S_SET_SEGMENT (symbolP, expr_section);
2b47531b 4061 symbol_set_value_expression (symbolP, &exp);
be95a9c1 4062 set_zero_frag (symbolP);
252b5132
RH
4063 break;
4064 }
4065}
4066\f
d6415f6c 4067/* cons()
f0e652b4 4068
041ff4dd
NC
4069 CONStruct more frag of .bytes, or .words etc.
4070 Should need_pass_2 be 1 then emit no frag(s).
4071 This understands EXPRESSIONS.
f0e652b4 4072
041ff4dd 4073 Bug (?)
f0e652b4 4074
041ff4dd
NC
4075 This has a split personality. We use expression() to read the
4076 value. We can detect if the value won't fit in a byte or word.
4077 But we can't detect if expression() discarded significant digits
4078 in the case of a long. Not worth the crocks required to fix it. */
252b5132
RH
4079
4080/* Select a parser for cons expressions. */
4081
4082/* Some targets need to parse the expression in various fancy ways.
4083 You can define TC_PARSE_CONS_EXPRESSION to do whatever you like
4084 (for example, the HPPA does this). Otherwise, you can define
252b5132
RH
4085 REPEAT_CONS_EXPRESSIONS to permit repeat counts. If none of these
4086 are defined, which is the normal case, then only simple expressions
4087 are permitted. */
4088
abd63a32 4089#ifdef TC_M68K
252b5132 4090static void
39e6acbd 4091parse_mri_cons (expressionS *exp, unsigned int nbytes);
abd63a32 4092#endif
252b5132
RH
4093
4094#ifndef TC_PARSE_CONS_EXPRESSION
252b5132 4095#ifdef REPEAT_CONS_EXPRESSIONS
62ebcb5c
AM
4096#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
4097 (parse_repeat_cons (EXP, NBYTES), TC_PARSE_CONS_RETURN_NONE)
252b5132 4098static void
39e6acbd 4099parse_repeat_cons (expressionS *exp, unsigned int nbytes);
252b5132
RH
4100#endif
4101
4102/* If we haven't gotten one yet, just call expression. */
4103#ifndef TC_PARSE_CONS_EXPRESSION
62ebcb5c
AM
4104#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
4105 (expression (EXP), TC_PARSE_CONS_RETURN_NONE)
252b5132
RH
4106#endif
4107#endif
4108
cdfbf930 4109void
b41b1f95
L
4110do_parse_cons_expression (expressionS *exp,
4111 int nbytes ATTRIBUTE_UNUSED)
cdfbf930 4112{
62ebcb5c 4113 (void) TC_PARSE_CONS_EXPRESSION (exp, nbytes);
cdfbf930
RH
4114}
4115
4116
041ff4dd
NC
4117/* Worker to do .byte etc statements.
4118 Clobbers input_line_pointer and checks end-of-line. */
4119
4120static void
3d540e93 4121cons_worker (int nbytes, /* 1=.byte, 2=.word, 4=.long. */
39e6acbd 4122 int rva)
252b5132
RH
4123{
4124 int c;
4125 expressionS exp;
4126 char *stop = NULL;
fb25138b 4127 char stopc = 0;
252b5132
RH
4128
4129#ifdef md_flush_pending_output
4130 md_flush_pending_output ();
4131#endif
4132
4133 if (flag_mri)
4134 stop = mri_comment_field (&stopc);
4135
4136 if (is_it_end_of_statement ())
4137 {
4138 demand_empty_rest_of_line ();
4139 if (flag_mri)
4140 mri_comment_end (stop, stopc);
4141 return;
4142 }
4143
cc1bc22a
AM
4144 if (nbytes == 0)
4145 nbytes = TC_ADDRESS_BYTES ();
cc1bc22a 4146
252b5132
RH
4147#ifdef md_cons_align
4148 md_cons_align (nbytes);
4149#endif
4150
4151 c = 0;
4152 do
4153 {
62ebcb5c 4154 TC_PARSE_CONS_RETURN_TYPE ret = TC_PARSE_CONS_RETURN_NONE;
bf7279d5
AM
4155#ifdef TC_CONS_FIX_CHECK
4156 fixS **cur_fix = &frchain_now->fix_tail;
4157
4158 if (*cur_fix != NULL)
4159 cur_fix = &(*cur_fix)->fx_next;
4160#endif
62ebcb5c 4161
abd63a32 4162#ifdef TC_M68K
252b5132
RH
4163 if (flag_m68k_mri)
4164 parse_mri_cons (&exp, (unsigned int) nbytes);
4165 else
abd63a32 4166#endif
fa94de6b 4167 {
d02603dc 4168#if 0
847d4311
NS
4169 if (*input_line_pointer == '"')
4170 {
4171 as_bad (_("unexpected `\"' in expression"));
4172 ignore_rest_of_line ();
4173 return;
4174 }
d02603dc 4175#endif
62ebcb5c 4176 ret = TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes);
847d4311 4177 }
252b5132
RH
4178
4179 if (rva)
4180 {
4181 if (exp.X_op == O_symbol)
4182 exp.X_op = O_symbol_rva;
4183 else
4184 as_fatal (_("rva without symbol"));
4185 }
62ebcb5c 4186 emit_expr_with_reloc (&exp, (unsigned int) nbytes, ret);
bf7279d5
AM
4187#ifdef TC_CONS_FIX_CHECK
4188 TC_CONS_FIX_CHECK (&exp, nbytes, *cur_fix);
4189#endif
252b5132
RH
4190 ++c;
4191 }
4192 while (*input_line_pointer++ == ',');
4193
4194 /* In MRI mode, after an odd number of bytes, we must align to an
4195 even word boundary, unless the next instruction is a dc.b, ds.b
4196 or dcb.b. */
4197 if (flag_mri && nbytes == 1 && (c & 1) != 0)
4198 mri_pending_align = 1;
4199
041ff4dd 4200 input_line_pointer--; /* Put terminator back into stream. */
252b5132
RH
4201
4202 demand_empty_rest_of_line ();
4203
4204 if (flag_mri)
4205 mri_comment_end (stop, stopc);
c7defc53
IB
4206
4207 /* Disallow hand-crafting instructions using .byte. FIXME - what about
4208 .word, .long etc ? */
4209 if (flag_synth_cfi && frchain_now && frchain_now->frch_ginsn_data
4210 && nbytes == 1)
4211 as_bad (_("SCFI: hand-crafting instructions not supported"));
252b5132
RH
4212}
4213
252b5132 4214void
39e6acbd 4215cons (int size)
252b5132
RH
4216{
4217 cons_worker (size, 0);
4218}
4219
041ff4dd 4220void
39e6acbd 4221s_rva (int size)
252b5132
RH
4222{
4223 cons_worker (size, 1);
4224}
4225
05e9452c
AM
4226/* .reloc offset, reloc_name, symbol+addend. */
4227
b38ead21 4228static void
05e9452c
AM
4229s_reloc (int ignore ATTRIBUTE_UNUSED)
4230{
4231 char *stop = NULL;
4232 char stopc = 0;
4233 expressionS exp;
4234 char *r_name;
4235 int c;
4236 struct reloc_list *reloc;
cd0bbe6e 4237 struct _bfd_rel { const char * name; bfd_reloc_code_real_type code; };
f049c189 4238 static const struct _bfd_rel bfd_relocs[] =
cd0bbe6e 4239 {
740bdc67 4240 { "NONE", BFD_RELOC_NONE },
cd0bbe6e 4241 { "8", BFD_RELOC_8 },
740bdc67
AM
4242 { "16", BFD_RELOC_16 },
4243 { "32", BFD_RELOC_32 },
4244 { "64", BFD_RELOC_64 }
4245 };
05e9452c 4246
8860a416 4247 reloc = XNEW (struct reloc_list);
05e9452c
AM
4248
4249 if (flag_mri)
4250 stop = mri_comment_field (&stopc);
4251
4252 expression (&exp);
4253 switch (exp.X_op)
4254 {
4255 case O_illegal:
4256 case O_absent:
4257 case O_big:
4258 case O_register:
4259 as_bad (_("missing or bad offset expression"));
4260 goto err_out;
4261 case O_constant:
4262 exp.X_add_symbol = section_symbol (now_seg);
d1bcae83
L
4263 /* Mark the section symbol used in relocation so that it will be
4264 included in the symbol table. */
4265 symbol_mark_used_in_reloc (exp.X_add_symbol);
05e9452c 4266 exp.X_op = O_symbol;
2b0f3761 4267 /* Fallthru */
05e9452c
AM
4268 case O_symbol:
4269 if (exp.X_add_number == 0)
4270 {
4271 reloc->u.a.offset_sym = exp.X_add_symbol;
4272 break;
4273 }
2b0f3761 4274 /* Fallthru */
05e9452c
AM
4275 default:
4276 reloc->u.a.offset_sym = make_expr_symbol (&exp);
4277 break;
4278 }
4279
4280 SKIP_WHITESPACE ();
4281 if (*input_line_pointer != ',')
4282 {
4283 as_bad (_("missing reloc type"));
4284 goto err_out;
4285 }
4286
4287 ++input_line_pointer;
4288 SKIP_WHITESPACE ();
d02603dc 4289 c = get_symbol_name (& r_name);
740bdc67
AM
4290 if (strncasecmp (r_name, "BFD_RELOC_", 10) == 0)
4291 {
4292 unsigned int i;
4293
4294 for (reloc->u.a.howto = NULL, i = 0; i < ARRAY_SIZE (bfd_relocs); i++)
4295 if (strcasecmp (r_name + 10, bfd_relocs[i].name) == 0)
4296 {
4297 reloc->u.a.howto = bfd_reloc_type_lookup (stdoutput,
4298 bfd_relocs[i].code);
4299 break;
4300 }
4301 }
4302 else
4303 reloc->u.a.howto = bfd_reloc_name_lookup (stdoutput, r_name);
05e9452c
AM
4304 *input_line_pointer = c;
4305 if (reloc->u.a.howto == NULL)
4306 {
4307 as_bad (_("unrecognized reloc type"));
4308 goto err_out;
4309 }
4310
4311 exp.X_op = O_absent;
d02603dc 4312 SKIP_WHITESPACE_AFTER_NAME ();
05e9452c
AM
4313 if (*input_line_pointer == ',')
4314 {
4315 ++input_line_pointer;
c188d0bb 4316 expression (&exp);
05e9452c
AM
4317 }
4318 switch (exp.X_op)
4319 {
4320 case O_illegal:
4321 case O_big:
4322 case O_register:
4323 as_bad (_("bad reloc expression"));
4324 err_out:
4325 ignore_rest_of_line ();
4326 free (reloc);
4327 if (flag_mri)
4328 mri_comment_end (stop, stopc);
4329 return;
4330 case O_absent:
4331 reloc->u.a.sym = NULL;
4332 reloc->u.a.addend = 0;
4333 break;
4334 case O_constant:
4335 reloc->u.a.sym = NULL;
4336 reloc->u.a.addend = exp.X_add_number;
4337 break;
4338 case O_symbol:
4339 reloc->u.a.sym = exp.X_add_symbol;
4340 reloc->u.a.addend = exp.X_add_number;
4341 break;
4342 default:
4343 reloc->u.a.sym = make_expr_symbol (&exp);
4344 reloc->u.a.addend = 0;
4345 break;
4346 }
4347
3b4dbbbf 4348 reloc->file = as_where (&reloc->line);
05e9452c
AM
4349 reloc->next = reloc_list;
4350 reloc_list = reloc;
4351
4352 demand_empty_rest_of_line ();
4353 if (flag_mri)
4354 mri_comment_end (stop, stopc);
4355}
4356
252b5132
RH
4357/* Put the contents of expression EXP into the object file using
4358 NBYTES bytes. If need_pass_2 is 1, this does nothing. */
4359
4360void
39e6acbd 4361emit_expr (expressionS *exp, unsigned int nbytes)
62ebcb5c
AM
4362{
4363 emit_expr_with_reloc (exp, nbytes, TC_PARSE_CONS_RETURN_NONE);
4364}
4365
4366void
4367emit_expr_with_reloc (expressionS *exp,
4368 unsigned int nbytes,
4369 TC_PARSE_CONS_RETURN_TYPE reloc)
252b5132
RH
4370{
4371 operatorT op;
3d540e93 4372 char *p;
252b5132
RH
4373 valueT extra_digit = 0;
4374
4375 /* Don't do anything if we are going to make another pass. */
4376 if (need_pass_2)
4377 return;
4378
4bc25101 4379 frag_grow (nbytes);
ed7d5d1a 4380 dot_value = frag_now_fix ();
8e723a10 4381 dot_frag = frag_now;
ed7d5d1a 4382
252b5132
RH
4383#ifndef NO_LISTING
4384#ifdef OBJ_ELF
4385 /* When gcc emits DWARF 1 debugging pseudo-ops, a line number will
4386 appear as a four byte positive constant in the .line section,
4387 followed by a 2 byte 0xffff. Look for that case here. */
f049c189
AM
4388 if (strcmp (segment_name (now_seg), ".line") != 0)
4389 dwarf_line = -1;
4390 else if (dwarf_line >= 0
4391 && nbytes == 2
4392 && exp->X_op == O_constant
4393 && (exp->X_add_number == -1 || exp->X_add_number == 0xffff))
4394 listing_source_line ((unsigned int) dwarf_line);
4395 else if (nbytes == 4
4396 && exp->X_op == O_constant
4397 && exp->X_add_number >= 0)
4398 dwarf_line = exp->X_add_number;
4399 else
4400 dwarf_line = -1;
252b5132
RH
4401
4402 /* When gcc emits DWARF 1 debugging pseudo-ops, a file name will
4403 appear as a 2 byte TAG_compile_unit (0x11) followed by a 2 byte
4404 AT_sibling (0x12) followed by a four byte address of the sibling
4405 followed by a 2 byte AT_name (0x38) followed by the name of the
4406 file. We look for that case here. */
f049c189
AM
4407 if (strcmp (segment_name (now_seg), ".debug") != 0)
4408 dwarf_file = 0;
4409 else if (dwarf_file == 0
4410 && nbytes == 2
4411 && exp->X_op == O_constant
4412 && exp->X_add_number == 0x11)
4413 dwarf_file = 1;
4414 else if (dwarf_file == 1
4415 && nbytes == 2
4416 && exp->X_op == O_constant
4417 && exp->X_add_number == 0x12)
4418 dwarf_file = 2;
4419 else if (dwarf_file == 2
4420 && nbytes == 4)
4421 dwarf_file = 3;
4422 else if (dwarf_file == 3
4423 && nbytes == 2
4424 && exp->X_op == O_constant
4425 && exp->X_add_number == 0x38)
4426 dwarf_file = 4;
4427 else
4428 dwarf_file = 0;
4429
4430 /* The variable dwarf_file_string tells stringer that the string
4431 may be the name of the source file. */
4432 if (dwarf_file == 4)
4433 dwarf_file_string = 1;
4434 else
4435 dwarf_file_string = 0;
252b5132
RH
4436#endif
4437#endif
4438
4439 if (check_eh_frame (exp, &nbytes))
4440 return;
4441
4442 op = exp->X_op;
4443
252b5132
RH
4444 /* Handle a negative bignum. */
4445 if (op == O_uminus
4446 && exp->X_add_number == 0
2b47531b
ILT
4447 && symbol_get_value_expression (exp->X_add_symbol)->X_op == O_big
4448 && symbol_get_value_expression (exp->X_add_symbol)->X_add_number > 0)
252b5132
RH
4449 {
4450 int i;
4451 unsigned long carry;
4452
2b47531b 4453 exp = symbol_get_value_expression (exp->X_add_symbol);
252b5132
RH
4454
4455 /* Negate the bignum: one's complement each digit and add 1. */
4456 carry = 1;
4457 for (i = 0; i < exp->X_add_number; i++)
4458 {
4459 unsigned long next;
4460
041ff4dd 4461 next = (((~(generic_bignum[i] & LITTLENUM_MASK))
252b5132
RH
4462 & LITTLENUM_MASK)
4463 + carry);
4464 generic_bignum[i] = next & LITTLENUM_MASK;
4465 carry = next >> LITTLENUM_NUMBER_OF_BITS;
4466 }
4467
4468 /* We can ignore any carry out, because it will be handled by
4469 extra_digit if it is needed. */
4470
4471 extra_digit = (valueT) -1;
4472 op = O_big;
4473 }
4474
4475 if (op == O_absent || op == O_illegal)
4476 {
4477 as_warn (_("zero assumed for missing expression"));
4478 exp->X_add_number = 0;
4479 op = O_constant;
4480 }
4481 else if (op == O_big && exp->X_add_number <= 0)
4482 {
0e389e77 4483 as_bad (_("floating point number invalid"));
252b5132
RH
4484 exp->X_add_number = 0;
4485 op = O_constant;
4486 }
4487 else if (op == O_register)
4488 {
4489 as_warn (_("register value used as expression"));
4490 op = O_constant;
4491 }
4492
ec9ab52c
JB
4493 /* Allow `.word 0' in the absolute section. */
4494 if (now_seg == absolute_section)
4495 {
4496 if (op != O_constant || exp->X_add_number != 0)
4497 as_bad (_("attempt to store value in absolute section"));
4498 abs_section_offset += nbytes;
4499 return;
4500 }
4501
4502 /* Allow `.word 0' in BSS style sections. */
4503 if ((op != O_constant || exp->X_add_number != 0) && in_bss ())
4504 as_bad (_("attempt to store non-zero value in section `%s'"),
4505 segment_name (now_seg));
4506
252b5132
RH
4507 p = frag_more ((int) nbytes);
4508
62ebcb5c
AM
4509 if (reloc != TC_PARSE_CONS_RETURN_NONE)
4510 {
4511 emit_expr_fix (exp, nbytes, frag_now, p, reloc);
4512 return;
4513 }
4514
252b5132
RH
4515#ifndef WORKING_DOT_WORD
4516 /* If we have the difference of two symbols in a word, save it on
4517 the broken_words list. See the code in write.c. */
4518 if (op == O_subtract && nbytes == 2)
4519 {
4520 struct broken_word *x;
4521
8860a416 4522 x = XNEW (struct broken_word);
252b5132
RH
4523 x->next_broken_word = broken_words;
4524 broken_words = x;
4525 x->seg = now_seg;
4526 x->subseg = now_subseg;
4527 x->frag = frag_now;
4528 x->word_goes_here = p;
4529 x->dispfrag = 0;
4530 x->add = exp->X_add_symbol;
4531 x->sub = exp->X_op_symbol;
4532 x->addnum = exp->X_add_number;
4533 x->added = 0;
dc59a897 4534 x->use_jump = 0;
252b5132
RH
4535 new_broken_words++;
4536 return;
4537 }
4538#endif
4539
4540 /* If we have an integer, but the number of bytes is too large to
4541 pass to md_number_to_chars, handle it as a bignum. */
4542 if (op == O_constant && nbytes > sizeof (valueT))
4543 {
e5604d79 4544 extra_digit = exp->X_unsigned ? 0 : -1;
956a6ba3 4545 convert_to_bignum (exp, !exp->X_unsigned);
e5604d79 4546 op = O_big;
252b5132
RH
4547 }
4548
4549 if (op == O_constant)
4550 {
3d540e93
NC
4551 valueT get;
4552 valueT use;
4553 valueT mask;
3d540e93 4554 valueT unmask;
252b5132
RH
4555
4556 /* JF << of >= number of bits in the object is undefined. In
041ff4dd 4557 particular SPARC (Sun 4) has problems. */
252b5132
RH
4558 if (nbytes >= sizeof (valueT))
4559 {
4504a634 4560 know (nbytes == sizeof (valueT));
252b5132 4561 mask = 0;
252b5132
RH
4562 }
4563 else
4564 {
041ff4dd 4565 /* Don't store these bits. */
252b5132 4566 mask = ~(valueT) 0 << (BITS_PER_CHAR * nbytes);
252b5132
RH
4567 }
4568
041ff4dd 4569 unmask = ~mask; /* Do store these bits. */
252b5132
RH
4570
4571#ifdef NEVER
4572 "Do this mod if you want every overflow check to assume SIGNED 2's complement data.";
041ff4dd 4573 mask = ~(unmask >> 1); /* Includes sign bit now. */
252b5132
RH
4574#endif
4575
4576 get = exp->X_add_number;
4577 use = get & unmask;
4504a634 4578 if ((get & mask) != 0 && (-get & mask) != 0)
5f2b6bc9
NC
4579 {
4580 /* Leading bits contain both 0s & 1s. */
f493c217
AM
4581 as_warn (_("value 0x%" PRIx64 " truncated to 0x%" PRIx64),
4582 (uint64_t) get, (uint64_t) use);
252b5132 4583 }
041ff4dd 4584 /* Put bytes in right order. */
252b5132
RH
4585 md_number_to_chars (p, use, (int) nbytes);
4586 }
4587 else if (op == O_big)
4588 {
4589 unsigned int size;
4590 LITTLENUM_TYPE *nums;
4591
252b5132
RH
4592 size = exp->X_add_number * CHARS_PER_LITTLENUM;
4593 if (nbytes < size)
4594 {
93d90f46 4595 int i = nbytes / CHARS_PER_LITTLENUM;
5f2b6bc9 4596
93d90f46
AM
4597 if (i != 0)
4598 {
4599 LITTLENUM_TYPE sign = 0;
4600 if ((generic_bignum[--i]
4601 & (1 << (LITTLENUM_NUMBER_OF_BITS - 1))) != 0)
4602 sign = ~(LITTLENUM_TYPE) 0;
5f2b6bc9 4603
93d90f46
AM
4604 while (++i < exp->X_add_number)
4605 if (generic_bignum[i] != sign)
4606 break;
4607 }
5f2b6bc9
NC
4608 else if (nbytes == 1)
4609 {
4610 /* We have nbytes == 1 and CHARS_PER_LITTLENUM == 2 (probably).
4611 Check that bits 8.. of generic_bignum[0] match bit 7
4612 and that they match all of generic_bignum[1..exp->X_add_number]. */
4613 LITTLENUM_TYPE sign = (generic_bignum[0] & (1 << 7)) ? -1 : 0;
4614 LITTLENUM_TYPE himask = LITTLENUM_MASK & ~ 0xFF;
4615
4616 if ((generic_bignum[0] & himask) == (sign & himask))
4617 {
4618 while (++i < exp->X_add_number)
4619 if (generic_bignum[i] != sign)
4620 break;
4621 }
4622 }
4623
93d90f46 4624 if (i < exp->X_add_number)
992a06ee
AM
4625 as_warn (ngettext ("bignum truncated to %d byte",
4626 "bignum truncated to %d bytes",
4627 nbytes),
4628 nbytes);
252b5132
RH
4629 size = nbytes;
4630 }
4631
93d90f46
AM
4632 if (nbytes == 1)
4633 {
4634 md_number_to_chars (p, (valueT) generic_bignum[0], 1);
4635 return;
4636 }
4637 know (nbytes % CHARS_PER_LITTLENUM == 0);
4638
252b5132
RH
4639 if (target_big_endian)
4640 {
4641 while (nbytes > size)
4642 {
4643 md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
4644 nbytes -= CHARS_PER_LITTLENUM;
4645 p += CHARS_PER_LITTLENUM;
4646 }
4647
4648 nums = generic_bignum + size / CHARS_PER_LITTLENUM;
ceac3f62 4649 while (size >= CHARS_PER_LITTLENUM)
252b5132
RH
4650 {
4651 --nums;
4652 md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
4653 size -= CHARS_PER_LITTLENUM;
4654 p += CHARS_PER_LITTLENUM;
4655 }
4656 }
4657 else
4658 {
4659 nums = generic_bignum;
ceac3f62 4660 while (size >= CHARS_PER_LITTLENUM)
252b5132
RH
4661 {
4662 md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
4663 ++nums;
4664 size -= CHARS_PER_LITTLENUM;
4665 p += CHARS_PER_LITTLENUM;
4666 nbytes -= CHARS_PER_LITTLENUM;
4667 }
4668
ceac3f62 4669 while (nbytes >= CHARS_PER_LITTLENUM)
252b5132
RH
4670 {
4671 md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
4672 nbytes -= CHARS_PER_LITTLENUM;
4673 p += CHARS_PER_LITTLENUM;
4674 }
4675 }
4676 }
4677 else
62ebcb5c 4678 emit_expr_fix (exp, nbytes, frag_now, p, TC_PARSE_CONS_RETURN_NONE);
7ddd14de
BW
4679}
4680
4681void
62ebcb5c 4682emit_expr_fix (expressionS *exp, unsigned int nbytes, fragS *frag, char *p,
00c06fdc 4683 TC_PARSE_CONS_RETURN_TYPE r ATTRIBUTE_UNUSED)
7ddd14de 4684{
62ebcb5c
AM
4685 int offset = 0;
4686 unsigned int size = nbytes;
4687
4688 memset (p, 0, size);
252b5132 4689
7ddd14de 4690 /* Generate a fixS to record the symbol value. */
252b5132 4691
252b5132 4692#ifdef TC_CONS_FIX_NEW
62ebcb5c 4693 TC_CONS_FIX_NEW (frag, p - frag->fr_literal + offset, size, exp, r);
252b5132 4694#else
62ebcb5c
AM
4695 if (r != TC_PARSE_CONS_RETURN_NONE)
4696 {
4697 reloc_howto_type *reloc_howto;
252b5132 4698
62ebcb5c
AM
4699 reloc_howto = bfd_reloc_type_lookup (stdoutput, r);
4700 size = bfd_get_reloc_size (reloc_howto);
4701
4702 if (size > nbytes)
4703 {
992a06ee
AM
4704 as_bad (ngettext ("%s relocations do not fit in %u byte",
4705 "%s relocations do not fit in %u bytes",
4706 nbytes),
62ebcb5c
AM
4707 reloc_howto->name, nbytes);
4708 return;
4709 }
4710 else if (target_big_endian)
4711 offset = nbytes - size;
4712 }
4713 else
4714 switch (size)
7ddd14de
BW
4715 {
4716 case 1:
4717 r = BFD_RELOC_8;
4718 break;
4719 case 2:
4720 r = BFD_RELOC_16;
4721 break;
d4f4f3fb
AM
4722 case 3:
4723 r = BFD_RELOC_24;
4724 break;
7ddd14de
BW
4725 case 4:
4726 r = BFD_RELOC_32;
4727 break;
4728 case 8:
4729 r = BFD_RELOC_64;
4730 break;
4731 default:
62ebcb5c
AM
4732 as_bad (_("unsupported BFD relocation size %u"), size);
4733 return;
252b5132 4734 }
62ebcb5c
AM
4735 fix_new_exp (frag, p - frag->fr_literal + offset, size,
4736 exp, 0, r);
252b5132 4737#endif
252b5132
RH
4738}
4739\f
252b5132
RH
4740/* Handle an MRI style string expression. */
4741
abd63a32 4742#ifdef TC_M68K
252b5132 4743static void
62ebcb5c 4744parse_mri_cons (expressionS *exp, unsigned int nbytes)
252b5132
RH
4745{
4746 if (*input_line_pointer != '\''
4747 && (input_line_pointer[1] != '\''
4748 || (*input_line_pointer != 'A'
4749 && *input_line_pointer != 'E')))
1e539319 4750 (void) TC_PARSE_CONS_EXPRESSION (exp, nbytes);
252b5132
RH
4751 else
4752 {
4753 unsigned int scan;
4754 unsigned int result = 0;
4755
4756 /* An MRI style string. Cut into as many bytes as will fit into
4757 a nbyte chunk, left justify if necessary, and separate with
4758 commas so we can try again later. */
4759 if (*input_line_pointer == 'A')
4760 ++input_line_pointer;
4761 else if (*input_line_pointer == 'E')
4762 {
4763 as_bad (_("EBCDIC constants are not supported"));
4764 ++input_line_pointer;
4765 }
4766
4767 input_line_pointer++;
4768 for (scan = 0; scan < nbytes; scan++)
4769 {
4770 if (*input_line_pointer == '\'')
4771 {
4772 if (input_line_pointer[1] == '\'')
4773 {
4774 input_line_pointer++;
4775 }
4776 else
4777 break;
4778 }
4779 result = (result << 8) | (*input_line_pointer++);
4780 }
4781
041ff4dd 4782 /* Left justify. */
252b5132
RH
4783 while (scan < nbytes)
4784 {
4785 result <<= 8;
4786 scan++;
4787 }
f0e652b4 4788
041ff4dd 4789 /* Create correct expression. */
252b5132
RH
4790 exp->X_op = O_constant;
4791 exp->X_add_number = result;
f0e652b4 4792
041ff4dd 4793 /* Fake it so that we can read the next char too. */
252b5132
RH
4794 if (input_line_pointer[0] != '\'' ||
4795 (input_line_pointer[0] == '\'' && input_line_pointer[1] == '\''))
4796 {
4797 input_line_pointer -= 2;
4798 input_line_pointer[0] = ',';
4799 input_line_pointer[1] = '\'';
4800 }
4801 else
4802 input_line_pointer++;
4803 }
4804}
abd63a32 4805#endif /* TC_M68K */
252b5132
RH
4806\f
4807#ifdef REPEAT_CONS_EXPRESSIONS
4808
4809/* Parse a repeat expression for cons. This is used by the MIPS
4810 assembler. The format is NUMBER:COUNT; NUMBER appears in the
4811 object file COUNT times.
4812
4813 To use this for a target, define REPEAT_CONS_EXPRESSIONS. */
4814
4815static void
e046cf80 4816parse_repeat_cons (expressionS *exp, unsigned int nbytes)
252b5132
RH
4817{
4818 expressionS count;
3d540e93 4819 int i;
252b5132
RH
4820
4821 expression (exp);
4822
4823 if (*input_line_pointer != ':')
4824 {
4825 /* No repeat count. */
4826 return;
4827 }
4828
4829 ++input_line_pointer;
4830 expression (&count);
4831 if (count.X_op != O_constant
4832 || count.X_add_number <= 0)
4833 {
0e389e77 4834 as_warn (_("unresolvable or nonpositive repeat count; using 1"));
252b5132
RH
4835 return;
4836 }
4837
4838 /* The cons function is going to output this expression once. So we
4839 output it count - 1 times. */
4840 for (i = count.X_add_number - 1; i > 0; i--)
4841 emit_expr (exp, nbytes);
4842}
4843
4844#endif /* REPEAT_CONS_EXPRESSIONS */
4845\f
4846/* Parse a floating point number represented as a hex constant. This
4847 permits users to specify the exact bits they want in the floating
4848 point number. */
4849
4850static int
39e6acbd 4851hex_float (int float_type, char *bytes)
252b5132 4852{
bcd17d4f 4853 int pad, length = float_length (float_type, &pad);
252b5132
RH
4854 int i;
4855
bcd17d4f
JB
4856 if (length < 0)
4857 return length;
252b5132
RH
4858
4859 /* It would be nice if we could go through expression to parse the
4860 hex constant, but if we get a bignum it's a pain to sort it into
4861 the buffer correctly. */
4862 i = 0;
4863 while (hex_p (*input_line_pointer) || *input_line_pointer == '_')
4864 {
4865 int d;
4866
4867 /* The MRI assembler accepts arbitrary underscores strewn about
041ff4dd 4868 through the hex constant, so we ignore them as well. */
252b5132
RH
4869 if (*input_line_pointer == '_')
4870 {
4871 ++input_line_pointer;
4872 continue;
4873 }
4874
4875 if (i >= length)
4876 {
0e389e77 4877 as_warn (_("floating point constant too large"));
252b5132
RH
4878 return -1;
4879 }
4880 d = hex_value (*input_line_pointer) << 4;
4881 ++input_line_pointer;
4882 while (*input_line_pointer == '_')
4883 ++input_line_pointer;
4884 if (hex_p (*input_line_pointer))
4885 {
4886 d += hex_value (*input_line_pointer);
4887 ++input_line_pointer;
4888 }
4889 if (target_big_endian)
4890 bytes[i] = d;
4891 else
4892 bytes[length - i - 1] = d;
4893 ++i;
4894 }
4895
4896 if (i < length)
4897 {
4898 if (target_big_endian)
4899 memset (bytes + i, 0, length - i);
4900 else
4901 memset (bytes, 0, length - i);
4902 }
4903
8f2200fe
JB
4904 memset (bytes + length, 0, pad);
4905
4906 return length + pad;
252b5132
RH
4907}
4908
d6415f6c 4909/* float_cons()
f0e652b4 4910
041ff4dd
NC
4911 CONStruct some more frag chars of .floats .ffloats etc.
4912 Makes 0 or more new frags.
4913 If need_pass_2 == 1, no frags are emitted.
4914 This understands only floating literals, not expressions. Sorry.
f0e652b4 4915
041ff4dd
NC
4916 A floating constant is defined by atof_generic(), except it is preceded
4917 by 0d 0f 0g or 0h. After observing the STRANGE way my BSD AS does its
4918 reading, I decided to be incompatible. This always tries to give you
4919 rounded bits to the precision of the pseudo-op. Former AS did premature
47eebc20 4920 truncation, restored noisy bits instead of trailing 0s AND gave you
041ff4dd
NC
4921 a choice of 2 flavours of noise according to which of 2 floating-point
4922 scanners you directed AS to use.
f0e652b4 4923
041ff4dd 4924 In: input_line_pointer->whitespace before, or '0' of flonum. */
252b5132
RH
4925
4926void
39e6acbd 4927float_cons (/* Clobbers input_line-pointer, checks end-of-line. */
3d540e93 4928 int float_type /* 'f':.ffloat ... 'F':.float ... */)
252b5132 4929{
3d540e93 4930 char *p;
041ff4dd 4931 int length; /* Number of chars in an object. */
252b5132
RH
4932 char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
4933
4934 if (is_it_end_of_statement ())
4935 {
4936 demand_empty_rest_of_line ();
4937 return;
4938 }
4939
ec9ab52c
JB
4940 if (now_seg == absolute_section)
4941 {
4942 as_bad (_("attempt to store float in absolute section"));
4943 ignore_rest_of_line ();
4944 return;
4945 }
4946
4947 if (in_bss ())
4948 {
4949 as_bad (_("attempt to store float in section `%s'"),
4950 segment_name (now_seg));
4951 ignore_rest_of_line ();
4952 return;
4953 }
4954
252b5132
RH
4955#ifdef md_flush_pending_output
4956 md_flush_pending_output ();
4957#endif
4958
cc3f603a
JM
4959#ifdef md_cons_align
4960 md_cons_align (1);
4961#endif
4962
252b5132
RH
4963 do
4964 {
bb32eac5
JB
4965 length = parse_one_float (float_type, temp);
4966 if (length < 0)
4967 return;
252b5132
RH
4968
4969 if (!need_pass_2)
4970 {
4971 int count;
4972
4973 count = 1;
4974
4975#ifdef REPEAT_CONS_EXPRESSIONS
4976 if (*input_line_pointer == ':')
4977 {
4978 expressionS count_exp;
4979
4980 ++input_line_pointer;
4981 expression (&count_exp);
f0e652b4 4982
252b5132
RH
4983 if (count_exp.X_op != O_constant
4984 || count_exp.X_add_number <= 0)
041ff4dd 4985 as_warn (_("unresolvable or nonpositive repeat count; using 1"));
252b5132
RH
4986 else
4987 count = count_exp.X_add_number;
4988 }
4989#endif
4990
4991 while (--count >= 0)
4992 {
4993 p = frag_more (length);
4994 memcpy (p, temp, (unsigned int) length);
4995 }
4996 }
4997 SKIP_WHITESPACE ();
4998 }
4999 while (*input_line_pointer++ == ',');
5000
041ff4dd
NC
5001 /* Put terminator back into stream. */
5002 --input_line_pointer;
252b5132 5003 demand_empty_rest_of_line ();
041ff4dd 5004}
252b5132 5005\f
9136aa49 5006/* LEB128 Encoding.
252b5132 5007
9136aa49
DG
5008 Note - we are using the DWARF standard's definition of LEB128 encoding
5009 where each 7-bit value is a stored in a byte, *not* an octet. This
5010 means that on targets where a byte contains multiple octets there is
5011 a *huge waste of space*. (This also means that we do not have to
5012 have special versions of these functions for when OCTETS_PER_BYTE_POWER
5013 is non-zero).
5014
5015 If the 7-bit values were to be packed into N-bit bytes (where N > 8)
5016 we would then have to consider whether multiple, successive LEB128
5017 values should be packed into the bytes without padding (bad idea) or
5018 whether each LEB128 number is padded out to a whole number of bytes.
5019 Plus you have to decide on the endianness of packing octets into a
5020 byte. */
5021
5022/* Return the size of a LEB128 value in bytes. */
5023
5024static inline unsigned int
39e6acbd 5025sizeof_sleb128 (offsetT value)
252b5132 5026{
3d540e93
NC
5027 int size = 0;
5028 unsigned byte;
252b5132
RH
5029
5030 do
5031 {
5032 byte = (value & 0x7f);
5033 /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
5034 Fortunately, we can structure things so that the extra work reduces
5035 to a noop on systems that do things "properly". */
5036 value = (value >> 7) | ~(-(offsetT)1 >> 7);
5037 size += 1;
5038 }
5039 while (!(((value == 0) && ((byte & 0x40) == 0))
5040 || ((value == -1) && ((byte & 0x40) != 0))));
5041
5042 return size;
5043}
5044
9136aa49 5045static inline unsigned int
39e6acbd 5046sizeof_uleb128 (valueT value)
252b5132 5047{
3d540e93 5048 int size = 0;
252b5132
RH
5049
5050 do
5051 {
252b5132
RH
5052 value >>= 7;
5053 size += 1;
5054 }
5055 while (value != 0);
5056
5057 return size;
5058}
5059
9136aa49 5060unsigned int
39e6acbd 5061sizeof_leb128 (valueT value, int sign)
252b5132
RH
5062{
5063 if (sign)
5064 return sizeof_sleb128 ((offsetT) value);
5065 else
5066 return sizeof_uleb128 (value);
5067}
5068
9136aa49 5069/* Output a LEB128 value. Returns the number of bytes used. */
252b5132 5070
9136aa49 5071static inline unsigned int
39e6acbd 5072output_sleb128 (char *p, offsetT value)
252b5132 5073{
3d540e93
NC
5074 char *orig = p;
5075 int more;
252b5132
RH
5076
5077 do
5078 {
5079 unsigned byte = (value & 0x7f);
5080
5081 /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
5082 Fortunately, we can structure things so that the extra work reduces
5083 to a noop on systems that do things "properly". */
5084 value = (value >> 7) | ~(-(offsetT)1 >> 7);
5085
5086 more = !((((value == 0) && ((byte & 0x40) == 0))
5087 || ((value == -1) && ((byte & 0x40) != 0))));
5088 if (more)
5089 byte |= 0x80;
5090
5091 *p++ = byte;
5092 }
5093 while (more);
5094
5095 return p - orig;
5096}
5097
9136aa49 5098static inline unsigned int
39e6acbd 5099output_uleb128 (char *p, valueT value)
252b5132
RH
5100{
5101 char *orig = p;
5102
5103 do
5104 {
5105 unsigned byte = (value & 0x7f);
9136aa49 5106
252b5132
RH
5107 value >>= 7;
5108 if (value != 0)
5109 /* More bytes to follow. */
5110 byte |= 0x80;
5111
5112 *p++ = byte;
5113 }
5114 while (value != 0);
5115
5116 return p - orig;
5117}
5118
9136aa49 5119unsigned int
39e6acbd 5120output_leb128 (char *p, valueT value, int sign)
252b5132
RH
5121{
5122 if (sign)
5123 return output_sleb128 (p, (offsetT) value);
5124 else
5125 return output_uleb128 (p, value);
5126}
5127
5128/* Do the same for bignums. We combine sizeof with output here in that
5129 we don't output for NULL values of P. It isn't really as critical as
9136aa49
DG
5130 for "normal" values that this be streamlined. Returns the number of
5131 bytes used. */
252b5132 5132
9136aa49
DG
5133static inline unsigned int
5134output_big_sleb128 (char *p, LITTLENUM_TYPE *bignum, unsigned int size)
252b5132
RH
5135{
5136 char *orig = p;
5137 valueT val = 0;
5138 int loaded = 0;
5139 unsigned byte;
5140
5141 /* Strip leading sign extensions off the bignum. */
e5604d79
RS
5142 while (size > 1
5143 && bignum[size - 1] == LITTLENUM_MASK
5144 && bignum[size - 2] > LITTLENUM_MASK / 2)
252b5132
RH
5145 size--;
5146
5147 do
5148 {
e5604d79
RS
5149 /* OR in the next part of the littlenum. */
5150 val |= (*bignum << loaded);
5151 loaded += LITTLENUM_NUMBER_OF_BITS;
5152 size--;
5153 bignum++;
5154
5155 /* Add bytes until there are less than 7 bits left in VAL
5156 or until every non-sign bit has been written. */
5157 do
252b5132 5158 {
e5604d79
RS
5159 byte = val & 0x7f;
5160 loaded -= 7;
5161 val >>= 7;
5162 if (size > 0
5163 || val != ((byte & 0x40) == 0 ? 0 : ((valueT) 1 << loaded) - 1))
252b5132 5164 byte |= 0x80;
e5604d79
RS
5165
5166 if (orig)
5167 *p = byte;
5168 p++;
252b5132 5169 }
e5604d79
RS
5170 while ((byte & 0x80) != 0 && loaded >= 7);
5171 }
5172 while (size > 0);
252b5132 5173
e5604d79
RS
5174 /* Mop up any left-over bits (of which there will be less than 7). */
5175 if ((byte & 0x80) != 0)
5176 {
5177 /* Sign-extend VAL. */
5178 if (val & (1 << (loaded - 1)))
29798047 5179 val |= ~0U << loaded;
252b5132 5180 if (orig)
e5604d79 5181 *p = val & 0x7f;
252b5132
RH
5182 p++;
5183 }
252b5132
RH
5184
5185 return p - orig;
5186}
5187
9136aa49
DG
5188static inline unsigned int
5189output_big_uleb128 (char *p, LITTLENUM_TYPE *bignum, unsigned int size)
252b5132
RH
5190{
5191 char *orig = p;
5192 valueT val = 0;
5193 int loaded = 0;
5194 unsigned byte;
5195
5196 /* Strip leading zeros off the bignum. */
5197 /* XXX: Is this needed? */
041ff4dd 5198 while (size > 0 && bignum[size - 1] == 0)
252b5132
RH
5199 size--;
5200
5201 do
5202 {
5203 if (loaded < 7 && size > 0)
5204 {
5205 val |= (*bignum << loaded);
5206 loaded += 8 * CHARS_PER_LITTLENUM;
5207 size--;
5208 bignum++;
5209 }
5210
5211 byte = val & 0x7f;
5212 loaded -= 7;
5213 val >>= 7;
5214
5215 if (size > 0 || val)
5216 byte |= 0x80;
5217
5218 if (orig)
5219 *p = byte;
5220 p++;
5221 }
5222 while (byte & 0x80);
5223
5224 return p - orig;
5225}
5226
9136aa49
DG
5227static unsigned int
5228output_big_leb128 (char *p, LITTLENUM_TYPE *bignum, unsigned int size, int sign)
252b5132
RH
5229{
5230 if (sign)
5231 return output_big_sleb128 (p, bignum, size);
5232 else
5233 return output_big_uleb128 (p, bignum, size);
5234}
5235
5236/* Generate the appropriate fragments for a given expression to emit a
9a724e7b 5237 leb128 value. SIGN is 1 for sleb, 0 for uleb. */
252b5132 5238
6b9a135d 5239void
39e6acbd 5240emit_leb128_expr (expressionS *exp, int sign)
252b5132
RH
5241{
5242 operatorT op = exp->X_op;
b7712f8d 5243 unsigned int nbytes;
252b5132
RH
5244
5245 if (op == O_absent || op == O_illegal)
5246 {
5247 as_warn (_("zero assumed for missing expression"));
5248 exp->X_add_number = 0;
5249 op = O_constant;
5250 }
5251 else if (op == O_big && exp->X_add_number <= 0)
5252 {
0e389e77 5253 as_bad (_("floating point number invalid"));
252b5132
RH
5254 exp->X_add_number = 0;
5255 op = O_constant;
5256 }
5257 else if (op == O_register)
5258 {
5259 as_warn (_("register value used as expression"));
5260 op = O_constant;
5261 }
e5604d79
RS
5262 else if (op == O_constant
5263 && sign
956a6ba3 5264 && (exp->X_add_number < 0) == !exp->X_extrabit)
e5604d79
RS
5265 {
5266 /* We're outputting a signed leb128 and the sign of X_add_number
5267 doesn't reflect the sign of the original value. Convert EXP
5268 to a correctly-extended bignum instead. */
956a6ba3 5269 convert_to_bignum (exp, exp->X_extrabit);
e5604d79
RS
5270 op = O_big;
5271 }
252b5132 5272
ec9ab52c
JB
5273 if (now_seg == absolute_section)
5274 {
5275 if (op != O_constant || exp->X_add_number != 0)
5276 as_bad (_("attempt to store value in absolute section"));
5277 abs_section_offset++;
5278 return;
5279 }
5280
5281 if ((op != O_constant || exp->X_add_number != 0) && in_bss ())
5282 as_bad (_("attempt to store non-zero value in section `%s'"),
5283 segment_name (now_seg));
5284
67a659f6
RH
5285 /* Let check_eh_frame know that data is being emitted. nbytes == -1 is
5286 a signal that this is leb128 data. It shouldn't optimize this away. */
b7712f8d 5287 nbytes = (unsigned int) -1;
67a659f6
RH
5288 if (check_eh_frame (exp, &nbytes))
5289 abort ();
5290
371b7465
RH
5291 /* Let the backend know that subsequent data may be byte aligned. */
5292#ifdef md_cons_align
5293 md_cons_align (1);
5294#endif
5295
252b5132
RH
5296 if (op == O_constant)
5297 {
5298 /* If we've got a constant, emit the thing directly right now. */
5299
5300 valueT value = exp->X_add_number;
9136aa49 5301 unsigned int size;
252b5132
RH
5302 char *p;
5303
5304 size = sizeof_leb128 (value, sign);
5305 p = frag_more (size);
9136aa49
DG
5306 if (output_leb128 (p, value, sign) > size)
5307 abort ();
252b5132
RH
5308 }
5309 else if (op == O_big)
5310 {
5311 /* O_big is a different sort of constant. */
74def31d 5312 int nbr_digits = exp->X_add_number;
9136aa49 5313 unsigned int size;
252b5132
RH
5314 char *p;
5315
74def31d
TG
5316 /* If the leading littenum is 0xffff, prepend a 0 to avoid confusion with
5317 a signed number. Unary operators like - or ~ always extend the
5318 bignum to its largest size. */
5319 if (exp->X_unsigned
5320 && nbr_digits < SIZE_OF_LARGE_NUMBER
5321 && generic_bignum[nbr_digits - 1] == LITTLENUM_MASK)
5322 generic_bignum[nbr_digits++] = 0;
5323
5324 size = output_big_leb128 (NULL, generic_bignum, nbr_digits, sign);
252b5132 5325 p = frag_more (size);
74def31d 5326 if (output_big_leb128 (p, generic_bignum, nbr_digits, sign) > size)
9136aa49 5327 abort ();
252b5132
RH
5328 }
5329 else
5330 {
041ff4dd 5331 /* Otherwise, we have to create a variable sized fragment and
252b5132
RH
5332 resolve things later. */
5333
041ff4dd 5334 frag_var (rs_leb128, sizeof_uleb128 (~(valueT) 0), 0, sign,
252b5132
RH
5335 make_expr_symbol (exp), 0, (char *) NULL);
5336 }
5337}
5338
5339/* Parse the .sleb128 and .uleb128 pseudos. */
5340
5341void
39e6acbd 5342s_leb128 (int sign)
252b5132
RH
5343{
5344 expressionS exp;
5345
00bbdfe7
BW
5346#ifdef md_flush_pending_output
5347 md_flush_pending_output ();
5348#endif
5349
041ff4dd
NC
5350 do
5351 {
38cf168b 5352 expression (&exp);
041ff4dd
NC
5353 emit_leb128_expr (&exp, sign);
5354 }
5355 while (*input_line_pointer++ == ',');
252b5132
RH
5356
5357 input_line_pointer--;
5358 demand_empty_rest_of_line ();
5359}
5360\f
38a57ae7
NC
5361static void
5362stringer_append_char (int c, int bitsize)
5363{
ec9ab52c
JB
5364 if (c && in_bss ())
5365 as_bad (_("attempt to store non-empty string in section `%s'"),
5366 segment_name (now_seg));
5367
38a57ae7
NC
5368 if (!target_big_endian)
5369 FRAG_APPEND_1_CHAR (c);
5370
5371 switch (bitsize)
5372 {
5373 case 64:
5374 FRAG_APPEND_1_CHAR (0);
5375 FRAG_APPEND_1_CHAR (0);
5376 FRAG_APPEND_1_CHAR (0);
5377 FRAG_APPEND_1_CHAR (0);
5378 /* Fall through. */
5379 case 32:
5380 FRAG_APPEND_1_CHAR (0);
5381 FRAG_APPEND_1_CHAR (0);
5382 /* Fall through. */
5383 case 16:
5384 FRAG_APPEND_1_CHAR (0);
5385 /* Fall through. */
5386 case 8:
5387 break;
5388 default:
5389 /* Called with invalid bitsize argument. */
5390 abort ();
5391 break;
5392 }
5393 if (target_big_endian)
5394 FRAG_APPEND_1_CHAR (c);
5395}
5396
5397/* Worker to do .ascii etc statements.
5398 Reads 0 or more ',' separated, double-quoted strings.
041ff4dd 5399 Caller should have checked need_pass_2 is FALSE because we don't
38a57ae7
NC
5400 check it.
5401 Checks for end-of-line.
5402 BITS_APPENDZERO says how many bits are in a target char.
5403 The bottom bit is set if a NUL char should be appended to the strings. */
041ff4dd
NC
5404
5405void
38a57ae7 5406stringer (int bits_appendzero)
252b5132 5407{
38a57ae7
NC
5408 const int bitsize = bits_appendzero & ~7;
5409 const int append_zero = bits_appendzero & 1;
5410 unsigned int c;
87975d2a 5411#if !defined(NO_LISTING) && defined (OBJ_ELF)
252b5132 5412 char *start;
87975d2a 5413#endif
252b5132
RH
5414
5415#ifdef md_flush_pending_output
5416 md_flush_pending_output ();
5417#endif
5418
cc3f603a
JM
5419#ifdef md_cons_align
5420 md_cons_align (1);
5421#endif
5422
35c1a439
JB
5423 /* If we have been switched into the abs_section then we
5424 will not have an obstack onto which we can hang strings. */
5425 if (now_seg == absolute_section)
5426 {
5427 as_bad (_("strings must be placed into a section"));
5428 ignore_rest_of_line ();
5429 return;
5430 }
5431
041ff4dd
NC
5432 /* The following awkward logic is to parse ZERO or more strings,
5433 comma separated. Recall a string expression includes spaces
5434 before the opening '\"' and spaces after the closing '\"'.
5435 We fake a leading ',' if there is (supposed to be)
5436 a 1st, expression. We keep demanding expressions for each ','. */
252b5132
RH
5437 if (is_it_end_of_statement ())
5438 {
041ff4dd
NC
5439 c = 0; /* Skip loop. */
5440 ++input_line_pointer; /* Compensate for end of loop. */
252b5132
RH
5441 }
5442 else
5443 {
041ff4dd 5444 c = ','; /* Do loop. */
252b5132 5445 }
d6415f6c 5446
252b5132
RH
5447 while (c == ',' || c == '<' || c == '"')
5448 {
5449 SKIP_WHITESPACE ();
5450 switch (*input_line_pointer)
5451 {
5452 case '\"':
041ff4dd 5453 ++input_line_pointer; /*->1st char of string. */
87975d2a 5454#if !defined(NO_LISTING) && defined (OBJ_ELF)
252b5132 5455 start = input_line_pointer;
87975d2a 5456#endif
38a57ae7 5457
252b5132 5458 while (is_a_char (c = next_char_of_string ()))
38a57ae7
NC
5459 stringer_append_char (c, bitsize);
5460
3d955acb
NC
5461 /* Treat "a" "b" as "ab". Even if we are appending zeros. */
5462 SKIP_ALL_WHITESPACE ();
5463 if (*input_line_pointer == '"')
5464 break;
5465
252b5132 5466 if (append_zero)
38a57ae7
NC
5467 stringer_append_char (0, bitsize);
5468
87975d2a 5469#if !defined(NO_LISTING) && defined (OBJ_ELF)
252b5132 5470 /* In ELF, when gcc is emitting DWARF 1 debugging output, it
d6415f6c
AM
5471 will emit .string with a filename in the .debug section
5472 after a sequence of constants. See the comment in
5473 emit_expr for the sequence. emit_expr will set
5474 dwarf_file_string to non-zero if this string might be a
5475 source file name. */
252b5132
RH
5476 if (strcmp (segment_name (now_seg), ".debug") != 0)
5477 dwarf_file_string = 0;
5478 else if (dwarf_file_string)
5479 {
5480 c = input_line_pointer[-1];
5481 input_line_pointer[-1] = '\0';
5482 listing_source_file (start);
5483 input_line_pointer[-1] = c;
5484 }
252b5132
RH
5485#endif
5486
5487 break;
5488 case '<':
5489 input_line_pointer++;
5490 c = get_single_number ();
38a57ae7 5491 stringer_append_char (c, bitsize);
252b5132 5492 if (*input_line_pointer != '>')
bdfb4455
WH
5493 {
5494 as_bad (_("expected <nn>"));
5495 ignore_rest_of_line ();
5496 return;
5497 }
252b5132
RH
5498 input_line_pointer++;
5499 break;
5500 case ',':
5501 input_line_pointer++;
5502 break;
5503 }
5504 SKIP_WHITESPACE ();
5505 c = *input_line_pointer;
5506 }
5507
5508 demand_empty_rest_of_line ();
38a57ae7 5509}
252b5132
RH
5510\f
5511/* FIXME-SOMEDAY: I had trouble here on characters with the
5512 high bits set. We'll probably also have trouble with
5513 multibyte chars, wide chars, etc. Also be careful about
041ff4dd 5514 returning values bigger than 1 byte. xoxorich. */
252b5132 5515
041ff4dd 5516unsigned int
39e6acbd 5517next_char_of_string (void)
252b5132 5518{
3d540e93 5519 unsigned int c;
252b5132
RH
5520
5521 c = *input_line_pointer++ & CHAR_MASK;
5522 switch (c)
5523 {
f49547a6
NC
5524 case 0:
5525 /* PR 20902: Do not advance past the end of the buffer. */
5526 -- input_line_pointer;
5527 c = NOT_A_CHAR;
5528 break;
5529
252b5132
RH
5530 case '\"':
5531 c = NOT_A_CHAR;
5532 break;
5533
5534 case '\n':
0e389e77 5535 as_warn (_("unterminated string; newline inserted"));
252b5132
RH
5536 bump_line_counters ();
5537 break;
5538
252b5132 5539 case '\\':
16d87673
SB
5540 if (!TC_STRING_ESCAPES)
5541 break;
d9800776 5542 switch (c = *input_line_pointer++ & CHAR_MASK)
252b5132
RH
5543 {
5544 case 'b':
5545 c = '\b';
5546 break;
5547
5548 case 'f':
5549 c = '\f';
5550 break;
5551
5552 case 'n':
5553 c = '\n';
5554 break;
5555
5556 case 'r':
5557 c = '\r';
5558 break;
5559
5560 case 't':
5561 c = '\t';
5562 break;
5563
5564 case 'v':
5565 c = '\013';
5566 break;
5567
5568 case '\\':
5569 case '"':
041ff4dd 5570 break; /* As itself. */
252b5132
RH
5571
5572 case '0':
5573 case '1':
5574 case '2':
5575 case '3':
5576 case '4':
5577 case '5':
5578 case '6':
5579 case '7':
5580 case '8':
5581 case '9':
5582 {
b685de86 5583 unsigned number;
252b5132
RH
5584 int i;
5585
041ff4dd 5586 for (i = 0, number = 0;
3882b010 5587 ISDIGIT (c) && i < 3;
041ff4dd 5588 c = *input_line_pointer++, i++)
252b5132
RH
5589 {
5590 number = number * 8 + c - '0';
5591 }
f0e652b4 5592
d9800776 5593 c = number & CHAR_MASK;
252b5132
RH
5594 }
5595 --input_line_pointer;
5596 break;
5597
5598 case 'x':
5599 case 'X':
5600 {
b685de86 5601 unsigned number;
252b5132
RH
5602
5603 number = 0;
5604 c = *input_line_pointer++;
3882b010 5605 while (ISXDIGIT (c))
252b5132 5606 {
3882b010 5607 if (ISDIGIT (c))
252b5132 5608 number = number * 16 + c - '0';
3882b010 5609 else if (ISUPPER (c))
252b5132
RH
5610 number = number * 16 + c - 'A' + 10;
5611 else
5612 number = number * 16 + c - 'a' + 10;
5613 c = *input_line_pointer++;
5614 }
d9800776 5615 c = number & CHAR_MASK;
252b5132
RH
5616 --input_line_pointer;
5617 }
5618 break;
5619
5620 case '\n':
041ff4dd 5621 /* To be compatible with BSD 4.2 as: give the luser a linefeed!! */
0e389e77 5622 as_warn (_("unterminated string; newline inserted"));
252b5132
RH
5623 c = '\n';
5624 bump_line_counters ();
5625 break;
5626
f49547a6
NC
5627 case 0:
5628 /* Do not advance past the end of the buffer. */
5629 -- input_line_pointer;
5630 c = NOT_A_CHAR;
5631 break;
5632
252b5132
RH
5633 default:
5634
5635#ifdef ONLY_STANDARD_ESCAPES
0e389e77 5636 as_bad (_("bad escaped character in string"));
252b5132
RH
5637 c = '?';
5638#endif /* ONLY_STANDARD_ESCAPES */
5639
5640 break;
041ff4dd 5641 }
252b5132 5642 break;
252b5132
RH
5643
5644 default:
5645 break;
041ff4dd 5646 }
252b5132 5647 return (c);
041ff4dd 5648}
252b5132
RH
5649\f
5650static segT
3d540e93 5651get_segmented_expression (expressionS *expP)
252b5132 5652{
3d540e93 5653 segT retval;
252b5132
RH
5654
5655 retval = expression (expP);
5656 if (expP->X_op == O_illegal
5657 || expP->X_op == O_absent
5658 || expP->X_op == O_big)
5659 {
0e389e77 5660 as_bad (_("expected address expression"));
252b5132
RH
5661 expP->X_op = O_constant;
5662 expP->X_add_number = 0;
5663 retval = absolute_section;
5664 }
5665 return retval;
5666}
5667
041ff4dd 5668static segT
3d540e93 5669get_known_segmented_expression (expressionS *expP)
252b5132 5670{
259af69e 5671 segT retval = get_segmented_expression (expP);
252b5132 5672
259af69e 5673 if (retval == undefined_section)
252b5132
RH
5674 {
5675 /* There is no easy way to extract the undefined symbol from the
5676 expression. */
5677 if (expP->X_add_symbol != NULL
5678 && S_GET_SEGMENT (expP->X_add_symbol) != expr_section)
5679 as_warn (_("symbol \"%s\" undefined; zero assumed"),
5680 S_GET_NAME (expP->X_add_symbol));
5681 else
5682 as_warn (_("some symbol undefined; zero assumed"));
5683 retval = absolute_section;
5684 expP->X_op = O_constant;
5685 expP->X_add_number = 0;
5686 }
259af69e 5687 return retval;
041ff4dd 5688}
252b5132 5689
041ff4dd 5690char /* Return terminator. */
39e6acbd 5691get_absolute_expression_and_terminator (long *val_pointer /* Return value of expression. */)
252b5132
RH
5692{
5693 /* FIXME: val_pointer should probably be offsetT *. */
5694 *val_pointer = (long) get_absolute_expression ();
5695 return (*input_line_pointer++);
5696}
5697\f
041ff4dd
NC
5698/* Like demand_copy_string, but return NULL if the string contains any '\0's.
5699 Give a warning if that happens. */
5700
252b5132 5701char *
39e6acbd 5702demand_copy_C_string (int *len_pointer)
252b5132 5703{
3d540e93 5704 char *s;
252b5132
RH
5705
5706 if ((s = demand_copy_string (len_pointer)) != 0)
5707 {
3d540e93 5708 int len;
252b5132
RH
5709
5710 for (len = *len_pointer; len > 0; len--)
5711 {
70433886 5712 if (s[len - 1] == 0)
252b5132
RH
5713 {
5714 s = 0;
252b5132 5715 *len_pointer = 0;
0e389e77 5716 as_bad (_("this string may not contain \'\\0\'"));
70433886 5717 break;
252b5132
RH
5718 }
5719 }
5720 }
f0e652b4 5721
252b5132
RH
5722 return s;
5723}
5724\f
041ff4dd
NC
5725/* Demand string, but return a safe (=private) copy of the string.
5726 Return NULL if we can't read a string here. */
5727
252b5132 5728char *
39e6acbd 5729demand_copy_string (int *lenP)
252b5132 5730{
3d540e93
NC
5731 unsigned int c;
5732 int len;
252b5132
RH
5733 char *retval;
5734
5735 len = 0;
5736 SKIP_WHITESPACE ();
5737 if (*input_line_pointer == '\"')
5738 {
041ff4dd 5739 input_line_pointer++; /* Skip opening quote. */
252b5132
RH
5740
5741 while (is_a_char (c = next_char_of_string ()))
5742 {
5743 obstack_1grow (&notes, c);
5744 len++;
5745 }
5746 /* JF this next line is so demand_copy_C_string will return a
041ff4dd 5747 null terminated string. */
252b5132 5748 obstack_1grow (&notes, '\0');
1e9cc1c2 5749 retval = (char *) obstack_finish (&notes);
252b5132
RH
5750 }
5751 else
5752 {
c95b35a9 5753 as_bad (_("missing string"));
252b5132
RH
5754 retval = NULL;
5755 ignore_rest_of_line ();
5756 }
5757 *lenP = len;
5758 return (retval);
041ff4dd 5759}
252b5132 5760\f
041ff4dd 5761/* In: Input_line_pointer->next character.
f0e652b4 5762
041ff4dd 5763 Do: Skip input_line_pointer over all whitespace.
f0e652b4 5764
041ff4dd
NC
5765 Out: 1 if input_line_pointer->end-of-line. */
5766
5767int
39e6acbd 5768is_it_end_of_statement (void)
252b5132
RH
5769{
5770 SKIP_WHITESPACE ();
5771 return (is_end_of_line[(unsigned char) *input_line_pointer]);
041ff4dd 5772}
252b5132 5773
041ff4dd 5774void
39e6acbd 5775equals (char *sym_name, int reassign)
252b5132 5776{
252b5132 5777 char *stop = NULL;
fb25138b 5778 char stopc = 0;
252b5132
RH
5779
5780 input_line_pointer++;
5781 if (*input_line_pointer == '=')
5782 input_line_pointer++;
9497f5ac
NC
5783 if (reassign < 0 && *input_line_pointer == '=')
5784 input_line_pointer++;
252b5132
RH
5785
5786 while (*input_line_pointer == ' ' || *input_line_pointer == '\t')
5787 input_line_pointer++;
5788
5789 if (flag_mri)
5790 stop = mri_comment_field (&stopc);
5791
9497f5ac 5792 assign_symbol (sym_name, reassign >= 0 ? !reassign : reassign);
252b5132
RH
5793
5794 if (flag_mri)
31d20a21
AM
5795 {
5796 demand_empty_rest_of_line ();
5797 mri_comment_end (stop, stopc);
5798 }
041ff4dd 5799}
252b5132 5800
adb9ac5f
AM
5801/* Open FILENAME, first trying the unadorned file name, then if that
5802 fails and the file name is not an absolute path, attempt to open
5803 the file in current -I include paths. PATH is a preallocated
5804 buffer which will be set to the file opened, or FILENAME if no file
5805 is found. */
5806
5807FILE *
5808search_and_open (const char *filename, char *path)
5809{
5810 FILE *f = fopen (filename, FOPEN_RB);
5811 if (f == NULL && !IS_ABSOLUTE_PATH (filename))
5812 {
5813 for (size_t i = 0; i < include_dir_count; i++)
5814 {
5815 sprintf (path, "%s/%s", include_dirs[i], filename);
5816 f = fopen (path, FOPEN_RB);
5817 if (f != NULL)
5818 return f;
5819 }
5820 }
5821 strcpy (path, filename);
5822 return f;
5823}
5824
7e005732
NC
5825/* .incbin -- include a file verbatim at the current location. */
5826
5827void
39e6acbd 5828s_incbin (int x ATTRIBUTE_UNUSED)
7e005732
NC
5829{
5830 FILE * binfile;
5831 char * path;
5832 char * filename;
5833 char * binfrag;
5834 long skip = 0;
5835 long count = 0;
5836 long bytes;
5837 int len;
5838
5839#ifdef md_flush_pending_output
5840 md_flush_pending_output ();
5841#endif
5842
cc3f603a
JM
5843#ifdef md_cons_align
5844 md_cons_align (1);
5845#endif
5846
7e005732
NC
5847 SKIP_WHITESPACE ();
5848 filename = demand_copy_string (& len);
5849 if (filename == NULL)
5850 return;
5851
5852 SKIP_WHITESPACE ();
5853
5854 /* Look for optional skip and count. */
5855 if (* input_line_pointer == ',')
5856 {
5857 ++ input_line_pointer;
5858 skip = get_absolute_expression ();
5859
5860 SKIP_WHITESPACE ();
5861
5862 if (* input_line_pointer == ',')
5863 {
5864 ++ input_line_pointer;
5865
5866 count = get_absolute_expression ();
5867 if (count == 0)
5868 as_warn (_(".incbin count zero, ignoring `%s'"), filename);
5869
5870 SKIP_WHITESPACE ();
5871 }
5872 }
5873
5874 demand_empty_rest_of_line ();
5875
adb9ac5f
AM
5876 path = XNEWVEC (char, len + include_dir_maxlen + 2);
5877 binfile = search_and_open (filename, path);
7e005732 5878
adb9ac5f
AM
5879 if (binfile == NULL)
5880 as_bad (_("file not found: %s"), filename);
7e005732 5881 else
7e005732 5882 {
f740e790 5883 long file_len;
284beb43 5884 struct stat filestat;
f740e790 5885
284beb43
NC
5886 if (fstat (fileno (binfile), &filestat) != 0
5887 || ! S_ISREG (filestat.st_mode)
5888 || S_ISDIR (filestat.st_mode))
5889 {
5890 as_bad (_("unable to include `%s'"), path);
5891 goto done;
5892 }
5893
7e005732
NC
5894 register_dependency (path);
5895
5896 /* Compute the length of the file. */
5897 if (fseek (binfile, 0, SEEK_END) != 0)
5898 {
5899 as_bad (_("seek to end of .incbin file failed `%s'"), path);
5900 goto done;
5901 }
f740e790 5902 file_len = ftell (binfile);
7e005732 5903
c556cc9c 5904 /* If a count was not specified use the remainder of the file. */
7e005732 5905 if (count == 0)
c556cc9c 5906 count = file_len - skip;
7e005732 5907
c556cc9c 5908 if (skip < 0 || count < 0 || file_len < 0 || skip + count > file_len)
7e005732 5909 {
c556cc9c 5910 as_bad (_("skip (%ld) or count (%ld) invalid for file size (%ld)"),
f740e790 5911 skip, count, file_len);
7e005732
NC
5912 goto done;
5913 }
5914
5915 if (fseek (binfile, skip, SEEK_SET) != 0)
5916 {
5917 as_bad (_("could not skip to %ld in file `%s'"), skip, path);
5918 goto done;
5919 }
5920
5921 /* Allocate frag space and store file contents in it. */
5922 binfrag = frag_more (count);
5923
5924 bytes = fread (binfrag, 1, count, binfile);
5925 if (bytes < count)
5926 as_warn (_("truncated file `%s', %ld of %ld bytes read"),
5927 path, bytes, count);
5928 }
dc1e8a47 5929 done:
7e005732
NC
5930 if (binfile != NULL)
5931 fclose (binfile);
9fbb53c7 5932 free (path);
7e005732
NC
5933}
5934
041ff4dd 5935/* .include -- include a file at this point. */
252b5132 5936
041ff4dd 5937void
39e6acbd 5938s_include (int arg ATTRIBUTE_UNUSED)
252b5132 5939{
252b5132
RH
5940 char *filename;
5941 int i;
1e9cc1c2 5942 FILE *try_file;
252b5132
RH
5943 char *path;
5944
041ff4dd 5945 if (!flag_m68k_mri)
252b5132
RH
5946 {
5947 filename = demand_copy_string (&i);
5948 if (filename == NULL)
5949 {
5950 /* demand_copy_string has already printed an error and
d6415f6c 5951 called ignore_rest_of_line. */
252b5132
RH
5952 return;
5953 }
5954 }
5955 else
5956 {
5957 SKIP_WHITESPACE ();
5958 i = 0;
041ff4dd 5959 while (!is_end_of_line[(unsigned char) *input_line_pointer]
252b5132
RH
5960 && *input_line_pointer != ' '
5961 && *input_line_pointer != '\t')
5962 {
5963 obstack_1grow (&notes, *input_line_pointer);
5964 ++input_line_pointer;
5965 ++i;
5966 }
f0e652b4 5967
252b5132 5968 obstack_1grow (&notes, '\0');
1e9cc1c2 5969 filename = (char *) obstack_finish (&notes);
041ff4dd 5970 while (!is_end_of_line[(unsigned char) *input_line_pointer])
252b5132
RH
5971 ++input_line_pointer;
5972 }
f0e652b4 5973
252b5132 5974 demand_empty_rest_of_line ();
f0e652b4 5975
adb9ac5f
AM
5976 path = notes_alloc (i + include_dir_maxlen + 2);
5977 try_file = search_and_open (filename, path);
5978 if (try_file)
5979 fclose (try_file);
f0e652b4 5980
252b5132 5981 register_dependency (path);
9f10757c 5982 input_scrub_insert_file (path);
041ff4dd 5983}
252b5132 5984
041ff4dd 5985void
adb9ac5f 5986init_include_dir (void)
252b5132 5987{
adb9ac5f
AM
5988 include_dirs = XNEWVEC (const char *, 1);
5989 include_dirs[0] = "."; /* Current dir. */
5990 include_dir_count = 1;
5991 include_dir_maxlen = 1;
5992}
252b5132 5993
adb9ac5f
AM
5994void
5995add_include_dir (char *path)
5996{
5997 include_dir_count++;
5998 include_dirs = XRESIZEVEC (const char *, include_dirs, include_dir_count);
041ff4dd 5999 include_dirs[include_dir_count - 1] = path; /* New one. */
252b5132 6000
adb9ac5f 6001 size_t i = strlen (path);
252b5132
RH
6002 if (i > include_dir_maxlen)
6003 include_dir_maxlen = i;
041ff4dd 6004}
252b5132
RH
6005\f
6006/* Output debugging information to denote the source file. */
6007
6008static void
39e6acbd 6009generate_file_debug (void)
252b5132
RH
6010{
6011 if (debug_type == DEBUG_STABS)
6012 stabs_generate_asm_file ();
6013}
6014
6015/* Output line number debugging information for the current source line. */
6016
6017void
39e6acbd 6018generate_lineno_debug (void)
252b5132 6019{
252b5132
RH
6020 switch (debug_type)
6021 {
6022 case DEBUG_UNSPECIFIED:
6023 case DEBUG_NONE:
4dc7ead9 6024 case DEBUG_DWARF:
252b5132
RH
6025 break;
6026 case DEBUG_STABS:
6027 stabs_generate_asm_lineno ();
6028 break;
6029 case DEBUG_ECOFF:
6030 ecoff_generate_asm_lineno ();
6031 break;
252b5132 6032 case DEBUG_DWARF2:
4dc7ead9
RH
6033 /* ??? We could here indicate to dwarf2dbg.c that something
6034 has changed. However, since there is additional backend
6035 support that is required (calling dwarf2_emit_insn), we
6036 let dwarf2dbg.c call as_where on its own. */
252b5132 6037 break;
ba646820
MH
6038 case DEBUG_CODEVIEW:
6039 codeview_generate_asm_lineno ();
6040 break;
252b5132
RH
6041 }
6042}
6043
6044/* Output debugging information to mark a function entry point or end point.
6045 END_P is zero for .func, and non-zero for .endfunc. */
6046
6047void
39e6acbd 6048s_func (int end_p)
252b5132
RH
6049{
6050 do_s_func (end_p, NULL);
6051}
6052
6053/* Subroutine of s_func so targets can choose a different default prefix.
6054 If DEFAULT_PREFIX is NULL, use the target's "leading char". */
6055
87c245cc 6056static void
39e6acbd 6057do_s_func (int end_p, const char *default_prefix)
252b5132 6058{
252b5132
RH
6059 if (end_p)
6060 {
6061 if (current_name == NULL)
6062 {
6063 as_bad (_("missing .func"));
6064 ignore_rest_of_line ();
6065 return;
6066 }
6067
6068 if (debug_type == DEBUG_STABS)
6069 stabs_generate_asm_endfunc (current_name, current_label);
6070
6f860418
AM
6071 free (current_name);
6072 free (current_label);
252b5132
RH
6073 current_name = current_label = NULL;
6074 }
6075 else /* ! end_p */
6076 {
041ff4dd
NC
6077 char *name, *label;
6078 char delim1, delim2;
252b5132
RH
6079
6080 if (current_name != NULL)
6081 {
6082 as_bad (_(".endfunc missing for previous .func"));
6083 ignore_rest_of_line ();
6084 return;
6085 }
6086
d02603dc 6087 delim1 = get_symbol_name (& name);
252b5132
RH
6088 name = xstrdup (name);
6089 *input_line_pointer = delim1;
d02603dc 6090 SKIP_WHITESPACE_AFTER_NAME ();
252b5132
RH
6091 if (*input_line_pointer != ',')
6092 {
6093 if (default_prefix)
05f4ab67
AM
6094 {
6095 if (asprintf (&label, "%s%s", default_prefix, name) == -1)
6096 as_fatal ("%s", xstrerror (errno));
6097 }
252b5132
RH
6098 else
6099 {
7be1c489 6100 char leading_char = bfd_get_symbol_leading_char (stdoutput);
252b5132
RH
6101 /* Missing entry point, use function's name with the leading
6102 char prepended. */
6103 if (leading_char)
05f4ab67
AM
6104 {
6105 if (asprintf (&label, "%c%s", leading_char, name) == -1)
6106 as_fatal ("%s", xstrerror (errno));
6107 }
252b5132 6108 else
6f860418 6109 label = xstrdup (name);
252b5132
RH
6110 }
6111 }
6112 else
6113 {
6114 ++input_line_pointer;
6115 SKIP_WHITESPACE ();
d02603dc 6116 delim2 = get_symbol_name (& label);
252b5132 6117 label = xstrdup (label);
d02603dc 6118 restore_line_pointer (delim2);
252b5132
RH
6119 }
6120
6121 if (debug_type == DEBUG_STABS)
6122 stabs_generate_asm_func (name, label);
6123
6124 current_name = name;
6125 current_label = label;
6126 }
6127
6128 demand_empty_rest_of_line ();
6129}
6130\f
fa94de6b
RM
6131#ifdef HANDLE_BUNDLE
6132
6133void
6134s_bundle_align_mode (int arg ATTRIBUTE_UNUSED)
6135{
6136 unsigned int align = get_absolute_expression ();
6137 SKIP_WHITESPACE ();
6138 demand_empty_rest_of_line ();
6139
6140 if (align > (unsigned int) TC_ALIGN_LIMIT)
6141 as_fatal (_(".bundle_align_mode alignment too large (maximum %u)"),
6142 (unsigned int) TC_ALIGN_LIMIT);
6143
6144 if (bundle_lock_frag != NULL)
6145 {
6146 as_bad (_("cannot change .bundle_align_mode inside .bundle_lock"));
6147 return;
6148 }
6149
6150 bundle_align_p2 = align;
6151}
6152
6153void
6154s_bundle_lock (int arg ATTRIBUTE_UNUSED)
6155{
6156 demand_empty_rest_of_line ();
6157
6158 if (bundle_align_p2 == 0)
6159 {
6160 as_bad (_(".bundle_lock is meaningless without .bundle_align_mode"));
6161 return;
6162 }
6163
d416e51d 6164 if (bundle_lock_depth == 0)
fa94de6b 6165 {
d416e51d
RM
6166 bundle_lock_frchain = frchain_now;
6167 bundle_lock_frag = start_bundle ();
fa94de6b 6168 }
d416e51d 6169 ++bundle_lock_depth;
fa94de6b
RM
6170}
6171
6172void
6173s_bundle_unlock (int arg ATTRIBUTE_UNUSED)
6174{
6175 unsigned int size;
6176
6177 demand_empty_rest_of_line ();
6178
6179 if (bundle_lock_frag == NULL)
6180 {
6181 as_bad (_(".bundle_unlock without preceding .bundle_lock"));
6182 return;
6183 }
6184
6185 gas_assert (bundle_align_p2 > 0);
6186
d416e51d
RM
6187 gas_assert (bundle_lock_depth > 0);
6188 if (--bundle_lock_depth > 0)
6189 return;
6190
fa94de6b
RM
6191 size = pending_bundle_size (bundle_lock_frag);
6192
e54e9ac5
AM
6193 if (size > 1U << bundle_align_p2)
6194 as_bad (_(".bundle_lock sequence is %u bytes, "
6195 "but bundle size is only %u bytes"),
6196 size, 1u << bundle_align_p2);
fa94de6b
RM
6197 else
6198 finish_bundle (bundle_lock_frag, size);
6199
6200 bundle_lock_frag = NULL;
6201 bundle_lock_frchain = NULL;
6202}
6203
6204#endif /* HANDLE_BUNDLE */
6205\f
041ff4dd 6206void
39e6acbd 6207s_ignore (int arg ATTRIBUTE_UNUSED)
252b5132 6208{
40a4d956 6209 ignore_rest_of_line ();
252b5132
RH
6210}
6211
252b5132 6212void
39e6acbd 6213read_print_statistics (FILE *file)
252b5132 6214{
32e4c1c2 6215 htab_print_statistics (file, "pseudo-op table", po_hash);
252b5132
RH
6216}
6217
041ff4dd
NC
6218/* Inserts the given line into the input stream.
6219
9f10757c
TW
6220 This call avoids macro/conditionals nesting checking, since the contents of
6221 the line are assumed to replace the contents of a line already scanned.
6222
47eebc20 6223 An appropriate use of this function would be substitution of input lines when
9f10757c
TW
6224 called by md_start_line_hook(). The given line is assumed to already be
6225 properly scrubbed. */
6226
6227void
39e6acbd 6228input_scrub_insert_line (const char *line)
9f10757c
TW
6229{
6230 sb newline;
d2ae702c
L
6231 size_t len = strlen (line);
6232 sb_build (&newline, len);
6233 sb_add_buffer (&newline, line, len);
657edeab 6234 input_scrub_include_sb (&newline, input_line_pointer, expanding_none);
9f10757c
TW
6235 sb_kill (&newline);
6236 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
6237}
6238
6239/* Insert a file into the input stream; the path must resolve to an actual
041ff4dd 6240 file; no include path searching or dependency registering is performed. */
9f10757c
TW
6241
6242void
39e6acbd 6243input_scrub_insert_file (char *path)
9f10757c
TW
6244{
6245 input_scrub_include_file (path, input_line_pointer);
6246 buffer_limit = input_scrub_next_buffer (&input_line_pointer);
6247}
40a4d956
JB
6248
6249/* Find the end of a line, considering quotation and escaping of quotes. */
6250
6251#if !defined(TC_SINGLE_QUOTE_STRINGS) && defined(SINGLE_QUOTE_STRINGS)
6252# define TC_SINGLE_QUOTE_STRINGS 1
6253#endif
6254
6255static char *
7592cfd7
NC
6256_find_end_of_line (char *s, int mri_string, int insn ATTRIBUTE_UNUSED,
6257 int in_macro)
40a4d956
JB
6258{
6259 char inquote = '\0';
6260 int inescape = 0;
6261
6262 while (!is_end_of_line[(unsigned char) *s]
6263 || (inquote && !ISCNTRL (*s))
6264 || (inquote == '\'' && flag_mri)
6265#ifdef TC_EOL_IN_INSN
6266 || (insn && TC_EOL_IN_INSN (s))
6267#endif
7592cfd7
NC
6268 /* PR 6926: When we are parsing the body of a macro the sequence
6269 \@ is special - it refers to the invocation count. If the @
6270 character happens to be registered as a line-separator character
6271 by the target, then the is_end_of_line[] test above will have
6272 returned true, but we need to ignore the line separating
6273 semantics in this particular case. */
6274 || (in_macro && inescape && *s == '@')
40a4d956
JB
6275 )
6276 {
6277 if (mri_string && *s == '\'')
6278 inquote ^= *s;
6279 else if (inescape)
6280 inescape = 0;
6281 else if (*s == '\\')
6282 inescape = 1;
6283 else if (!inquote
6284 ? *s == '"'
6285#ifdef TC_SINGLE_QUOTE_STRINGS
6286 || (TC_SINGLE_QUOTE_STRINGS && *s == '\'')
6287#endif
6288 : *s == inquote)
6289 inquote ^= *s;
6290 ++s;
6291 }
6292 if (inquote)
6293 as_warn (_("missing closing `%c'"), inquote);
e74211b6 6294 if (inescape && !ignore_input ())
40a4d956
JB
6295 as_warn (_("stray `\\'"));
6296 return s;
6297}
6298
6299char *
6300find_end_of_line (char *s, int mri_string)
6301{
7592cfd7 6302 return _find_end_of_line (s, mri_string, 0, 0);
40a4d956 6303}
1181551e 6304
f049c189 6305static char *saved_ilp;
1181551e
NC
6306static char *saved_limit;
6307
6308/* Use BUF as a temporary input pointer for calling other functions in this
6309 file. BUF must be a C string, so that its end can be found by strlen.
6310 Also sets the buffer_limit variable (local to this file) so that buffer
6311 overruns should not occur. Saves the current input line pointer so that
6312 it can be restored by calling restore_ilp().
6313
af60449c 6314 Does not support recursion. */
1181551e
NC
6315
6316void
6317temp_ilp (char *buf)
6318{
6319 gas_assert (saved_ilp == NULL);
6320 gas_assert (buf != NULL);
6321
6322 saved_ilp = input_line_pointer;
6323 saved_limit = buffer_limit;
6324 /* Prevent the assert in restore_ilp from triggering if
6325 the input_line_pointer has not yet been initialised. */
6326 if (saved_ilp == NULL)
6327 saved_limit = saved_ilp = (char *) "";
6328
6329 input_line_pointer = buf;
6330 buffer_limit = buf + strlen (buf);
5b7c81bd 6331 input_from_string = true;
1181551e
NC
6332}
6333
6334/* Restore a saved input line pointer. */
6335
6336void
6337restore_ilp (void)
6338{
6339 gas_assert (saved_ilp != NULL);
6340
6341 input_line_pointer = saved_ilp;
6342 buffer_limit = saved_limit;
5b7c81bd 6343 input_from_string = false;
1181551e
NC
6344
6345 saved_ilp = NULL;
6346}