Coverage Report

Created: 2023-08-28 06:31

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