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