OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [binutils-2.18.50/] [gas/] [config/] [tc-ppc.c] - Blame information for rev 853

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 38 julius
/* tc-ppc.c -- Assemble for the PowerPC or POWER (RS/6000)
2
   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3
   2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
4
   Written by Ian Lance Taylor, Cygnus Support.
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
#include "as.h"
24
#include "safe-ctype.h"
25
#include "subsegs.h"
26
#include "dw2gencfi.h"
27
#include "opcode/ppc.h"
28
 
29
#ifdef OBJ_ELF
30
#include "elf/ppc.h"
31
#include "dwarf2dbg.h"
32
#endif
33
 
34
#ifdef TE_PE
35
#include "coff/pe.h"
36
#endif
37
 
38
/* This is the assembler for the PowerPC or POWER (RS/6000) chips.  */
39
 
40
/* Tell the main code what the endianness is.  */
41
extern int target_big_endian;
42
 
43
/* Whether or not, we've set target_big_endian.  */
44
static int set_target_endian = 0;
45
 
46
/* Whether to use user friendly register names.  */
47
#ifndef TARGET_REG_NAMES_P
48
#ifdef TE_PE
49
#define TARGET_REG_NAMES_P TRUE
50
#else
51
#define TARGET_REG_NAMES_P FALSE
52
#endif
53
#endif
54
 
55
/* Macros for calculating LO, HI, HA, HIGHER, HIGHERA, HIGHEST,
56
   HIGHESTA.  */
57
 
58
/* #lo(value) denotes the least significant 16 bits of the indicated.  */
59
#define PPC_LO(v) ((v) & 0xffff)
60
 
61
/* #hi(value) denotes bits 16 through 31 of the indicated value.  */
62
#define PPC_HI(v) (((v) >> 16) & 0xffff)
63
 
64
/* #ha(value) denotes the high adjusted value: bits 16 through 31 of
65
  the indicated value, compensating for #lo() being treated as a
66
  signed number.  */
67
#define PPC_HA(v) PPC_HI ((v) + 0x8000)
68
 
69
/* #higher(value) denotes bits 32 through 47 of the indicated value.  */
70
#define PPC_HIGHER(v) (((v) >> 16 >> 16) & 0xffff)
71
 
72
/* #highera(value) denotes bits 32 through 47 of the indicated value,
73
   compensating for #lo() being treated as a signed number.  */
74
#define PPC_HIGHERA(v) PPC_HIGHER ((v) + 0x8000)
75
 
76
/* #highest(value) denotes bits 48 through 63 of the indicated value.  */
77
#define PPC_HIGHEST(v) (((v) >> 24 >> 24) & 0xffff)
78
 
79
/* #highesta(value) denotes bits 48 through 63 of the indicated value,
80
   compensating for #lo being treated as a signed number.  */
81
#define PPC_HIGHESTA(v) PPC_HIGHEST ((v) + 0x8000)
82
 
83
#define SEX16(val) ((((val) & 0xffff) ^ 0x8000) - 0x8000)
84
 
85
static bfd_boolean reg_names_p = TARGET_REG_NAMES_P;
86
 
87
static void ppc_macro (char *, const struct powerpc_macro *);
88
static void ppc_byte (int);
89
 
90
#if defined (OBJ_XCOFF) || defined (OBJ_ELF)
91
static void ppc_tc (int);
92
static void ppc_machine (int);
93
#endif
94
 
95
#ifdef OBJ_XCOFF
96
static void ppc_comm (int);
97
static void ppc_bb (int);
98
static void ppc_bc (int);
99
static void ppc_bf (int);
100
static void ppc_biei (int);
101
static void ppc_bs (int);
102
static void ppc_eb (int);
103
static void ppc_ec (int);
104
static void ppc_ef (int);
105
static void ppc_es (int);
106
static void ppc_csect (int);
107
static void ppc_change_csect (symbolS *, offsetT);
108
static void ppc_function (int);
109
static void ppc_extern (int);
110
static void ppc_lglobl (int);
111
static void ppc_section (int);
112
static void ppc_named_section (int);
113
static void ppc_stabx (int);
114
static void ppc_rename (int);
115
static void ppc_toc (int);
116
static void ppc_xcoff_cons (int);
117
static void ppc_vbyte (int);
118
#endif
119
 
120
#ifdef OBJ_ELF
121
static void ppc_elf_cons (int);
122
static void ppc_elf_rdata (int);
123
static void ppc_elf_lcomm (int);
124
#endif
125
 
126
#ifdef TE_PE
127
static void ppc_previous (int);
128
static void ppc_pdata (int);
129
static void ppc_ydata (int);
130
static void ppc_reldata (int);
131
static void ppc_rdata (int);
132
static void ppc_ualong (int);
133
static void ppc_znop (int);
134
static void ppc_pe_comm (int);
135
static void ppc_pe_section (int);
136
static void ppc_pe_function (int);
137
static void ppc_pe_tocd (int);
138
#endif
139
 
140
/* Generic assembler global variables which must be defined by all
141
   targets.  */
142
 
143
#ifdef OBJ_ELF
144
/* This string holds the chars that always start a comment.  If the
145
   pre-processor is disabled, these aren't very useful.  The macro
146
   tc_comment_chars points to this.  We use this, rather than the
147
   usual comment_chars, so that we can switch for Solaris conventions.  */
148
static const char ppc_solaris_comment_chars[] = "#!";
149
static const char ppc_eabi_comment_chars[] = "#";
150
 
151
#ifdef TARGET_SOLARIS_COMMENT
152
const char *ppc_comment_chars = ppc_solaris_comment_chars;
153
#else
154
const char *ppc_comment_chars = ppc_eabi_comment_chars;
155
#endif
156
#else
157
const char comment_chars[] = "#";
158
#endif
159
 
160
/* Characters which start a comment at the beginning of a line.  */
161
const char line_comment_chars[] = "#";
162
 
163
/* Characters which may be used to separate multiple commands on a
164
   single line.  */
165
const char line_separator_chars[] = ";";
166
 
167
/* Characters which are used to indicate an exponent in a floating
168
   point number.  */
169
const char EXP_CHARS[] = "eE";
170
 
171
/* Characters which mean that a number is a floating point constant,
172
   as in 0d1.0.  */
173
const char FLT_CHARS[] = "dD";
174
 
175
/* Anything that can start an operand needs to be mentioned here,
176
   to stop the input scrubber eating whitespace.  */
177
const char ppc_symbol_chars[] = "%[";
178
 
179
/* The dwarf2 data alignment, adjusted for 32 or 64 bit.  */
180
int ppc_cie_data_alignment;
181
 
182
/* The type of processor we are assembling for.  This is one or more
183
   of the PPC_OPCODE flags defined in opcode/ppc.h.  */
184
unsigned long ppc_cpu = 0;
185
 
186
/* The target specific pseudo-ops which we support.  */
187
 
188
const pseudo_typeS md_pseudo_table[] =
189
{
190
  /* Pseudo-ops which must be overridden.  */
191
  { "byte",     ppc_byte,       0 },
192
 
193
#ifdef OBJ_XCOFF
194
  /* Pseudo-ops specific to the RS/6000 XCOFF format.  Some of these
195
     legitimately belong in the obj-*.c file.  However, XCOFF is based
196
     on COFF, and is only implemented for the RS/6000.  We just use
197
     obj-coff.c, and add what we need here.  */
198
  { "comm",     ppc_comm,       0 },
199
  { "lcomm",    ppc_comm,       1 },
200
  { "bb",       ppc_bb,         0 },
201
  { "bc",       ppc_bc,         0 },
202
  { "bf",       ppc_bf,         0 },
203
  { "bi",       ppc_biei,       0 },
204
  { "bs",       ppc_bs,         0 },
205
  { "csect",    ppc_csect,      0 },
206
  { "data",     ppc_section,    'd' },
207
  { "eb",       ppc_eb,         0 },
208
  { "ec",       ppc_ec,         0 },
209
  { "ef",       ppc_ef,         0 },
210
  { "ei",       ppc_biei,       1 },
211
  { "es",       ppc_es,         0 },
212
  { "extern",   ppc_extern,     0 },
213
  { "function", ppc_function,   0 },
214
  { "lglobl",   ppc_lglobl,     0 },
215
  { "rename",   ppc_rename,     0 },
216
  { "section",  ppc_named_section, 0 },
217
  { "stabx",    ppc_stabx,      0 },
218
  { "text",     ppc_section,    't' },
219
  { "toc",      ppc_toc,        0 },
220
  { "long",     ppc_xcoff_cons, 2 },
221
  { "llong",    ppc_xcoff_cons, 3 },
222
  { "word",     ppc_xcoff_cons, 1 },
223
  { "short",    ppc_xcoff_cons, 1 },
224
  { "vbyte",    ppc_vbyte,      0 },
225
#endif
226
 
227
#ifdef OBJ_ELF
228
  { "llong",    ppc_elf_cons,   8 },
229
  { "quad",     ppc_elf_cons,   8 },
230
  { "long",     ppc_elf_cons,   4 },
231
  { "word",     ppc_elf_cons,   2 },
232
  { "short",    ppc_elf_cons,   2 },
233
  { "rdata",    ppc_elf_rdata,  0 },
234
  { "rodata",   ppc_elf_rdata,  0 },
235
  { "lcomm",    ppc_elf_lcomm,  0 },
236
#endif
237
 
238
#ifdef TE_PE
239
  /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format.  */
240
  { "previous", ppc_previous,   0 },
241
  { "pdata",    ppc_pdata,      0 },
242
  { "ydata",    ppc_ydata,      0 },
243
  { "reldata",  ppc_reldata,    0 },
244
  { "rdata",    ppc_rdata,      0 },
245
  { "ualong",   ppc_ualong,     0 },
246
  { "znop",     ppc_znop,       0 },
247
  { "comm",     ppc_pe_comm,    0 },
248
  { "lcomm",    ppc_pe_comm,    1 },
249
  { "section",  ppc_pe_section, 0 },
250
  { "function", ppc_pe_function,0 },
251
  { "tocd",     ppc_pe_tocd,    0 },
252
#endif
253
 
254
#if defined (OBJ_XCOFF) || defined (OBJ_ELF)
255
  { "tc",       ppc_tc,         0 },
256
  { "machine",  ppc_machine,    0 },
257
#endif
258
 
259
  { NULL,       NULL,           0 }
260
};
261
 
262
 
263
/* Predefined register names if -mregnames (or default for Windows NT).
264
   In general, there are lots of them, in an attempt to be compatible
265
   with a number of other Windows NT assemblers.  */
266
 
267
/* Structure to hold information about predefined registers.  */
268
struct pd_reg
269
  {
270
    char *name;
271
    int value;
272
  };
273
 
274
/* List of registers that are pre-defined:
275
 
276
   Each general register has predefined names of the form:
277
   1. r<reg_num> which has the value <reg_num>.
278
   2. r.<reg_num> which has the value <reg_num>.
279
 
280
   Each floating point register has predefined names of the form:
281
   1. f<reg_num> which has the value <reg_num>.
282
   2. f.<reg_num> which has the value <reg_num>.
283
 
284
   Each vector unit register has predefined names of the form:
285
   1. v<reg_num> which has the value <reg_num>.
286
   2. v.<reg_num> which has the value <reg_num>.
287
 
288
   Each condition register has predefined names of the form:
289
   1. cr<reg_num> which has the value <reg_num>.
290
   2. cr.<reg_num> which has the value <reg_num>.
291
 
292
   There are individual registers as well:
293
   sp or r.sp     has the value 1
294
   rtoc or r.toc  has the value 2
295
   fpscr          has the value 0
296
   xer            has the value 1
297
   lr             has the value 8
298
   ctr            has the value 9
299
   pmr            has the value 0
300
   dar            has the value 19
301
   dsisr          has the value 18
302
   dec            has the value 22
303
   sdr1           has the value 25
304
   srr0           has the value 26
305
   srr1           has the value 27
306
 
307
   The table is sorted. Suitable for searching by a binary search.  */
308
 
309
static const struct pd_reg pre_defined_registers[] =
310
{
311
  { "cr.0", 0 },    /* Condition Registers */
312
  { "cr.1", 1 },
313
  { "cr.2", 2 },
314
  { "cr.3", 3 },
315
  { "cr.4", 4 },
316
  { "cr.5", 5 },
317
  { "cr.6", 6 },
318
  { "cr.7", 7 },
319
 
320
  { "cr0", 0 },
321
  { "cr1", 1 },
322
  { "cr2", 2 },
323
  { "cr3", 3 },
324
  { "cr4", 4 },
325
  { "cr5", 5 },
326
  { "cr6", 6 },
327
  { "cr7", 7 },
328
 
329
  { "ctr", 9 },
330
 
331
  { "dar", 19 },    /* Data Access Register */
332
  { "dec", 22 },    /* Decrementer */
333
  { "dsisr", 18 },  /* Data Storage Interrupt Status Register */
334
 
335
  { "f.0", 0 },     /* Floating point registers */
336
  { "f.1", 1 },
337
  { "f.10", 10 },
338
  { "f.11", 11 },
339
  { "f.12", 12 },
340
  { "f.13", 13 },
341
  { "f.14", 14 },
342
  { "f.15", 15 },
343
  { "f.16", 16 },
344
  { "f.17", 17 },
345
  { "f.18", 18 },
346
  { "f.19", 19 },
347
  { "f.2", 2 },
348
  { "f.20", 20 },
349
  { "f.21", 21 },
350
  { "f.22", 22 },
351
  { "f.23", 23 },
352
  { "f.24", 24 },
353
  { "f.25", 25 },
354
  { "f.26", 26 },
355
  { "f.27", 27 },
356
  { "f.28", 28 },
357
  { "f.29", 29 },
358
  { "f.3", 3 },
359
  { "f.30", 30 },
360
  { "f.31", 31 },
361
  { "f.4", 4 },
362
  { "f.5", 5 },
363
  { "f.6", 6 },
364
  { "f.7", 7 },
365
  { "f.8", 8 },
366
  { "f.9", 9 },
367
 
368
  { "f0", 0 },
369
  { "f1", 1 },
370
  { "f10", 10 },
371
  { "f11", 11 },
372
  { "f12", 12 },
373
  { "f13", 13 },
374
  { "f14", 14 },
375
  { "f15", 15 },
376
  { "f16", 16 },
377
  { "f17", 17 },
378
  { "f18", 18 },
379
  { "f19", 19 },
380
  { "f2", 2 },
381
  { "f20", 20 },
382
  { "f21", 21 },
383
  { "f22", 22 },
384
  { "f23", 23 },
385
  { "f24", 24 },
386
  { "f25", 25 },
387
  { "f26", 26 },
388
  { "f27", 27 },
389
  { "f28", 28 },
390
  { "f29", 29 },
391
  { "f3", 3 },
392
  { "f30", 30 },
393
  { "f31", 31 },
394
  { "f4", 4 },
395
  { "f5", 5 },
396
  { "f6", 6 },
397
  { "f7", 7 },
398
  { "f8", 8 },
399
  { "f9", 9 },
400
 
401
  { "fpscr", 0 },
402
 
403
  /* Quantization registers used with pair single instructions.  */
404
  { "gqr.0", 0 },
405
  { "gqr.1", 1 },
406
  { "gqr.2", 2 },
407
  { "gqr.3", 3 },
408
  { "gqr.4", 4 },
409
  { "gqr.5", 5 },
410
  { "gqr.6", 6 },
411
  { "gqr.7", 7 },
412
  { "gqr0", 0 },
413
  { "gqr1", 1 },
414
  { "gqr2", 2 },
415
  { "gqr3", 3 },
416
  { "gqr4", 4 },
417
  { "gqr5", 5 },
418
  { "gqr6", 6 },
419
  { "gqr7", 7 },
420
 
421
  { "lr", 8 },     /* Link Register */
422
 
423
  { "pmr", 0 },
424
 
425
  { "r.0", 0 },    /* General Purpose Registers */
426
  { "r.1", 1 },
427
  { "r.10", 10 },
428
  { "r.11", 11 },
429
  { "r.12", 12 },
430
  { "r.13", 13 },
431
  { "r.14", 14 },
432
  { "r.15", 15 },
433
  { "r.16", 16 },
434
  { "r.17", 17 },
435
  { "r.18", 18 },
436
  { "r.19", 19 },
437
  { "r.2", 2 },
438
  { "r.20", 20 },
439
  { "r.21", 21 },
440
  { "r.22", 22 },
441
  { "r.23", 23 },
442
  { "r.24", 24 },
443
  { "r.25", 25 },
444
  { "r.26", 26 },
445
  { "r.27", 27 },
446
  { "r.28", 28 },
447
  { "r.29", 29 },
448
  { "r.3", 3 },
449
  { "r.30", 30 },
450
  { "r.31", 31 },
451
  { "r.4", 4 },
452
  { "r.5", 5 },
453
  { "r.6", 6 },
454
  { "r.7", 7 },
455
  { "r.8", 8 },
456
  { "r.9", 9 },
457
 
458
  { "r.sp", 1 },   /* Stack Pointer */
459
 
460
  { "r.toc", 2 },  /* Pointer to the table of contents */
461
 
462
  { "r0", 0 },     /* More general purpose registers */
463
  { "r1", 1 },
464
  { "r10", 10 },
465
  { "r11", 11 },
466
  { "r12", 12 },
467
  { "r13", 13 },
468
  { "r14", 14 },
469
  { "r15", 15 },
470
  { "r16", 16 },
471
  { "r17", 17 },
472
  { "r18", 18 },
473
  { "r19", 19 },
474
  { "r2", 2 },
475
  { "r20", 20 },
476
  { "r21", 21 },
477
  { "r22", 22 },
478
  { "r23", 23 },
479
  { "r24", 24 },
480
  { "r25", 25 },
481
  { "r26", 26 },
482
  { "r27", 27 },
483
  { "r28", 28 },
484
  { "r29", 29 },
485
  { "r3", 3 },
486
  { "r30", 30 },
487
  { "r31", 31 },
488
  { "r4", 4 },
489
  { "r5", 5 },
490
  { "r6", 6 },
491
  { "r7", 7 },
492
  { "r8", 8 },
493
  { "r9", 9 },
494
 
495
  { "rtoc", 2 },  /* Table of contents */
496
 
497
  { "sdr1", 25 }, /* Storage Description Register 1 */
498
 
499
  { "sp", 1 },
500
 
501
  { "srr0", 26 }, /* Machine Status Save/Restore Register 0 */
502
  { "srr1", 27 }, /* Machine Status Save/Restore Register 1 */
503
 
504
  { "v.0", 0 },     /* Vector registers */
505
  { "v.1", 1 },
506
  { "v.10", 10 },
507
  { "v.11", 11 },
508
  { "v.12", 12 },
509
  { "v.13", 13 },
510
  { "v.14", 14 },
511
  { "v.15", 15 },
512
  { "v.16", 16 },
513
  { "v.17", 17 },
514
  { "v.18", 18 },
515
  { "v.19", 19 },
516
  { "v.2", 2 },
517
  { "v.20", 20 },
518
  { "v.21", 21 },
519
  { "v.22", 22 },
520
  { "v.23", 23 },
521
  { "v.24", 24 },
522
  { "v.25", 25 },
523
  { "v.26", 26 },
524
  { "v.27", 27 },
525
  { "v.28", 28 },
526
  { "v.29", 29 },
527
  { "v.3", 3 },
528
  { "v.30", 30 },
529
  { "v.31", 31 },
530
  { "v.4", 4 },
531
  { "v.5", 5 },
532
  { "v.6", 6 },
533
  { "v.7", 7 },
534
  { "v.8", 8 },
535
  { "v.9", 9 },
536
 
537
  { "v0", 0 },
538
  { "v1", 1 },
539
  { "v10", 10 },
540
  { "v11", 11 },
541
  { "v12", 12 },
542
  { "v13", 13 },
543
  { "v14", 14 },
544
  { "v15", 15 },
545
  { "v16", 16 },
546
  { "v17", 17 },
547
  { "v18", 18 },
548
  { "v19", 19 },
549
  { "v2", 2 },
550
  { "v20", 20 },
551
  { "v21", 21 },
552
  { "v22", 22 },
553
  { "v23", 23 },
554
  { "v24", 24 },
555
  { "v25", 25 },
556
  { "v26", 26 },
557
  { "v27", 27 },
558
  { "v28", 28 },
559
  { "v29", 29 },
560
  { "v3", 3 },
561
  { "v30", 30 },
562
  { "v31", 31 },
563
  { "v4", 4 },
564
  { "v5", 5 },
565
  { "v6", 6 },
566
  { "v7", 7 },
567
  { "v8", 8 },
568
  { "v9", 9 },
569
 
570
  { "xer", 1 },
571
 
572
};
573
 
574
#define REG_NAME_CNT    (sizeof (pre_defined_registers) / sizeof (struct pd_reg))
575
 
576
/* Given NAME, find the register number associated with that name, return
577
   the integer value associated with the given name or -1 on failure.  */
578
 
579
static int
580
reg_name_search (const struct pd_reg *regs, int regcount, const char *name)
581
{
582
  int middle, low, high;
583
  int cmp;
584
 
585
  low = 0;
586
  high = regcount - 1;
587
 
588
  do
589
    {
590
      middle = (low + high) / 2;
591
      cmp = strcasecmp (name, regs[middle].name);
592
      if (cmp < 0)
593
        high = middle - 1;
594
      else if (cmp > 0)
595
        low = middle + 1;
596
      else
597
        return regs[middle].value;
598
    }
599
  while (low <= high);
600
 
601
  return -1;
602
}
603
 
604
/*
605
 * Summary of register_name.
606
 *
607
 * in:  Input_line_pointer points to 1st char of operand.
608
 *
609
 * out: A expressionS.
610
 *      The operand may have been a register: in this case, X_op == O_register,
611
 *      X_add_number is set to the register number, and truth is returned.
612
 *      Input_line_pointer->(next non-blank) char after operand, or is in its
613
 *      original state.
614
 */
615
 
616
static bfd_boolean
617
register_name (expressionS *expressionP)
618
{
619
  int reg_number;
620
  char *name;
621
  char *start;
622
  char c;
623
 
624
  /* Find the spelling of the operand.  */
625
  start = name = input_line_pointer;
626
  if (name[0] == '%' && ISALPHA (name[1]))
627
    name = ++input_line_pointer;
628
 
629
  else if (!reg_names_p || !ISALPHA (name[0]))
630
    return FALSE;
631
 
632
  c = get_symbol_end ();
633
  reg_number = reg_name_search (pre_defined_registers, REG_NAME_CNT, name);
634
 
635
  /* Put back the delimiting char.  */
636
  *input_line_pointer = c;
637
 
638
  /* Look to see if it's in the register table.  */
639
  if (reg_number >= 0)
640
    {
641
      expressionP->X_op = O_register;
642
      expressionP->X_add_number = reg_number;
643
 
644
      /* Make the rest nice.  */
645
      expressionP->X_add_symbol = NULL;
646
      expressionP->X_op_symbol = NULL;
647
      return TRUE;
648
    }
649
 
650
  /* Reset the line as if we had not done anything.  */
651
  input_line_pointer = start;
652
  return FALSE;
653
}
654
 
655
/* This function is called for each symbol seen in an expression.  It
656
   handles the special parsing which PowerPC assemblers are supposed
657
   to use for condition codes.  */
658
 
659
/* Whether to do the special parsing.  */
660
static bfd_boolean cr_operand;
661
 
662
/* Names to recognize in a condition code.  This table is sorted.  */
663
static const struct pd_reg cr_names[] =
664
{
665
  { "cr0", 0 },
666
  { "cr1", 1 },
667
  { "cr2", 2 },
668
  { "cr3", 3 },
669
  { "cr4", 4 },
670
  { "cr5", 5 },
671
  { "cr6", 6 },
672
  { "cr7", 7 },
673
  { "eq", 2 },
674
  { "gt", 1 },
675
  { "lt", 0 },
676
  { "so", 3 },
677
  { "un", 3 }
678
};
679
 
680
/* Parsing function.  This returns non-zero if it recognized an
681
   expression.  */
682
 
683
int
684
ppc_parse_name (const char *name, expressionS *expr)
685
{
686
  int val;
687
 
688
  if (! cr_operand)
689
    return 0;
690
 
691
  if (*name == '%')
692
    ++name;
693
  val = reg_name_search (cr_names, sizeof cr_names / sizeof cr_names[0],
694
                         name);
695
  if (val < 0)
696
    return 0;
697
 
698
  expr->X_op = O_constant;
699
  expr->X_add_number = val;
700
 
701
  return 1;
702
}
703
 
704
/* Local variables.  */
705
 
706
/* Whether to target xcoff64/elf64.  */
707
static unsigned int ppc_obj64 = BFD_DEFAULT_TARGET_SIZE == 64;
708
 
709
/* Opcode hash table.  */
710
static struct hash_control *ppc_hash;
711
 
712
/* Macro hash table.  */
713
static struct hash_control *ppc_macro_hash;
714
 
715
#ifdef OBJ_ELF
716
/* What type of shared library support to use.  */
717
static enum { SHLIB_NONE, SHLIB_PIC, SHLIB_MRELOCATABLE } shlib = SHLIB_NONE;
718
 
719
/* Flags to set in the elf header.  */
720
static flagword ppc_flags = 0;
721
 
722
/* Whether this is Solaris or not.  */
723
#ifdef TARGET_SOLARIS_COMMENT
724
#define SOLARIS_P TRUE
725
#else
726
#define SOLARIS_P FALSE
727
#endif
728
 
729
static bfd_boolean msolaris = SOLARIS_P;
730
#endif
731
 
732
#ifdef OBJ_XCOFF
733
 
734
/* The RS/6000 assembler uses the .csect pseudo-op to generate code
735
   using a bunch of different sections.  These assembler sections,
736
   however, are all encompassed within the .text or .data sections of
737
   the final output file.  We handle this by using different
738
   subsegments within these main segments.  */
739
 
740
/* Next subsegment to allocate within the .text segment.  */
741
static subsegT ppc_text_subsegment = 2;
742
 
743
/* Linked list of csects in the text section.  */
744
static symbolS *ppc_text_csects;
745
 
746
/* Next subsegment to allocate within the .data segment.  */
747
static subsegT ppc_data_subsegment = 2;
748
 
749
/* Linked list of csects in the data section.  */
750
static symbolS *ppc_data_csects;
751
 
752
/* The current csect.  */
753
static symbolS *ppc_current_csect;
754
 
755
/* The RS/6000 assembler uses a TOC which holds addresses of functions
756
   and variables.  Symbols are put in the TOC with the .tc pseudo-op.
757
   A special relocation is used when accessing TOC entries.  We handle
758
   the TOC as a subsegment within the .data segment.  We set it up if
759
   we see a .toc pseudo-op, and save the csect symbol here.  */
760
static symbolS *ppc_toc_csect;
761
 
762
/* The first frag in the TOC subsegment.  */
763
static fragS *ppc_toc_frag;
764
 
765
/* The first frag in the first subsegment after the TOC in the .data
766
   segment.  NULL if there are no subsegments after the TOC.  */
767
static fragS *ppc_after_toc_frag;
768
 
769
/* The current static block.  */
770
static symbolS *ppc_current_block;
771
 
772
/* The COFF debugging section; set by md_begin.  This is not the
773
   .debug section, but is instead the secret BFD section which will
774
   cause BFD to set the section number of a symbol to N_DEBUG.  */
775
static asection *ppc_coff_debug_section;
776
 
777
#endif /* OBJ_XCOFF */
778
 
779
#ifdef TE_PE
780
 
781
/* Various sections that we need for PE coff support.  */
782
static segT ydata_section;
783
static segT pdata_section;
784
static segT reldata_section;
785
static segT rdata_section;
786
static segT tocdata_section;
787
 
788
/* The current section and the previous section. See ppc_previous.  */
789
static segT ppc_previous_section;
790
static segT ppc_current_section;
791
 
792
#endif /* TE_PE */
793
 
794
#ifdef OBJ_ELF
795
symbolS *GOT_symbol;            /* Pre-defined "_GLOBAL_OFFSET_TABLE" */
796
#define PPC_APUINFO_ISEL        0x40
797
#define PPC_APUINFO_PMR         0x41
798
#define PPC_APUINFO_RFMCI       0x42
799
#define PPC_APUINFO_CACHELCK    0x43
800
#define PPC_APUINFO_SPE         0x100
801
#define PPC_APUINFO_EFS         0x101
802
#define PPC_APUINFO_BRLOCK      0x102
803
 
804
/*
805
 * We keep a list of APUinfo
806
 */
807
unsigned long *ppc_apuinfo_list;
808
unsigned int ppc_apuinfo_num;
809
unsigned int ppc_apuinfo_num_alloc;
810
#endif /* OBJ_ELF */
811
 
812
#ifdef OBJ_ELF
813
const char *const md_shortopts = "b:l:usm:K:VQ:";
814
#else
815
const char *const md_shortopts = "um:";
816
#endif
817
const struct option md_longopts[] = {
818
  {NULL, no_argument, NULL, 0}
819
};
820
const size_t md_longopts_size = sizeof (md_longopts);
821
 
822
 
823
/* Handle -m options that set cpu type, and .machine arg.  */
824
 
825
static int
826
parse_cpu (const char *arg)
827
{
828
  unsigned long altivec_or_spe = ppc_cpu & (PPC_OPCODE_ALTIVEC | PPC_OPCODE_SPE);
829
 
830
  /* -mpwrx and -mpwr2 mean to assemble for the IBM POWER/2
831
     (RIOS2).  */
832
  if (strcmp (arg, "pwrx") == 0 || strcmp (arg, "pwr2") == 0)
833
    ppc_cpu = PPC_OPCODE_POWER | PPC_OPCODE_POWER2 | PPC_OPCODE_32;
834
  /* -mpwr means to assemble for the IBM POWER (RIOS1).  */
835
  else if (strcmp (arg, "pwr") == 0)
836
    ppc_cpu = PPC_OPCODE_POWER | PPC_OPCODE_32;
837
  /* -m601 means to assemble for the PowerPC 601, which includes
838
     instructions that are holdovers from the Power.  */
839
  else if (strcmp (arg, "601") == 0)
840
    ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC
841
               | PPC_OPCODE_601 | PPC_OPCODE_32);
842
  /* -mppc, -mppc32, -m603, and -m604 mean to assemble for the
843
     PowerPC 603/604.  */
844
  else if (strcmp (arg, "ppc") == 0
845
           || strcmp (arg, "ppc32") == 0
846
           || strcmp (arg, "603") == 0
847
           || strcmp (arg, "604") == 0)
848
    ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_32;
849
  /* Do all PPC750s have paired single ops?  */
850
  else if (strcmp (arg, "750cl") == 0)
851
    ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_PPCPS;
852
  /* -m403 and -m405 mean to assemble for the PowerPC 403/405.  */
853
  else if (strcmp (arg, "403") == 0
854
           || strcmp (arg, "405") == 0)
855
    ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC
856
               | PPC_OPCODE_403 | PPC_OPCODE_32);
857
  else if (strcmp (arg, "440") == 0)
858
    ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_32
859
               | PPC_OPCODE_440 | PPC_OPCODE_ISEL | PPC_OPCODE_RFMCI);
860
  else if (strcmp (arg, "7400") == 0
861
           || strcmp (arg, "7410") == 0
862
           || strcmp (arg, "7450") == 0
863
           || strcmp (arg, "7455") == 0)
864
    ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC
865
               | PPC_OPCODE_ALTIVEC | PPC_OPCODE_32);
866
  else if (strcmp (arg, "e300") == 0)
867
    ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_32
868
               | PPC_OPCODE_E300);
869
  else if (strcmp (arg, "altivec") == 0)
870
    {
871
      if (ppc_cpu == 0)
872
        ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC;
873
 
874
      altivec_or_spe |= PPC_OPCODE_ALTIVEC;
875
    }
876
  else if (strcmp (arg, "e500") == 0 || strcmp (arg, "e500x2") == 0)
877
    {
878
      ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_SPE
879
                 | PPC_OPCODE_ISEL | PPC_OPCODE_EFS | PPC_OPCODE_BRLOCK
880
                 | PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK
881
                 | PPC_OPCODE_RFMCI | PPC_OPCODE_E500MC);
882
    }
883
  else if (strcmp (arg, "e500mc") == 0)
884
    {
885
      ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_ISEL
886
                 | PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK
887
                 | PPC_OPCODE_RFMCI | PPC_OPCODE_E500MC);
888
    }
889
  else if (strcmp (arg, "spe") == 0)
890
    {
891
      if (ppc_cpu == 0)
892
        ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_EFS;
893
 
894
      altivec_or_spe |= PPC_OPCODE_SPE;
895
    }
896
  /* -mppc64 and -m620 mean to assemble for the 64-bit PowerPC
897
     620.  */
898
  else if (strcmp (arg, "ppc64") == 0 || strcmp (arg, "620") == 0)
899
    {
900
      ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_64;
901
    }
902
  else if (strcmp (arg, "ppc64bridge") == 0)
903
    {
904
      ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC
905
                 | PPC_OPCODE_64_BRIDGE | PPC_OPCODE_64);
906
    }
907
  /* -mbooke/-mbooke32 mean enable 32-bit BookE support.  */
908
  else if (strcmp (arg, "booke") == 0 || strcmp (arg, "booke32") == 0)
909
    {
910
      ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_BOOKE | PPC_OPCODE_32;
911
    }
912
  /* -mbooke64 means enable 64-bit BookE support.  */
913
  else if (strcmp (arg, "booke64") == 0)
914
    {
915
      ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_BOOKE
916
                 | PPC_OPCODE_BOOKE64 | PPC_OPCODE_64);
917
    }
918
  else if (strcmp (arg, "power4") == 0)
919
    {
920
      ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC
921
                 | PPC_OPCODE_64 | PPC_OPCODE_POWER4);
922
    }
923
  else if (strcmp (arg, "power5") == 0)
924
    {
925
      ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC
926
                 | PPC_OPCODE_64 | PPC_OPCODE_POWER4
927
                 | PPC_OPCODE_POWER5);
928
    }
929
  else if (strcmp (arg, "power6") == 0)
930
    {
931
      ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC
932
                 | PPC_OPCODE_64 | PPC_OPCODE_POWER4
933
                 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6);
934
    }
935
  else if (strcmp (arg, "cell") == 0)
936
    {
937
      ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC
938
                 | PPC_OPCODE_64 | PPC_OPCODE_POWER4
939
                 | PPC_OPCODE_CELL);
940
    }
941
  /* -mcom means assemble for the common intersection between Power
942
     and PowerPC.  At present, we just allow the union, rather
943
     than the intersection.  */
944
  else if (strcmp (arg, "com") == 0)
945
    ppc_cpu = PPC_OPCODE_COMMON | PPC_OPCODE_32;
946
  /* -many means to assemble for any architecture (PWR/PWRX/PPC).  */
947
  else if (strcmp (arg, "any") == 0)
948
    ppc_cpu |= PPC_OPCODE_ANY;
949
  else
950
    return 0;
951
 
952
  /* Make sure the the Altivec and SPE bits are not lost.  */
953
  ppc_cpu |= altivec_or_spe;
954
  return 1;
955
}
956
 
957
int
958
md_parse_option (int c, char *arg)
959
{
960
  switch (c)
961
    {
962
    case 'u':
963
      /* -u means that any undefined symbols should be treated as
964
         external, which is the default for gas anyhow.  */
965
      break;
966
 
967
#ifdef OBJ_ELF
968
    case 'l':
969
      /* Solaris as takes -le (presumably for little endian).  For completeness
970
         sake, recognize -be also.  */
971
      if (strcmp (arg, "e") == 0)
972
        {
973
          target_big_endian = 0;
974
          set_target_endian = 1;
975
        }
976
      else
977
        return 0;
978
 
979
      break;
980
 
981
    case 'b':
982
      if (strcmp (arg, "e") == 0)
983
        {
984
          target_big_endian = 1;
985
          set_target_endian = 1;
986
        }
987
      else
988
        return 0;
989
 
990
      break;
991
 
992
    case 'K':
993
      /* Recognize -K PIC.  */
994
      if (strcmp (arg, "PIC") == 0 || strcmp (arg, "pic") == 0)
995
        {
996
          shlib = SHLIB_PIC;
997
          ppc_flags |= EF_PPC_RELOCATABLE_LIB;
998
        }
999
      else
1000
        return 0;
1001
 
1002
      break;
1003
#endif
1004
 
1005
      /* a64 and a32 determine whether to use XCOFF64 or XCOFF32.  */
1006
    case 'a':
1007
      if (strcmp (arg, "64") == 0)
1008
        {
1009
#ifdef BFD64
1010
          ppc_obj64 = 1;
1011
#else
1012
          as_fatal (_("%s unsupported"), "-a64");
1013
#endif
1014
        }
1015
      else if (strcmp (arg, "32") == 0)
1016
        ppc_obj64 = 0;
1017
      else
1018
        return 0;
1019
      break;
1020
 
1021
    case 'm':
1022
      if (parse_cpu (arg))
1023
        ;
1024
 
1025
      else if (strcmp (arg, "regnames") == 0)
1026
        reg_names_p = TRUE;
1027
 
1028
      else if (strcmp (arg, "no-regnames") == 0)
1029
        reg_names_p = FALSE;
1030
 
1031
#ifdef OBJ_ELF
1032
      /* -mrelocatable/-mrelocatable-lib -- warn about initializations
1033
         that require relocation.  */
1034
      else if (strcmp (arg, "relocatable") == 0)
1035
        {
1036
          shlib = SHLIB_MRELOCATABLE;
1037
          ppc_flags |= EF_PPC_RELOCATABLE;
1038
        }
1039
 
1040
      else if (strcmp (arg, "relocatable-lib") == 0)
1041
        {
1042
          shlib = SHLIB_MRELOCATABLE;
1043
          ppc_flags |= EF_PPC_RELOCATABLE_LIB;
1044
        }
1045
 
1046
      /* -memb, set embedded bit.  */
1047
      else if (strcmp (arg, "emb") == 0)
1048
        ppc_flags |= EF_PPC_EMB;
1049
 
1050
      /* -mlittle/-mbig set the endianess.  */
1051
      else if (strcmp (arg, "little") == 0
1052
               || strcmp (arg, "little-endian") == 0)
1053
        {
1054
          target_big_endian = 0;
1055
          set_target_endian = 1;
1056
        }
1057
 
1058
      else if (strcmp (arg, "big") == 0 || strcmp (arg, "big-endian") == 0)
1059
        {
1060
          target_big_endian = 1;
1061
          set_target_endian = 1;
1062
        }
1063
 
1064
      else if (strcmp (arg, "solaris") == 0)
1065
        {
1066
          msolaris = TRUE;
1067
          ppc_comment_chars = ppc_solaris_comment_chars;
1068
        }
1069
 
1070
      else if (strcmp (arg, "no-solaris") == 0)
1071
        {
1072
          msolaris = FALSE;
1073
          ppc_comment_chars = ppc_eabi_comment_chars;
1074
        }
1075
#endif
1076
      else
1077
        {
1078
          as_bad (_("invalid switch -m%s"), arg);
1079
          return 0;
1080
        }
1081
      break;
1082
 
1083
#ifdef OBJ_ELF
1084
      /* -V: SVR4 argument to print version ID.  */
1085
    case 'V':
1086
      print_version_id ();
1087
      break;
1088
 
1089
      /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
1090
         should be emitted or not.  FIXME: Not implemented.  */
1091
    case 'Q':
1092
      break;
1093
 
1094
      /* Solaris takes -s to specify that .stabs go in a .stabs section,
1095
         rather than .stabs.excl, which is ignored by the linker.
1096
         FIXME: Not implemented.  */
1097
    case 's':
1098
      if (arg)
1099
        return 0;
1100
 
1101
      break;
1102
#endif
1103
 
1104
    default:
1105
      return 0;
1106
    }
1107
 
1108
  return 1;
1109
}
1110
 
1111
void
1112
md_show_usage (FILE *stream)
1113
{
1114
  fprintf (stream, _("\
1115
PowerPC options:\n\
1116
-a32                    generate ELF32/XCOFF32\n\
1117
-a64                    generate ELF64/XCOFF64\n\
1118
-u                      ignored\n\
1119
-mpwrx, -mpwr2          generate code for POWER/2 (RIOS2)\n\
1120
-mpwr                   generate code for POWER (RIOS1)\n\
1121
-m601                   generate code for PowerPC 601\n\
1122
-mppc, -mppc32, -m603, -m604\n\
1123
                        generate code for PowerPC 603/604\n\
1124
-m403, -m405            generate code for PowerPC 403/405\n\
1125
-m440                   generate code for PowerPC 440\n\
1126
-m7400, -m7410, -m7450, -m7455\n\
1127
                        generate code for PowerPC 7400/7410/7450/7455\n\
1128
-m750cl                 generate code for PowerPC 750cl\n"));
1129
  fprintf (stream, _("\
1130
-mppc64, -m620          generate code for PowerPC 620/625/630\n\
1131
-mppc64bridge           generate code for PowerPC 64, including bridge insns\n\
1132
-mbooke64               generate code for 64-bit PowerPC BookE\n\
1133
-mbooke, mbooke32       generate code for 32-bit PowerPC BookE\n\
1134
-mpower4                generate code for Power4 architecture\n\
1135
-mpower5                generate code for Power5 architecture\n\
1136
-mpower6                generate code for Power6 architecture\n\
1137
-mcell                  generate code for Cell Broadband Engine architecture\n\
1138
-mcom                   generate code Power/PowerPC common instructions\n\
1139
-many                   generate code for any architecture (PWR/PWRX/PPC)\n"));
1140
  fprintf (stream, _("\
1141
-maltivec               generate code for AltiVec\n\
1142
-me300                  generate code for PowerPC e300 family\n\
1143
-me500, -me500x2        generate code for Motorola e500 core complex\n\
1144
-me500mc,               generate code for Freescale e500mc core complex\n\
1145
-mspe                   generate code for Motorola SPE instructions\n\
1146
-mregnames              Allow symbolic names for registers\n\
1147
-mno-regnames           Do not allow symbolic names for registers\n"));
1148
#ifdef OBJ_ELF
1149
  fprintf (stream, _("\
1150
-mrelocatable           support for GCC's -mrelocatble option\n\
1151
-mrelocatable-lib       support for GCC's -mrelocatble-lib option\n\
1152
-memb                   set PPC_EMB bit in ELF flags\n\
1153
-mlittle, -mlittle-endian, -l, -le\n\
1154
                        generate code for a little endian machine\n\
1155
-mbig, -mbig-endian, -b, -be\n\
1156
                        generate code for a big endian machine\n\
1157
-msolaris               generate code for Solaris\n\
1158
-mno-solaris            do not generate code for Solaris\n\
1159
-V                      print assembler version number\n\
1160
-Qy, -Qn                ignored\n"));
1161
#endif
1162
}
1163
 
1164
/* Set ppc_cpu if it is not already set.  */
1165
 
1166
static void
1167
ppc_set_cpu (void)
1168
{
1169
  const char *default_os  = TARGET_OS;
1170
  const char *default_cpu = TARGET_CPU;
1171
 
1172
  if ((ppc_cpu & ~PPC_OPCODE_ANY) == 0)
1173
    {
1174
      if (ppc_obj64)
1175
        ppc_cpu |= PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_64;
1176
      else if (strncmp (default_os, "aix", 3) == 0
1177
               && default_os[3] >= '4' && default_os[3] <= '9')
1178
        ppc_cpu |= PPC_OPCODE_COMMON | PPC_OPCODE_32;
1179
      else if (strncmp (default_os, "aix3", 4) == 0)
1180
        ppc_cpu |= PPC_OPCODE_POWER | PPC_OPCODE_32;
1181
      else if (strcmp (default_cpu, "rs6000") == 0)
1182
        ppc_cpu |= PPC_OPCODE_POWER | PPC_OPCODE_32;
1183
      else if (strncmp (default_cpu, "powerpc", 7) == 0)
1184
        ppc_cpu |= PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_32;
1185
      else
1186
        as_fatal (_("Unknown default cpu = %s, os = %s"),
1187
                  default_cpu, default_os);
1188
    }
1189
}
1190
 
1191
/* Figure out the BFD architecture to use.  This function and ppc_mach
1192
   are called well before md_begin, when the output file is opened.  */
1193
 
1194
enum bfd_architecture
1195
ppc_arch (void)
1196
{
1197
  const char *default_cpu = TARGET_CPU;
1198
  ppc_set_cpu ();
1199
 
1200
  if ((ppc_cpu & PPC_OPCODE_PPC) != 0)
1201
    return bfd_arch_powerpc;
1202
  else if ((ppc_cpu & PPC_OPCODE_POWER) != 0)
1203
    return bfd_arch_rs6000;
1204
  else if ((ppc_cpu & (PPC_OPCODE_COMMON | PPC_OPCODE_ANY)) != 0)
1205
    {
1206
      if (strcmp (default_cpu, "rs6000") == 0)
1207
        return bfd_arch_rs6000;
1208
      else if (strncmp (default_cpu, "powerpc", 7) == 0)
1209
        return bfd_arch_powerpc;
1210
    }
1211
 
1212
  as_fatal (_("Neither Power nor PowerPC opcodes were selected."));
1213
  return bfd_arch_unknown;
1214
}
1215
 
1216
unsigned long
1217
ppc_mach (void)
1218
{
1219
  if (ppc_obj64)
1220
    return bfd_mach_ppc64;
1221
  else if (ppc_arch () == bfd_arch_rs6000)
1222
    return bfd_mach_rs6k;
1223
  else
1224
    return bfd_mach_ppc;
1225
}
1226
 
1227
extern char*
1228
ppc_target_format (void)
1229
{
1230
#ifdef OBJ_COFF
1231
#ifdef TE_PE
1232
  return target_big_endian ? "pe-powerpc" : "pe-powerpcle";
1233
#elif TE_POWERMAC
1234
  return "xcoff-powermac";
1235
#else
1236
#  ifdef TE_AIX5
1237
    return (ppc_obj64 ? "aix5coff64-rs6000" : "aixcoff-rs6000");
1238
#  else
1239
    return (ppc_obj64 ? "aixcoff64-rs6000" : "aixcoff-rs6000");
1240
#  endif
1241
#endif
1242
#endif
1243
#ifdef OBJ_ELF
1244
# ifdef TE_VXWORKS
1245
  return "elf32-powerpc-vxworks";
1246
# else
1247
  return (target_big_endian
1248
          ? (ppc_obj64 ? "elf64-powerpc" : "elf32-powerpc")
1249
          : (ppc_obj64 ? "elf64-powerpcle" : "elf32-powerpcle"));
1250
# endif
1251
#endif
1252
}
1253
 
1254
/* Insert opcodes and macros into hash tables.  Called at startup and
1255
   for .cpu pseudo.  */
1256
 
1257
static void
1258
ppc_setup_opcodes (void)
1259
{
1260
  const struct powerpc_opcode *op;
1261
  const struct powerpc_opcode *op_end;
1262
  const struct powerpc_macro *macro;
1263
  const struct powerpc_macro *macro_end;
1264
  bfd_boolean bad_insn = FALSE;
1265
 
1266
  if (ppc_hash != NULL)
1267
    hash_die (ppc_hash);
1268
  if (ppc_macro_hash != NULL)
1269
    hash_die (ppc_macro_hash);
1270
 
1271
  /* Insert the opcodes into a hash table.  */
1272
  ppc_hash = hash_new ();
1273
 
1274
  if (ENABLE_CHECKING)
1275
    {
1276
      unsigned int i;
1277
 
1278
      /* Check operand masks.  Code here and in the disassembler assumes
1279
         all the 1's in the mask are contiguous.  */
1280
      for (i = 0; i < num_powerpc_operands; ++i)
1281
        {
1282
          unsigned long mask = powerpc_operands[i].bitm;
1283
          unsigned long right_bit;
1284
          unsigned int j;
1285
 
1286
          right_bit = mask & -mask;
1287
          mask += right_bit;
1288
          right_bit = mask & -mask;
1289
          if (mask != right_bit)
1290
            {
1291
              as_bad (_("powerpc_operands[%d].bitm invalid"), i);
1292
              bad_insn = TRUE;
1293
            }
1294
          for (j = i + 1; j < num_powerpc_operands; ++j)
1295
            if (memcmp (&powerpc_operands[i], &powerpc_operands[j],
1296
                        sizeof (powerpc_operands[0])) == 0)
1297
              {
1298
                as_bad (_("powerpc_operands[%d] duplicates powerpc_operands[%d]"),
1299
                        j, i);
1300
                bad_insn = TRUE;
1301
              }
1302
        }
1303
    }
1304
 
1305
  op_end = powerpc_opcodes + powerpc_num_opcodes;
1306
  for (op = powerpc_opcodes; op < op_end; op++)
1307
    {
1308
      if (ENABLE_CHECKING)
1309
        {
1310
          const unsigned char *o;
1311
          unsigned long omask = op->mask;
1312
 
1313
          if (op != powerpc_opcodes)
1314
            {
1315
              /* The major opcodes had better be sorted.  Code in the
1316
                 disassembler assumes the insns are sorted according to
1317
                 major opcode.  */
1318
              if (PPC_OP (op[0].opcode) < PPC_OP (op[-1].opcode))
1319
                {
1320
                  as_bad (_("major opcode is not sorted for %s"),
1321
                          op->name);
1322
                  bad_insn = TRUE;
1323
                }
1324
 
1325
              /* Warn if the table isn't more strictly ordered.
1326
                 Unfortunately it doesn't seem possible to order the
1327
                 table on much more than the major opcode, which makes
1328
                 it difficult to implement a binary search in the
1329
                 disassembler.  The problem is that we have multiple
1330
                 ways to disassemble instructions, and we usually want
1331
                 to choose a more specific form (with more bits set in
1332
                 the opcode) than a more general form.  eg. all of the
1333
                 following are equivalent:
1334
                 bne label      # opcode = 0x40820000, mask = 0xff830003
1335
                 bf  2,label    # opcode = 0x40800000, mask = 0xff800003
1336
                 bc  4,2,label  # opcode = 0x40000000, mask = 0xfc000003
1337
 
1338
                 There are also cases where the table needs to be out
1339
                 of order to disassemble the correct instruction for
1340
                 processor variants.  eg. "lhae" booke64 insn must be
1341
                 found before "ld" ppc64 insn.  */
1342
              else if (0)
1343
                {
1344
                  unsigned long t1 = op[0].opcode;
1345
                  unsigned long t2 = op[-1].opcode;
1346
 
1347
                  if (((t1 ^ t2) & 0xfc0007ff) == 0
1348
                      && (t1 & 0xfc0006df) == 0x7c000286)
1349
                    {
1350
                      /* spr field is split.  */
1351
                      t1 = ((t1 & ~0x1ff800)
1352
                            | ((t1 & 0xf800) << 5) | ((t1 & 0x1f0000) >> 5));
1353
                      t2 = ((t2 & ~0x1ff800)
1354
                            | ((t2 & 0xf800) << 5) | ((t2 & 0x1f0000) >> 5));
1355
                    }
1356
                  if (t1 < t2)
1357
                    as_warn (_("%s (%08lx %08lx) after %s (%08lx %08lx)"),
1358
                             op[0].name, op[0].opcode, op[0].mask,
1359
                             op[-1].name, op[-1].opcode, op[-1].mask);
1360
                }
1361
            }
1362
 
1363
          /* The mask had better not trim off opcode bits.  */
1364
          if ((op->opcode & omask) != op->opcode)
1365
            {
1366
              as_bad (_("mask trims opcode bits for %s"),
1367
                      op->name);
1368
              bad_insn = TRUE;
1369
            }
1370
 
1371
          /* The operands must not overlap the opcode or each other.  */
1372
          for (o = op->operands; *o; ++o)
1373
            if (*o >= num_powerpc_operands)
1374
              {
1375
                as_bad (_("operand index error for %s"),
1376
                        op->name);
1377
                bad_insn = TRUE;
1378
              }
1379
            else
1380
              {
1381
                const struct powerpc_operand *operand = &powerpc_operands[*o];
1382
                if (operand->shift >= 0)
1383
                  {
1384
                    unsigned long mask = operand->bitm << operand->shift;
1385
                    if (omask & mask)
1386
                      {
1387
                        as_bad (_("operand %d overlap in %s"),
1388
                                (int) (o - op->operands), op->name);
1389
                        bad_insn = TRUE;
1390
                      }
1391
                    omask |= mask;
1392
                  }
1393
              }
1394
        }
1395
 
1396
      if ((op->flags & ppc_cpu & ~(PPC_OPCODE_32 | PPC_OPCODE_64)) != 0
1397
          && ((op->flags & (PPC_OPCODE_32 | PPC_OPCODE_64)) == 0
1398
              || ((op->flags & (PPC_OPCODE_32 | PPC_OPCODE_64))
1399
                  == (ppc_cpu & (PPC_OPCODE_32 | PPC_OPCODE_64)))
1400
              || (ppc_cpu & PPC_OPCODE_64_BRIDGE) != 0)
1401
          /* Certain instructions (eg: extsw) do not exist in the
1402
             32-bit BookE instruction set, but they do exist in the
1403
             64-bit BookE instruction set, and other PPC instruction
1404
             sets.  Check to see if the opcode has the BOOKE64 flag set.
1405
             If it does make sure that the target CPU is not the BookE32.  */
1406
          && ((op->flags & PPC_OPCODE_BOOKE64) == 0
1407
              || (ppc_cpu & PPC_OPCODE_BOOKE64) == PPC_OPCODE_BOOKE64
1408
              || (ppc_cpu & PPC_OPCODE_BOOKE) == 0)
1409
          && ((op->flags & (PPC_OPCODE_POWER4 | PPC_OPCODE_NOPOWER4)) == 0
1410
              || ((op->flags & PPC_OPCODE_POWER4)
1411
                  == (ppc_cpu & PPC_OPCODE_POWER4)))
1412
          && ((op->flags & PPC_OPCODE_POWER5) == 0
1413
              || ((op->flags & PPC_OPCODE_POWER5)
1414
                  == (ppc_cpu & PPC_OPCODE_POWER5)))
1415
          && ((op->flags & PPC_OPCODE_POWER6) == 0
1416
              || ((op->flags & PPC_OPCODE_POWER6)
1417
                  == (ppc_cpu & PPC_OPCODE_POWER6))))
1418
        {
1419
          const char *retval;
1420
 
1421
          retval = hash_insert (ppc_hash, op->name, (void *) op);
1422
          if (retval != NULL)
1423
            {
1424
              /* Ignore Power duplicates for -m601.  */
1425
              if ((ppc_cpu & PPC_OPCODE_601) != 0
1426
                  && (op->flags & PPC_OPCODE_POWER) != 0)
1427
                continue;
1428
 
1429
              as_bad (_("duplicate instruction %s"),
1430
                      op->name);
1431
              bad_insn = TRUE;
1432
            }
1433
        }
1434
    }
1435
 
1436
  if ((ppc_cpu & PPC_OPCODE_ANY) != 0)
1437
    for (op = powerpc_opcodes; op < op_end; op++)
1438
      hash_insert (ppc_hash, op->name, (void *) op);
1439
 
1440
  /* Insert the macros into a hash table.  */
1441
  ppc_macro_hash = hash_new ();
1442
 
1443
  macro_end = powerpc_macros + powerpc_num_macros;
1444
  for (macro = powerpc_macros; macro < macro_end; macro++)
1445
    {
1446
      if ((macro->flags & ppc_cpu) != 0)
1447
        {
1448
          const char *retval;
1449
 
1450
          retval = hash_insert (ppc_macro_hash, macro->name, (void *) macro);
1451
          if (retval != (const char *) NULL)
1452
            {
1453
              as_bad (_("duplicate macro %s"), macro->name);
1454
              bad_insn = TRUE;
1455
            }
1456
        }
1457
    }
1458
 
1459
  if (bad_insn)
1460
    abort ();
1461
}
1462
 
1463
/* This function is called when the assembler starts up.  It is called
1464
   after the options have been parsed and the output file has been
1465
   opened.  */
1466
 
1467
void
1468
md_begin (void)
1469
{
1470
  ppc_set_cpu ();
1471
 
1472
  ppc_cie_data_alignment = ppc_obj64 ? -8 : -4;
1473
 
1474
#ifdef OBJ_ELF
1475
  /* Set the ELF flags if desired.  */
1476
  if (ppc_flags && !msolaris)
1477
    bfd_set_private_flags (stdoutput, ppc_flags);
1478
#endif
1479
 
1480
  ppc_setup_opcodes ();
1481
 
1482
  /* Tell the main code what the endianness is if it is not overridden
1483
     by the user.  */
1484
  if (!set_target_endian)
1485
    {
1486
      set_target_endian = 1;
1487
      target_big_endian = PPC_BIG_ENDIAN;
1488
    }
1489
 
1490
#ifdef OBJ_XCOFF
1491
  ppc_coff_debug_section = coff_section_from_bfd_index (stdoutput, N_DEBUG);
1492
 
1493
  /* Create dummy symbols to serve as initial csects.  This forces the
1494
     text csects to precede the data csects.  These symbols will not
1495
     be output.  */
1496
  ppc_text_csects = symbol_make ("dummy\001");
1497
  symbol_get_tc (ppc_text_csects)->within = ppc_text_csects;
1498
  ppc_data_csects = symbol_make ("dummy\001");
1499
  symbol_get_tc (ppc_data_csects)->within = ppc_data_csects;
1500
#endif
1501
 
1502
#ifdef TE_PE
1503
 
1504
  ppc_current_section = text_section;
1505
  ppc_previous_section = 0;
1506
 
1507
#endif
1508
}
1509
 
1510
void
1511
ppc_cleanup (void)
1512
{
1513
#ifdef OBJ_ELF
1514
  if (ppc_apuinfo_list == NULL)
1515
    return;
1516
 
1517
  /* Ok, so write the section info out.  We have this layout:
1518
 
1519
  byte  data            what
1520
  ----  ----            ----
1521
 
1522
  4     (n*4)           number of APU's (4 bytes each)
1523
  8     2               note type 2
1524
  12    "APUinfo\0"     name
1525
  20    APU#1           first APU's info
1526
  24    APU#2           second APU's info
1527
  ...   ...
1528
  */
1529
  {
1530
    char *p;
1531
    asection *seg = now_seg;
1532
    subsegT subseg = now_subseg;
1533
    asection *apuinfo_secp = (asection *) NULL;
1534
    unsigned int i;
1535
 
1536
    /* Create the .PPC.EMB.apuinfo section.  */
1537
    apuinfo_secp = subseg_new (".PPC.EMB.apuinfo", 0);
1538
    bfd_set_section_flags (stdoutput,
1539
                           apuinfo_secp,
1540
                           SEC_HAS_CONTENTS | SEC_READONLY);
1541
 
1542
    p = frag_more (4);
1543
    md_number_to_chars (p, (valueT) 8, 4);
1544
 
1545
    p = frag_more (4);
1546
    md_number_to_chars (p, (valueT) ppc_apuinfo_num * 4, 4);
1547
 
1548
    p = frag_more (4);
1549
    md_number_to_chars (p, (valueT) 2, 4);
1550
 
1551
    p = frag_more (8);
1552
    strcpy (p, "APUinfo");
1553
 
1554
    for (i = 0; i < ppc_apuinfo_num; i++)
1555
      {
1556
        p = frag_more (4);
1557
        md_number_to_chars (p, (valueT) ppc_apuinfo_list[i], 4);
1558
      }
1559
 
1560
    frag_align (2, 0, 0);
1561
 
1562
    /* We probably can't restore the current segment, for there likely
1563
       isn't one yet...  */
1564
    if (seg && subseg)
1565
      subseg_set (seg, subseg);
1566
  }
1567
#endif
1568
}
1569
 
1570
/* Insert an operand value into an instruction.  */
1571
 
1572
static unsigned long
1573
ppc_insert_operand (unsigned long insn,
1574
                    const struct powerpc_operand *operand,
1575
                    offsetT val,
1576
                    unsigned long ppc_cpu,
1577
                    char *file,
1578
                    unsigned int line)
1579
{
1580
  long min, max, right;
1581
 
1582
  max = operand->bitm;
1583
  right = max & -max;
1584
  min = 0;
1585
 
1586
  if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
1587
    {
1588
      if ((operand->flags & PPC_OPERAND_SIGNOPT) == 0)
1589
        max = (max >> 1) & -right;
1590
      min = ~max & -right;
1591
    }
1592
 
1593
  if ((operand->flags & PPC_OPERAND_PLUS1) != 0)
1594
    max++;
1595
 
1596
  if ((operand->flags & PPC_OPERAND_NEGATIVE) != 0)
1597
    {
1598
      long tmp = min;
1599
      min = -max;
1600
      max = -tmp;
1601
    }
1602
 
1603
  if (min <= max)
1604
    {
1605
      /* Some people write constants with the sign extension done by
1606
         hand but only up to 32 bits.  This shouldn't really be valid,
1607
         but, to permit this code to assemble on a 64-bit host, we
1608
         sign extend the 32-bit value to 64 bits if so doing makes the
1609
         value valid.  */
1610
      if (val > max
1611
          && (offsetT) (val - 0x80000000 - 0x80000000) >= min
1612
          && (offsetT) (val - 0x80000000 - 0x80000000) <= max
1613
          && ((val - 0x80000000 - 0x80000000) & (right - 1)) == 0)
1614
        val = val - 0x80000000 - 0x80000000;
1615
 
1616
      /* Similarly, people write expressions like ~(1<<15), and expect
1617
         this to be OK for a 32-bit unsigned value.  */
1618
      else if (val < min
1619
               && (offsetT) (val + 0x80000000 + 0x80000000) >= min
1620
               && (offsetT) (val + 0x80000000 + 0x80000000) <= max
1621
               && ((val + 0x80000000 + 0x80000000) & (right - 1)) == 0)
1622
        val = val + 0x80000000 + 0x80000000;
1623
 
1624
      else if (val < min
1625
               || val > max
1626
               || (val & (right - 1)) != 0)
1627
        as_bad_value_out_of_range (_("operand"), val, min, max, file, line);
1628
    }
1629
 
1630
  if (operand->insert)
1631
    {
1632
      const char *errmsg;
1633
 
1634
      errmsg = NULL;
1635
      insn = (*operand->insert) (insn, (long) val, ppc_cpu, &errmsg);
1636
      if (errmsg != (const char *) NULL)
1637
        as_bad_where (file, line, errmsg);
1638
    }
1639
  else
1640
    insn |= ((long) val & operand->bitm) << operand->shift;
1641
 
1642
  return insn;
1643
}
1644
 
1645
 
1646
#ifdef OBJ_ELF
1647
/* Parse @got, etc. and return the desired relocation.  */
1648
static bfd_reloc_code_real_type
1649
ppc_elf_suffix (char **str_p, expressionS *exp_p)
1650
{
1651
  struct map_bfd {
1652
    char *string;
1653
    unsigned int length : 8;
1654
    unsigned int valid32 : 1;
1655
    unsigned int valid64 : 1;
1656
    unsigned int reloc;
1657
  };
1658
 
1659
  char ident[20];
1660
  char *str = *str_p;
1661
  char *str2;
1662
  int ch;
1663
  int len;
1664
  const struct map_bfd *ptr;
1665
 
1666
#define MAP(str, reloc)   { str, sizeof (str) - 1, 1, 1, reloc }
1667
#define MAP32(str, reloc) { str, sizeof (str) - 1, 1, 0, reloc }
1668
#define MAP64(str, reloc) { str, sizeof (str) - 1, 0, 1, reloc }
1669
 
1670
  static const struct map_bfd mapping[] = {
1671
    MAP ("l",                   BFD_RELOC_LO16),
1672
    MAP ("h",                   BFD_RELOC_HI16),
1673
    MAP ("ha",                  BFD_RELOC_HI16_S),
1674
    MAP ("brtaken",             BFD_RELOC_PPC_B16_BRTAKEN),
1675
    MAP ("brntaken",            BFD_RELOC_PPC_B16_BRNTAKEN),
1676
    MAP ("got",                 BFD_RELOC_16_GOTOFF),
1677
    MAP ("got@l",               BFD_RELOC_LO16_GOTOFF),
1678
    MAP ("got@h",               BFD_RELOC_HI16_GOTOFF),
1679
    MAP ("got@ha",              BFD_RELOC_HI16_S_GOTOFF),
1680
    MAP ("plt@l",               BFD_RELOC_LO16_PLTOFF),
1681
    MAP ("plt@h",               BFD_RELOC_HI16_PLTOFF),
1682
    MAP ("plt@ha",              BFD_RELOC_HI16_S_PLTOFF),
1683
    MAP ("copy",                BFD_RELOC_PPC_COPY),
1684
    MAP ("globdat",             BFD_RELOC_PPC_GLOB_DAT),
1685
    MAP ("sectoff",             BFD_RELOC_16_BASEREL),
1686
    MAP ("sectoff@l",           BFD_RELOC_LO16_BASEREL),
1687
    MAP ("sectoff@h",           BFD_RELOC_HI16_BASEREL),
1688
    MAP ("sectoff@ha",          BFD_RELOC_HI16_S_BASEREL),
1689
    MAP ("tls",                 BFD_RELOC_PPC_TLS),
1690
    MAP ("dtpmod",              BFD_RELOC_PPC_DTPMOD),
1691
    MAP ("dtprel",              BFD_RELOC_PPC_DTPREL),
1692
    MAP ("dtprel@l",            BFD_RELOC_PPC_DTPREL16_LO),
1693
    MAP ("dtprel@h",            BFD_RELOC_PPC_DTPREL16_HI),
1694
    MAP ("dtprel@ha",           BFD_RELOC_PPC_DTPREL16_HA),
1695
    MAP ("tprel",               BFD_RELOC_PPC_TPREL),
1696
    MAP ("tprel@l",             BFD_RELOC_PPC_TPREL16_LO),
1697
    MAP ("tprel@h",             BFD_RELOC_PPC_TPREL16_HI),
1698
    MAP ("tprel@ha",            BFD_RELOC_PPC_TPREL16_HA),
1699
    MAP ("got@tlsgd",           BFD_RELOC_PPC_GOT_TLSGD16),
1700
    MAP ("got@tlsgd@l",         BFD_RELOC_PPC_GOT_TLSGD16_LO),
1701
    MAP ("got@tlsgd@h",         BFD_RELOC_PPC_GOT_TLSGD16_HI),
1702
    MAP ("got@tlsgd@ha",        BFD_RELOC_PPC_GOT_TLSGD16_HA),
1703
    MAP ("got@tlsld",           BFD_RELOC_PPC_GOT_TLSLD16),
1704
    MAP ("got@tlsld@l",         BFD_RELOC_PPC_GOT_TLSLD16_LO),
1705
    MAP ("got@tlsld@h",         BFD_RELOC_PPC_GOT_TLSLD16_HI),
1706
    MAP ("got@tlsld@ha",        BFD_RELOC_PPC_GOT_TLSLD16_HA),
1707
    MAP ("got@dtprel",          BFD_RELOC_PPC_GOT_DTPREL16),
1708
    MAP ("got@dtprel@l",        BFD_RELOC_PPC_GOT_DTPREL16_LO),
1709
    MAP ("got@dtprel@h",        BFD_RELOC_PPC_GOT_DTPREL16_HI),
1710
    MAP ("got@dtprel@ha",       BFD_RELOC_PPC_GOT_DTPREL16_HA),
1711
    MAP ("got@tprel",           BFD_RELOC_PPC_GOT_TPREL16),
1712
    MAP ("got@tprel@l",         BFD_RELOC_PPC_GOT_TPREL16_LO),
1713
    MAP ("got@tprel@h",         BFD_RELOC_PPC_GOT_TPREL16_HI),
1714
    MAP ("got@tprel@ha",        BFD_RELOC_PPC_GOT_TPREL16_HA),
1715
    MAP32 ("fixup",             BFD_RELOC_CTOR),
1716
    MAP32 ("plt",               BFD_RELOC_24_PLT_PCREL),
1717
    MAP32 ("pltrel24",          BFD_RELOC_24_PLT_PCREL),
1718
    MAP32 ("local24pc",         BFD_RELOC_PPC_LOCAL24PC),
1719
    MAP32 ("local",             BFD_RELOC_PPC_LOCAL24PC),
1720
    MAP32 ("pltrel",            BFD_RELOC_32_PLT_PCREL),
1721
    MAP32 ("sdarel",            BFD_RELOC_GPREL16),
1722
    MAP32 ("naddr",             BFD_RELOC_PPC_EMB_NADDR32),
1723
    MAP32 ("naddr16",           BFD_RELOC_PPC_EMB_NADDR16),
1724
    MAP32 ("naddr@l",           BFD_RELOC_PPC_EMB_NADDR16_LO),
1725
    MAP32 ("naddr@h",           BFD_RELOC_PPC_EMB_NADDR16_HI),
1726
    MAP32 ("naddr@ha",          BFD_RELOC_PPC_EMB_NADDR16_HA),
1727
    MAP32 ("sdai16",            BFD_RELOC_PPC_EMB_SDAI16),
1728
    MAP32 ("sda2rel",           BFD_RELOC_PPC_EMB_SDA2REL),
1729
    MAP32 ("sda2i16",           BFD_RELOC_PPC_EMB_SDA2I16),
1730
    MAP32 ("sda21",             BFD_RELOC_PPC_EMB_SDA21),
1731
    MAP32 ("mrkref",            BFD_RELOC_PPC_EMB_MRKREF),
1732
    MAP32 ("relsect",           BFD_RELOC_PPC_EMB_RELSEC16),
1733
    MAP32 ("relsect@l",         BFD_RELOC_PPC_EMB_RELST_LO),
1734
    MAP32 ("relsect@h",         BFD_RELOC_PPC_EMB_RELST_HI),
1735
    MAP32 ("relsect@ha",        BFD_RELOC_PPC_EMB_RELST_HA),
1736
    MAP32 ("bitfld",            BFD_RELOC_PPC_EMB_BIT_FLD),
1737
    MAP32 ("relsda",            BFD_RELOC_PPC_EMB_RELSDA),
1738
    MAP32 ("xgot",              BFD_RELOC_PPC_TOC16),
1739
    MAP64 ("higher",            BFD_RELOC_PPC64_HIGHER),
1740
    MAP64 ("highera",           BFD_RELOC_PPC64_HIGHER_S),
1741
    MAP64 ("highest",           BFD_RELOC_PPC64_HIGHEST),
1742
    MAP64 ("highesta",          BFD_RELOC_PPC64_HIGHEST_S),
1743
    MAP64 ("tocbase",           BFD_RELOC_PPC64_TOC),
1744
    MAP64 ("toc",               BFD_RELOC_PPC_TOC16),
1745
    MAP64 ("toc@l",             BFD_RELOC_PPC64_TOC16_LO),
1746
    MAP64 ("toc@h",             BFD_RELOC_PPC64_TOC16_HI),
1747
    MAP64 ("toc@ha",            BFD_RELOC_PPC64_TOC16_HA),
1748
    MAP64 ("dtprel@higher",     BFD_RELOC_PPC64_DTPREL16_HIGHER),
1749
    MAP64 ("dtprel@highera",    BFD_RELOC_PPC64_DTPREL16_HIGHERA),
1750
    MAP64 ("dtprel@highest",    BFD_RELOC_PPC64_DTPREL16_HIGHEST),
1751
    MAP64 ("dtprel@highesta",   BFD_RELOC_PPC64_DTPREL16_HIGHESTA),
1752
    MAP64 ("tprel@higher",      BFD_RELOC_PPC64_TPREL16_HIGHER),
1753
    MAP64 ("tprel@highera",     BFD_RELOC_PPC64_TPREL16_HIGHERA),
1754
    MAP64 ("tprel@highest",     BFD_RELOC_PPC64_TPREL16_HIGHEST),
1755
    MAP64 ("tprel@highesta",    BFD_RELOC_PPC64_TPREL16_HIGHESTA),
1756
    { (char *) 0, 0, 0, 0,  BFD_RELOC_UNUSED }
1757
  };
1758
 
1759
  if (*str++ != '@')
1760
    return BFD_RELOC_UNUSED;
1761
 
1762
  for (ch = *str, str2 = ident;
1763
       (str2 < ident + sizeof (ident) - 1
1764
        && (ISALNUM (ch) || ch == '@'));
1765
       ch = *++str)
1766
    {
1767
      *str2++ = TOLOWER (ch);
1768
    }
1769
 
1770
  *str2 = '\0';
1771
  len = str2 - ident;
1772
 
1773
  ch = ident[0];
1774
  for (ptr = &mapping[0]; ptr->length > 0; ptr++)
1775
    if (ch == ptr->string[0]
1776
        && len == ptr->length
1777
        && memcmp (ident, ptr->string, ptr->length) == 0
1778
        && (ppc_obj64 ? ptr->valid64 : ptr->valid32))
1779
      {
1780
        int reloc = ptr->reloc;
1781
 
1782
        if (!ppc_obj64)
1783
          if (exp_p->X_add_number != 0
1784
              && (reloc == (int) BFD_RELOC_16_GOTOFF
1785
                  || reloc == (int) BFD_RELOC_LO16_GOTOFF
1786
                  || reloc == (int) BFD_RELOC_HI16_GOTOFF
1787
                  || reloc == (int) BFD_RELOC_HI16_S_GOTOFF))
1788
            as_warn (_("identifier+constant@got means identifier@got+constant"));
1789
 
1790
        /* Now check for identifier@suffix+constant.  */
1791
        if (*str == '-' || *str == '+')
1792
          {
1793
            char *orig_line = input_line_pointer;
1794
            expressionS new_exp;
1795
 
1796
            input_line_pointer = str;
1797
            expression (&new_exp);
1798
            if (new_exp.X_op == O_constant)
1799
              {
1800
                exp_p->X_add_number += new_exp.X_add_number;
1801
                str = input_line_pointer;
1802
              }
1803
 
1804
            if (&input_line_pointer != str_p)
1805
              input_line_pointer = orig_line;
1806
          }
1807
        *str_p = str;
1808
 
1809
        if (reloc == (int) BFD_RELOC_PPC64_TOC
1810
            && exp_p->X_op == O_symbol
1811
            && strcmp (S_GET_NAME (exp_p->X_add_symbol), ".TOC.") == 0)
1812
          {
1813
            /* Change the symbol so that the dummy .TOC. symbol can be
1814
               omitted from the object file.  */
1815
            exp_p->X_add_symbol = &abs_symbol;
1816
          }
1817
 
1818
        return (bfd_reloc_code_real_type) reloc;
1819
      }
1820
 
1821
  return BFD_RELOC_UNUSED;
1822
}
1823
 
1824
/* Like normal .long/.short/.word, except support @got, etc.
1825
   Clobbers input_line_pointer, checks end-of-line.  */
1826
static void
1827
ppc_elf_cons (int nbytes /* 1=.byte, 2=.word, 4=.long, 8=.llong */)
1828
{
1829
  expressionS exp;
1830
  bfd_reloc_code_real_type reloc;
1831
 
1832
  if (is_it_end_of_statement ())
1833
    {
1834
      demand_empty_rest_of_line ();
1835
      return;
1836
    }
1837
 
1838
  do
1839
    {
1840
      expression (&exp);
1841
      if (exp.X_op == O_symbol
1842
          && *input_line_pointer == '@'
1843
          && (reloc = ppc_elf_suffix (&input_line_pointer,
1844
                                      &exp)) != BFD_RELOC_UNUSED)
1845
        {
1846
          reloc_howto_type *reloc_howto;
1847
          int size;
1848
 
1849
          reloc_howto = bfd_reloc_type_lookup (stdoutput, reloc);
1850
          size = bfd_get_reloc_size (reloc_howto);
1851
 
1852
          if (size > nbytes)
1853
            {
1854
              as_bad (_("%s relocations do not fit in %d bytes\n"),
1855
                      reloc_howto->name, nbytes);
1856
            }
1857
          else
1858
            {
1859
              char *p;
1860
              int offset;
1861
 
1862
              p = frag_more (nbytes);
1863
              offset = 0;
1864
              if (target_big_endian)
1865
                offset = nbytes - size;
1866
              fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size,
1867
                           &exp, 0, reloc);
1868
            }
1869
        }
1870
      else
1871
        emit_expr (&exp, (unsigned int) nbytes);
1872
    }
1873
  while (*input_line_pointer++ == ',');
1874
 
1875
  /* Put terminator back into stream.  */
1876
  input_line_pointer--;
1877
  demand_empty_rest_of_line ();
1878
}
1879
 
1880
/* Solaris pseduo op to change to the .rodata section.  */
1881
static void
1882
ppc_elf_rdata (int xxx)
1883
{
1884
  char *save_line = input_line_pointer;
1885
  static char section[] = ".rodata\n";
1886
 
1887
  /* Just pretend this is .section .rodata  */
1888
  input_line_pointer = section;
1889
  obj_elf_section (xxx);
1890
 
1891
  input_line_pointer = save_line;
1892
}
1893
 
1894
/* Pseudo op to make file scope bss items.  */
1895
static void
1896
ppc_elf_lcomm (int xxx ATTRIBUTE_UNUSED)
1897
{
1898
  char *name;
1899
  char c;
1900
  char *p;
1901
  offsetT size;
1902
  symbolS *symbolP;
1903
  offsetT align;
1904
  segT old_sec;
1905
  int old_subsec;
1906
  char *pfrag;
1907
  int align2;
1908
 
1909
  name = input_line_pointer;
1910
  c = get_symbol_end ();
1911
 
1912
  /* just after name is now '\0'.  */
1913
  p = input_line_pointer;
1914
  *p = c;
1915
  SKIP_WHITESPACE ();
1916
  if (*input_line_pointer != ',')
1917
    {
1918
      as_bad (_("Expected comma after symbol-name: rest of line ignored."));
1919
      ignore_rest_of_line ();
1920
      return;
1921
    }
1922
 
1923
  input_line_pointer++;         /* skip ',' */
1924
  if ((size = get_absolute_expression ()) < 0)
1925
    {
1926
      as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) size);
1927
      ignore_rest_of_line ();
1928
      return;
1929
    }
1930
 
1931
  /* The third argument to .lcomm is the alignment.  */
1932
  if (*input_line_pointer != ',')
1933
    align = 8;
1934
  else
1935
    {
1936
      ++input_line_pointer;
1937
      align = get_absolute_expression ();
1938
      if (align <= 0)
1939
        {
1940
          as_warn (_("ignoring bad alignment"));
1941
          align = 8;
1942
        }
1943
    }
1944
 
1945
  *p = 0;
1946
  symbolP = symbol_find_or_make (name);
1947
  *p = c;
1948
 
1949
  if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
1950
    {
1951
      as_bad (_("Ignoring attempt to re-define symbol `%s'."),
1952
              S_GET_NAME (symbolP));
1953
      ignore_rest_of_line ();
1954
      return;
1955
    }
1956
 
1957
  if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
1958
    {
1959
      as_bad (_("Length of .lcomm \"%s\" is already %ld. Not changed to %ld."),
1960
              S_GET_NAME (symbolP),
1961
              (long) S_GET_VALUE (symbolP),
1962
              (long) size);
1963
 
1964
      ignore_rest_of_line ();
1965
      return;
1966
    }
1967
 
1968
  /* Allocate_bss.  */
1969
  old_sec = now_seg;
1970
  old_subsec = now_subseg;
1971
  if (align)
1972
    {
1973
      /* Convert to a power of 2 alignment.  */
1974
      for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2);
1975
      if (align != 1)
1976
        {
1977
          as_bad (_("Common alignment not a power of 2"));
1978
          ignore_rest_of_line ();
1979
          return;
1980
        }
1981
    }
1982
  else
1983
    align2 = 0;
1984
 
1985
  record_alignment (bss_section, align2);
1986
  subseg_set (bss_section, 0);
1987
  if (align2)
1988
    frag_align (align2, 0, 0);
1989
  if (S_GET_SEGMENT (symbolP) == bss_section)
1990
    symbol_get_frag (symbolP)->fr_symbol = 0;
1991
  symbol_set_frag (symbolP, frag_now);
1992
  pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
1993
                    (char *) 0);
1994
  *pfrag = 0;
1995
  S_SET_SIZE (symbolP, size);
1996
  S_SET_SEGMENT (symbolP, bss_section);
1997
  subseg_set (old_sec, old_subsec);
1998
  demand_empty_rest_of_line ();
1999
}
2000
 
2001
/* Validate any relocations emitted for -mrelocatable, possibly adding
2002
   fixups for word relocations in writable segments, so we can adjust
2003
   them at runtime.  */
2004
static void
2005
ppc_elf_validate_fix (fixS *fixp, segT seg)
2006
{
2007
  if (fixp->fx_done || fixp->fx_pcrel)
2008
    return;
2009
 
2010
  switch (shlib)
2011
    {
2012
    case SHLIB_NONE:
2013
    case SHLIB_PIC:
2014
      return;
2015
 
2016
    case SHLIB_MRELOCATABLE:
2017
      if (fixp->fx_r_type <= BFD_RELOC_UNUSED
2018
          && fixp->fx_r_type != BFD_RELOC_16_GOTOFF
2019
          && fixp->fx_r_type != BFD_RELOC_HI16_GOTOFF
2020
          && fixp->fx_r_type != BFD_RELOC_LO16_GOTOFF
2021
          && fixp->fx_r_type != BFD_RELOC_HI16_S_GOTOFF
2022
          && fixp->fx_r_type != BFD_RELOC_16_BASEREL
2023
          && fixp->fx_r_type != BFD_RELOC_LO16_BASEREL
2024
          && fixp->fx_r_type != BFD_RELOC_HI16_BASEREL
2025
          && fixp->fx_r_type != BFD_RELOC_HI16_S_BASEREL
2026
          && (seg->flags & SEC_LOAD) != 0
2027
          && strcmp (segment_name (seg), ".got2") != 0
2028
          && strcmp (segment_name (seg), ".dtors") != 0
2029
          && strcmp (segment_name (seg), ".ctors") != 0
2030
          && strcmp (segment_name (seg), ".fixup") != 0
2031
          && strcmp (segment_name (seg), ".gcc_except_table") != 0
2032
          && strcmp (segment_name (seg), ".eh_frame") != 0
2033
          && strcmp (segment_name (seg), ".ex_shared") != 0)
2034
        {
2035
          if ((seg->flags & (SEC_READONLY | SEC_CODE)) != 0
2036
              || fixp->fx_r_type != BFD_RELOC_CTOR)
2037
            {
2038
              as_bad_where (fixp->fx_file, fixp->fx_line,
2039
                            _("Relocation cannot be done when using -mrelocatable"));
2040
            }
2041
        }
2042
      return;
2043
    }
2044
}
2045
 
2046
/* Prevent elf_frob_file_before_adjust removing a weak undefined
2047
   function descriptor sym if the corresponding code sym is used.  */
2048
 
2049
void
2050
ppc_frob_file_before_adjust (void)
2051
{
2052
  symbolS *symp;
2053
  asection *toc;
2054
 
2055
  if (!ppc_obj64)
2056
    return;
2057
 
2058
  for (symp = symbol_rootP; symp; symp = symbol_next (symp))
2059
    {
2060
      const char *name;
2061
      char *dotname;
2062
      symbolS *dotsym;
2063
      size_t len;
2064
 
2065
      name = S_GET_NAME (symp);
2066
      if (name[0] == '.')
2067
        continue;
2068
 
2069
      if (! S_IS_WEAK (symp)
2070
          || S_IS_DEFINED (symp))
2071
        continue;
2072
 
2073
      len = strlen (name) + 1;
2074
      dotname = xmalloc (len + 1);
2075
      dotname[0] = '.';
2076
      memcpy (dotname + 1, name, len);
2077
      dotsym = symbol_find_noref (dotname, 1);
2078
      free (dotname);
2079
      if (dotsym != NULL && (symbol_used_p (dotsym)
2080
                             || symbol_used_in_reloc_p (dotsym)))
2081
        symbol_mark_used (symp);
2082
 
2083
    }
2084
 
2085
  toc = bfd_get_section_by_name (stdoutput, ".toc");
2086
  if (toc != NULL
2087
      && bfd_section_size (stdoutput, toc) > 0x10000)
2088
    as_warn (_("TOC section size exceeds 64k"));
2089
 
2090
  /* Don't emit .TOC. symbol.  */
2091
  symp = symbol_find (".TOC.");
2092
  if (symp != NULL)
2093
    symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2094
}
2095
#endif /* OBJ_ELF */
2096
 
2097
#ifdef TE_PE
2098
 
2099
/*
2100
 * Summary of parse_toc_entry.
2101
 *
2102
 * in:  Input_line_pointer points to the '[' in one of:
2103
 *
2104
 *        [toc] [tocv] [toc32] [toc64]
2105
 *
2106
 *      Anything else is an error of one kind or another.
2107
 *
2108
 * out:
2109
 *   return value: success or failure
2110
 *   toc_kind:     kind of toc reference
2111
 *   input_line_pointer:
2112
 *     success: first char after the ']'
2113
 *     failure: unchanged
2114
 *
2115
 * settings:
2116
 *
2117
 *     [toc]   - rv == success, toc_kind = default_toc
2118
 *     [tocv]  - rv == success, toc_kind = data_in_toc
2119
 *     [toc32] - rv == success, toc_kind = must_be_32
2120
 *     [toc64] - rv == success, toc_kind = must_be_64
2121
 *
2122
 */
2123
 
2124
enum toc_size_qualifier
2125
{
2126
  default_toc, /* The toc cell constructed should be the system default size */
2127
  data_in_toc, /* This is a direct reference to a toc cell                   */
2128
  must_be_32,  /* The toc cell constructed must be 32 bits wide              */
2129
  must_be_64   /* The toc cell constructed must be 64 bits wide              */
2130
};
2131
 
2132
static int
2133
parse_toc_entry (enum toc_size_qualifier *toc_kind)
2134
{
2135
  char *start;
2136
  char *toc_spec;
2137
  char c;
2138
  enum toc_size_qualifier t;
2139
 
2140
  /* Save the input_line_pointer.  */
2141
  start = input_line_pointer;
2142
 
2143
  /* Skip over the '[' , and whitespace.  */
2144
  ++input_line_pointer;
2145
  SKIP_WHITESPACE ();
2146
 
2147
  /* Find the spelling of the operand.  */
2148
  toc_spec = input_line_pointer;
2149
  c = get_symbol_end ();
2150
 
2151
  if (strcmp (toc_spec, "toc") == 0)
2152
    {
2153
      t = default_toc;
2154
    }
2155
  else if (strcmp (toc_spec, "tocv") == 0)
2156
    {
2157
      t = data_in_toc;
2158
    }
2159
  else if (strcmp (toc_spec, "toc32") == 0)
2160
    {
2161
      t = must_be_32;
2162
    }
2163
  else if (strcmp (toc_spec, "toc64") == 0)
2164
    {
2165
      t = must_be_64;
2166
    }
2167
  else
2168
    {
2169
      as_bad (_("syntax error: invalid toc specifier `%s'"), toc_spec);
2170
      *input_line_pointer = c;
2171
      input_line_pointer = start;
2172
      return 0;
2173
    }
2174
 
2175
  /* Now find the ']'.  */
2176
  *input_line_pointer = c;
2177
 
2178
  SKIP_WHITESPACE ();        /* leading whitespace could be there.  */
2179
  c = *input_line_pointer++; /* input_line_pointer->past char in c.  */
2180
 
2181
  if (c != ']')
2182
    {
2183
      as_bad (_("syntax error: expected `]', found  `%c'"), c);
2184
      input_line_pointer = start;
2185
      return 0;
2186
    }
2187
 
2188
  *toc_kind = t;
2189
  return 1;
2190
}
2191
#endif
2192
 
2193
 
2194
#ifdef OBJ_ELF
2195
#define APUID(a,v)      ((((a) & 0xffff) << 16) | ((v) & 0xffff))
2196
static void
2197
ppc_apuinfo_section_add (unsigned int apu, unsigned int version)
2198
{
2199
  unsigned int i;
2200
 
2201
  /* Check we don't already exist.  */
2202
  for (i = 0; i < ppc_apuinfo_num; i++)
2203
    if (ppc_apuinfo_list[i] == APUID (apu, version))
2204
      return;
2205
 
2206
  if (ppc_apuinfo_num == ppc_apuinfo_num_alloc)
2207
    {
2208
      if (ppc_apuinfo_num_alloc == 0)
2209
        {
2210
          ppc_apuinfo_num_alloc = 4;
2211
          ppc_apuinfo_list = (unsigned long *)
2212
              xmalloc (sizeof (unsigned long) * ppc_apuinfo_num_alloc);
2213
        }
2214
      else
2215
        {
2216
          ppc_apuinfo_num_alloc += 4;
2217
          ppc_apuinfo_list = (unsigned long *) xrealloc (ppc_apuinfo_list,
2218
              sizeof (unsigned long) * ppc_apuinfo_num_alloc);
2219
        }
2220
    }
2221
  ppc_apuinfo_list[ppc_apuinfo_num++] = APUID (apu, version);
2222
}
2223
#undef APUID
2224
#endif
2225
 
2226
 
2227
/* We need to keep a list of fixups.  We can't simply generate them as
2228
   we go, because that would require us to first create the frag, and
2229
   that would screw up references to ``.''.  */
2230
 
2231
struct ppc_fixup
2232
{
2233
  expressionS exp;
2234
  int opindex;
2235
  bfd_reloc_code_real_type reloc;
2236
};
2237
 
2238
#define MAX_INSN_FIXUPS (5)
2239
 
2240
/* This routine is called for each instruction to be assembled.  */
2241
 
2242
void
2243
md_assemble (char *str)
2244
{
2245
  char *s;
2246
  const struct powerpc_opcode *opcode;
2247
  unsigned long insn;
2248
  const unsigned char *opindex_ptr;
2249
  int skip_optional;
2250
  int need_paren;
2251
  int next_opindex;
2252
  struct ppc_fixup fixups[MAX_INSN_FIXUPS];
2253
  int fc;
2254
  char *f;
2255
  int addr_mod;
2256
  int i;
2257
#ifdef OBJ_ELF
2258
  bfd_reloc_code_real_type reloc;
2259
#endif
2260
 
2261
  /* Get the opcode.  */
2262
  for (s = str; *s != '\0' && ! ISSPACE (*s); s++)
2263
    ;
2264
  if (*s != '\0')
2265
    *s++ = '\0';
2266
 
2267
  /* Look up the opcode in the hash table.  */
2268
  opcode = (const struct powerpc_opcode *) hash_find (ppc_hash, str);
2269
  if (opcode == (const struct powerpc_opcode *) NULL)
2270
    {
2271
      const struct powerpc_macro *macro;
2272
 
2273
      macro = (const struct powerpc_macro *) hash_find (ppc_macro_hash, str);
2274
      if (macro == (const struct powerpc_macro *) NULL)
2275
        as_bad (_("Unrecognized opcode: `%s'"), str);
2276
      else
2277
        ppc_macro (s, macro);
2278
 
2279
      return;
2280
    }
2281
 
2282
  insn = opcode->opcode;
2283
 
2284
  str = s;
2285
  while (ISSPACE (*str))
2286
    ++str;
2287
 
2288
  /* PowerPC operands are just expressions.  The only real issue is
2289
     that a few operand types are optional.  All cases which might use
2290
     an optional operand separate the operands only with commas (in some
2291
     cases parentheses are used, as in ``lwz 1,0(1)'' but such cases never
2292
     have optional operands).  Most instructions with optional operands
2293
     have only one.  Those that have more than one optional operand can
2294
     take either all their operands or none.  So, before we start seriously
2295
     parsing the operands, we check to see if we have optional operands,
2296
     and if we do, we count the number of commas to see which operands
2297
     have been omitted.  */
2298
  skip_optional = 0;
2299
  for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
2300
    {
2301
      const struct powerpc_operand *operand;
2302
 
2303
      operand = &powerpc_operands[*opindex_ptr];
2304
      if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0)
2305
        {
2306
          unsigned int opcount;
2307
          unsigned int num_operands_expected;
2308
          unsigned int i;
2309
 
2310
          /* There is an optional operand.  Count the number of
2311
             commas in the input line.  */
2312
          if (*str == '\0')
2313
            opcount = 0;
2314
          else
2315
            {
2316
              opcount = 1;
2317
              s = str;
2318
              while ((s = strchr (s, ',')) != (char *) NULL)
2319
                {
2320
                  ++opcount;
2321
                  ++s;
2322
                }
2323
            }
2324
 
2325
          /* Compute the number of expected operands.
2326
             Do not count fake operands.  */
2327
          for (num_operands_expected = 0, i = 0; opcode->operands[i]; i ++)
2328
            if ((powerpc_operands [opcode->operands[i]].flags & PPC_OPERAND_FAKE) == 0)
2329
              ++ num_operands_expected;
2330
 
2331
          /* If there are fewer operands in the line then are called
2332
             for by the instruction, we want to skip the optional
2333
             operands.  */
2334
          if (opcount < num_operands_expected)
2335
            skip_optional = 1;
2336
 
2337
          break;
2338
        }
2339
    }
2340
 
2341
  /* Gather the operands.  */
2342
  need_paren = 0;
2343
  next_opindex = 0;
2344
  fc = 0;
2345
  for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
2346
    {
2347
      const struct powerpc_operand *operand;
2348
      const char *errmsg;
2349
      char *hold;
2350
      expressionS ex;
2351
      char endc;
2352
 
2353
      if (next_opindex == 0)
2354
        operand = &powerpc_operands[*opindex_ptr];
2355
      else
2356
        {
2357
          operand = &powerpc_operands[next_opindex];
2358
          next_opindex = 0;
2359
        }
2360
      errmsg = NULL;
2361
 
2362
      /* If this is a fake operand, then we do not expect anything
2363
         from the input.  */
2364
      if ((operand->flags & PPC_OPERAND_FAKE) != 0)
2365
        {
2366
          insn = (*operand->insert) (insn, 0L, ppc_cpu, &errmsg);
2367
          if (errmsg != (const char *) NULL)
2368
            as_bad (errmsg);
2369
          continue;
2370
        }
2371
 
2372
      /* If this is an optional operand, and we are skipping it, just
2373
         insert a zero.  */
2374
      if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0
2375
          && skip_optional)
2376
        {
2377
          if (operand->insert)
2378
            {
2379
              insn = (*operand->insert) (insn, 0L, ppc_cpu, &errmsg);
2380
              if (errmsg != (const char *) NULL)
2381
                as_bad (errmsg);
2382
            }
2383
          if ((operand->flags & PPC_OPERAND_NEXT) != 0)
2384
            next_opindex = *opindex_ptr + 1;
2385
          continue;
2386
        }
2387
 
2388
      /* Gather the operand.  */
2389
      hold = input_line_pointer;
2390
      input_line_pointer = str;
2391
 
2392
#ifdef TE_PE
2393
      if (*input_line_pointer == '[')
2394
        {
2395
          /* We are expecting something like the second argument here:
2396
           *
2397
           *    lwz r4,[toc].GS.0.static_int(rtoc)
2398
           *           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
2399
           * The argument following the `]' must be a symbol name, and the
2400
           * register must be the toc register: 'rtoc' or '2'
2401
           *
2402
           * The effect is to 0 as the displacement field
2403
           * in the instruction, and issue an IMAGE_REL_PPC_TOCREL16 (or
2404
           * the appropriate variation) reloc against it based on the symbol.
2405
           * The linker will build the toc, and insert the resolved toc offset.
2406
           *
2407
           * Note:
2408
           * o The size of the toc entry is currently assumed to be
2409
           *   32 bits. This should not be assumed to be a hard coded
2410
           *   number.
2411
           * o In an effort to cope with a change from 32 to 64 bits,
2412
           *   there are also toc entries that are specified to be
2413
           *   either 32 or 64 bits:
2414
           *     lwz r4,[toc32].GS.0.static_int(rtoc)
2415
           *     lwz r4,[toc64].GS.0.static_int(rtoc)
2416
           *   These demand toc entries of the specified size, and the
2417
           *   instruction probably requires it.
2418
           */
2419
 
2420
          int valid_toc;
2421
          enum toc_size_qualifier toc_kind;
2422
          bfd_reloc_code_real_type toc_reloc;
2423
 
2424
          /* Go parse off the [tocXX] part.  */
2425
          valid_toc = parse_toc_entry (&toc_kind);
2426
 
2427
          if (!valid_toc)
2428
            {
2429
              /* Note: message has already been issued.
2430
                 FIXME: what sort of recovery should we do?
2431
                 demand_rest_of_line (); return; ?  */
2432
            }
2433
 
2434
          /* Now get the symbol following the ']'.  */
2435
          expression (&ex);
2436
 
2437
          switch (toc_kind)
2438
            {
2439
            case default_toc:
2440
              /* In this case, we may not have seen the symbol yet,
2441
                 since  it is allowed to appear on a .extern or .globl
2442
                 or just be a label in the .data section.  */
2443
              toc_reloc = BFD_RELOC_PPC_TOC16;
2444
              break;
2445
            case data_in_toc:
2446
              /* 1. The symbol must be defined and either in the toc
2447
                 section, or a global.
2448
                 2. The reloc generated must have the TOCDEFN flag set
2449
                 in upper bit mess of the reloc type.
2450
                 FIXME: It's a little confusing what the tocv
2451
                 qualifier can be used for.  At the very least, I've
2452
                 seen three uses, only one of which I'm sure I can
2453
                 explain.  */
2454
              if (ex.X_op == O_symbol)
2455
                {
2456
                  assert (ex.X_add_symbol != NULL);
2457
                  if (symbol_get_bfdsym (ex.X_add_symbol)->section
2458
                      != tocdata_section)
2459
                    {
2460
                      as_bad (_("[tocv] symbol is not a toc symbol"));
2461
                    }
2462
                }
2463
 
2464
              toc_reloc = BFD_RELOC_PPC_TOC16;
2465
              break;
2466
            case must_be_32:
2467
              /* FIXME: these next two specifically specify 32/64 bit
2468
                 toc entries.  We don't support them today.  Is this
2469
                 the right way to say that?  */
2470
              toc_reloc = BFD_RELOC_UNUSED;
2471
              as_bad (_("Unimplemented toc32 expression modifier"));
2472
              break;
2473
            case must_be_64:
2474
              /* FIXME: see above.  */
2475
              toc_reloc = BFD_RELOC_UNUSED;
2476
              as_bad (_("Unimplemented toc64 expression modifier"));
2477
              break;
2478
            default:
2479
              fprintf (stderr,
2480
                       _("Unexpected return value [%d] from parse_toc_entry!\n"),
2481
                       toc_kind);
2482
              abort ();
2483
              break;
2484
            }
2485
 
2486
          /* We need to generate a fixup for this expression.  */
2487
          if (fc >= MAX_INSN_FIXUPS)
2488
            as_fatal (_("too many fixups"));
2489
 
2490
          fixups[fc].reloc = toc_reloc;
2491
          fixups[fc].exp = ex;
2492
          fixups[fc].opindex = *opindex_ptr;
2493
          ++fc;
2494
 
2495
          /* Ok. We've set up the fixup for the instruction. Now make it
2496
             look like the constant 0 was found here.  */
2497
          ex.X_unsigned = 1;
2498
          ex.X_op = O_constant;
2499
          ex.X_add_number = 0;
2500
          ex.X_add_symbol = NULL;
2501
          ex.X_op_symbol = NULL;
2502
        }
2503
 
2504
      else
2505
#endif          /* TE_PE */
2506
        {
2507
          if ((reg_names_p && (operand->flags & PPC_OPERAND_CR) != 0)
2508
              || !register_name (&ex))
2509
            {
2510
              char save_lex = lex_type['%'];
2511
 
2512
              if ((operand->flags & PPC_OPERAND_CR) != 0)
2513
                {
2514
                  cr_operand = TRUE;
2515
                  lex_type['%'] |= LEX_BEGIN_NAME;
2516
                }
2517
              expression (&ex);
2518
              cr_operand = FALSE;
2519
              lex_type['%'] = save_lex;
2520
            }
2521
        }
2522
 
2523
      str = input_line_pointer;
2524
      input_line_pointer = hold;
2525
 
2526
      if (ex.X_op == O_illegal)
2527
        as_bad (_("illegal operand"));
2528
      else if (ex.X_op == O_absent)
2529
        as_bad (_("missing operand"));
2530
      else if (ex.X_op == O_register)
2531
        {
2532
          insn = ppc_insert_operand (insn, operand, ex.X_add_number,
2533
                                     ppc_cpu, (char *) NULL, 0);
2534
        }
2535
      else if (ex.X_op == O_constant)
2536
        {
2537
#ifdef OBJ_ELF
2538
          /* Allow @HA, @L, @H on constants.  */
2539
          char *orig_str = str;
2540
 
2541
          if ((reloc = ppc_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED)
2542
            switch (reloc)
2543
              {
2544
              default:
2545
                str = orig_str;
2546
                break;
2547
 
2548
              case BFD_RELOC_LO16:
2549
                /* X_unsigned is the default, so if the user has done
2550
                   something which cleared it, we always produce a
2551
                   signed value.  */
2552
                if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED))
2553
                  ex.X_add_number &= 0xffff;
2554
                else
2555
                  ex.X_add_number = SEX16 (ex.X_add_number);
2556
                break;
2557
 
2558
              case BFD_RELOC_HI16:
2559
                if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED))
2560
                  ex.X_add_number = PPC_HI (ex.X_add_number);
2561
                else
2562
                  ex.X_add_number = SEX16 (PPC_HI (ex.X_add_number));
2563
                break;
2564
 
2565
              case BFD_RELOC_HI16_S:
2566
                if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED))
2567
                  ex.X_add_number = PPC_HA (ex.X_add_number);
2568
                else
2569
                  ex.X_add_number = SEX16 (PPC_HA (ex.X_add_number));
2570
                break;
2571
 
2572
              case BFD_RELOC_PPC64_HIGHER:
2573
                if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED))
2574
                  ex.X_add_number = PPC_HIGHER (ex.X_add_number);
2575
                else
2576
                  ex.X_add_number = SEX16 (PPC_HIGHER (ex.X_add_number));
2577
                break;
2578
 
2579
              case BFD_RELOC_PPC64_HIGHER_S:
2580
                if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED))
2581
                  ex.X_add_number = PPC_HIGHERA (ex.X_add_number);
2582
                else
2583
                  ex.X_add_number = SEX16 (PPC_HIGHERA (ex.X_add_number));
2584
                break;
2585
 
2586
              case BFD_RELOC_PPC64_HIGHEST:
2587
                if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED))
2588
                  ex.X_add_number = PPC_HIGHEST (ex.X_add_number);
2589
                else
2590
                  ex.X_add_number = SEX16 (PPC_HIGHEST (ex.X_add_number));
2591
                break;
2592
 
2593
              case BFD_RELOC_PPC64_HIGHEST_S:
2594
                if (ex.X_unsigned && ! (operand->flags & PPC_OPERAND_SIGNED))
2595
                  ex.X_add_number = PPC_HIGHESTA (ex.X_add_number);
2596
                else
2597
                  ex.X_add_number = SEX16 (PPC_HIGHESTA (ex.X_add_number));
2598
                break;
2599
              }
2600
#endif /* OBJ_ELF */
2601
          insn = ppc_insert_operand (insn, operand, ex.X_add_number,
2602
                                     ppc_cpu, (char *) NULL, 0);
2603
        }
2604
#ifdef OBJ_ELF
2605
      else if ((reloc = ppc_elf_suffix (&str, &ex)) != BFD_RELOC_UNUSED)
2606
        {
2607
          /* Some TLS tweaks.  */
2608
          switch (reloc)
2609
            {
2610
            default:
2611
              break;
2612
            case BFD_RELOC_PPC_TLS:
2613
              insn = ppc_insert_operand (insn, operand, ppc_obj64 ? 13 : 2,
2614
                                         ppc_cpu, (char *) NULL, 0);
2615
              break;
2616
          /* We'll only use the 32 (or 64) bit form of these relocations
2617
             in constants.  Instructions get the 16 bit form.  */
2618
            case BFD_RELOC_PPC_DTPREL:
2619
              reloc = BFD_RELOC_PPC_DTPREL16;
2620
              break;
2621
            case BFD_RELOC_PPC_TPREL:
2622
              reloc = BFD_RELOC_PPC_TPREL16;
2623
              break;
2624
            }
2625
 
2626
          /* For the absolute forms of branches, convert the PC
2627
             relative form back into the absolute.  */
2628
          if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0)
2629
            {
2630
              switch (reloc)
2631
                {
2632
                case BFD_RELOC_PPC_B26:
2633
                  reloc = BFD_RELOC_PPC_BA26;
2634
                  break;
2635
                case BFD_RELOC_PPC_B16:
2636
                  reloc = BFD_RELOC_PPC_BA16;
2637
                  break;
2638
                case BFD_RELOC_PPC_B16_BRTAKEN:
2639
                  reloc = BFD_RELOC_PPC_BA16_BRTAKEN;
2640
                  break;
2641
                case BFD_RELOC_PPC_B16_BRNTAKEN:
2642
                  reloc = BFD_RELOC_PPC_BA16_BRNTAKEN;
2643
                  break;
2644
                default:
2645
                  break;
2646
                }
2647
            }
2648
 
2649
          if (ppc_obj64
2650
              && (operand->flags & (PPC_OPERAND_DS | PPC_OPERAND_DQ)) != 0)
2651
            {
2652
              switch (reloc)
2653
                {
2654
                case BFD_RELOC_16:
2655
                  reloc = BFD_RELOC_PPC64_ADDR16_DS;
2656
                  break;
2657
                case BFD_RELOC_LO16:
2658
                  reloc = BFD_RELOC_PPC64_ADDR16_LO_DS;
2659
                  break;
2660
                case BFD_RELOC_16_GOTOFF:
2661
                  reloc = BFD_RELOC_PPC64_GOT16_DS;
2662
                  break;
2663
                case BFD_RELOC_LO16_GOTOFF:
2664
                  reloc = BFD_RELOC_PPC64_GOT16_LO_DS;
2665
                  break;
2666
                case BFD_RELOC_LO16_PLTOFF:
2667
                  reloc = BFD_RELOC_PPC64_PLT16_LO_DS;
2668
                  break;
2669
                case BFD_RELOC_16_BASEREL:
2670
                  reloc = BFD_RELOC_PPC64_SECTOFF_DS;
2671
                  break;
2672
                case BFD_RELOC_LO16_BASEREL:
2673
                  reloc = BFD_RELOC_PPC64_SECTOFF_LO_DS;
2674
                  break;
2675
                case BFD_RELOC_PPC_TOC16:
2676
                  reloc = BFD_RELOC_PPC64_TOC16_DS;
2677
                  break;
2678
                case BFD_RELOC_PPC64_TOC16_LO:
2679
                  reloc = BFD_RELOC_PPC64_TOC16_LO_DS;
2680
                  break;
2681
                case BFD_RELOC_PPC64_PLTGOT16:
2682
                  reloc = BFD_RELOC_PPC64_PLTGOT16_DS;
2683
                  break;
2684
                case BFD_RELOC_PPC64_PLTGOT16_LO:
2685
                  reloc = BFD_RELOC_PPC64_PLTGOT16_LO_DS;
2686
                  break;
2687
                case BFD_RELOC_PPC_DTPREL16:
2688
                  reloc = BFD_RELOC_PPC64_DTPREL16_DS;
2689
                  break;
2690
                case BFD_RELOC_PPC_DTPREL16_LO:
2691
                  reloc = BFD_RELOC_PPC64_DTPREL16_LO_DS;
2692
                  break;
2693
                case BFD_RELOC_PPC_TPREL16:
2694
                  reloc = BFD_RELOC_PPC64_TPREL16_DS;
2695
                  break;
2696
                case BFD_RELOC_PPC_TPREL16_LO:
2697
                  reloc = BFD_RELOC_PPC64_TPREL16_LO_DS;
2698
                  break;
2699
                case BFD_RELOC_PPC_GOT_DTPREL16:
2700
                case BFD_RELOC_PPC_GOT_DTPREL16_LO:
2701
                case BFD_RELOC_PPC_GOT_TPREL16:
2702
                case BFD_RELOC_PPC_GOT_TPREL16_LO:
2703
                  break;
2704
                default:
2705
                  as_bad (_("unsupported relocation for DS offset field"));
2706
                  break;
2707
                }
2708
            }
2709
 
2710
          /* We need to generate a fixup for this expression.  */
2711
          if (fc >= MAX_INSN_FIXUPS)
2712
            as_fatal (_("too many fixups"));
2713
          fixups[fc].exp = ex;
2714
          fixups[fc].opindex = 0;
2715
          fixups[fc].reloc = reloc;
2716
          ++fc;
2717
        }
2718
#endif /* OBJ_ELF */
2719
 
2720
      else
2721
        {
2722
          /* We need to generate a fixup for this expression.  */
2723
          if (fc >= MAX_INSN_FIXUPS)
2724
            as_fatal (_("too many fixups"));
2725
          fixups[fc].exp = ex;
2726
          fixups[fc].opindex = *opindex_ptr;
2727
          fixups[fc].reloc = BFD_RELOC_UNUSED;
2728
          ++fc;
2729
        }
2730
 
2731
      if (need_paren)
2732
        {
2733
          endc = ')';
2734
          need_paren = 0;
2735
          /* If expecting more operands, then we want to see "),".  */
2736
          if (*str == endc && opindex_ptr[1] != 0)
2737
            {
2738
              do
2739
                ++str;
2740
              while (ISSPACE (*str));
2741
              endc = ',';
2742
            }
2743
        }
2744
      else if ((operand->flags & PPC_OPERAND_PARENS) != 0)
2745
        {
2746
          endc = '(';
2747
          need_paren = 1;
2748
        }
2749
      else
2750
        endc = ',';
2751
 
2752
      /* The call to expression should have advanced str past any
2753
         whitespace.  */
2754
      if (*str != endc
2755
          && (endc != ',' || *str != '\0'))
2756
        {
2757
          as_bad (_("syntax error; found `%c' but expected `%c'"), *str, endc);
2758
          break;
2759
        }
2760
 
2761
      if (*str != '\0')
2762
        ++str;
2763
    }
2764
 
2765
  while (ISSPACE (*str))
2766
    ++str;
2767
 
2768
  if (*str != '\0')
2769
    as_bad (_("junk at end of line: `%s'"), str);
2770
 
2771
#ifdef OBJ_ELF
2772
  /* Do we need/want a APUinfo section? */
2773
  if (ppc_cpu & (PPC_OPCODE_SPE
2774
               | PPC_OPCODE_ISEL | PPC_OPCODE_EFS
2775
               | PPC_OPCODE_BRLOCK | PPC_OPCODE_PMR | PPC_OPCODE_CACHELCK
2776
               | PPC_OPCODE_RFMCI))
2777
    {
2778
      /* These are all version "1".  */
2779
      if (opcode->flags & PPC_OPCODE_SPE)
2780
        ppc_apuinfo_section_add (PPC_APUINFO_SPE, 1);
2781
      if (opcode->flags & PPC_OPCODE_ISEL)
2782
        ppc_apuinfo_section_add (PPC_APUINFO_ISEL, 1);
2783
      if (opcode->flags & PPC_OPCODE_EFS)
2784
        ppc_apuinfo_section_add (PPC_APUINFO_EFS, 1);
2785
      if (opcode->flags & PPC_OPCODE_BRLOCK)
2786
        ppc_apuinfo_section_add (PPC_APUINFO_BRLOCK, 1);
2787
      if (opcode->flags & PPC_OPCODE_PMR)
2788
        ppc_apuinfo_section_add (PPC_APUINFO_PMR, 1);
2789
      if (opcode->flags & PPC_OPCODE_CACHELCK)
2790
        ppc_apuinfo_section_add (PPC_APUINFO_CACHELCK, 1);
2791
      if (opcode->flags & PPC_OPCODE_RFMCI)
2792
        ppc_apuinfo_section_add (PPC_APUINFO_RFMCI, 1);
2793
    }
2794
#endif
2795
 
2796
  /* Write out the instruction.  */
2797
  f = frag_more (4);
2798
  addr_mod = frag_now_fix () & 3;
2799
  if (frag_now->has_code && frag_now->insn_addr != addr_mod)
2800
    as_bad (_("instruction address is not a multiple of 4"));
2801
  frag_now->insn_addr = addr_mod;
2802
  frag_now->has_code = 1;
2803
  md_number_to_chars (f, insn, 4);
2804
 
2805
#ifdef OBJ_ELF
2806
  dwarf2_emit_insn (4);
2807
#endif
2808
 
2809
  /* Create any fixups.  At this point we do not use a
2810
     bfd_reloc_code_real_type, but instead just use the
2811
     BFD_RELOC_UNUSED plus the operand index.  This lets us easily
2812
     handle fixups for any operand type, although that is admittedly
2813
     not a very exciting feature.  We pick a BFD reloc type in
2814
     md_apply_fix.  */
2815
  for (i = 0; i < fc; i++)
2816
    {
2817
      const struct powerpc_operand *operand;
2818
 
2819
      operand = &powerpc_operands[fixups[i].opindex];
2820
      if (fixups[i].reloc != BFD_RELOC_UNUSED)
2821
        {
2822
          reloc_howto_type *reloc_howto;
2823
          int size;
2824
          int offset;
2825
          fixS *fixP;
2826
 
2827
          reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc);
2828
          if (!reloc_howto)
2829
            abort ();
2830
 
2831
          size = bfd_get_reloc_size (reloc_howto);
2832
          offset = target_big_endian ? (4 - size) : 0;
2833
 
2834
          if (size < 1 || size > 4)
2835
            abort ();
2836
 
2837
          fixP = fix_new_exp (frag_now,
2838
                              f - frag_now->fr_literal + offset,
2839
                              size,
2840
                              &fixups[i].exp,
2841
                              reloc_howto->pc_relative,
2842
                              fixups[i].reloc);
2843
 
2844
          /* Turn off complaints that the addend is too large for things like
2845
             foo+100000@ha.  */
2846
          switch (fixups[i].reloc)
2847
            {
2848
            case BFD_RELOC_16_GOTOFF:
2849
            case BFD_RELOC_PPC_TOC16:
2850
            case BFD_RELOC_LO16:
2851
            case BFD_RELOC_HI16:
2852
            case BFD_RELOC_HI16_S:
2853
#ifdef OBJ_ELF
2854
            case BFD_RELOC_PPC64_HIGHER:
2855
            case BFD_RELOC_PPC64_HIGHER_S:
2856
            case BFD_RELOC_PPC64_HIGHEST:
2857
            case BFD_RELOC_PPC64_HIGHEST_S:
2858
#endif
2859
              fixP->fx_no_overflow = 1;
2860
              break;
2861
            default:
2862
              break;
2863
            }
2864
        }
2865
      else
2866
        fix_new_exp (frag_now,
2867
                     f - frag_now->fr_literal,
2868
                     4,
2869
                     &fixups[i].exp,
2870
                     (operand->flags & PPC_OPERAND_RELATIVE) != 0,
2871
                     ((bfd_reloc_code_real_type)
2872
                      (fixups[i].opindex + (int) BFD_RELOC_UNUSED)));
2873
    }
2874
}
2875
 
2876
/* Handle a macro.  Gather all the operands, transform them as
2877
   described by the macro, and call md_assemble recursively.  All the
2878
   operands are separated by commas; we don't accept parentheses
2879
   around operands here.  */
2880
 
2881
static void
2882
ppc_macro (char *str, const struct powerpc_macro *macro)
2883
{
2884
  char *operands[10];
2885
  unsigned int count;
2886
  char *s;
2887
  unsigned int len;
2888
  const char *format;
2889
  unsigned int arg;
2890
  char *send;
2891
  char *complete;
2892
 
2893
  /* Gather the users operands into the operands array.  */
2894
  count = 0;
2895
  s = str;
2896
  while (1)
2897
    {
2898
      if (count >= sizeof operands / sizeof operands[0])
2899
        break;
2900
      operands[count++] = s;
2901
      s = strchr (s, ',');
2902
      if (s == (char *) NULL)
2903
        break;
2904
      *s++ = '\0';
2905
    }
2906
 
2907
  if (count != macro->operands)
2908
    {
2909
      as_bad (_("wrong number of operands"));
2910
      return;
2911
    }
2912
 
2913
  /* Work out how large the string must be (the size is unbounded
2914
     because it includes user input).  */
2915
  len = 0;
2916
  format = macro->format;
2917
  while (*format != '\0')
2918
    {
2919
      if (*format != '%')
2920
        {
2921
          ++len;
2922
          ++format;
2923
        }
2924
      else
2925
        {
2926
          arg = strtol (format + 1, &send, 10);
2927
          know (send != format && arg < count);
2928
          len += strlen (operands[arg]);
2929
          format = send;
2930
        }
2931
    }
2932
 
2933
  /* Put the string together.  */
2934
  complete = s = (char *) alloca (len + 1);
2935
  format = macro->format;
2936
  while (*format != '\0')
2937
    {
2938
      if (*format != '%')
2939
        *s++ = *format++;
2940
      else
2941
        {
2942
          arg = strtol (format + 1, &send, 10);
2943
          strcpy (s, operands[arg]);
2944
          s += strlen (s);
2945
          format = send;
2946
        }
2947
    }
2948
  *s = '\0';
2949
 
2950
  /* Assemble the constructed instruction.  */
2951
  md_assemble (complete);
2952
}
2953
 
2954
#ifdef OBJ_ELF
2955
/* For ELF, add support for SHF_EXCLUDE and SHT_ORDERED.  */
2956
 
2957
int
2958
ppc_section_letter (int letter, char **ptr_msg)
2959
{
2960
  if (letter == 'e')
2961
    return SHF_EXCLUDE;
2962
 
2963
  *ptr_msg = _("Bad .section directive: want a,e,w,x,M,S,G,T in string");
2964
  return -1;
2965
}
2966
 
2967
int
2968
ppc_section_word (char *str, size_t len)
2969
{
2970
  if (len == 7 && strncmp (str, "exclude", 7) == 0)
2971
    return SHF_EXCLUDE;
2972
 
2973
  return -1;
2974
}
2975
 
2976
int
2977
ppc_section_type (char *str, size_t len)
2978
{
2979
  if (len == 7 && strncmp (str, "ordered", 7) == 0)
2980
    return SHT_ORDERED;
2981
 
2982
  return -1;
2983
}
2984
 
2985
int
2986
ppc_section_flags (int flags, int attr, int type)
2987
{
2988
  if (type == SHT_ORDERED)
2989
    flags |= SEC_ALLOC | SEC_LOAD | SEC_SORT_ENTRIES;
2990
 
2991
  if (attr & SHF_EXCLUDE)
2992
    flags |= SEC_EXCLUDE;
2993
 
2994
  return flags;
2995
}
2996
#endif /* OBJ_ELF */
2997
 
2998
 
2999
/* Pseudo-op handling.  */
3000
 
3001
/* The .byte pseudo-op.  This is similar to the normal .byte
3002
   pseudo-op, but it can also take a single ASCII string.  */
3003
 
3004
static void
3005
ppc_byte (int ignore ATTRIBUTE_UNUSED)
3006
{
3007
  if (*input_line_pointer != '\"')
3008
    {
3009
      cons (1);
3010
      return;
3011
    }
3012
 
3013
  /* Gather characters.  A real double quote is doubled.  Unusual
3014
     characters are not permitted.  */
3015
  ++input_line_pointer;
3016
  while (1)
3017
    {
3018
      char c;
3019
 
3020
      c = *input_line_pointer++;
3021
 
3022
      if (c == '\"')
3023
        {
3024
          if (*input_line_pointer != '\"')
3025
            break;
3026
          ++input_line_pointer;
3027
        }
3028
 
3029
      FRAG_APPEND_1_CHAR (c);
3030
    }
3031
 
3032
  demand_empty_rest_of_line ();
3033
}
3034
 
3035
#ifdef OBJ_XCOFF
3036
 
3037
/* XCOFF specific pseudo-op handling.  */
3038
 
3039
/* This is set if we are creating a .stabx symbol, since we don't want
3040
   to handle symbol suffixes for such symbols.  */
3041
static bfd_boolean ppc_stab_symbol;
3042
 
3043
/* The .comm and .lcomm pseudo-ops for XCOFF.  XCOFF puts common
3044
   symbols in the .bss segment as though they were local common
3045
   symbols, and uses a different smclas.  The native Aix 4.3.3 assembler
3046
   aligns .comm and .lcomm to 4 bytes.  */
3047
 
3048
static void
3049
ppc_comm (int lcomm)
3050
{
3051
  asection *current_seg = now_seg;
3052
  subsegT current_subseg = now_subseg;
3053
  char *name;
3054
  char endc;
3055
  char *end_name;
3056
  offsetT size;
3057
  offsetT align;
3058
  symbolS *lcomm_sym = NULL;
3059
  symbolS *sym;
3060
  char *pfrag;
3061
 
3062
  name = input_line_pointer;
3063
  endc = get_symbol_end ();
3064
  end_name = input_line_pointer;
3065
  *end_name = endc;
3066
 
3067
  if (*input_line_pointer != ',')
3068
    {
3069
      as_bad (_("missing size"));
3070
      ignore_rest_of_line ();
3071
      return;
3072
    }
3073
  ++input_line_pointer;
3074
 
3075
  size = get_absolute_expression ();
3076
  if (size < 0)
3077
    {
3078
      as_bad (_("negative size"));
3079
      ignore_rest_of_line ();
3080
      return;
3081
    }
3082
 
3083
  if (! lcomm)
3084
    {
3085
      /* The third argument to .comm is the alignment.  */
3086
      if (*input_line_pointer != ',')
3087
        align = 2;
3088
      else
3089
        {
3090
          ++input_line_pointer;
3091
          align = get_absolute_expression ();
3092
          if (align <= 0)
3093
            {
3094
              as_warn (_("ignoring bad alignment"));
3095
              align = 2;
3096
            }
3097
        }
3098
    }
3099
  else
3100
    {
3101
      char *lcomm_name;
3102
      char lcomm_endc;
3103
 
3104
      if (size <= 4)
3105
        align = 2;
3106
      else
3107
        align = 3;
3108
 
3109
      /* The third argument to .lcomm appears to be the real local
3110
         common symbol to create.  References to the symbol named in
3111
         the first argument are turned into references to the third
3112
         argument.  */
3113
      if (*input_line_pointer != ',')
3114
        {
3115
          as_bad (_("missing real symbol name"));
3116
          ignore_rest_of_line ();
3117
          return;
3118
        }
3119
      ++input_line_pointer;
3120
 
3121
      lcomm_name = input_line_pointer;
3122
      lcomm_endc = get_symbol_end ();
3123
 
3124
      lcomm_sym = symbol_find_or_make (lcomm_name);
3125
 
3126
      *input_line_pointer = lcomm_endc;
3127
    }
3128
 
3129
  *end_name = '\0';
3130
  sym = symbol_find_or_make (name);
3131
  *end_name = endc;
3132
 
3133
  if (S_IS_DEFINED (sym)
3134
      || S_GET_VALUE (sym) != 0)
3135
    {
3136
      as_bad (_("attempt to redefine symbol"));
3137
      ignore_rest_of_line ();
3138
      return;
3139
    }
3140
 
3141
  record_alignment (bss_section, align);
3142
 
3143
  if (! lcomm
3144
      || ! S_IS_DEFINED (lcomm_sym))
3145
    {
3146
      symbolS *def_sym;
3147
      offsetT def_size;
3148
 
3149
      if (! lcomm)
3150
        {
3151
          def_sym = sym;
3152
          def_size = size;
3153
          S_SET_EXTERNAL (sym);
3154
        }
3155
      else
3156
        {
3157
          symbol_get_tc (lcomm_sym)->output = 1;
3158
          def_sym = lcomm_sym;
3159
          def_size = 0;
3160
        }
3161
 
3162
      subseg_set (bss_section, 1);
3163
      frag_align (align, 0, 0);
3164
 
3165
      symbol_set_frag (def_sym, frag_now);
3166
      pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, def_sym,
3167
                        def_size, (char *) NULL);
3168
      *pfrag = 0;
3169
      S_SET_SEGMENT (def_sym, bss_section);
3170
      symbol_get_tc (def_sym)->align = align;
3171
    }
3172
  else if (lcomm)
3173
    {
3174
      /* Align the size of lcomm_sym.  */
3175
      symbol_get_frag (lcomm_sym)->fr_offset =
3176
        ((symbol_get_frag (lcomm_sym)->fr_offset + (1 << align) - 1)
3177
         &~ ((1 << align) - 1));
3178
      if (align > symbol_get_tc (lcomm_sym)->align)
3179
        symbol_get_tc (lcomm_sym)->align = align;
3180
    }
3181
 
3182
  if (lcomm)
3183
    {
3184
      /* Make sym an offset from lcomm_sym.  */
3185
      S_SET_SEGMENT (sym, bss_section);
3186
      symbol_set_frag (sym, symbol_get_frag (lcomm_sym));
3187
      S_SET_VALUE (sym, symbol_get_frag (lcomm_sym)->fr_offset);
3188
      symbol_get_frag (lcomm_sym)->fr_offset += size;
3189
    }
3190
 
3191
  subseg_set (current_seg, current_subseg);
3192
 
3193
  demand_empty_rest_of_line ();
3194
}
3195
 
3196
/* The .csect pseudo-op.  This switches us into a different
3197
   subsegment.  The first argument is a symbol whose value is the
3198
   start of the .csect.  In COFF, csect symbols get special aux
3199
   entries defined by the x_csect field of union internal_auxent.  The
3200
   optional second argument is the alignment (the default is 2).  */
3201
 
3202
static void
3203
ppc_csect (int ignore ATTRIBUTE_UNUSED)
3204
{
3205
  char *name;
3206
  char endc;
3207
  symbolS *sym;
3208
  offsetT align;
3209
 
3210
  name = input_line_pointer;
3211
  endc = get_symbol_end ();
3212
 
3213
  sym = symbol_find_or_make (name);
3214
 
3215
  *input_line_pointer = endc;
3216
 
3217
  if (S_GET_NAME (sym)[0] == '\0')
3218
    {
3219
      /* An unnamed csect is assumed to be [PR].  */
3220
      symbol_get_tc (sym)->class = XMC_PR;
3221
    }
3222
 
3223
  align = 2;
3224
  if (*input_line_pointer == ',')
3225
    {
3226
      ++input_line_pointer;
3227
      align = get_absolute_expression ();
3228
    }
3229
 
3230
  ppc_change_csect (sym, align);
3231
 
3232
  demand_empty_rest_of_line ();
3233
}
3234
 
3235
/* Change to a different csect.  */
3236
 
3237
static void
3238
ppc_change_csect (symbolS *sym, offsetT align)
3239
{
3240
  if (S_IS_DEFINED (sym))
3241
    subseg_set (S_GET_SEGMENT (sym), symbol_get_tc (sym)->subseg);
3242
  else
3243
    {
3244
      symbolS **list_ptr;
3245
      int after_toc;
3246
      int hold_chunksize;
3247
      symbolS *list;
3248
      int is_code;
3249
      segT sec;
3250
 
3251
      /* This is a new csect.  We need to look at the symbol class to
3252
         figure out whether it should go in the text section or the
3253
         data section.  */
3254
      after_toc = 0;
3255
      is_code = 0;
3256
      switch (symbol_get_tc (sym)->class)
3257
        {
3258
        case XMC_PR:
3259
        case XMC_RO:
3260
        case XMC_DB:
3261
        case XMC_GL:
3262
        case XMC_XO:
3263
        case XMC_SV:
3264
        case XMC_TI:
3265
        case XMC_TB:
3266
          S_SET_SEGMENT (sym, text_section);
3267
          symbol_get_tc (sym)->subseg = ppc_text_subsegment;
3268
          ++ppc_text_subsegment;
3269
          list_ptr = &ppc_text_csects;
3270
          is_code = 1;
3271
          break;
3272
        case XMC_RW:
3273
        case XMC_TC0:
3274
        case XMC_TC:
3275
        case XMC_DS:
3276
        case XMC_UA:
3277
        case XMC_BS:
3278
        case XMC_UC:
3279
          if (ppc_toc_csect != NULL
3280
              && (symbol_get_tc (ppc_toc_csect)->subseg + 1
3281
                  == ppc_data_subsegment))
3282
            after_toc = 1;
3283
          S_SET_SEGMENT (sym, data_section);
3284
          symbol_get_tc (sym)->subseg = ppc_data_subsegment;
3285
          ++ppc_data_subsegment;
3286
          list_ptr = &ppc_data_csects;
3287
          break;
3288
        default:
3289
          abort ();
3290
        }
3291
 
3292
      /* We set the obstack chunk size to a small value before
3293
         changing subsegments, so that we don't use a lot of memory
3294
         space for what may be a small section.  */
3295
      hold_chunksize = chunksize;
3296
      chunksize = 64;
3297
 
3298
      sec = subseg_new (segment_name (S_GET_SEGMENT (sym)),
3299
                        symbol_get_tc (sym)->subseg);
3300
 
3301
      chunksize = hold_chunksize;
3302
 
3303
      if (after_toc)
3304
        ppc_after_toc_frag = frag_now;
3305
 
3306
      record_alignment (sec, align);
3307
      if (is_code)
3308
        frag_align_code (align, 0);
3309
      else
3310
        frag_align (align, 0, 0);
3311
 
3312
      symbol_set_frag (sym, frag_now);
3313
      S_SET_VALUE (sym, (valueT) frag_now_fix ());
3314
 
3315
      symbol_get_tc (sym)->align = align;
3316
      symbol_get_tc (sym)->output = 1;
3317
      symbol_get_tc (sym)->within = sym;
3318
 
3319
      for (list = *list_ptr;
3320
           symbol_get_tc (list)->next != (symbolS *) NULL;
3321
           list = symbol_get_tc (list)->next)
3322
        ;
3323
      symbol_get_tc (list)->next = sym;
3324
 
3325
      symbol_remove (sym, &symbol_rootP, &symbol_lastP);
3326
      symbol_append (sym, symbol_get_tc (list)->within, &symbol_rootP,
3327
                     &symbol_lastP);
3328
    }
3329
 
3330
  ppc_current_csect = sym;
3331
}
3332
 
3333
/* This function handles the .text and .data pseudo-ops.  These
3334
   pseudo-ops aren't really used by XCOFF; we implement them for the
3335
   convenience of people who aren't used to XCOFF.  */
3336
 
3337
static void
3338
ppc_section (int type)
3339
{
3340
  const char *name;
3341
  symbolS *sym;
3342
 
3343
  if (type == 't')
3344
    name = ".text[PR]";
3345
  else if (type == 'd')
3346
    name = ".data[RW]";
3347
  else
3348
    abort ();
3349
 
3350
  sym = symbol_find_or_make (name);
3351
 
3352
  ppc_change_csect (sym, 2);
3353
 
3354
  demand_empty_rest_of_line ();
3355
}
3356
 
3357
/* This function handles the .section pseudo-op.  This is mostly to
3358
   give an error, since XCOFF only supports .text, .data and .bss, but
3359
   we do permit the user to name the text or data section.  */
3360
 
3361
static void
3362
ppc_named_section (int ignore ATTRIBUTE_UNUSED)
3363
{
3364
  char *user_name;
3365
  const char *real_name;
3366
  char c;
3367
  symbolS *sym;
3368
 
3369
  user_name = input_line_pointer;
3370
  c = get_symbol_end ();
3371
 
3372
  if (strcmp (user_name, ".text") == 0)
3373
    real_name = ".text[PR]";
3374
  else if (strcmp (user_name, ".data") == 0)
3375
    real_name = ".data[RW]";
3376
  else
3377
    {
3378
      as_bad (_("The XCOFF file format does not support arbitrary sections"));
3379
      *input_line_pointer = c;
3380
      ignore_rest_of_line ();
3381
      return;
3382
    }
3383
 
3384
  *input_line_pointer = c;
3385
 
3386
  sym = symbol_find_or_make (real_name);
3387
 
3388
  ppc_change_csect (sym, 2);
3389
 
3390
  demand_empty_rest_of_line ();
3391
}
3392
 
3393
/* The .extern pseudo-op.  We create an undefined symbol.  */
3394
 
3395
static void
3396
ppc_extern (int ignore ATTRIBUTE_UNUSED)
3397
{
3398
  char *name;
3399
  char endc;
3400
 
3401
  name = input_line_pointer;
3402
  endc = get_symbol_end ();
3403
 
3404
  (void) symbol_find_or_make (name);
3405
 
3406
  *input_line_pointer = endc;
3407
 
3408
  demand_empty_rest_of_line ();
3409
}
3410
 
3411
/* The .lglobl pseudo-op.  Keep the symbol in the symbol table.  */
3412
 
3413
static void
3414
ppc_lglobl (int ignore ATTRIBUTE_UNUSED)
3415
{
3416
  char *name;
3417
  char endc;
3418
  symbolS *sym;
3419
 
3420
  name = input_line_pointer;
3421
  endc = get_symbol_end ();
3422
 
3423
  sym = symbol_find_or_make (name);
3424
 
3425
  *input_line_pointer = endc;
3426
 
3427
  symbol_get_tc (sym)->output = 1;
3428
 
3429
  demand_empty_rest_of_line ();
3430
}
3431
 
3432
/* The .rename pseudo-op.  The RS/6000 assembler can rename symbols,
3433
   although I don't know why it bothers.  */
3434
 
3435
static void
3436
ppc_rename (int ignore ATTRIBUTE_UNUSED)
3437
{
3438
  char *name;
3439
  char endc;
3440
  symbolS *sym;
3441
  int len;
3442
 
3443
  name = input_line_pointer;
3444
  endc = get_symbol_end ();
3445
 
3446
  sym = symbol_find_or_make (name);
3447
 
3448
  *input_line_pointer = endc;
3449
 
3450
  if (*input_line_pointer != ',')
3451
    {
3452
      as_bad (_("missing rename string"));
3453
      ignore_rest_of_line ();
3454
      return;
3455
    }
3456
  ++input_line_pointer;
3457
 
3458
  symbol_get_tc (sym)->real_name = demand_copy_C_string (&len);
3459
 
3460
  demand_empty_rest_of_line ();
3461
}
3462
 
3463
/* The .stabx pseudo-op.  This is similar to a normal .stabs
3464
   pseudo-op, but slightly different.  A sample is
3465
       .stabx "main:F-1",.main,142,0
3466
   The first argument is the symbol name to create.  The second is the
3467
   value, and the third is the storage class.  The fourth seems to be
3468
   always zero, and I am assuming it is the type.  */
3469
 
3470
static void
3471
ppc_stabx (int ignore ATTRIBUTE_UNUSED)
3472
{
3473
  char *name;
3474
  int len;
3475
  symbolS *sym;
3476
  expressionS exp;
3477
 
3478
  name = demand_copy_C_string (&len);
3479
 
3480
  if (*input_line_pointer != ',')
3481
    {
3482
      as_bad (_("missing value"));
3483
      return;
3484
    }
3485
  ++input_line_pointer;
3486
 
3487
  ppc_stab_symbol = TRUE;
3488
  sym = symbol_make (name);
3489
  ppc_stab_symbol = FALSE;
3490
 
3491
  symbol_get_tc (sym)->real_name = name;
3492
 
3493
  (void) expression (&exp);
3494
 
3495
  switch (exp.X_op)
3496
    {
3497
    case O_illegal:
3498
    case O_absent:
3499
    case O_big:
3500
      as_bad (_("illegal .stabx expression; zero assumed"));
3501
      exp.X_add_number = 0;
3502
      /* Fall through.  */
3503
    case O_constant:
3504
      S_SET_VALUE (sym, (valueT) exp.X_add_number);
3505
      symbol_set_frag (sym, &zero_address_frag);
3506
      break;
3507
 
3508
    case O_symbol:
3509
      if (S_GET_SEGMENT (exp.X_add_symbol) == undefined_section)
3510
        symbol_set_value_expression (sym, &exp);
3511
      else
3512
        {
3513
          S_SET_VALUE (sym,
3514
                       exp.X_add_number + S_GET_VALUE (exp.X_add_symbol));
3515
          symbol_set_frag (sym, symbol_get_frag (exp.X_add_symbol));
3516
        }
3517
      break;
3518
 
3519
    default:
3520
      /* The value is some complex expression.  This will probably
3521
         fail at some later point, but this is probably the right
3522
         thing to do here.  */
3523
      symbol_set_value_expression (sym, &exp);
3524
      break;
3525
    }
3526
 
3527
  S_SET_SEGMENT (sym, ppc_coff_debug_section);
3528
  symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
3529
 
3530
  if (*input_line_pointer != ',')
3531
    {
3532
      as_bad (_("missing class"));
3533
      return;
3534
    }
3535
  ++input_line_pointer;
3536
 
3537
  S_SET_STORAGE_CLASS (sym, get_absolute_expression ());
3538
 
3539
  if (*input_line_pointer != ',')
3540
    {
3541
      as_bad (_("missing type"));
3542
      return;
3543
    }
3544
  ++input_line_pointer;
3545
 
3546
  S_SET_DATA_TYPE (sym, get_absolute_expression ());
3547
 
3548
  symbol_get_tc (sym)->output = 1;
3549
 
3550
  if (S_GET_STORAGE_CLASS (sym) == C_STSYM) {
3551
 
3552
    symbol_get_tc (sym)->within = ppc_current_block;
3553
 
3554
    /* In this case :
3555
 
3556
       .bs name
3557
       .stabx   "z",arrays_,133,0
3558
       .es
3559
 
3560
       .comm arrays_,13768,3
3561
 
3562
       resolve_symbol_value will copy the exp's "within" into sym's when the
3563
       offset is 0.  Since this seems to be corner case problem,
3564
       only do the correction for storage class C_STSYM.  A better solution
3565
       would be to have the tc field updated in ppc_symbol_new_hook.  */
3566
 
3567
    if (exp.X_op == O_symbol)
3568
      {
3569
        symbol_get_tc (exp.X_add_symbol)->within = ppc_current_block;
3570
      }
3571
  }
3572
 
3573
  if (exp.X_op != O_symbol
3574
      || ! S_IS_EXTERNAL (exp.X_add_symbol)
3575
      || S_GET_SEGMENT (exp.X_add_symbol) != bss_section)
3576
    ppc_frob_label (sym);
3577
  else
3578
    {
3579
      symbol_remove (sym, &symbol_rootP, &symbol_lastP);
3580
      symbol_append (sym, exp.X_add_symbol, &symbol_rootP, &symbol_lastP);
3581
      if (symbol_get_tc (ppc_current_csect)->within == exp.X_add_symbol)
3582
        symbol_get_tc (ppc_current_csect)->within = sym;
3583
    }
3584
 
3585
  demand_empty_rest_of_line ();
3586
}
3587
 
3588
/* The .function pseudo-op.  This takes several arguments.  The first
3589
   argument seems to be the external name of the symbol.  The second
3590
   argument seems to be the label for the start of the function.  gcc
3591
   uses the same name for both.  I have no idea what the third and
3592
   fourth arguments are meant to be.  The optional fifth argument is
3593
   an expression for the size of the function.  In COFF this symbol
3594
   gets an aux entry like that used for a csect.  */
3595
 
3596
static void
3597
ppc_function (int ignore ATTRIBUTE_UNUSED)
3598
{
3599
  char *name;
3600
  char endc;
3601
  char *s;
3602
  symbolS *ext_sym;
3603
  symbolS *lab_sym;
3604
 
3605
  name = input_line_pointer;
3606
  endc = get_symbol_end ();
3607
 
3608
  /* Ignore any [PR] suffix.  */
3609
  name = ppc_canonicalize_symbol_name (name);
3610
  s = strchr (name, '[');
3611
  if (s != (char *) NULL
3612
      && strcmp (s + 1, "PR]") == 0)
3613
    *s = '\0';
3614
 
3615
  ext_sym = symbol_find_or_make (name);
3616
 
3617
  *input_line_pointer = endc;
3618
 
3619
  if (*input_line_pointer != ',')
3620
    {
3621
      as_bad (_("missing symbol name"));
3622
      ignore_rest_of_line ();
3623
      return;
3624
    }
3625
  ++input_line_pointer;
3626
 
3627
  name = input_line_pointer;
3628
  endc = get_symbol_end ();
3629
 
3630
  lab_sym = symbol_find_or_make (name);
3631
 
3632
  *input_line_pointer = endc;
3633
 
3634
  if (ext_sym != lab_sym)
3635
    {
3636
      expressionS exp;
3637
 
3638
      exp.X_op = O_symbol;
3639
      exp.X_add_symbol = lab_sym;
3640
      exp.X_op_symbol = NULL;
3641
      exp.X_add_number = 0;
3642
      exp.X_unsigned = 0;
3643
      symbol_set_value_expression (ext_sym, &exp);
3644
    }
3645
 
3646
  if (symbol_get_tc (ext_sym)->class == -1)
3647
    symbol_get_tc (ext_sym)->class = XMC_PR;
3648
  symbol_get_tc (ext_sym)->output = 1;
3649
 
3650
  if (*input_line_pointer == ',')
3651
    {
3652
      expressionS ignore;
3653
 
3654
      /* Ignore the third argument.  */
3655
      ++input_line_pointer;
3656
      expression (&ignore);
3657
      if (*input_line_pointer == ',')
3658
        {
3659
          /* Ignore the fourth argument.  */
3660
          ++input_line_pointer;
3661
          expression (&ignore);
3662
          if (*input_line_pointer == ',')
3663
            {
3664
              /* The fifth argument is the function size.  */
3665
              ++input_line_pointer;
3666
              symbol_get_tc (ext_sym)->size = symbol_new ("L0\001",
3667
                                                          absolute_section,
3668
                                                          (valueT) 0,
3669
                                                          &zero_address_frag);
3670
              pseudo_set (symbol_get_tc (ext_sym)->size);
3671
            }
3672
        }
3673
    }
3674
 
3675
  S_SET_DATA_TYPE (ext_sym, DT_FCN << N_BTSHFT);
3676
  SF_SET_FUNCTION (ext_sym);
3677
  SF_SET_PROCESS (ext_sym);
3678
  coff_add_linesym (ext_sym);
3679
 
3680
  demand_empty_rest_of_line ();
3681
}
3682
 
3683
/* The .bf pseudo-op.  This is just like a COFF C_FCN symbol named
3684
   ".bf".  If the pseudo op .bi was seen before .bf, patch the .bi sym
3685
   with the correct line number */
3686
 
3687
static symbolS *saved_bi_sym = 0;
3688
 
3689
static void
3690
ppc_bf (int ignore ATTRIBUTE_UNUSED)
3691
{
3692
  symbolS *sym;
3693
 
3694
  sym = symbol_make (".bf");
3695
  S_SET_SEGMENT (sym, text_section);
3696
  symbol_set_frag (sym, frag_now);
3697
  S_SET_VALUE (sym, frag_now_fix ());
3698
  S_SET_STORAGE_CLASS (sym, C_FCN);
3699
 
3700
  coff_line_base = get_absolute_expression ();
3701
 
3702
  S_SET_NUMBER_AUXILIARY (sym, 1);
3703
  SA_SET_SYM_LNNO (sym, coff_line_base);
3704
 
3705
  /* Line number for bi.  */
3706
  if (saved_bi_sym)
3707
    {
3708
      S_SET_VALUE (saved_bi_sym, coff_n_line_nos);
3709
      saved_bi_sym = 0;
3710
    }
3711
 
3712
 
3713
  symbol_get_tc (sym)->output = 1;
3714
 
3715
  ppc_frob_label (sym);
3716
 
3717
  demand_empty_rest_of_line ();
3718
}
3719
 
3720
/* The .ef pseudo-op.  This is just like a COFF C_FCN symbol named
3721
   ".ef", except that the line number is absolute, not relative to the
3722
   most recent ".bf" symbol.  */
3723
 
3724
static void
3725
ppc_ef (int ignore ATTRIBUTE_UNUSED)
3726
{
3727
  symbolS *sym;
3728
 
3729
  sym = symbol_make (".ef");
3730
  S_SET_SEGMENT (sym, text_section);
3731
  symbol_set_frag (sym, frag_now);
3732
  S_SET_VALUE (sym, frag_now_fix ());
3733
  S_SET_STORAGE_CLASS (sym, C_FCN);
3734
  S_SET_NUMBER_AUXILIARY (sym, 1);
3735
  SA_SET_SYM_LNNO (sym, get_absolute_expression ());
3736
  symbol_get_tc (sym)->output = 1;
3737
 
3738
  ppc_frob_label (sym);
3739
 
3740
  demand_empty_rest_of_line ();
3741
}
3742
 
3743
/* The .bi and .ei pseudo-ops.  These take a string argument and
3744
   generates a C_BINCL or C_EINCL symbol, which goes at the start of
3745
   the symbol list.  The value of .bi will be know when the next .bf
3746
   is encountered.  */
3747
 
3748
static void
3749
ppc_biei (int ei)
3750
{
3751
  static symbolS *last_biei;
3752
 
3753
  char *name;
3754
  int len;
3755
  symbolS *sym;
3756
  symbolS *look;
3757
 
3758
  name = demand_copy_C_string (&len);
3759
 
3760
  /* The value of these symbols is actually file offset.  Here we set
3761
     the value to the index into the line number entries.  In
3762
     ppc_frob_symbols we set the fix_line field, which will cause BFD
3763
     to do the right thing.  */
3764
 
3765
  sym = symbol_make (name);
3766
  /* obj-coff.c currently only handles line numbers correctly in the
3767
     .text section.  */
3768
  S_SET_SEGMENT (sym, text_section);
3769
  S_SET_VALUE (sym, coff_n_line_nos);
3770
  symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
3771
 
3772
  S_SET_STORAGE_CLASS (sym, ei ? C_EINCL : C_BINCL);
3773
  symbol_get_tc (sym)->output = 1;
3774
 
3775
  /* Save bi.  */
3776
  if (ei)
3777
    saved_bi_sym = 0;
3778
  else
3779
    saved_bi_sym = sym;
3780
 
3781
  for (look = last_biei ? last_biei : symbol_rootP;
3782
       (look != (symbolS *) NULL
3783
        && (S_GET_STORAGE_CLASS (look) == C_FILE
3784
            || S_GET_STORAGE_CLASS (look) == C_BINCL
3785
            || S_GET_STORAGE_CLASS (look) == C_EINCL));
3786
       look = symbol_next (look))
3787
    ;
3788
  if (look != (symbolS *) NULL)
3789
    {
3790
      symbol_remove (sym, &symbol_rootP, &symbol_lastP);
3791
      symbol_insert (sym, look, &symbol_rootP, &symbol_lastP);
3792
      last_biei = sym;
3793
    }
3794
 
3795
  demand_empty_rest_of_line ();
3796
}
3797
 
3798
/* The .bs pseudo-op.  This generates a C_BSTAT symbol named ".bs".
3799
   There is one argument, which is a csect symbol.  The value of the
3800
   .bs symbol is the index of this csect symbol.  */
3801
 
3802
static void
3803
ppc_bs (int ignore ATTRIBUTE_UNUSED)
3804
{
3805
  char *name;
3806
  char endc;
3807
  symbolS *csect;
3808
  symbolS *sym;
3809
 
3810
  if (ppc_current_block != NULL)
3811
    as_bad (_("nested .bs blocks"));
3812
 
3813
  name = input_line_pointer;
3814
  endc = get_symbol_end ();
3815
 
3816
  csect = symbol_find_or_make (name);
3817
 
3818
  *input_line_pointer = endc;
3819
 
3820
  sym = symbol_make (".bs");
3821
  S_SET_SEGMENT (sym, now_seg);
3822
  S_SET_STORAGE_CLASS (sym, C_BSTAT);
3823
  symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
3824
  symbol_get_tc (sym)->output = 1;
3825
 
3826
  symbol_get_tc (sym)->within = csect;
3827
 
3828
  ppc_frob_label (sym);
3829
 
3830
  ppc_current_block = sym;
3831
 
3832
  demand_empty_rest_of_line ();
3833
}
3834
 
3835
/* The .es pseudo-op.  Generate a C_ESTART symbol named .es.  */
3836
 
3837
static void
3838
ppc_es (int ignore ATTRIBUTE_UNUSED)
3839
{
3840
  symbolS *sym;
3841
 
3842
  if (ppc_current_block == NULL)
3843
    as_bad (_(".es without preceding .bs"));
3844
 
3845
  sym = symbol_make (".es");
3846
  S_SET_SEGMENT (sym, now_seg);
3847
  S_SET_STORAGE_CLASS (sym, C_ESTAT);
3848
  symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
3849
  symbol_get_tc (sym)->output = 1;
3850
 
3851
  ppc_frob_label (sym);
3852
 
3853
  ppc_current_block = NULL;
3854
 
3855
  demand_empty_rest_of_line ();
3856
}
3857
 
3858
/* The .bb pseudo-op.  Generate a C_BLOCK symbol named .bb, with a
3859
   line number.  */
3860
 
3861
static void
3862
ppc_bb (int ignore ATTRIBUTE_UNUSED)
3863
{
3864
  symbolS *sym;
3865
 
3866
  sym = symbol_make (".bb");
3867
  S_SET_SEGMENT (sym, text_section);
3868
  symbol_set_frag (sym, frag_now);
3869
  S_SET_VALUE (sym, frag_now_fix ());
3870
  S_SET_STORAGE_CLASS (sym, C_BLOCK);
3871
 
3872
  S_SET_NUMBER_AUXILIARY (sym, 1);
3873
  SA_SET_SYM_LNNO (sym, get_absolute_expression ());
3874
 
3875
  symbol_get_tc (sym)->output = 1;
3876
 
3877
  SF_SET_PROCESS (sym);
3878
 
3879
  ppc_frob_label (sym);
3880
 
3881
  demand_empty_rest_of_line ();
3882
}
3883
 
3884
/* The .eb pseudo-op.  Generate a C_BLOCK symbol named .eb, with a
3885
   line number.  */
3886
 
3887
static void
3888
ppc_eb (int ignore ATTRIBUTE_UNUSED)
3889
{
3890
  symbolS *sym;
3891
 
3892
  sym = symbol_make (".eb");
3893
  S_SET_SEGMENT (sym, text_section);
3894
  symbol_set_frag (sym, frag_now);
3895
  S_SET_VALUE (sym, frag_now_fix ());
3896
  S_SET_STORAGE_CLASS (sym, C_BLOCK);
3897
  S_SET_NUMBER_AUXILIARY (sym, 1);
3898
  SA_SET_SYM_LNNO (sym, get_absolute_expression ());
3899
  symbol_get_tc (sym)->output = 1;
3900
 
3901
  SF_SET_PROCESS (sym);
3902
 
3903
  ppc_frob_label (sym);
3904
 
3905
  demand_empty_rest_of_line ();
3906
}
3907
 
3908
/* The .bc pseudo-op.  This just creates a C_BCOMM symbol with a
3909
   specified name.  */
3910
 
3911
static void
3912
ppc_bc (int ignore ATTRIBUTE_UNUSED)
3913
{
3914
  char *name;
3915
  int len;
3916
  symbolS *sym;
3917
 
3918
  name = demand_copy_C_string (&len);
3919
  sym = symbol_make (name);
3920
  S_SET_SEGMENT (sym, ppc_coff_debug_section);
3921
  symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
3922
  S_SET_STORAGE_CLASS (sym, C_BCOMM);
3923
  S_SET_VALUE (sym, 0);
3924
  symbol_get_tc (sym)->output = 1;
3925
 
3926
  ppc_frob_label (sym);
3927
 
3928
  demand_empty_rest_of_line ();
3929
}
3930
 
3931
/* The .ec pseudo-op.  This just creates a C_ECOMM symbol.  */
3932
 
3933
static void
3934
ppc_ec (int ignore ATTRIBUTE_UNUSED)
3935
{
3936
  symbolS *sym;
3937
 
3938
  sym = symbol_make (".ec");
3939
  S_SET_SEGMENT (sym, ppc_coff_debug_section);
3940
  symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
3941
  S_SET_STORAGE_CLASS (sym, C_ECOMM);
3942
  S_SET_VALUE (sym, 0);
3943
  symbol_get_tc (sym)->output = 1;
3944
 
3945
  ppc_frob_label (sym);
3946
 
3947
  demand_empty_rest_of_line ();
3948
}
3949
 
3950
/* The .toc pseudo-op.  Switch to the .toc subsegment.  */
3951
 
3952
static void
3953
ppc_toc (int ignore ATTRIBUTE_UNUSED)
3954
{
3955
  if (ppc_toc_csect != (symbolS *) NULL)
3956
    subseg_set (data_section, symbol_get_tc (ppc_toc_csect)->subseg);
3957
  else
3958
    {
3959
      subsegT subseg;
3960
      symbolS *sym;
3961
      symbolS *list;
3962
 
3963
      subseg = ppc_data_subsegment;
3964
      ++ppc_data_subsegment;
3965
 
3966
      subseg_new (segment_name (data_section), subseg);
3967
      ppc_toc_frag = frag_now;
3968
 
3969
      sym = symbol_find_or_make ("TOC[TC0]");
3970
      symbol_set_frag (sym, frag_now);
3971
      S_SET_SEGMENT (sym, data_section);
3972
      S_SET_VALUE (sym, (valueT) frag_now_fix ());
3973
      symbol_get_tc (sym)->subseg = subseg;
3974
      symbol_get_tc (sym)->output = 1;
3975
      symbol_get_tc (sym)->within = sym;
3976
 
3977
      ppc_toc_csect = sym;
3978
 
3979
      for (list = ppc_data_csects;
3980
           symbol_get_tc (list)->next != (symbolS *) NULL;
3981
           list = symbol_get_tc (list)->next)
3982
        ;
3983
      symbol_get_tc (list)->next = sym;
3984
 
3985
      symbol_remove (sym, &symbol_rootP, &symbol_lastP);
3986
      symbol_append (sym, symbol_get_tc (list)->within, &symbol_rootP,
3987
                     &symbol_lastP);
3988
    }
3989
 
3990
  ppc_current_csect = ppc_toc_csect;
3991
 
3992
  demand_empty_rest_of_line ();
3993
}
3994
 
3995
/* The AIX assembler automatically aligns the operands of a .long or
3996
   .short pseudo-op, and we want to be compatible.  */
3997
 
3998
static void
3999
ppc_xcoff_cons (int log_size)
4000
{
4001
  frag_align (log_size, 0, 0);
4002
  record_alignment (now_seg, log_size);
4003
  cons (1 << log_size);
4004
}
4005
 
4006
static void
4007
ppc_vbyte (int dummy ATTRIBUTE_UNUSED)
4008
{
4009
  expressionS exp;
4010
  int byte_count;
4011
 
4012
  (void) expression (&exp);
4013
 
4014
  if (exp.X_op != O_constant)
4015
    {
4016
      as_bad (_("non-constant byte count"));
4017
      return;
4018
    }
4019
 
4020
  byte_count = exp.X_add_number;
4021
 
4022
  if (*input_line_pointer != ',')
4023
    {
4024
      as_bad (_("missing value"));
4025
      return;
4026
    }
4027
 
4028
  ++input_line_pointer;
4029
  cons (byte_count);
4030
}
4031
 
4032
#endif /* OBJ_XCOFF */
4033
#if defined (OBJ_XCOFF) || defined (OBJ_ELF)
4034
 
4035
/* The .tc pseudo-op.  This is used when generating either XCOFF or
4036
   ELF.  This takes two or more arguments.
4037
 
4038
   When generating XCOFF output, the first argument is the name to
4039
   give to this location in the toc; this will be a symbol with class
4040
   TC.  The rest of the arguments are N-byte values to actually put at
4041
   this location in the TOC; often there is just one more argument, a
4042
   relocatable symbol reference.  The size of the value to store
4043
   depends on target word size.  A 32-bit target uses 4-byte values, a
4044
   64-bit target uses 8-byte values.
4045
 
4046
   When not generating XCOFF output, the arguments are the same, but
4047
   the first argument is simply ignored.  */
4048
 
4049
static void
4050
ppc_tc (int ignore ATTRIBUTE_UNUSED)
4051
{
4052
#ifdef OBJ_XCOFF
4053
 
4054
  /* Define the TOC symbol name.  */
4055
  {
4056
    char *name;
4057
    char endc;
4058
    symbolS *sym;
4059
 
4060
    if (ppc_toc_csect == (symbolS *) NULL
4061
        || ppc_toc_csect != ppc_current_csect)
4062
      {
4063
        as_bad (_(".tc not in .toc section"));
4064
        ignore_rest_of_line ();
4065
        return;
4066
      }
4067
 
4068
    name = input_line_pointer;
4069
    endc = get_symbol_end ();
4070
 
4071
    sym = symbol_find_or_make (name);
4072
 
4073
    *input_line_pointer = endc;
4074
 
4075
    if (S_IS_DEFINED (sym))
4076
      {
4077
        symbolS *label;
4078
 
4079
        label = symbol_get_tc (ppc_current_csect)->within;
4080
        if (symbol_get_tc (label)->class != XMC_TC0)
4081
          {
4082
            as_bad (_(".tc with no label"));
4083
            ignore_rest_of_line ();
4084
            return;
4085
          }
4086
 
4087
        S_SET_SEGMENT (label, S_GET_SEGMENT (sym));
4088
        symbol_set_frag (label, symbol_get_frag (sym));
4089
        S_SET_VALUE (label, S_GET_VALUE (sym));
4090
 
4091
        while (! is_end_of_line[(unsigned char) *input_line_pointer])
4092
          ++input_line_pointer;
4093
 
4094
        return;
4095
      }
4096
 
4097
    S_SET_SEGMENT (sym, now_seg);
4098
    symbol_set_frag (sym, frag_now);
4099
    S_SET_VALUE (sym, (valueT) frag_now_fix ());
4100
    symbol_get_tc (sym)->class = XMC_TC;
4101
    symbol_get_tc (sym)->output = 1;
4102
 
4103
    ppc_frob_label (sym);
4104
  }
4105
 
4106
#endif /* OBJ_XCOFF */
4107
#ifdef OBJ_ELF
4108
  int align;
4109
 
4110
  /* Skip the TOC symbol name.  */
4111
  while (is_part_of_name (*input_line_pointer)
4112
         || *input_line_pointer == ' '
4113
         || *input_line_pointer == '['
4114
         || *input_line_pointer == ']'
4115
         || *input_line_pointer == '{'
4116
         || *input_line_pointer == '}')
4117
    ++input_line_pointer;
4118
 
4119
  /* Align to a four/eight byte boundary.  */
4120
  align = ppc_obj64 ? 3 : 2;
4121
  frag_align (align, 0, 0);
4122
  record_alignment (now_seg, align);
4123
#endif /* OBJ_ELF */
4124
 
4125
  if (*input_line_pointer != ',')
4126
    demand_empty_rest_of_line ();
4127
  else
4128
    {
4129
      ++input_line_pointer;
4130
      cons (ppc_obj64 ? 8 : 4);
4131
    }
4132
}
4133
 
4134
/* Pseudo-op .machine.  */
4135
 
4136
static void
4137
ppc_machine (int ignore ATTRIBUTE_UNUSED)
4138
{
4139
  char *cpu_string;
4140
#define MAX_HISTORY 100
4141
  static unsigned long *cpu_history;
4142
  static int curr_hist;
4143
 
4144
  SKIP_WHITESPACE ();
4145
 
4146
  if (*input_line_pointer == '"')
4147
    {
4148
      int len;
4149
      cpu_string = demand_copy_C_string (&len);
4150
    }
4151
  else
4152
    {
4153
      char c;
4154
      cpu_string = input_line_pointer;
4155
      c = get_symbol_end ();
4156
      cpu_string = xstrdup (cpu_string);
4157
      *input_line_pointer = c;
4158
    }
4159
 
4160
  if (cpu_string != NULL)
4161
    {
4162
      unsigned long old_cpu = ppc_cpu;
4163
      char *p;
4164
 
4165
      for (p = cpu_string; *p != 0; p++)
4166
        *p = TOLOWER (*p);
4167
 
4168
      if (strcmp (cpu_string, "push") == 0)
4169
        {
4170
          if (cpu_history == NULL)
4171
            cpu_history = xmalloc (MAX_HISTORY * sizeof (*cpu_history));
4172
 
4173
          if (curr_hist >= MAX_HISTORY)
4174
            as_bad (_(".machine stack overflow"));
4175
          else
4176
            cpu_history[curr_hist++] = ppc_cpu;
4177
        }
4178
      else if (strcmp (cpu_string, "pop") == 0)
4179
        {
4180
          if (curr_hist <= 0)
4181
            as_bad (_(".machine stack underflow"));
4182
          else
4183
            ppc_cpu = cpu_history[--curr_hist];
4184
        }
4185
      else if (parse_cpu (cpu_string))
4186
        ;
4187
      else
4188
        as_bad (_("invalid machine `%s'"), cpu_string);
4189
 
4190
      if (ppc_cpu != old_cpu)
4191
        ppc_setup_opcodes ();
4192
    }
4193
 
4194
  demand_empty_rest_of_line ();
4195
}
4196
 
4197
/* See whether a symbol is in the TOC section.  */
4198
 
4199
static int
4200
ppc_is_toc_sym (symbolS *sym)
4201
{
4202
#ifdef OBJ_XCOFF
4203
  return symbol_get_tc (sym)->class == XMC_TC;
4204
#endif
4205
#ifdef OBJ_ELF
4206
  const char *sname = segment_name (S_GET_SEGMENT (sym));
4207
  if (ppc_obj64)
4208
    return strcmp (sname, ".toc") == 0;
4209
  else
4210
    return strcmp (sname, ".got") == 0;
4211
#endif
4212
}
4213
#endif /* defined (OBJ_XCOFF) || defined (OBJ_ELF) */
4214
 
4215
#ifdef TE_PE
4216
 
4217
/* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format.  */
4218
 
4219
/* Set the current section.  */
4220
static void
4221
ppc_set_current_section (segT new)
4222
{
4223
  ppc_previous_section = ppc_current_section;
4224
  ppc_current_section = new;
4225
}
4226
 
4227
/* pseudo-op: .previous
4228
   behaviour: toggles the current section with the previous section.
4229
   errors:    None
4230
   warnings:  "No previous section"  */
4231
 
4232
static void
4233
ppc_previous (int ignore ATTRIBUTE_UNUSED)
4234
{
4235
  symbolS *tmp;
4236
 
4237
  if (ppc_previous_section == NULL)
4238
    {
4239
      as_warn (_("No previous section to return to. Directive ignored."));
4240
      return;
4241
    }
4242
 
4243
  subseg_set (ppc_previous_section, 0);
4244
 
4245
  ppc_set_current_section (ppc_previous_section);
4246
}
4247
 
4248
/* pseudo-op: .pdata
4249
   behaviour: predefined read only data section
4250
              double word aligned
4251
   errors:    None
4252
   warnings:  None
4253
   initial:   .section .pdata "adr3"
4254
              a - don't know -- maybe a misprint
4255
              d - initialized data
4256
              r - readable
4257
              3 - double word aligned (that would be 4 byte boundary)
4258
 
4259
   commentary:
4260
   Tag index tables (also known as the function table) for exception
4261
   handling, debugging, etc.  */
4262
 
4263
static void
4264
ppc_pdata (int ignore ATTRIBUTE_UNUSED)
4265
{
4266
  if (pdata_section == 0)
4267
    {
4268
      pdata_section = subseg_new (".pdata", 0);
4269
 
4270
      bfd_set_section_flags (stdoutput, pdata_section,
4271
                             (SEC_ALLOC | SEC_LOAD | SEC_RELOC
4272
                              | SEC_READONLY | SEC_DATA ));
4273
 
4274
      bfd_set_section_alignment (stdoutput, pdata_section, 2);
4275
    }
4276
  else
4277
    {
4278
      pdata_section = subseg_new (".pdata", 0);
4279
    }
4280
  ppc_set_current_section (pdata_section);
4281
}
4282
 
4283
/* pseudo-op: .ydata
4284
   behaviour: predefined read only data section
4285
              double word aligned
4286
   errors:    None
4287
   warnings:  None
4288
   initial:   .section .ydata "drw3"
4289
              a - don't know -- maybe a misprint
4290
              d - initialized data
4291
              r - readable
4292
              3 - double word aligned (that would be 4 byte boundary)
4293
   commentary:
4294
   Tag tables (also known as the scope table) for exception handling,
4295
   debugging, etc.  */
4296
 
4297
static void
4298
ppc_ydata (int ignore ATTRIBUTE_UNUSED)
4299
{
4300
  if (ydata_section == 0)
4301
    {
4302
      ydata_section = subseg_new (".ydata", 0);
4303
      bfd_set_section_flags (stdoutput, ydata_section,
4304
                             (SEC_ALLOC | SEC_LOAD | SEC_RELOC
4305
                              | SEC_READONLY | SEC_DATA ));
4306
 
4307
      bfd_set_section_alignment (stdoutput, ydata_section, 3);
4308
    }
4309
  else
4310
    {
4311
      ydata_section = subseg_new (".ydata", 0);
4312
    }
4313
  ppc_set_current_section (ydata_section);
4314
}
4315
 
4316
/* pseudo-op: .reldata
4317
   behaviour: predefined read write data section
4318
              double word aligned (4-byte)
4319
              FIXME: relocation is applied to it
4320
              FIXME: what's the difference between this and .data?
4321
   errors:    None
4322
   warnings:  None
4323
   initial:   .section .reldata "drw3"
4324
              d - initialized data
4325
              r - readable
4326
              w - writeable
4327
              3 - double word aligned (that would be 8 byte boundary)
4328
 
4329
   commentary:
4330
   Like .data, but intended to hold data subject to relocation, such as
4331
   function descriptors, etc.  */
4332
 
4333
static void
4334
ppc_reldata (int ignore ATTRIBUTE_UNUSED)
4335
{
4336
  if (reldata_section == 0)
4337
    {
4338
      reldata_section = subseg_new (".reldata", 0);
4339
 
4340
      bfd_set_section_flags (stdoutput, reldata_section,
4341
                             (SEC_ALLOC | SEC_LOAD | SEC_RELOC
4342
                              | SEC_DATA));
4343
 
4344
      bfd_set_section_alignment (stdoutput, reldata_section, 2);
4345
    }
4346
  else
4347
    {
4348
      reldata_section = subseg_new (".reldata", 0);
4349
    }
4350
  ppc_set_current_section (reldata_section);
4351
}
4352
 
4353
/* pseudo-op: .rdata
4354
   behaviour: predefined read only data section
4355
              double word aligned
4356
   errors:    None
4357
   warnings:  None
4358
   initial:   .section .rdata "dr3"
4359
              d - initialized data
4360
              r - readable
4361
              3 - double word aligned (that would be 4 byte boundary)  */
4362
 
4363
static void
4364
ppc_rdata (int ignore ATTRIBUTE_UNUSED)
4365
{
4366
  if (rdata_section == 0)
4367
    {
4368
      rdata_section = subseg_new (".rdata", 0);
4369
      bfd_set_section_flags (stdoutput, rdata_section,
4370
                             (SEC_ALLOC | SEC_LOAD | SEC_RELOC
4371
                              | SEC_READONLY | SEC_DATA ));
4372
 
4373
      bfd_set_section_alignment (stdoutput, rdata_section, 2);
4374
    }
4375
  else
4376
    {
4377
      rdata_section = subseg_new (".rdata", 0);
4378
    }
4379
  ppc_set_current_section (rdata_section);
4380
}
4381
 
4382
/* pseudo-op: .ualong
4383
   behaviour: much like .int, with the exception that no alignment is
4384
              performed.
4385
              FIXME: test the alignment statement
4386
   errors:    None
4387
   warnings:  None  */
4388
 
4389
static void
4390
ppc_ualong (int ignore ATTRIBUTE_UNUSED)
4391
{
4392
  /* Try for long.  */
4393
  cons (4);
4394
}
4395
 
4396
/* pseudo-op: .znop  <symbol name>
4397
   behaviour: Issue a nop instruction
4398
              Issue a IMAGE_REL_PPC_IFGLUE relocation against it, using
4399
              the supplied symbol name.
4400
   errors:    None
4401
   warnings:  Missing symbol name  */
4402
 
4403
static void
4404
ppc_znop (int ignore ATTRIBUTE_UNUSED)
4405
{
4406
  unsigned long insn;
4407
  const struct powerpc_opcode *opcode;
4408
  expressionS ex;
4409
  char *f;
4410
  symbolS *sym;
4411
  char *symbol_name;
4412
  char c;
4413
  char *name;
4414
  unsigned int exp;
4415
  flagword flags;
4416
  asection *sec;
4417
 
4418
  /* Strip out the symbol name.  */
4419
  symbol_name = input_line_pointer;
4420
  c = get_symbol_end ();
4421
 
4422
  name = xmalloc (input_line_pointer - symbol_name + 1);
4423
  strcpy (name, symbol_name);
4424
 
4425
  sym = symbol_find_or_make (name);
4426
 
4427
  *input_line_pointer = c;
4428
 
4429
  SKIP_WHITESPACE ();
4430
 
4431
  /* Look up the opcode in the hash table.  */
4432
  opcode = (const struct powerpc_opcode *) hash_find (ppc_hash, "nop");
4433
 
4434
  /* Stick in the nop.  */
4435
  insn = opcode->opcode;
4436
 
4437
  /* Write out the instruction.  */
4438
  f = frag_more (4);
4439
  md_number_to_chars (f, insn, 4);
4440
  fix_new (frag_now,
4441
           f - frag_now->fr_literal,
4442
           4,
4443
           sym,
4444
           0,
4445
           0,
4446
           BFD_RELOC_16_GOT_PCREL);
4447
 
4448
}
4449
 
4450
/* pseudo-op:
4451
   behaviour:
4452
   errors:
4453
   warnings:  */
4454
 
4455
static void
4456
ppc_pe_comm (int lcomm)
4457
{
4458
  char *name;
4459
  char c;
4460
  char *p;
4461
  offsetT temp;
4462
  symbolS *symbolP;
4463
  offsetT align;
4464
 
4465
  name = input_line_pointer;
4466
  c = get_symbol_end ();
4467
 
4468
  /* just after name is now '\0'.  */
4469
  p = input_line_pointer;
4470
  *p = c;
4471
  SKIP_WHITESPACE ();
4472
  if (*input_line_pointer != ',')
4473
    {
4474
      as_bad (_("Expected comma after symbol-name: rest of line ignored."));
4475
      ignore_rest_of_line ();
4476
      return;
4477
    }
4478
 
4479
  input_line_pointer++;         /* skip ',' */
4480
  if ((temp = get_absolute_expression ()) < 0)
4481
    {
4482
      as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) temp);
4483
      ignore_rest_of_line ();
4484
      return;
4485
    }
4486
 
4487
  if (! lcomm)
4488
    {
4489
      /* The third argument to .comm is the alignment.  */
4490
      if (*input_line_pointer != ',')
4491
        align = 3;
4492
      else
4493
        {
4494
          ++input_line_pointer;
4495
          align = get_absolute_expression ();
4496
          if (align <= 0)
4497
            {
4498
              as_warn (_("ignoring bad alignment"));
4499
              align = 3;
4500
            }
4501
        }
4502
    }
4503
 
4504
  *p = 0;
4505
  symbolP = symbol_find_or_make (name);
4506
 
4507
  *p = c;
4508
  if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
4509
    {
4510
      as_bad (_("Ignoring attempt to re-define symbol `%s'."),
4511
              S_GET_NAME (symbolP));
4512
      ignore_rest_of_line ();
4513
      return;
4514
    }
4515
 
4516
  if (S_GET_VALUE (symbolP))
4517
    {
4518
      if (S_GET_VALUE (symbolP) != (valueT) temp)
4519
        as_bad (_("Length of .comm \"%s\" is already %ld. Not changed to %ld."),
4520
                S_GET_NAME (symbolP),
4521
                (long) S_GET_VALUE (symbolP),
4522
                (long) temp);
4523
    }
4524
  else
4525
    {
4526
      S_SET_VALUE (symbolP, (valueT) temp);
4527
      S_SET_EXTERNAL (symbolP);
4528
      S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
4529
    }
4530
 
4531
  demand_empty_rest_of_line ();
4532
}
4533
 
4534
/*
4535
 * implement the .section pseudo op:
4536
 *      .section name {, "flags"}
4537
 *                ^         ^
4538
 *                |         +--- optional flags: 'b' for bss
4539
 *                |                              'i' for info
4540
 *                +-- section name               'l' for lib
4541
 *                                               'n' for noload
4542
 *                                               'o' for over
4543
 *                                               'w' for data
4544
 *                                               'd' (apparently m88k for data)
4545
 *                                               'x' for text
4546
 * But if the argument is not a quoted string, treat it as a
4547
 * subsegment number.
4548
 *
4549
 * FIXME: this is a copy of the section processing from obj-coff.c, with
4550
 * additions/changes for the moto-pas assembler support. There are three
4551
 * categories:
4552
 *
4553
 * FIXME: I just noticed this. This doesn't work at all really. It it
4554
 *        setting bits that bfd probably neither understands or uses. The
4555
 *        correct approach (?) will have to incorporate extra fields attached
4556
 *        to the section to hold the system specific stuff. (krk)
4557
 *
4558
 * Section Contents:
4559
 * 'a' - unknown - referred to in documentation, but no definition supplied
4560
 * 'c' - section has code
4561
 * 'd' - section has initialized data
4562
 * 'u' - section has uninitialized data
4563
 * 'i' - section contains directives (info)
4564
 * 'n' - section can be discarded
4565
 * 'R' - remove section at link time
4566
 *
4567
 * Section Protection:
4568
 * 'r' - section is readable
4569
 * 'w' - section is writeable
4570
 * 'x' - section is executable
4571
 * 's' - section is sharable
4572
 *
4573
 * Section Alignment:
4574
 * '0' - align to byte boundary
4575
 * '1' - align to halfword undary
4576
 * '2' - align to word boundary
4577
 * '3' - align to doubleword boundary
4578
 * '4' - align to quadword boundary
4579
 * '5' - align to 32 byte boundary
4580
 * '6' - align to 64 byte boundary
4581
 *
4582
 */
4583
 
4584
void
4585
ppc_pe_section (int ignore ATTRIBUTE_UNUSED)
4586
{
4587
  /* Strip out the section name.  */
4588
  char *section_name;
4589
  char c;
4590
  char *name;
4591
  unsigned int exp;
4592
  flagword flags;
4593
  segT sec;
4594
  int align;
4595
 
4596
  section_name = input_line_pointer;
4597
  c = get_symbol_end ();
4598
 
4599
  name = xmalloc (input_line_pointer - section_name + 1);
4600
  strcpy (name, section_name);
4601
 
4602
  *input_line_pointer = c;
4603
 
4604
  SKIP_WHITESPACE ();
4605
 
4606
  exp = 0;
4607
  flags = SEC_NO_FLAGS;
4608
 
4609
  if (strcmp (name, ".idata$2") == 0)
4610
    {
4611
      align = 0;
4612
    }
4613
  else if (strcmp (name, ".idata$3") == 0)
4614
    {
4615
      align = 0;
4616
    }
4617
  else if (strcmp (name, ".idata$4") == 0)
4618
    {
4619
      align = 2;
4620
    }
4621
  else if (strcmp (name, ".idata$5") == 0)
4622
    {
4623
      align = 2;
4624
    }
4625
  else if (strcmp (name, ".idata$6") == 0)
4626
    {
4627
      align = 1;
4628
    }
4629
  else
4630
    /* Default alignment to 16 byte boundary.  */
4631
    align = 4;
4632
 
4633
  if (*input_line_pointer == ',')
4634
    {
4635
      ++input_line_pointer;
4636
      SKIP_WHITESPACE ();
4637
      if (*input_line_pointer != '"')
4638
        exp = get_absolute_expression ();
4639
      else
4640
        {
4641
          ++input_line_pointer;
4642
          while (*input_line_pointer != '"'
4643
                 && ! is_end_of_line[(unsigned char) *input_line_pointer])
4644
            {
4645
              switch (*input_line_pointer)
4646
                {
4647
                  /* Section Contents */
4648
                case 'a': /* unknown */
4649
                  as_bad (_("Unsupported section attribute -- 'a'"));
4650
                  break;
4651
                case 'c': /* code section */
4652
                  flags |= SEC_CODE;
4653
                  break;
4654
                case 'd': /* section has initialized data */
4655
                  flags |= SEC_DATA;
4656
                  break;
4657
                case 'u': /* section has uninitialized data */
4658
                  /* FIXME: This is IMAGE_SCN_CNT_UNINITIALIZED_DATA
4659
                     in winnt.h */
4660
                  flags |= SEC_ROM;
4661
                  break;
4662
                case 'i': /* section contains directives (info) */
4663
                  /* FIXME: This is IMAGE_SCN_LNK_INFO
4664
                     in winnt.h */
4665
                  flags |= SEC_HAS_CONTENTS;
4666
                  break;
4667
                case 'n': /* section can be discarded */
4668
                  flags &=~ SEC_LOAD;
4669
                  break;
4670
                case 'R': /* Remove section at link time */
4671
                  flags |= SEC_NEVER_LOAD;
4672
                  break;
4673
#if IFLICT_BRAIN_DAMAGE
4674
                  /* Section Protection */
4675
                case 'r': /* section is readable */
4676
                  flags |= IMAGE_SCN_MEM_READ;
4677
                  break;
4678
                case 'w': /* section is writeable */
4679
                  flags |= IMAGE_SCN_MEM_WRITE;
4680
                  break;
4681
                case 'x': /* section is executable */
4682
                  flags |= IMAGE_SCN_MEM_EXECUTE;
4683
                  break;
4684
                case 's': /* section is sharable */
4685
                  flags |= IMAGE_SCN_MEM_SHARED;
4686
                  break;
4687
 
4688
                  /* Section Alignment */
4689
                case '0': /* align to byte boundary */
4690
                  flags |= IMAGE_SCN_ALIGN_1BYTES;
4691
                  align = 0;
4692
                  break;
4693
                case '1':  /* align to halfword boundary */
4694
                  flags |= IMAGE_SCN_ALIGN_2BYTES;
4695
                  align = 1;
4696
                  break;
4697
                case '2':  /* align to word boundary */
4698
                  flags |= IMAGE_SCN_ALIGN_4BYTES;
4699
                  align = 2;
4700
                  break;
4701
                case '3':  /* align to doubleword boundary */
4702
                  flags |= IMAGE_SCN_ALIGN_8BYTES;
4703
                  align = 3;
4704
                  break;
4705
                case '4':  /* align to quadword boundary */
4706
                  flags |= IMAGE_SCN_ALIGN_16BYTES;
4707
                  align = 4;
4708
                  break;
4709
                case '5':  /* align to 32 byte boundary */
4710
                  flags |= IMAGE_SCN_ALIGN_32BYTES;
4711
                  align = 5;
4712
                  break;
4713
                case '6':  /* align to 64 byte boundary */
4714
                  flags |= IMAGE_SCN_ALIGN_64BYTES;
4715
                  align = 6;
4716
                  break;
4717
#endif
4718
                default:
4719
                  as_bad (_("unknown section attribute '%c'"),
4720
                          *input_line_pointer);
4721
                  break;
4722
                }
4723
              ++input_line_pointer;
4724
            }
4725
          if (*input_line_pointer == '"')
4726
            ++input_line_pointer;
4727
        }
4728
    }
4729
 
4730
  sec = subseg_new (name, (subsegT) exp);
4731
 
4732
  ppc_set_current_section (sec);
4733
 
4734
  if (flags != SEC_NO_FLAGS)
4735
    {
4736
      if (! bfd_set_section_flags (stdoutput, sec, flags))
4737
        as_bad (_("error setting flags for \"%s\": %s"),
4738
                bfd_section_name (stdoutput, sec),
4739
                bfd_errmsg (bfd_get_error ()));
4740
    }
4741
 
4742
  bfd_set_section_alignment (stdoutput, sec, align);
4743
}
4744
 
4745
static void
4746
ppc_pe_function (int ignore ATTRIBUTE_UNUSED)
4747
{
4748
  char *name;
4749
  char endc;
4750
  symbolS *ext_sym;
4751
 
4752
  name = input_line_pointer;
4753
  endc = get_symbol_end ();
4754
 
4755
  ext_sym = symbol_find_or_make (name);
4756
 
4757
  *input_line_pointer = endc;
4758
 
4759
  S_SET_DATA_TYPE (ext_sym, DT_FCN << N_BTSHFT);
4760
  SF_SET_FUNCTION (ext_sym);
4761
  SF_SET_PROCESS (ext_sym);
4762
  coff_add_linesym (ext_sym);
4763
 
4764
  demand_empty_rest_of_line ();
4765
}
4766
 
4767
static void
4768
ppc_pe_tocd (int ignore ATTRIBUTE_UNUSED)
4769
{
4770
  if (tocdata_section == 0)
4771
    {
4772
      tocdata_section = subseg_new (".tocd", 0);
4773
      /* FIXME: section flags won't work.  */
4774
      bfd_set_section_flags (stdoutput, tocdata_section,
4775
                             (SEC_ALLOC | SEC_LOAD | SEC_RELOC
4776
                              | SEC_READONLY | SEC_DATA));
4777
 
4778
      bfd_set_section_alignment (stdoutput, tocdata_section, 2);
4779
    }
4780
  else
4781
    {
4782
      rdata_section = subseg_new (".tocd", 0);
4783
    }
4784
 
4785
  ppc_set_current_section (tocdata_section);
4786
 
4787
  demand_empty_rest_of_line ();
4788
}
4789
 
4790
/* Don't adjust TOC relocs to use the section symbol.  */
4791
 
4792
int
4793
ppc_pe_fix_adjustable (fixS *fix)
4794
{
4795
  return fix->fx_r_type != BFD_RELOC_PPC_TOC16;
4796
}
4797
 
4798
#endif
4799
 
4800
#ifdef OBJ_XCOFF
4801
 
4802
/* XCOFF specific symbol and file handling.  */
4803
 
4804
/* Canonicalize the symbol name.  We use the to force the suffix, if
4805
   any, to use square brackets, and to be in upper case.  */
4806
 
4807
char *
4808
ppc_canonicalize_symbol_name (char *name)
4809
{
4810
  char *s;
4811
 
4812
  if (ppc_stab_symbol)
4813
    return name;
4814
 
4815
  for (s = name; *s != '\0' && *s != '{' && *s != '['; s++)
4816
    ;
4817
  if (*s != '\0')
4818
    {
4819
      char brac;
4820
 
4821
      if (*s == '[')
4822
        brac = ']';
4823
      else
4824
        {
4825
          *s = '[';
4826
          brac = '}';
4827
        }
4828
 
4829
      for (s++; *s != '\0' && *s != brac; s++)
4830
        *s = TOUPPER (*s);
4831
 
4832
      if (*s == '\0' || s[1] != '\0')
4833
        as_bad (_("bad symbol suffix"));
4834
 
4835
      *s = ']';
4836
    }
4837
 
4838
  return name;
4839
}
4840
 
4841
/* Set the class of a symbol based on the suffix, if any.  This is
4842
   called whenever a new symbol is created.  */
4843
 
4844
void
4845
ppc_symbol_new_hook (symbolS *sym)
4846
{
4847
  struct ppc_tc_sy *tc;
4848
  const char *s;
4849
 
4850
  tc = symbol_get_tc (sym);
4851
  tc->next = NULL;
4852
  tc->output = 0;
4853
  tc->class = -1;
4854
  tc->real_name = NULL;
4855
  tc->subseg = 0;
4856
  tc->align = 0;
4857
  tc->size = NULL;
4858
  tc->within = NULL;
4859
 
4860
  if (ppc_stab_symbol)
4861
    return;
4862
 
4863
  s = strchr (S_GET_NAME (sym), '[');
4864
  if (s == (const char *) NULL)
4865
    {
4866
      /* There is no suffix.  */
4867
      return;
4868
    }
4869
 
4870
  ++s;
4871
 
4872
  switch (s[0])
4873
    {
4874
    case 'B':
4875
      if (strcmp (s, "BS]") == 0)
4876
        tc->class = XMC_BS;
4877
      break;
4878
    case 'D':
4879
      if (strcmp (s, "DB]") == 0)
4880
        tc->class = XMC_DB;
4881
      else if (strcmp (s, "DS]") == 0)
4882
        tc->class = XMC_DS;
4883
      break;
4884
    case 'G':
4885
      if (strcmp (s, "GL]") == 0)
4886
        tc->class = XMC_GL;
4887
      break;
4888
    case 'P':
4889
      if (strcmp (s, "PR]") == 0)
4890
        tc->class = XMC_PR;
4891
      break;
4892
    case 'R':
4893
      if (strcmp (s, "RO]") == 0)
4894
        tc->class = XMC_RO;
4895
      else if (strcmp (s, "RW]") == 0)
4896
        tc->class = XMC_RW;
4897
      break;
4898
    case 'S':
4899
      if (strcmp (s, "SV]") == 0)
4900
        tc->class = XMC_SV;
4901
      break;
4902
    case 'T':
4903
      if (strcmp (s, "TC]") == 0)
4904
        tc->class = XMC_TC;
4905
      else if (strcmp (s, "TI]") == 0)
4906
        tc->class = XMC_TI;
4907
      else if (strcmp (s, "TB]") == 0)
4908
        tc->class = XMC_TB;
4909
      else if (strcmp (s, "TC0]") == 0 || strcmp (s, "T0]") == 0)
4910
        tc->class = XMC_TC0;
4911
      break;
4912
    case 'U':
4913
      if (strcmp (s, "UA]") == 0)
4914
        tc->class = XMC_UA;
4915
      else if (strcmp (s, "UC]") == 0)
4916
        tc->class = XMC_UC;
4917
      break;
4918
    case 'X':
4919
      if (strcmp (s, "XO]") == 0)
4920
        tc->class = XMC_XO;
4921
      break;
4922
    }
4923
 
4924
  if (tc->class == -1)
4925
    as_bad (_("Unrecognized symbol suffix"));
4926
}
4927
 
4928
/* Set the class of a label based on where it is defined.  This
4929
   handles symbols without suffixes.  Also, move the symbol so that it
4930
   follows the csect symbol.  */
4931
 
4932
void
4933
ppc_frob_label (symbolS *sym)
4934
{
4935
  if (ppc_current_csect != (symbolS *) NULL)
4936
    {
4937
      if (symbol_get_tc (sym)->class == -1)
4938
        symbol_get_tc (sym)->class = symbol_get_tc (ppc_current_csect)->class;
4939
 
4940
      symbol_remove (sym, &symbol_rootP, &symbol_lastP);
4941
      symbol_append (sym, symbol_get_tc (ppc_current_csect)->within,
4942
                     &symbol_rootP, &symbol_lastP);
4943
      symbol_get_tc (ppc_current_csect)->within = sym;
4944
    }
4945
 
4946
#ifdef OBJ_ELF
4947
  dwarf2_emit_label (sym);
4948
#endif
4949
}
4950
 
4951
/* This variable is set by ppc_frob_symbol if any absolute symbols are
4952
   seen.  It tells ppc_adjust_symtab whether it needs to look through
4953
   the symbols.  */
4954
 
4955
static bfd_boolean ppc_saw_abs;
4956
 
4957
/* Change the name of a symbol just before writing it out.  Set the
4958
   real name if the .rename pseudo-op was used.  Otherwise, remove any
4959
   class suffix.  Return 1 if the symbol should not be included in the
4960
   symbol table.  */
4961
 
4962
int
4963
ppc_frob_symbol (symbolS *sym)
4964
{
4965
  static symbolS *ppc_last_function;
4966
  static symbolS *set_end;
4967
 
4968
  /* Discard symbols that should not be included in the output symbol
4969
     table.  */
4970
  if (! symbol_used_in_reloc_p (sym)
4971
      && ((symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM) != 0
4972
          || (! (S_IS_EXTERNAL (sym) || S_IS_WEAK (sym))
4973
              && ! symbol_get_tc (sym)->output
4974
              && S_GET_STORAGE_CLASS (sym) != C_FILE)))
4975
    return 1;
4976
 
4977
  /* This one will disappear anyway.  Don't make a csect sym for it.  */
4978
  if (sym == abs_section_sym)
4979
    return 1;
4980
 
4981
  if (symbol_get_tc (sym)->real_name != (char *) NULL)
4982
    S_SET_NAME (sym, symbol_get_tc (sym)->real_name);
4983
  else
4984
    {
4985
      const char *name;
4986
      const char *s;
4987
 
4988
      name = S_GET_NAME (sym);
4989
      s = strchr (name, '[');
4990
      if (s != (char *) NULL)
4991
        {
4992
          unsigned int len;
4993
          char *snew;
4994
 
4995
          len = s - name;
4996
          snew = xmalloc (len + 1);
4997
          memcpy (snew, name, len);
4998
          snew[len] = '\0';
4999
 
5000
          S_SET_NAME (sym, snew);
5001
        }
5002
    }
5003
 
5004
  if (set_end != (symbolS *) NULL)
5005
    {
5006
      SA_SET_SYM_ENDNDX (set_end, sym);
5007
      set_end = NULL;
5008
    }
5009
 
5010
  if (SF_GET_FUNCTION (sym))
5011
    {
5012
      if (ppc_last_function != (symbolS *) NULL)
5013
        as_bad (_("two .function pseudo-ops with no intervening .ef"));
5014
      ppc_last_function = sym;
5015
      if (symbol_get_tc (sym)->size != (symbolS *) NULL)
5016
        {
5017
          resolve_symbol_value (symbol_get_tc (sym)->size);
5018
          SA_SET_SYM_FSIZE (sym,
5019
                            (long) S_GET_VALUE (symbol_get_tc (sym)->size));
5020
        }
5021
    }
5022
  else if (S_GET_STORAGE_CLASS (sym) == C_FCN
5023
           && strcmp (S_GET_NAME (sym), ".ef") == 0)
5024
    {
5025
      if (ppc_last_function == (symbolS *) NULL)
5026
        as_bad (_(".ef with no preceding .function"));
5027
      else
5028
        {
5029
          set_end = ppc_last_function;
5030
          ppc_last_function = NULL;
5031
 
5032
          /* We don't have a C_EFCN symbol, but we need to force the
5033
             COFF backend to believe that it has seen one.  */
5034
          coff_last_function = NULL;
5035
        }
5036
    }
5037
 
5038
  if (! (S_IS_EXTERNAL (sym) || S_IS_WEAK (sym))
5039
      && (symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM) == 0
5040
      && S_GET_STORAGE_CLASS (sym) != C_FILE
5041
      && S_GET_STORAGE_CLASS (sym) != C_FCN
5042
      && S_GET_STORAGE_CLASS (sym) != C_BLOCK
5043
      && S_GET_STORAGE_CLASS (sym) != C_BSTAT
5044
      && S_GET_STORAGE_CLASS (sym) != C_ESTAT
5045
      && S_GET_STORAGE_CLASS (sym) != C_BINCL
5046
      && S_GET_STORAGE_CLASS (sym) != C_EINCL
5047
      && S_GET_SEGMENT (sym) != ppc_coff_debug_section)
5048
    S_SET_STORAGE_CLASS (sym, C_HIDEXT);
5049
 
5050
  if (S_GET_STORAGE_CLASS (sym) == C_EXT
5051
      || S_GET_STORAGE_CLASS (sym) == C_HIDEXT)
5052
    {
5053
      int i;
5054
      union internal_auxent *a;
5055
 
5056
      /* Create a csect aux.  */
5057
      i = S_GET_NUMBER_AUXILIARY (sym);
5058
      S_SET_NUMBER_AUXILIARY (sym, i + 1);
5059
      a = &coffsymbol (symbol_get_bfdsym (sym))->native[i + 1].u.auxent;
5060
      if (symbol_get_tc (sym)->class == XMC_TC0)
5061
        {
5062
          /* This is the TOC table.  */
5063
          know (strcmp (S_GET_NAME (sym), "TOC") == 0);
5064
          a->x_csect.x_scnlen.l = 0;
5065
          a->x_csect.x_smtyp = (2 << 3) | XTY_SD;
5066
        }
5067
      else if (symbol_get_tc (sym)->subseg != 0)
5068
        {
5069
          /* This is a csect symbol.  x_scnlen is the size of the
5070
             csect.  */
5071
          if (symbol_get_tc (sym)->next == (symbolS *) NULL)
5072
            a->x_csect.x_scnlen.l = (bfd_section_size (stdoutput,
5073
                                                       S_GET_SEGMENT (sym))
5074
                                     - S_GET_VALUE (sym));
5075
          else
5076
            {
5077
              resolve_symbol_value (symbol_get_tc (sym)->next);
5078
              a->x_csect.x_scnlen.l = (S_GET_VALUE (symbol_get_tc (sym)->next)
5079
                                       - S_GET_VALUE (sym));
5080
            }
5081
          a->x_csect.x_smtyp = (symbol_get_tc (sym)->align << 3) | XTY_SD;
5082
        }
5083
      else if (S_GET_SEGMENT (sym) == bss_section)
5084
        {
5085
          /* This is a common symbol.  */
5086
          a->x_csect.x_scnlen.l = symbol_get_frag (sym)->fr_offset;
5087
          a->x_csect.x_smtyp = (symbol_get_tc (sym)->align << 3) | XTY_CM;
5088
          if (S_IS_EXTERNAL (sym))
5089
            symbol_get_tc (sym)->class = XMC_RW;
5090
          else
5091
            symbol_get_tc (sym)->class = XMC_BS;
5092
        }
5093
      else if (S_GET_SEGMENT (sym) == absolute_section)
5094
        {
5095
          /* This is an absolute symbol.  The csect will be created by
5096
             ppc_adjust_symtab.  */
5097
          ppc_saw_abs = TRUE;
5098
          a->x_csect.x_smtyp = XTY_LD;
5099
          if (symbol_get_tc (sym)->class == -1)
5100
            symbol_get_tc (sym)->class = XMC_XO;
5101
        }
5102
      else if (! S_IS_DEFINED (sym))
5103
        {
5104
          /* This is an external symbol.  */
5105
          a->x_csect.x_scnlen.l = 0;
5106
          a->x_csect.x_smtyp = XTY_ER;
5107
        }
5108
      else if (symbol_get_tc (sym)->class == XMC_TC)
5109
        {
5110
          symbolS *next;
5111
 
5112
          /* This is a TOC definition.  x_scnlen is the size of the
5113
             TOC entry.  */
5114
          next = symbol_next (sym);
5115
          while (symbol_get_tc (next)->class == XMC_TC0)
5116
            next = symbol_next (next);
5117
          if (next == (symbolS *) NULL
5118
              || symbol_get_tc (next)->class != XMC_TC)
5119
            {
5120
              if (ppc_after_toc_frag == (fragS *) NULL)
5121
                a->x_csect.x_scnlen.l = (bfd_section_size (stdoutput,
5122
                                                           data_section)
5123
                                         - S_GET_VALUE (sym));
5124
              else
5125
                a->x_csect.x_scnlen.l = (ppc_after_toc_frag->fr_address
5126
                                         - S_GET_VALUE (sym));
5127
            }
5128
          else
5129
            {
5130
              resolve_symbol_value (next);
5131
              a->x_csect.x_scnlen.l = (S_GET_VALUE (next)
5132
                                       - S_GET_VALUE (sym));
5133
            }
5134
          a->x_csect.x_smtyp = (2 << 3) | XTY_SD;
5135
        }
5136
      else
5137
        {
5138
          symbolS *csect;
5139
 
5140
          /* This is a normal symbol definition.  x_scnlen is the
5141
             symbol index of the containing csect.  */
5142
          if (S_GET_SEGMENT (sym) == text_section)
5143
            csect = ppc_text_csects;
5144
          else if (S_GET_SEGMENT (sym) == data_section)
5145
            csect = ppc_data_csects;
5146
          else
5147
            abort ();
5148
 
5149
          /* Skip the initial dummy symbol.  */
5150
          csect = symbol_get_tc (csect)->next;
5151
 
5152
          if (csect == (symbolS *) NULL)
5153
            {
5154
              as_warn (_("warning: symbol %s has no csect"), S_GET_NAME (sym));
5155
              a->x_csect.x_scnlen.l = 0;
5156
            }
5157
          else
5158
            {
5159
              while (symbol_get_tc (csect)->next != (symbolS *) NULL)
5160
                {
5161
                  resolve_symbol_value (symbol_get_tc (csect)->next);
5162
                  if (S_GET_VALUE (symbol_get_tc (csect)->next)
5163
                      > S_GET_VALUE (sym))
5164
                    break;
5165
                  csect = symbol_get_tc (csect)->next;
5166
                }
5167
 
5168
              a->x_csect.x_scnlen.p =
5169
                coffsymbol (symbol_get_bfdsym (csect))->native;
5170
              coffsymbol (symbol_get_bfdsym (sym))->native[i + 1].fix_scnlen =
5171
                1;
5172
            }
5173
          a->x_csect.x_smtyp = XTY_LD;
5174
        }
5175
 
5176
      a->x_csect.x_parmhash = 0;
5177
      a->x_csect.x_snhash = 0;
5178
      if (symbol_get_tc (sym)->class == -1)
5179
        a->x_csect.x_smclas = XMC_PR;
5180
      else
5181
        a->x_csect.x_smclas = symbol_get_tc (sym)->class;
5182
      a->x_csect.x_stab = 0;
5183
      a->x_csect.x_snstab = 0;
5184
 
5185
      /* Don't let the COFF backend resort these symbols.  */
5186
      symbol_get_bfdsym (sym)->flags |= BSF_NOT_AT_END;
5187
    }
5188
  else if (S_GET_STORAGE_CLASS (sym) == C_BSTAT)
5189
    {
5190
      /* We want the value to be the symbol index of the referenced
5191
         csect symbol.  BFD will do that for us if we set the right
5192
         flags.  */
5193
      asymbol *bsym = symbol_get_bfdsym (symbol_get_tc (sym)->within);
5194
      combined_entry_type *c = coffsymbol (bsym)->native;
5195
 
5196
      S_SET_VALUE (sym, (valueT) (size_t) c);
5197
      coffsymbol (symbol_get_bfdsym (sym))->native->fix_value = 1;
5198
    }
5199
  else if (S_GET_STORAGE_CLASS (sym) == C_STSYM)
5200
    {
5201
      symbolS *block;
5202
      symbolS *csect;
5203
 
5204
      /* The value is the offset from the enclosing csect.  */
5205
      block = symbol_get_tc (sym)->within;
5206
      csect = symbol_get_tc (block)->within;
5207
      resolve_symbol_value (csect);
5208
      S_SET_VALUE (sym, S_GET_VALUE (sym) - S_GET_VALUE (csect));
5209
    }
5210
  else if (S_GET_STORAGE_CLASS (sym) == C_BINCL
5211
           || S_GET_STORAGE_CLASS (sym) == C_EINCL)
5212
    {
5213
      /* We want the value to be a file offset into the line numbers.
5214
         BFD will do that for us if we set the right flags.  We have
5215
         already set the value correctly.  */
5216
      coffsymbol (symbol_get_bfdsym (sym))->native->fix_line = 1;
5217
    }
5218
 
5219
  return 0;
5220
}
5221
 
5222
/* Adjust the symbol table.  This creates csect symbols for all
5223
   absolute symbols.  */
5224
 
5225
void
5226
ppc_adjust_symtab (void)
5227
{
5228
  symbolS *sym;
5229
 
5230
  if (! ppc_saw_abs)
5231
    return;
5232
 
5233
  for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
5234
    {
5235
      symbolS *csect;
5236
      int i;
5237
      union internal_auxent *a;
5238
 
5239
      if (S_GET_SEGMENT (sym) != absolute_section)
5240
        continue;
5241
 
5242
      csect = symbol_create (".abs[XO]", absolute_section,
5243
                             S_GET_VALUE (sym), &zero_address_frag);
5244
      symbol_get_bfdsym (csect)->value = S_GET_VALUE (sym);
5245
      S_SET_STORAGE_CLASS (csect, C_HIDEXT);
5246
      i = S_GET_NUMBER_AUXILIARY (csect);
5247
      S_SET_NUMBER_AUXILIARY (csect, i + 1);
5248
      a = &coffsymbol (symbol_get_bfdsym (csect))->native[i + 1].u.auxent;
5249
      a->x_csect.x_scnlen.l = 0;
5250
      a->x_csect.x_smtyp = XTY_SD;
5251
      a->x_csect.x_parmhash = 0;
5252
      a->x_csect.x_snhash = 0;
5253
      a->x_csect.x_smclas = XMC_XO;
5254
      a->x_csect.x_stab = 0;
5255
      a->x_csect.x_snstab = 0;
5256
 
5257
      symbol_insert (csect, sym, &symbol_rootP, &symbol_lastP);
5258
 
5259
      i = S_GET_NUMBER_AUXILIARY (sym);
5260
      a = &coffsymbol (symbol_get_bfdsym (sym))->native[i].u.auxent;
5261
      a->x_csect.x_scnlen.p = coffsymbol (symbol_get_bfdsym (csect))->native;
5262
      coffsymbol (symbol_get_bfdsym (sym))->native[i].fix_scnlen = 1;
5263
    }
5264
 
5265
  ppc_saw_abs = FALSE;
5266
}
5267
 
5268
/* Set the VMA for a section.  This is called on all the sections in
5269
   turn.  */
5270
 
5271
void
5272
ppc_frob_section (asection *sec)
5273
{
5274
  static bfd_vma vma = 0;
5275
 
5276
  vma = md_section_align (sec, vma);
5277
  bfd_set_section_vma (stdoutput, sec, vma);
5278
  vma += bfd_section_size (stdoutput, sec);
5279
}
5280
 
5281
#endif /* OBJ_XCOFF */
5282
 
5283
char *
5284
md_atof (int type, char *litp, int *sizep)
5285
{
5286
  return ieee_md_atof (type, litp, sizep, target_big_endian);
5287
}
5288
 
5289
/* Write a value out to the object file, using the appropriate
5290
   endianness.  */
5291
 
5292
void
5293
md_number_to_chars (char *buf, valueT val, int n)
5294
{
5295
  if (target_big_endian)
5296
    number_to_chars_bigendian (buf, val, n);
5297
  else
5298
    number_to_chars_littleendian (buf, val, n);
5299
}
5300
 
5301
/* Align a section (I don't know why this is machine dependent).  */
5302
 
5303
valueT
5304
md_section_align (asection *seg ATTRIBUTE_UNUSED, valueT addr)
5305
{
5306
#ifdef OBJ_ELF
5307
  return addr;
5308
#else
5309
  int align = bfd_get_section_alignment (stdoutput, seg);
5310
 
5311
  return ((addr + (1 << align) - 1) & (-1 << align));
5312
#endif
5313
}
5314
 
5315
/* We don't have any form of relaxing.  */
5316
 
5317
int
5318
md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
5319
                               asection *seg ATTRIBUTE_UNUSED)
5320
{
5321
  abort ();
5322
  return 0;
5323
}
5324
 
5325
/* Convert a machine dependent frag.  We never generate these.  */
5326
 
5327
void
5328
md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
5329
                 asection *sec ATTRIBUTE_UNUSED,
5330
                 fragS *fragp ATTRIBUTE_UNUSED)
5331
{
5332
  abort ();
5333
}
5334
 
5335
/* We have no need to default values of symbols.  */
5336
 
5337
symbolS *
5338
md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
5339
{
5340
  return 0;
5341
}
5342
 
5343
/* Functions concerning relocs.  */
5344
 
5345
/* The location from which a PC relative jump should be calculated,
5346
   given a PC relative reloc.  */
5347
 
5348
long
5349
md_pcrel_from_section (fixS *fixp, segT sec ATTRIBUTE_UNUSED)
5350
{
5351
  return fixp->fx_frag->fr_address + fixp->fx_where;
5352
}
5353
 
5354
#ifdef OBJ_XCOFF
5355
 
5356
/* This is called to see whether a fixup should be adjusted to use a
5357
   section symbol.  We take the opportunity to change a fixup against
5358
   a symbol in the TOC subsegment into a reloc against the
5359
   corresponding .tc symbol.  */
5360
 
5361
int
5362
ppc_fix_adjustable (fixS *fix)
5363
{
5364
  valueT val = resolve_symbol_value (fix->fx_addsy);
5365
  segT symseg = S_GET_SEGMENT (fix->fx_addsy);
5366
  TC_SYMFIELD_TYPE *tc;
5367
 
5368
  if (symseg == absolute_section)
5369
    return 0;
5370
 
5371
  if (ppc_toc_csect != (symbolS *) NULL
5372
      && fix->fx_addsy != ppc_toc_csect
5373
      && symseg == data_section
5374
      && val >= ppc_toc_frag->fr_address
5375
      && (ppc_after_toc_frag == (fragS *) NULL
5376
          || val < ppc_after_toc_frag->fr_address))
5377
    {
5378
      symbolS *sy;
5379
 
5380
      for (sy = symbol_next (ppc_toc_csect);
5381
           sy != (symbolS *) NULL;
5382
           sy = symbol_next (sy))
5383
        {
5384
          TC_SYMFIELD_TYPE *sy_tc = symbol_get_tc (sy);
5385
 
5386
          if (sy_tc->class == XMC_TC0)
5387
            continue;
5388
          if (sy_tc->class != XMC_TC)
5389
            break;
5390
          if (val == resolve_symbol_value (sy))
5391
            {
5392
              fix->fx_addsy = sy;
5393
              fix->fx_addnumber = val - ppc_toc_frag->fr_address;
5394
              return 0;
5395
            }
5396
        }
5397
 
5398
      as_bad_where (fix->fx_file, fix->fx_line,
5399
                    _("symbol in .toc does not match any .tc"));
5400
    }
5401
 
5402
  /* Possibly adjust the reloc to be against the csect.  */
5403
  tc = symbol_get_tc (fix->fx_addsy);
5404
  if (tc->subseg == 0
5405
      && tc->class != XMC_TC0
5406
      && tc->class != XMC_TC
5407
      && symseg != bss_section
5408
      /* Don't adjust if this is a reloc in the toc section.  */
5409
      && (symseg != data_section
5410
          || ppc_toc_csect == NULL
5411
          || val < ppc_toc_frag->fr_address
5412
          || (ppc_after_toc_frag != NULL
5413
              && val >= ppc_after_toc_frag->fr_address)))
5414
    {
5415
      symbolS *csect;
5416
      symbolS *next_csect;
5417
 
5418
      if (symseg == text_section)
5419
        csect = ppc_text_csects;
5420
      else if (symseg == data_section)
5421
        csect = ppc_data_csects;
5422
      else
5423
        abort ();
5424
 
5425
      /* Skip the initial dummy symbol.  */
5426
      csect = symbol_get_tc (csect)->next;
5427
 
5428
      if (csect != (symbolS *) NULL)
5429
        {
5430
          while ((next_csect = symbol_get_tc (csect)->next) != (symbolS *) NULL
5431
                 && (symbol_get_frag (next_csect)->fr_address <= val))
5432
            {
5433
              /* If the csect address equals the symbol value, then we
5434
                 have to look through the full symbol table to see
5435
                 whether this is the csect we want.  Note that we will
5436
                 only get here if the csect has zero length.  */
5437
              if (symbol_get_frag (csect)->fr_address == val
5438
                  && S_GET_VALUE (csect) == val)
5439
                {
5440
                  symbolS *scan;
5441
 
5442
                  for (scan = symbol_next (csect);
5443
                       scan != NULL;
5444
                       scan = symbol_next (scan))
5445
                    {
5446
                      if (symbol_get_tc (scan)->subseg != 0)
5447
                        break;
5448
                      if (scan == fix->fx_addsy)
5449
                        break;
5450
                    }
5451
 
5452
                  /* If we found the symbol before the next csect
5453
                     symbol, then this is the csect we want.  */
5454
                  if (scan == fix->fx_addsy)
5455
                    break;
5456
                }
5457
 
5458
              csect = next_csect;
5459
            }
5460
 
5461
          fix->fx_offset += val - symbol_get_frag (csect)->fr_address;
5462
          fix->fx_addsy = csect;
5463
        }
5464
      return 0;
5465
    }
5466
 
5467
  /* Adjust a reloc against a .lcomm symbol to be against the base
5468
     .lcomm.  */
5469
  if (symseg == bss_section
5470
      && ! S_IS_EXTERNAL (fix->fx_addsy))
5471
    {
5472
      symbolS *sy = symbol_get_frag (fix->fx_addsy)->fr_symbol;
5473
 
5474
      fix->fx_offset += val - resolve_symbol_value (sy);
5475
      fix->fx_addsy = sy;
5476
    }
5477
 
5478
  return 0;
5479
}
5480
 
5481
/* A reloc from one csect to another must be kept.  The assembler
5482
   will, of course, keep relocs between sections, and it will keep
5483
   absolute relocs, but we need to force it to keep PC relative relocs
5484
   between two csects in the same section.  */
5485
 
5486
int
5487
ppc_force_relocation (fixS *fix)
5488
{
5489
  /* At this point fix->fx_addsy should already have been converted to
5490
     a csect symbol.  If the csect does not include the fragment, then
5491
     we need to force the relocation.  */
5492
  if (fix->fx_pcrel
5493
      && fix->fx_addsy != NULL
5494
      && symbol_get_tc (fix->fx_addsy)->subseg != 0
5495
      && ((symbol_get_frag (fix->fx_addsy)->fr_address
5496
           > fix->fx_frag->fr_address)
5497
          || (symbol_get_tc (fix->fx_addsy)->next != NULL
5498
              && (symbol_get_frag (symbol_get_tc (fix->fx_addsy)->next)->fr_address
5499
                  <= fix->fx_frag->fr_address))))
5500
    return 1;
5501
 
5502
  return generic_force_reloc (fix);
5503
}
5504
 
5505
#endif /* OBJ_XCOFF */
5506
 
5507
#ifdef OBJ_ELF
5508
/* If this function returns non-zero, it guarantees that a relocation
5509
   will be emitted for a fixup.  */
5510
 
5511
int
5512
ppc_force_relocation (fixS *fix)
5513
{
5514
  /* Branch prediction relocations must force a relocation, as must
5515
     the vtable description relocs.  */
5516
  switch (fix->fx_r_type)
5517
    {
5518
    case BFD_RELOC_PPC_B16_BRTAKEN:
5519
    case BFD_RELOC_PPC_B16_BRNTAKEN:
5520
    case BFD_RELOC_PPC_BA16_BRTAKEN:
5521
    case BFD_RELOC_PPC_BA16_BRNTAKEN:
5522
    case BFD_RELOC_24_PLT_PCREL:
5523
    case BFD_RELOC_PPC64_TOC:
5524
      return 1;
5525
    default:
5526
      break;
5527
    }
5528
 
5529
  if (fix->fx_r_type >= BFD_RELOC_PPC_TLS
5530
      && fix->fx_r_type <= BFD_RELOC_PPC64_DTPREL16_HIGHESTA)
5531
    return 1;
5532
 
5533
  return generic_force_reloc (fix);
5534
}
5535
 
5536
int
5537
ppc_fix_adjustable (fixS *fix)
5538
{
5539
  return (fix->fx_r_type != BFD_RELOC_16_GOTOFF
5540
          && fix->fx_r_type != BFD_RELOC_LO16_GOTOFF
5541
          && fix->fx_r_type != BFD_RELOC_HI16_GOTOFF
5542
          && fix->fx_r_type != BFD_RELOC_HI16_S_GOTOFF
5543
          && fix->fx_r_type != BFD_RELOC_GPREL16
5544
          && fix->fx_r_type != BFD_RELOC_VTABLE_INHERIT
5545
          && fix->fx_r_type != BFD_RELOC_VTABLE_ENTRY
5546
          && !(fix->fx_r_type >= BFD_RELOC_PPC_TLS
5547
               && fix->fx_r_type <= BFD_RELOC_PPC64_DTPREL16_HIGHESTA));
5548
}
5549
#endif
5550
 
5551
/* Implement HANDLE_ALIGN.  This writes the NOP pattern into an
5552
   rs_align_code frag.  */
5553
 
5554
void
5555
ppc_handle_align (struct frag *fragP)
5556
{
5557
  valueT count = (fragP->fr_next->fr_address
5558
                  - (fragP->fr_address + fragP->fr_fix));
5559
 
5560
  if (count != 0 && (count & 3) == 0)
5561
    {
5562
      char *dest = fragP->fr_literal + fragP->fr_fix;
5563
 
5564
      fragP->fr_var = 4;
5565
      md_number_to_chars (dest, 0x60000000, 4);
5566
 
5567
      if ((ppc_cpu & PPC_OPCODE_POWER6) != 0)
5568
        {
5569
          /* For power6, we want the last nop to be a group terminating
5570
             one, "ori 1,1,0".  Do this by inserting an rs_fill frag
5571
             immediately after this one, with its address set to the last
5572
             nop location.  This will automatically reduce the number of
5573
             nops in the current frag by one.  */
5574
          if (count > 4)
5575
            {
5576
              struct frag *group_nop = xmalloc (SIZEOF_STRUCT_FRAG + 4);
5577
 
5578
              memcpy (group_nop, fragP, SIZEOF_STRUCT_FRAG);
5579
              group_nop->fr_address = group_nop->fr_next->fr_address - 4;
5580
              group_nop->fr_fix = 0;
5581
              group_nop->fr_offset = 1;
5582
              group_nop->fr_type = rs_fill;
5583
              fragP->fr_next = group_nop;
5584
              dest = group_nop->fr_literal;
5585
            }
5586
 
5587
          md_number_to_chars (dest, 0x60210000, 4);
5588
        }
5589
    }
5590
}
5591
 
5592
/* Apply a fixup to the object code.  This is called for all the
5593
   fixups we generated by the call to fix_new_exp, above.  In the call
5594
   above we used a reloc code which was the largest legal reloc code
5595
   plus the operand index.  Here we undo that to recover the operand
5596
   index.  At this point all symbol values should be fully resolved,
5597
   and we attempt to completely resolve the reloc.  If we can not do
5598
   that, we determine the correct reloc code and put it back in the
5599
   fixup.  */
5600
 
5601
void
5602
md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
5603
{
5604
  valueT value = * valP;
5605
 
5606
#ifdef OBJ_ELF
5607
  if (fixP->fx_addsy != NULL)
5608
    {
5609
      /* Hack around bfd_install_relocation brain damage.  */
5610
      if (fixP->fx_pcrel)
5611
        value += fixP->fx_frag->fr_address + fixP->fx_where;
5612
    }
5613
  else
5614
    fixP->fx_done = 1;
5615
#else
5616
  /* FIXME FIXME FIXME: The value we are passed in *valP includes
5617
     the symbol values.  If we are doing this relocation the code in
5618
     write.c is going to call bfd_install_relocation, which is also
5619
     going to use the symbol value.  That means that if the reloc is
5620
     fully resolved we want to use *valP since bfd_install_relocation is
5621
     not being used.
5622
     However, if the reloc is not fully resolved we do not want to use
5623
     *valP, and must use fx_offset instead.  However, if the reloc
5624
     is PC relative, we do want to use *valP since it includes the
5625
     result of md_pcrel_from.  This is confusing.  */
5626
  if (fixP->fx_addsy == (symbolS *) NULL)
5627
    fixP->fx_done = 1;
5628
 
5629
  else if (fixP->fx_pcrel)
5630
    ;
5631
 
5632
  else
5633
    value = fixP->fx_offset;
5634
#endif
5635
 
5636
  if (fixP->fx_subsy != (symbolS *) NULL)
5637
    {
5638
      /* We can't actually support subtracting a symbol.  */
5639
      as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
5640
    }
5641
 
5642
  if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
5643
    {
5644
      int opindex;
5645
      const struct powerpc_operand *operand;
5646
      char *where;
5647
      unsigned long insn;
5648
 
5649
      opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
5650
 
5651
      operand = &powerpc_operands[opindex];
5652
 
5653
#ifdef OBJ_XCOFF
5654
      /* An instruction like `lwz 9,sym(30)' when `sym' is not a TOC symbol
5655
         does not generate a reloc.  It uses the offset of `sym' within its
5656
         csect.  Other usages, such as `.long sym', generate relocs.  This
5657
         is the documented behaviour of non-TOC symbols.  */
5658
      if ((operand->flags & PPC_OPERAND_PARENS) != 0
5659
          && (operand->bitm & 0xfff0) == 0xfff0
5660
          && operand->shift == 0
5661
          && (operand->insert == NULL || ppc_obj64)
5662
          && fixP->fx_addsy != NULL
5663
          && symbol_get_tc (fixP->fx_addsy)->subseg != 0
5664
          && symbol_get_tc (fixP->fx_addsy)->class != XMC_TC
5665
          && symbol_get_tc (fixP->fx_addsy)->class != XMC_TC0
5666
          && S_GET_SEGMENT (fixP->fx_addsy) != bss_section)
5667
        {
5668
          value = fixP->fx_offset;
5669
          fixP->fx_done = 1;
5670
        }
5671
#endif
5672
 
5673
      /* Fetch the instruction, insert the fully resolved operand
5674
         value, and stuff the instruction back again.  */
5675
      where = fixP->fx_frag->fr_literal + fixP->fx_where;
5676
      if (target_big_endian)
5677
        insn = bfd_getb32 ((unsigned char *) where);
5678
      else
5679
        insn = bfd_getl32 ((unsigned char *) where);
5680
      insn = ppc_insert_operand (insn, operand, (offsetT) value,
5681
                                 fixP->tc_fix_data.ppc_cpu,
5682
                                 fixP->fx_file, fixP->fx_line);
5683
      if (target_big_endian)
5684
        bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
5685
      else
5686
        bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
5687
 
5688
      if (fixP->fx_done)
5689
        /* Nothing else to do here.  */
5690
        return;
5691
 
5692
      assert (fixP->fx_addsy != NULL);
5693
 
5694
      /* Determine a BFD reloc value based on the operand information.
5695
         We are only prepared to turn a few of the operands into
5696
         relocs.  */
5697
      if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
5698
          && operand->bitm == 0x3fffffc
5699
          && operand->shift == 0)
5700
        fixP->fx_r_type = BFD_RELOC_PPC_B26;
5701
      else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
5702
          && operand->bitm == 0xfffc
5703
          && operand->shift == 0)
5704
        {
5705
          fixP->fx_r_type = BFD_RELOC_PPC_B16;
5706
#ifdef OBJ_XCOFF
5707
          fixP->fx_size = 2;
5708
          if (target_big_endian)
5709
            fixP->fx_where += 2;
5710
#endif
5711
        }
5712
      else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0
5713
               && operand->bitm == 0x3fffffc
5714
               && operand->shift == 0)
5715
        fixP->fx_r_type = BFD_RELOC_PPC_BA26;
5716
      else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0
5717
               && operand->bitm == 0xfffc
5718
               && operand->shift == 0)
5719
        {
5720
          fixP->fx_r_type = BFD_RELOC_PPC_BA16;
5721
#ifdef OBJ_XCOFF
5722
          fixP->fx_size = 2;
5723
          if (target_big_endian)
5724
            fixP->fx_where += 2;
5725
#endif
5726
        }
5727
#if defined (OBJ_XCOFF) || defined (OBJ_ELF)
5728
      else if ((operand->flags & PPC_OPERAND_PARENS) != 0
5729
               && (operand->bitm & 0xfff0) == 0xfff0
5730
               && operand->shift == 0)
5731
        {
5732
          if (ppc_is_toc_sym (fixP->fx_addsy))
5733
            {
5734
              fixP->fx_r_type = BFD_RELOC_PPC_TOC16;
5735
#ifdef OBJ_ELF
5736
              if (ppc_obj64
5737
                  && (operand->flags & PPC_OPERAND_DS) != 0)
5738
                fixP->fx_r_type = BFD_RELOC_PPC64_TOC16_DS;
5739
#endif
5740
            }
5741
          else
5742
            {
5743
              fixP->fx_r_type = BFD_RELOC_16;
5744
#ifdef OBJ_ELF
5745
              if (ppc_obj64
5746
                  && (operand->flags & PPC_OPERAND_DS) != 0)
5747
                fixP->fx_r_type = BFD_RELOC_PPC64_ADDR16_DS;
5748
#endif
5749
            }
5750
          fixP->fx_size = 2;
5751
          if (target_big_endian)
5752
            fixP->fx_where += 2;
5753
        }
5754
#endif /* defined (OBJ_XCOFF) || defined (OBJ_ELF) */
5755
      else
5756
        {
5757
          char *sfile;
5758
          unsigned int sline;
5759
 
5760
          /* Use expr_symbol_where to see if this is an expression
5761
             symbol.  */
5762
          if (expr_symbol_where (fixP->fx_addsy, &sfile, &sline))
5763
            as_bad_where (fixP->fx_file, fixP->fx_line,
5764
                          _("unresolved expression that must be resolved"));
5765
          else
5766
            as_bad_where (fixP->fx_file, fixP->fx_line,
5767
                          _("unsupported relocation against %s"),
5768
                          S_GET_NAME (fixP->fx_addsy));
5769
          fixP->fx_done = 1;
5770
          return;
5771
        }
5772
    }
5773
  else
5774
    {
5775
#ifdef OBJ_ELF
5776
      ppc_elf_validate_fix (fixP, seg);
5777
#endif
5778
      switch (fixP->fx_r_type)
5779
        {
5780
        case BFD_RELOC_CTOR:
5781
          if (ppc_obj64)
5782
            goto ctor64;
5783
          /* fall through */
5784
 
5785
        case BFD_RELOC_32:
5786
          if (fixP->fx_pcrel)
5787
            fixP->fx_r_type = BFD_RELOC_32_PCREL;
5788
          /* fall through */
5789
 
5790
        case BFD_RELOC_RVA:
5791
        case BFD_RELOC_32_PCREL:
5792
        case BFD_RELOC_PPC_EMB_NADDR32:
5793
          md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5794
                              value, 4);
5795
          break;
5796
 
5797
        case BFD_RELOC_64:
5798
        ctor64:
5799
          if (fixP->fx_pcrel)
5800
            fixP->fx_r_type = BFD_RELOC_64_PCREL;
5801
          /* fall through */
5802
 
5803
        case BFD_RELOC_64_PCREL:
5804
          md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5805
                              value, 8);
5806
          break;
5807
 
5808
        case BFD_RELOC_GPREL16:
5809
        case BFD_RELOC_16_GOT_PCREL:
5810
        case BFD_RELOC_16_GOTOFF:
5811
        case BFD_RELOC_LO16_GOTOFF:
5812
        case BFD_RELOC_HI16_GOTOFF:
5813
        case BFD_RELOC_HI16_S_GOTOFF:
5814
        case BFD_RELOC_16_BASEREL:
5815
        case BFD_RELOC_LO16_BASEREL:
5816
        case BFD_RELOC_HI16_BASEREL:
5817
        case BFD_RELOC_HI16_S_BASEREL:
5818
        case BFD_RELOC_PPC_EMB_NADDR16:
5819
        case BFD_RELOC_PPC_EMB_NADDR16_LO:
5820
        case BFD_RELOC_PPC_EMB_NADDR16_HI:
5821
        case BFD_RELOC_PPC_EMB_NADDR16_HA:
5822
        case BFD_RELOC_PPC_EMB_SDAI16:
5823
        case BFD_RELOC_PPC_EMB_SDA2REL:
5824
        case BFD_RELOC_PPC_EMB_SDA2I16:
5825
        case BFD_RELOC_PPC_EMB_RELSEC16:
5826
        case BFD_RELOC_PPC_EMB_RELST_LO:
5827
        case BFD_RELOC_PPC_EMB_RELST_HI:
5828
        case BFD_RELOC_PPC_EMB_RELST_HA:
5829
        case BFD_RELOC_PPC_EMB_RELSDA:
5830
        case BFD_RELOC_PPC_TOC16:
5831
#ifdef OBJ_ELF
5832
        case BFD_RELOC_PPC64_TOC16_LO:
5833
        case BFD_RELOC_PPC64_TOC16_HI:
5834
        case BFD_RELOC_PPC64_TOC16_HA:
5835
#endif
5836
          if (fixP->fx_pcrel)
5837
            {
5838
              if (fixP->fx_addsy != NULL)
5839
                as_bad_where (fixP->fx_file, fixP->fx_line,
5840
                              _("cannot emit PC relative %s relocation against %s"),
5841
                              bfd_get_reloc_code_name (fixP->fx_r_type),
5842
                              S_GET_NAME (fixP->fx_addsy));
5843
              else
5844
                as_bad_where (fixP->fx_file, fixP->fx_line,
5845
                              _("cannot emit PC relative %s relocation"),
5846
                              bfd_get_reloc_code_name (fixP->fx_r_type));
5847
            }
5848
 
5849
          md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5850
                              value, 2);
5851
          break;
5852
 
5853
        case BFD_RELOC_16:
5854
          if (fixP->fx_pcrel)
5855
            fixP->fx_r_type = BFD_RELOC_16_PCREL;
5856
          /* fall through */
5857
 
5858
        case BFD_RELOC_16_PCREL:
5859
          md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5860
                              value, 2);
5861
          break;
5862
 
5863
        case BFD_RELOC_LO16:
5864
          if (fixP->fx_pcrel)
5865
            fixP->fx_r_type = BFD_RELOC_LO16_PCREL;
5866
          /* fall through */
5867
 
5868
        case BFD_RELOC_LO16_PCREL:
5869
          md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5870
                              value, 2);
5871
          break;
5872
 
5873
          /* This case happens when you write, for example,
5874
             lis %r3,(L1-L2)@ha
5875
             where L1 and L2 are defined later.  */
5876
        case BFD_RELOC_HI16:
5877
          if (fixP->fx_pcrel)
5878
            fixP->fx_r_type = BFD_RELOC_HI16_PCREL;
5879
          /* fall through */
5880
 
5881
        case BFD_RELOC_HI16_PCREL:
5882
          md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5883
                              PPC_HI (value), 2);
5884
          break;
5885
 
5886
        case BFD_RELOC_HI16_S:
5887
          if (fixP->fx_pcrel)
5888
            fixP->fx_r_type = BFD_RELOC_HI16_S_PCREL;
5889
          /* fall through */
5890
 
5891
        case BFD_RELOC_HI16_S_PCREL:
5892
          md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5893
                              PPC_HA (value), 2);
5894
          break;
5895
 
5896
#ifdef OBJ_ELF
5897
        case BFD_RELOC_PPC64_HIGHER:
5898
          if (fixP->fx_pcrel)
5899
            abort ();
5900
          md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5901
                              PPC_HIGHER (value), 2);
5902
          break;
5903
 
5904
        case BFD_RELOC_PPC64_HIGHER_S:
5905
          if (fixP->fx_pcrel)
5906
            abort ();
5907
          md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5908
                              PPC_HIGHERA (value), 2);
5909
          break;
5910
 
5911
        case BFD_RELOC_PPC64_HIGHEST:
5912
          if (fixP->fx_pcrel)
5913
            abort ();
5914
          md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5915
                              PPC_HIGHEST (value), 2);
5916
          break;
5917
 
5918
        case BFD_RELOC_PPC64_HIGHEST_S:
5919
          if (fixP->fx_pcrel)
5920
            abort ();
5921
          md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5922
                              PPC_HIGHESTA (value), 2);
5923
          break;
5924
 
5925
        case BFD_RELOC_PPC64_ADDR16_DS:
5926
        case BFD_RELOC_PPC64_ADDR16_LO_DS:
5927
        case BFD_RELOC_PPC64_GOT16_DS:
5928
        case BFD_RELOC_PPC64_GOT16_LO_DS:
5929
        case BFD_RELOC_PPC64_PLT16_LO_DS:
5930
        case BFD_RELOC_PPC64_SECTOFF_DS:
5931
        case BFD_RELOC_PPC64_SECTOFF_LO_DS:
5932
        case BFD_RELOC_PPC64_TOC16_DS:
5933
        case BFD_RELOC_PPC64_TOC16_LO_DS:
5934
        case BFD_RELOC_PPC64_PLTGOT16_DS:
5935
        case BFD_RELOC_PPC64_PLTGOT16_LO_DS:
5936
          if (fixP->fx_pcrel)
5937
            abort ();
5938
          {
5939
            char *where = fixP->fx_frag->fr_literal + fixP->fx_where;
5940
            unsigned long val, mask;
5941
 
5942
            if (target_big_endian)
5943
              val = bfd_getb32 (where - 2);
5944
            else
5945
              val = bfd_getl32 (where);
5946
            mask = 0xfffc;
5947
            /* lq insns reserve the four lsbs.  */
5948
            if ((ppc_cpu & PPC_OPCODE_POWER4) != 0
5949
                && (val & (0x3f << 26)) == (56u << 26))
5950
              mask = 0xfff0;
5951
            val |= value & mask;
5952
            if (target_big_endian)
5953
              bfd_putb16 ((bfd_vma) val, where);
5954
            else
5955
              bfd_putl16 ((bfd_vma) val, where);
5956
          }
5957
          break;
5958
 
5959
        case BFD_RELOC_PPC_B16_BRTAKEN:
5960
        case BFD_RELOC_PPC_B16_BRNTAKEN:
5961
        case BFD_RELOC_PPC_BA16_BRTAKEN:
5962
        case BFD_RELOC_PPC_BA16_BRNTAKEN:
5963
          break;
5964
 
5965
        case BFD_RELOC_PPC_TLS:
5966
          break;
5967
 
5968
        case BFD_RELOC_PPC_DTPMOD:
5969
        case BFD_RELOC_PPC_TPREL16:
5970
        case BFD_RELOC_PPC_TPREL16_LO:
5971
        case BFD_RELOC_PPC_TPREL16_HI:
5972
        case BFD_RELOC_PPC_TPREL16_HA:
5973
        case BFD_RELOC_PPC_TPREL:
5974
        case BFD_RELOC_PPC_DTPREL16:
5975
        case BFD_RELOC_PPC_DTPREL16_LO:
5976
        case BFD_RELOC_PPC_DTPREL16_HI:
5977
        case BFD_RELOC_PPC_DTPREL16_HA:
5978
        case BFD_RELOC_PPC_DTPREL:
5979
        case BFD_RELOC_PPC_GOT_TLSGD16:
5980
        case BFD_RELOC_PPC_GOT_TLSGD16_LO:
5981
        case BFD_RELOC_PPC_GOT_TLSGD16_HI:
5982
        case BFD_RELOC_PPC_GOT_TLSGD16_HA:
5983
        case BFD_RELOC_PPC_GOT_TLSLD16:
5984
        case BFD_RELOC_PPC_GOT_TLSLD16_LO:
5985
        case BFD_RELOC_PPC_GOT_TLSLD16_HI:
5986
        case BFD_RELOC_PPC_GOT_TLSLD16_HA:
5987
        case BFD_RELOC_PPC_GOT_TPREL16:
5988
        case BFD_RELOC_PPC_GOT_TPREL16_LO:
5989
        case BFD_RELOC_PPC_GOT_TPREL16_HI:
5990
        case BFD_RELOC_PPC_GOT_TPREL16_HA:
5991
        case BFD_RELOC_PPC_GOT_DTPREL16:
5992
        case BFD_RELOC_PPC_GOT_DTPREL16_LO:
5993
        case BFD_RELOC_PPC_GOT_DTPREL16_HI:
5994
        case BFD_RELOC_PPC_GOT_DTPREL16_HA:
5995
        case BFD_RELOC_PPC64_TPREL16_DS:
5996
        case BFD_RELOC_PPC64_TPREL16_LO_DS:
5997
        case BFD_RELOC_PPC64_TPREL16_HIGHER:
5998
        case BFD_RELOC_PPC64_TPREL16_HIGHERA:
5999
        case BFD_RELOC_PPC64_TPREL16_HIGHEST:
6000
        case BFD_RELOC_PPC64_TPREL16_HIGHESTA:
6001
        case BFD_RELOC_PPC64_DTPREL16_DS:
6002
        case BFD_RELOC_PPC64_DTPREL16_LO_DS:
6003
        case BFD_RELOC_PPC64_DTPREL16_HIGHER:
6004
        case BFD_RELOC_PPC64_DTPREL16_HIGHERA:
6005
        case BFD_RELOC_PPC64_DTPREL16_HIGHEST:
6006
        case BFD_RELOC_PPC64_DTPREL16_HIGHESTA:
6007
          S_SET_THREAD_LOCAL (fixP->fx_addsy);
6008
          break;
6009
#endif
6010
          /* Because SDA21 modifies the register field, the size is set to 4
6011
             bytes, rather than 2, so offset it here appropriately.  */
6012
        case BFD_RELOC_PPC_EMB_SDA21:
6013
          if (fixP->fx_pcrel)
6014
            abort ();
6015
 
6016
          md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where
6017
                              + ((target_big_endian) ? 2 : 0),
6018
                              value, 2);
6019
          break;
6020
 
6021
        case BFD_RELOC_8:
6022
          if (fixP->fx_pcrel)
6023
            {
6024
              /* This can occur if there is a bug in the input assembler, eg:
6025
                 ".byte <undefined_symbol> - ."  */
6026
              if (fixP->fx_addsy)
6027
                as_bad (_("Unable to handle reference to symbol %s"),
6028
                        S_GET_NAME (fixP->fx_addsy));
6029
              else
6030
                as_bad (_("Unable to resolve expression"));
6031
              fixP->fx_done = 1;
6032
            }
6033
          else
6034
            md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
6035
                                value, 1);
6036
          break;
6037
 
6038
        case BFD_RELOC_24_PLT_PCREL:
6039
        case BFD_RELOC_PPC_LOCAL24PC:
6040
          if (!fixP->fx_pcrel && !fixP->fx_done)
6041
            abort ();
6042
 
6043
          if (fixP->fx_done)
6044
            {
6045
              char *where;
6046
              unsigned long insn;
6047
 
6048
              /* Fetch the instruction, insert the fully resolved operand
6049
                 value, and stuff the instruction back again.  */
6050
              where = fixP->fx_frag->fr_literal + fixP->fx_where;
6051
              if (target_big_endian)
6052
                insn = bfd_getb32 ((unsigned char *) where);
6053
              else
6054
                insn = bfd_getl32 ((unsigned char *) where);
6055
              if ((value & 3) != 0)
6056
                as_bad_where (fixP->fx_file, fixP->fx_line,
6057
                              _("must branch to an address a multiple of 4"));
6058
              if ((offsetT) value < -0x40000000
6059
                  || (offsetT) value >= 0x40000000)
6060
                as_bad_where (fixP->fx_file, fixP->fx_line,
6061
                              _("@local or @plt branch destination is too far away, %ld bytes"),
6062
                              (long) value);
6063
              insn = insn | (value & 0x03fffffc);
6064
              if (target_big_endian)
6065
                bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
6066
              else
6067
                bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
6068
            }
6069
          break;
6070
 
6071
        case BFD_RELOC_VTABLE_INHERIT:
6072
          fixP->fx_done = 0;
6073
          if (fixP->fx_addsy
6074
              && !S_IS_DEFINED (fixP->fx_addsy)
6075
              && !S_IS_WEAK (fixP->fx_addsy))
6076
            S_SET_WEAK (fixP->fx_addsy);
6077
          break;
6078
 
6079
        case BFD_RELOC_VTABLE_ENTRY:
6080
          fixP->fx_done = 0;
6081
          break;
6082
 
6083
#ifdef OBJ_ELF
6084
          /* Generated by reference to `sym@tocbase'.  The sym is
6085
             ignored by the linker.  */
6086
        case BFD_RELOC_PPC64_TOC:
6087
          fixP->fx_done = 0;
6088
          break;
6089
#endif
6090
        default:
6091
          fprintf (stderr,
6092
                   _("Gas failure, reloc value %d\n"), fixP->fx_r_type);
6093
          fflush (stderr);
6094
          abort ();
6095
        }
6096
    }
6097
 
6098
#ifdef OBJ_ELF
6099
  fixP->fx_addnumber = value;
6100
 
6101
  /* PowerPC uses RELA relocs, ie. the reloc addend is stored separately
6102
     from the section contents.  If we are going to be emitting a reloc
6103
     then the section contents are immaterial, so don't warn if they
6104
     happen to overflow.  Leave such warnings to ld.  */
6105
  if (!fixP->fx_done)
6106
    fixP->fx_no_overflow = 1;
6107
#else
6108
  if (fixP->fx_r_type != BFD_RELOC_PPC_TOC16)
6109
    fixP->fx_addnumber = 0;
6110
  else
6111
    {
6112
#ifdef TE_PE
6113
      fixP->fx_addnumber = 0;
6114
#else
6115
      /* We want to use the offset within the toc, not the actual VMA
6116
         of the symbol.  */
6117
      fixP->fx_addnumber =
6118
        - bfd_get_section_vma (stdoutput, S_GET_SEGMENT (fixP->fx_addsy))
6119
        - S_GET_VALUE (ppc_toc_csect);
6120
#endif
6121
    }
6122
#endif
6123
}
6124
 
6125
/* Generate a reloc for a fixup.  */
6126
 
6127
arelent *
6128
tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
6129
{
6130
  arelent *reloc;
6131
 
6132
  reloc = (arelent *) xmalloc (sizeof (arelent));
6133
 
6134
  reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
6135
  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
6136
  reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
6137
  reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
6138
  if (reloc->howto == (reloc_howto_type *) NULL)
6139
    {
6140
      as_bad_where (fixp->fx_file, fixp->fx_line,
6141
                    _("reloc %d not supported by object file format"),
6142
                    (int) fixp->fx_r_type);
6143
      return NULL;
6144
    }
6145
  reloc->addend = fixp->fx_addnumber;
6146
 
6147
  return reloc;
6148
}
6149
 
6150
void
6151
ppc_cfi_frame_initial_instructions (void)
6152
{
6153
  cfi_add_CFA_def_cfa (1, 0);
6154
}
6155
 
6156
int
6157
tc_ppc_regname_to_dw2regnum (char *regname)
6158
{
6159
  unsigned int regnum = -1;
6160
  unsigned int i;
6161
  const char *p;
6162
  char *q;
6163
  static struct { char *name; int dw2regnum; } regnames[] =
6164
    {
6165
      { "sp", 1 }, { "r.sp", 1 }, { "rtoc", 2 }, { "r.toc", 2 },
6166
      { "mq", 64 }, { "lr", 65 }, { "ctr", 66 }, { "ap", 67 },
6167
      { "cr", 70 }, { "xer", 76 }, { "vrsave", 109 }, { "vscr", 110 },
6168
      { "spe_acc", 111 }, { "spefscr", 112 }
6169
    };
6170
 
6171
  for (i = 0; i < ARRAY_SIZE (regnames); ++i)
6172
    if (strcmp (regnames[i].name, regname) == 0)
6173
      return regnames[i].dw2regnum;
6174
 
6175
  if (regname[0] == 'r' || regname[0] == 'f' || regname[0] == 'v')
6176
    {
6177
      p = regname + 1 + (regname[1] == '.');
6178
      regnum = strtoul (p, &q, 10);
6179
      if (p == q || *q || regnum >= 32)
6180
        return -1;
6181
      if (regname[0] == 'f')
6182
        regnum += 32;
6183
      else if (regname[0] == 'v')
6184
        regnum += 77;
6185
    }
6186
  else if (regname[0] == 'c' && regname[1] == 'r')
6187
    {
6188
      p = regname + 2 + (regname[2] == '.');
6189
      if (p[0] < '0' || p[0] > '7' || p[1])
6190
        return -1;
6191
      regnum = p[0] - '0' + 68;
6192
    }
6193
  return regnum;
6194
}

powered by: WebSVN 2.1.0

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