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