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