OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [gnu-src/] [binutils-2.18.50/] [gas/] [read.c] - Blame information for rev 156

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.