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