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