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