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