Coverage Report

Created: 2023-06-29 07:09

/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
1.65M
#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
32
  do                \
55
32
    {               \
56
32
      if ((SIZE) >= 8)           \
57
32
  (P2VAR) = 3;           \
58
32
      else if ((SIZE) >= 4)         \
59
32
  (P2VAR) = 2;           \
60
32
      else if ((SIZE) >= 2)         \
61
24
  (P2VAR) = 1;           \
62
24
      else              \
63
24
  (P2VAR) = 0;           \
64
32
    }               \
65
32
  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
633
{
270
633
  const char *p;
271
272
633
  pobegin ();
273
633
  obj_read_begin_hook ();
274
275
633
  obstack_begin (&cond_obstack, chunksize);
276
277
633
#ifndef tc_line_separator_chars
278
633
#define tc_line_separator_chars line_separator_chars
279
633
#endif
280
  /* Use machine dependent syntax.  */
281
1.26k
  for (p = tc_line_separator_chars; *p; p++)
282
633
    is_end_of_line[(unsigned char) *p] = 2;
283
  /* Use more.  FIXME-SOMEDAY.  */
284
285
633
  if (flag_mri)
286
430
    lex_type['?'] = 3;
287
633
  stabs_begin ();
288
289
#ifndef WORKING_DOT_WORD
290
  broken_words = NULL;
291
  new_broken_words = 0;
292
#endif
293
294
633
  abs_section_offset = 0;
295
296
633
  line_label = NULL;
297
633
  mri_common_symbol = NULL;
298
633
  mri_pending_align = 0;
299
300
633
  current_name = NULL;
301
633
  current_label = NULL;
302
303
633
#ifndef NO_LISTING
304
633
#ifdef OBJ_ELF
305
633
  dwarf_file = 0;
306
633
  dwarf_line = -1;
307
633
  dwarf_file_string = 0;
308
633
#endif
309
633
#endif
310
311
633
#ifdef HANDLE_BUNDLE
312
633
  bundle_align_p2 = 0;
313
633
  bundle_lock_frag = NULL;
314
633
  bundle_lock_frchain = NULL;
315
633
  bundle_lock_depth = 0;
316
633
#endif
317
633
}
318
319
void
320
read_end (void)
321
633
{
322
633
  stabs_end ();
323
633
  poend ();
324
633
  _obstack_free (&cond_obstack, NULL);
325
633
  free (current_name);
326
633
  free (current_label);
327
633
}
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
136k
{
541
136k
  expression_and_evaluate (exp);
542
543
136k
  if (exp->X_op != O_constant)
544
42.7k
    {
545
42.7k
      if (exp->X_op != O_absent)
546
34.8k
  as_bad (_("bad or irreducible absolute expression"));
547
42.7k
      exp->X_add_number = 0;
548
42.7k
    }
549
136k
  return exp->X_add_number;
550
136k
}
551
552
offsetT
553
get_absolute_expression (void)
554
133k
{
555
133k
  expressionS exp;
556
557
133k
  return get_absolute_expr (&exp);
558
133k
}
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
2.53k
{
566
2.53k
  const pseudo_typeS *pop;
567
159k
  for (pop = table; pop->poc_name; pop++)
568
156k
    {
569
156k
      if (str_hash_insert (po_hash, pop->poc_name, pop, 0) != NULL)
570
6.33k
  {
571
6.33k
    if (!pop_override_ok)
572
0
      as_fatal (_("error constructing %s pseudo-op table"),
573
0
          pop_table_name);
574
6.33k
  }
575
156k
    }
576
2.53k
}
577
578
#ifndef md_pop_insert
579
633
#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
633
#define cfi_pop_insert()  pop_insert(cfi_pseudo_table)
588
#endif
589
590
static void
591
pobegin (void)
592
633
{
593
633
  po_hash = str_htab_create ();
594
595
  /* Do the target-specific pseudo ops.  */
596
633
  pop_table_name = "md";
597
633
  pop_override_ok = 0;
598
633
  md_pop_insert ();
599
600
  /* Now object specific.  Skip any that were in the target table.  */
601
633
  pop_table_name = "obj";
602
633
  pop_override_ok = 1;
603
633
  obj_pop_insert ();
604
605
  /* Now portable ones.  Skip any that we've seen already.  */
606
633
  pop_table_name = "standard";
607
633
  pop_insert (potable);
608
609
  /* Now CFI ones.  */
610
633
  pop_table_name = "cfi";
611
633
  cfi_pop_insert ();
612
633
}
613
614
static void
615
poend (void)
616
633
{
617
633
  htab_delete (po_hash);
618
633
}
619

620
#define HANDLE_CONDITIONAL_ASSEMBLY(num_read)       \
621
2.60M
  if (ignore_input ())             \
622
2.60M
    {                 \
623
26.7k
      char *eol = find_end_of_line (input_line_pointer - (num_read),  \
624
26.7k
            flag_m68k_mri);      \
625
26.7k
      input_line_pointer = (input_line_pointer <= buffer_limit    \
626
26.7k
          && eol >= buffer_limit)     \
627
26.7k
         ? buffer_limit        \
628
26.7k
         : eol + 1;         \
629
26.7k
      continue;               \
630
26.7k
    }
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
192k
{
636
192k
  sb out;
637
192k
  const char *err;
638
192k
  macro_entry *macro;
639
640
192k
  if (check_macro (line, &out, &err, &macro))
641
6.46k
    {
642
6.46k
      if (err != NULL)
643
1.01k
  as_bad ("%s", err);
644
6.46k
      *input_line_pointer++ = term;
645
6.46k
      input_scrub_include_sb (&out,
646
6.46k
            input_line_pointer, expanding_macro);
647
6.46k
      sb_kill (&out);
648
6.46k
      buffer_limit =
649
6.46k
  input_scrub_next_buffer (&input_line_pointer);
650
#ifdef md_macro_info
651
      md_macro_info (macro);
652
#endif
653
6.46k
      return 1;
654
6.46k
    }
655
186k
  return 0;
656
192k
}
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
874k
{
738
874k
  fragS *insn_start_frag = NULL;
739
740
874k
  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
874k
  if (bundle_lock_frchain == NULL && bundle_align_p2 > 0)
748
0
    insn_start_frag = start_bundle ();
749
750
874k
  md_assemble (line);
751
752
874k
  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
874k
  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
874k
}
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
640k
{
784
640k
  flagword flags = bfd_section_flags (now_seg);
785
786
640k
  return (flags & SEC_ALLOC) && !(flags & (SEC_LOAD | SEC_HAS_CONTENTS));
787
640k
}
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
21.8k
{
801
21.8k
  if (now_seg == absolute_section || in_bss ())
802
4.77k
    {
803
4.77k
      if (fill != NULL)
804
2.53k
  while (len-- > 0)
805
1.43k
    if (*fill++ != '\0')
806
329
      {
807
329
        if (now_seg == absolute_section)
808
190
    as_warn (_("ignoring fill value in absolute section"));
809
139
        else
810
139
    as_warn (_("ignoring fill value in section `%s'"),
811
139
       segment_name (now_seg));
812
329
        break;
813
329
      }
814
4.77k
      fill = NULL;
815
4.77k
      len = 0;
816
4.77k
    }
817
818
#ifdef md_flush_pending_output
819
  md_flush_pending_output ();
820
#endif
821
822
21.8k
#ifdef md_do_align
823
21.8k
  md_do_align (n, fill, len, max, just_record_alignment);
824
16.2k
#endif
825
826
  /* Only make a frag if we HAVE to...  */
827
16.2k
  if ((n > OCTETS_PER_BYTE_POWER) && !need_pass_2)
828
4.54k
    {
829
4.54k
      if (fill == NULL)
830
3.27k
  {
831
3.27k
    if (subseg_text_p (now_seg))
832
0
      frag_align_code (n, max);
833
3.27k
    else
834
3.27k
      frag_align (n, 0, max);
835
3.27k
  }
836
1.26k
      else if (len <= 1)
837
1.26k
  frag_align (n, *fill, max);
838
0
      else
839
0
  frag_align_pattern (n, fill, len, max);
840
4.54k
    }
841
842
16.2k
#ifdef md_do_align
843
21.8k
 just_record_alignment: ATTRIBUTE_UNUSED_LABEL
844
21.8k
#endif
845
846
21.8k
  if (n > OCTETS_PER_BYTE_POWER)
847
10.1k
    record_alignment (now_seg, n - OCTETS_PER_BYTE_POWER);
848
21.8k
}
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
633
{
855
633
  char nul_char;
856
633
  char next_char;
857
633
  char *s;    /* String of symbol, '\0' appended.  */
858
633
  long temp;
859
633
  const pseudo_typeS *pop;
860
861
#ifdef WARN_COMMENTS
862
  found_comment = 0;
863
#endif
864
865
633
  buffer = input_scrub_new_file (name);
866
867
633
  listing_file (name);
868
633
  listing_newline (NULL);
869
633
  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
633
  generate_file_debug ();
875
876
9.66k
  while ((buffer_limit = input_scrub_next_buffer (&input_line_pointer)) != 0)
877
9.05k
    {       /* We have another line to parse.  */
878
9.05k
#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
9.05k
      char *last_eol = NULL;
882
883
9.05k
#endif
884
15.2M
      while (input_line_pointer < buffer_limit)
885
15.2M
  {
886
15.2M
    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
15.2M
    was_new_line = is_end_of_line[(unsigned char) input_line_pointer[-1]];
893
15.2M
    if (was_new_line)
894
15.0M
      {
895
15.0M
        symbol_set_value_now (&dot_symbol);
896
#ifdef md_start_line_hook
897
        md_start_line_hook ();
898
#endif
899
15.0M
        if (input_line_pointer[-1] == '\n')
900
3.48M
    bump_line_counters ();
901
15.0M
      }
902
903
15.2M
#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
15.2M
    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
15.2M
#endif
939
15.2M
    if (was_new_line)
940
15.0M
      {
941
15.0M
        line_label = NULL;
942
943
15.0M
        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
15.0M
      }
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
15.2M
    do
1015
15.4M
      nul_char = next_char = *input_line_pointer++;
1016
15.4M
    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
15.2M
    if (is_name_beginner (next_char) || next_char == '"')
1021
1.67M
      {
1022
1.67M
        char *rest;
1023
1024
        /* Want user-defined label or pseudo/opcode.  */
1025
1.67M
        HANDLE_CONDITIONAL_ASSEMBLY (1);
1026
1027
1.65M
        --input_line_pointer;
1028
1.65M
        nul_char = get_symbol_name (& s); /* name's delimiter.  */
1029
1.65M
        next_char = (nul_char == '"' ? input_line_pointer[1] : nul_char);
1030
1.65M
        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
1.65M
        if (TC_START_LABEL (s, nul_char, next_char))
1038
71.7k
    {
1039
71.7k
      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
71.7k
      line_label = colon (s); /* User-defined label.  */
1059
71.7k
      restore_line_pointer (nul_char);
1060
71.7k
      ++ input_line_pointer;
1061
#ifdef tc_check_label
1062
      tc_check_label (line_label);
1063
#endif
1064
      /* Input_line_pointer->after ':'.  */
1065
71.7k
      SKIP_WHITESPACE ();
1066
71.7k
    }
1067
1.58M
        else if ((next_char == '=' && *rest == '=')
1068
1.58M
           || ((next_char == ' ' || next_char == '\t')
1069
1.57M
         && rest[0] == '='
1070
1.57M
         && rest[1] == '='))
1071
16.1k
    {
1072
16.1k
      equals (s, -1);
1073
16.1k
      demand_empty_rest_of_line ();
1074
16.1k
    }
1075
1.57M
        else if ((next_char == '='
1076
1.57M
           || ((next_char == ' ' || next_char == '\t')
1077
1.49M
          && *rest == '='))
1078
#ifdef TC_EQUAL_IN_INSN
1079
         && !TC_EQUAL_IN_INSN (next_char, s)
1080
#endif
1081
1.57M
         )
1082
83.4k
    {
1083
83.4k
      equals (s, 1);
1084
83.4k
      demand_empty_rest_of_line ();
1085
83.4k
    }
1086
1.48M
        else
1087
1.48M
    {
1088
      /* Expect pseudo-op or machine instruction.  */
1089
1.48M
      pop = NULL;
1090
1091
1.48M
#ifndef TC_CASE_SENSITIVE
1092
1.48M
      {
1093
1.48M
        char *s2 = s;
1094
1095
1.48M
        strncpy (original_case_string, s2,
1096
1.48M
           sizeof (original_case_string) - 1);
1097
1.48M
        original_case_string[sizeof (original_case_string) - 1] = 0;
1098
1099
9.86M
        while (*s2)
1100
8.37M
          {
1101
8.37M
      *s2 = TOLOWER (*s2);
1102
8.37M
      s2++;
1103
8.37M
          }
1104
1.48M
      }
1105
1.48M
#endif
1106
1.48M
      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
1.48M
      if (pop != NULL
1116
1.48M
          || (!flag_m68k_mri && *s == '.'))
1117
605k
        {
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
605k
          if (pop == NULL)
1125
605k
      pop = str_hash_find (po_hash, s + 1);
1126
605k
          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
605k
          if (mri_pending_align
1133
605k
        && (pop == NULL
1134
3.08k
            || !((pop->poc_handler == cons
1135
2.69k
            && pop->poc_val == 1)
1136
2.69k
           || (pop->poc_handler == s_space
1137
2.69k
               && pop->poc_val == 1)
1138
#ifdef tc_conditional_pseudoop
1139
           || tc_conditional_pseudoop (pop)
1140
#endif
1141
2.69k
           || pop->poc_handler == s_if
1142
2.69k
           || pop->poc_handler == s_ifdef
1143
2.69k
           || pop->poc_handler == s_ifc
1144
2.69k
           || pop->poc_handler == s_ifeqs
1145
2.69k
           || pop->poc_handler == s_else
1146
2.69k
           || pop->poc_handler == s_endif
1147
2.69k
           || pop->poc_handler == s_globl
1148
2.69k
           || pop->poc_handler == s_ignore)))
1149
3.08k
      {
1150
3.08k
        do_align (1, (char *) NULL, 0, 0);
1151
3.08k
        mri_pending_align = 0;
1152
1153
3.08k
        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.08k
      }
1159
1160
          /* Print the error msg now, while we still can.  */
1161
605k
          if (pop == NULL)
1162
257k
      {
1163
257k
        char *end = input_line_pointer;
1164
1165
257k
        (void) restore_line_pointer (nul_char);
1166
257k
        s_ignore (0);
1167
257k
        nul_char = next_char = *--input_line_pointer;
1168
257k
        *input_line_pointer = '\0';
1169
257k
        if (! macro_defined || ! try_macro (next_char, s))
1170
257k
          {
1171
257k
            *end = '\0';
1172
257k
            as_bad (_("unknown pseudo-op: `%s'"), s);
1173
257k
            *input_line_pointer++ = nul_char;
1174
257k
          }
1175
257k
        continue;
1176
257k
      }
1177
1178
          /* Put it back for error messages etc.  */
1179
348k
          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
348k
          if (next_char == ' ' || next_char == '\t')
1184
215k
      input_line_pointer++;
1185
1186
          /* Input_line is restored.
1187
       Input_line_pointer->1st non-blank char
1188
       after pseudo-operation.  */
1189
348k
          (*pop->poc_handler) (pop->poc_val);
1190
1191
          /* If that was .end, just get out now.  */
1192
348k
          if (pop->poc_handler == s_end)
1193
24
      goto quit;
1194
348k
        }
1195
881k
      else
1196
881k
        {
1197
          /* WARNING: next_char may be end-of-line.  */
1198
          /* Also: input_line_pointer->`\0` where nul_char was.  */
1199
881k
          (void) restore_line_pointer (nul_char);
1200
881k
          input_line_pointer = _find_end_of_line (input_line_pointer, flag_m68k_mri, 1, 0);
1201
881k
          next_char = nul_char = *input_line_pointer;
1202
881k
          *input_line_pointer = '\0';
1203
1204
881k
          generate_lineno_debug ();
1205
1206
881k
          if (macro_defined && try_macro (next_char, s))
1207
6.46k
      continue;
1208
1209
874k
          if (mri_pending_align)
1210
1.41k
      {
1211
1.41k
        do_align (1, (char *) NULL, 0, 0);
1212
1.41k
        mri_pending_align = 0;
1213
1.41k
        if (line_label != NULL)
1214
447
          {
1215
447
            symbol_set_frag (line_label, frag_now);
1216
447
            S_SET_VALUE (line_label, frag_now_fix ());
1217
447
          }
1218
1.41k
      }
1219
1220
874k
          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
874k
          if (input_line_pointer == NULL)
1225
0
      as_fatal (_("unable to continue with assembly."));
1226
 
1227
874k
          *input_line_pointer++ = nul_char;
1228
1229
          /* We resume loop AFTER the end-of-line from
1230
       this instruction.  */
1231
874k
        }
1232
1.48M
    }
1233
1.39M
        continue;
1234
1.65M
      }
1235
1236
    /* Empty statement?  */
1237
13.5M
    if (is_end_of_line[(unsigned char) next_char])
1238
12.7M
      continue;
1239
1240
824k
    if ((LOCAL_LABELS_DOLLAR || LOCAL_LABELS_FB) && ISDIGIT (next_char))
1241
186k
      {
1242
        /* local label  ("4:")  */
1243
186k
        char *backup = input_line_pointer;
1244
1245
186k
        HANDLE_CONDITIONAL_ASSEMBLY (1);
1246
1247
185k
        temp = next_char - '0';
1248
1249
185k
        if (nul_char == '"')
1250
0
    ++ input_line_pointer;
1251
1252
        /* Read the whole number.  */
1253
185k
        while (ISDIGIT (*input_line_pointer))
1254
386k
    {
1255
386k
      const long digit = *input_line_pointer - '0';
1256
386k
      if (temp > (INT_MAX - digit) / 10)
1257
9.90k
        {
1258
9.90k
          as_bad (_("local label too large near %s"), backup);
1259
9.90k
          temp = -1;
1260
9.90k
          break;
1261
9.90k
        }
1262
376k
      temp = temp * 10 + digit;
1263
376k
      ++input_line_pointer;
1264
376k
    }
1265
1266
        /* Overflow: stop processing the label.  */
1267
185k
        if (temp == -1)
1268
9.90k
    {
1269
9.90k
      ignore_rest_of_line ();
1270
9.90k
      continue;
1271
9.90k
    }
1272
1273
175k
        if (LOCAL_LABELS_DOLLAR
1274
175k
      && *input_line_pointer == '$'
1275
175k
      && *(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
175k
        if (LOCAL_LABELS_FB
1290
175k
      && *input_line_pointer++ == ':')
1291
34.8k
    {
1292
34.8k
      fb_label_instance_inc (temp);
1293
34.8k
      colon (fb_label_name (temp, 0));
1294
34.8k
      continue;
1295
34.8k
    }
1296
1297
140k
        input_line_pointer = backup;
1298
140k
      }
1299
1300
778k
    if (next_char && strchr (line_comment_chars, next_char))
1301
33.8k
      {     /* Its a comment.  Better say APP or NO_APP.  */
1302
33.8k
        sb sbuf;
1303
33.8k
        char *ends;
1304
33.8k
        size_t len;
1305
1306
33.8k
        s = input_line_pointer;
1307
33.8k
        if (!startswith (s, "APP\n"))
1308
32.5k
    {
1309
      /* We ignore it.  */
1310
32.5k
      ignore_rest_of_line ();
1311
32.5k
      continue;
1312
32.5k
    }
1313
1.32k
        bump_line_counters ();
1314
1.32k
        s += 4;
1315
1316
1.32k
        ends = strstr (s, "#NO_APP\n");
1317
1.32k
        len = ends ? ends - s : buffer_limit - s;
1318
1319
1.32k
        sb_build (&sbuf, len + 100);
1320
1.32k
        sb_add_buffer (&sbuf, s, len);
1321
1.32k
        if (!ends)
1322
268
    {
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
268
      do
1328
491
        {
1329
491
          buffer_limit = input_scrub_next_buffer (&buffer);
1330
491
          if (!buffer_limit)
1331
240
      break;
1332
251
          ends = strstr (buffer, "#NO_APP\n");
1333
251
          len = ends ? ends - buffer : buffer_limit - buffer;
1334
251
          sb_add_buffer (&sbuf, buffer, len);
1335
251
        }
1336
268
      while (!ends);
1337
268
    }
1338
1339
1.32k
        input_line_pointer = ends ? ends + 8 : NULL;
1340
1.32k
        input_scrub_include_sb (&sbuf, input_line_pointer, expanding_none);
1341
1.32k
        sb_kill (&sbuf);
1342
1.32k
        buffer_limit = input_scrub_next_buffer (&input_line_pointer);
1343
1.32k
        continue;
1344
33.8k
      }
1345
1346
744k
    HANDLE_CONDITIONAL_ASSEMBLY (1);
1347
1348
#ifdef tc_unrecognized_line
1349
    if (tc_unrecognized_line (next_char))
1350
      continue;
1351
#endif
1352
739k
    input_line_pointer--;
1353
    /* Report unknown char as error.  */
1354
739k
    demand_empty_rest_of_line ();
1355
739k
  }
1356
9.05k
    }
1357
1358
633
 quit:
1359
633
  symbol_set_value_now (&dot_symbol);
1360
1361
633
#ifdef HANDLE_BUNDLE
1362
633
  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
633
#endif
1371
1372
633
#ifdef md_cleanup
1373
633
  md_cleanup ();
1374
633
#endif
1375
  /* Close the input file.  */
1376
633
  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
633
}
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
319
{
1392
319
  valueT value;
1393
319
  unsigned int i;
1394
1395
319
  value = exp->X_add_number;
1396
1.59k
  for (i = 0; i < sizeof (exp->X_add_number) / CHARS_PER_LITTLENUM; i++)
1397
1.27k
    {
1398
1.27k
      generic_bignum[i] = value & LITTLENUM_MASK;
1399
1.27k
      value >>= LITTLENUM_NUMBER_OF_BITS;
1400
1.27k
    }
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
319
  if ((exp->X_add_number < 0) == !sign)
1404
318
    generic_bignum[i++] = sign ? LITTLENUM_MASK : 0;
1405
319
  exp->X_op = O_big;
1406
319
  exp->X_add_number = i;
1407
319
}
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
134k
{
1420
134k
  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
134k
  for (s = input_line_pointer;
1436
3.32M
       !is_end_of_line[(unsigned char) *s];
1437
3.18M
       s++)
1438
3.18M
    ;
1439
134k
#endif
1440
134k
  *stopcp = *s;
1441
134k
  *s = '\0';
1442
1443
134k
  return s;
1444
134k
}
1445
1446
/* Skip to the end of an MRI comment field.  */
1447
1448
void
1449
mri_comment_end (char *stop, int stopc)
1450
134k
{
1451
134k
  know (flag_mri);
1452
1453
0
  input_line_pointer = stop;
1454
134k
  *stop = stopc;
1455
134k
  while (!is_end_of_line[(unsigned char) *input_line_pointer])
1456
0
    ++input_line_pointer;
1457
134k
}
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
17.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
17.3k
{
1476
17.3k
  unsigned int align_limit = TC_ALIGN_LIMIT;
1477
17.3k
  addressT align;
1478
17.3k
  char *stop = NULL;
1479
17.3k
  char stopc = 0;
1480
17.3k
  offsetT fill = 0;
1481
17.3k
  unsigned int max;
1482
17.3k
  int fill_p;
1483
1484
17.3k
  if (flag_mri)
1485
14.2k
    stop = mri_comment_field (&stopc);
1486
1487
17.3k
  if (is_end_of_line[(unsigned char) *input_line_pointer])
1488
237
    {
1489
237
      if (arg < 0)
1490
199
  align = 0;
1491
38
      else
1492
38
  align = arg; /* Default value from pseudo-op table.  */
1493
237
    }
1494
17.0k
  else
1495
17.0k
    {
1496
17.0k
      align = get_absolute_expression ();
1497
17.0k
      SKIP_WHITESPACE ();
1498
1499
#ifdef TC_ALIGN_ZERO_IS_DEFAULT
1500
      if (arg > 0 && align == 0)
1501
  align = arg;
1502
#endif
1503
17.0k
    }
1504
1505
17.3k
  if (bytes_p)
1506
17.1k
    {
1507
      /* Convert to a power of 2.  */
1508
17.1k
      if (align != 0)
1509
6.19k
  {
1510
6.19k
    unsigned int i;
1511
1512
28.0k
    for (i = 0; (align & 1) == 0; align >>= 1, ++i)
1513
21.8k
      ;
1514
6.19k
    if (align != 1)
1515
2.02k
      as_bad (_("alignment not a power of 2"));
1516
1517
6.19k
    align = i;
1518
6.19k
  }
1519
17.1k
    }
1520
1521
17.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
17.3k
  if (*input_line_pointer != ',')
1528
13.5k
    {
1529
13.5k
      fill_p = 0;
1530
13.5k
      max = 0;
1531
13.5k
    }
1532
3.75k
  else
1533
3.75k
    {
1534
3.75k
      ++input_line_pointer;
1535
3.75k
      if (*input_line_pointer == ',')
1536
417
  fill_p = 0;
1537
3.34k
      else
1538
3.34k
  {
1539
3.34k
    fill = get_absolute_expression ();
1540
3.34k
    SKIP_WHITESPACE ();
1541
3.34k
    fill_p = 1;
1542
3.34k
  }
1543
1544
3.75k
      if (*input_line_pointer != ',')
1545
3.24k
  max = 0;
1546
516
      else
1547
516
  {
1548
516
    ++input_line_pointer;
1549
516
    max = get_absolute_expression ();
1550
516
  }
1551
3.75k
    }
1552
1553
17.3k
  if (!fill_p)
1554
13.9k
    {
1555
13.9k
      if (arg < 0)
1556
402
  as_warn (_("expected fill pattern missing"));
1557
13.9k
      do_align (align, (char *) NULL, 0, max);
1558
13.9k
    }
1559
3.34k
  else
1560
3.34k
    {
1561
3.34k
      unsigned int fill_len;
1562
1563
3.34k
      if (arg >= 0)
1564
3.32k
  fill_len = 1;
1565
15
      else
1566
15
  fill_len = -arg;
1567
1568
3.34k
      if (fill_len <= 1)
1569
3.32k
  {
1570
3.32k
    char fill_char = 0;
1571
1572
3.32k
    fill_char = fill;
1573
3.32k
    do_align (align, &fill_char, fill_len, max);
1574
3.32k
  }
1575
15
      else
1576
15
  {
1577
15
    char ab[16];
1578
1579
15
    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
15
    md_number_to_chars (ab, fill, fill_len);
1587
15
    do_align (align, ab, fill_len, max);
1588
15
  }
1589
3.34k
    }
1590
1591
17.3k
  demand_empty_rest_of_line ();
1592
1593
17.3k
  if (flag_mri)
1594
14.2k
    mri_comment_end (stop, stopc);
1595
17.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
17.1k
{
1603
17.1k
  s_align (arg, 1);
1604
17.1k
}
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
198
{
1612
198
  s_align (arg, 0);
1613
198
}
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
3.79k
{
1641
3.79k
  char * name;
1642
3.79k
  char * start;
1643
3.79k
  char c;
1644
1645
3.79k
  c = *input_line_pointer++;
1646
1647
3.79k
  if (c == '"')
1648
80
    {
1649
160
#define SYM_NAME_CHUNK_LEN 128
1650
80
      ptrdiff_t len = SYM_NAME_CHUNK_LEN;
1651
80
      char * name_end;
1652
80
      unsigned int C;
1653
1654
80
      start = name = XNEWVEC (char, len + 1);
1655
1656
80
      name_end = name + SYM_NAME_CHUNK_LEN;
1657
1658
162
      while (is_a_char (C = next_char_of_string ()))
1659
82
  {
1660
82
    if (name >= name_end)
1661
0
      {
1662
0
        ptrdiff_t sofar;
1663
1664
0
        sofar = name - start;
1665
0
        len += SYM_NAME_CHUNK_LEN;
1666
0
        start = XRESIZEVEC (char, start, len + 1);
1667
0
        name_end = start + len;
1668
0
        name = start + sofar;
1669
0
      }
1670
1671
82
    *name++ = (char) C;
1672
82
  }
1673
80
      *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
80
      if (mbstowcs (NULL, name, 0) == (size_t) -1)
1682
0
  as_warn (_("symbol name not recognised in the current locale"));
1683
80
    }
1684
3.71k
  else if (is_name_beginner (c) || (input_from_string && c == FAKE_LABEL_CHAR))
1685
3.40k
    {
1686
3.40k
      ptrdiff_t len;
1687
1688
3.40k
      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
9.93k
      while (is_part_of_name (c = *input_line_pointer++)
1693
9.93k
       || (input_from_string && c == FAKE_LABEL_CHAR))
1694
6.53k
  ;
1695
1696
3.40k
      len = (input_line_pointer - name) - 1;
1697
3.40k
      start = XNEWVEC (char, len + 1);
1698
1699
3.40k
      memcpy (start, name, len);
1700
3.40k
      start[len] = 0;
1701
1702
      /* Skip a name ender char if one is present.  */
1703
3.40k
      if (! is_name_ender (c))
1704
3.40k
  --input_line_pointer;
1705
3.40k
    }
1706
309
  else
1707
309
    name = start = NULL;
1708
1709
3.79k
  if (name == start)
1710
309
    {
1711
309
      as_bad (_("expected symbol name"));
1712
309
      ignore_rest_of_line ();
1713
309
      free (start);
1714
309
      return NULL;
1715
309
    }
1716
1717
3.48k
  SKIP_WHITESPACE ();
1718
1719
3.48k
  return start;
1720
3.79k
}
1721
1722
1723
symbolS *
1724
s_comm_internal (int param,
1725
     symbolS *(*comm_parse_extra) (int, symbolS *, addressT))
1726
3.21k
{
1727
3.21k
  char *name;
1728
3.21k
  offsetT temp, size;
1729
3.21k
  symbolS *symbolP = NULL;
1730
3.21k
  char *stop = NULL;
1731
3.21k
  char stopc = 0;
1732
3.21k
  expressionS exp;
1733
1734
3.21k
  if (flag_mri)
1735
2.52k
    stop = mri_comment_field (&stopc);
1736
1737
3.21k
  if ((name = read_symbol_name ()) == NULL)
1738
303
    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
2.91k
  if (*input_line_pointer == ',')
1743
2.22k
    input_line_pointer++;
1744
1745
2.91k
  temp = get_absolute_expr (&exp);
1746
2.91k
  size = temp;
1747
2.91k
  size &= ((addressT) 2 << (stdoutput->arch_info->bits_per_address - 1)) - 1;
1748
2.91k
  if (exp.X_op == O_absent)
1749
281
    {
1750
281
      as_bad (_("missing size expression"));
1751
281
      ignore_rest_of_line ();
1752
281
      goto out;
1753
281
    }
1754
2.63k
  else if (temp != size || !exp.X_unsigned)
1755
182
    {
1756
182
      as_warn (_("size (%ld) out of range, ignored"), (long) temp);
1757
182
      ignore_rest_of_line ();
1758
182
      goto out;
1759
182
    }
1760
1761
2.45k
  symbolP = symbol_find_or_make (name);
1762
2.45k
  if ((S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
1763
2.45k
      && !S_IS_COMMON (symbolP))
1764
159
    {
1765
159
      if (!S_IS_VOLATILE (symbolP))
1766
159
  {
1767
159
    symbolP = NULL;
1768
159
    as_bad (_("symbol `%s' is already defined"), name);
1769
159
    ignore_rest_of_line ();
1770
159
    goto out;
1771
159
  }
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
2.29k
  size = S_GET_VALUE (symbolP);
1780
2.29k
  if (size == 0)
1781
1.11k
    size = temp;
1782
1.18k
  else if (size != temp)
1783
502
    as_warn (_("size of \"%s\" is already %ld; not changing to %ld"),
1784
502
       name, (long) size, (long) temp);
1785
1786
2.29k
  if (comm_parse_extra != NULL)
1787
2.29k
    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
2.29k
  demand_empty_rest_of_line ();
1796
3.21k
 out:
1797
3.21k
  if (flag_mri)
1798
2.52k
    mri_comment_end (stop, stopc);
1799
3.21k
  free (name);
1800
3.21k
  return symbolP;
1801
2.29k
}
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
300
{
1915
300
  segT section;
1916
300
  int temp;
1917
1918
300
  temp = get_absolute_expression ();
1919
300
  if (flag_readonly_data_in_text)
1920
0
    {
1921
0
      section = text_section;
1922
0
      temp += 1000;
1923
0
    }
1924
300
  else
1925
300
    section = data_section;
1926
1927
300
  subseg_set (section, (subsegT) temp);
1928
1929
300
  demand_empty_rest_of_line ();
1930
300
}
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
1.37k
{
1938
#ifdef LISTING
1939
  if (listing)
1940
    listing_source_file (file);
1941
#endif
1942
1.37k
  register_dependency (file);
1943
1.37k
#ifdef obj_app_file
1944
1.37k
  obj_app_file (file);
1945
1.37k
#endif
1946
1.37k
}
1947
1948
void
1949
s_file (int ignore ATTRIBUTE_UNUSED)
1950
1.37k
{
1951
1.37k
  char *s;
1952
1.37k
  int length;
1953
1954
  /* Some assemblers tolerate immediately following '"'.  */
1955
1.37k
  if ((s = demand_copy_string (&length)) != 0)
1956
1.37k
    {
1957
1.37k
      new_logical_line_flags (s, -1, 1);
1958
1959
      /* In MRI mode, the preprocessor may have inserted an extraneous
1960
   backquote.  */
1961
1.37k
      if (flag_m68k_mri
1962
1.37k
    && *input_line_pointer == '\''
1963
1.37k
    && is_end_of_line[(unsigned char) input_line_pointer[1]])
1964
0
  ++input_line_pointer;
1965
1966
1.37k
      demand_empty_rest_of_line ();
1967
1.37k
      s_file_string (s);
1968
1.37k
    }
1969
1.37k
}
1970
1971
static bool
1972
get_linefile_number (int *flag)
1973
121k
{
1974
121k
  expressionS exp;
1975
1976
121k
  SKIP_WHITESPACE ();
1977
1978
121k
  if (*input_line_pointer < '0' || *input_line_pointer > '9')
1979
20.1k
    return false;
1980
1981
  /* Don't mistakenly interpret octal numbers as line numbers.  */
1982
101k
  if (*input_line_pointer == '0')
1983
1.32k
    {
1984
1.32k
      *flag = 0;
1985
1.32k
      ++input_line_pointer;
1986
1.32k
      return true;
1987
1.32k
    }
1988
1989
100k
  expression_and_evaluate (&exp);
1990
100k
  if (exp.X_op != O_constant)
1991
1.14k
    return false;
1992
1993
99.2k
#if defined (BFD64) || LONG_MAX > INT_MAX
1994
99.2k
  if (exp.X_add_number < INT_MIN || exp.X_add_number > INT_MAX)
1995
863
    return false;
1996
98.3k
#endif
1997
1998
98.3k
  *flag = exp.X_add_number;
1999
2000
98.3k
  return true;
2001
99.2k
}
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
94.5k
{
2011
94.5k
  char *file = NULL;
2012
94.5k
  int linenum, flags = 0;
2013
2014
  /* The given number is that of the next line.  */
2015
94.5k
  if (!get_linefile_number (&linenum))
2016
39
    {
2017
39
      ignore_rest_of_line ();
2018
39
      return;
2019
39
    }
2020
2021
94.4k
  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
0
    as_warn (_("line numbers must be positive; line number %d rejected"),
2032
0
       linenum);
2033
94.4k
  else
2034
94.4k
    {
2035
94.4k
      int length = 0;
2036
2037
94.4k
      SKIP_WHITESPACE ();
2038
2039
94.4k
      if (*input_line_pointer == '"')
2040
22.0k
  file = demand_copy_string (&length);
2041
72.3k
      else if (*input_line_pointer == '.')
2042
70.9k
  {
2043
    /* buffer_and_nest() may insert this form.  */
2044
70.9k
    ++input_line_pointer;
2045
70.9k
    flags = 1 << 3;
2046
70.9k
  }
2047
2048
94.4k
      if (file)
2049
22.0k
  {
2050
22.0k
    int this_flag;
2051
2052
27.2k
    while (get_linefile_number (&this_flag))
2053
5.19k
      switch (this_flag)
2054
5.19k
        {
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
485
        case 1:
2067
519
        case 2:
2068
519
    if (flags && flags != (1 << this_flag))
2069
0
      as_warn (_("incompatible flag %i in line directive"),
2070
0
         this_flag);
2071
519
    else
2072
519
      flags |= 1 << this_flag;
2073
519
    break;
2074
2075
37
        case 3:
2076
37
        case 4:
2077
    /* We ignore these.  */
2078
37
    break;
2079
2080
4.64k
        default:
2081
4.64k
    as_warn (_("unsupported flag %i in line directive"),
2082
4.64k
       this_flag);
2083
4.64k
    break;
2084
5.19k
        }
2085
2086
22.0k
    if (!is_end_of_line[(unsigned char)*input_line_pointer])
2087
17.0k
      file = NULL;
2088
22.0k
        }
2089
2090
94.4k
      if (file || flags)
2091
76.5k
  {
2092
76.5k
    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
76.5k
    if (input_line_pointer[-1] == '\n')
2097
58.6k
      linenum--;
2098
2099
76.5k
    new_logical_line_flags (file, linenum, flags);
2100
#ifdef LISTING
2101
    if (listing)
2102
      listing_source_line (linenum);
2103
#endif
2104
76.5k
    return;
2105
76.5k
  }
2106
94.4k
    }
2107
17.9k
  ignore_rest_of_line ();
2108
17.9k
}
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
16
    {
2118
      /* The MRI assembler permits the start symbol to follow .end,
2119
   but we don't support that.  */
2120
16
      SKIP_WHITESPACE ();
2121
16
      if (!is_end_of_line[(unsigned char) *input_line_pointer]
2122
16
    && *input_line_pointer != '*'
2123
16
    && *input_line_pointer != '!')
2124
11
  as_warn (_("start address not supported"));
2125
16
    }
2126
24
}
2127
2128
/* Handle the .err pseudo-op.  */
2129
2130
void
2131
s_err (int ignore ATTRIBUTE_UNUSED)
2132
28
{
2133
28
  as_bad (_(".err encountered"));
2134
28
  demand_empty_rest_of_line ();
2135
28
}
2136
2137
/* Handle the .error and .warning pseudo-ops.  */
2138
2139
void
2140
s_errwarn (int err)
2141
232
{
2142
232
  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
232
  const char *msg
2149
232
    = (err ? _(".error directive invoked in source file")
2150
232
       : _(".warning directive invoked in source file"));
2151
2152
232
  if (!is_it_end_of_statement ())
2153
106
    {
2154
106
      if (*input_line_pointer != '\"')
2155
100
  {
2156
100
    as_bad (_("%s argument must be a string"),
2157
100
      err ? ".error" : ".warning");
2158
100
    ignore_rest_of_line ();
2159
100
    return;
2160
100
  }
2161
2162
6
      msg = demand_copy_C_string (&len);
2163
6
      if (msg == NULL)
2164
0
  return;
2165
6
    }
2166
2167
132
  if (err)
2168
132
    as_bad ("%s", msg);
2169
0
  else
2170
0
    as_warn ("%s", msg);
2171
132
  demand_empty_rest_of_line ();
2172
132
}
2173
2174
/* Handle the MRI fail pseudo-op.  */
2175
2176
void
2177
s_fail (int ignore ATTRIBUTE_UNUSED)
2178
12.6k
{
2179
12.6k
  offsetT temp;
2180
12.6k
  char *stop = NULL;
2181
12.6k
  char stopc = 0;
2182
2183
12.6k
  if (flag_mri)
2184
11.9k
    stop = mri_comment_field (&stopc);
2185
2186
12.6k
  temp = get_absolute_expression ();
2187
12.6k
  if (temp >= 500)
2188
3.58k
    as_warn (_(".fail %ld encountered"), (long) temp);
2189
9.07k
  else
2190
9.07k
    as_bad (_(".fail %ld encountered"), (long) temp);
2191
2192
12.6k
  demand_empty_rest_of_line ();
2193
2194
12.6k
  if (flag_mri)
2195
11.9k
    mri_comment_end (stop, stopc);
2196
12.6k
}
2197
2198
void
2199
s_fill (int ignore ATTRIBUTE_UNUSED)
2200
13.4k
{
2201
13.4k
  expressionS rep_exp;
2202
13.4k
  long size = 1;
2203
13.4k
  long fill = 0;
2204
13.4k
  char *p;
2205
2206
#ifdef md_flush_pending_output
2207
  md_flush_pending_output ();
2208
#endif
2209
2210
13.4k
#ifdef md_cons_align
2211
13.4k
  md_cons_align (1);
2212
13.4k
#endif
2213
2214
13.4k
  expression (&rep_exp);
2215
13.4k
  if (*input_line_pointer == ',')
2216
5.28k
    {
2217
5.28k
      input_line_pointer++;
2218
5.28k
      size = get_absolute_expression ();
2219
5.28k
      if (*input_line_pointer == ',')
2220
2.41k
  {
2221
2.41k
    input_line_pointer++;
2222
2.41k
    fill = get_absolute_expression ();
2223
2.41k
  }
2224
5.28k
    }
2225
2226
  /* This is to be compatible with BSD 4.2 AS, not for any rational reason.  */
2227
16.7k
#define BSD_FILL_SIZE_CROCK_8 (8)
2228
13.4k
  if (size > BSD_FILL_SIZE_CROCK_8)
2229
1.61k
    {
2230
1.61k
      as_warn (_(".fill size clamped to %d"), BSD_FILL_SIZE_CROCK_8);
2231
1.61k
      size = BSD_FILL_SIZE_CROCK_8;
2232
1.61k
    }
2233
13.4k
  if (size < 0)
2234
214
    {
2235
214
      as_warn (_("size negative; .fill ignored"));
2236
214
      size = 0;
2237
214
    }
2238
13.2k
  else if (rep_exp.X_op == O_constant && rep_exp.X_add_number <= 0)
2239
4.61k
    {
2240
4.61k
      if (rep_exp.X_add_number < 0)
2241
2.54k
  as_warn (_("repeat < 0; .fill ignored"));
2242
4.61k
      size = 0;
2243
4.61k
    }
2244
8.64k
  else if (size && !need_pass_2)
2245
7.44k
    {
2246
7.44k
      if (now_seg == absolute_section && rep_exp.X_op != O_constant)
2247
384
  {
2248
384
    as_bad (_("non-constant fill count for absolute section"));
2249
384
    size = 0;
2250
384
  }
2251
7.06k
      else if (now_seg == absolute_section && fill && rep_exp.X_add_number != 0)
2252
1
  {
2253
1
    as_bad (_("attempt to fill absolute section with non-zero value"));
2254
1
    size = 0;
2255
1
  }
2256
7.06k
      else if (fill
2257
7.06k
         && (rep_exp.X_op != O_constant || rep_exp.X_add_number != 0)
2258
7.06k
         && in_bss ())
2259
134
  {
2260
134
    as_bad (_("attempt to fill section `%s' with non-zero value"),
2261
134
      segment_name (now_seg));
2262
134
    size = 0;
2263
134
  }
2264
7.44k
    }
2265
2266
13.4k
  if (size && !need_pass_2)
2267
6.92k
    {
2268
6.92k
      if (now_seg == absolute_section)
2269
693
  abs_section_offset += rep_exp.X_add_number * size;
2270
2271
6.92k
      if (rep_exp.X_op == O_constant)
2272
4.07k
  {
2273
4.07k
    p = frag_var (rs_fill, (int) size, (int) size,
2274
4.07k
      (relax_substateT) 0, (symbolS *) 0,
2275
4.07k
      (offsetT) rep_exp.X_add_number,
2276
4.07k
      (char *) 0);
2277
4.07k
  }
2278
2.85k
      else
2279
2.85k
  {
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
2.85k
    symbolS *rep_sym;
2286
2.85k
    rep_sym = make_expr_symbol (&rep_exp);
2287
2.85k
    if (size != 1)
2288
466
      {
2289
466
        expressionS size_exp;
2290
466
        size_exp.X_op = O_constant;
2291
466
        size_exp.X_add_number = size;
2292
2293
466
        rep_exp.X_op = O_multiply;
2294
466
        rep_exp.X_add_symbol = rep_sym;
2295
466
        rep_exp.X_op_symbol = make_expr_symbol (&size_exp);
2296
466
        rep_exp.X_add_number = 0;
2297
466
        rep_sym = make_expr_symbol (&rep_exp);
2298
466
      }
2299
2300
2.85k
    p = frag_var (rs_space, (int) size, (int) size,
2301
2.85k
      (relax_substateT) 0, rep_sym, (offsetT) 0, (char *) 0);
2302
2.85k
  }
2303
2304
6.92k
      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.39k
#define BSD_FILL_SIZE_CROCK_4 (4)
2312
6.92k
      md_number_to_chars (p, (valueT) fill,
2313
6.92k
        (size > BSD_FILL_SIZE_CROCK_4
2314
6.92k
         ? BSD_FILL_SIZE_CROCK_4
2315
6.92k
         : (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.92k
    }
2321
13.4k
  demand_empty_rest_of_line ();
2322
13.4k
}
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
8.40k
{
2369
8.40k
  char * eol;
2370
8.40k
  const char * file;
2371
8.40k
  unsigned int line;
2372
8.40k
  sb s;
2373
8.40k
  const char *err;
2374
8.40k
  sb out;
2375
2376
8.40k
  file = as_where (&line);
2377
2378
8.40k
  eol = find_end_of_line (input_line_pointer, 0);
2379
8.40k
  sb_build (&s, eol - input_line_pointer);
2380
8.40k
  sb_add_buffer (&s, input_line_pointer, eol - input_line_pointer);
2381
8.40k
  input_line_pointer = eol;
2382
2383
8.40k
  sb_new (&out);
2384
2385
8.40k
  err = expand_irp (irpc, 0, &s, &out, get_non_macro_line_sb);
2386
8.40k
  if (err != NULL)
2387
7.42k
    as_bad_where (file, line, "%s", err);
2388
2389
8.40k
  sb_kill (&s);
2390
2391
8.40k
  input_scrub_include_sb (&out, input_line_pointer, expanding_repeat);
2392
8.40k
  sb_kill (&out);
2393
8.40k
  buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2394
8.40k
}
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
0
{
2404
0
  enum linkonce_type type;
2405
2406
0
  SKIP_WHITESPACE ();
2407
2408
0
  type = LINKONCE_DISCARD;
2409
2410
0
  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
0
  {
2434
0
    flagword flags;
2435
2436
0
    if ((bfd_applicable_section_flags (stdoutput) & SEC_LINK_ONCE) == 0)
2437
0
      as_warn (_(".linkonce is not supported for this object file format"));
2438
2439
0
    flags = bfd_section_flags (now_seg);
2440
0
    flags |= SEC_LINK_ONCE;
2441
0
    switch (type)
2442
0
      {
2443
0
      default:
2444
0
  abort ();
2445
0
      case LINKONCE_DISCARD:
2446
0
  flags |= SEC_LINK_DUPLICATES_DISCARD;
2447
0
  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
0
      }
2458
0
    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
0
  }
2462
0
#endif /* ! defined (obj_handle_link_once) */
2463
2464
0
  demand_empty_rest_of_line ();
2465
0
}
2466
2467
void
2468
bss_alloc (symbolS *symbolP, addressT size, unsigned int align)
2469
32
{
2470
32
  char *pfrag;
2471
32
  segT current_seg = now_seg;
2472
32
  subsegT current_subseg = now_subseg;
2473
32
  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
32
  subseg_set (bss_seg, 1);
2491
2492
32
  if (align > OCTETS_PER_BYTE_POWER)
2493
11
    {
2494
11
      record_alignment (bss_seg, align);
2495
11
      frag_align (align, 0, 0);
2496
11
    }
2497
2498
  /* Detach from old frag.  */
2499
32
  if (S_GET_SEGMENT (symbolP) == bss_seg)
2500
0
    symbol_get_frag (symbolP)->fr_symbol = NULL;
2501
2502
32
  symbol_set_frag (symbolP, frag_now);
2503
32
  pfrag = frag_var (rs_org, 1, 1, 0, symbolP, size * OCTETS_PER_BYTE, NULL);
2504
32
  *pfrag = 0;
2505
2506
32
#ifdef S_SET_SIZE
2507
32
  S_SET_SIZE (symbolP, size);
2508
32
#endif
2509
32
  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
32
  subseg_set (current_seg, current_subseg);
2520
32
}
2521
2522
offsetT
2523
parse_align (int align_bytes)
2524
581
{
2525
581
  expressionS exp;
2526
581
  addressT align;
2527
2528
581
  SKIP_WHITESPACE ();
2529
581
  if (*input_line_pointer != ',')
2530
0
    {
2531
5
    no_align:
2532
5
      as_bad (_("expected alignment after size"));
2533
5
      ignore_rest_of_line ();
2534
5
      return -1;
2535
0
    }
2536
2537
581
  input_line_pointer++;
2538
581
  SKIP_WHITESPACE ();
2539
2540
581
  align = get_absolute_expr (&exp);
2541
581
  if (exp.X_op == O_absent)
2542
5
    goto no_align;
2543
2544
576
  if (!exp.X_unsigned)
2545
5
    {
2546
5
      as_warn (_("alignment negative; 0 assumed"));
2547
5
      align = 0;
2548
5
    }
2549
2550
576
  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
576
  return align;
2565
576
}
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
32
{
2576
32
  addressT align = 0;
2577
2578
32
  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
32
  else
2585
    /* Assume some objects may require alignment on some systems.  */
2586
32
    TC_IMPLICIT_LCOMM_ALIGNMENT (size, align);
2587
2588
32
  bss_alloc (symbolP, size, align);
2589
32
  return symbolP;
2590
32
}
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
173
{
2607
173
  char *name;
2608
173
  expressionS exp;
2609
173
  symbolS *symbolP;
2610
2611
  /* We permit ANY defined expression: BSD4.2 demands constants.  */
2612
173
  if ((name = read_symbol_name ()) == NULL)
2613
1
    return;
2614
2615
172
  if (*input_line_pointer != ',')
2616
30
    {
2617
30
      as_bad (_("expected comma after \"%s\""), name);
2618
30
      goto err_out;
2619
30
    }
2620
2621
142
  input_line_pointer++;
2622
142
  expression_and_evaluate (&exp);
2623
2624
142
  if (exp.X_op != O_constant
2625
142
      && exp.X_op != O_register)
2626
32
    {
2627
32
      as_bad (_("bad expression"));
2628
32
      goto err_out;
2629
32
    }
2630
2631
110
  symbolP = symbol_find_or_make (name);
2632
2633
110
  if (S_GET_SEGMENT (symbolP) == undefined_section)
2634
6
    {
2635
      /* The name might be an undefined .global symbol; be sure to
2636
   keep the "external" bit.  */
2637
6
      S_SET_SEGMENT (symbolP,
2638
6
         (exp.X_op == O_constant
2639
6
          ? absolute_section
2640
6
          : reg_section));
2641
6
      S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
2642
6
    }
2643
104
  else
2644
104
    {
2645
104
      as_bad (_("symbol `%s' is already defined"), name);
2646
104
    }
2647
2648
110
  demand_empty_rest_of_line ();
2649
110
  free (name);
2650
110
  return;
2651
2652
62
 err_out:
2653
62
  ignore_rest_of_line ();
2654
62
  free (name);
2655
62
  return;
2656
142
}
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
104k
{
2664
104k
  char *eol;
2665
2666
104k
  if (input_line_pointer[-1] == '\n')
2667
24.8k
    bump_line_counters ();
2668
2669
104k
  if (input_line_pointer >= buffer_limit)
2670
61
    {
2671
61
      buffer_limit = input_scrub_next_buffer (&input_line_pointer);
2672
61
      if (buffer_limit == 0)
2673
22
  return 0;
2674
61
    }
2675
2676
104k
  eol = _find_end_of_line (input_line_pointer, flag_m68k_mri, 0, in_macro);
2677
104k
  sb_add_buffer (line, input_line_pointer, eol - input_line_pointer);
2678
104k
  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
104k
  return *input_line_pointer++;
2686
104k
}
2687
2688
static size_t
2689
get_non_macro_line_sb (sb *line)
2690
71.8k
{
2691
71.8k
  return get_line_sb (line, 0);
2692
71.8k
}
2693
2694
static size_t
2695
get_macro_line_sb (sb *line)
2696
32.1k
{
2697
32.1k
  return get_line_sb (line, 1);
2698
32.1k
}
2699
2700
/* Define a macro.  This is an interface to macro.c.  */
2701
2702
void
2703
s_macro (int ignore ATTRIBUTE_UNUSED)
2704
8.52k
{
2705
8.52k
  char *eol;
2706
8.52k
  sb s;
2707
8.52k
  macro_entry *macro;
2708
2709
8.52k
  eol = find_end_of_line (input_line_pointer, 0);
2710
8.52k
  sb_build (&s, eol - input_line_pointer);
2711
8.52k
  sb_add_buffer (&s, input_line_pointer, eol - input_line_pointer);
2712
8.52k
  input_line_pointer = eol;
2713
2714
8.52k
  if (line_label != NULL)
2715
16
    {
2716
16
      sb label;
2717
16
      size_t len;
2718
16
      const char *name;
2719
2720
16
      name = S_GET_NAME (line_label);
2721
16
      len = strlen (name);
2722
16
      sb_build (&label, len);
2723
16
      sb_add_buffer (&label, name, len);
2724
16
      macro = define_macro (&s, &label, get_macro_line_sb);
2725
16
      sb_kill (&label);
2726
16
    }
2727
8.51k
  else
2728
8.51k
    macro = define_macro (&s, NULL, get_macro_line_sb);
2729
8.52k
  if (macro != NULL)
2730
183
    {
2731
183
      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
183
      if (((NO_PSEUDO_DOT || flag_m68k_mri)
2739
183
     && str_hash_find (po_hash, macro->name) != NULL)
2740
183
    || (!flag_m68k_mri
2741
183
        && macro->name[0] == '.'
2742
183
        && str_hash_find (po_hash, macro->name + 1) != NULL))
2743
6
  {
2744
6
    as_warn_where (macro->file, macro->line,
2745
6
       _("attempt to redefine pseudo-op `%s' ignored"),
2746
6
       macro->name);
2747
6
    str_hash_delete (macro_hash, macro->name);
2748
6
  }
2749
183
    }
2750
2751
8.52k
  sb_kill (&s);
2752
8.52k
}
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
1.45k
{
2774
1.45k
  int on;
2775
#ifdef MRI_MODE_CHANGE
2776
  int old_flag;
2777
#endif
2778
2779
1.45k
  on = get_absolute_expression ();
2780
#ifdef MRI_MODE_CHANGE
2781
  old_flag = flag_mri;
2782
#endif
2783
1.45k
  if (on != 0)
2784
953
    {
2785
953
      flag_mri = 1;
2786
#ifdef TC_M68K
2787
      flag_m68k_mri = 1;
2788
#endif
2789
953
    }
2790
498
  else
2791
498
    {
2792
498
      flag_mri = 0;
2793
#ifdef TC_M68K
2794
      flag_m68k_mri = 0;
2795
#endif
2796
498
    }
2797
2798
  /* Operator precedence changes in m68k MRI mode, so we need to
2799
     update the operator rankings.  */
2800
1.45k
  expr_set_precedence ();
2801
2802
#ifdef MRI_MODE_CHANGE
2803
  if (on != old_flag)
2804
    MRI_MODE_CHANGE (on);
2805
#endif
2806
2807
1.45k
  demand_empty_rest_of_line ();
2808
1.45k
}
2809
2810
/* Handle changing the location counter.  */
2811
2812
static void
2813
do_org (segT segment, expressionS *exp, int fill)
2814
11.0k
{
2815
11.0k
  if (segment != now_seg
2816
11.0k
      && segment != absolute_section
2817
11.0k
      && segment != expr_section)
2818
0
    as_bad (_("invalid segment \"%s\""), segment_name (segment));
2819
2820
11.0k
  if (now_seg == absolute_section)
2821
2.03k
    {
2822
2.03k
      if (fill != 0)
2823
903
  as_warn (_("ignoring fill value in absolute section"));
2824
2.03k
      if (exp->X_op != O_constant)
2825
24
  {
2826
24
    as_bad (_("only constant offsets supported in absolute section"));
2827
24
    exp->X_add_number = 0;
2828
24
  }
2829
2.03k
      abs_section_offset = exp->X_add_number;
2830
2.03k
    }
2831
9.00k
  else
2832
9.00k
    {
2833
9.00k
      char *p;
2834
9.00k
      symbolS *sym = exp->X_add_symbol;
2835
9.00k
      offsetT off = exp->X_add_number * OCTETS_PER_BYTE;
2836
2837
9.00k
      if (fill && in_bss ())
2838
173
  as_warn (_("ignoring fill value in section `%s'"),
2839
173
     segment_name (now_seg));
2840
2841
9.00k
      if (exp->X_op != O_constant && exp->X_op != O_symbol)
2842
22
  {
2843
    /* Handle complex expressions.  */
2844
22
    sym = make_expr_symbol (exp);
2845
22
    off = 0;
2846
22
  }
2847
2848
9.00k
      p = frag_var (rs_org, 1, 1, (relax_substateT) 0, sym, off, (char *) 0);
2849
9.00k
      *p = fill;
2850
9.00k
    }
2851
11.0k
}
2852
2853
void
2854
s_org (int ignore ATTRIBUTE_UNUSED)
2855
9.17k
{
2856
9.17k
  segT segment;
2857
9.17k
  expressionS exp;
2858
9.17k
  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
9.17k
  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
9.17k
  segment = get_known_segmented_expression (&exp);
2887
9.17k
  if (*input_line_pointer == ',')
2888
8.56k
    {
2889
8.56k
      input_line_pointer++;
2890
8.56k
      temp_fill = get_absolute_expression ();
2891
8.56k
    }
2892
602
  else
2893
602
    temp_fill = 0;
2894
2895
9.17k
  if (!need_pass_2)
2896
9.17k
    do_org (segment, &exp, temp_fill);
2897
2898
9.17k
  demand_empty_rest_of_line ();
2899
9.17k
}
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
3.01k
{
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
3.01k
  as_bad ("MRI mode not supported for this target");
2989
3.01k
  ignore_rest_of_line ();
2990
3.01k
#endif /* ! TC_M68K */
2991
3.01k
}
2992
2993
/* Handle the .print pseudo-op.  */
2994
2995
void
2996
s_print (int ignore ATTRIBUTE_UNUSED)
2997
24
{
2998
24
  char *s;
2999
24
  int len;
3000
3001
24
  s = demand_copy_C_string (&len);
3002
24
  if (s != NULL)
3003
23
    printf ("%s\n", s);
3004
24
  demand_empty_rest_of_line ();
3005
24
}
3006
3007
/* Handle the .purgem pseudo-op.  */
3008
3009
void
3010
s_purgem (int ignore ATTRIBUTE_UNUSED)
3011
2.44k
{
3012
2.44k
  if (is_it_end_of_statement ())
3013
160
    {
3014
160
      demand_empty_rest_of_line ();
3015
160
      return;
3016
160
    }
3017
3018
2.28k
  do
3019
2.29k
    {
3020
2.29k
      char *name;
3021
2.29k
      char c;
3022
3023
2.29k
      SKIP_WHITESPACE ();
3024
2.29k
      c = get_symbol_name (& name);
3025
2.29k
      delete_macro (name);
3026
2.29k
      *input_line_pointer = c;
3027
2.29k
      SKIP_WHITESPACE_AFTER_NAME ();
3028
2.29k
    }
3029
2.29k
  while (*input_line_pointer++ == ',');
3030
3031
2.28k
  --input_line_pointer;
3032
2.28k
  demand_empty_rest_of_line ();
3033
2.28k
}
3034
3035
/* Handle the .endm/.endr pseudo-ops.  */
3036
3037
static void
3038
s_bad_end (int endr)
3039
19.6k
{
3040
19.6k
  as_warn (_(".end%c encountered without preceding %s"),
3041
19.6k
     endr ? 'r' : 'm',
3042
19.6k
     endr ? ".rept, .irp, or .irpc" : ".macro");
3043
19.6k
  demand_empty_rest_of_line ();
3044
19.6k
}
3045
3046
/* Handle the .rept pseudo-op.  */
3047
3048
void
3049
s_rept (int ignore ATTRIBUTE_UNUSED)
3050
9.56k
{
3051
9.56k
  size_t count;
3052
3053
9.56k
  count = (size_t) get_absolute_expression ();
3054
3055
9.56k
  do_repeat (count, "REPT", "ENDR", NULL);
3056
9.56k
}
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
9.56k
{
3067
9.56k
  sb one;
3068
9.56k
  sb many;
3069
3070
9.56k
  if (((ssize_t) count) < 0)
3071
1.65k
    {
3072
1.65k
      as_bad (_("negative count for %s - ignored"), start);
3073
1.65k
      count = 0;
3074
1.65k
    }
3075
3076
9.56k
  sb_new (&one);
3077
9.56k
  if (!buffer_and_nest (start, end, &one, get_non_macro_line_sb))
3078
5.83k
    {
3079
5.83k
      as_bad (_("%s without %s"), start, end);
3080
5.83k
      sb_kill (&one);
3081
5.83k
      return;
3082
5.83k
    }
3083
3084
3.72k
  if (expander == NULL || strstr (one.ptr, expander) == NULL)
3085
3.72k
    {
3086
3.72k
      sb_build (&many, count * one.len);
3087
65.4k
      while (count-- > 0)
3088
61.7k
  sb_add_sb (&many, &one);
3089
3.72k
    }
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
3.72k
  sb_kill (&one);
3114
3115
3.72k
  input_scrub_include_sb (&many, input_line_pointer, expanding_repeat);
3116
3.72k
  sb_kill (&many);
3117
3.72k
  buffer_limit = input_scrub_next_buffer (&input_line_pointer);
3118
3.72k
}
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
99.5k
{
3139
99.5k
  symbolS *symbolP;
3140
3141
99.5k
  if (name[0] == '.' && name[1] == '\0')
3142
1.86k
    {
3143
      /* Turn '. = mumble' into a .org mumble.  */
3144
1.86k
      segT segment;
3145
1.86k
      expressionS exp;
3146
3147
1.86k
      segment = get_known_segmented_expression (&exp);
3148
3149
1.86k
      if (!need_pass_2)
3150
1.86k
  do_org (segment, &exp, 0);
3151
3152
1.86k
      return;
3153
1.86k
    }
3154
3155
97.7k
  if ((symbolP = symbol_find (name)) == NULL
3156
97.7k
      && (symbolP = md_undefined_symbol (name)) == NULL)
3157
5.65k
    {
3158
5.65k
      symbolP = symbol_find_or_make (name);
3159
5.65k
#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
5.65k
      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
5.65k
#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
5.65k
    }
3177
3178
97.7k
  if (S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
3179
91.2k
    {
3180
91.2k
      if ((mode != 0 || !S_IS_VOLATILE (symbolP))
3181
91.2k
    && !S_CAN_BE_REDEFINED (symbolP))
3182
21.1k
  {
3183
21.1k
    as_bad (_("symbol `%s' is already defined"), name);
3184
21.1k
    ignore_rest_of_line ();
3185
21.1k
    input_line_pointer--;
3186
21.1k
    return;
3187
21.1k
  }
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
70.1k
      else if (S_IS_VOLATILE (symbolP))
3192
70.1k
  symbolP = symbol_clone (symbolP, 1);
3193
91.2k
    }
3194
3195
76.5k
  if (mode == 0)
3196
75.1k
    S_SET_VOLATILE (symbolP);
3197
1.39k
  else if (mode < 0)
3198
1.39k
    S_SET_FORWARD_REF (symbolP);
3199
3200
76.5k
  pseudo_set (symbolP);
3201
76.5k
}
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
91
{
3211
91
  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
91
  if ((name = read_symbol_name ()) == NULL)
3217
5
    return;
3218
3219
86
  if (*input_line_pointer != ',')
3220
81
    {
3221
81
      as_bad (_("expected comma after \"%s\""), name);
3222
81
      ignore_rest_of_line ();
3223
81
      free (name);
3224
81
      return;
3225
81
    }
3226
3227
5
  input_line_pointer++;
3228
5
  assign_symbol (name, equiv);
3229
5
  demand_empty_rest_of_line ();
3230
5
  free (name);
3231
5
}
3232
3233
void
3234
s_space (int mult)
3235
10.1k
{
3236
10.1k
  expressionS exp;
3237
10.1k
  expressionS val;
3238
10.1k
  char *p = 0;
3239
10.1k
  char *stop = NULL;
3240
10.1k
  char stopc = 0;
3241
10.1k
  int bytes;
3242
3243
#ifdef md_flush_pending_output
3244
  md_flush_pending_output ();
3245
#endif
3246
3247
10.1k
  switch (mult)
3248
10.1k
    {
3249
557
    case 'x':
3250
557
#ifdef X_PRECISION
3251
557
# ifndef P_PRECISION
3252
557
#  define P_PRECISION     X_PRECISION
3253
557
#  define P_PRECISION_PAD X_PRECISION_PAD
3254
557
# endif
3255
557
      mult = (X_PRECISION + X_PRECISION_PAD) * sizeof (LITTLENUM_TYPE);
3256
557
      if (!mult)
3257
0
#endif
3258
0
  mult = 12;
3259
557
      break;
3260
3261
2
    case 'p':
3262
2
#ifdef P_PRECISION
3263
2
      mult = (P_PRECISION + P_PRECISION_PAD) * sizeof (LITTLENUM_TYPE);
3264
2
      if (!mult)
3265
0
#endif
3266
0
  mult = 12;
3267
2
      break;
3268
10.1k
    }
3269
3270
10.1k
#ifdef md_cons_align
3271
10.1k
  md_cons_align (1);
3272
10.1k
#endif
3273
3274
10.1k
  if (flag_mri)
3275
7.79k
    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
10.1k
  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
10.1k
  expression (&exp);
3320
3321
10.1k
  SKIP_WHITESPACE ();
3322
10.1k
  if (*input_line_pointer == ',')
3323
6.99k
    {
3324
6.99k
      ++input_line_pointer;
3325
6.99k
      expression (&val);
3326
6.99k
    }
3327
3.13k
  else
3328
3.13k
    {
3329
3.13k
      val.X_op = O_constant;
3330
3.13k
      val.X_add_number = 0;
3331
3.13k
    }
3332
3333
10.1k
  if ((val.X_op != O_constant
3334
10.1k
       || val.X_add_number < - 0x80
3335
10.1k
       || val.X_add_number > 0xff
3336
10.1k
       || (mult != 0 && mult != 1 && val.X_add_number != 0))
3337
10.1k
      && (now_seg != absolute_section && !in_bss ()))
3338
5.84k
    {
3339
5.84k
      resolve_expression (&exp);
3340
5.84k
      if (exp.X_op != O_constant)
3341
197
  as_bad (_("unsupported variable size or fill value"));
3342
5.64k
      else
3343
5.64k
  {
3344
5.64k
    offsetT i;
3345
3346
    /* PR 20901: Check for excessive values.
3347
       FIXME: 1<<10 is an arbitrary limit.  Maybe use maxpagesize instead ?  */
3348
5.64k
    if (exp.X_add_number < 0 || exp.X_add_number > (1 << 10))
3349
1.36k
      as_bad (_("size value for space directive too large: %lx"),
3350
1.36k
        (long) exp.X_add_number);
3351
4.28k
    else
3352
4.28k
      {
3353
4.28k
        if (mult == 0)
3354
3.41k
    mult = 1;
3355
4.28k
        bytes = mult * exp.X_add_number;
3356
3357
18.1k
        for (i = 0; i < exp.X_add_number; i++)
3358
13.8k
    emit_expr (&val, mult);
3359
4.28k
      }
3360
5.64k
  }
3361
5.84k
    }
3362
4.27k
  else
3363
4.27k
    {
3364
4.27k
      if (now_seg == absolute_section || mri_common_symbol != NULL)
3365
595
  resolve_expression (&exp);
3366
3367
4.27k
      if (exp.X_op == O_constant)
3368
3.61k
  {
3369
3.61k
    addressT repeat = exp.X_add_number;
3370
3.61k
    addressT total;
3371
3372
3.61k
    bytes = 0;
3373
3.61k
    if ((offsetT) repeat < 0)
3374
475
      {
3375
475
        as_warn (_(".space repeat count is negative, ignored"));
3376
475
        goto getout;
3377
475
      }
3378
3.13k
    if (repeat == 0)
3379
417
      {
3380
417
        if (!flag_mri)
3381
198
    as_warn (_(".space repeat count is zero, ignored"));
3382
417
        goto getout;
3383
417
      }
3384
2.71k
    if ((unsigned int) mult <= 1)
3385
2.50k
      total = repeat;
3386
210
    else if (gas_mul_overflow (repeat, mult, &total)
3387
210
       || (offsetT) total < 0)
3388
0
      {
3389
0
        as_warn (_(".space repeat count overflow, ignored"));
3390
0
        goto getout;
3391
0
      }
3392
2.71k
    bytes = total;
3393
3394
    /* If we are in the absolute section, just bump the offset.  */
3395
2.71k
    if (now_seg == absolute_section)
3396
492
      {
3397
492
        if (val.X_op != O_constant || val.X_add_number != 0)
3398
168
    as_warn (_("ignoring fill value in absolute section"));
3399
492
        abs_section_offset += total;
3400
492
        goto getout;
3401
492
      }
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
2.22k
    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
2.22k
    if (!need_pass_2)
3414
2.22k
      p = frag_var (rs_fill, 1, 1, (relax_substateT) 0, (symbolS *) 0,
3415
2.22k
        (offsetT) total, (char *) 0);
3416
2.22k
  }
3417
669
      else
3418
669
  {
3419
669
    if (now_seg == absolute_section)
3420
7
      {
3421
7
        as_bad (_("space allocation too complex in absolute section"));
3422
7
        subseg_set (text_section, 0);
3423
7
      }
3424
3425
669
    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
669
    if (!need_pass_2)
3432
669
      p = frag_var (rs_space, 1, 1, (relax_substateT) 0,
3433
669
        make_expr_symbol (&exp), (offsetT) 0, (char *) 0);
3434
669
  }
3435
3436
2.89k
      if ((val.X_op != O_constant || val.X_add_number != 0) && in_bss ())
3437
138
  as_warn (_("ignoring fill value in section `%s'"),
3438
138
     segment_name (now_seg));
3439
2.75k
      else if (p)
3440
2.75k
  *p = val.X_add_number;
3441
2.89k
    }
3442
3443
10.1k
 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
10.1k
  if (flag_mri && (bytes & 1) != 0)
3449
4.48k
    mri_pending_align = 1;
3450
3451
10.1k
  demand_empty_rest_of_line ();
3452
3453
10.1k
  if (flag_mri)
3454
7.79k
    mri_comment_end (stop, stopc);
3455
10.1k
}
3456
3457
void
3458
s_nop (int ignore ATTRIBUTE_UNUSED)
3459
322
{
3460
322
  expressionS exp;
3461
322
  fragS *start;
3462
322
  addressT start_off;
3463
322
  offsetT frag_off;
3464
3465
#ifdef md_flush_pending_output
3466
  md_flush_pending_output ();
3467
#endif
3468
3469
322
#ifdef md_cons_align
3470
322
  md_cons_align (1);
3471
322
#endif
3472
3473
322
  SKIP_WHITESPACE ();
3474
322
  expression (&exp);
3475
322
  demand_empty_rest_of_line ();
3476
3477
322
  start = frag_now;
3478
322
  start_off = frag_now_fix ();
3479
322
  do
3480
91.2k
    {
3481
#ifdef md_emit_single_noop
3482
      md_emit_single_noop;
3483
#else
3484
91.2k
      char *nop;
3485
3486
91.2k
#ifndef md_single_noop_insn
3487
91.2k
#define md_single_noop_insn "nop"
3488
91.2k
#endif
3489
      /* md_assemble might modify its argument, so
3490
   we must pass it a string that is writable.  */
3491
91.2k
      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
91.2k
      char *saved_ilp = input_line_pointer;
3499
91.2k
      md_assemble (nop);
3500
91.2k
      input_line_pointer = saved_ilp;
3501
91.2k
      free (nop);
3502
91.2k
#endif
3503
#ifdef md_flush_pending_output
3504
      md_flush_pending_output ();
3505
#endif
3506
91.2k
    } while (exp.X_op == O_constant
3507
91.2k
       && exp.X_add_number > 0
3508
91.2k
       && frag_offset_ignore_align_p (start, frag_now, &frag_off)
3509
91.2k
       && frag_off + frag_now_fix () < start_off + exp.X_add_number);
3510
322
}
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
618
{
3574
618
  int length, pad = 0;
3575
3576
618
  switch (float_type)
3577
618
    {
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
618
    case 'f':
3586
618
    case 'F':
3587
618
    case 's':
3588
618
    case 'S':
3589
618
      length = 4;
3590
618
      break;
3591
3592
0
    case 'd':
3593
0
    case 'D':
3594
0
    case 'r':
3595
0
    case 'R':
3596
0
      length = 8;
3597
0
      break;
3598
3599
0
    case 'x':
3600
0
    case 'X':
3601
0
#ifdef X_PRECISION
3602
0
      length = X_PRECISION * sizeof (LITTLENUM_TYPE);
3603
0
      pad = X_PRECISION_PAD * sizeof (LITTLENUM_TYPE);
3604
0
      if (!length)
3605
0
#endif
3606
0
  length = 12;
3607
0
      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
618
    }
3624
3625
618
  if (pad_p)
3626
618
    *pad_p = pad;
3627
3628
618
  return length;
3629
618
}
3630
3631
static int
3632
parse_one_float (int float_type, char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT])
3633
35.8k
{
3634
35.8k
  int length;
3635
3636
35.8k
  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
35.8k
  if (input_line_pointer[0] == '0'
3643
35.8k
      && ISALPHA (input_line_pointer[1]))
3644
48
    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
35.8k
  if (input_line_pointer[0] == ':')
3649
495
    {
3650
495
      ++input_line_pointer;
3651
495
      length = hex_float (float_type, temp);
3652
495
      if (length < 0)
3653
0
  {
3654
0
    ignore_rest_of_line ();
3655
0
    return length;
3656
0
  }
3657
495
    }
3658
35.3k
  else
3659
35.3k
    {
3660
35.3k
      const char *err;
3661
3662
35.3k
      err = md_atof (float_type, temp, &length);
3663
35.3k
      know (length <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
3664
35.3k
      know (err != NULL || length > 0);
3665
35.3k
      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
35.3k
    }
3672
3673
35.8k
  return length;
3674
35.8k
}
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
149
{
3683
149
  offsetT count;
3684
149
  int flen;
3685
149
  char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
3686
149
  char *stop = NULL;
3687
149
  char stopc = 0;
3688
3689
149
#ifdef md_cons_align
3690
149
  md_cons_align (1);
3691
149
#endif
3692
3693
149
  if (flag_mri)
3694
128
    stop = mri_comment_field (&stopc);
3695
3696
149
  count = get_absolute_expression ();
3697
3698
149
  SKIP_WHITESPACE ();
3699
149
  if (*input_line_pointer != ',')
3700
123
    {
3701
123
      int pad;
3702
3703
123
      flen = float_length (float_type, &pad);
3704
123
      if (flen >= 0)
3705
123
  memset (temp, 0, flen += pad);
3706
123
    }
3707
26
  else
3708
26
    {
3709
26
      ++input_line_pointer;
3710
3711
26
      flen = parse_one_float (float_type, temp);
3712
26
    }
3713
3714
149
  if (flen < 0)
3715
0
    {
3716
0
      if (flag_mri)
3717
0
  mri_comment_end (stop, stopc);
3718
0
      return;
3719
0
    }
3720
3721
511k
  while (--count >= 0)
3722
511k
    {
3723
511k
      char *p;
3724
3725
511k
      p = frag_more (flen);
3726
511k
      memcpy (p, temp, (unsigned int) flen);
3727
511k
    }
3728
3729
149
  demand_empty_rest_of_line ();
3730
3731
149
  if (flag_mri)
3732
128
    mri_comment_end (stop, stopc);
3733
149
}
3734
3735
/* Handle the .struct pseudo-op, as found in MIPS assemblers.  */
3736
3737
void
3738
s_struct (int ignore ATTRIBUTE_UNUSED)
3739
604
{
3740
604
  char *stop = NULL;
3741
604
  char stopc = 0;
3742
3743
604
  if (flag_mri)
3744
393
    stop = mri_comment_field (&stopc);
3745
604
  abs_section_offset = get_absolute_expression ();
3746
604
#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
604
  if (IS_ELF)
3750
604
    obj_elf_section_change_hook ();
3751
604
#endif
3752
604
  subseg_set (absolute_section, 0);
3753
604
  demand_empty_rest_of_line ();
3754
604
  if (flag_mri)
3755
393
    mri_comment_end (stop, stopc);
3756
604
}
3757
3758
void
3759
s_text (int ignore ATTRIBUTE_UNUSED)
3760
8.58k
{
3761
8.58k
  int temp;
3762
3763
8.58k
  temp = get_absolute_expression ();
3764
8.58k
  subseg_set (text_section, (subsegT) temp);
3765
8.58k
  demand_empty_rest_of_line ();
3766
8.58k
}
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
290
{
3773
290
  char *name;
3774
290
  symbolS *symbolP;
3775
290
  symbolS *symbolP2;
3776
290
  expressionS exp;
3777
3778
290
  if ((name = read_symbol_name ()) == NULL)
3779
0
    return;
3780
3781
290
  symbolP = symbol_find_or_make (name);
3782
3783
290
  if (S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
3784
200
    {
3785
200
      if (!S_IS_VOLATILE (symbolP))
3786
198
  {
3787
198
    as_bad (_("symbol `%s' is already defined"), name);
3788
198
    goto err_out;
3789
198
  }
3790
2
      symbolP = symbol_clone (symbolP, 1);
3791
2
      S_CLEAR_VOLATILE (symbolP);
3792
2
    }
3793
3794
92
  SKIP_WHITESPACE ();
3795
3796
92
  if (*input_line_pointer != ',')
3797
65
    {
3798
65
      as_bad (_("expected comma after \"%s\""), name);
3799
65
      goto err_out;
3800
65
    }
3801
3802
27
  input_line_pointer++;
3803
3804
27
  SKIP_WHITESPACE ();
3805
27
  free (name);
3806
3807
27
  if ((name = read_symbol_name ()) == NULL)
3808
0
    return;
3809
3810
27
  if ((symbolP2 = symbol_find_noref (name, 1)) == NULL
3811
27
      && (symbolP2 = md_undefined_symbol (name)) == NULL)
3812
16
    {
3813
16
      symbolP2 = symbol_find_or_make (name);
3814
16
      S_SET_WEAKREFD (symbolP2);
3815
16
    }
3816
11
  else
3817
11
    {
3818
11
      symbolS *symp = symbolP2;
3819
3820
11
      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
11
      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
11
    }
3860
3861
27
  memset (&exp, 0, sizeof (exp));
3862
27
  exp.X_op = O_symbol;
3863
27
  exp.X_add_symbol = symbolP2;
3864
3865
27
  S_SET_SEGMENT (symbolP, undefined_section);
3866
27
  symbol_set_value_expression (symbolP, &exp);
3867
27
  symbol_set_frag (symbolP, &zero_address_frag);
3868
27
  S_SET_WEAKREFR (symbolP);
3869
3870
27
  demand_empty_rest_of_line ();
3871
27
  free (name);
3872
27
  return;
3873
3874
263
 err_out:
3875
263
  ignore_rest_of_line ();
3876
263
  free (name);
3877
263
  return;
3878
27
}
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
1.18M
{
3892
1.18M
  SKIP_WHITESPACE ();
3893
1.18M
  if (input_line_pointer > buffer_limit)
3894
0
    return;
3895
1.18M
  if (is_end_of_line[(unsigned char) *input_line_pointer])
3896
251k
    input_line_pointer++;
3897
934k
  else
3898
934k
    {
3899
934k
      if (ISPRINT (*input_line_pointer))
3900
672k
  as_bad (_("junk at end of line, first unrecognized character is `%c'"),
3901
672k
     *input_line_pointer);
3902
261k
      else
3903
261k
  as_bad (_("junk at end of line, first unrecognized character valued 0x%x"),
3904
261k
     *input_line_pointer);
3905
934k
      ignore_rest_of_line ();
3906
934k
    }
3907
  /* Return pointing just after end-of-line.  */
3908
1.18M
}
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
1.30M
{
3919
23.4M
  while (input_line_pointer <= buffer_limit)
3920
23.4M
    if (is_end_of_line[(unsigned char) *input_line_pointer++])
3921
1.30M
      break;
3922
  /* Return pointing just after end-of-line.  */
3923
1.30M
}
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
73.8k
{
3931
73.8k
  if (symbol_get_frag (symbolP)->fr_type != rs_dummy)
3932
73.3k
    symbol_set_frag (symbolP, &zero_address_frag);
3933
73.8k
}
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
76.5k
{
3945
76.5k
  expressionS exp;
3946
76.5k
  segT seg;
3947
3948
76.5k
  know (symbolP);   /* NULL pointer is logic error.  */
3949
3950
76.5k
  if (!S_IS_FORWARD_REF (symbolP))
3951
74.8k
    (void) expression (&exp);
3952
1.69k
  else
3953
1.69k
    (void) deferred_expression (&exp);
3954
3955
76.5k
  if (exp.X_op == O_illegal)
3956
0
    as_bad (_("illegal expression"));
3957
76.5k
  else if (exp.X_op == O_absent)
3958
1.27k
    as_bad (_("missing expression"));
3959
75.3k
  else if (exp.X_op == O_big)
3960
4.02k
    {
3961
4.02k
      if (exp.X_add_number > 0)
3962
269
  as_bad (_("bignum invalid"));
3963
3.75k
      else
3964
3.75k
  as_bad (_("floating point number invalid"));
3965
4.02k
    }
3966
71.2k
  else if (exp.X_op == O_subtract
3967
71.2k
     && !S_IS_FORWARD_REF (symbolP)
3968
71.2k
     && SEG_NORMAL (S_GET_SEGMENT (exp.X_add_symbol))
3969
71.2k
     && (symbol_get_frag (exp.X_add_symbol)
3970
1.05k
         == symbol_get_frag (exp.X_op_symbol)))
3971
0
    {
3972
0
      exp.X_op = O_constant;
3973
0
      exp.X_add_number = (S_GET_VALUE (exp.X_add_symbol)
3974
0
        - S_GET_VALUE (exp.X_op_symbol));
3975
0
    }
3976
3977
76.5k
  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
76.5k
  switch (exp.X_op)
3984
76.5k
    {
3985
0
    case O_illegal:
3986
1.27k
    case O_absent:
3987
5.30k
    case O_big:
3988
5.30k
      exp.X_add_number = 0;
3989
      /* Fall through.  */
3990
44.0k
    case O_constant:
3991
44.0k
      S_SET_SEGMENT (symbolP, absolute_section);
3992
44.0k
      S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
3993
44.0k
      set_zero_frag (symbolP);
3994
44.0k
      break;
3995
3996
179
    case O_register:
3997
179
#ifndef TC_GLOBAL_REGISTER_SYMBOL_OK
3998
179
      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
179
#endif
4005
      /* Make sure symbol_equated_p() recognizes the symbol as an equate.  */
4006
179
      exp.X_add_symbol = make_expr_symbol (&exp);
4007
179
      exp.X_add_number = 0;
4008
179
      exp.X_op = O_symbol;
4009
179
      symbol_set_value_expression (symbolP, &exp);
4010
179
      S_SET_SEGMENT (symbolP, reg_section);
4011
179
      set_zero_frag (symbolP);
4012
179
      break;
4013
4014
17.6k
    case O_symbol:
4015
17.6k
      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
17.6k
      if (symbolP == exp.X_add_symbol
4020
17.6k
    && (seg != undefined_section
4021
201
        || !symbol_constant_p (symbolP)))
4022
164
  {
4023
164
    *symbol_X_add_number (symbolP) += exp.X_add_number;
4024
164
    break;
4025
164
  }
4026
17.4k
      else if (!S_IS_FORWARD_REF (symbolP) && seg != undefined_section)
4027
2.57k
  {
4028
2.57k
    symbolS *s = exp.X_add_symbol;
4029
4030
2.57k
    if (S_IS_COMMON (s))
4031
383
      as_bad (_("`%s' can't be equated to common symbol `%s'"),
4032
383
        S_GET_NAME (symbolP), S_GET_NAME (s));
4033
4034
2.57k
    S_SET_SEGMENT (symbolP, seg);
4035
2.57k
    S_SET_VALUE (symbolP, exp.X_add_number + S_GET_VALUE (s));
4036
2.57k
    symbol_set_frag (symbolP, symbol_get_frag (s));
4037
2.57k
    copy_symbol_attributes (symbolP, s);
4038
2.57k
    break;
4039
2.57k
  }
4040
14.9k
      S_SET_SEGMENT (symbolP, undefined_section);
4041
14.9k
      symbol_set_value_expression (symbolP, &exp);
4042
14.9k
      copy_symbol_attributes (symbolP, exp.X_add_symbol);
4043
14.9k
      set_zero_frag (symbolP);
4044
14.9k
      break;
4045
4046
14.6k
    default:
4047
      /* The value is some complex expression.  */
4048
14.6k
      S_SET_SEGMENT (symbolP, expr_section);
4049
14.6k
      symbol_set_value_expression (symbolP, &exp);
4050
14.6k
      set_zero_frag (symbolP);
4051
14.6k
      break;
4052
76.5k
    }
4053
76.5k
}
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
3.89k
{
4112
3.89k
  int c;
4113
3.89k
  expressionS exp;
4114
3.89k
  char *stop = NULL;
4115
3.89k
  char stopc = 0;
4116
4117
#ifdef md_flush_pending_output
4118
  md_flush_pending_output ();
4119
#endif
4120
4121
3.89k
  if (flag_mri)
4122
2.94k
    stop = mri_comment_field (&stopc);
4123
4124
3.89k
  if (is_it_end_of_statement ())
4125
99
    {
4126
99
      demand_empty_rest_of_line ();
4127
99
      if (flag_mri)
4128
82
  mri_comment_end (stop, stopc);
4129
99
      return;
4130
99
    }
4131
4132
3.79k
  if (nbytes == 0)
4133
0
    nbytes = TC_ADDRESS_BYTES ();
4134
4135
3.79k
#ifdef md_cons_align
4136
3.79k
  md_cons_align (nbytes);
4137
3.79k
#endif
4138
4139
3.79k
  c = 0;
4140
3.79k
  do
4141
9.85k
    {
4142
9.85k
      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
9.85k
  {
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
9.85k
    ret = TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes);
4165
9.85k
  }
4166
4167
9.85k
      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
9.85k
      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
9.85k
      ++c;
4179
9.85k
    }
4180
9.85k
  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
3.79k
  if (flag_mri && nbytes == 1 && (c & 1) != 0)
4186
15
    mri_pending_align = 1;
4187
4188
3.79k
  input_line_pointer--;   /* Put terminator back into stream.  */
4189
4190
3.79k
  demand_empty_rest_of_line ();
4191
4192
3.79k
  if (flag_mri)
4193
2.86k
    mri_comment_end (stop, stopc);
4194
3.79k
}
4195
4196
void
4197
cons (int size)
4198
3.89k
{
4199
3.89k
  cons_worker (size, 0);
4200
3.89k
}
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
5.88k
{
4213
5.88k
  char *stop = NULL;
4214
5.88k
  char stopc = 0;
4215
5.88k
  expressionS exp;
4216
5.88k
  char *r_name;
4217
5.88k
  int c;
4218
5.88k
  struct reloc_list *reloc;
4219
5.88k
  struct _bfd_rel { const char * name; bfd_reloc_code_real_type code; };
4220
5.88k
  static const struct _bfd_rel bfd_relocs[] =
4221
5.88k
  {
4222
5.88k
    { "NONE", BFD_RELOC_NONE },
4223
5.88k
    { "8",  BFD_RELOC_8 },
4224
5.88k
    { "16", BFD_RELOC_16 },
4225
5.88k
    { "32", BFD_RELOC_32 },
4226
5.88k
    { "64", BFD_RELOC_64 }
4227
5.88k
  };
4228
4229
5.88k
  reloc = XNEW (struct reloc_list);
4230
4231
5.88k
  if (flag_mri)
4232
4.44k
    stop = mri_comment_field (&stopc);
4233
4234
5.88k
  expression (&exp);
4235
5.88k
  switch (exp.X_op)
4236
5.88k
    {
4237
0
    case O_illegal:
4238
240
    case O_absent:
4239
240
    case O_big:
4240
240
    case O_register:
4241
240
      as_bad (_("missing or bad offset expression"));
4242
240
      goto err_out;
4243
4.84k
    case O_constant:
4244
4.84k
      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
4.84k
      symbol_mark_used_in_reloc (exp.X_add_symbol);
4248
4.84k
      exp.X_op = O_symbol;
4249
      /* Fallthru */
4250
4.92k
    case O_symbol:
4251
4.92k
      if (exp.X_add_number == 0)
4252
705
  {
4253
705
    reloc->u.a.offset_sym = exp.X_add_symbol;
4254
705
    break;
4255
705
  }
4256
      /* Fallthru */
4257
4.94k
    default:
4258
4.94k
      reloc->u.a.offset_sym = make_expr_symbol (&exp);
4259
4.94k
      break;
4260
5.88k
    }
4261
4262
5.64k
  SKIP_WHITESPACE ();
4263
5.64k
  if (*input_line_pointer != ',')
4264
3.73k
    {
4265
3.73k
      as_bad (_("missing reloc type"));
4266
3.73k
      goto err_out;
4267
3.73k
    }
4268
4269
1.90k
  ++input_line_pointer;
4270
1.90k
  SKIP_WHITESPACE ();
4271
1.90k
  c = get_symbol_name (& r_name);
4272
1.90k
  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
1.90k
  else
4285
1.90k
    reloc->u.a.howto = bfd_reloc_name_lookup (stdoutput, r_name);
4286
1.90k
  *input_line_pointer = c;
4287
1.90k
  if (reloc->u.a.howto == NULL)
4288
1.90k
    {
4289
1.90k
      as_bad (_("unrecognized reloc type"));
4290
1.90k
      goto err_out;
4291
1.90k
    }
4292
4293
7
  exp.X_op = O_absent;
4294
7
  SKIP_WHITESPACE_AFTER_NAME ();
4295
7
  if (*input_line_pointer == ',')
4296
0
    {
4297
0
      ++input_line_pointer;
4298
0
      expression (&exp);
4299
0
    }
4300
7
  switch (exp.X_op)
4301
7
    {
4302
0
    case O_illegal:
4303
0
    case O_big:
4304
0
    case O_register:
4305
0
      as_bad (_("bad reloc expression"));
4306
5.87k
    err_out:
4307
5.87k
      ignore_rest_of_line ();
4308
5.87k
      free (reloc);
4309
5.87k
      if (flag_mri)
4310
4.43k
  mri_comment_end (stop, stopc);
4311
5.87k
      return;
4312
7
    case O_absent:
4313
7
      reloc->u.a.sym = NULL;
4314
7
      reloc->u.a.addend = 0;
4315
7
      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
7
    }
4329
4330
7
  reloc->file = as_where (&reloc->line);
4331
7
  reloc->next = reloc_list;
4332
7
  reloc_list = reloc;
4333
4334
7
  demand_empty_rest_of_line ();
4335
7
  if (flag_mri)
4336
6
    mri_comment_end (stop, stopc);
4337
7
}
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
60.7k
{
4345
60.7k
  emit_expr_with_reloc (exp, nbytes, TC_PARSE_CONS_RETURN_NONE);
4346
60.7k
}
4347
4348
void
4349
emit_expr_with_reloc (expressionS *exp,
4350
          unsigned int nbytes,
4351
          TC_PARSE_CONS_RETURN_TYPE reloc)
4352
70.6k
{
4353
70.6k
  operatorT op;
4354
70.6k
  char *p;
4355
70.6k
  valueT extra_digit = 0;
4356
4357
  /* Don't do anything if we are going to make another pass.  */
4358
70.6k
  if (need_pass_2)
4359
0
    return;
4360
4361
70.6k
  frag_grow (nbytes);
4362
70.6k
  dot_value = frag_now_fix ();
4363
70.6k
  dot_frag = frag_now;
4364
4365
70.6k
#ifndef NO_LISTING
4366
70.6k
#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
70.6k
  if (strcmp (segment_name (now_seg), ".line") != 0)
4371
70.6k
    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
70.6k
  if (strcmp (segment_name (now_seg), ".debug") != 0)
4390
70.6k
    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
70.6k
  if (dwarf_file == 4)
4415
0
    dwarf_file_string = 1;
4416
70.6k
  else
4417
70.6k
    dwarf_file_string = 0;
4418
70.6k
#endif
4419
70.6k
#endif
4420
4421
70.6k
  if (check_eh_frame (exp, &nbytes))
4422
0
    return;
4423
4424
70.6k
  op = exp->X_op;
4425
4426
  /* Handle a negative bignum.  */
4427
70.6k
  if (op == O_uminus
4428
70.6k
      && exp->X_add_number == 0
4429
70.6k
      && symbol_get_value_expression (exp->X_add_symbol)->X_op == O_big
4430
70.6k
      && 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
70.6k
  if (op == O_absent || op == O_illegal)
4458
1.65k
    {
4459
1.65k
      as_warn (_("zero assumed for missing expression"));
4460
1.65k
      exp->X_add_number = 0;
4461
1.65k
      op = O_constant;
4462
1.65k
    }
4463
68.9k
  else if (op == O_big && exp->X_add_number <= 0)
4464
5
    {
4465
5
      as_bad (_("floating point number invalid"));
4466
5
      exp->X_add_number = 0;
4467
5
      op = O_constant;
4468
5
    }
4469
68.9k
  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
70.6k
  if (now_seg == absolute_section)
4477
1.06k
    {
4478
1.06k
      if (op != O_constant || exp->X_add_number != 0)
4479
664
  as_bad (_("attempt to store value in absolute section"));
4480
1.06k
      abs_section_offset += nbytes;
4481
1.06k
      return;
4482
1.06k
    }
4483
4484
  /* Allow `.word 0' in BSS style sections.  */
4485
69.5k
  if ((op != O_constant || exp->X_add_number != 0) && in_bss ())
4486
2.47k
    as_bad (_("attempt to store non-zero value in section `%s'"),
4487
2.47k
      segment_name (now_seg));
4488
4489
69.5k
  p = frag_more ((int) nbytes);
4490
4491
69.5k
  if (reloc != TC_PARSE_CONS_RETURN_NONE)
4492
153
    {
4493
153
      emit_expr_fix (exp, nbytes, frag_now, p, reloc);
4494
153
      return;
4495
153
    }
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
69.4k
  if (op == O_constant && nbytes > sizeof (valueT))
4525
318
    {
4526
318
      extra_digit = exp->X_unsigned ? 0 : -1;
4527
318
      convert_to_bignum (exp, !exp->X_unsigned);
4528
318
      op = O_big;
4529
318
    }
4530
4531
69.4k
  if (op == O_constant)
4532
2.16k
    {
4533
2.16k
      valueT get;
4534
2.16k
      valueT use;
4535
2.16k
      valueT mask;
4536
2.16k
      valueT unmask;
4537
4538
      /* JF << of >= number of bits in the object is undefined.  In
4539
   particular SPARC (Sun 4) has problems.  */
4540
2.16k
      if (nbytes >= sizeof (valueT))
4541
3
  {
4542
3
    know (nbytes == sizeof (valueT));
4543
0
    mask = 0;
4544
3
  }
4545
2.16k
      else
4546
2.16k
  {
4547
    /* Don't store these bits.  */
4548
2.16k
    mask = ~(valueT) 0 << (BITS_PER_CHAR * nbytes);
4549
2.16k
  }
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
2.16k
      get = exp->X_add_number;
4559
2.16k
      use = get & unmask;
4560
2.16k
      if ((get & mask) != 0 && (-get & mask) != 0)
4561
463
  {
4562
    /* Leading bits contain both 0s & 1s.  */
4563
463
    as_warn (_("value 0x%" PRIx64 " truncated to 0x%" PRIx64),
4564
463
       (uint64_t) get, (uint64_t) use);
4565
463
  }
4566
      /* Put bytes in right order.  */
4567
2.16k
      md_number_to_chars (p, use, (int) nbytes);
4568
2.16k
    }
4569
67.2k
  else if (op == O_big)
4570
419
    {
4571
419
      unsigned int size;
4572
419
      LITTLENUM_TYPE *nums;
4573
4574
419
      size = exp->X_add_number * CHARS_PER_LITTLENUM;
4575
419
      if (nbytes < size)
4576
91
  {
4577
91
    int i = nbytes / CHARS_PER_LITTLENUM;
4578
4579
91
    if (i != 0)
4580
16
      {
4581
16
        LITTLENUM_TYPE sign = 0;
4582
16
        if ((generic_bignum[--i]
4583
16
       & (1 << (LITTLENUM_NUMBER_OF_BITS - 1))) != 0)
4584
4
    sign = ~(LITTLENUM_TYPE) 0;
4585
4586
16
        while (++i < exp->X_add_number)
4587
16
    if (generic_bignum[i] != sign)
4588
16
      break;
4589
16
      }
4590
75
    else if (nbytes == 1)
4591
75
      {
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
75
        LITTLENUM_TYPE sign = (generic_bignum[0] & (1 << 7)) ? -1 : 0;
4596
75
        LITTLENUM_TYPE himask = LITTLENUM_MASK & ~ 0xFF;
4597
4598
75
        if ((generic_bignum[0] & himask) == (sign & himask))
4599
19
    {
4600
31
      while (++i < exp->X_add_number)
4601
31
        if (generic_bignum[i] != sign)
4602
19
          break;
4603
19
    }
4604
75
      }
4605
4606
91
    if (i < exp->X_add_number)
4607
91
      as_warn (ngettext ("bignum truncated to %d byte",
4608
91
             "bignum truncated to %d bytes",
4609
91
             nbytes),
4610
91
         nbytes);
4611
91
    size = nbytes;
4612
91
  }
4613
4614
419
      if (nbytes == 1)
4615
75
  {
4616
75
    md_number_to_chars (p, (valueT) generic_bignum[0], 1);
4617
75
    return;
4618
75
  }
4619
344
      know (nbytes % CHARS_PER_LITTLENUM == 0);
4620
4621
344
      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
344
      else
4640
344
  {
4641
344
    nums = generic_bignum;
4642
2.00k
    while (size >= CHARS_PER_LITTLENUM)
4643
1.66k
      {
4644
1.66k
        md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
4645
1.66k
        ++nums;
4646
1.66k
        size -= CHARS_PER_LITTLENUM;
4647
1.66k
        p += CHARS_PER_LITTLENUM;
4648
1.66k
        nbytes -= CHARS_PER_LITTLENUM;
4649
1.66k
      }
4650
4651
1.30k
    while (nbytes >= CHARS_PER_LITTLENUM)
4652
962
      {
4653
962
        md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
4654
962
        nbytes -= CHARS_PER_LITTLENUM;
4655
962
        p += CHARS_PER_LITTLENUM;
4656
962
      }
4657
344
  }
4658
344
    }
4659
66.8k
  else
4660
66.8k
    emit_expr_fix (exp, nbytes, frag_now, p, TC_PARSE_CONS_RETURN_NONE);
4661
69.4k
}
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
67.0k
{
4667
67.0k
  int offset = 0;
4668
67.0k
  unsigned int size = nbytes;
4669
4670
67.0k
  memset (p, 0, size);
4671
4672
  /* Generate a fixS to record the symbol value.  */
4673
4674
67.0k
#ifdef TC_CONS_FIX_NEW
4675
67.0k
  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
67.0k
}
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
495
{
4835
495
  int pad, length = float_length (float_type, &pad);
4836
495
  int i;
4837
4838
495
  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
495
  i = 0;
4845
1.08k
  while (hex_p (*input_line_pointer) || *input_line_pointer == '_')
4846
585
    {
4847
585
      int d;
4848
4849
      /* The MRI assembler accepts arbitrary underscores strewn about
4850
   through the hex constant, so we ignore them as well.  */
4851
585
      if (*input_line_pointer == '_')
4852
0
  {
4853
0
    ++input_line_pointer;
4854
0
    continue;
4855
0
  }
4856
4857
585
      if (i >= length)
4858
0
  {
4859
0
    as_warn (_("floating point constant too large"));
4860
0
    return -1;
4861
0
  }
4862
585
      d = hex_value (*input_line_pointer) << 4;
4863
585
      ++input_line_pointer;
4864
585
      while (*input_line_pointer == '_')
4865
0
  ++input_line_pointer;
4866
585
      if (hex_p (*input_line_pointer))
4867
490
  {
4868
490
    d += hex_value (*input_line_pointer);
4869
490
    ++input_line_pointer;
4870
490
  }
4871
585
      if (target_big_endian)
4872
0
  bytes[i] = d;
4873
585
      else
4874
585
  bytes[length - i - 1] = d;
4875
585
      ++i;
4876
585
    }
4877
4878
495
  if (i < length)
4879
392
    {
4880
392
      if (target_big_endian)
4881
0
  memset (bytes + i, 0, length - i);
4882
392
      else
4883
392
  memset (bytes, 0, length - i);
4884
392
    }
4885
4886
495
  memset (bytes + length, 0, pad);
4887
4888
495
  return length + pad;
4889
495
}
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
30.8k
{
4912
30.8k
  char *p;
4913
30.8k
  int length;     /* Number of chars in an object.  */
4914
30.8k
  char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
4915
4916
30.8k
  if (is_it_end_of_statement ())
4917
4.04k
    {
4918
4.04k
      demand_empty_rest_of_line ();
4919
4.04k
      return;
4920
4.04k
    }
4921
4922
26.7k
  if (now_seg == absolute_section)
4923
786
    {
4924
786
      as_bad (_("attempt to store float in absolute section"));
4925
786
      ignore_rest_of_line ();
4926
786
      return;
4927
786
    }
4928
4929
25.9k
  if (in_bss ())
4930
1.14k
    {
4931
1.14k
      as_bad (_("attempt to store float in section `%s'"),
4932
1.14k
        segment_name (now_seg));
4933
1.14k
      ignore_rest_of_line ();
4934
1.14k
      return;
4935
1.14k
    }
4936
4937
#ifdef md_flush_pending_output
4938
  md_flush_pending_output ();
4939
#endif
4940
4941
24.8k
#ifdef md_cons_align
4942
24.8k
  md_cons_align (1);
4943
24.8k
#endif
4944
4945
24.8k
  do
4946
35.8k
    {
4947
35.8k
      length = parse_one_float (float_type, temp);
4948
35.8k
      if (length < 0)
4949
0
  return;
4950
4951
35.8k
      if (!need_pass_2)
4952
35.8k
  {
4953
35.8k
    int count;
4954
4955
35.8k
    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
71.6k
    while (--count >= 0)
4974
35.8k
      {
4975
35.8k
        p = frag_more (length);
4976
35.8k
        memcpy (p, temp, (unsigned int) length);
4977
35.8k
      }
4978
35.8k
  }
4979
35.8k
      SKIP_WHITESPACE ();
4980
35.8k
    }
4981
35.8k
  while (*input_line_pointer++ == ',');
4982
4983
  /* Put terminator back into stream.  */
4984
24.8k
  --input_line_pointer;
4985
24.8k
  demand_empty_rest_of_line ();
4986
24.8k
}
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.23k
{
5009
3.23k
  int size = 0;
5010
3.23k
  unsigned byte;
5011
5012
3.23k
  do
5013
9.41k
    {
5014
9.41k
      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
9.41k
      value = (value >> 7) | ~(-(offsetT)1 >> 7);
5019
9.41k
      size += 1;
5020
9.41k
    }
5021
9.41k
  while (!(((value == 0) && ((byte & 0x40) == 0))
5022
9.41k
     || ((value == -1) && ((byte & 0x40) != 0))));
5023
5024
3.23k
  return size;
5025
3.23k
}
5026
5027
static inline unsigned int
5028
sizeof_uleb128 (valueT value)
5029
24.3k
{
5030
24.3k
  int size = 0;
5031
5032
24.3k
  do
5033
37.0k
    {
5034
37.0k
      value >>= 7;
5035
37.0k
      size += 1;
5036
37.0k
    }
5037
37.0k
  while (value != 0);
5038
5039
24.3k
  return size;
5040
24.3k
}
5041
5042
unsigned int
5043
sizeof_leb128 (valueT value, int sign)
5044
27.0k
{
5045
27.0k
  if (sign)
5046
3.23k
    return sizeof_sleb128 ((offsetT) value);
5047
23.8k
  else
5048
23.8k
    return sizeof_uleb128 (value);
5049
27.0k
}
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
2.87k
{
5056
2.87k
  char *orig = p;
5057
2.87k
  int more;
5058
5059
2.87k
  do
5060
8.04k
    {
5061
8.04k
      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
8.04k
      value = (value >> 7) | ~(-(offsetT)1 >> 7);
5067
5068
8.04k
      more = !((((value == 0) && ((byte & 0x40) == 0))
5069
8.04k
    || ((value == -1) && ((byte & 0x40) != 0))));
5070
8.04k
      if (more)
5071
5.16k
  byte |= 0x80;
5072
5073
8.04k
      *p++ = byte;
5074
8.04k
    }
5075
8.04k
  while (more);
5076
5077
2.87k
  return p - orig;
5078
2.87k
}
5079
5080
static inline unsigned int
5081
output_uleb128 (char *p, valueT value)
5082
22.9k
{
5083
22.9k
  char *orig = p;
5084
5085
22.9k
  do
5086
23.1k
    {
5087
23.1k
      unsigned byte = (value & 0x7f);
5088
5089
23.1k
      value >>= 7;
5090
23.1k
      if (value != 0)
5091
  /* More bytes to follow.  */
5092
178
  byte |= 0x80;
5093
5094
23.1k
      *p++ = byte;
5095
23.1k
    }
5096
23.1k
  while (value != 0);
5097
5098
22.9k
  return p - orig;
5099
22.9k
}
5100
5101
unsigned int
5102
output_leb128 (char *p, valueT value, int sign)
5103
25.8k
{
5104
25.8k
  if (sign)
5105
2.87k
    return output_sleb128 (p, (offsetT) value);
5106
22.9k
  else
5107
22.9k
    return output_uleb128 (p, value);
5108
25.8k
}
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
2
{
5118
2
  char *orig = p;
5119
2
  valueT val = 0;
5120
2
  int loaded = 0;
5121
2
  unsigned byte;
5122
5123
  /* Strip leading sign extensions off the bignum.  */
5124
2
  while (size > 1
5125
2
   && bignum[size - 1] == LITTLENUM_MASK
5126
2
   && bignum[size - 2] > LITTLENUM_MASK / 2)
5127
0
    size--;
5128
5129
2
  do
5130
10
    {
5131
      /* OR in the next part of the littlenum.  */
5132
10
      val |= (*bignum << loaded);
5133
10
      loaded += LITTLENUM_NUMBER_OF_BITS;
5134
10
      size--;
5135
10
      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
10
      do
5140
20
  {
5141
20
    byte = val & 0x7f;
5142
20
    loaded -= 7;
5143
20
    val >>= 7;
5144
20
    if (size > 0
5145
20
        || val != ((byte & 0x40) == 0 ? 0 : ((valueT) 1 << loaded) - 1))
5146
18
      byte |= 0x80;
5147
5148
20
    if (orig)
5149
10
      *p = byte;
5150
20
    p++;
5151
20
  }
5152
20
      while ((byte & 0x80) != 0 && loaded >= 7);
5153
10
    }
5154
10
  while (size > 0);
5155
5156
  /* Mop up any left-over bits (of which there will be less than 7).  */
5157
2
  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
2
  return p - orig;
5168
2
}
5169
5170
static inline unsigned int
5171
output_big_uleb128 (char *p, LITTLENUM_TYPE *bignum, unsigned int size)
5172
2
{
5173
2
  char *orig = p;
5174
2
  valueT val = 0;
5175
2
  int loaded = 0;
5176
2
  unsigned byte;
5177
5178
  /* Strip leading zeros off the bignum.  */
5179
  /* XXX: Is this needed?  */
5180
2
  while (size > 0 && bignum[size - 1] == 0)
5181
0
    size--;
5182
5183
2
  do
5184
26
    {
5185
26
      if (loaded < 7 && size > 0)
5186
12
  {
5187
12
    val |= (*bignum << loaded);
5188
12
    loaded += 8 * CHARS_PER_LITTLENUM;
5189
12
    size--;
5190
12
    bignum++;
5191
12
  }
5192
5193
26
      byte = val & 0x7f;
5194
26
      loaded -= 7;
5195
26
      val >>= 7;
5196
5197
26
      if (size > 0 || val)
5198
24
  byte |= 0x80;
5199
5200
26
      if (orig)
5201
13
  *p = byte;
5202
26
      p++;
5203
26
    }
5204
26
  while (byte & 0x80);
5205
5206
2
  return p - orig;
5207
2
}
5208
5209
static unsigned int
5210
output_big_leb128 (char *p, LITTLENUM_TYPE *bignum, unsigned int size, int sign)
5211
4
{
5212
4
  if (sign)
5213
2
    return output_big_sleb128 (p, bignum, size);
5214
2
  else
5215
2
    return output_big_uleb128 (p, bignum, size);
5216
4
}
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
997
{
5224
997
  operatorT op = exp->X_op;
5225
997
  unsigned int nbytes;
5226
5227
997
  if (op == O_absent || op == O_illegal)
5228
448
    {
5229
448
      as_warn (_("zero assumed for missing expression"));
5230
448
      exp->X_add_number = 0;
5231
448
      op = O_constant;
5232
448
    }
5233
549
  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
549
  else if (op == O_register)
5240
0
    {
5241
0
      as_warn (_("register value used as expression"));
5242
0
      op = O_constant;
5243
0
    }
5244
549
  else if (op == O_constant
5245
549
     && sign
5246
549
     && (exp->X_add_number < 0) == !exp->X_extrabit)
5247
1
    {
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
1
      convert_to_bignum (exp, exp->X_extrabit);
5252
1
      op = O_big;
5253
1
    }
5254
5255
997
  if (now_seg == absolute_section)
5256
34
    {
5257
34
      if (op != O_constant || exp->X_add_number != 0)
5258
13
  as_bad (_("attempt to store value in absolute section"));
5259
34
      abs_section_offset++;
5260
34
      return;
5261
34
    }
5262
5263
963
  if ((op != O_constant || exp->X_add_number != 0) && in_bss ())
5264
8
    as_bad (_("attempt to store non-zero value in section `%s'"),
5265
8
      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
963
  nbytes = (unsigned int) -1;
5270
963
  if (check_eh_frame (exp, &nbytes))
5271
0
    abort ();
5272
5273
  /* Let the backend know that subsequent data may be byte aligned.  */
5274
963
#ifdef md_cons_align
5275
963
  md_cons_align (1);
5276
963
#endif
5277
5278
963
  if (op == O_constant)
5279
461
    {
5280
      /* If we've got a constant, emit the thing directly right now.  */
5281
5282
461
      valueT value = exp->X_add_number;
5283
461
      unsigned int size;
5284
461
      char *p;
5285
5286
461
      size = sizeof_leb128 (value, sign);
5287
461
      p = frag_more (size);
5288
461
      if (output_leb128 (p, value, sign) > size)
5289
0
  abort ();
5290
461
    }
5291
502
  else if (op == O_big)
5292
2
    {
5293
      /* O_big is a different sort of constant.  */
5294
2
      int nbr_digits = exp->X_add_number;
5295
2
      unsigned int size;
5296
2
      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
2
      if (exp->X_unsigned
5302
2
    && nbr_digits < SIZE_OF_LARGE_NUMBER
5303
2
    && generic_bignum[nbr_digits - 1] == LITTLENUM_MASK)
5304
0
  generic_bignum[nbr_digits++] = 0;
5305
5306
2
      size = output_big_leb128 (NULL, generic_bignum, nbr_digits, sign);
5307
2
      p = frag_more (size);
5308
2
      if (output_big_leb128 (p, generic_bignum, nbr_digits, sign) > size)
5309
0
  abort ();
5310
2
    }
5311
500
  else
5312
500
    {
5313
      /* Otherwise, we have to create a variable sized fragment and
5314
   resolve things later.  */
5315
5316
500
      frag_var (rs_leb128, sizeof_uleb128 (~(valueT) 0), 0, sign,
5317
500
    make_expr_symbol (exp), 0, (char *) NULL);
5318
500
    }
5319
963
}
5320
5321
/* Parse the .sleb128 and .uleb128 pseudos.  */
5322
5323
void
5324
s_leb128 (int sign)
5325
154
{
5326
154
  expressionS exp;
5327
5328
#ifdef md_flush_pending_output
5329
  md_flush_pending_output ();
5330
#endif
5331
5332
154
  do
5333
800
    {
5334
800
      expression (&exp);
5335
800
      emit_leb128_expr (&exp, sign);
5336
800
    }
5337
800
  while (*input_line_pointer++ == ',');
5338
5339
154
  input_line_pointer--;
5340
154
  demand_empty_rest_of_line ();
5341
154
}
5342

5343
static void
5344
stringer_append_char (int c, int bitsize)
5345
520k
{
5346
520k
  if (c && in_bss ())
5347
979
    as_bad (_("attempt to store non-empty string in section `%s'"),
5348
979
      segment_name (now_seg));
5349
5350
520k
  if (!target_big_endian)
5351
520k
    FRAG_APPEND_1_CHAR (c);
5352
5353
520k
  switch (bitsize)
5354
520k
    {
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
520k
    case 8:
5369
520k
      break;
5370
0
    default:
5371
      /* Called with invalid bitsize argument.  */
5372
0
      abort ();
5373
0
      break;
5374
520k
    }
5375
520k
  if (target_big_endian)
5376
0
    FRAG_APPEND_1_CHAR (c);
5377
520k
}
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
1.59k
{
5390
1.59k
  const int bitsize = bits_appendzero & ~7;
5391
1.59k
  const int append_zero = bits_appendzero & 1;
5392
1.59k
  unsigned int c;
5393
1.59k
#if !defined(NO_LISTING) && defined (OBJ_ELF)
5394
1.59k
  char *start;
5395
1.59k
#endif
5396
5397
#ifdef md_flush_pending_output
5398
  md_flush_pending_output ();
5399
#endif
5400
5401
1.59k
#ifdef md_cons_align
5402
1.59k
  md_cons_align (1);
5403
1.59k
#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
1.59k
  if (now_seg == absolute_section)
5408
22
    {
5409
22
      as_bad (_("strings must be placed into a section"));
5410
22
      ignore_rest_of_line ();
5411
22
      return;
5412
22
    }
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
1.57k
  if (is_it_end_of_statement ())
5420
13
    {
5421
13
      c = 0;      /* Skip loop.  */
5422
13
      ++input_line_pointer; /* Compensate for end of loop.  */
5423
13
    }
5424
1.55k
  else
5425
1.55k
    {
5426
1.55k
      c = ',';      /* Do loop.  */
5427
1.55k
    }
5428
5429
22.6k
  while (c == ',' || c == '<' || c == '"')
5430
21.4k
    {
5431
21.4k
      SKIP_WHITESPACE ();
5432
21.4k
      switch (*input_line_pointer)
5433
21.4k
  {
5434
20.9k
  case '\"':
5435
20.9k
    ++input_line_pointer; /*->1st char of string.  */
5436
20.9k
#if !defined(NO_LISTING) && defined (OBJ_ELF)
5437
20.9k
    start = input_line_pointer;
5438
20.9k
#endif
5439
5440
540k
    while (is_a_char (c = next_char_of_string ()))
5441
519k
      stringer_append_char (c, bitsize);
5442
5443
    /* Treat "a" "b" as "ab".  Even if we are appending zeros.  */
5444
20.9k
    SKIP_ALL_WHITESPACE ();
5445
20.9k
    if (*input_line_pointer == '"')
5446
19.9k
      break;
5447
5448
1.06k
    if (append_zero)
5449
1.06k
      stringer_append_char (0, bitsize);
5450
5451
1.06k
#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.06k
    if (strcmp (segment_name (now_seg), ".debug") != 0)
5459
1.06k
      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.06k
#endif
5468
5469
1.06k
    break;
5470
357
  case '<':
5471
357
    input_line_pointer++;
5472
357
    c = get_single_number ();
5473
357
    stringer_append_char (c, bitsize);
5474
357
    if (*input_line_pointer != '>')
5475
357
      {
5476
357
        as_bad (_("expected <nn>"));
5477
357
        ignore_rest_of_line ();
5478
357
        return;
5479
357
      }
5480
0
    input_line_pointer++;
5481
0
    break;
5482
25
  case ',':
5483
25
    input_line_pointer++;
5484
25
    break;
5485
21.4k
  }
5486
21.1k
      SKIP_WHITESPACE ();
5487
21.1k
      c = *input_line_pointer;
5488
21.1k
    }
5489
5490
1.21k
  demand_empty_rest_of_line ();
5491
1.21k
}
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
2.25M
{
5501
2.25M
  unsigned int c;
5502
5503
2.25M
  c = *input_line_pointer++ & CHAR_MASK;
5504
2.25M
  switch (c)
5505
2.25M
    {
5506
14.7k
    case 0:
5507
      /* PR 20902: Do not advance past the end of the buffer.  */
5508
14.7k
      -- input_line_pointer;
5509
14.7k
      c = NOT_A_CHAR;
5510
14.7k
      break;
5511
5512
48.5k
    case '\"':
5513
48.5k
      c = NOT_A_CHAR;
5514
48.5k
      break;
5515
5516
74.1k
    case '\n':
5517
74.1k
      as_warn (_("unterminated string; newline inserted"));
5518
74.1k
      bump_line_counters ();
5519
74.1k
      break;
5520
5521
7.89k
    case '\\':
5522
7.89k
      if (!TC_STRING_ESCAPES)
5523
0
  break;
5524
7.89k
      switch (c = *input_line_pointer++ & CHAR_MASK)
5525
7.89k
  {
5526
404
  case 'b':
5527
404
    c = '\b';
5528
404
    break;
5529
5530
50
  case 'f':
5531
50
    c = '\f';
5532
50
    break;
5533
5534
4
  case 'n':
5535
4
    c = '\n';
5536
4
    break;
5537
5538
137
  case 'r':
5539
137
    c = '\r';
5540
137
    break;
5541
5542
4
  case 't':
5543
4
    c = '\t';
5544
4
    break;
5545
5546
3
  case 'v':
5547
3
    c = '\013';
5548
3
    break;
5549
5550
2.67k
  case '\\':
5551
2.67k
  case '"':
5552
2.67k
    break;    /* As itself.  */
5553
5554
912
  case '0':
5555
974
  case '1':
5556
974
  case '2':
5557
1.40k
  case '3':
5558
1.41k
  case '4':
5559
1.56k
  case '5':
5560
1.56k
  case '6':
5561
1.56k
  case '7':
5562
1.81k
  case '8':
5563
1.91k
  case '9':
5564
1.91k
    {
5565
1.91k
      unsigned number;
5566
1.91k
      int i;
5567
5568
1.91k
      for (i = 0, number = 0;
5569
4.66k
     ISDIGIT (c) && i < 3;
5570
2.74k
     c = *input_line_pointer++, i++)
5571
2.74k
        {
5572
2.74k
    number = number * 8 + c - '0';
5573
2.74k
        }
5574
5575
1.91k
      c = number & CHAR_MASK;
5576
1.91k
    }
5577
1.91k
    --input_line_pointer;
5578
1.91k
    break;
5579
5580
7
  case 'x':
5581
408
  case 'X':
5582
408
    {
5583
408
      unsigned number;
5584
5585
408
      number = 0;
5586
408
      c = *input_line_pointer++;
5587
408
      while (ISXDIGIT (c))
5588
628
        {
5589
628
    if (ISDIGIT (c))
5590
15
      number = number * 16 + c - '0';
5591
613
    else if (ISUPPER (c))
5592
304
      number = number * 16 + c - 'A' + 10;
5593
309
    else
5594
309
      number = number * 16 + c - 'a' + 10;
5595
628
    c = *input_line_pointer++;
5596
628
        }
5597
408
      c = number & CHAR_MASK;
5598
408
      --input_line_pointer;
5599
408
    }
5600
408
    break;
5601
5602
22
  case '\n':
5603
    /* To be compatible with BSD 4.2 as: give the luser a linefeed!!  */
5604
22
    as_warn (_("unterminated string; newline inserted"));
5605
22
    c = '\n';
5606
22
    bump_line_counters ();
5607
22
    break;
5608
5609
54
  case 0:
5610
    /* Do not advance past the end of the buffer.  */
5611
54
    -- input_line_pointer;
5612
54
    c = NOT_A_CHAR;
5613
54
    break;
5614
5615
2.22k
  default:
5616
5617
#ifdef ONLY_STANDARD_ESCAPES
5618
    as_bad (_("bad escaped character in string"));
5619
    c = '?';
5620
#endif /* ONLY_STANDARD_ESCAPES */
5621
5622
2.22k
    break;
5623
7.89k
  }
5624
7.89k
      break;
5625
5626
2.11M
    default:
5627
2.11M
      break;
5628
2.25M
    }
5629
2.25M
  return (c);
5630
2.25M
}
5631

5632
static segT
5633
get_segmented_expression (expressionS *expP)
5634
11.0k
{
5635
11.0k
  segT retval;
5636
5637
11.0k
  retval = expression (expP);
5638
11.0k
  if (expP->X_op == O_illegal
5639
11.0k
      || expP->X_op == O_absent
5640
11.0k
      || expP->X_op == O_big)
5641
607
    {
5642
607
      as_bad (_("expected address expression"));
5643
607
      expP->X_op = O_constant;
5644
607
      expP->X_add_number = 0;
5645
607
      retval = absolute_section;
5646
607
    }
5647
11.0k
  return retval;
5648
11.0k
}
5649
5650
static segT
5651
get_known_segmented_expression (expressionS *expP)
5652
11.0k
{
5653
11.0k
  segT retval = get_segmented_expression (expP);
5654
5655
11.0k
  if (retval == undefined_section)
5656
8.82k
    {
5657
      /* There is no easy way to extract the undefined symbol from the
5658
   expression.  */
5659
8.82k
      if (expP->X_add_symbol != NULL
5660
8.82k
    && S_GET_SEGMENT (expP->X_add_symbol) != expr_section)
5661
8.67k
  as_warn (_("symbol \"%s\" undefined; zero assumed"),
5662
8.67k
     S_GET_NAME (expP->X_add_symbol));
5663
154
      else
5664
154
  as_warn (_("some symbol undefined; zero assumed"));
5665
8.82k
      retval = absolute_section;
5666
8.82k
      expP->X_op = O_constant;
5667
8.82k
      expP->X_add_number = 0;
5668
8.82k
    }
5669
11.0k
  return retval;
5670
11.0k
}
5671
5672
char        /* Return terminator.  */
5673
get_absolute_expression_and_terminator (long *val_pointer /* Return value of expression.  */)
5674
46
{
5675
  /* FIXME: val_pointer should probably be offsetT *.  */
5676
46
  *val_pointer = (long) get_absolute_expression ();
5677
46
  return (*input_line_pointer++);
5678
46
}
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
28.1k
{
5686
28.1k
  char *s;
5687
5688
28.1k
  if ((s = demand_copy_string (len_pointer)) != 0)
5689
18.7k
    {
5690
18.7k
      int len;
5691
5692
959k
      for (len = *len_pointer; len > 0; len--)
5693
941k
  {
5694
941k
    if (s[len - 1] == 0)
5695
213
      {
5696
213
        s = 0;
5697
213
        *len_pointer = 0;
5698
213
        as_bad (_("this string may not contain \'\\0\'"));
5699
213
        break;
5700
213
      }
5701
941k
  }
5702
18.7k
    }
5703
5704
28.1k
  return s;
5705
28.1k
}
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
51.6k
{
5713
51.6k
  unsigned int c;
5714
51.6k
  int len;
5715
51.6k
  char *retval;
5716
5717
51.6k
  len = 0;
5718
51.6k
  SKIP_WHITESPACE ();
5719
51.6k
  if (*input_line_pointer == '\"')
5720
42.2k
    {
5721
42.2k
      input_line_pointer++; /* Skip opening quote.  */
5722
5723
1.71M
      while (is_a_char (c = next_char_of_string ()))
5724
1.67M
  {
5725
1.67M
    obstack_1grow (&notes, c);
5726
1.67M
    len++;
5727
1.67M
  }
5728
      /* JF this next line is so demand_copy_C_string will return a
5729
   null terminated string.  */
5730
42.2k
      obstack_1grow (&notes, '\0');
5731
42.2k
      retval = (char *) obstack_finish (&notes);
5732
42.2k
    }
5733
9.38k
  else
5734
9.38k
    {
5735
9.38k
      as_bad (_("missing string"));
5736
9.38k
      retval = NULL;
5737
9.38k
      ignore_rest_of_line ();
5738
9.38k
    }
5739
51.6k
  *lenP = len;
5740
51.6k
  return (retval);
5741
51.6k
}
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
38.9k
{
5752
38.9k
  SKIP_WHITESPACE ();
5753
38.9k
  return (is_end_of_line[(unsigned char) *input_line_pointer]);
5754
38.9k
}
5755
5756
void
5757
equals (char *sym_name, int reassign)
5758
99.5k
{
5759
99.5k
  char *stop = NULL;
5760
99.5k
  char stopc = 0;
5761
5762
99.5k
  input_line_pointer++;
5763
99.5k
  if (*input_line_pointer == '=')
5764
23.2k
    input_line_pointer++;
5765
99.5k
  if (reassign < 0 && *input_line_pointer == '=')
5766
3.59k
    input_line_pointer++;
5767
5768
100k
  while (*input_line_pointer == ' ' || *input_line_pointer == '\t')
5769
977
    input_line_pointer++;
5770
5771
99.5k
  if (flag_mri)
5772
83.8k
    stop = mri_comment_field (&stopc);
5773
5774
99.5k
  assign_symbol (sym_name, reassign >= 0 ? !reassign : reassign);
5775
5776
99.5k
  if (flag_mri)
5777
83.8k
    {
5778
83.8k
      demand_empty_rest_of_line ();
5779
83.8k
      mri_comment_end (stop, stopc);
5780
83.8k
    }
5781
99.5k
}
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
633
{
5970
633
  include_dirs = XNEWVEC (const char *, 1);
5971
633
  include_dirs[0] = ".";  /* Current dir.  */
5972
633
  include_dir_count = 1;
5973
633
  include_dir_maxlen = 1;
5974
633
}
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
633
{
5993
633
  if (debug_type == DEBUG_STABS)
5994
0
    stabs_generate_asm_file ();
5995
633
}
5996
5997
/* Output line number debugging information for the current source line.  */
5998
5999
void
6000
generate_lineno_debug (void)
6001
881k
{
6002
881k
  switch (debug_type)
6003
881k
    {
6004
399
    case DEBUG_UNSPECIFIED:
6005
881k
    case DEBUG_NONE:
6006
881k
    case DEBUG_DWARF:
6007
881k
      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
881k
    }
6024
881k
}
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
172
{
6138
172
  demand_empty_rest_of_line ();
6139
6140
172
  if (bundle_align_p2 == 0)
6141
172
    {
6142
172
      as_bad (_(".bundle_lock is meaningless without .bundle_align_mode"));
6143
172
      return;
6144
172
    }
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
265k
{
6191
265k
  ignore_rest_of_line ();
6192
265k
}
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
1.02M
{
6241
1.02M
  char inquote = '\0';
6242
1.02M
  int inescape = 0;
6243
6244
13.8M
  while (!is_end_of_line[(unsigned char) *s]
6245
13.8M
   || (inquote && !ISCNTRL (*s))
6246
13.8M
   || (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
13.8M
   || (in_macro && inescape && *s == '@')
6257
1.02M
  )
6258
12.8M
    {
6259
12.8M
      if (mri_string && *s == '\'')
6260
0
  inquote ^= *s;
6261
12.8M
      else if (inescape)
6262
260k
  inescape = 0;
6263
12.5M
      else if (*s == '\\')
6264
281k
  inescape = 1;
6265
12.3M
      else if (!inquote
6266
12.3M
         ? *s == '"'
6267
#ifdef TC_SINGLE_QUOTE_STRINGS
6268
     || (TC_SINGLE_QUOTE_STRINGS && *s == '\'')
6269
#endif
6270
12.3M
         : *s == inquote)
6271
54.5k
  inquote ^= *s;
6272
12.8M
      ++s;
6273
12.8M
    }
6274
1.02M
  if (inquote)
6275
30.8k
    as_warn (_("missing closing `%c'"), inquote);
6276
1.02M
  if (inescape && !ignore_input ())
6277
20.7k
    as_warn (_("stray `\\'"));
6278
1.02M
  return s;
6279
1.02M
}
6280
6281
char *
6282
find_end_of_line (char *s, int mri_string)
6283
43.7k
{
6284
43.7k
  return _find_end_of_line (s, mri_string, 0, 0);
6285
43.7k
}
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
649
{
6301
649
  gas_assert (saved_ilp == NULL);
6302
649
  gas_assert (buf != NULL);
6303
6304
0
  saved_ilp = input_line_pointer;
6305
649
  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
649
  if (saved_ilp == NULL)
6309
0
    saved_limit = saved_ilp = (char *) "";
6310
6311
649
  input_line_pointer = buf;
6312
649
  buffer_limit = buf + strlen (buf);
6313
649
  input_from_string = true;
6314
649
}
6315
6316
/* Restore a saved input line pointer.  */
6317
6318
void
6319
restore_ilp (void)
6320
649
{
6321
649
  gas_assert (saved_ilp != NULL);
6322
6323
0
  input_line_pointer = saved_ilp;
6324
649
  buffer_limit = saved_limit;
6325
649
  input_from_string = false;
6326
6327
649
  saved_ilp = NULL;
6328
649
}