Automatic date update in version.in
[deliverable/binutils-gdb.git] / gas / config / tc-ppc.c
CommitLineData
252b5132 1/* tc-ppc.c -- Assemble for the PowerPC or POWER (RS/6000)
82704155 2 Copyright (C) 1994-2019 Free Software Foundation, Inc.
252b5132
RH
3 Written by Ian Lance Taylor, Cygnus Support.
4
5 This file is part of GAS, the GNU Assembler.
6
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
ec2655a6 9 the Free Software Foundation; either version 3, or (at your option)
252b5132
RH
10 any later version.
11
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
4b4da160
NC
19 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20 02110-1301, USA. */
252b5132 21
252b5132 22#include "as.h"
3882b010 23#include "safe-ctype.h"
252b5132 24#include "subsegs.h"
75e21f08 25#include "dw2gencfi.h"
252b5132
RH
26#include "opcode/ppc.h"
27
28#ifdef OBJ_ELF
29#include "elf/ppc.h"
ee67d69a 30#include "elf/ppc64.h"
5d6f4f16 31#include "dwarf2dbg.h"
252b5132
RH
32#endif
33
34#ifdef TE_PE
35#include "coff/pe.h"
36#endif
37
85645aed
TG
38#ifdef OBJ_XCOFF
39#include "coff/xcoff.h"
40#include "libxcoff.h"
41#endif
42
252b5132
RH
43/* This is the assembler for the PowerPC or POWER (RS/6000) chips. */
44
45/* Tell the main code what the endianness is. */
46extern int target_big_endian;
47
48/* Whether or not, we've set target_big_endian. */
49static int set_target_endian = 0;
50
51/* Whether to use user friendly register names. */
52#ifndef TARGET_REG_NAMES_P
53#ifdef TE_PE
b34976b6 54#define TARGET_REG_NAMES_P TRUE
252b5132 55#else
b34976b6 56#define TARGET_REG_NAMES_P FALSE
252b5132
RH
57#endif
58#endif
59
0baf16f2
AM
60/* Macros for calculating LO, HI, HA, HIGHER, HIGHERA, HIGHEST,
61 HIGHESTA. */
62
63/* #lo(value) denotes the least significant 16 bits of the indicated. */
64#define PPC_LO(v) ((v) & 0xffff)
65
66/* #hi(value) denotes bits 16 through 31 of the indicated value. */
67#define PPC_HI(v) (((v) >> 16) & 0xffff)
68
69/* #ha(value) denotes the high adjusted value: bits 16 through 31 of
70 the indicated value, compensating for #lo() being treated as a
71 signed number. */
15c1449b 72#define PPC_HA(v) PPC_HI ((v) + 0x8000)
0baf16f2
AM
73
74/* #higher(value) denotes bits 32 through 47 of the indicated value. */
2a98c3a6 75#define PPC_HIGHER(v) (((v) >> 16 >> 16) & 0xffff)
0baf16f2
AM
76
77/* #highera(value) denotes bits 32 through 47 of the indicated value,
78 compensating for #lo() being treated as a signed number. */
15c1449b 79#define PPC_HIGHERA(v) PPC_HIGHER ((v) + 0x8000)
0baf16f2
AM
80
81/* #highest(value) denotes bits 48 through 63 of the indicated value. */
2a98c3a6 82#define PPC_HIGHEST(v) (((v) >> 24 >> 24) & 0xffff)
0baf16f2
AM
83
84/* #highesta(value) denotes bits 48 through 63 of the indicated value,
15c1449b
AM
85 compensating for #lo being treated as a signed number. */
86#define PPC_HIGHESTA(v) PPC_HIGHEST ((v) + 0x8000)
0baf16f2 87
f9c6b907
AM
88#define SEX16(val) (((val) ^ 0x8000) - 0x8000)
89
90/* For the time being on ppc64, don't report overflow on @h and @ha
91 applied to constants. */
92#define REPORT_OVERFLOW_HI 0
0baf16f2 93
b34976b6 94static bfd_boolean reg_names_p = TARGET_REG_NAMES_P;
252b5132 95
98027b10
AM
96static void ppc_macro (char *, const struct powerpc_macro *);
97static void ppc_byte (int);
0baf16f2
AM
98
99#if defined (OBJ_XCOFF) || defined (OBJ_ELF)
98027b10
AM
100static void ppc_tc (int);
101static void ppc_machine (int);
0baf16f2 102#endif
252b5132
RH
103
104#ifdef OBJ_XCOFF
98027b10
AM
105static void ppc_comm (int);
106static void ppc_bb (int);
107static void ppc_bc (int);
108static void ppc_bf (int);
109static void ppc_biei (int);
110static void ppc_bs (int);
111static void ppc_eb (int);
112static void ppc_ec (int);
113static void ppc_ef (int);
114static void ppc_es (int);
115static void ppc_csect (int);
85645aed 116static void ppc_dwsect (int);
98027b10
AM
117static void ppc_change_csect (symbolS *, offsetT);
118static void ppc_function (int);
119static void ppc_extern (int);
120static void ppc_lglobl (int);
c865e45b 121static void ppc_ref (int);
98027b10
AM
122static void ppc_section (int);
123static void ppc_named_section (int);
124static void ppc_stabx (int);
125static void ppc_rename (int);
126static void ppc_toc (int);
127static void ppc_xcoff_cons (int);
128static void ppc_vbyte (int);
252b5132
RH
129#endif
130
131#ifdef OBJ_ELF
98027b10
AM
132static void ppc_elf_rdata (int);
133static void ppc_elf_lcomm (int);
6911b7dc 134static void ppc_elf_localentry (int);
ee67d69a 135static void ppc_elf_abiversion (int);
005d79fd 136static void ppc_elf_gnu_attribute (int);
252b5132
RH
137#endif
138
139#ifdef TE_PE
98027b10
AM
140static void ppc_previous (int);
141static void ppc_pdata (int);
142static void ppc_ydata (int);
143static void ppc_reldata (int);
144static void ppc_rdata (int);
145static void ppc_ualong (int);
146static void ppc_znop (int);
147static void ppc_pe_comm (int);
148static void ppc_pe_section (int);
149static void ppc_pe_function (int);
150static void ppc_pe_tocd (int);
252b5132
RH
151#endif
152\f
153/* Generic assembler global variables which must be defined by all
154 targets. */
155
156#ifdef OBJ_ELF
157/* This string holds the chars that always start a comment. If the
158 pre-processor is disabled, these aren't very useful. The macro
159 tc_comment_chars points to this. We use this, rather than the
160 usual comment_chars, so that we can switch for Solaris conventions. */
161static const char ppc_solaris_comment_chars[] = "#!";
162static const char ppc_eabi_comment_chars[] = "#";
163
164#ifdef TARGET_SOLARIS_COMMENT
165const char *ppc_comment_chars = ppc_solaris_comment_chars;
166#else
167const char *ppc_comment_chars = ppc_eabi_comment_chars;
168#endif
169#else
170const char comment_chars[] = "#";
171#endif
172
173/* Characters which start a comment at the beginning of a line. */
174const char line_comment_chars[] = "#";
175
176/* Characters which may be used to separate multiple commands on a
177 single line. */
178const char line_separator_chars[] = ";";
179
180/* Characters which are used to indicate an exponent in a floating
181 point number. */
182const char EXP_CHARS[] = "eE";
183
184/* Characters which mean that a number is a floating point constant,
185 as in 0d1.0. */
186const char FLT_CHARS[] = "dD";
5ce8663f 187
5e02f92e 188/* Anything that can start an operand needs to be mentioned here,
ac805826 189 to stop the input scrubber eating whitespace. */
5e02f92e 190const char ppc_symbol_chars[] = "%[";
75e21f08
JJ
191
192/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
193int ppc_cie_data_alignment;
783de163 194
8fbf7334
JL
195/* The dwarf2 minimum instruction length. */
196int ppc_dwarf2_line_min_insn_length;
197
cef4f754
AM
198/* More than this number of nops in an alignment op gets a branch
199 instead. */
200unsigned long nop_limit = 4;
201
783de163
AM
202/* The type of processor we are assembling for. This is one or more
203 of the PPC_OPCODE flags defined in opcode/ppc.h. */
fa452fa6 204ppc_cpu_t ppc_cpu = 0;
776fc418 205ppc_cpu_t sticky = 0;
01efc3af 206
ee67d69a
AM
207/* Value for ELF e_flags EF_PPC64_ABI. */
208unsigned int ppc_abiversion = 0;
209
05f7541e 210#ifdef OBJ_ELF
01efc3af 211/* Flags set on encountering toc relocs. */
4f2a7b51 212static enum {
01efc3af
AM
213 has_large_toc_reloc = 1,
214 has_small_toc_reloc = 2
215} toc_reloc_types;
05f7541e 216#endif
bf7279d5
AM
217
218/* Warn on emitting data to code sections. */
219int warn_476;
0f873fd5 220uint64_t last_insn;
bf7279d5
AM
221segT last_seg;
222subsegT last_subseg;
252b5132
RH
223\f
224/* The target specific pseudo-ops which we support. */
225
226const pseudo_typeS md_pseudo_table[] =
227{
228 /* Pseudo-ops which must be overridden. */
229 { "byte", ppc_byte, 0 },
230
231#ifdef OBJ_XCOFF
232 /* Pseudo-ops specific to the RS/6000 XCOFF format. Some of these
233 legitimately belong in the obj-*.c file. However, XCOFF is based
234 on COFF, and is only implemented for the RS/6000. We just use
235 obj-coff.c, and add what we need here. */
236 { "comm", ppc_comm, 0 },
237 { "lcomm", ppc_comm, 1 },
238 { "bb", ppc_bb, 0 },
239 { "bc", ppc_bc, 0 },
240 { "bf", ppc_bf, 0 },
241 { "bi", ppc_biei, 0 },
242 { "bs", ppc_bs, 0 },
243 { "csect", ppc_csect, 0 },
85645aed 244 { "dwsect", ppc_dwsect, 0 },
252b5132
RH
245 { "data", ppc_section, 'd' },
246 { "eb", ppc_eb, 0 },
247 { "ec", ppc_ec, 0 },
248 { "ef", ppc_ef, 0 },
249 { "ei", ppc_biei, 1 },
250 { "es", ppc_es, 0 },
251 { "extern", ppc_extern, 0 },
252 { "function", ppc_function, 0 },
253 { "lglobl", ppc_lglobl, 0 },
c865e45b 254 { "ref", ppc_ref, 0 },
252b5132
RH
255 { "rename", ppc_rename, 0 },
256 { "section", ppc_named_section, 0 },
257 { "stabx", ppc_stabx, 0 },
258 { "text", ppc_section, 't' },
259 { "toc", ppc_toc, 0 },
260 { "long", ppc_xcoff_cons, 2 },
7f6d05e8 261 { "llong", ppc_xcoff_cons, 3 },
252b5132
RH
262 { "word", ppc_xcoff_cons, 1 },
263 { "short", ppc_xcoff_cons, 1 },
264 { "vbyte", ppc_vbyte, 0 },
265#endif
266
267#ifdef OBJ_ELF
62ebcb5c 268 { "llong", cons, 8 },
252b5132
RH
269 { "rdata", ppc_elf_rdata, 0 },
270 { "rodata", ppc_elf_rdata, 0 },
271 { "lcomm", ppc_elf_lcomm, 0 },
6911b7dc 272 { "localentry", ppc_elf_localentry, 0 },
ee67d69a 273 { "abiversion", ppc_elf_abiversion, 0 },
005d79fd 274 { "gnu_attribute", ppc_elf_gnu_attribute, 0},
252b5132
RH
275#endif
276
277#ifdef TE_PE
99a814a1 278 /* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format. */
252b5132
RH
279 { "previous", ppc_previous, 0 },
280 { "pdata", ppc_pdata, 0 },
281 { "ydata", ppc_ydata, 0 },
282 { "reldata", ppc_reldata, 0 },
283 { "rdata", ppc_rdata, 0 },
284 { "ualong", ppc_ualong, 0 },
285 { "znop", ppc_znop, 0 },
286 { "comm", ppc_pe_comm, 0 },
287 { "lcomm", ppc_pe_comm, 1 },
288 { "section", ppc_pe_section, 0 },
289 { "function", ppc_pe_function,0 },
290 { "tocd", ppc_pe_tocd, 0 },
291#endif
292
0baf16f2 293#if defined (OBJ_XCOFF) || defined (OBJ_ELF)
252b5132 294 { "tc", ppc_tc, 0 },
0baf16f2
AM
295 { "machine", ppc_machine, 0 },
296#endif
252b5132
RH
297
298 { NULL, NULL, 0 }
299};
300
301\f
99a814a1
AM
302/* Predefined register names if -mregnames (or default for Windows NT).
303 In general, there are lots of them, in an attempt to be compatible
304 with a number of other Windows NT assemblers. */
252b5132
RH
305
306/* Structure to hold information about predefined registers. */
307struct pd_reg
308 {
e0471c16 309 const char *name;
7e0de605
AM
310 unsigned short value;
311 unsigned short flags;
252b5132
RH
312 };
313
314/* List of registers that are pre-defined:
315
316 Each general register has predefined names of the form:
317 1. r<reg_num> which has the value <reg_num>.
318 2. r.<reg_num> which has the value <reg_num>.
319
252b5132
RH
320 Each floating point register has predefined names of the form:
321 1. f<reg_num> which has the value <reg_num>.
322 2. f.<reg_num> which has the value <reg_num>.
323
7a899fff
C
324 Each vector unit register has predefined names of the form:
325 1. v<reg_num> which has the value <reg_num>.
326 2. v.<reg_num> which has the value <reg_num>.
327
252b5132
RH
328 Each condition register has predefined names of the form:
329 1. cr<reg_num> which has the value <reg_num>.
330 2. cr.<reg_num> which has the value <reg_num>.
331
332 There are individual registers as well:
333 sp or r.sp has the value 1
334 rtoc or r.toc has the value 2
252b5132
RH
335 xer has the value 1
336 lr has the value 8
337 ctr has the value 9
252b5132
RH
338 dar has the value 19
339 dsisr has the value 18
340 dec has the value 22
341 sdr1 has the value 25
342 srr0 has the value 26
343 srr1 has the value 27
344
81d4177b 345 The table is sorted. Suitable for searching by a binary search. */
252b5132
RH
346
347static const struct pd_reg pre_defined_registers[] =
348{
7e0de605
AM
349 /* Condition Registers */
350 { "cr.0", 0, PPC_OPERAND_CR_REG },
351 { "cr.1", 1, PPC_OPERAND_CR_REG },
352 { "cr.2", 2, PPC_OPERAND_CR_REG },
353 { "cr.3", 3, PPC_OPERAND_CR_REG },
354 { "cr.4", 4, PPC_OPERAND_CR_REG },
355 { "cr.5", 5, PPC_OPERAND_CR_REG },
356 { "cr.6", 6, PPC_OPERAND_CR_REG },
357 { "cr.7", 7, PPC_OPERAND_CR_REG },
358
359 { "cr0", 0, PPC_OPERAND_CR_REG },
360 { "cr1", 1, PPC_OPERAND_CR_REG },
361 { "cr2", 2, PPC_OPERAND_CR_REG },
362 { "cr3", 3, PPC_OPERAND_CR_REG },
363 { "cr4", 4, PPC_OPERAND_CR_REG },
364 { "cr5", 5, PPC_OPERAND_CR_REG },
365 { "cr6", 6, PPC_OPERAND_CR_REG },
366 { "cr7", 7, PPC_OPERAND_CR_REG },
367
368 { "ctr", 9, PPC_OPERAND_SPR },
369 { "dar", 19, PPC_OPERAND_SPR },
370 { "dec", 22, PPC_OPERAND_SPR },
371 { "dsisr", 18, PPC_OPERAND_SPR },
372
373 /* Floating point registers */
374 { "f.0", 0, PPC_OPERAND_FPR },
375 { "f.1", 1, PPC_OPERAND_FPR },
376 { "f.10", 10, PPC_OPERAND_FPR },
377 { "f.11", 11, PPC_OPERAND_FPR },
378 { "f.12", 12, PPC_OPERAND_FPR },
379 { "f.13", 13, PPC_OPERAND_FPR },
380 { "f.14", 14, PPC_OPERAND_FPR },
381 { "f.15", 15, PPC_OPERAND_FPR },
382 { "f.16", 16, PPC_OPERAND_FPR },
383 { "f.17", 17, PPC_OPERAND_FPR },
384 { "f.18", 18, PPC_OPERAND_FPR },
385 { "f.19", 19, PPC_OPERAND_FPR },
386 { "f.2", 2, PPC_OPERAND_FPR },
387 { "f.20", 20, PPC_OPERAND_FPR },
388 { "f.21", 21, PPC_OPERAND_FPR },
389 { "f.22", 22, PPC_OPERAND_FPR },
390 { "f.23", 23, PPC_OPERAND_FPR },
391 { "f.24", 24, PPC_OPERAND_FPR },
392 { "f.25", 25, PPC_OPERAND_FPR },
393 { "f.26", 26, PPC_OPERAND_FPR },
394 { "f.27", 27, PPC_OPERAND_FPR },
395 { "f.28", 28, PPC_OPERAND_FPR },
396 { "f.29", 29, PPC_OPERAND_FPR },
397 { "f.3", 3, PPC_OPERAND_FPR },
398 { "f.30", 30, PPC_OPERAND_FPR },
399 { "f.31", 31, PPC_OPERAND_FPR },
400 { "f.32", 32, PPC_OPERAND_VSR },
401 { "f.33", 33, PPC_OPERAND_VSR },
402 { "f.34", 34, PPC_OPERAND_VSR },
403 { "f.35", 35, PPC_OPERAND_VSR },
404 { "f.36", 36, PPC_OPERAND_VSR },
405 { "f.37", 37, PPC_OPERAND_VSR },
406 { "f.38", 38, PPC_OPERAND_VSR },
407 { "f.39", 39, PPC_OPERAND_VSR },
408 { "f.4", 4, PPC_OPERAND_FPR },
409 { "f.40", 40, PPC_OPERAND_VSR },
410 { "f.41", 41, PPC_OPERAND_VSR },
411 { "f.42", 42, PPC_OPERAND_VSR },
412 { "f.43", 43, PPC_OPERAND_VSR },
413 { "f.44", 44, PPC_OPERAND_VSR },
414 { "f.45", 45, PPC_OPERAND_VSR },
415 { "f.46", 46, PPC_OPERAND_VSR },
416 { "f.47", 47, PPC_OPERAND_VSR },
417 { "f.48", 48, PPC_OPERAND_VSR },
418 { "f.49", 49, PPC_OPERAND_VSR },
419 { "f.5", 5, PPC_OPERAND_FPR },
420 { "f.50", 50, PPC_OPERAND_VSR },
421 { "f.51", 51, PPC_OPERAND_VSR },
422 { "f.52", 52, PPC_OPERAND_VSR },
423 { "f.53", 53, PPC_OPERAND_VSR },
424 { "f.54", 54, PPC_OPERAND_VSR },
425 { "f.55", 55, PPC_OPERAND_VSR },
426 { "f.56", 56, PPC_OPERAND_VSR },
427 { "f.57", 57, PPC_OPERAND_VSR },
428 { "f.58", 58, PPC_OPERAND_VSR },
429 { "f.59", 59, PPC_OPERAND_VSR },
430 { "f.6", 6, PPC_OPERAND_FPR },
431 { "f.60", 60, PPC_OPERAND_VSR },
432 { "f.61", 61, PPC_OPERAND_VSR },
433 { "f.62", 62, PPC_OPERAND_VSR },
434 { "f.63", 63, PPC_OPERAND_VSR },
435 { "f.7", 7, PPC_OPERAND_FPR },
436 { "f.8", 8, PPC_OPERAND_FPR },
437 { "f.9", 9, PPC_OPERAND_FPR },
438
439 { "f0", 0, PPC_OPERAND_FPR },
440 { "f1", 1, PPC_OPERAND_FPR },
441 { "f10", 10, PPC_OPERAND_FPR },
442 { "f11", 11, PPC_OPERAND_FPR },
443 { "f12", 12, PPC_OPERAND_FPR },
444 { "f13", 13, PPC_OPERAND_FPR },
445 { "f14", 14, PPC_OPERAND_FPR },
446 { "f15", 15, PPC_OPERAND_FPR },
447 { "f16", 16, PPC_OPERAND_FPR },
448 { "f17", 17, PPC_OPERAND_FPR },
449 { "f18", 18, PPC_OPERAND_FPR },
450 { "f19", 19, PPC_OPERAND_FPR },
451 { "f2", 2, PPC_OPERAND_FPR },
452 { "f20", 20, PPC_OPERAND_FPR },
453 { "f21", 21, PPC_OPERAND_FPR },
454 { "f22", 22, PPC_OPERAND_FPR },
455 { "f23", 23, PPC_OPERAND_FPR },
456 { "f24", 24, PPC_OPERAND_FPR },
457 { "f25", 25, PPC_OPERAND_FPR },
458 { "f26", 26, PPC_OPERAND_FPR },
459 { "f27", 27, PPC_OPERAND_FPR },
460 { "f28", 28, PPC_OPERAND_FPR },
461 { "f29", 29, PPC_OPERAND_FPR },
462 { "f3", 3, PPC_OPERAND_FPR },
463 { "f30", 30, PPC_OPERAND_FPR },
464 { "f31", 31, PPC_OPERAND_FPR },
465 { "f32", 32, PPC_OPERAND_VSR },
466 { "f33", 33, PPC_OPERAND_VSR },
467 { "f34", 34, PPC_OPERAND_VSR },
468 { "f35", 35, PPC_OPERAND_VSR },
469 { "f36", 36, PPC_OPERAND_VSR },
470 { "f37", 37, PPC_OPERAND_VSR },
471 { "f38", 38, PPC_OPERAND_VSR },
472 { "f39", 39, PPC_OPERAND_VSR },
473 { "f4", 4, PPC_OPERAND_FPR },
474 { "f40", 40, PPC_OPERAND_VSR },
475 { "f41", 41, PPC_OPERAND_VSR },
476 { "f42", 42, PPC_OPERAND_VSR },
477 { "f43", 43, PPC_OPERAND_VSR },
478 { "f44", 44, PPC_OPERAND_VSR },
479 { "f45", 45, PPC_OPERAND_VSR },
480 { "f46", 46, PPC_OPERAND_VSR },
481 { "f47", 47, PPC_OPERAND_VSR },
482 { "f48", 48, PPC_OPERAND_VSR },
483 { "f49", 49, PPC_OPERAND_VSR },
484 { "f5", 5, PPC_OPERAND_FPR },
485 { "f50", 50, PPC_OPERAND_VSR },
486 { "f51", 51, PPC_OPERAND_VSR },
487 { "f52", 52, PPC_OPERAND_VSR },
488 { "f53", 53, PPC_OPERAND_VSR },
489 { "f54", 54, PPC_OPERAND_VSR },
490 { "f55", 55, PPC_OPERAND_VSR },
491 { "f56", 56, PPC_OPERAND_VSR },
492 { "f57", 57, PPC_OPERAND_VSR },
493 { "f58", 58, PPC_OPERAND_VSR },
494 { "f59", 59, PPC_OPERAND_VSR },
495 { "f6", 6, PPC_OPERAND_FPR },
496 { "f60", 60, PPC_OPERAND_VSR },
497 { "f61", 61, PPC_OPERAND_VSR },
498 { "f62", 62, PPC_OPERAND_VSR },
499 { "f63", 63, PPC_OPERAND_VSR },
500 { "f7", 7, PPC_OPERAND_FPR },
501 { "f8", 8, PPC_OPERAND_FPR },
502 { "f9", 9, PPC_OPERAND_FPR },
252b5132 503
c3d65c1c 504 /* Quantization registers used with pair single instructions. */
7e0de605
AM
505 { "gqr.0", 0, PPC_OPERAND_GQR },
506 { "gqr.1", 1, PPC_OPERAND_GQR },
507 { "gqr.2", 2, PPC_OPERAND_GQR },
508 { "gqr.3", 3, PPC_OPERAND_GQR },
509 { "gqr.4", 4, PPC_OPERAND_GQR },
510 { "gqr.5", 5, PPC_OPERAND_GQR },
511 { "gqr.6", 6, PPC_OPERAND_GQR },
512 { "gqr.7", 7, PPC_OPERAND_GQR },
513 { "gqr0", 0, PPC_OPERAND_GQR },
514 { "gqr1", 1, PPC_OPERAND_GQR },
515 { "gqr2", 2, PPC_OPERAND_GQR },
516 { "gqr3", 3, PPC_OPERAND_GQR },
517 { "gqr4", 4, PPC_OPERAND_GQR },
518 { "gqr5", 5, PPC_OPERAND_GQR },
519 { "gqr6", 6, PPC_OPERAND_GQR },
520 { "gqr7", 7, PPC_OPERAND_GQR },
521
522 { "lr", 8, PPC_OPERAND_SPR },
523
524 /* General Purpose Registers */
525 { "r.0", 0, PPC_OPERAND_GPR },
526 { "r.1", 1, PPC_OPERAND_GPR },
527 { "r.10", 10, PPC_OPERAND_GPR },
528 { "r.11", 11, PPC_OPERAND_GPR },
529 { "r.12", 12, PPC_OPERAND_GPR },
530 { "r.13", 13, PPC_OPERAND_GPR },
531 { "r.14", 14, PPC_OPERAND_GPR },
532 { "r.15", 15, PPC_OPERAND_GPR },
533 { "r.16", 16, PPC_OPERAND_GPR },
534 { "r.17", 17, PPC_OPERAND_GPR },
535 { "r.18", 18, PPC_OPERAND_GPR },
536 { "r.19", 19, PPC_OPERAND_GPR },
537 { "r.2", 2, PPC_OPERAND_GPR },
538 { "r.20", 20, PPC_OPERAND_GPR },
539 { "r.21", 21, PPC_OPERAND_GPR },
540 { "r.22", 22, PPC_OPERAND_GPR },
541 { "r.23", 23, PPC_OPERAND_GPR },
542 { "r.24", 24, PPC_OPERAND_GPR },
543 { "r.25", 25, PPC_OPERAND_GPR },
544 { "r.26", 26, PPC_OPERAND_GPR },
545 { "r.27", 27, PPC_OPERAND_GPR },
546 { "r.28", 28, PPC_OPERAND_GPR },
547 { "r.29", 29, PPC_OPERAND_GPR },
548 { "r.3", 3, PPC_OPERAND_GPR },
549 { "r.30", 30, PPC_OPERAND_GPR },
550 { "r.31", 31, PPC_OPERAND_GPR },
551 { "r.4", 4, PPC_OPERAND_GPR },
552 { "r.5", 5, PPC_OPERAND_GPR },
553 { "r.6", 6, PPC_OPERAND_GPR },
554 { "r.7", 7, PPC_OPERAND_GPR },
555 { "r.8", 8, PPC_OPERAND_GPR },
556 { "r.9", 9, PPC_OPERAND_GPR },
557
558 { "r.sp", 1, PPC_OPERAND_GPR },
559
560 { "r.toc", 2, PPC_OPERAND_GPR },
561
562 { "r0", 0, PPC_OPERAND_GPR },
563 { "r1", 1, PPC_OPERAND_GPR },
564 { "r10", 10, PPC_OPERAND_GPR },
565 { "r11", 11, PPC_OPERAND_GPR },
566 { "r12", 12, PPC_OPERAND_GPR },
567 { "r13", 13, PPC_OPERAND_GPR },
568 { "r14", 14, PPC_OPERAND_GPR },
569 { "r15", 15, PPC_OPERAND_GPR },
570 { "r16", 16, PPC_OPERAND_GPR },
571 { "r17", 17, PPC_OPERAND_GPR },
572 { "r18", 18, PPC_OPERAND_GPR },
573 { "r19", 19, PPC_OPERAND_GPR },
574 { "r2", 2, PPC_OPERAND_GPR },
575 { "r20", 20, PPC_OPERAND_GPR },
576 { "r21", 21, PPC_OPERAND_GPR },
577 { "r22", 22, PPC_OPERAND_GPR },
578 { "r23", 23, PPC_OPERAND_GPR },
579 { "r24", 24, PPC_OPERAND_GPR },
580 { "r25", 25, PPC_OPERAND_GPR },
581 { "r26", 26, PPC_OPERAND_GPR },
582 { "r27", 27, PPC_OPERAND_GPR },
583 { "r28", 28, PPC_OPERAND_GPR },
584 { "r29", 29, PPC_OPERAND_GPR },
585 { "r3", 3, PPC_OPERAND_GPR },
586 { "r30", 30, PPC_OPERAND_GPR },
587 { "r31", 31, PPC_OPERAND_GPR },
588 { "r4", 4, PPC_OPERAND_GPR },
589 { "r5", 5, PPC_OPERAND_GPR },
590 { "r6", 6, PPC_OPERAND_GPR },
591 { "r7", 7, PPC_OPERAND_GPR },
592 { "r8", 8, PPC_OPERAND_GPR },
593 { "r9", 9, PPC_OPERAND_GPR },
594
595 { "rtoc", 2, PPC_OPERAND_GPR },
596
597 { "sdr1", 25, PPC_OPERAND_SPR },
598
599 { "sp", 1, PPC_OPERAND_GPR },
600
601 { "srr0", 26, PPC_OPERAND_SPR },
602 { "srr1", 27, PPC_OPERAND_SPR },
603
604 /* Vector (Altivec/VMX) registers */
605 { "v.0", 0, PPC_OPERAND_VR },
606 { "v.1", 1, PPC_OPERAND_VR },
607 { "v.10", 10, PPC_OPERAND_VR },
608 { "v.11", 11, PPC_OPERAND_VR },
609 { "v.12", 12, PPC_OPERAND_VR },
610 { "v.13", 13, PPC_OPERAND_VR },
611 { "v.14", 14, PPC_OPERAND_VR },
612 { "v.15", 15, PPC_OPERAND_VR },
613 { "v.16", 16, PPC_OPERAND_VR },
614 { "v.17", 17, PPC_OPERAND_VR },
615 { "v.18", 18, PPC_OPERAND_VR },
616 { "v.19", 19, PPC_OPERAND_VR },
617 { "v.2", 2, PPC_OPERAND_VR },
618 { "v.20", 20, PPC_OPERAND_VR },
619 { "v.21", 21, PPC_OPERAND_VR },
620 { "v.22", 22, PPC_OPERAND_VR },
621 { "v.23", 23, PPC_OPERAND_VR },
622 { "v.24", 24, PPC_OPERAND_VR },
623 { "v.25", 25, PPC_OPERAND_VR },
624 { "v.26", 26, PPC_OPERAND_VR },
625 { "v.27", 27, PPC_OPERAND_VR },
626 { "v.28", 28, PPC_OPERAND_VR },
627 { "v.29", 29, PPC_OPERAND_VR },
628 { "v.3", 3, PPC_OPERAND_VR },
629 { "v.30", 30, PPC_OPERAND_VR },
630 { "v.31", 31, PPC_OPERAND_VR },
631 { "v.4", 4, PPC_OPERAND_VR },
632 { "v.5", 5, PPC_OPERAND_VR },
633 { "v.6", 6, PPC_OPERAND_VR },
634 { "v.7", 7, PPC_OPERAND_VR },
635 { "v.8", 8, PPC_OPERAND_VR },
636 { "v.9", 9, PPC_OPERAND_VR },
637
638 { "v0", 0, PPC_OPERAND_VR },
639 { "v1", 1, PPC_OPERAND_VR },
640 { "v10", 10, PPC_OPERAND_VR },
641 { "v11", 11, PPC_OPERAND_VR },
642 { "v12", 12, PPC_OPERAND_VR },
643 { "v13", 13, PPC_OPERAND_VR },
644 { "v14", 14, PPC_OPERAND_VR },
645 { "v15", 15, PPC_OPERAND_VR },
646 { "v16", 16, PPC_OPERAND_VR },
647 { "v17", 17, PPC_OPERAND_VR },
648 { "v18", 18, PPC_OPERAND_VR },
649 { "v19", 19, PPC_OPERAND_VR },
650 { "v2", 2, PPC_OPERAND_VR },
651 { "v20", 20, PPC_OPERAND_VR },
652 { "v21", 21, PPC_OPERAND_VR },
653 { "v22", 22, PPC_OPERAND_VR },
654 { "v23", 23, PPC_OPERAND_VR },
655 { "v24", 24, PPC_OPERAND_VR },
656 { "v25", 25, PPC_OPERAND_VR },
657 { "v26", 26, PPC_OPERAND_VR },
658 { "v27", 27, PPC_OPERAND_VR },
659 { "v28", 28, PPC_OPERAND_VR },
660 { "v29", 29, PPC_OPERAND_VR },
661 { "v3", 3, PPC_OPERAND_VR },
662 { "v30", 30, PPC_OPERAND_VR },
663 { "v31", 31, PPC_OPERAND_VR },
664 { "v4", 4, PPC_OPERAND_VR },
665 { "v5", 5, PPC_OPERAND_VR },
666 { "v6", 6, PPC_OPERAND_VR },
667 { "v7", 7, PPC_OPERAND_VR },
668 { "v8", 8, PPC_OPERAND_VR },
669 { "v9", 9, PPC_OPERAND_VR },
670
671 /* Vector Scalar (VSX) registers (ISA 2.06). */
672 { "vs.0", 0, PPC_OPERAND_VSR },
673 { "vs.1", 1, PPC_OPERAND_VSR },
674 { "vs.10", 10, PPC_OPERAND_VSR },
675 { "vs.11", 11, PPC_OPERAND_VSR },
676 { "vs.12", 12, PPC_OPERAND_VSR },
677 { "vs.13", 13, PPC_OPERAND_VSR },
678 { "vs.14", 14, PPC_OPERAND_VSR },
679 { "vs.15", 15, PPC_OPERAND_VSR },
680 { "vs.16", 16, PPC_OPERAND_VSR },
681 { "vs.17", 17, PPC_OPERAND_VSR },
682 { "vs.18", 18, PPC_OPERAND_VSR },
683 { "vs.19", 19, PPC_OPERAND_VSR },
684 { "vs.2", 2, PPC_OPERAND_VSR },
685 { "vs.20", 20, PPC_OPERAND_VSR },
686 { "vs.21", 21, PPC_OPERAND_VSR },
687 { "vs.22", 22, PPC_OPERAND_VSR },
688 { "vs.23", 23, PPC_OPERAND_VSR },
689 { "vs.24", 24, PPC_OPERAND_VSR },
690 { "vs.25", 25, PPC_OPERAND_VSR },
691 { "vs.26", 26, PPC_OPERAND_VSR },
692 { "vs.27", 27, PPC_OPERAND_VSR },
693 { "vs.28", 28, PPC_OPERAND_VSR },
694 { "vs.29", 29, PPC_OPERAND_VSR },
695 { "vs.3", 3, PPC_OPERAND_VSR },
696 { "vs.30", 30, PPC_OPERAND_VSR },
697 { "vs.31", 31, PPC_OPERAND_VSR },
698 { "vs.32", 32, PPC_OPERAND_VSR },
699 { "vs.33", 33, PPC_OPERAND_VSR },
700 { "vs.34", 34, PPC_OPERAND_VSR },
701 { "vs.35", 35, PPC_OPERAND_VSR },
702 { "vs.36", 36, PPC_OPERAND_VSR },
703 { "vs.37", 37, PPC_OPERAND_VSR },
704 { "vs.38", 38, PPC_OPERAND_VSR },
705 { "vs.39", 39, PPC_OPERAND_VSR },
706 { "vs.4", 4, PPC_OPERAND_VSR },
707 { "vs.40", 40, PPC_OPERAND_VSR },
708 { "vs.41", 41, PPC_OPERAND_VSR },
709 { "vs.42", 42, PPC_OPERAND_VSR },
710 { "vs.43", 43, PPC_OPERAND_VSR },
711 { "vs.44", 44, PPC_OPERAND_VSR },
712 { "vs.45", 45, PPC_OPERAND_VSR },
713 { "vs.46", 46, PPC_OPERAND_VSR },
714 { "vs.47", 47, PPC_OPERAND_VSR },
715 { "vs.48", 48, PPC_OPERAND_VSR },
716 { "vs.49", 49, PPC_OPERAND_VSR },
717 { "vs.5", 5, PPC_OPERAND_VSR },
718 { "vs.50", 50, PPC_OPERAND_VSR },
719 { "vs.51", 51, PPC_OPERAND_VSR },
720 { "vs.52", 52, PPC_OPERAND_VSR },
721 { "vs.53", 53, PPC_OPERAND_VSR },
722 { "vs.54", 54, PPC_OPERAND_VSR },
723 { "vs.55", 55, PPC_OPERAND_VSR },
724 { "vs.56", 56, PPC_OPERAND_VSR },
725 { "vs.57", 57, PPC_OPERAND_VSR },
726 { "vs.58", 58, PPC_OPERAND_VSR },
727 { "vs.59", 59, PPC_OPERAND_VSR },
728 { "vs.6", 6, PPC_OPERAND_VSR },
729 { "vs.60", 60, PPC_OPERAND_VSR },
730 { "vs.61", 61, PPC_OPERAND_VSR },
731 { "vs.62", 62, PPC_OPERAND_VSR },
732 { "vs.63", 63, PPC_OPERAND_VSR },
733 { "vs.7", 7, PPC_OPERAND_VSR },
734 { "vs.8", 8, PPC_OPERAND_VSR },
735 { "vs.9", 9, PPC_OPERAND_VSR },
736
737 { "vs0", 0, PPC_OPERAND_VSR },
738 { "vs1", 1, PPC_OPERAND_VSR },
739 { "vs10", 10, PPC_OPERAND_VSR },
740 { "vs11", 11, PPC_OPERAND_VSR },
741 { "vs12", 12, PPC_OPERAND_VSR },
742 { "vs13", 13, PPC_OPERAND_VSR },
743 { "vs14", 14, PPC_OPERAND_VSR },
744 { "vs15", 15, PPC_OPERAND_VSR },
745 { "vs16", 16, PPC_OPERAND_VSR },
746 { "vs17", 17, PPC_OPERAND_VSR },
747 { "vs18", 18, PPC_OPERAND_VSR },
748 { "vs19", 19, PPC_OPERAND_VSR },
749 { "vs2", 2, PPC_OPERAND_VSR },
750 { "vs20", 20, PPC_OPERAND_VSR },
751 { "vs21", 21, PPC_OPERAND_VSR },
752 { "vs22", 22, PPC_OPERAND_VSR },
753 { "vs23", 23, PPC_OPERAND_VSR },
754 { "vs24", 24, PPC_OPERAND_VSR },
755 { "vs25", 25, PPC_OPERAND_VSR },
756 { "vs26", 26, PPC_OPERAND_VSR },
757 { "vs27", 27, PPC_OPERAND_VSR },
758 { "vs28", 28, PPC_OPERAND_VSR },
759 { "vs29", 29, PPC_OPERAND_VSR },
760 { "vs3", 3, PPC_OPERAND_VSR },
761 { "vs30", 30, PPC_OPERAND_VSR },
762 { "vs31", 31, PPC_OPERAND_VSR },
763 { "vs32", 32, PPC_OPERAND_VSR },
764 { "vs33", 33, PPC_OPERAND_VSR },
765 { "vs34", 34, PPC_OPERAND_VSR },
766 { "vs35", 35, PPC_OPERAND_VSR },
767 { "vs36", 36, PPC_OPERAND_VSR },
768 { "vs37", 37, PPC_OPERAND_VSR },
769 { "vs38", 38, PPC_OPERAND_VSR },
770 { "vs39", 39, PPC_OPERAND_VSR },
771 { "vs4", 4, PPC_OPERAND_VSR },
772 { "vs40", 40, PPC_OPERAND_VSR },
773 { "vs41", 41, PPC_OPERAND_VSR },
774 { "vs42", 42, PPC_OPERAND_VSR },
775 { "vs43", 43, PPC_OPERAND_VSR },
776 { "vs44", 44, PPC_OPERAND_VSR },
777 { "vs45", 45, PPC_OPERAND_VSR },
778 { "vs46", 46, PPC_OPERAND_VSR },
779 { "vs47", 47, PPC_OPERAND_VSR },
780 { "vs48", 48, PPC_OPERAND_VSR },
781 { "vs49", 49, PPC_OPERAND_VSR },
782 { "vs5", 5, PPC_OPERAND_VSR },
783 { "vs50", 50, PPC_OPERAND_VSR },
784 { "vs51", 51, PPC_OPERAND_VSR },
785 { "vs52", 52, PPC_OPERAND_VSR },
786 { "vs53", 53, PPC_OPERAND_VSR },
787 { "vs54", 54, PPC_OPERAND_VSR },
788 { "vs55", 55, PPC_OPERAND_VSR },
789 { "vs56", 56, PPC_OPERAND_VSR },
790 { "vs57", 57, PPC_OPERAND_VSR },
791 { "vs58", 58, PPC_OPERAND_VSR },
792 { "vs59", 59, PPC_OPERAND_VSR },
793 { "vs6", 6, PPC_OPERAND_VSR },
794 { "vs60", 60, PPC_OPERAND_VSR },
795 { "vs61", 61, PPC_OPERAND_VSR },
796 { "vs62", 62, PPC_OPERAND_VSR },
797 { "vs63", 63, PPC_OPERAND_VSR },
798 { "vs7", 7, PPC_OPERAND_VSR },
799 { "vs8", 8, PPC_OPERAND_VSR },
800 { "vs9", 9, PPC_OPERAND_VSR },
801
802 { "xer", 1, PPC_OPERAND_SPR }
252b5132
RH
803};
804
bc805888 805#define REG_NAME_CNT (sizeof (pre_defined_registers) / sizeof (struct pd_reg))
252b5132
RH
806
807/* Given NAME, find the register number associated with that name, return
808 the integer value associated with the given name or -1 on failure. */
809
7e0de605 810static const struct pd_reg *
98027b10 811reg_name_search (const struct pd_reg *regs, int regcount, const char *name)
252b5132
RH
812{
813 int middle, low, high;
814 int cmp;
815
816 low = 0;
817 high = regcount - 1;
818
819 do
820 {
821 middle = (low + high) / 2;
822 cmp = strcasecmp (name, regs[middle].name);
823 if (cmp < 0)
824 high = middle - 1;
825 else if (cmp > 0)
826 low = middle + 1;
827 else
7e0de605 828 return &regs[middle];
252b5132
RH
829 }
830 while (low <= high);
831
7e0de605 832 return NULL;
252b5132
RH
833}
834
835/*
99a814a1 836 * Summary of register_name.
252b5132
RH
837 *
838 * in: Input_line_pointer points to 1st char of operand.
839 *
840 * out: A expressionS.
841 * The operand may have been a register: in this case, X_op == O_register,
842 * X_add_number is set to the register number, and truth is returned.
843 * Input_line_pointer->(next non-blank) char after operand, or is in its
844 * original state.
845 */
846
b34976b6 847static bfd_boolean
98027b10 848register_name (expressionS *expressionP)
252b5132 849{
7e0de605 850 const struct pd_reg *reg;
252b5132
RH
851 char *name;
852 char *start;
853 char c;
854
99a814a1 855 /* Find the spelling of the operand. */
252b5132 856 start = name = input_line_pointer;
3882b010 857 if (name[0] == '%' && ISALPHA (name[1]))
252b5132
RH
858 name = ++input_line_pointer;
859
3882b010 860 else if (!reg_names_p || !ISALPHA (name[0]))
b34976b6 861 return FALSE;
252b5132 862
d02603dc 863 c = get_symbol_name (&name);
7e0de605 864 reg = reg_name_search (pre_defined_registers, REG_NAME_CNT, name);
252b5132 865
468cced8
AM
866 /* Put back the delimiting char. */
867 *input_line_pointer = c;
868
99a814a1 869 /* Look to see if it's in the register table. */
7e0de605 870 if (reg != NULL)
252b5132
RH
871 {
872 expressionP->X_op = O_register;
7e0de605
AM
873 expressionP->X_add_number = reg->value;
874 expressionP->X_md = reg->flags;
81d4177b 875
99a814a1 876 /* Make the rest nice. */
252b5132
RH
877 expressionP->X_add_symbol = NULL;
878 expressionP->X_op_symbol = NULL;
b34976b6 879 return TRUE;
252b5132 880 }
468cced8
AM
881
882 /* Reset the line as if we had not done anything. */
883 input_line_pointer = start;
b34976b6 884 return FALSE;
252b5132
RH
885}
886\f
887/* This function is called for each symbol seen in an expression. It
888 handles the special parsing which PowerPC assemblers are supposed
889 to use for condition codes. */
890
891/* Whether to do the special parsing. */
b34976b6 892static bfd_boolean cr_operand;
252b5132
RH
893
894/* Names to recognize in a condition code. This table is sorted. */
895static const struct pd_reg cr_names[] =
896{
7e0de605
AM
897 { "cr0", 0, PPC_OPERAND_CR_REG },
898 { "cr1", 1, PPC_OPERAND_CR_REG },
899 { "cr2", 2, PPC_OPERAND_CR_REG },
900 { "cr3", 3, PPC_OPERAND_CR_REG },
901 { "cr4", 4, PPC_OPERAND_CR_REG },
902 { "cr5", 5, PPC_OPERAND_CR_REG },
903 { "cr6", 6, PPC_OPERAND_CR_REG },
904 { "cr7", 7, PPC_OPERAND_CR_REG },
905 { "eq", 2, PPC_OPERAND_CR_BIT },
906 { "gt", 1, PPC_OPERAND_CR_BIT },
907 { "lt", 0, PPC_OPERAND_CR_BIT },
908 { "so", 3, PPC_OPERAND_CR_BIT },
909 { "un", 3, PPC_OPERAND_CR_BIT }
252b5132
RH
910};
911
912/* Parsing function. This returns non-zero if it recognized an
913 expression. */
914
915int
91d6fa6a 916ppc_parse_name (const char *name, expressionS *exp)
252b5132 917{
7e0de605 918 const struct pd_reg *reg;
252b5132
RH
919
920 if (! cr_operand)
921 return 0;
922
13abbae3
AM
923 if (*name == '%')
924 ++name;
7e0de605 925 reg = reg_name_search (cr_names, sizeof cr_names / sizeof cr_names[0],
252b5132 926 name);
7e0de605 927 if (reg == NULL)
252b5132
RH
928 return 0;
929
7e0de605
AM
930 exp->X_op = O_register;
931 exp->X_add_number = reg->value;
932 exp->X_md = reg->flags;
252b5132
RH
933
934 return 1;
935}
7e0de605
AM
936
937/* Propagate X_md and check register expressions. This is to support
938 condition codes like 4*cr5+eq. */
939
940int
941ppc_optimize_expr (expressionS *left, operatorT op, expressionS *right)
942{
943 /* Accept 4*cr<n> and cr<n>*4. */
944 if (op == O_multiply
945 && ((right->X_op == O_register
946 && right->X_md == PPC_OPERAND_CR_REG
947 && left->X_op == O_constant
948 && left->X_add_number == 4)
949 || (left->X_op == O_register
950 && left->X_md == PPC_OPERAND_CR_REG
951 && right->X_op == O_constant
952 && right->X_add_number == 4)))
953 {
954 left->X_op = O_register;
955 left->X_md = PPC_OPERAND_CR_REG | PPC_OPERAND_CR_BIT;
956 left->X_add_number *= right->X_add_number;
957 return 1;
958 }
959
960 /* Accept the above plus <cr bit>, and <cr bit> plus the above. */
961 if (right->X_op == O_register
962 && left->X_op == O_register
963 && op == O_add
964 && ((right->X_md == PPC_OPERAND_CR_BIT
965 && left->X_md == (PPC_OPERAND_CR_REG | PPC_OPERAND_CR_BIT))
966 || (right->X_md == (PPC_OPERAND_CR_REG | PPC_OPERAND_CR_BIT)
967 && left->X_md == PPC_OPERAND_CR_BIT)))
968 {
969 left->X_md = PPC_OPERAND_CR_BIT;
970 right->X_op = O_constant;
971 return 0;
972 }
973
974 /* Accept reg +/- constant. */
975 if (left->X_op == O_register
976 && !((op == O_add || op == O_subtract) && right->X_op == O_constant))
ece5dcc1 977 as_warn (_("invalid register expression"));
7e0de605
AM
978
979 /* Accept constant + reg. */
980 if (right->X_op == O_register)
981 {
982 if (op == O_add && left->X_op == O_constant)
983 left->X_md = right->X_md;
984 else
ece5dcc1 985 as_warn (_("invalid register expression"));
7e0de605
AM
986 }
987
988 return 0;
989}
252b5132
RH
990\f
991/* Local variables. */
992
2b3c4602
AM
993/* Whether to target xcoff64/elf64. */
994static unsigned int ppc_obj64 = BFD_DEFAULT_TARGET_SIZE == 64;
7f6d05e8 995
252b5132
RH
996/* Opcode hash table. */
997static struct hash_control *ppc_hash;
998
999/* Macro hash table. */
1000static struct hash_control *ppc_macro_hash;
1001
1002#ifdef OBJ_ELF
99a814a1 1003/* What type of shared library support to use. */
5d6f4f16 1004static enum { SHLIB_NONE, SHLIB_PIC, SHLIB_MRELOCATABLE } shlib = SHLIB_NONE;
252b5132 1005
99a814a1 1006/* Flags to set in the elf header. */
252b5132
RH
1007static flagword ppc_flags = 0;
1008
1009/* Whether this is Solaris or not. */
1010#ifdef TARGET_SOLARIS_COMMENT
b34976b6 1011#define SOLARIS_P TRUE
252b5132 1012#else
b34976b6 1013#define SOLARIS_P FALSE
252b5132
RH
1014#endif
1015
b34976b6 1016static bfd_boolean msolaris = SOLARIS_P;
252b5132
RH
1017#endif
1018
1019#ifdef OBJ_XCOFF
1020
1021/* The RS/6000 assembler uses the .csect pseudo-op to generate code
1022 using a bunch of different sections. These assembler sections,
1023 however, are all encompassed within the .text or .data sections of
1024 the final output file. We handle this by using different
1025 subsegments within these main segments. */
1026
1027/* Next subsegment to allocate within the .text segment. */
1028static subsegT ppc_text_subsegment = 2;
1029
1030/* Linked list of csects in the text section. */
1031static symbolS *ppc_text_csects;
1032
1033/* Next subsegment to allocate within the .data segment. */
1034static subsegT ppc_data_subsegment = 2;
1035
1036/* Linked list of csects in the data section. */
1037static symbolS *ppc_data_csects;
1038
1039/* The current csect. */
1040static symbolS *ppc_current_csect;
1041
1042/* The RS/6000 assembler uses a TOC which holds addresses of functions
1043 and variables. Symbols are put in the TOC with the .tc pseudo-op.
1044 A special relocation is used when accessing TOC entries. We handle
1045 the TOC as a subsegment within the .data segment. We set it up if
1046 we see a .toc pseudo-op, and save the csect symbol here. */
1047static symbolS *ppc_toc_csect;
1048
1049/* The first frag in the TOC subsegment. */
1050static fragS *ppc_toc_frag;
1051
1052/* The first frag in the first subsegment after the TOC in the .data
1053 segment. NULL if there are no subsegments after the TOC. */
1054static fragS *ppc_after_toc_frag;
1055
1056/* The current static block. */
1057static symbolS *ppc_current_block;
1058
1059/* The COFF debugging section; set by md_begin. This is not the
1060 .debug section, but is instead the secret BFD section which will
1061 cause BFD to set the section number of a symbol to N_DEBUG. */
1062static asection *ppc_coff_debug_section;
1063
85645aed
TG
1064/* Structure to set the length field of the dwarf sections. */
1065struct dw_subsection {
1066 /* Subsections are simply linked. */
1067 struct dw_subsection *link;
1068
1069 /* The subsection number. */
1070 subsegT subseg;
1071
1072 /* Expression to compute the length of the section. */
1073 expressionS end_exp;
1074};
1075
1076static struct dw_section {
1077 /* Corresponding section. */
1078 segT sect;
1079
1080 /* Simply linked list of subsections with a label. */
1081 struct dw_subsection *list_subseg;
1082
1083 /* The anonymous subsection. */
1084 struct dw_subsection *anon_subseg;
1085} dw_sections[XCOFF_DWSECT_NBR_NAMES];
252b5132
RH
1086#endif /* OBJ_XCOFF */
1087
1088#ifdef TE_PE
1089
1090/* Various sections that we need for PE coff support. */
1091static segT ydata_section;
1092static segT pdata_section;
1093static segT reldata_section;
1094static segT rdata_section;
1095static segT tocdata_section;
1096
81d4177b 1097/* The current section and the previous section. See ppc_previous. */
252b5132
RH
1098static segT ppc_previous_section;
1099static segT ppc_current_section;
1100
1101#endif /* TE_PE */
1102
1103#ifdef OBJ_ELF
1104symbolS *GOT_symbol; /* Pre-defined "_GLOBAL_OFFSET_TABLE" */
6a0c61b7
EZ
1105unsigned long *ppc_apuinfo_list;
1106unsigned int ppc_apuinfo_num;
1107unsigned int ppc_apuinfo_num_alloc;
252b5132
RH
1108#endif /* OBJ_ELF */
1109\f
1110#ifdef OBJ_ELF
15c1449b 1111const char *const md_shortopts = "b:l:usm:K:VQ:";
252b5132 1112#else
15c1449b 1113const char *const md_shortopts = "um:";
252b5132 1114#endif
cef4f754 1115#define OPTION_NOPS (OPTION_MD_BASE + 0)
15c1449b 1116const struct option md_longopts[] = {
cef4f754 1117 {"nops", required_argument, NULL, OPTION_NOPS},
bf7279d5
AM
1118 {"ppc476-workaround", no_argument, &warn_476, 1},
1119 {"no-ppc476-workaround", no_argument, &warn_476, 0},
252b5132
RH
1120 {NULL, no_argument, NULL, 0}
1121};
15c1449b 1122const size_t md_longopts_size = sizeof (md_longopts);
252b5132
RH
1123
1124int
17b9d67d 1125md_parse_option (int c, const char *arg)
252b5132 1126{
69fe9ce5
AM
1127 ppc_cpu_t new_cpu;
1128
252b5132
RH
1129 switch (c)
1130 {
1131 case 'u':
1132 /* -u means that any undefined symbols should be treated as
1133 external, which is the default for gas anyhow. */
1134 break;
1135
1136#ifdef OBJ_ELF
1137 case 'l':
1138 /* Solaris as takes -le (presumably for little endian). For completeness
99a814a1 1139 sake, recognize -be also. */
252b5132
RH
1140 if (strcmp (arg, "e") == 0)
1141 {
1142 target_big_endian = 0;
1143 set_target_endian = 1;
b9c361e0 1144 if (ppc_cpu & PPC_OPCODE_VLE)
d6ed37ed 1145 as_bad (_("the use of -mvle requires big endian."));
252b5132
RH
1146 }
1147 else
1148 return 0;
1149
1150 break;
1151
1152 case 'b':
1153 if (strcmp (arg, "e") == 0)
1154 {
1155 target_big_endian = 1;
1156 set_target_endian = 1;
1157 }
1158 else
1159 return 0;
1160
1161 break;
1162
1163 case 'K':
99a814a1 1164 /* Recognize -K PIC. */
252b5132
RH
1165 if (strcmp (arg, "PIC") == 0 || strcmp (arg, "pic") == 0)
1166 {
1167 shlib = SHLIB_PIC;
1168 ppc_flags |= EF_PPC_RELOCATABLE_LIB;
1169 }
1170 else
1171 return 0;
1172
1173 break;
1174#endif
1175
7f6d05e8
CP
1176 /* a64 and a32 determine whether to use XCOFF64 or XCOFF32. */
1177 case 'a':
1178 if (strcmp (arg, "64") == 0)
2a98c3a6
AM
1179 {
1180#ifdef BFD64
1181 ppc_obj64 = 1;
d6ed37ed
AM
1182 if (ppc_cpu & PPC_OPCODE_VLE)
1183 as_bad (_("the use of -mvle requires -a32."));
2a98c3a6
AM
1184#else
1185 as_fatal (_("%s unsupported"), "-a64");
1186#endif
1187 }
7f6d05e8 1188 else if (strcmp (arg, "32") == 0)
2b3c4602 1189 ppc_obj64 = 0;
7f6d05e8
CP
1190 else
1191 return 0;
1192 break;
81d4177b 1193
252b5132 1194 case 'm':
776fc418 1195 new_cpu = ppc_parse_cpu (ppc_cpu, &sticky, arg);
52be03fd
AM
1196 /* "raw" is only valid for the disassembler. */
1197 if (new_cpu != 0 && (new_cpu & PPC_OPCODE_RAW) == 0)
b9c361e0
JL
1198 {
1199 ppc_cpu = new_cpu;
d6ed37ed
AM
1200 if (strcmp (arg, "vle") == 0)
1201 {
1202 if (set_target_endian && target_big_endian == 0)
1203 as_bad (_("the use of -mvle requires big endian."));
1204 if (ppc_obj64)
1205 as_bad (_("the use of -mvle requires -a32."));
1206 }
b9c361e0 1207 }
252b5132 1208
83eef883
AFB
1209 else if (strcmp (arg, "no-vle") == 0)
1210 {
1211 sticky &= ~PPC_OPCODE_VLE;
1212
1213 new_cpu = ppc_parse_cpu (ppc_cpu, &sticky, "booke");
1214 new_cpu &= ~PPC_OPCODE_VLE;
1215
1216 ppc_cpu = new_cpu;
1217 }
1218
252b5132 1219 else if (strcmp (arg, "regnames") == 0)
b34976b6 1220 reg_names_p = TRUE;
252b5132
RH
1221
1222 else if (strcmp (arg, "no-regnames") == 0)
b34976b6 1223 reg_names_p = FALSE;
252b5132
RH
1224
1225#ifdef OBJ_ELF
99a814a1
AM
1226 /* -mrelocatable/-mrelocatable-lib -- warn about initializations
1227 that require relocation. */
252b5132
RH
1228 else if (strcmp (arg, "relocatable") == 0)
1229 {
5d6f4f16 1230 shlib = SHLIB_MRELOCATABLE;
252b5132
RH
1231 ppc_flags |= EF_PPC_RELOCATABLE;
1232 }
1233
1234 else if (strcmp (arg, "relocatable-lib") == 0)
1235 {
5d6f4f16 1236 shlib = SHLIB_MRELOCATABLE;
252b5132
RH
1237 ppc_flags |= EF_PPC_RELOCATABLE_LIB;
1238 }
1239
99a814a1 1240 /* -memb, set embedded bit. */
252b5132
RH
1241 else if (strcmp (arg, "emb") == 0)
1242 ppc_flags |= EF_PPC_EMB;
1243
cc643b88 1244 /* -mlittle/-mbig set the endianness. */
99a814a1
AM
1245 else if (strcmp (arg, "little") == 0
1246 || strcmp (arg, "little-endian") == 0)
252b5132
RH
1247 {
1248 target_big_endian = 0;
1249 set_target_endian = 1;
b9c361e0 1250 if (ppc_cpu & PPC_OPCODE_VLE)
d6ed37ed 1251 as_bad (_("the use of -mvle requires big endian."));
252b5132
RH
1252 }
1253
1254 else if (strcmp (arg, "big") == 0 || strcmp (arg, "big-endian") == 0)
1255 {
1256 target_big_endian = 1;
1257 set_target_endian = 1;
1258 }
1259
1260 else if (strcmp (arg, "solaris") == 0)
1261 {
b34976b6 1262 msolaris = TRUE;
252b5132
RH
1263 ppc_comment_chars = ppc_solaris_comment_chars;
1264 }
1265
1266 else if (strcmp (arg, "no-solaris") == 0)
1267 {
b34976b6 1268 msolaris = FALSE;
252b5132
RH
1269 ppc_comment_chars = ppc_eabi_comment_chars;
1270 }
74081948
AF
1271 else if (strcmp (arg, "spe2") == 0)
1272 {
1273 ppc_cpu |= PPC_OPCODE_SPE2;
1274 }
252b5132
RH
1275#endif
1276 else
1277 {
1278 as_bad (_("invalid switch -m%s"), arg);
1279 return 0;
1280 }
1281 break;
1282
1283#ifdef OBJ_ELF
1284 /* -V: SVR4 argument to print version ID. */
1285 case 'V':
1286 print_version_id ();
1287 break;
1288
1289 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
1290 should be emitted or not. FIXME: Not implemented. */
1291 case 'Q':
1292 break;
1293
1294 /* Solaris takes -s to specify that .stabs go in a .stabs section,
1295 rather than .stabs.excl, which is ignored by the linker.
1296 FIXME: Not implemented. */
1297 case 's':
1298 if (arg)
1299 return 0;
1300
1301 break;
1302#endif
1303
cef4f754
AM
1304 case OPTION_NOPS:
1305 {
1306 char *end;
1307 nop_limit = strtoul (optarg, &end, 0);
1308 if (*end)
1309 as_bad (_("--nops needs a numeric argument"));
1310 }
1311 break;
85645aed 1312
bf7279d5
AM
1313 case 0:
1314 break;
1315
252b5132
RH
1316 default:
1317 return 0;
1318 }
1319
1320 return 1;
1321}
1322
5f63875b
AM
1323static int
1324is_ppc64_target (const bfd_target *targ, void *data ATTRIBUTE_UNUSED)
1325{
1326 switch (targ->flavour)
1327 {
1328#ifdef OBJ_ELF
1329 case bfd_target_elf_flavour:
1330 return strncmp (targ->name, "elf64-powerpc", 13) == 0;
1331#endif
1332#ifdef OBJ_XCOFF
1333 case bfd_target_xcoff_flavour:
1334 return (strcmp (targ->name, "aixcoff64-rs6000") == 0
1335 || strcmp (targ->name, "aix5coff64-rs6000") == 0);
1336#endif
1337 default:
1338 return 0;
1339 }
1340}
1341
252b5132 1342void
98027b10 1343md_show_usage (FILE *stream)
252b5132 1344{
bc805888 1345 fprintf (stream, _("\
5f63875b
AM
1346PowerPC options:\n"));
1347 fprintf (stream, _("\
1348-a32 generate ELF32/XCOFF32\n"));
1349 if (bfd_iterate_over_targets (is_ppc64_target, NULL))
1350 fprintf (stream, _("\
1351-a64 generate ELF64/XCOFF64\n"));
1352 fprintf (stream, _("\
1353-u ignored\n"));
1354 fprintf (stream, _("\
1355-mpwrx, -mpwr2 generate code for POWER/2 (RIOS2)\n"));
1356 fprintf (stream, _("\
1357-mpwr generate code for POWER (RIOS1)\n"));
1358 fprintf (stream, _("\
1359-m601 generate code for PowerPC 601\n"));
1360 fprintf (stream, _("\
418c1742 1361-mppc, -mppc32, -m603, -m604\n\
5f63875b
AM
1362 generate code for PowerPC 603/604\n"));
1363 fprintf (stream, _("\
1364-m403 generate code for PowerPC 403\n"));
1365 fprintf (stream, _("\
1366-m405 generate code for PowerPC 405\n"));
1367 fprintf (stream, _("\
1368-m440 generate code for PowerPC 440\n"));
1369 fprintf (stream, _("\
1370-m464 generate code for PowerPC 464\n"));
1371 fprintf (stream, _("\
1372-m476 generate code for PowerPC 476\n"));
1373 fprintf (stream, _("\
f5c120c5 1374-m7400, -m7410, -m7450, -m7455\n\
5f63875b
AM
1375 generate code for PowerPC 7400/7410/7450/7455\n"));
1376 fprintf (stream, _("\
fa758a70 1377-m750cl, -mgekko, -mbroadway\n\
5f63875b
AM
1378 generate code for PowerPC 750cl/Gekko/Broadway\n"));
1379 fprintf (stream, _("\
ef5a96d5 1380-m821, -m850, -m860 generate code for PowerPC 821/850/860\n"));
df12615d 1381 fprintf (stream, _("\
5f63875b
AM
1382-mppc64, -m620 generate code for PowerPC 620/625/630\n"));
1383 fprintf (stream, _("\
1384-mppc64bridge generate code for PowerPC 64, including bridge insns\n"));
1385 fprintf (stream, _("\
1386-mbooke generate code for 32-bit PowerPC BookE\n"));
1387 fprintf (stream, _("\
1388-ma2 generate code for A2 architecture\n"));
1389 fprintf (stream, _("\
1390-mpower4, -mpwr4 generate code for Power4 architecture\n"));
1391 fprintf (stream, _("\
cdc51b07 1392-mpower5, -mpwr5, -mpwr5x\n\
5f63875b
AM
1393 generate code for Power5 architecture\n"));
1394 fprintf (stream, _("\
1395-mpower6, -mpwr6 generate code for Power6 architecture\n"));
1396 fprintf (stream, _("\
1397-mpower7, -mpwr7 generate code for Power7 architecture\n"));
1398 fprintf (stream, _("\
1399-mpower8, -mpwr8 generate code for Power8 architecture\n"));
1400 fprintf (stream, _("\
1401-mpower9, -mpwr9 generate code for Power9 architecture\n"));
1402 fprintf (stream, _("\
1403-mcell generate code for Cell Broadband Engine architecture\n"));
1404 fprintf (stream, _("\
1405-mcom generate code for Power/PowerPC common instructions\n"));
1406 fprintf (stream, _("\
ce3d2015 1407-many generate code for any architecture (PWR/PWRX/PPC)\n"));
6a0c61b7 1408 fprintf (stream, _("\
5f63875b
AM
1409-maltivec generate code for AltiVec\n"));
1410 fprintf (stream, _("\
1411-mvsx generate code for Vector-Scalar (VSX) instructions\n"));
1412 fprintf (stream, _("\
1413-me300 generate code for PowerPC e300 family\n"));
1414 fprintf (stream, _("\
1415-me500, -me500x2 generate code for Motorola e500 core complex\n"));
1416 fprintf (stream, _("\
1417-me500mc, generate code for Freescale e500mc core complex\n"));
1418 fprintf (stream, _("\
1419-me500mc64, generate code for Freescale e500mc64 core complex\n"));
1420 fprintf (stream, _("\
1421-me5500, generate code for Freescale e5500 core complex\n"));
1422 fprintf (stream, _("\
1423-me6500, generate code for Freescale e6500 core complex\n"));
1424 fprintf (stream, _("\
1425-mspe generate code for Motorola SPE instructions\n"));
1426 fprintf (stream, _("\
1427-mspe2 generate code for Freescale SPE2 instructions\n"));
1428 fprintf (stream, _("\
1429-mvle generate code for Freescale VLE instructions\n"));
1430 fprintf (stream, _("\
1431-mtitan generate code for AppliedMicro Titan core complex\n"));
1432 fprintf (stream, _("\
1433-mregnames Allow symbolic names for registers\n"));
1434 fprintf (stream, _("\
ce3d2015 1435-mno-regnames Do not allow symbolic names for registers\n"));
252b5132 1436#ifdef OBJ_ELF
bc805888 1437 fprintf (stream, _("\
5f63875b
AM
1438-mrelocatable support for GCC's -mrelocatble option\n"));
1439 fprintf (stream, _("\
1440-mrelocatable-lib support for GCC's -mrelocatble-lib option\n"));
1441 fprintf (stream, _("\
1442-memb set PPC_EMB bit in ELF flags\n"));
1443 fprintf (stream, _("\
b8b738ac 1444-mlittle, -mlittle-endian, -le\n\
5f63875b
AM
1445 generate code for a little endian machine\n"));
1446 fprintf (stream, _("\
b8b738ac 1447-mbig, -mbig-endian, -be\n\
5f63875b
AM
1448 generate code for a big endian machine\n"));
1449 fprintf (stream, _("\
1450-msolaris generate code for Solaris\n"));
1451 fprintf (stream, _("\
1452-mno-solaris do not generate code for Solaris\n"));
1453 fprintf (stream, _("\
1454-K PIC set EF_PPC_RELOCATABLE_LIB in ELF flags\n"));
1455 fprintf (stream, _("\
1456-V print assembler version number\n"));
1457 fprintf (stream, _("\
ce3d2015 1458-Qy, -Qn ignored\n"));
252b5132 1459#endif
cef4f754 1460 fprintf (stream, _("\
5f63875b
AM
1461-nops=count when aligning, more than COUNT nops uses a branch\n"));
1462 fprintf (stream, _("\
bf7279d5 1463-ppc476-workaround warn if emitting data to code sections\n"));
252b5132
RH
1464}
1465\f
1466/* Set ppc_cpu if it is not already set. */
1467
1468static void
98027b10 1469ppc_set_cpu (void)
252b5132
RH
1470{
1471 const char *default_os = TARGET_OS;
1472 const char *default_cpu = TARGET_CPU;
1473
7102e95e 1474 if ((ppc_cpu & ~(ppc_cpu_t) PPC_OPCODE_ANY) == 0)
252b5132 1475 {
2a98c3a6 1476 if (ppc_obj64)
f2ab4b42
PB
1477 if (target_big_endian)
1478 ppc_cpu |= PPC_OPCODE_PPC | PPC_OPCODE_64;
1479 else
1480 /* The minimum supported cpu for 64-bit little-endian is power8. */
1481 ppc_cpu |= ppc_parse_cpu (ppc_cpu, &sticky, "power8");
2a98c3a6
AM
1482 else if (strncmp (default_os, "aix", 3) == 0
1483 && default_os[3] >= '4' && default_os[3] <= '9')
bdc70b4a 1484 ppc_cpu |= PPC_OPCODE_COMMON;
252b5132 1485 else if (strncmp (default_os, "aix3", 4) == 0)
bdc70b4a 1486 ppc_cpu |= PPC_OPCODE_POWER;
252b5132 1487 else if (strcmp (default_cpu, "rs6000") == 0)
bdc70b4a 1488 ppc_cpu |= PPC_OPCODE_POWER;
0baf16f2 1489 else if (strncmp (default_cpu, "powerpc", 7) == 0)
bdc70b4a 1490 ppc_cpu |= PPC_OPCODE_PPC;
252b5132 1491 else
d6ed37ed 1492 as_fatal (_("unknown default cpu = %s, os = %s"),
99a814a1 1493 default_cpu, default_os);
252b5132
RH
1494 }
1495}
1496
9232bbb0
AM
1497/* Figure out the BFD architecture to use. This function and ppc_mach
1498 are called well before md_begin, when the output file is opened. */
252b5132
RH
1499
1500enum bfd_architecture
98027b10 1501ppc_arch (void)
252b5132
RH
1502{
1503 const char *default_cpu = TARGET_CPU;
1504 ppc_set_cpu ();
1505
1506 if ((ppc_cpu & PPC_OPCODE_PPC) != 0)
1507 return bfd_arch_powerpc;
b9c361e0
JL
1508 if ((ppc_cpu & PPC_OPCODE_VLE) != 0)
1509 return bfd_arch_powerpc;
1510 if ((ppc_cpu & PPC_OPCODE_POWER) != 0)
252b5132 1511 return bfd_arch_rs6000;
b9c361e0 1512 if ((ppc_cpu & (PPC_OPCODE_COMMON | PPC_OPCODE_ANY)) != 0)
252b5132
RH
1513 {
1514 if (strcmp (default_cpu, "rs6000") == 0)
1515 return bfd_arch_rs6000;
0baf16f2 1516 else if (strncmp (default_cpu, "powerpc", 7) == 0)
252b5132
RH
1517 return bfd_arch_powerpc;
1518 }
1519
d6ed37ed 1520 as_fatal (_("neither Power nor PowerPC opcodes were selected."));
252b5132
RH
1521 return bfd_arch_unknown;
1522}
1523
7f6d05e8 1524unsigned long
98027b10 1525ppc_mach (void)
7f6d05e8 1526{
2a98c3a6
AM
1527 if (ppc_obj64)
1528 return bfd_mach_ppc64;
1529 else if (ppc_arch () == bfd_arch_rs6000)
1530 return bfd_mach_rs6k;
ce3d2015
AM
1531 else if (ppc_cpu & PPC_OPCODE_TITAN)
1532 return bfd_mach_ppc_titan;
b9c361e0
JL
1533 else if (ppc_cpu & PPC_OPCODE_VLE)
1534 return bfd_mach_ppc_vle;
2a98c3a6
AM
1535 else
1536 return bfd_mach_ppc;
7f6d05e8
CP
1537}
1538
e0471c16 1539extern const char*
98027b10 1540ppc_target_format (void)
7f6d05e8
CP
1541{
1542#ifdef OBJ_COFF
1543#ifdef TE_PE
99a814a1 1544 return target_big_endian ? "pe-powerpc" : "pe-powerpcle";
7f6d05e8 1545#elif TE_POWERMAC
0baf16f2 1546 return "xcoff-powermac";
7f6d05e8 1547#else
eb1e0e80 1548# ifdef TE_AIX5
edc1d652 1549 return (ppc_obj64 ? "aix5coff64-rs6000" : "aixcoff-rs6000");
eb1e0e80 1550# else
edc1d652 1551 return (ppc_obj64 ? "aixcoff64-rs6000" : "aixcoff-rs6000");
eb1e0e80 1552# endif
7f6d05e8 1553#endif
7f6d05e8
CP
1554#endif
1555#ifdef OBJ_ELF
edc1d652
AM
1556# ifdef TE_FreeBSD
1557 return (ppc_obj64 ? "elf64-powerpc-freebsd" : "elf32-powerpc-freebsd");
1558# elif defined (TE_VXWORKS)
9d8504b1
PB
1559 return "elf32-powerpc-vxworks";
1560# else
0baf16f2 1561 return (target_big_endian
2b3c4602
AM
1562 ? (ppc_obj64 ? "elf64-powerpc" : "elf32-powerpc")
1563 : (ppc_obj64 ? "elf64-powerpcle" : "elf32-powerpcle"));
9d8504b1 1564# endif
7f6d05e8
CP
1565#endif
1566}
1567
b9c361e0
JL
1568/* Validate one entry in powerpc_opcodes[] or vle_opcodes[].
1569 Return TRUE if there's a problem, otherwise FALSE. */
1570
1571static bfd_boolean
1572insn_validate (const struct powerpc_opcode *op)
1573{
1574 const unsigned char *o;
0f873fd5 1575 uint64_t omask = op->mask;
b9c361e0
JL
1576
1577 /* The mask had better not trim off opcode bits. */
1578 if ((op->opcode & omask) != op->opcode)
1579 {
1580 as_bad (_("mask trims opcode bits for %s"), op->name);
1581 return TRUE;
1582 }
1583
1584 /* The operands must not overlap the opcode or each other. */
1585 for (o = op->operands; *o; ++o)
1586 {
2eac3da1 1587 bfd_boolean optional = FALSE;
b9c361e0
JL
1588 if (*o >= num_powerpc_operands)
1589 {
1590 as_bad (_("operand index error for %s"), op->name);
1591 return TRUE;
1592 }
1593 else
1594 {
71553718 1595 uint64_t mask;
b9c361e0 1596 const struct powerpc_operand *operand = &powerpc_operands[*o];
71553718 1597 if (operand->shift == (int) PPC_OPSHIFT_INV)
b9c361e0 1598 {
71553718
AM
1599 const char *errmsg;
1600 int64_t val;
1601
1602 errmsg = NULL;
1603 val = -1;
1604 if ((operand->flags & PPC_OPERAND_NEGATIVE) != 0)
1605 val = -val;
1606 else if ((operand->flags & PPC_OPERAND_PLUS1) != 0)
1607 val += 1;
1608 mask = (*operand->insert) (0, val, ppc_cpu, &errmsg);
b9c361e0 1609 }
71553718
AM
1610 else if (operand->shift >= 0)
1611 mask = operand->bitm << operand->shift;
1612 else
1613 mask = operand->bitm >> -operand->shift;
1614 if (omask & mask)
1615 {
1616 as_bad (_("operand %d overlap in %s"),
1617 (int) (o - op->operands), op->name);
1618 return TRUE;
1619 }
1620 omask |= mask;
2eac3da1
AM
1621 if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0)
1622 optional = TRUE;
1623 else if (optional)
1624 {
1625 as_bad (_("non-optional operand %d follows optional operand in %s"),
1626 (int) (o - op->operands), op->name);
1627 return TRUE;
1628 }
b9c361e0
JL
1629 }
1630 }
1631 return FALSE;
1632}
1633
69c040df 1634/* Insert opcodes and macros into hash tables. Called at startup and
1fe532cf 1635 for .machine pseudo. */
252b5132 1636
69c040df
AM
1637static void
1638ppc_setup_opcodes (void)
252b5132 1639{
98027b10 1640 const struct powerpc_opcode *op;
252b5132
RH
1641 const struct powerpc_opcode *op_end;
1642 const struct powerpc_macro *macro;
1643 const struct powerpc_macro *macro_end;
b84bf58a 1644 bfd_boolean bad_insn = FALSE;
252b5132 1645
69c040df
AM
1646 if (ppc_hash != NULL)
1647 hash_die (ppc_hash);
1648 if (ppc_macro_hash != NULL)
1649 hash_die (ppc_macro_hash);
252b5132
RH
1650
1651 /* Insert the opcodes into a hash table. */
1652 ppc_hash = hash_new ();
1653
c43a438d 1654 if (ENABLE_CHECKING)
b84bf58a 1655 {
c43a438d 1656 unsigned int i;
b84bf58a 1657
3b8b57a9
AM
1658 /* An index into powerpc_operands is stored in struct fix
1659 fx_pcrel_adjust which is 8 bits wide. */
1660 gas_assert (num_powerpc_operands < 256);
1661
c43a438d
AM
1662 /* Check operand masks. Code here and in the disassembler assumes
1663 all the 1's in the mask are contiguous. */
1664 for (i = 0; i < num_powerpc_operands; ++i)
b84bf58a 1665 {
0f873fd5
PB
1666 uint64_t mask = powerpc_operands[i].bitm;
1667 uint64_t right_bit;
c43a438d
AM
1668 unsigned int j;
1669
1670 right_bit = mask & -mask;
1671 mask += right_bit;
1672 right_bit = mask & -mask;
1673 if (mask != right_bit)
1674 {
1675 as_bad (_("powerpc_operands[%d].bitm invalid"), i);
1676 bad_insn = TRUE;
1677 }
1678 for (j = i + 1; j < num_powerpc_operands; ++j)
1679 if (memcmp (&powerpc_operands[i], &powerpc_operands[j],
1680 sizeof (powerpc_operands[0])) == 0)
1681 {
1682 as_bad (_("powerpc_operands[%d] duplicates powerpc_operands[%d]"),
1683 j, i);
1684 bad_insn = TRUE;
1685 }
b84bf58a
AM
1686 }
1687 }
1688
252b5132
RH
1689 op_end = powerpc_opcodes + powerpc_num_opcodes;
1690 for (op = powerpc_opcodes; op < op_end; op++)
1691 {
c43a438d 1692 if (ENABLE_CHECKING)
b84bf58a 1693 {
2ceb7719 1694 unsigned int new_opcode = PPC_OP (op[0].opcode);
b9c361e0
JL
1695
1696#ifdef PRINT_OPCODE_TABLE
2ceb7719
PB
1697 printf ("%-14s\t#%04u\tmajor op: 0x%x\top: 0x%llx\tmask: 0x%llx\tflags: 0x%llx\n",
1698 op->name, (unsigned int) (op - powerpc_opcodes),
1699 new_opcode, (unsigned long long) op->opcode,
1700 (unsigned long long) op->mask, (unsigned long long) op->flags);
b9c361e0
JL
1701#endif
1702
2ceb7719
PB
1703 /* The major opcodes had better be sorted. Code in the disassembler
1704 assumes the insns are sorted according to major opcode. */
1705 if (op != powerpc_opcodes
1706 && new_opcode < PPC_OP (op[-1].opcode))
1707 {
1708 as_bad (_("major opcode is not sorted for %s"), op->name);
1709 bad_insn = TRUE;
8dbcd839 1710 }
2ceb7719 1711
14b57c7c
AM
1712 if ((op->flags & PPC_OPCODE_VLE) != 0)
1713 {
1714 as_bad (_("%s is enabled by vle flag"), op->name);
1715 bad_insn = TRUE;
1716 }
1717 if (PPC_OP (op->opcode) != 4
1718 && PPC_OP (op->opcode) != 31
1719 && (op->deprecated & PPC_OPCODE_VLE) == 0)
1720 {
1721 as_bad (_("%s not disabled by vle flag"), op->name);
1722 bad_insn = TRUE;
1723 }
b9c361e0
JL
1724 bad_insn |= insn_validate (op);
1725 }
c43a438d 1726
b9c361e0
JL
1727 if ((ppc_cpu & op->flags) != 0
1728 && !(ppc_cpu & op->deprecated))
1729 {
1730 const char *retval;
1731
1732 retval = hash_insert (ppc_hash, op->name, (void *) op);
1733 if (retval != NULL)
c43a438d 1734 {
b9c361e0 1735 as_bad (_("duplicate instruction %s"),
c43a438d
AM
1736 op->name);
1737 bad_insn = TRUE;
1738 }
b9c361e0
JL
1739 }
1740 }
c43a438d 1741
b9c361e0
JL
1742 if ((ppc_cpu & PPC_OPCODE_ANY) != 0)
1743 for (op = powerpc_opcodes; op < op_end; op++)
1744 hash_insert (ppc_hash, op->name, (void *) op);
1745
dd7efa79
PB
1746 op_end = prefix_opcodes + prefix_num_opcodes;
1747 for (op = prefix_opcodes; op < op_end; op++)
1748 {
1749 if (ENABLE_CHECKING)
1750 {
1751 unsigned int new_opcode = PPC_PREFIX_SEG (op[0].opcode);
1752
1753#ifdef PRINT_OPCODE_TABLE
1754 printf ("%-14s\t#%04u\tmajor op/2: 0x%x\top: 0x%llx\tmask: 0x%llx\tflags: 0x%llx\n",
1755 op->name, (unsigned int) (op - prefix_opcodes),
1756 new_opcode, (unsigned long long) op->opcode,
1757 (unsigned long long) op->mask, (unsigned long long) op->flags);
1758#endif
1759
1760 /* The major opcodes had better be sorted. Code in the disassembler
1761 assumes the insns are sorted according to major opcode. */
1762 if (op != prefix_opcodes
1763 && new_opcode < PPC_PREFIX_SEG (op[-1].opcode))
1764 {
1765 as_bad (_("major opcode is not sorted for %s"), op->name);
1766 bad_insn = TRUE;
1767 }
1768 bad_insn |= insn_validate (op);
1769 }
1770
1771 if ((ppc_cpu & op->flags) != 0
1772 && !(ppc_cpu & op->deprecated))
1773 {
1774 const char *retval;
1775
1776 retval = hash_insert (ppc_hash, op->name, (void *) op);
1777 if (retval != NULL)
1778 {
1779 as_bad (_("duplicate instruction %s"),
1780 op->name);
1781 bad_insn = TRUE;
1782 }
1783 }
1784 }
1785
1786 if ((ppc_cpu & PPC_OPCODE_ANY) != 0)
1787 for (op = prefix_opcodes; op < op_end; op++)
1788 hash_insert (ppc_hash, op->name, (void *) op);
1789
b9c361e0
JL
1790 op_end = vle_opcodes + vle_num_opcodes;
1791 for (op = vle_opcodes; op < op_end; op++)
1792 {
1793 if (ENABLE_CHECKING)
1794 {
2ceb7719 1795 unsigned new_seg = VLE_OP_TO_SEG (VLE_OP (op[0].opcode, op[0].mask));
b9c361e0
JL
1796
1797#ifdef PRINT_OPCODE_TABLE
2ceb7719
PB
1798 printf ("%-14s\t#%04u\tmajor op: 0x%x\top: 0x%llx\tmask: 0x%llx\tflags: 0x%llx\n",
1799 op->name, (unsigned int) (op - vle_opcodes),
1800 (unsigned int) new_seg, (unsigned long long) op->opcode,
1801 (unsigned long long) op->mask, (unsigned long long) op->flags);
b9c361e0 1802#endif
2ceb7719
PB
1803
1804 /* The major opcodes had better be sorted. Code in the disassembler
1805 assumes the insns are sorted according to major opcode. */
1806 if (op != vle_opcodes
1807 && new_seg < VLE_OP_TO_SEG (VLE_OP (op[-1].opcode, op[-1].mask)))
1808 {
1809 as_bad (_("major opcode is not sorted for %s"), op->name);
1810 bad_insn = TRUE;
b9c361e0
JL
1811 }
1812
1813 bad_insn |= insn_validate (op);
c43a438d 1814 }
252b5132 1815
bdc70b4a 1816 if ((ppc_cpu & op->flags) != 0
1cb0a767 1817 && !(ppc_cpu & op->deprecated))
252b5132
RH
1818 {
1819 const char *retval;
1820
98027b10 1821 retval = hash_insert (ppc_hash, op->name, (void *) op);
69c040df 1822 if (retval != NULL)
252b5132 1823 {
b84bf58a 1824 as_bad (_("duplicate instruction %s"),
99a814a1 1825 op->name);
b84bf58a 1826 bad_insn = TRUE;
252b5132
RH
1827 }
1828 }
1829 }
1830
74081948
AF
1831 /* SPE2 instructions */
1832 if ((ppc_cpu & PPC_OPCODE_SPE2) == PPC_OPCODE_SPE2)
1833 {
1834 op_end = spe2_opcodes + spe2_num_opcodes;
1835 for (op = spe2_opcodes; op < op_end; op++)
1836 {
1837 if (ENABLE_CHECKING)
1838 {
1839 if (op != spe2_opcodes)
1840 {
1841 unsigned old_seg, new_seg;
1842
1843 old_seg = VLE_OP (op[-1].opcode, op[-1].mask);
1844 old_seg = VLE_OP_TO_SEG (old_seg);
1845 new_seg = VLE_OP (op[0].opcode, op[0].mask);
1846 new_seg = VLE_OP_TO_SEG (new_seg);
1847
1848 /* The major opcodes had better be sorted. Code in the
1849 disassembler assumes the insns are sorted according to
1850 major opcode. */
1851 if (new_seg < old_seg)
1852 {
1853 as_bad (_("major opcode is not sorted for %s"), op->name);
1854 bad_insn = TRUE;
1855 }
1856 }
1857
1858 bad_insn |= insn_validate (op);
1859 }
1860
1861 if ((ppc_cpu & op->flags) != 0 && !(ppc_cpu & op->deprecated))
1862 {
1863 const char *retval;
1864
1865 retval = hash_insert (ppc_hash, op->name, (void *) op);
1866 if (retval != NULL)
1867 {
1868 as_bad (_("duplicate instruction %s"),
1869 op->name);
1870 bad_insn = TRUE;
1871 }
1872 }
1873 }
1874
1875 for (op = spe2_opcodes; op < op_end; op++)
1876 hash_insert (ppc_hash, op->name, (void *) op);
1877 }
1878
252b5132
RH
1879 /* Insert the macros into a hash table. */
1880 ppc_macro_hash = hash_new ();
1881
1882 macro_end = powerpc_macros + powerpc_num_macros;
1883 for (macro = powerpc_macros; macro < macro_end; macro++)
1884 {
33740db9 1885 if ((macro->flags & ppc_cpu) != 0 || (ppc_cpu & PPC_OPCODE_ANY) != 0)
252b5132
RH
1886 {
1887 const char *retval;
1888
98027b10 1889 retval = hash_insert (ppc_macro_hash, macro->name, (void *) macro);
252b5132
RH
1890 if (retval != (const char *) NULL)
1891 {
b84bf58a
AM
1892 as_bad (_("duplicate macro %s"), macro->name);
1893 bad_insn = TRUE;
252b5132
RH
1894 }
1895 }
1896 }
1897
b84bf58a 1898 if (bad_insn)
252b5132 1899 abort ();
69c040df
AM
1900}
1901
1902/* This function is called when the assembler starts up. It is called
1903 after the options have been parsed and the output file has been
1904 opened. */
1905
1906void
98027b10 1907md_begin (void)
69c040df
AM
1908{
1909 ppc_set_cpu ();
1910
1911 ppc_cie_data_alignment = ppc_obj64 ? -8 : -4;
8fbf7334 1912 ppc_dwarf2_line_min_insn_length = (ppc_cpu & PPC_OPCODE_VLE) ? 2 : 4;
69c040df
AM
1913
1914#ifdef OBJ_ELF
1915 /* Set the ELF flags if desired. */
1916 if (ppc_flags && !msolaris)
1917 bfd_set_private_flags (stdoutput, ppc_flags);
1918#endif
1919
1920 ppc_setup_opcodes ();
252b5132 1921
67c1ffbe 1922 /* Tell the main code what the endianness is if it is not overridden
99a814a1 1923 by the user. */
252b5132
RH
1924 if (!set_target_endian)
1925 {
1926 set_target_endian = 1;
1927 target_big_endian = PPC_BIG_ENDIAN;
1928 }
1929
1930#ifdef OBJ_XCOFF
1931 ppc_coff_debug_section = coff_section_from_bfd_index (stdoutput, N_DEBUG);
1932
1933 /* Create dummy symbols to serve as initial csects. This forces the
1934 text csects to precede the data csects. These symbols will not
1935 be output. */
1936 ppc_text_csects = symbol_make ("dummy\001");
809ffe0d 1937 symbol_get_tc (ppc_text_csects)->within = ppc_text_csects;
252b5132 1938 ppc_data_csects = symbol_make ("dummy\001");
809ffe0d 1939 symbol_get_tc (ppc_data_csects)->within = ppc_data_csects;
252b5132
RH
1940#endif
1941
1942#ifdef TE_PE
1943
1944 ppc_current_section = text_section;
81d4177b 1945 ppc_previous_section = 0;
252b5132
RH
1946
1947#endif
1948}
1949
6a0c61b7 1950void
98027b10 1951ppc_cleanup (void)
6a0c61b7 1952{
dc1d03fc 1953#ifdef OBJ_ELF
6a0c61b7
EZ
1954 if (ppc_apuinfo_list == NULL)
1955 return;
1956
1957 /* Ok, so write the section info out. We have this layout:
1958
1959 byte data what
1960 ---- ---- ----
1961 0 8 length of "APUinfo\0"
1962 4 (n*4) number of APU's (4 bytes each)
1963 8 2 note type 2
1964 12 "APUinfo\0" name
1965 20 APU#1 first APU's info
1966 24 APU#2 second APU's info
1967 ... ...
1968 */
1969 {
1970 char *p;
1971 asection *seg = now_seg;
1972 subsegT subseg = now_subseg;
1973 asection *apuinfo_secp = (asection *) NULL;
49181a6a 1974 unsigned int i;
6a0c61b7
EZ
1975
1976 /* Create the .PPC.EMB.apuinfo section. */
14b57c7c 1977 apuinfo_secp = subseg_new (APUINFO_SECTION_NAME, 0);
6a0c61b7
EZ
1978 bfd_set_section_flags (stdoutput,
1979 apuinfo_secp,
e1a9cb8e 1980 SEC_HAS_CONTENTS | SEC_READONLY);
6a0c61b7
EZ
1981
1982 p = frag_more (4);
1983 md_number_to_chars (p, (valueT) 8, 4);
1984
1985 p = frag_more (4);
e98d298c 1986 md_number_to_chars (p, (valueT) ppc_apuinfo_num * 4, 4);
6a0c61b7
EZ
1987
1988 p = frag_more (4);
1989 md_number_to_chars (p, (valueT) 2, 4);
1990
1991 p = frag_more (8);
14b57c7c 1992 strcpy (p, APUINFO_LABEL);
6a0c61b7
EZ
1993
1994 for (i = 0; i < ppc_apuinfo_num; i++)
1995 {
b34976b6
AM
1996 p = frag_more (4);
1997 md_number_to_chars (p, (valueT) ppc_apuinfo_list[i], 4);
6a0c61b7
EZ
1998 }
1999
2000 frag_align (2, 0, 0);
2001
2002 /* We probably can't restore the current segment, for there likely
2003 isn't one yet... */
2004 if (seg && subseg)
2005 subseg_set (seg, subseg);
2006 }
dc1d03fc 2007#endif
6a0c61b7
EZ
2008}
2009
252b5132
RH
2010/* Insert an operand value into an instruction. */
2011
0f873fd5
PB
2012static uint64_t
2013ppc_insert_operand (uint64_t insn,
a1867a27 2014 const struct powerpc_operand *operand,
0f873fd5 2015 int64_t val,
91d6fa6a 2016 ppc_cpu_t cpu,
3b4dbbbf 2017 const char *file,
a1867a27 2018 unsigned int line)
252b5132 2019{
0f873fd5 2020 int64_t min, max, right;
eb42fac1 2021
b84bf58a
AM
2022 max = operand->bitm;
2023 right = max & -max;
2024 min = 0;
2025
a47622ac 2026 if ((operand->flags & PPC_OPERAND_SIGNOPT) != 0)
252b5132 2027 {
a255f00a
AM
2028 /* Extend the allowed range for addis to [-32768, 65535].
2029 Similarly for cmpli and some VLE high part insns. For 64-bit
2030 it would be good to disable this for signed fields since the
a47622ac
AM
2031 value is sign extended into the high 32 bits of the register.
2032 If the value is, say, an address, then we might care about
2033 the high bits. However, gcc as of 2014-06 uses unsigned
2034 values when loading the high part of 64-bit constants using
a255f00a
AM
2035 lis. */
2036 min = ~(max >> 1) & -right;
a47622ac
AM
2037 }
2038 else if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
2039 {
2040 max = (max >> 1) & -right;
931774a9 2041 min = ~max & -right;
b84bf58a 2042 }
252b5132 2043
b84bf58a 2044 if ((operand->flags & PPC_OPERAND_PLUS1) != 0)
3896c469 2045 max++;
252b5132 2046
b84bf58a 2047 if ((operand->flags & PPC_OPERAND_NEGATIVE) != 0)
a1867a27 2048 {
0f873fd5 2049 int64_t tmp = min;
a1867a27
AM
2050 min = -max;
2051 max = -tmp;
2052 }
b84bf58a 2053
a1867a27
AM
2054 if (min <= max)
2055 {
2056 /* Some people write constants with the sign extension done by
2057 hand but only up to 32 bits. This shouldn't really be valid,
2058 but, to permit this code to assemble on a 64-bit host, we
2059 sign extend the 32-bit value to 64 bits if so doing makes the
8acf1435
PB
2060 value valid. We only do this for operands that are 32-bits or
2061 smaller. */
a1867a27 2062 if (val > max
8acf1435 2063 && (operand->bitm & ~0xffffffffULL) == 0
0f873fd5
PB
2064 && (val - (1LL << 32)) >= min
2065 && (val - (1LL << 32)) <= max
2066 && ((val - (1LL << 32)) & (right - 1)) == 0)
2067 val = val - (1LL << 32);
a1867a27
AM
2068
2069 /* Similarly, people write expressions like ~(1<<15), and expect
2070 this to be OK for a 32-bit unsigned value. */
2071 else if (val < min
8acf1435 2072 && (operand->bitm & ~0xffffffffULL) == 0
0f873fd5
PB
2073 && (val + (1LL << 32)) >= min
2074 && (val + (1LL << 32)) <= max
2075 && ((val + (1LL << 32)) & (right - 1)) == 0)
2076 val = val + (1LL << 32);
a1867a27
AM
2077
2078 else if (val < min
2079 || val > max
2080 || (val & (right - 1)) != 0)
2081 as_bad_value_out_of_range (_("operand"), val, min, max, file, line);
2082 }
b84bf58a 2083
252b5132
RH
2084 if (operand->insert)
2085 {
2086 const char *errmsg;
2087
2088 errmsg = NULL;
0f873fd5 2089 insn = (*operand->insert) (insn, val, cpu, &errmsg);
252b5132 2090 if (errmsg != (const char *) NULL)
ee2c9aa9 2091 as_bad_where (file, line, "%s", errmsg);
252b5132 2092 }
b9c361e0 2093 else if (operand->shift >= 0)
0f873fd5 2094 insn |= (val & operand->bitm) << operand->shift;
b9c361e0 2095 else
0f873fd5 2096 insn |= (val & operand->bitm) >> -operand->shift;
252b5132
RH
2097
2098 return insn;
2099}
2100
2101\f
2102#ifdef OBJ_ELF
2103/* Parse @got, etc. and return the desired relocation. */
2104static bfd_reloc_code_real_type
98027b10 2105ppc_elf_suffix (char **str_p, expressionS *exp_p)
252b5132
RH
2106{
2107 struct map_bfd {
e0471c16 2108 const char *string;
b7d7dc63
AM
2109 unsigned int length : 8;
2110 unsigned int valid32 : 1;
2111 unsigned int valid64 : 1;
2112 unsigned int reloc;
252b5132
RH
2113 };
2114
2115 char ident[20];
2116 char *str = *str_p;
2117 char *str2;
2118 int ch;
2119 int len;
15c1449b 2120 const struct map_bfd *ptr;
252b5132 2121
b7d7dc63
AM
2122#define MAP(str, reloc) { str, sizeof (str) - 1, 1, 1, reloc }
2123#define MAP32(str, reloc) { str, sizeof (str) - 1, 1, 0, reloc }
2124#define MAP64(str, reloc) { str, sizeof (str) - 1, 0, 1, reloc }
252b5132 2125
15c1449b 2126 static const struct map_bfd mapping[] = {
b7d7dc63
AM
2127 MAP ("l", BFD_RELOC_LO16),
2128 MAP ("h", BFD_RELOC_HI16),
2129 MAP ("ha", BFD_RELOC_HI16_S),
2130 MAP ("brtaken", BFD_RELOC_PPC_B16_BRTAKEN),
2131 MAP ("brntaken", BFD_RELOC_PPC_B16_BRNTAKEN),
2132 MAP ("got", BFD_RELOC_16_GOTOFF),
2133 MAP ("got@l", BFD_RELOC_LO16_GOTOFF),
2134 MAP ("got@h", BFD_RELOC_HI16_GOTOFF),
2135 MAP ("got@ha", BFD_RELOC_HI16_S_GOTOFF),
2136 MAP ("plt@l", BFD_RELOC_LO16_PLTOFF),
2137 MAP ("plt@h", BFD_RELOC_HI16_PLTOFF),
2138 MAP ("plt@ha", BFD_RELOC_HI16_S_PLTOFF),
2139 MAP ("copy", BFD_RELOC_PPC_COPY),
2140 MAP ("globdat", BFD_RELOC_PPC_GLOB_DAT),
2141 MAP ("sectoff", BFD_RELOC_16_BASEREL),
2142 MAP ("sectoff@l", BFD_RELOC_LO16_BASEREL),
2143 MAP ("sectoff@h", BFD_RELOC_HI16_BASEREL),
2144 MAP ("sectoff@ha", BFD_RELOC_HI16_S_BASEREL),
2145 MAP ("tls", BFD_RELOC_PPC_TLS),
2146 MAP ("dtpmod", BFD_RELOC_PPC_DTPMOD),
2147 MAP ("dtprel", BFD_RELOC_PPC_DTPREL),
2148 MAP ("dtprel@l", BFD_RELOC_PPC_DTPREL16_LO),
2149 MAP ("dtprel@h", BFD_RELOC_PPC_DTPREL16_HI),
2150 MAP ("dtprel@ha", BFD_RELOC_PPC_DTPREL16_HA),
2151 MAP ("tprel", BFD_RELOC_PPC_TPREL),
2152 MAP ("tprel@l", BFD_RELOC_PPC_TPREL16_LO),
2153 MAP ("tprel@h", BFD_RELOC_PPC_TPREL16_HI),
2154 MAP ("tprel@ha", BFD_RELOC_PPC_TPREL16_HA),
2155 MAP ("got@tlsgd", BFD_RELOC_PPC_GOT_TLSGD16),
2156 MAP ("got@tlsgd@l", BFD_RELOC_PPC_GOT_TLSGD16_LO),
2157 MAP ("got@tlsgd@h", BFD_RELOC_PPC_GOT_TLSGD16_HI),
2158 MAP ("got@tlsgd@ha", BFD_RELOC_PPC_GOT_TLSGD16_HA),
2159 MAP ("got@tlsld", BFD_RELOC_PPC_GOT_TLSLD16),
2160 MAP ("got@tlsld@l", BFD_RELOC_PPC_GOT_TLSLD16_LO),
2161 MAP ("got@tlsld@h", BFD_RELOC_PPC_GOT_TLSLD16_HI),
2162 MAP ("got@tlsld@ha", BFD_RELOC_PPC_GOT_TLSLD16_HA),
2163 MAP ("got@dtprel", BFD_RELOC_PPC_GOT_DTPREL16),
2164 MAP ("got@dtprel@l", BFD_RELOC_PPC_GOT_DTPREL16_LO),
2165 MAP ("got@dtprel@h", BFD_RELOC_PPC_GOT_DTPREL16_HI),
2166 MAP ("got@dtprel@ha", BFD_RELOC_PPC_GOT_DTPREL16_HA),
2167 MAP ("got@tprel", BFD_RELOC_PPC_GOT_TPREL16),
2168 MAP ("got@tprel@l", BFD_RELOC_PPC_GOT_TPREL16_LO),
2169 MAP ("got@tprel@h", BFD_RELOC_PPC_GOT_TPREL16_HI),
2170 MAP ("got@tprel@ha", BFD_RELOC_PPC_GOT_TPREL16_HA),
2171 MAP32 ("fixup", BFD_RELOC_CTOR),
2172 MAP32 ("plt", BFD_RELOC_24_PLT_PCREL),
2173 MAP32 ("pltrel24", BFD_RELOC_24_PLT_PCREL),
2174 MAP32 ("local24pc", BFD_RELOC_PPC_LOCAL24PC),
2175 MAP32 ("local", BFD_RELOC_PPC_LOCAL24PC),
2176 MAP32 ("pltrel", BFD_RELOC_32_PLT_PCREL),
2177 MAP32 ("sdarel", BFD_RELOC_GPREL16),
b9c361e0
JL
2178 MAP32 ("sdarel@l", BFD_RELOC_PPC_VLE_SDAREL_LO16A),
2179 MAP32 ("sdarel@h", BFD_RELOC_PPC_VLE_SDAREL_HI16A),
2180 MAP32 ("sdarel@ha", BFD_RELOC_PPC_VLE_SDAREL_HA16A),
b7d7dc63
AM
2181 MAP32 ("naddr", BFD_RELOC_PPC_EMB_NADDR32),
2182 MAP32 ("naddr16", BFD_RELOC_PPC_EMB_NADDR16),
2183 MAP32 ("naddr@l", BFD_RELOC_PPC_EMB_NADDR16_LO),
2184 MAP32 ("naddr@h", BFD_RELOC_PPC_EMB_NADDR16_HI),
2185 MAP32 ("naddr@ha", BFD_RELOC_PPC_EMB_NADDR16_HA),
2186 MAP32 ("sdai16", BFD_RELOC_PPC_EMB_SDAI16),
2187 MAP32 ("sda2rel", BFD_RELOC_PPC_EMB_SDA2REL),
2188 MAP32 ("sda2i16", BFD_RELOC_PPC_EMB_SDA2I16),
2189 MAP32 ("sda21", BFD_RELOC_PPC_EMB_SDA21),
b9c361e0 2190 MAP32 ("sda21@l", BFD_RELOC_PPC_VLE_SDA21_LO),
b7d7dc63
AM
2191 MAP32 ("mrkref", BFD_RELOC_PPC_EMB_MRKREF),
2192 MAP32 ("relsect", BFD_RELOC_PPC_EMB_RELSEC16),
2193 MAP32 ("relsect@l", BFD_RELOC_PPC_EMB_RELST_LO),
2194 MAP32 ("relsect@h", BFD_RELOC_PPC_EMB_RELST_HI),
2195 MAP32 ("relsect@ha", BFD_RELOC_PPC_EMB_RELST_HA),
2196 MAP32 ("bitfld", BFD_RELOC_PPC_EMB_BIT_FLD),
2197 MAP32 ("relsda", BFD_RELOC_PPC_EMB_RELSDA),
2198 MAP32 ("xgot", BFD_RELOC_PPC_TOC16),
f9c6b907
AM
2199 MAP64 ("high", BFD_RELOC_PPC64_ADDR16_HIGH),
2200 MAP64 ("higha", BFD_RELOC_PPC64_ADDR16_HIGHA),
b7d7dc63
AM
2201 MAP64 ("higher", BFD_RELOC_PPC64_HIGHER),
2202 MAP64 ("highera", BFD_RELOC_PPC64_HIGHER_S),
2203 MAP64 ("highest", BFD_RELOC_PPC64_HIGHEST),
2204 MAP64 ("highesta", BFD_RELOC_PPC64_HIGHEST_S),
2205 MAP64 ("tocbase", BFD_RELOC_PPC64_TOC),
2206 MAP64 ("toc", BFD_RELOC_PPC_TOC16),
2207 MAP64 ("toc@l", BFD_RELOC_PPC64_TOC16_LO),
2208 MAP64 ("toc@h", BFD_RELOC_PPC64_TOC16_HI),
2209 MAP64 ("toc@ha", BFD_RELOC_PPC64_TOC16_HA),
f9c6b907
AM
2210 MAP64 ("dtprel@high", BFD_RELOC_PPC64_DTPREL16_HIGH),
2211 MAP64 ("dtprel@higha", BFD_RELOC_PPC64_DTPREL16_HIGHA),
b7d7dc63
AM
2212 MAP64 ("dtprel@higher", BFD_RELOC_PPC64_DTPREL16_HIGHER),
2213 MAP64 ("dtprel@highera", BFD_RELOC_PPC64_DTPREL16_HIGHERA),
2214 MAP64 ("dtprel@highest", BFD_RELOC_PPC64_DTPREL16_HIGHEST),
2215 MAP64 ("dtprel@highesta", BFD_RELOC_PPC64_DTPREL16_HIGHESTA),
45965137 2216 MAP64 ("localentry", BFD_RELOC_PPC64_ADDR64_LOCAL),
f9c6b907
AM
2217 MAP64 ("tprel@high", BFD_RELOC_PPC64_TPREL16_HIGH),
2218 MAP64 ("tprel@higha", BFD_RELOC_PPC64_TPREL16_HIGHA),
b7d7dc63
AM
2219 MAP64 ("tprel@higher", BFD_RELOC_PPC64_TPREL16_HIGHER),
2220 MAP64 ("tprel@highera", BFD_RELOC_PPC64_TPREL16_HIGHERA),
2221 MAP64 ("tprel@highest", BFD_RELOC_PPC64_TPREL16_HIGHEST),
2222 MAP64 ("tprel@highesta", BFD_RELOC_PPC64_TPREL16_HIGHESTA),
05d0e962 2223 MAP64 ("notoc", BFD_RELOC_PPC64_REL24_NOTOC),
5663e321
AM
2224 MAP64 ("pcrel", BFD_RELOC_PPC64_PCREL34),
2225 MAP64 ("got@pcrel", BFD_RELOC_PPC64_GOT_PCREL34),
2226 MAP64 ("plt@pcrel", BFD_RELOC_PPC64_PLT_PCREL34),
2227 MAP64 ("higher34", BFD_RELOC_PPC64_ADDR16_HIGHER34),
2228 MAP64 ("highera34", BFD_RELOC_PPC64_ADDR16_HIGHERA34),
2229 MAP64 ("highest34", BFD_RELOC_PPC64_ADDR16_HIGHEST34),
2230 MAP64 ("highesta34", BFD_RELOC_PPC64_ADDR16_HIGHESTA34),
62ebcb5c 2231 { (char *) 0, 0, 0, 0, BFD_RELOC_NONE }
252b5132
RH
2232 };
2233
2234 if (*str++ != '@')
62ebcb5c 2235 return BFD_RELOC_NONE;
252b5132
RH
2236
2237 for (ch = *str, str2 = ident;
2238 (str2 < ident + sizeof (ident) - 1
3882b010 2239 && (ISALNUM (ch) || ch == '@'));
252b5132
RH
2240 ch = *++str)
2241 {
3882b010 2242 *str2++ = TOLOWER (ch);
252b5132
RH
2243 }
2244
2245 *str2 = '\0';
2246 len = str2 - ident;
2247
2248 ch = ident[0];
2249 for (ptr = &mapping[0]; ptr->length > 0; ptr++)
2250 if (ch == ptr->string[0]
2251 && len == ptr->length
b7d7dc63
AM
2252 && memcmp (ident, ptr->string, ptr->length) == 0
2253 && (ppc_obj64 ? ptr->valid64 : ptr->valid32))
252b5132 2254 {
15c1449b
AM
2255 int reloc = ptr->reloc;
2256
727fc41e
AM
2257 if (!ppc_obj64 && exp_p->X_add_number != 0)
2258 {
2259 switch (reloc)
2260 {
2261 case BFD_RELOC_16_GOTOFF:
2262 case BFD_RELOC_LO16_GOTOFF:
2263 case BFD_RELOC_HI16_GOTOFF:
2264 case BFD_RELOC_HI16_S_GOTOFF:
2265 as_warn (_("identifier+constant@got means "
2266 "identifier@got+constant"));
2267 break;
2268
2269 case BFD_RELOC_PPC_GOT_TLSGD16:
2270 case BFD_RELOC_PPC_GOT_TLSGD16_LO:
2271 case BFD_RELOC_PPC_GOT_TLSGD16_HI:
2272 case BFD_RELOC_PPC_GOT_TLSGD16_HA:
2273 case BFD_RELOC_PPC_GOT_TLSLD16:
2274 case BFD_RELOC_PPC_GOT_TLSLD16_LO:
2275 case BFD_RELOC_PPC_GOT_TLSLD16_HI:
2276 case BFD_RELOC_PPC_GOT_TLSLD16_HA:
2277 case BFD_RELOC_PPC_GOT_DTPREL16:
2278 case BFD_RELOC_PPC_GOT_DTPREL16_LO:
2279 case BFD_RELOC_PPC_GOT_DTPREL16_HI:
2280 case BFD_RELOC_PPC_GOT_DTPREL16_HA:
2281 case BFD_RELOC_PPC_GOT_TPREL16:
2282 case BFD_RELOC_PPC_GOT_TPREL16_LO:
2283 case BFD_RELOC_PPC_GOT_TPREL16_HI:
2284 case BFD_RELOC_PPC_GOT_TPREL16_HA:
2285 as_bad (_("symbol+offset not supported for got tls"));
2286 break;
2287 }
2288 }
5f6db75a
AM
2289
2290 /* Now check for identifier@suffix+constant. */
2291 if (*str == '-' || *str == '+')
252b5132 2292 {
5f6db75a
AM
2293 char *orig_line = input_line_pointer;
2294 expressionS new_exp;
2295
2296 input_line_pointer = str;
2297 expression (&new_exp);
2298 if (new_exp.X_op == O_constant)
252b5132 2299 {
5f6db75a
AM
2300 exp_p->X_add_number += new_exp.X_add_number;
2301 str = input_line_pointer;
252b5132 2302 }
5f6db75a
AM
2303
2304 if (&input_line_pointer != str_p)
2305 input_line_pointer = orig_line;
252b5132 2306 }
252b5132 2307 *str_p = str;
0baf16f2 2308
2b3c4602 2309 if (reloc == (int) BFD_RELOC_PPC64_TOC
9f2b53d7
AM
2310 && exp_p->X_op == O_symbol
2311 && strcmp (S_GET_NAME (exp_p->X_add_symbol), ".TOC.") == 0)
0baf16f2 2312 {
9f2b53d7
AM
2313 /* Change the symbol so that the dummy .TOC. symbol can be
2314 omitted from the object file. */
0baf16f2
AM
2315 exp_p->X_add_symbol = &abs_symbol;
2316 }
2317
15c1449b 2318 return (bfd_reloc_code_real_type) reloc;
252b5132
RH
2319 }
2320
62ebcb5c 2321 return BFD_RELOC_NONE;
252b5132
RH
2322}
2323
62ebcb5c 2324/* Support @got, etc. on constants emitted via .short, .int etc. */
99a814a1 2325
62ebcb5c
AM
2326bfd_reloc_code_real_type
2327ppc_elf_parse_cons (expressionS *exp, unsigned int nbytes)
2328{
2329 expression (exp);
2330 if (nbytes >= 2 && *input_line_pointer == '@')
2331 return ppc_elf_suffix (&input_line_pointer, exp);
2332 return BFD_RELOC_NONE;
252b5132
RH
2333}
2334
bf7279d5
AM
2335/* Warn when emitting data to code sections, unless we are emitting
2336 a relocation that ld --ppc476-workaround uses to recognise data
2337 *and* there was an unconditional branch prior to the data. */
2338
2339void
2340ppc_elf_cons_fix_check (expressionS *exp ATTRIBUTE_UNUSED,
2341 unsigned int nbytes, fixS *fix)
2342{
2343 if (warn_476
2344 && (now_seg->flags & SEC_CODE) != 0
2345 && (nbytes != 4
2346 || fix == NULL
2347 || !(fix->fx_r_type == BFD_RELOC_32
2348 || fix->fx_r_type == BFD_RELOC_CTOR
2349 || fix->fx_r_type == BFD_RELOC_32_PCREL)
2350 || !(last_seg == now_seg && last_subseg == now_subseg)
2351 || !((last_insn & (0x3f << 26)) == (18u << 26)
2352 || ((last_insn & (0x3f << 26)) == (16u << 26)
2353 && (last_insn & (0x14 << 21)) == (0x14 << 21))
2354 || ((last_insn & (0x3f << 26)) == (19u << 26)
2355 && (last_insn & (0x3ff << 1)) == (16u << 1)
2356 && (last_insn & (0x14 << 21)) == (0x14 << 21)))))
2357 {
2358 /* Flag that we've warned. */
2359 if (fix != NULL)
2360 fix->fx_tcbit = 1;
2361
2362 as_warn (_("data in executable section"));
2363 }
2364}
2365
252b5132
RH
2366/* Solaris pseduo op to change to the .rodata section. */
2367static void
98027b10 2368ppc_elf_rdata (int xxx)
252b5132
RH
2369{
2370 char *save_line = input_line_pointer;
2371 static char section[] = ".rodata\n";
2372
99a814a1 2373 /* Just pretend this is .section .rodata */
252b5132
RH
2374 input_line_pointer = section;
2375 obj_elf_section (xxx);
2376
2377 input_line_pointer = save_line;
2378}
2379
99a814a1 2380/* Pseudo op to make file scope bss items. */
252b5132 2381static void
98027b10 2382ppc_elf_lcomm (int xxx ATTRIBUTE_UNUSED)
252b5132 2383{
98027b10
AM
2384 char *name;
2385 char c;
2386 char *p;
252b5132 2387 offsetT size;
98027b10 2388 symbolS *symbolP;
252b5132
RH
2389 offsetT align;
2390 segT old_sec;
2391 int old_subsec;
2392 char *pfrag;
2393 int align2;
2394
d02603dc 2395 c = get_symbol_name (&name);
252b5132 2396
d02603dc 2397 /* Just after name is now '\0'. */
252b5132
RH
2398 p = input_line_pointer;
2399 *p = c;
d02603dc 2400 SKIP_WHITESPACE_AFTER_NAME ();
252b5132
RH
2401 if (*input_line_pointer != ',')
2402 {
d6ed37ed 2403 as_bad (_("expected comma after symbol-name: rest of line ignored."));
252b5132
RH
2404 ignore_rest_of_line ();
2405 return;
2406 }
2407
2408 input_line_pointer++; /* skip ',' */
2409 if ((size = get_absolute_expression ()) < 0)
2410 {
2411 as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) size);
2412 ignore_rest_of_line ();
2413 return;
2414 }
2415
2416 /* The third argument to .lcomm is the alignment. */
2417 if (*input_line_pointer != ',')
2418 align = 8;
2419 else
2420 {
2421 ++input_line_pointer;
2422 align = get_absolute_expression ();
2423 if (align <= 0)
2424 {
2425 as_warn (_("ignoring bad alignment"));
2426 align = 8;
2427 }
2428 }
2429
2430 *p = 0;
2431 symbolP = symbol_find_or_make (name);
2432 *p = c;
2433
2434 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
2435 {
d6ed37ed 2436 as_bad (_("ignoring attempt to re-define symbol `%s'."),
252b5132
RH
2437 S_GET_NAME (symbolP));
2438 ignore_rest_of_line ();
2439 return;
2440 }
2441
2442 if (S_GET_VALUE (symbolP) && S_GET_VALUE (symbolP) != (valueT) size)
2443 {
d6ed37ed 2444 as_bad (_("length of .lcomm \"%s\" is already %ld. Not changed to %ld."),
252b5132
RH
2445 S_GET_NAME (symbolP),
2446 (long) S_GET_VALUE (symbolP),
2447 (long) size);
2448
2449 ignore_rest_of_line ();
2450 return;
2451 }
2452
99a814a1 2453 /* Allocate_bss. */
252b5132
RH
2454 old_sec = now_seg;
2455 old_subsec = now_subseg;
2456 if (align)
2457 {
99a814a1 2458 /* Convert to a power of 2 alignment. */
252b5132
RH
2459 for (align2 = 0; (align & 1) == 0; align >>= 1, ++align2);
2460 if (align != 1)
2461 {
d6ed37ed 2462 as_bad (_("common alignment not a power of 2"));
252b5132
RH
2463 ignore_rest_of_line ();
2464 return;
2465 }
2466 }
2467 else
2468 align2 = 0;
2469
2470 record_alignment (bss_section, align2);
cbe02d4f 2471 subseg_set (bss_section, 1);
252b5132
RH
2472 if (align2)
2473 frag_align (align2, 0, 0);
2474 if (S_GET_SEGMENT (symbolP) == bss_section)
49309057
ILT
2475 symbol_get_frag (symbolP)->fr_symbol = 0;
2476 symbol_set_frag (symbolP, frag_now);
252b5132
RH
2477 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP, size,
2478 (char *) 0);
2479 *pfrag = 0;
2480 S_SET_SIZE (symbolP, size);
2481 S_SET_SEGMENT (symbolP, bss_section);
2482 subseg_set (old_sec, old_subsec);
2483 demand_empty_rest_of_line ();
2484}
2485
6911b7dc
AM
2486/* Pseudo op to set symbol local entry point. */
2487static void
2488ppc_elf_localentry (int ignore ATTRIBUTE_UNUSED)
2489{
d02603dc
NC
2490 char *name;
2491 char c = get_symbol_name (&name);
6911b7dc
AM
2492 char *p;
2493 expressionS exp;
2494 symbolS *sym;
2495 asymbol *bfdsym;
2496 elf_symbol_type *elfsym;
2497
2498 p = input_line_pointer;
2499 *p = c;
d02603dc 2500 SKIP_WHITESPACE_AFTER_NAME ();
6911b7dc
AM
2501 if (*input_line_pointer != ',')
2502 {
2503 *p = 0;
2504 as_bad (_("expected comma after name `%s' in .localentry directive"),
2505 name);
2506 *p = c;
2507 ignore_rest_of_line ();
2508 return;
2509 }
2510 input_line_pointer++;
2511 expression (&exp);
2512 if (exp.X_op == O_absent)
2513 {
2514 as_bad (_("missing expression in .localentry directive"));
2515 exp.X_op = O_constant;
2516 exp.X_add_number = 0;
2517 }
2518 *p = 0;
2519 sym = symbol_find_or_make (name);
2520 *p = c;
2521
2522 if (resolve_expression (&exp)
2523 && exp.X_op == O_constant)
2524 {
33cb30a1 2525 unsigned int encoded, ok;
6911b7dc 2526
33cb30a1
AM
2527 ok = 1;
2528 if (exp.X_add_number == 1 || exp.X_add_number == 7)
2529 encoded = exp.X_add_number << STO_PPC64_LOCAL_BIT;
6911b7dc 2530 else
33cb30a1
AM
2531 {
2532 encoded = PPC64_SET_LOCAL_ENTRY_OFFSET (exp.X_add_number);
2533 if (exp.X_add_number != (offsetT) PPC64_LOCAL_ENTRY_OFFSET (encoded))
2534 {
2535 as_bad (_(".localentry expression for `%s' "
2536 "is not a valid power of 2"), S_GET_NAME (sym));
2537 ok = 0;
2538 }
2539 }
2540 if (ok)
6911b7dc
AM
2541 {
2542 bfdsym = symbol_get_bfdsym (sym);
2543 elfsym = elf_symbol_from (bfd_asymbol_bfd (bfdsym), bfdsym);
2544 gas_assert (elfsym);
2545 elfsym->internal_elf_sym.st_other &= ~STO_PPC64_LOCAL_MASK;
2546 elfsym->internal_elf_sym.st_other |= encoded;
2547 if (ppc_abiversion == 0)
2548 ppc_abiversion = 2;
2549 }
2550 }
2551 else
2552 as_bad (_(".localentry expression for `%s' "
2553 "does not evaluate to a constant"), S_GET_NAME (sym));
2554
2555 demand_empty_rest_of_line ();
2556}
2557
ee67d69a
AM
2558/* Pseudo op to set ABI version. */
2559static void
2560ppc_elf_abiversion (int ignore ATTRIBUTE_UNUSED)
2561{
2562 expressionS exp;
2563
2564 expression (&exp);
2565 if (exp.X_op == O_absent)
2566 {
2567 as_bad (_("missing expression in .abiversion directive"));
2568 exp.X_op = O_constant;
2569 exp.X_add_number = 0;
2570 }
2571
2572 if (resolve_expression (&exp)
2573 && exp.X_op == O_constant)
2574 ppc_abiversion = exp.X_add_number;
2575 else
2576 as_bad (_(".abiversion expression does not evaluate to a constant"));
2577 demand_empty_rest_of_line ();
2578}
2579
005d79fd
AM
2580/* Parse a .gnu_attribute directive. */
2581static void
2582ppc_elf_gnu_attribute (int ignored ATTRIBUTE_UNUSED)
2583{
2584 int tag = obj_elf_vendor_attribute (OBJ_ATTR_GNU);
2585
2586 /* Check validity of defined powerpc tags. */
2587 if (tag == Tag_GNU_Power_ABI_FP
2588 || tag == Tag_GNU_Power_ABI_Vector
2589 || tag == Tag_GNU_Power_ABI_Struct_Return)
2590 {
2591 unsigned int val;
2592
2593 val = bfd_elf_get_obj_attr_int (stdoutput, OBJ_ATTR_GNU, tag);
2594
2595 if ((tag == Tag_GNU_Power_ABI_FP && val > 15)
2596 || (tag == Tag_GNU_Power_ABI_Vector && val > 3)
2597 || (tag == Tag_GNU_Power_ABI_Struct_Return && val > 2))
2598 as_warn (_("unknown .gnu_attribute value"));
2599 }
2600}
2601
ee67d69a
AM
2602/* Set ABI version in output file. */
2603void
2604ppc_elf_end (void)
2605{
2606 if (ppc_obj64 && ppc_abiversion != 0)
2607 {
2608 elf_elfheader (stdoutput)->e_flags &= ~EF_PPC64_ABI;
2609 elf_elfheader (stdoutput)->e_flags |= ppc_abiversion & EF_PPC64_ABI;
2610 }
2611}
2612
252b5132
RH
2613/* Validate any relocations emitted for -mrelocatable, possibly adding
2614 fixups for word relocations in writable segments, so we can adjust
2615 them at runtime. */
2616static void
98027b10 2617ppc_elf_validate_fix (fixS *fixp, segT seg)
252b5132
RH
2618{
2619 if (fixp->fx_done || fixp->fx_pcrel)
2620 return;
2621
2622 switch (shlib)
2623 {
2624 case SHLIB_NONE:
2625 case SHLIB_PIC:
2626 return;
2627
5d6f4f16 2628 case SHLIB_MRELOCATABLE:
62ebcb5c 2629 if (fixp->fx_r_type != BFD_RELOC_16_GOTOFF
252b5132
RH
2630 && fixp->fx_r_type != BFD_RELOC_HI16_GOTOFF
2631 && fixp->fx_r_type != BFD_RELOC_LO16_GOTOFF
2632 && fixp->fx_r_type != BFD_RELOC_HI16_S_GOTOFF
1cfc59d5 2633 && fixp->fx_r_type != BFD_RELOC_16_BASEREL
252b5132
RH
2634 && fixp->fx_r_type != BFD_RELOC_LO16_BASEREL
2635 && fixp->fx_r_type != BFD_RELOC_HI16_BASEREL
2636 && fixp->fx_r_type != BFD_RELOC_HI16_S_BASEREL
e138127a 2637 && (seg->flags & SEC_LOAD) != 0
252b5132
RH
2638 && strcmp (segment_name (seg), ".got2") != 0
2639 && strcmp (segment_name (seg), ".dtors") != 0
2640 && strcmp (segment_name (seg), ".ctors") != 0
2641 && strcmp (segment_name (seg), ".fixup") != 0
252b5132
RH
2642 && strcmp (segment_name (seg), ".gcc_except_table") != 0
2643 && strcmp (segment_name (seg), ".eh_frame") != 0
2644 && strcmp (segment_name (seg), ".ex_shared") != 0)
2645 {
2646 if ((seg->flags & (SEC_READONLY | SEC_CODE)) != 0
2647 || fixp->fx_r_type != BFD_RELOC_CTOR)
2648 {
2649 as_bad_where (fixp->fx_file, fixp->fx_line,
d6ed37ed 2650 _("relocation cannot be done when using -mrelocatable"));
252b5132
RH
2651 }
2652 }
2653 return;
2654 }
2655}
0baf16f2 2656
7e8d4ab4
AM
2657/* Prevent elf_frob_file_before_adjust removing a weak undefined
2658 function descriptor sym if the corresponding code sym is used. */
2659
2660void
98027b10 2661ppc_frob_file_before_adjust (void)
0baf16f2 2662{
7e8d4ab4 2663 symbolS *symp;
9232bbb0 2664 asection *toc;
0baf16f2 2665
7e8d4ab4
AM
2666 if (!ppc_obj64)
2667 return;
2668
2669 for (symp = symbol_rootP; symp; symp = symbol_next (symp))
0baf16f2 2670 {
7e8d4ab4
AM
2671 const char *name;
2672 char *dotname;
2673 symbolS *dotsym;
7e8d4ab4
AM
2674
2675 name = S_GET_NAME (symp);
2676 if (name[0] == '.')
2677 continue;
2678
2679 if (! S_IS_WEAK (symp)
2680 || S_IS_DEFINED (symp))
2681 continue;
2682
a44e2901 2683 dotname = concat (".", name, (char *) NULL);
461b725f 2684 dotsym = symbol_find_noref (dotname, 1);
7e8d4ab4
AM
2685 free (dotname);
2686 if (dotsym != NULL && (symbol_used_p (dotsym)
2687 || symbol_used_in_reloc_p (dotsym)))
670ec21d
NC
2688 symbol_mark_used (symp);
2689
0baf16f2
AM
2690 }
2691
9232bbb0
AM
2692 toc = bfd_get_section_by_name (stdoutput, ".toc");
2693 if (toc != NULL
01efc3af 2694 && toc_reloc_types != has_large_toc_reloc
9232bbb0
AM
2695 && bfd_section_size (stdoutput, toc) > 0x10000)
2696 as_warn (_("TOC section size exceeds 64k"));
a38a07e0
AM
2697}
2698
2699/* .TOC. used in an opd entry as .TOC.@tocbase doesn't need to be
2700 emitted. Other uses of .TOC. will cause the symbol to be marked
2701 with BSF_KEEP in md_apply_fix. */
9232bbb0 2702
a38a07e0
AM
2703void
2704ppc_elf_adjust_symtab (void)
2705{
2706 if (ppc_obj64)
2707 {
2708 symbolS *symp;
2709 symp = symbol_find (".TOC.");
2710 if (symp != NULL)
2711 {
2712 asymbol *bsym = symbol_get_bfdsym (symp);
2713 if ((bsym->flags & BSF_KEEP) == 0)
2714 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
a38a07e0
AM
2715 }
2716 }
0baf16f2 2717}
252b5132
RH
2718#endif /* OBJ_ELF */
2719\f
2720#ifdef TE_PE
2721
2722/*
99a814a1 2723 * Summary of parse_toc_entry.
252b5132
RH
2724 *
2725 * in: Input_line_pointer points to the '[' in one of:
2726 *
2727 * [toc] [tocv] [toc32] [toc64]
2728 *
2729 * Anything else is an error of one kind or another.
2730 *
81d4177b 2731 * out:
252b5132
RH
2732 * return value: success or failure
2733 * toc_kind: kind of toc reference
2734 * input_line_pointer:
2735 * success: first char after the ']'
2736 * failure: unchanged
2737 *
2738 * settings:
2739 *
2740 * [toc] - rv == success, toc_kind = default_toc
2741 * [tocv] - rv == success, toc_kind = data_in_toc
2742 * [toc32] - rv == success, toc_kind = must_be_32
2743 * [toc64] - rv == success, toc_kind = must_be_64
2744 *
2745 */
2746
81d4177b
KH
2747enum toc_size_qualifier
2748{
252b5132
RH
2749 default_toc, /* The toc cell constructed should be the system default size */
2750 data_in_toc, /* This is a direct reference to a toc cell */
2751 must_be_32, /* The toc cell constructed must be 32 bits wide */
2752 must_be_64 /* The toc cell constructed must be 64 bits wide */
2753};
2754
2755static int
98027b10 2756parse_toc_entry (enum toc_size_qualifier *toc_kind)
252b5132
RH
2757{
2758 char *start;
2759 char *toc_spec;
2760 char c;
2761 enum toc_size_qualifier t;
2762
99a814a1 2763 /* Save the input_line_pointer. */
252b5132
RH
2764 start = input_line_pointer;
2765
99a814a1 2766 /* Skip over the '[' , and whitespace. */
252b5132
RH
2767 ++input_line_pointer;
2768 SKIP_WHITESPACE ();
81d4177b 2769
99a814a1 2770 /* Find the spelling of the operand. */
d02603dc 2771 c = get_symbol_name (&toc_spec);
252b5132 2772
99a814a1 2773 if (strcmp (toc_spec, "toc") == 0)
252b5132
RH
2774 {
2775 t = default_toc;
2776 }
99a814a1 2777 else if (strcmp (toc_spec, "tocv") == 0)
252b5132
RH
2778 {
2779 t = data_in_toc;
2780 }
99a814a1 2781 else if (strcmp (toc_spec, "toc32") == 0)
252b5132
RH
2782 {
2783 t = must_be_32;
2784 }
99a814a1 2785 else if (strcmp (toc_spec, "toc64") == 0)
252b5132
RH
2786 {
2787 t = must_be_64;
2788 }
2789 else
2790 {
2791 as_bad (_("syntax error: invalid toc specifier `%s'"), toc_spec);
99a814a1
AM
2792 *input_line_pointer = c;
2793 input_line_pointer = start;
252b5132
RH
2794 return 0;
2795 }
2796
99a814a1
AM
2797 /* Now find the ']'. */
2798 *input_line_pointer = c;
252b5132 2799
d02603dc 2800 SKIP_WHITESPACE_AFTER_NAME (); /* leading whitespace could be there. */
81d4177b 2801 c = *input_line_pointer++; /* input_line_pointer->past char in c. */
252b5132
RH
2802
2803 if (c != ']')
2804 {
2805 as_bad (_("syntax error: expected `]', found `%c'"), c);
99a814a1 2806 input_line_pointer = start;
252b5132
RH
2807 return 0;
2808 }
2809
99a814a1 2810 *toc_kind = t;
252b5132
RH
2811 return 1;
2812}
2813#endif
3b8b57a9 2814
3e60bf4d 2815#if defined (OBJ_XCOFF) || defined (OBJ_ELF)
3b8b57a9
AM
2816/* See whether a symbol is in the TOC section. */
2817
2818static int
2819ppc_is_toc_sym (symbolS *sym)
2820{
3e60bf4d 2821#ifdef OBJ_XCOFF
9f6e76f4
TG
2822 return (symbol_get_tc (sym)->symbol_class == XMC_TC
2823 || symbol_get_tc (sym)->symbol_class == XMC_TC0);
f50c47f1 2824#endif
3e60bf4d
AM
2825#ifdef OBJ_ELF
2826 const char *sname = segment_name (S_GET_SEGMENT (sym));
2827 if (ppc_obj64)
2828 return strcmp (sname, ".toc") == 0;
2829 else
2830 return strcmp (sname, ".got") == 0;
2831#endif
2832}
2833#endif /* defined (OBJ_XCOFF) || defined (OBJ_ELF) */
252b5132
RH
2834\f
2835
dc1d03fc 2836#ifdef OBJ_ELF
6a0c61b7
EZ
2837#define APUID(a,v) ((((a) & 0xffff) << 16) | ((v) & 0xffff))
2838static void
98027b10 2839ppc_apuinfo_section_add (unsigned int apu, unsigned int version)
6a0c61b7
EZ
2840{
2841 unsigned int i;
2842
2843 /* Check we don't already exist. */
2844 for (i = 0; i < ppc_apuinfo_num; i++)
dc1d03fc 2845 if (ppc_apuinfo_list[i] == APUID (apu, version))
6a0c61b7 2846 return;
b34976b6 2847
6a0c61b7
EZ
2848 if (ppc_apuinfo_num == ppc_apuinfo_num_alloc)
2849 {
2850 if (ppc_apuinfo_num_alloc == 0)
2851 {
2852 ppc_apuinfo_num_alloc = 4;
325801bd 2853 ppc_apuinfo_list = XNEWVEC (unsigned long, ppc_apuinfo_num_alloc);
6a0c61b7
EZ
2854 }
2855 else
2856 {
2857 ppc_apuinfo_num_alloc += 4;
325801bd
TS
2858 ppc_apuinfo_list = XRESIZEVEC (unsigned long, ppc_apuinfo_list,
2859 ppc_apuinfo_num_alloc);
6a0c61b7
EZ
2860 }
2861 }
dc1d03fc 2862 ppc_apuinfo_list[ppc_apuinfo_num++] = APUID (apu, version);
6a0c61b7
EZ
2863}
2864#undef APUID
dc1d03fc 2865#endif
6a0c61b7 2866\f
dd7efa79
PB
2867/* Various frobbings of labels and their addresses. */
2868
2869/* Symbols labelling the current insn. */
2870struct insn_label_list
2871{
2872 struct insn_label_list *next;
2873 symbolS *label;
2874};
2875
2876static struct insn_label_list *insn_labels;
2877static struct insn_label_list *free_insn_labels;
2878
2879static void
2880ppc_record_label (symbolS *sym)
2881{
2882 struct insn_label_list *l;
2883
2884 if (free_insn_labels == NULL)
2885 l = XNEW (struct insn_label_list);
2886 else
2887 {
2888 l = free_insn_labels;
2889 free_insn_labels = l->next;
2890 }
2891
2892 l->label = sym;
2893 l->next = insn_labels;
2894 insn_labels = l;
2895}
2896
2897static void
2898ppc_clear_labels (void)
2899{
2900 while (insn_labels != NULL)
2901 {
2902 struct insn_label_list *l = insn_labels;
2903 insn_labels = l->next;
2904 l->next = free_insn_labels;
2905 free_insn_labels = l;
2906 }
2907}
2908
2909void
2910ppc_start_line_hook (void)
2911{
2912 ppc_clear_labels ();
2913}
2914
2915void
2916ppc_new_dot_label (symbolS *sym)
2917{
2918 ppc_record_label (sym);
2919#ifdef OBJ_XCOFF
2920 /* Anchor this label to the current csect for relocations. */
2921 symbol_get_tc (sym)->within = ppc_current_csect;
2922#endif
2923}
2924
2925void
2926ppc_frob_label (symbolS *sym)
2927{
2928 ppc_record_label (sym);
2929
2930#ifdef OBJ_XCOFF
2931 /* Set the class of a label based on where it is defined. This handles
2932 symbols without suffixes. Also, move the symbol so that it follows
2933 the csect symbol. */
2934 if (ppc_current_csect != (symbolS *) NULL)
2935 {
2936 if (symbol_get_tc (sym)->symbol_class == -1)
2937 symbol_get_tc (sym)->symbol_class = symbol_get_tc (ppc_current_csect)->symbol_class;
2938
2939 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
2940 symbol_append (sym, symbol_get_tc (ppc_current_csect)->within,
2941 &symbol_rootP, &symbol_lastP);
2942 symbol_get_tc (ppc_current_csect)->within = sym;
2943 symbol_get_tc (sym)->within = ppc_current_csect;
2944 }
2945#endif
2946
2947#ifdef OBJ_ELF
2948 dwarf2_emit_label (sym);
2949#endif
2950}
6a0c61b7 2951
252b5132
RH
2952/* We need to keep a list of fixups. We can't simply generate them as
2953 we go, because that would require us to first create the frag, and
2954 that would screw up references to ``.''. */
2955
2956struct ppc_fixup
2957{
2958 expressionS exp;
2959 int opindex;
2960 bfd_reloc_code_real_type reloc;
2961};
2962
2963#define MAX_INSN_FIXUPS (5)
2964
0e2779e9
AM
2965/* Return the field size operated on by RELOC, and whether it is
2966 pc-relative in PC_RELATIVE. */
2967
2968static unsigned int
2969fixup_size (bfd_reloc_code_real_type reloc, bfd_boolean *pc_relative)
2970{
2971 unsigned int size = 0;
2972 bfd_boolean pcrel = FALSE;
2973
2974 switch (reloc)
2975 {
2976 /* This switch statement must handle all BFD_RELOC values
2977 possible in instruction fixups. As is, it handles all
2978 BFD_RELOC values used in bfd/elf64-ppc.c, bfd/elf32-ppc.c,
2979 bfd/coff-ppc, bfd/coff-rs6000.c and bfd/coff64-rs6000.c.
2980 Overkill since data and marker relocs need not be handled
2981 here, but this way we can be sure a needed fixup reloc isn't
2982 accidentally omitted. */
2983 case BFD_RELOC_PPC_EMB_MRKREF:
2984 case BFD_RELOC_VTABLE_ENTRY:
2985 case BFD_RELOC_VTABLE_INHERIT:
2986 break;
2987
2988 case BFD_RELOC_8:
2989 size = 1;
2990 break;
2991
2992 case BFD_RELOC_16:
2993 case BFD_RELOC_16_BASEREL:
2994 case BFD_RELOC_16_GOTOFF:
2995 case BFD_RELOC_GPREL16:
2996 case BFD_RELOC_HI16:
2997 case BFD_RELOC_HI16_BASEREL:
2998 case BFD_RELOC_HI16_GOTOFF:
2999 case BFD_RELOC_HI16_PLTOFF:
3000 case BFD_RELOC_HI16_S:
3001 case BFD_RELOC_HI16_S_BASEREL:
3002 case BFD_RELOC_HI16_S_GOTOFF:
3003 case BFD_RELOC_HI16_S_PLTOFF:
3004 case BFD_RELOC_LO16:
3005 case BFD_RELOC_LO16_BASEREL:
3006 case BFD_RELOC_LO16_GOTOFF:
3007 case BFD_RELOC_LO16_PLTOFF:
3008 case BFD_RELOC_PPC64_ADDR16_DS:
3009 case BFD_RELOC_PPC64_ADDR16_HIGH:
3010 case BFD_RELOC_PPC64_ADDR16_HIGHA:
5663e321
AM
3011 case BFD_RELOC_PPC64_ADDR16_HIGHER34:
3012 case BFD_RELOC_PPC64_ADDR16_HIGHERA34:
3013 case BFD_RELOC_PPC64_ADDR16_HIGHEST34:
3014 case BFD_RELOC_PPC64_ADDR16_HIGHESTA34:
0e2779e9
AM
3015 case BFD_RELOC_PPC64_ADDR16_LO_DS:
3016 case BFD_RELOC_PPC64_DTPREL16_DS:
3017 case BFD_RELOC_PPC64_DTPREL16_HIGH:
3018 case BFD_RELOC_PPC64_DTPREL16_HIGHA:
3019 case BFD_RELOC_PPC64_DTPREL16_HIGHER:
3020 case BFD_RELOC_PPC64_DTPREL16_HIGHERA:
3021 case BFD_RELOC_PPC64_DTPREL16_HIGHEST:
3022 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA:
3023 case BFD_RELOC_PPC64_DTPREL16_LO_DS:
3024 case BFD_RELOC_PPC64_GOT16_DS:
3025 case BFD_RELOC_PPC64_GOT16_LO_DS:
3026 case BFD_RELOC_PPC64_HIGHER:
3027 case BFD_RELOC_PPC64_HIGHER_S:
3028 case BFD_RELOC_PPC64_HIGHEST:
3029 case BFD_RELOC_PPC64_HIGHEST_S:
3030 case BFD_RELOC_PPC64_PLT16_LO_DS:
3031 case BFD_RELOC_PPC64_PLTGOT16:
3032 case BFD_RELOC_PPC64_PLTGOT16_DS:
3033 case BFD_RELOC_PPC64_PLTGOT16_HA:
3034 case BFD_RELOC_PPC64_PLTGOT16_HI:
3035 case BFD_RELOC_PPC64_PLTGOT16_LO:
3036 case BFD_RELOC_PPC64_PLTGOT16_LO_DS:
3037 case BFD_RELOC_PPC64_SECTOFF_DS:
3038 case BFD_RELOC_PPC64_SECTOFF_LO_DS:
3039 case BFD_RELOC_PPC64_TOC16_DS:
3040 case BFD_RELOC_PPC64_TOC16_HA:
3041 case BFD_RELOC_PPC64_TOC16_HI:
3042 case BFD_RELOC_PPC64_TOC16_LO:
3043 case BFD_RELOC_PPC64_TOC16_LO_DS:
3044 case BFD_RELOC_PPC64_TPREL16_DS:
3045 case BFD_RELOC_PPC64_TPREL16_HIGH:
3046 case BFD_RELOC_PPC64_TPREL16_HIGHA:
3047 case BFD_RELOC_PPC64_TPREL16_HIGHER:
3048 case BFD_RELOC_PPC64_TPREL16_HIGHERA:
3049 case BFD_RELOC_PPC64_TPREL16_HIGHEST:
3050 case BFD_RELOC_PPC64_TPREL16_HIGHESTA:
3051 case BFD_RELOC_PPC64_TPREL16_LO_DS:
3052#ifdef OBJ_XCOFF
3053 case BFD_RELOC_PPC_BA16:
3054#endif
3055 case BFD_RELOC_PPC_DTPREL16:
3056 case BFD_RELOC_PPC_DTPREL16_HA:
3057 case BFD_RELOC_PPC_DTPREL16_HI:
3058 case BFD_RELOC_PPC_DTPREL16_LO:
3059 case BFD_RELOC_PPC_EMB_NADDR16:
3060 case BFD_RELOC_PPC_EMB_NADDR16_HA:
3061 case BFD_RELOC_PPC_EMB_NADDR16_HI:
3062 case BFD_RELOC_PPC_EMB_NADDR16_LO:
3063 case BFD_RELOC_PPC_EMB_RELSDA:
3064 case BFD_RELOC_PPC_EMB_RELSEC16:
3065 case BFD_RELOC_PPC_EMB_RELST_LO:
3066 case BFD_RELOC_PPC_EMB_RELST_HI:
3067 case BFD_RELOC_PPC_EMB_RELST_HA:
3068 case BFD_RELOC_PPC_EMB_SDA2I16:
3069 case BFD_RELOC_PPC_EMB_SDA2REL:
3070 case BFD_RELOC_PPC_EMB_SDAI16:
3071 case BFD_RELOC_PPC_GOT_DTPREL16:
3072 case BFD_RELOC_PPC_GOT_DTPREL16_HA:
3073 case BFD_RELOC_PPC_GOT_DTPREL16_HI:
3074 case BFD_RELOC_PPC_GOT_DTPREL16_LO:
3075 case BFD_RELOC_PPC_GOT_TLSGD16:
3076 case BFD_RELOC_PPC_GOT_TLSGD16_HA:
3077 case BFD_RELOC_PPC_GOT_TLSGD16_HI:
3078 case BFD_RELOC_PPC_GOT_TLSGD16_LO:
3079 case BFD_RELOC_PPC_GOT_TLSLD16:
3080 case BFD_RELOC_PPC_GOT_TLSLD16_HA:
3081 case BFD_RELOC_PPC_GOT_TLSLD16_HI:
3082 case BFD_RELOC_PPC_GOT_TLSLD16_LO:
3083 case BFD_RELOC_PPC_GOT_TPREL16:
3084 case BFD_RELOC_PPC_GOT_TPREL16_HA:
3085 case BFD_RELOC_PPC_GOT_TPREL16_HI:
3086 case BFD_RELOC_PPC_GOT_TPREL16_LO:
3087 case BFD_RELOC_PPC_TOC16:
3088 case BFD_RELOC_PPC_TPREL16:
3089 case BFD_RELOC_PPC_TPREL16_HA:
3090 case BFD_RELOC_PPC_TPREL16_HI:
3091 case BFD_RELOC_PPC_TPREL16_LO:
3092 size = 2;
3093 break;
3094
3095 case BFD_RELOC_16_PCREL:
3096 case BFD_RELOC_HI16_PCREL:
3097 case BFD_RELOC_HI16_S_PCREL:
3098 case BFD_RELOC_LO16_PCREL:
3099 case BFD_RELOC_PPC64_REL16_HIGH:
3100 case BFD_RELOC_PPC64_REL16_HIGHA:
3101 case BFD_RELOC_PPC64_REL16_HIGHER:
5663e321 3102 case BFD_RELOC_PPC64_REL16_HIGHER34:
0e2779e9 3103 case BFD_RELOC_PPC64_REL16_HIGHERA:
5663e321 3104 case BFD_RELOC_PPC64_REL16_HIGHERA34:
0e2779e9 3105 case BFD_RELOC_PPC64_REL16_HIGHEST:
5663e321 3106 case BFD_RELOC_PPC64_REL16_HIGHEST34:
0e2779e9 3107 case BFD_RELOC_PPC64_REL16_HIGHESTA:
5663e321 3108 case BFD_RELOC_PPC64_REL16_HIGHESTA34:
0e2779e9
AM
3109#ifdef OBJ_XCOFF
3110 case BFD_RELOC_PPC_B16:
3111#endif
3112 case BFD_RELOC_PPC_VLE_REL8:
3113 size = 2;
3114 pcrel = TRUE;
3115 break;
3116
3117 case BFD_RELOC_16_GOT_PCREL: /* coff reloc, bad name re size. */
3118 case BFD_RELOC_32:
3119 case BFD_RELOC_32_GOTOFF:
3120 case BFD_RELOC_32_PLTOFF:
3121#ifdef OBJ_XCOFF
3122 case BFD_RELOC_CTOR:
3123#endif
3124 case BFD_RELOC_PPC64_ENTRY:
3125 case BFD_RELOC_PPC_16DX_HA:
3126#ifndef OBJ_XCOFF
3127 case BFD_RELOC_PPC_BA16:
3128#endif
3129 case BFD_RELOC_PPC_BA16_BRNTAKEN:
3130 case BFD_RELOC_PPC_BA16_BRTAKEN:
3131 case BFD_RELOC_PPC_BA26:
3132 case BFD_RELOC_PPC_EMB_BIT_FLD:
3133 case BFD_RELOC_PPC_EMB_NADDR32:
3134 case BFD_RELOC_PPC_EMB_SDA21:
3135 case BFD_RELOC_PPC_TLS:
3136 case BFD_RELOC_PPC_TLSGD:
3137 case BFD_RELOC_PPC_TLSLD:
3138 case BFD_RELOC_PPC_VLE_HA16A:
3139 case BFD_RELOC_PPC_VLE_HA16D:
3140 case BFD_RELOC_PPC_VLE_HI16A:
3141 case BFD_RELOC_PPC_VLE_HI16D:
3142 case BFD_RELOC_PPC_VLE_LO16A:
3143 case BFD_RELOC_PPC_VLE_LO16D:
3144 case BFD_RELOC_PPC_VLE_SDA21:
3145 case BFD_RELOC_PPC_VLE_SDA21_LO:
3146 case BFD_RELOC_PPC_VLE_SDAREL_HA16A:
3147 case BFD_RELOC_PPC_VLE_SDAREL_HA16D:
3148 case BFD_RELOC_PPC_VLE_SDAREL_HI16A:
3149 case BFD_RELOC_PPC_VLE_SDAREL_HI16D:
3150 case BFD_RELOC_PPC_VLE_SDAREL_LO16A:
3151 case BFD_RELOC_PPC_VLE_SDAREL_LO16D:
3152 case BFD_RELOC_RVA:
3153 size = 4;
3154 break;
3155
3156 case BFD_RELOC_24_PLT_PCREL:
3157 case BFD_RELOC_32_PCREL:
3158 case BFD_RELOC_32_PLT_PCREL:
3159 case BFD_RELOC_PPC64_REL24_NOTOC:
3160#ifndef OBJ_XCOFF
3161 case BFD_RELOC_PPC_B16:
3162#endif
3163 case BFD_RELOC_PPC_B16_BRNTAKEN:
3164 case BFD_RELOC_PPC_B16_BRTAKEN:
3165 case BFD_RELOC_PPC_B26:
3166 case BFD_RELOC_PPC_LOCAL24PC:
3167 case BFD_RELOC_PPC_REL16DX_HA:
3168 case BFD_RELOC_PPC_VLE_REL15:
3169 case BFD_RELOC_PPC_VLE_REL24:
3170 size = 4;
3171 pcrel = TRUE;
3172 break;
3173
3174#ifndef OBJ_XCOFF
3175 case BFD_RELOC_CTOR:
3176#endif
3177 case BFD_RELOC_PPC_COPY:
3178 case BFD_RELOC_PPC_DTPMOD:
3179 case BFD_RELOC_PPC_DTPREL:
3180 case BFD_RELOC_PPC_GLOB_DAT:
3181 case BFD_RELOC_PPC_TPREL:
3182 size = ppc_obj64 ? 8 : 4;
3183 break;
3184
3185 case BFD_RELOC_64:
3186 case BFD_RELOC_64_PLTOFF:
3187 case BFD_RELOC_PPC64_ADDR64_LOCAL:
5663e321
AM
3188 case BFD_RELOC_PPC64_D28:
3189 case BFD_RELOC_PPC64_D34:
3190 case BFD_RELOC_PPC64_D34_LO:
3191 case BFD_RELOC_PPC64_D34_HI30:
3192 case BFD_RELOC_PPC64_D34_HA30:
0e2779e9
AM
3193 case BFD_RELOC_PPC64_TOC:
3194 size = 8;
3195 break;
3196
3197 case BFD_RELOC_64_PCREL:
3198 case BFD_RELOC_64_PLT_PCREL:
5663e321
AM
3199 case BFD_RELOC_PPC64_GOT_PCREL34:
3200 case BFD_RELOC_PPC64_PCREL28:
3201 case BFD_RELOC_PPC64_PCREL34:
3202 case BFD_RELOC_PPC64_PLT_PCREL34:
0e2779e9
AM
3203 size = 8;
3204 pcrel = TRUE;
3205 break;
3206
3207 default:
3208 abort ();
3209 }
3210
3211 if (ENABLE_CHECKING)
3212 {
3213 reloc_howto_type *reloc_howto = bfd_reloc_type_lookup (stdoutput, reloc);
3214 if (reloc_howto != NULL
3215 && (size != bfd_get_reloc_size (reloc_howto)
3216 || pcrel != reloc_howto->pc_relative))
3217 {
3218 as_bad (_("%s howto doesn't match size/pcrel in gas"),
3219 reloc_howto->name);
3220 abort ();
3221 }
3222 }
3223 *pc_relative = pcrel;
3224 return size;
3225}
3226
a894d76a 3227#ifdef OBJ_ELF
160eba93
AM
3228/* If we have parsed a call to __tls_get_addr, parse an argument like
3229 (gd0@tlsgd). *STR is the leading parenthesis on entry. If an arg
3230 is successfully parsed, *STR is updated past the trailing
3231 parenthesis and trailing white space, and *TLS_FIX contains the
3232 reloc and arg expression. */
3233
3234static int
3235parse_tls_arg (char **str, const expressionS *exp, struct ppc_fixup *tls_fix)
3236{
3237 const char *sym_name = S_GET_NAME (exp->X_add_symbol);
3238 if (sym_name[0] == '.')
3239 ++sym_name;
3240
3241 tls_fix->reloc = BFD_RELOC_NONE;
3242 if (strcasecmp (sym_name, "__tls_get_addr") == 0)
3243 {
3244 char *hold = input_line_pointer;
3245 input_line_pointer = *str + 1;
3246 expression (&tls_fix->exp);
3247 if (tls_fix->exp.X_op == O_symbol)
3248 {
3249 if (strncasecmp (input_line_pointer, "@tlsgd)", 7) == 0)
3250 tls_fix->reloc = BFD_RELOC_PPC_TLSGD;
3251 else if (strncasecmp (input_line_pointer, "@tlsld)", 7) == 0)
3252 tls_fix->reloc = BFD_RELOC_PPC_TLSLD;
3253 if (tls_fix->reloc != BFD_RELOC_NONE)
3254 {
3255 input_line_pointer += 7;
3256 SKIP_WHITESPACE ();
3257 *str = input_line_pointer;
3258 }
3259 }
3260 input_line_pointer = hold;
3261 }
3262 return tls_fix->reloc != BFD_RELOC_NONE;
3263}
a894d76a 3264#endif
160eba93 3265
252b5132
RH
3266/* This routine is called for each instruction to be assembled. */
3267
3268void
98027b10 3269md_assemble (char *str)
252b5132
RH
3270{
3271 char *s;
3272 const struct powerpc_opcode *opcode;
0f873fd5 3273 uint64_t insn;
252b5132 3274 const unsigned char *opindex_ptr;
252b5132
RH
3275 int need_paren;
3276 int next_opindex;
3277 struct ppc_fixup fixups[MAX_INSN_FIXUPS];
3278 int fc;
3279 char *f;
a9479dc0 3280 int addr_mask;
252b5132 3281 int i;
b9c361e0 3282 unsigned int insn_length;
252b5132
RH
3283
3284 /* Get the opcode. */
3882b010 3285 for (s = str; *s != '\0' && ! ISSPACE (*s); s++)
252b5132
RH
3286 ;
3287 if (*s != '\0')
3288 *s++ = '\0';
3289
3290 /* Look up the opcode in the hash table. */
3291 opcode = (const struct powerpc_opcode *) hash_find (ppc_hash, str);
3292 if (opcode == (const struct powerpc_opcode *) NULL)
3293 {
3294 const struct powerpc_macro *macro;
3295
3296 macro = (const struct powerpc_macro *) hash_find (ppc_macro_hash, str);
3297 if (macro == (const struct powerpc_macro *) NULL)
d6ed37ed 3298 as_bad (_("unrecognized opcode: `%s'"), str);
252b5132
RH
3299 else
3300 ppc_macro (s, macro);
3301
dd7efa79 3302 ppc_clear_labels ();
252b5132
RH
3303 return;
3304 }
3305
3306 insn = opcode->opcode;
3307
3308 str = s;
3882b010 3309 while (ISSPACE (*str))
252b5132
RH
3310 ++str;
3311
3312 /* PowerPC operands are just expressions. The only real issue is
9cf7e568
AM
3313 that a few operand types are optional. If an instruction has
3314 multiple optional operands and one is omitted, then all optional
3315 operands past the first omitted one must also be omitted. */
3316 int num_optional_operands = 0;
3317 int num_optional_provided = 0;
252b5132
RH
3318
3319 /* Gather the operands. */
3320 need_paren = 0;
3321 next_opindex = 0;
3322 fc = 0;
3323 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
3324 {
3325 const struct powerpc_operand *operand;
3326 const char *errmsg;
3327 char *hold;
3328 expressionS ex;
3329 char endc;
3330
3331 if (next_opindex == 0)
3332 operand = &powerpc_operands[*opindex_ptr];
3333 else
3334 {
3335 operand = &powerpc_operands[next_opindex];
3336 next_opindex = 0;
3337 }
252b5132
RH
3338 errmsg = NULL;
3339
252b5132 3340 /* If this is an optional operand, and we are skipping it, just
9cf7e568 3341 insert the default value, usually a zero. */
252b5132 3342 if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0
9cf7e568 3343 && !((operand->flags & PPC_OPERAND_OPTIONAL32) != 0 && ppc_obj64))
252b5132 3344 {
9cf7e568
AM
3345 if (num_optional_operands == 0)
3346 {
3347 const unsigned char *optr;
3348 int total = 0;
3349 int provided = 0;
3350 int omitted;
3351
3352 s = str;
3353 for (optr = opindex_ptr; *optr != 0; optr++)
3354 {
3355 const struct powerpc_operand *op;
3356 op = &powerpc_operands[*optr];
3357
3358 ++total;
3359
3360 if ((op->flags & PPC_OPERAND_OPTIONAL) != 0
3361 && !((op->flags & PPC_OPERAND_OPTIONAL32) != 0
3362 && ppc_obj64))
3363 ++num_optional_operands;
3364
3365 if (s != NULL && *s != '\0')
3366 {
3367 ++provided;
3368
3369 /* Look for the start of the next operand. */
3370 if ((op->flags & PPC_OPERAND_PARENS) != 0)
3371 s = strpbrk (s, "(,");
3372 else
3373 s = strchr (s, ',');
3374
3375 if (s != NULL)
3376 ++s;
3377 }
3378 }
3379 omitted = total - provided;
3380 num_optional_provided = num_optional_operands - omitted;
3381 }
3382 if (--num_optional_provided < 0)
252b5132 3383 {
9cf7e568
AM
3384 int64_t val = ppc_optional_operand_value (operand, insn, ppc_cpu,
3385 num_optional_provided);
3386 if (operand->insert)
3387 {
3388 insn = (*operand->insert) (insn, val, ppc_cpu, &errmsg);
3389 if (errmsg != (const char *) NULL)
3390 as_bad ("%s", errmsg);
3391 }
3392 else if (operand->shift >= 0)
3393 insn |= (val & operand->bitm) << operand->shift;
3394 else
3395 insn |= (val & operand->bitm) >> -operand->shift;
3396
3397 if ((operand->flags & PPC_OPERAND_NEXT) != 0)
3398 next_opindex = *opindex_ptr + 1;
3399 continue;
252b5132 3400 }
252b5132
RH
3401 }
3402
3403 /* Gather the operand. */
3404 hold = input_line_pointer;
3405 input_line_pointer = str;
3406
3407#ifdef TE_PE
81d4177b 3408 if (*input_line_pointer == '[')
252b5132
RH
3409 {
3410 /* We are expecting something like the second argument here:
99a814a1
AM
3411 *
3412 * lwz r4,[toc].GS.0.static_int(rtoc)
3413 * ^^^^^^^^^^^^^^^^^^^^^^^^^^^
3414 * The argument following the `]' must be a symbol name, and the
3415 * register must be the toc register: 'rtoc' or '2'
3416 *
3417 * The effect is to 0 as the displacement field
3418 * in the instruction, and issue an IMAGE_REL_PPC_TOCREL16 (or
3419 * the appropriate variation) reloc against it based on the symbol.
3420 * The linker will build the toc, and insert the resolved toc offset.
3421 *
3422 * Note:
3423 * o The size of the toc entry is currently assumed to be
3424 * 32 bits. This should not be assumed to be a hard coded
3425 * number.
3426 * o In an effort to cope with a change from 32 to 64 bits,
3427 * there are also toc entries that are specified to be
3428 * either 32 or 64 bits:
3429 * lwz r4,[toc32].GS.0.static_int(rtoc)
3430 * lwz r4,[toc64].GS.0.static_int(rtoc)
3431 * These demand toc entries of the specified size, and the
3432 * instruction probably requires it.
3433 */
252b5132
RH
3434
3435 int valid_toc;
3436 enum toc_size_qualifier toc_kind;
3437 bfd_reloc_code_real_type toc_reloc;
3438
99a814a1
AM
3439 /* Go parse off the [tocXX] part. */
3440 valid_toc = parse_toc_entry (&toc_kind);
252b5132 3441
81d4177b 3442 if (!valid_toc)
252b5132 3443 {
a5840dce
AM
3444 ignore_rest_of_line ();
3445 break;
252b5132
RH
3446 }
3447
99a814a1
AM
3448 /* Now get the symbol following the ']'. */
3449 expression (&ex);
252b5132
RH
3450
3451 switch (toc_kind)
3452 {
3453 case default_toc:
99a814a1
AM
3454 /* In this case, we may not have seen the symbol yet,
3455 since it is allowed to appear on a .extern or .globl
3456 or just be a label in the .data section. */
252b5132
RH
3457 toc_reloc = BFD_RELOC_PPC_TOC16;
3458 break;
3459 case data_in_toc:
99a814a1
AM
3460 /* 1. The symbol must be defined and either in the toc
3461 section, or a global.
3462 2. The reloc generated must have the TOCDEFN flag set
3463 in upper bit mess of the reloc type.
3464 FIXME: It's a little confusing what the tocv
3465 qualifier can be used for. At the very least, I've
3466 seen three uses, only one of which I'm sure I can
3467 explain. */
81d4177b
KH
3468 if (ex.X_op == O_symbol)
3469 {
9c2799c2 3470 gas_assert (ex.X_add_symbol != NULL);
fed9b18a
ILT
3471 if (symbol_get_bfdsym (ex.X_add_symbol)->section
3472 != tocdata_section)
252b5132 3473 {
99a814a1 3474 as_bad (_("[tocv] symbol is not a toc symbol"));
252b5132
RH
3475 }
3476 }
3477
3478 toc_reloc = BFD_RELOC_PPC_TOC16;
3479 break;
3480 case must_be_32:
99a814a1
AM
3481 /* FIXME: these next two specifically specify 32/64 bit
3482 toc entries. We don't support them today. Is this
3483 the right way to say that? */
62ebcb5c 3484 toc_reloc = BFD_RELOC_NONE;
d6ed37ed 3485 as_bad (_("unimplemented toc32 expression modifier"));
252b5132
RH
3486 break;
3487 case must_be_64:
99a814a1 3488 /* FIXME: see above. */
62ebcb5c 3489 toc_reloc = BFD_RELOC_NONE;
d6ed37ed 3490 as_bad (_("unimplemented toc64 expression modifier"));
252b5132
RH
3491 break;
3492 default:
bc805888 3493 fprintf (stderr,
99a814a1
AM
3494 _("Unexpected return value [%d] from parse_toc_entry!\n"),
3495 toc_kind);
bc805888 3496 abort ();
252b5132
RH
3497 break;
3498 }
3499
3500 /* We need to generate a fixup for this expression. */
3501 if (fc >= MAX_INSN_FIXUPS)
3502 as_fatal (_("too many fixups"));
3503
3504 fixups[fc].reloc = toc_reloc;
3505 fixups[fc].exp = ex;
3506 fixups[fc].opindex = *opindex_ptr;
3507 ++fc;
3508
99a814a1
AM
3509 /* Ok. We've set up the fixup for the instruction. Now make it
3510 look like the constant 0 was found here. */
252b5132
RH
3511 ex.X_unsigned = 1;
3512 ex.X_op = O_constant;
3513 ex.X_add_number = 0;
3514 ex.X_add_symbol = NULL;
3515 ex.X_op_symbol = NULL;
3516 }
3517
3518 else
3519#endif /* TE_PE */
3520 {
b9c361e0
JL
3521 if ((reg_names_p
3522 && (((operand->flags & PPC_OPERAND_CR_BIT) != 0)
3523 || ((operand->flags & PPC_OPERAND_CR_REG) != 0)))
2ad068be 3524 || !register_name (&ex))
252b5132 3525 {
13abbae3
AM
3526 char save_lex = lex_type['%'];
3527
b9c361e0
JL
3528 if (((operand->flags & PPC_OPERAND_CR_REG) != 0)
3529 || (operand->flags & PPC_OPERAND_CR_BIT) != 0)
13abbae3
AM
3530 {
3531 cr_operand = TRUE;
3532 lex_type['%'] |= LEX_BEGIN_NAME;
3533 }
252b5132 3534 expression (&ex);
b34976b6 3535 cr_operand = FALSE;
13abbae3 3536 lex_type['%'] = save_lex;
252b5132
RH
3537 }
3538 }
3539
3540 str = input_line_pointer;
3541 input_line_pointer = hold;
3542
3543 if (ex.X_op == O_illegal)
3544 as_bad (_("illegal operand"));
3545 else if (ex.X_op == O_absent)
3546 as_bad (_("missing operand"));
3547 else if (ex.X_op == O_register)
3548 {
7e0de605
AM
3549 if ((ex.X_md
3550 & ~operand->flags
3551 & (PPC_OPERAND_GPR | PPC_OPERAND_FPR | PPC_OPERAND_VR
3552 | PPC_OPERAND_VSR | PPC_OPERAND_CR_BIT | PPC_OPERAND_CR_REG
3553 | PPC_OPERAND_SPR | PPC_OPERAND_GQR)) != 0
3554 && !((ex.X_md & PPC_OPERAND_GPR) != 0
3555 && ex.X_add_number != 0
3556 && (operand->flags & PPC_OPERAND_GPR_0) != 0))
ece5dcc1 3557 as_warn (_("invalid register expression"));
4b1c0f7e 3558 insn = ppc_insert_operand (insn, operand, ex.X_add_number,
783de163 3559 ppc_cpu, (char *) NULL, 0);
252b5132
RH
3560 }
3561 else if (ex.X_op == O_constant)
3562 {
3563#ifdef OBJ_ELF
81d4177b 3564 /* Allow @HA, @L, @H on constants. */
3b8b57a9 3565 bfd_reloc_code_real_type reloc;
252b5132
RH
3566 char *orig_str = str;
3567
62ebcb5c 3568 if ((reloc = ppc_elf_suffix (&str, &ex)) != BFD_RELOC_NONE)
252b5132
RH
3569 switch (reloc)
3570 {
3571 default:
3572 str = orig_str;
3573 break;
3574
3575 case BFD_RELOC_LO16:
f9c6b907
AM
3576 ex.X_add_number &= 0xffff;
3577 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
0baf16f2 3578 ex.X_add_number = SEX16 (ex.X_add_number);
252b5132
RH
3579 break;
3580
3581 case BFD_RELOC_HI16:
f9c6b907
AM
3582 if (REPORT_OVERFLOW_HI && ppc_obj64)
3583 {
3584 /* PowerPC64 @h is tested for overflow. */
3585 ex.X_add_number = (addressT) ex.X_add_number >> 16;
3586 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
3587 {
3588 addressT sign = (((addressT) -1 >> 16) + 1) >> 1;
3589 ex.X_add_number
3590 = ((addressT) ex.X_add_number ^ sign) - sign;
3591 }
3592 break;
3593 }
2b0f3761 3594 /* Fallthru */
f9c6b907
AM
3595
3596 case BFD_RELOC_PPC64_ADDR16_HIGH:
3597 ex.X_add_number = PPC_HI (ex.X_add_number);
3598 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
3599 ex.X_add_number = SEX16 (ex.X_add_number);
252b5132
RH
3600 break;
3601
3602 case BFD_RELOC_HI16_S:
f9c6b907
AM
3603 if (REPORT_OVERFLOW_HI && ppc_obj64)
3604 {
3605 /* PowerPC64 @ha is tested for overflow. */
3606 ex.X_add_number
3607 = ((addressT) ex.X_add_number + 0x8000) >> 16;
3608 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
3609 {
3610 addressT sign = (((addressT) -1 >> 16) + 1) >> 1;
3611 ex.X_add_number
3612 = ((addressT) ex.X_add_number ^ sign) - sign;
3613 }
3614 break;
3615 }
2b0f3761 3616 /* Fallthru */
f9c6b907
AM
3617
3618 case BFD_RELOC_PPC64_ADDR16_HIGHA:
3619 ex.X_add_number = PPC_HA (ex.X_add_number);
3620 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
3621 ex.X_add_number = SEX16 (ex.X_add_number);
0baf16f2
AM
3622 break;
3623
0baf16f2 3624 case BFD_RELOC_PPC64_HIGHER:
f9c6b907
AM
3625 ex.X_add_number = PPC_HIGHER (ex.X_add_number);
3626 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
3627 ex.X_add_number = SEX16 (ex.X_add_number);
0baf16f2
AM
3628 break;
3629
3630 case BFD_RELOC_PPC64_HIGHER_S:
f9c6b907
AM
3631 ex.X_add_number = PPC_HIGHERA (ex.X_add_number);
3632 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
3633 ex.X_add_number = SEX16 (ex.X_add_number);
252b5132 3634 break;
0baf16f2
AM
3635
3636 case BFD_RELOC_PPC64_HIGHEST:
f9c6b907
AM
3637 ex.X_add_number = PPC_HIGHEST (ex.X_add_number);
3638 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
3639 ex.X_add_number = SEX16 (ex.X_add_number);
0baf16f2
AM
3640 break;
3641
3642 case BFD_RELOC_PPC64_HIGHEST_S:
f9c6b907
AM
3643 ex.X_add_number = PPC_HIGHESTA (ex.X_add_number);
3644 if ((operand->flags & PPC_OPERAND_SIGNED) != 0)
3645 ex.X_add_number = SEX16 (ex.X_add_number);
0baf16f2 3646 break;
252b5132 3647 }
0baf16f2 3648#endif /* OBJ_ELF */
252b5132 3649 insn = ppc_insert_operand (insn, operand, ex.X_add_number,
783de163 3650 ppc_cpu, (char *) NULL, 0);
252b5132 3651 }
727fc41e 3652 else
252b5132 3653 {
62ebcb5c 3654 bfd_reloc_code_real_type reloc = BFD_RELOC_NONE;
3b8b57a9 3655#ifdef OBJ_ELF
160eba93
AM
3656 /* Look for a __tls_get_addr arg using the insane old syntax. */
3657 if (ex.X_op == O_symbol && *str == '(' && fc < MAX_INSN_FIXUPS
3658 && parse_tls_arg (&str, &ex, &fixups[fc]))
cdba85ec 3659 {
160eba93
AM
3660 fixups[fc].opindex = *opindex_ptr;
3661 ++fc;
252b5132
RH
3662 }
3663
62ebcb5c 3664 if ((reloc = ppc_elf_suffix (&str, &ex)) != BFD_RELOC_NONE)
0baf16f2 3665 {
b9c361e0
JL
3666 /* If VLE-mode convert LO/HI/HA relocations. */
3667 if (opcode->flags & PPC_OPCODE_VLE)
3668 {
0f873fd5 3669 uint64_t tmp_insn = insn & opcode->mask;
3739860c 3670
08dc996f 3671 int use_a_reloc = (tmp_insn == E_OR2I_INSN
b9c361e0
JL
3672 || tmp_insn == E_AND2I_DOT_INSN
3673 || tmp_insn == E_OR2IS_INSN
bb6bf75e 3674 || tmp_insn == E_LI_INSN
b9c361e0
JL
3675 || tmp_insn == E_LIS_INSN
3676 || tmp_insn == E_AND2IS_DOT_INSN);
3677
3678
08dc996f 3679 int use_d_reloc = (tmp_insn == E_ADD2I_DOT_INSN
b9c361e0
JL
3680 || tmp_insn == E_ADD2IS_INSN
3681 || tmp_insn == E_CMP16I_INSN
3682 || tmp_insn == E_MULL2I_INSN
3683 || tmp_insn == E_CMPL16I_INSN
3684 || tmp_insn == E_CMPH16I_INSN
3685 || tmp_insn == E_CMPHL16I_INSN);
3686
3687 switch (reloc)
3688 {
3689 default:
3690 break;
3691
3692 case BFD_RELOC_PPC_EMB_SDA21:
3693 reloc = BFD_RELOC_PPC_VLE_SDA21;
3694 break;
3695
3696 case BFD_RELOC_LO16:
3697 if (use_d_reloc)
3698 reloc = BFD_RELOC_PPC_VLE_LO16D;
3699 else if (use_a_reloc)
3700 reloc = BFD_RELOC_PPC_VLE_LO16A;
3701 break;
3702
3703 case BFD_RELOC_HI16:
3704 if (use_d_reloc)
3705 reloc = BFD_RELOC_PPC_VLE_HI16D;
3706 else if (use_a_reloc)
3707 reloc = BFD_RELOC_PPC_VLE_HI16A;
3708 break;
3739860c 3709
b9c361e0
JL
3710 case BFD_RELOC_HI16_S:
3711 if (use_d_reloc)
3712 reloc = BFD_RELOC_PPC_VLE_HA16D;
3713 else if (use_a_reloc)
3714 reloc = BFD_RELOC_PPC_VLE_HA16A;
3715 break;
3716
3717 case BFD_RELOC_PPC_VLE_SDAREL_LO16A:
3718 if (use_d_reloc)
3719 reloc = BFD_RELOC_PPC_VLE_SDAREL_LO16D;
3720 break;
3721
3722 case BFD_RELOC_PPC_VLE_SDAREL_HI16A:
3723 if (use_d_reloc)
3724 reloc = BFD_RELOC_PPC_VLE_SDAREL_HI16D;
3725 break;
3726
3727 case BFD_RELOC_PPC_VLE_SDAREL_HA16A:
3728 if (use_d_reloc)
3729 reloc = BFD_RELOC_PPC_VLE_SDAREL_HA16D;
3730 break;
3731 }
3732 }
bb6bf75e
AM
3733
3734 /* TLS and other tweaks. */
3735 switch (reloc)
3736 {
3737 default:
3738 break;
3739
3740 case BFD_RELOC_PPC_TLS:
3741 if (!_bfd_elf_ppc_at_tls_transform (opcode->opcode, 0))
3742 as_bad (_("@tls may not be used with \"%s\" operands"),
3743 opcode->name);
3744 else if (operand->shift != 11)
3745 as_bad (_("@tls may only be used in last operand"));
3746 else
3747 insn = ppc_insert_operand (insn, operand,
3748 ppc_obj64 ? 13 : 2,
3749 ppc_cpu, (char *) NULL, 0);
3750 break;
3751
3752 /* We'll only use the 32 (or 64) bit form of these relocations
3753 in constants. Instructions get the 16 bit form. */
3754 case BFD_RELOC_PPC_DTPREL:
3755 reloc = BFD_RELOC_PPC_DTPREL16;
3756 break;
3757
3758 case BFD_RELOC_PPC_TPREL:
3759 reloc = BFD_RELOC_PPC_TPREL16;
3760 break;
3761
5663e321
AM
3762 case BFD_RELOC_PPC64_PCREL34:
3763 if (operand->bitm == 0xfffffffULL)
3764 {
3765 reloc = BFD_RELOC_PPC64_PCREL28;
3766 break;
3767 }
3768 /* Fall through. */
3769 case BFD_RELOC_PPC64_GOT_PCREL34:
3770 case BFD_RELOC_PPC64_PLT_PCREL34:
3771 if (operand->bitm != 0x3ffffffffULL
bb6bf75e 3772 || (operand->flags & PPC_OPERAND_NEGATIVE) != 0)
5663e321
AM
3773 as_warn (_("%s unsupported on this instruction"), "@pcrel");
3774 break;
3775
3776 case BFD_RELOC_LO16:
3777 if (operand->bitm == 0x3ffffffffULL
3778 && (operand->flags & PPC_OPERAND_NEGATIVE) == 0)
3779 reloc = BFD_RELOC_PPC64_D34_LO;
3780 else if ((operand->bitm | 0xf) != 0xffff
3781 || operand->shift != 0
3782 || (operand->flags & PPC_OPERAND_NEGATIVE) != 0)
bb6bf75e
AM
3783 as_warn (_("%s unsupported on this instruction"), "@l");
3784 break;
3785
3786 case BFD_RELOC_HI16:
5663e321
AM
3787 if (operand->bitm == 0x3ffffffffULL
3788 && (operand->flags & PPC_OPERAND_NEGATIVE) == 0)
3789 reloc = BFD_RELOC_PPC64_D34_HI30;
3790 else if (operand->bitm != 0xffff
3791 || operand->shift != 0
3792 || (operand->flags & PPC_OPERAND_NEGATIVE) != 0)
bb6bf75e
AM
3793 as_warn (_("%s unsupported on this instruction"), "@h");
3794 break;
3795
3796 case BFD_RELOC_HI16_S:
5663e321
AM
3797 if (operand->bitm == 0x3ffffffffULL
3798 && (operand->flags & PPC_OPERAND_NEGATIVE) == 0)
3799 reloc = BFD_RELOC_PPC64_D34_HA30;
3800 else if (operand->bitm == 0xffff
3801 && operand->shift == (int) PPC_OPSHIFT_INV
3802 && opcode->opcode == (19 << 26) + (2 << 1))
bb6bf75e
AM
3803 /* addpcis. */
3804 reloc = BFD_RELOC_PPC_16DX_HA;
3805 else if (operand->bitm != 0xffff
3806 || operand->shift != 0
3807 || (operand->flags & PPC_OPERAND_NEGATIVE) != 0)
3808 as_warn (_("%s unsupported on this instruction"), "@ha");
3809 }
0baf16f2 3810 }
3b8b57a9
AM
3811#endif /* OBJ_ELF */
3812
62ebcb5c 3813 if (reloc != BFD_RELOC_NONE)
3b8b57a9
AM
3814 ;
3815 /* Determine a BFD reloc value based on the operand information.
3816 We are only prepared to turn a few of the operands into
3817 relocs. */
a0593ad9
AM
3818 else if ((operand->flags & (PPC_OPERAND_RELATIVE
3819 | PPC_OPERAND_ABSOLUTE)) != 0
3b8b57a9
AM
3820 && operand->bitm == 0x3fffffc
3821 && operand->shift == 0)
3822 reloc = BFD_RELOC_PPC_B26;
a0593ad9
AM
3823 else if ((operand->flags & (PPC_OPERAND_RELATIVE
3824 | PPC_OPERAND_ABSOLUTE)) != 0
3b8b57a9
AM
3825 && operand->bitm == 0xfffc
3826 && operand->shift == 0)
3827 reloc = BFD_RELOC_PPC_B16;
3828 else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
3829 && operand->bitm == 0x1fe
3830 && operand->shift == -1)
3831 reloc = BFD_RELOC_PPC_VLE_REL8;
3832 else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
3833 && operand->bitm == 0xfffe
3834 && operand->shift == 0)
3835 reloc = BFD_RELOC_PPC_VLE_REL15;
3836 else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0
3837 && operand->bitm == 0x1fffffe
3838 && operand->shift == 0)
3839 reloc = BFD_RELOC_PPC_VLE_REL24;
a0593ad9 3840 else if ((operand->flags & PPC_OPERAND_NEGATIVE) == 0
3b8b57a9
AM
3841 && (operand->bitm & 0xfff0) == 0xfff0
3842 && operand->shift == 0)
3843 {
f50c47f1 3844 reloc = BFD_RELOC_16;
3e60bf4d 3845#if defined OBJ_XCOFF || defined OBJ_ELF
f50c47f1 3846 /* Note: the symbol may be not yet defined. */
a0593ad9
AM
3847 if ((operand->flags & PPC_OPERAND_PARENS) != 0
3848 && ppc_is_toc_sym (ex.X_add_symbol))
3e60bf4d
AM
3849 {
3850 reloc = BFD_RELOC_PPC_TOC16;
3851#ifdef OBJ_ELF
3852 as_warn (_("assuming %s on symbol"),
3853 ppc_obj64 ? "@toc" : "@xgot");
3854#endif
3855 }
3b8b57a9 3856#endif
3b8b57a9 3857 }
5663e321
AM
3858 else if (operand->bitm == 0x3ffffffffULL)
3859 reloc = BFD_RELOC_PPC64_D34;
3860 else if (operand->bitm == 0xfffffffULL)
3861 reloc = BFD_RELOC_PPC64_D28;
a0593ad9
AM
3862
3863 /* For the absolute forms of branches, convert the PC
3864 relative form back into the absolute. */
3865 if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0)
3866 {
3867 switch (reloc)
3868 {
3869 case BFD_RELOC_PPC_B26:
3870 reloc = BFD_RELOC_PPC_BA26;
3871 break;
3872 case BFD_RELOC_PPC_B16:
3873 reloc = BFD_RELOC_PPC_BA16;
3874 break;
3875#ifdef OBJ_ELF
3876 case BFD_RELOC_PPC_B16_BRTAKEN:
3877 reloc = BFD_RELOC_PPC_BA16_BRTAKEN;
3878 break;
3879 case BFD_RELOC_PPC_B16_BRNTAKEN:
3880 reloc = BFD_RELOC_PPC_BA16_BRNTAKEN;
3881 break;
3882#endif
3883 default:
3884 break;
3885 }
3886 }
3887
3888#ifdef OBJ_ELF
3889 switch (reloc)
3890 {
3891 case BFD_RELOC_PPC_TOC16:
3892 toc_reloc_types |= has_small_toc_reloc;
3893 break;
3894 case BFD_RELOC_PPC64_TOC16_LO:
3895 case BFD_RELOC_PPC64_TOC16_HI:
3896 case BFD_RELOC_PPC64_TOC16_HA:
3897 toc_reloc_types |= has_large_toc_reloc;
3898 break;
3899 default:
3900 break;
3901 }
3902
3903 if (ppc_obj64
3904 && (operand->flags & (PPC_OPERAND_DS | PPC_OPERAND_DQ)) != 0)
3905 {
3906 switch (reloc)
3907 {
3908 case BFD_RELOC_16:
3909 reloc = BFD_RELOC_PPC64_ADDR16_DS;
3910 break;
5663e321 3911
a0593ad9
AM
3912 case BFD_RELOC_LO16:
3913 reloc = BFD_RELOC_PPC64_ADDR16_LO_DS;
3914 break;
5663e321 3915
a0593ad9
AM
3916 case BFD_RELOC_16_GOTOFF:
3917 reloc = BFD_RELOC_PPC64_GOT16_DS;
3918 break;
5663e321 3919
a0593ad9
AM
3920 case BFD_RELOC_LO16_GOTOFF:
3921 reloc = BFD_RELOC_PPC64_GOT16_LO_DS;
3922 break;
5663e321 3923
a0593ad9
AM
3924 case BFD_RELOC_LO16_PLTOFF:
3925 reloc = BFD_RELOC_PPC64_PLT16_LO_DS;
3926 break;
5663e321 3927
a0593ad9
AM
3928 case BFD_RELOC_16_BASEREL:
3929 reloc = BFD_RELOC_PPC64_SECTOFF_DS;
3930 break;
5663e321 3931
a0593ad9
AM
3932 case BFD_RELOC_LO16_BASEREL:
3933 reloc = BFD_RELOC_PPC64_SECTOFF_LO_DS;
3934 break;
5663e321 3935
a0593ad9
AM
3936 case BFD_RELOC_PPC_TOC16:
3937 reloc = BFD_RELOC_PPC64_TOC16_DS;
3938 break;
5663e321 3939
a0593ad9
AM
3940 case BFD_RELOC_PPC64_TOC16_LO:
3941 reloc = BFD_RELOC_PPC64_TOC16_LO_DS;
3942 break;
5663e321 3943
a0593ad9
AM
3944 case BFD_RELOC_PPC64_PLTGOT16:
3945 reloc = BFD_RELOC_PPC64_PLTGOT16_DS;
3946 break;
5663e321 3947
a0593ad9
AM
3948 case BFD_RELOC_PPC64_PLTGOT16_LO:
3949 reloc = BFD_RELOC_PPC64_PLTGOT16_LO_DS;
3950 break;
5663e321 3951
a0593ad9
AM
3952 case BFD_RELOC_PPC_DTPREL16:
3953 reloc = BFD_RELOC_PPC64_DTPREL16_DS;
3954 break;
5663e321 3955
a0593ad9
AM
3956 case BFD_RELOC_PPC_DTPREL16_LO:
3957 reloc = BFD_RELOC_PPC64_DTPREL16_LO_DS;
3958 break;
5663e321 3959
a0593ad9
AM
3960 case BFD_RELOC_PPC_TPREL16:
3961 reloc = BFD_RELOC_PPC64_TPREL16_DS;
3962 break;
5663e321 3963
a0593ad9
AM
3964 case BFD_RELOC_PPC_TPREL16_LO:
3965 reloc = BFD_RELOC_PPC64_TPREL16_LO_DS;
3966 break;
5663e321 3967
a0593ad9
AM
3968 case BFD_RELOC_PPC_GOT_DTPREL16:
3969 case BFD_RELOC_PPC_GOT_DTPREL16_LO:
3970 case BFD_RELOC_PPC_GOT_TPREL16:
3971 case BFD_RELOC_PPC_GOT_TPREL16_LO:
3972 break;
5663e321 3973
a0593ad9
AM
3974 default:
3975 as_bad (_("unsupported relocation for DS offset field"));
3976 break;
3977 }
3978 }
160eba93
AM
3979
3980 /* Look for a __tls_get_addr arg after any __tls_get_addr
3981 modifiers like @plt. This fixup must be emitted before
3982 the usual call fixup. */
3983 if (ex.X_op == O_symbol && *str == '(' && fc < MAX_INSN_FIXUPS
3984 && parse_tls_arg (&str, &ex, &fixups[fc]))
3985 {
3986 fixups[fc].opindex = *opindex_ptr;
3987 ++fc;
3988 }
a0593ad9 3989#endif
0baf16f2 3990
252b5132
RH
3991 /* We need to generate a fixup for this expression. */
3992 if (fc >= MAX_INSN_FIXUPS)
3993 as_fatal (_("too many fixups"));
3994 fixups[fc].exp = ex;
727fc41e 3995 fixups[fc].opindex = *opindex_ptr;
252b5132
RH
3996 fixups[fc].reloc = reloc;
3997 ++fc;
3998 }
252b5132
RH
3999
4000 if (need_paren)
4001 {
4002 endc = ')';
4003 need_paren = 0;
c3d65c1c
BE
4004 /* If expecting more operands, then we want to see "),". */
4005 if (*str == endc && opindex_ptr[1] != 0)
4006 {
4007 do
4008 ++str;
4009 while (ISSPACE (*str));
4010 endc = ',';
4011 }
252b5132
RH
4012 }
4013 else if ((operand->flags & PPC_OPERAND_PARENS) != 0)
9cf7e568 4014 endc = '(';
252b5132
RH
4015 else
4016 endc = ',';
4017
4018 /* The call to expression should have advanced str past any
4019 whitespace. */
9cf7e568 4020 if (*str == endc)
252b5132 4021 {
9cf7e568
AM
4022 ++str;
4023 if (endc == '(')
4024 need_paren = 1;
4025 }
4026 else if (*str != '\0')
4027 {
4028 as_bad (_("syntax error; found `%c', expected `%c'"), *str, endc);
4029 break;
4030 }
4031 else if (endc == ')')
4032 {
4033 as_bad (_("syntax error; end of line, expected `%c'"), endc);
252b5132
RH
4034 break;
4035 }
252b5132
RH
4036 }
4037
3882b010 4038 while (ISSPACE (*str))
252b5132
RH
4039 ++str;
4040
4041 if (*str != '\0')
4042 as_bad (_("junk at end of line: `%s'"), str);
4043
dc1d03fc 4044#ifdef OBJ_ELF
b9c361e0 4045 /* Do we need/want an APUinfo section? */
4faf939a
JM
4046 if ((ppc_cpu & (PPC_OPCODE_E500 | PPC_OPCODE_E500MC | PPC_OPCODE_VLE)) != 0
4047 && !ppc_obj64)
6a0c61b7
EZ
4048 {
4049 /* These are all version "1". */
4050 if (opcode->flags & PPC_OPCODE_SPE)
b34976b6 4051 ppc_apuinfo_section_add (PPC_APUINFO_SPE, 1);
6a0c61b7 4052 if (opcode->flags & PPC_OPCODE_ISEL)
b34976b6 4053 ppc_apuinfo_section_add (PPC_APUINFO_ISEL, 1);
6a0c61b7 4054 if (opcode->flags & PPC_OPCODE_EFS)
b34976b6 4055 ppc_apuinfo_section_add (PPC_APUINFO_EFS, 1);
6a0c61b7 4056 if (opcode->flags & PPC_OPCODE_BRLOCK)
b34976b6 4057 ppc_apuinfo_section_add (PPC_APUINFO_BRLOCK, 1);
6a0c61b7 4058 if (opcode->flags & PPC_OPCODE_PMR)
b34976b6 4059 ppc_apuinfo_section_add (PPC_APUINFO_PMR, 1);
6a0c61b7 4060 if (opcode->flags & PPC_OPCODE_CACHELCK)
b34976b6 4061 ppc_apuinfo_section_add (PPC_APUINFO_CACHELCK, 1);
6a0c61b7 4062 if (opcode->flags & PPC_OPCODE_RFMCI)
b34976b6 4063 ppc_apuinfo_section_add (PPC_APUINFO_RFMCI, 1);
fbd94057
MR
4064 /* Only set the VLE flag if the instruction has been pulled via
4065 the VLE instruction set. This way the flag is guaranteed to
4066 be set for VLE-only instructions or for VLE-only processors,
4067 however it'll remain clear for dual-mode instructions on
4068 dual-mode and, more importantly, standard-mode processors. */
4069 if ((ppc_cpu & opcode->flags) == PPC_OPCODE_VLE)
f7d69005
AM
4070 {
4071 ppc_apuinfo_section_add (PPC_APUINFO_VLE, 1);
4072 if (elf_section_data (now_seg) != NULL)
4073 elf_section_data (now_seg)->this_hdr.sh_flags |= SHF_PPC_VLE;
4074 }
6a0c61b7 4075 }
dc1d03fc 4076#endif
6a0c61b7 4077
252b5132 4078 /* Write out the instruction. */
a9479dc0
AM
4079
4080 addr_mask = 3;
f7d69005 4081 if ((ppc_cpu & PPC_OPCODE_VLE) != 0)
a9479dc0
AM
4082 /* All instructions can start on a 2 byte boundary for VLE. */
4083 addr_mask = 1;
4084
4085 if (frag_now->insn_addr != addr_mask)
b9c361e0 4086 {
a9479dc0
AM
4087 /* Don't emit instructions to a frag started for data, or for a
4088 CPU differing in VLE mode. Data is allowed to be misaligned,
4089 and it's possible to start a new frag in the middle of
4090 misaligned data. */
4091 frag_wane (frag_now);
4092 frag_new (0);
b9c361e0 4093 }
a9479dc0
AM
4094
4095 /* Check that insns within the frag are aligned. ppc_frag_check
4096 will ensure that the frag start address is aligned. */
4097 if ((frag_now_fix () & addr_mask) != 0)
4098 as_bad (_("instruction address is not a multiple of %d"), addr_mask + 1);
4099
dd7efa79 4100 /* Differentiate between two, four, and eight byte insns. */
a9479dc0
AM
4101 insn_length = 4;
4102 if ((ppc_cpu & PPC_OPCODE_VLE) != 0 && PPC_OP_SE_VLE (insn))
4103 insn_length = 2;
dd7efa79
PB
4104 else if ((opcode->flags & PPC_OPCODE_POWERXX) != 0
4105 && PPC_PREFIX_P (insn))
4106 {
4107 struct insn_label_list *l;
4108
4109 insn_length = 8;
4110
4111 /* 8-byte prefix instructions are not allowed to cross 64-byte
4112 boundaries. */
4113 frag_align_code (6, 4);
4114 record_alignment (now_seg, 6);
4115
4116 /* Update "dot" in any expressions used by this instruction, and
4117 a label attached to the instruction. By "attached" we mean
4118 on the same source line as the instruction and without any
4119 intervening semicolons. */
4120 dot_value = frag_now_fix ();
4121 dot_frag = frag_now;
4122 for (l = insn_labels; l != NULL; l = l->next)
4123 {
4124 symbol_set_frag (l->label, dot_frag);
4125 S_SET_VALUE (l->label, dot_value);
4126 }
4127 }
4128
4129 ppc_clear_labels ();
a9479dc0 4130
b9c361e0 4131 f = frag_more (insn_length);
a9479dc0 4132 frag_now->insn_addr = addr_mask;
dd7efa79
PB
4133
4134 /* The prefix part of an 8-byte instruction always occupies the lower
4135 addressed word in a doubleword, regardless of endianness. */
4136 if (!target_big_endian && insn_length == 8)
4137 {
4138 md_number_to_chars (f, PPC_GET_PREFIX (insn), 4);
4139 md_number_to_chars (f + 4, PPC_GET_SUFFIX (insn), 4);
4140 }
4141 else
4142 md_number_to_chars (f, insn, insn_length);
4143
bf7279d5
AM
4144 last_insn = insn;
4145 last_seg = now_seg;
4146 last_subseg = now_subseg;
252b5132 4147
5d6f4f16 4148#ifdef OBJ_ELF
b9c361e0 4149 dwarf2_emit_insn (insn_length);
5d6f4f16
GK
4150#endif
4151
3b8b57a9 4152 /* Create any fixups. */
252b5132
RH
4153 for (i = 0; i < fc; i++)
4154 {
3b8b57a9 4155 fixS *fixP;
62ebcb5c 4156 if (fixups[i].reloc != BFD_RELOC_NONE)
252b5132 4157 {
0e2779e9
AM
4158 bfd_boolean pcrel;
4159 unsigned int size = fixup_size (fixups[i].reloc, &pcrel);
4160 int offset = target_big_endian ? (insn_length - size) : 0;
252b5132 4161
99a814a1
AM
4162 fixP = fix_new_exp (frag_now,
4163 f - frag_now->fr_literal + offset,
4164 size,
4165 &fixups[i].exp,
0e2779e9 4166 pcrel,
252b5132 4167 fixups[i].reloc);
252b5132
RH
4168 }
4169 else
727fc41e
AM
4170 {
4171 const struct powerpc_operand *operand;
4172
4173 operand = &powerpc_operands[fixups[i].opindex];
3b8b57a9
AM
4174 fixP = fix_new_exp (frag_now,
4175 f - frag_now->fr_literal,
4176 insn_length,
4177 &fixups[i].exp,
4178 (operand->flags & PPC_OPERAND_RELATIVE) != 0,
62ebcb5c 4179 BFD_RELOC_NONE);
727fc41e 4180 }
3b8b57a9 4181 fixP->fx_pcrel_adjust = fixups[i].opindex;
252b5132
RH
4182 }
4183}
4184
4185/* Handle a macro. Gather all the operands, transform them as
4186 described by the macro, and call md_assemble recursively. All the
4187 operands are separated by commas; we don't accept parentheses
4188 around operands here. */
4189
4190static void
98027b10 4191ppc_macro (char *str, const struct powerpc_macro *macro)
252b5132
RH
4192{
4193 char *operands[10];
4194 unsigned int count;
4195 char *s;
4196 unsigned int len;
4197 const char *format;
db557034 4198 unsigned int arg;
252b5132
RH
4199 char *send;
4200 char *complete;
4201
4202 /* Gather the users operands into the operands array. */
4203 count = 0;
4204 s = str;
4205 while (1)
4206 {
4207 if (count >= sizeof operands / sizeof operands[0])
4208 break;
4209 operands[count++] = s;
4210 s = strchr (s, ',');
4211 if (s == (char *) NULL)
4212 break;
4213 *s++ = '\0';
81d4177b 4214 }
252b5132
RH
4215
4216 if (count != macro->operands)
4217 {
4218 as_bad (_("wrong number of operands"));
4219 return;
4220 }
4221
4222 /* Work out how large the string must be (the size is unbounded
4223 because it includes user input). */
4224 len = 0;
4225 format = macro->format;
4226 while (*format != '\0')
4227 {
4228 if (*format != '%')
4229 {
4230 ++len;
4231 ++format;
4232 }
4233 else
4234 {
4235 arg = strtol (format + 1, &send, 10);
db557034 4236 know (send != format && arg < count);
252b5132
RH
4237 len += strlen (operands[arg]);
4238 format = send;
4239 }
4240 }
4241
4242 /* Put the string together. */
325801bd 4243 complete = s = XNEWVEC (char, len + 1);
252b5132
RH
4244 format = macro->format;
4245 while (*format != '\0')
4246 {
4247 if (*format != '%')
4248 *s++ = *format++;
4249 else
4250 {
4251 arg = strtol (format + 1, &send, 10);
4252 strcpy (s, operands[arg]);
4253 s += strlen (s);
4254 format = send;
4255 }
4256 }
4257 *s = '\0';
4258
4259 /* Assemble the constructed instruction. */
4260 md_assemble (complete);
e1fa0163 4261 free (complete);
81d4177b 4262}
252b5132
RH
4263\f
4264#ifdef OBJ_ELF
18ae9cc1 4265/* For ELF, add support for SHT_ORDERED. */
252b5132
RH
4266
4267int
98027b10 4268ppc_section_type (char *str, size_t len)
252b5132 4269{
9de8d8f1
RH
4270 if (len == 7 && strncmp (str, "ordered", 7) == 0)
4271 return SHT_ORDERED;
252b5132 4272
9de8d8f1 4273 return -1;
252b5132
RH
4274}
4275
4276int
1239de13 4277ppc_section_flags (flagword flags, bfd_vma attr ATTRIBUTE_UNUSED, int type)
252b5132
RH
4278{
4279 if (type == SHT_ORDERED)
4280 flags |= SEC_ALLOC | SEC_LOAD | SEC_SORT_ENTRIES;
4281
252b5132
RH
4282 return flags;
4283}
83eef883
AFB
4284
4285bfd_vma
4286ppc_elf_section_letter (int letter, const char **ptrmsg)
4287{
4288 if (letter == 'v')
4289 return SHF_PPC_VLE;
4290
4291 *ptrmsg = _("bad .section directive: want a,e,v,w,x,M,S,G,T in string");
4292 return -1;
4293}
252b5132
RH
4294#endif /* OBJ_ELF */
4295
4296\f
4297/* Pseudo-op handling. */
4298
4299/* The .byte pseudo-op. This is similar to the normal .byte
4300 pseudo-op, but it can also take a single ASCII string. */
4301
4302static void
98027b10 4303ppc_byte (int ignore ATTRIBUTE_UNUSED)
252b5132 4304{
bf7279d5
AM
4305 int count = 0;
4306
252b5132
RH
4307 if (*input_line_pointer != '\"')
4308 {
4309 cons (1);
4310 return;
4311 }
4312
4313 /* Gather characters. A real double quote is doubled. Unusual
4314 characters are not permitted. */
4315 ++input_line_pointer;
4316 while (1)
4317 {
4318 char c;
4319
4320 c = *input_line_pointer++;
4321
4322 if (c == '\"')
4323 {
4324 if (*input_line_pointer != '\"')
4325 break;
4326 ++input_line_pointer;
4327 }
4328
4329 FRAG_APPEND_1_CHAR (c);
bf7279d5 4330 ++count;
252b5132
RH
4331 }
4332
bf7279d5
AM
4333 if (warn_476 && count != 0 && (now_seg->flags & SEC_CODE) != 0)
4334 as_warn (_("data in executable section"));
252b5132
RH
4335 demand_empty_rest_of_line ();
4336}
4337\f
4338#ifdef OBJ_XCOFF
4339
4340/* XCOFF specific pseudo-op handling. */
4341
4342/* This is set if we are creating a .stabx symbol, since we don't want
4343 to handle symbol suffixes for such symbols. */
b34976b6 4344static bfd_boolean ppc_stab_symbol;
252b5132
RH
4345
4346/* The .comm and .lcomm pseudo-ops for XCOFF. XCOFF puts common
4347 symbols in the .bss segment as though they were local common
67c1ffbe 4348 symbols, and uses a different smclas. The native Aix 4.3.3 assembler
1ad63b2f 4349 aligns .comm and .lcomm to 4 bytes. */
252b5132
RH
4350
4351static void
98027b10 4352ppc_comm (int lcomm)
252b5132
RH
4353{
4354 asection *current_seg = now_seg;
4355 subsegT current_subseg = now_subseg;
4356 char *name;
4357 char endc;
4358 char *end_name;
4359 offsetT size;
4360 offsetT align;
4361 symbolS *lcomm_sym = NULL;
4362 symbolS *sym;
4363 char *pfrag;
4364
d02603dc 4365 endc = get_symbol_name (&name);
252b5132 4366 end_name = input_line_pointer;
d02603dc 4367 (void) restore_line_pointer (endc);
252b5132
RH
4368
4369 if (*input_line_pointer != ',')
4370 {
4371 as_bad (_("missing size"));
4372 ignore_rest_of_line ();
4373 return;
4374 }
4375 ++input_line_pointer;
4376
4377 size = get_absolute_expression ();
4378 if (size < 0)
4379 {
4380 as_bad (_("negative size"));
4381 ignore_rest_of_line ();
4382 return;
4383 }
4384
4385 if (! lcomm)
4386 {
4387 /* The third argument to .comm is the alignment. */
4388 if (*input_line_pointer != ',')
1ad63b2f 4389 align = 2;
252b5132
RH
4390 else
4391 {
4392 ++input_line_pointer;
4393 align = get_absolute_expression ();
4394 if (align <= 0)
4395 {
4396 as_warn (_("ignoring bad alignment"));
1ad63b2f 4397 align = 2;
252b5132
RH
4398 }
4399 }
4400 }
4401 else
4402 {
4403 char *lcomm_name;
4404 char lcomm_endc;
4405
252b5132
RH
4406 /* The third argument to .lcomm appears to be the real local
4407 common symbol to create. References to the symbol named in
4408 the first argument are turned into references to the third
4409 argument. */
4410 if (*input_line_pointer != ',')
4411 {
4412 as_bad (_("missing real symbol name"));
4413 ignore_rest_of_line ();
4414 return;
4415 }
4416 ++input_line_pointer;
4417
d02603dc 4418 lcomm_endc = get_symbol_name (&lcomm_name);
81d4177b 4419
252b5132
RH
4420 lcomm_sym = symbol_find_or_make (lcomm_name);
4421
d02603dc 4422 (void) restore_line_pointer (lcomm_endc);
3c02c47f
DE
4423
4424 /* The fourth argument to .lcomm is the alignment. */
4425 if (*input_line_pointer != ',')
4426 {
4427 if (size <= 4)
4428 align = 2;
4429 else
4430 align = 3;
4431 }
4432 else
4433 {
4434 ++input_line_pointer;
4435 align = get_absolute_expression ();
4436 if (align <= 0)
4437 {
4438 as_warn (_("ignoring bad alignment"));
4439 align = 2;
4440 }
4441 }
252b5132
RH
4442 }
4443
4444 *end_name = '\0';
4445 sym = symbol_find_or_make (name);
4446 *end_name = endc;
4447
4448 if (S_IS_DEFINED (sym)
4449 || S_GET_VALUE (sym) != 0)
4450 {
4451 as_bad (_("attempt to redefine symbol"));
4452 ignore_rest_of_line ();
4453 return;
4454 }
81d4177b 4455
252b5132 4456 record_alignment (bss_section, align);
81d4177b 4457
252b5132
RH
4458 if (! lcomm
4459 || ! S_IS_DEFINED (lcomm_sym))
4460 {
4461 symbolS *def_sym;
4462 offsetT def_size;
4463
4464 if (! lcomm)
4465 {
4466 def_sym = sym;
4467 def_size = size;
4468 S_SET_EXTERNAL (sym);
4469 }
4470 else
4471 {
809ffe0d 4472 symbol_get_tc (lcomm_sym)->output = 1;
252b5132
RH
4473 def_sym = lcomm_sym;
4474 def_size = 0;
4475 }
4476
4477 subseg_set (bss_section, 1);
4478 frag_align (align, 0, 0);
81d4177b 4479
809ffe0d 4480 symbol_set_frag (def_sym, frag_now);
252b5132
RH
4481 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, def_sym,
4482 def_size, (char *) NULL);
4483 *pfrag = 0;
4484 S_SET_SEGMENT (def_sym, bss_section);
809ffe0d 4485 symbol_get_tc (def_sym)->align = align;
252b5132
RH
4486 }
4487 else if (lcomm)
4488 {
4489 /* Align the size of lcomm_sym. */
809ffe0d
ILT
4490 symbol_get_frag (lcomm_sym)->fr_offset =
4491 ((symbol_get_frag (lcomm_sym)->fr_offset + (1 << align) - 1)
252b5132 4492 &~ ((1 << align) - 1));
809ffe0d
ILT
4493 if (align > symbol_get_tc (lcomm_sym)->align)
4494 symbol_get_tc (lcomm_sym)->align = align;
252b5132
RH
4495 }
4496
4497 if (lcomm)
4498 {
4499 /* Make sym an offset from lcomm_sym. */
4500 S_SET_SEGMENT (sym, bss_section);
809ffe0d
ILT
4501 symbol_set_frag (sym, symbol_get_frag (lcomm_sym));
4502 S_SET_VALUE (sym, symbol_get_frag (lcomm_sym)->fr_offset);
4503 symbol_get_frag (lcomm_sym)->fr_offset += size;
252b5132
RH
4504 }
4505
4506 subseg_set (current_seg, current_subseg);
4507
4508 demand_empty_rest_of_line ();
4509}
4510
4511/* The .csect pseudo-op. This switches us into a different
4512 subsegment. The first argument is a symbol whose value is the
4513 start of the .csect. In COFF, csect symbols get special aux
4514 entries defined by the x_csect field of union internal_auxent. The
4515 optional second argument is the alignment (the default is 2). */
4516
4517static void
98027b10 4518ppc_csect (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
4519{
4520 char *name;
4521 char endc;
4522 symbolS *sym;
931e13a6 4523 offsetT align;
252b5132 4524
d02603dc 4525 endc = get_symbol_name (&name);
81d4177b 4526
252b5132
RH
4527 sym = symbol_find_or_make (name);
4528
d02603dc 4529 (void) restore_line_pointer (endc);
252b5132
RH
4530
4531 if (S_GET_NAME (sym)[0] == '\0')
4532 {
4533 /* An unnamed csect is assumed to be [PR]. */
96d56e9f 4534 symbol_get_tc (sym)->symbol_class = XMC_PR;
252b5132
RH
4535 }
4536
931e13a6 4537 align = 2;
252b5132
RH
4538 if (*input_line_pointer == ',')
4539 {
4540 ++input_line_pointer;
931e13a6 4541 align = get_absolute_expression ();
252b5132
RH
4542 }
4543
931e13a6
AM
4544 ppc_change_csect (sym, align);
4545
252b5132
RH
4546 demand_empty_rest_of_line ();
4547}
4548
4549/* Change to a different csect. */
4550
4551static void
98027b10 4552ppc_change_csect (symbolS *sym, offsetT align)
252b5132
RH
4553{
4554 if (S_IS_DEFINED (sym))
809ffe0d 4555 subseg_set (S_GET_SEGMENT (sym), symbol_get_tc (sym)->subseg);
252b5132
RH
4556 else
4557 {
4558 symbolS **list_ptr;
4559 int after_toc;
4560 int hold_chunksize;
4561 symbolS *list;
931e13a6
AM
4562 int is_code;
4563 segT sec;
252b5132
RH
4564
4565 /* This is a new csect. We need to look at the symbol class to
4566 figure out whether it should go in the text section or the
4567 data section. */
4568 after_toc = 0;
931e13a6 4569 is_code = 0;
96d56e9f 4570 switch (symbol_get_tc (sym)->symbol_class)
252b5132
RH
4571 {
4572 case XMC_PR:
4573 case XMC_RO:
4574 case XMC_DB:
4575 case XMC_GL:
4576 case XMC_XO:
4577 case XMC_SV:
4578 case XMC_TI:
4579 case XMC_TB:
4580 S_SET_SEGMENT (sym, text_section);
809ffe0d 4581 symbol_get_tc (sym)->subseg = ppc_text_subsegment;
252b5132
RH
4582 ++ppc_text_subsegment;
4583 list_ptr = &ppc_text_csects;
931e13a6 4584 is_code = 1;
252b5132
RH
4585 break;
4586 case XMC_RW:
4587 case XMC_TC0:
4588 case XMC_TC:
4589 case XMC_DS:
4590 case XMC_UA:
4591 case XMC_BS:
4592 case XMC_UC:
4593 if (ppc_toc_csect != NULL
809ffe0d
ILT
4594 && (symbol_get_tc (ppc_toc_csect)->subseg + 1
4595 == ppc_data_subsegment))
252b5132
RH
4596 after_toc = 1;
4597 S_SET_SEGMENT (sym, data_section);
809ffe0d 4598 symbol_get_tc (sym)->subseg = ppc_data_subsegment;
252b5132
RH
4599 ++ppc_data_subsegment;
4600 list_ptr = &ppc_data_csects;
4601 break;
4602 default:
4603 abort ();
4604 }
4605
4606 /* We set the obstack chunk size to a small value before
99a814a1
AM
4607 changing subsegments, so that we don't use a lot of memory
4608 space for what may be a small section. */
252b5132
RH
4609 hold_chunksize = chunksize;
4610 chunksize = 64;
4611
931e13a6
AM
4612 sec = subseg_new (segment_name (S_GET_SEGMENT (sym)),
4613 symbol_get_tc (sym)->subseg);
252b5132
RH
4614
4615 chunksize = hold_chunksize;
4616
4617 if (after_toc)
4618 ppc_after_toc_frag = frag_now;
4619
931e13a6
AM
4620 record_alignment (sec, align);
4621 if (is_code)
4622 frag_align_code (align, 0);
4623 else
4624 frag_align (align, 0, 0);
4625
809ffe0d 4626 symbol_set_frag (sym, frag_now);
252b5132
RH
4627 S_SET_VALUE (sym, (valueT) frag_now_fix ());
4628
931e13a6 4629 symbol_get_tc (sym)->align = align;
809ffe0d
ILT
4630 symbol_get_tc (sym)->output = 1;
4631 symbol_get_tc (sym)->within = sym;
81d4177b 4632
252b5132 4633 for (list = *list_ptr;
809ffe0d
ILT
4634 symbol_get_tc (list)->next != (symbolS *) NULL;
4635 list = symbol_get_tc (list)->next)
252b5132 4636 ;
809ffe0d 4637 symbol_get_tc (list)->next = sym;
81d4177b 4638
252b5132 4639 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
809ffe0d
ILT
4640 symbol_append (sym, symbol_get_tc (list)->within, &symbol_rootP,
4641 &symbol_lastP);
252b5132
RH
4642 }
4643
4644 ppc_current_csect = sym;
4645}
4646
85645aed
TG
4647static void
4648ppc_change_debug_section (unsigned int idx, subsegT subseg)
4649{
4650 segT sec;
4651 flagword oldflags;
4652 const struct xcoff_dwsect_name *dw = &xcoff_dwsect_names[idx];
4653
4654 sec = subseg_new (dw->name, subseg);
4655 oldflags = bfd_get_section_flags (stdoutput, sec);
4656 if (oldflags == SEC_NO_FLAGS)
4657 {
4658 /* Just created section. */
4659 gas_assert (dw_sections[idx].sect == NULL);
4660
4661 bfd_set_section_flags (stdoutput, sec, SEC_DEBUGGING);
4662 bfd_set_section_alignment (stdoutput, sec, 0);
4663 dw_sections[idx].sect = sec;
4664 }
4665
4666 /* Not anymore in a csect. */
4667 ppc_current_csect = NULL;
4668}
4669
4670/* The .dwsect pseudo-op. Defines a DWARF section. Syntax is:
4671 .dwsect flag [, opt-label ]
4672*/
4673
4674static void
4675ppc_dwsect (int ignore ATTRIBUTE_UNUSED)
4676{
16de26a6 4677 valueT flag;
85645aed
TG
4678 symbolS *opt_label;
4679 const struct xcoff_dwsect_name *dw;
4680 struct dw_subsection *subseg;
4681 struct dw_section *dws;
4682 int i;
4683
4684 /* Find section. */
4685 flag = get_absolute_expression ();
4686 dw = NULL;
4687 for (i = 0; i < XCOFF_DWSECT_NBR_NAMES; i++)
4688 if (xcoff_dwsect_names[i].flag == flag)
4689 {
4690 dw = &xcoff_dwsect_names[i];
4691 break;
4692 }
4693
4694 /* Parse opt-label. */
4695 if (*input_line_pointer == ',')
4696 {
d02603dc 4697 char *label;
85645aed
TG
4698 char c;
4699
4700 ++input_line_pointer;
4701
d02603dc 4702 c = get_symbol_name (&label);
85645aed 4703 opt_label = symbol_find_or_make (label);
d02603dc 4704 (void) restore_line_pointer (c);
85645aed
TG
4705 }
4706 else
4707 opt_label = NULL;
4708
4709 demand_empty_rest_of_line ();
4710
4711 /* Return now in case of unknown subsection. */
4712 if (dw == NULL)
4713 {
d6ed37ed 4714 as_bad (_("no known dwarf XCOFF section for flag 0x%08x\n"),
85645aed
TG
4715 (unsigned)flag);
4716 return;
4717 }
4718
4719 /* Find the subsection. */
4720 dws = &dw_sections[i];
4721 subseg = NULL;
4722 if (opt_label != NULL && S_IS_DEFINED (opt_label))
4723 {
4724 /* Sanity check (note that in theory S_GET_SEGMENT mustn't be null). */
4725 if (dws->sect == NULL || S_GET_SEGMENT (opt_label) != dws->sect)
4726 {
4727 as_bad (_("label %s was not defined in this dwarf section"),
4728 S_GET_NAME (opt_label));
4729 subseg = dws->anon_subseg;
4730 opt_label = NULL;
4731 }
4732 else
4733 subseg = symbol_get_tc (opt_label)->u.dw;
4734 }
4735
4736 if (subseg != NULL)
4737 {
4738 /* Switch to the subsection. */
4739 ppc_change_debug_section (i, subseg->subseg);
4740 }
4741 else
4742 {
4743 /* Create a new dw subsection. */
325801bd 4744 subseg = XNEW (struct dw_subsection);
85645aed
TG
4745
4746 if (opt_label == NULL)
4747 {
4748 /* The anonymous one. */
4749 subseg->subseg = 0;
4750 subseg->link = NULL;
4751 dws->anon_subseg = subseg;
4752 }
4753 else
4754 {
4755 /* A named one. */
4756 if (dws->list_subseg != NULL)
4757 subseg->subseg = dws->list_subseg->subseg + 1;
4758 else
4759 subseg->subseg = 1;
4760
4761 subseg->link = dws->list_subseg;
4762 dws->list_subseg = subseg;
4763 symbol_get_tc (opt_label)->u.dw = subseg;
4764 }
4765
4766 ppc_change_debug_section (i, subseg->subseg);
4767
4768 if (dw->def_size)
4769 {
4770 /* Add the length field. */
4771 expressionS *exp = &subseg->end_exp;
4772 int sz;
4773
4774 if (opt_label != NULL)
4775 symbol_set_value_now (opt_label);
4776
4777 /* Add the length field. Note that according to the AIX assembler
4778 manual, the size of the length field is 4 for powerpc32 but
4779 12 for powerpc64. */
4780 if (ppc_obj64)
4781 {
4782 /* Write the 64bit marker. */
4783 md_number_to_chars (frag_more (4), -1, 4);
4784 }
4785
4786 exp->X_op = O_subtract;
4787 exp->X_op_symbol = symbol_temp_new_now ();
4788 exp->X_add_symbol = symbol_temp_make ();
4789
4790 sz = ppc_obj64 ? 8 : 4;
4791 exp->X_add_number = -sz;
4792 emit_expr (exp, sz);
4793 }
4794 }
4795}
4796
252b5132
RH
4797/* This function handles the .text and .data pseudo-ops. These
4798 pseudo-ops aren't really used by XCOFF; we implement them for the
4799 convenience of people who aren't used to XCOFF. */
4800
4801static void
98027b10 4802ppc_section (int type)
252b5132
RH
4803{
4804 const char *name;
4805 symbolS *sym;
4806
4807 if (type == 't')
4808 name = ".text[PR]";
4809 else if (type == 'd')
4810 name = ".data[RW]";
4811 else
4812 abort ();
4813
4814 sym = symbol_find_or_make (name);
4815
931e13a6 4816 ppc_change_csect (sym, 2);
252b5132
RH
4817
4818 demand_empty_rest_of_line ();
4819}
4820
4821/* This function handles the .section pseudo-op. This is mostly to
4822 give an error, since XCOFF only supports .text, .data and .bss, but
4823 we do permit the user to name the text or data section. */
4824
4825static void
98027b10 4826ppc_named_section (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
4827{
4828 char *user_name;
4829 const char *real_name;
4830 char c;
4831 symbolS *sym;
4832
d02603dc 4833 c = get_symbol_name (&user_name);
252b5132
RH
4834
4835 if (strcmp (user_name, ".text") == 0)
4836 real_name = ".text[PR]";
4837 else if (strcmp (user_name, ".data") == 0)
4838 real_name = ".data[RW]";
4839 else
4840 {
d6ed37ed 4841 as_bad (_("the XCOFF file format does not support arbitrary sections"));
d02603dc 4842 (void) restore_line_pointer (c);
252b5132
RH
4843 ignore_rest_of_line ();
4844 return;
4845 }
4846
d02603dc 4847 (void) restore_line_pointer (c);
252b5132
RH
4848
4849 sym = symbol_find_or_make (real_name);
4850
931e13a6 4851 ppc_change_csect (sym, 2);
252b5132
RH
4852
4853 demand_empty_rest_of_line ();
4854}
4855
4856/* The .extern pseudo-op. We create an undefined symbol. */
4857
4858static void
98027b10 4859ppc_extern (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
4860{
4861 char *name;
4862 char endc;
4863
d02603dc 4864 endc = get_symbol_name (&name);
252b5132
RH
4865
4866 (void) symbol_find_or_make (name);
4867
d02603dc 4868 (void) restore_line_pointer (endc);
252b5132
RH
4869
4870 demand_empty_rest_of_line ();
4871}
4872
4873/* The .lglobl pseudo-op. Keep the symbol in the symbol table. */
4874
4875static void
98027b10 4876ppc_lglobl (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
4877{
4878 char *name;
4879 char endc;
4880 symbolS *sym;
4881
d02603dc 4882 endc = get_symbol_name (&name);
252b5132
RH
4883
4884 sym = symbol_find_or_make (name);
4885
d02603dc 4886 (void) restore_line_pointer (endc);
252b5132 4887
809ffe0d 4888 symbol_get_tc (sym)->output = 1;
252b5132
RH
4889
4890 demand_empty_rest_of_line ();
4891}
4892
c865e45b
RS
4893/* The .ref pseudo-op. It takes a list of symbol names and inserts R_REF
4894 relocations at the beginning of the current csect.
4895
4896 (In principle, there's no reason why the relocations _have_ to be at
4897 the beginning. Anywhere in the csect would do. However, inserting
33eaf5de 4898 at the beginning is what the native assembler does, and it helps to
c865e45b
RS
4899 deal with cases where the .ref statements follow the section contents.)
4900
4901 ??? .refs don't work for empty .csects. However, the native assembler
4902 doesn't report an error in this case, and neither yet do we. */
4903
4904static void
4905ppc_ref (int ignore ATTRIBUTE_UNUSED)
4906{
4907 char *name;
4908 char c;
4909
4910 if (ppc_current_csect == NULL)
4911 {
4912 as_bad (_(".ref outside .csect"));
4913 ignore_rest_of_line ();
4914 return;
4915 }
4916
4917 do
4918 {
d02603dc 4919 c = get_symbol_name (&name);
c865e45b
RS
4920
4921 fix_at_start (symbol_get_frag (ppc_current_csect), 0,
4922 symbol_find_or_make (name), 0, FALSE, BFD_RELOC_NONE);
4923
4924 *input_line_pointer = c;
d02603dc 4925 SKIP_WHITESPACE_AFTER_NAME ();
c865e45b
RS
4926 c = *input_line_pointer;
4927 if (c == ',')
4928 {
4929 input_line_pointer++;
4930 SKIP_WHITESPACE ();
4931 if (is_end_of_line[(unsigned char) *input_line_pointer])
4932 {
4933 as_bad (_("missing symbol name"));
4934 ignore_rest_of_line ();
4935 return;
4936 }
4937 }
4938 }
4939 while (c == ',');
4940
4941 demand_empty_rest_of_line ();
4942}
4943
252b5132
RH
4944/* The .rename pseudo-op. The RS/6000 assembler can rename symbols,
4945 although I don't know why it bothers. */
4946
4947static void
98027b10 4948ppc_rename (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
4949{
4950 char *name;
4951 char endc;
4952 symbolS *sym;
4953 int len;
4954
d02603dc 4955 endc = get_symbol_name (&name);
252b5132
RH
4956
4957 sym = symbol_find_or_make (name);
4958
d02603dc 4959 (void) restore_line_pointer (endc);
252b5132
RH
4960
4961 if (*input_line_pointer != ',')
4962 {
4963 as_bad (_("missing rename string"));
4964 ignore_rest_of_line ();
4965 return;
4966 }
4967 ++input_line_pointer;
4968
809ffe0d 4969 symbol_get_tc (sym)->real_name = demand_copy_C_string (&len);
252b5132
RH
4970
4971 demand_empty_rest_of_line ();
4972}
4973
4974/* The .stabx pseudo-op. This is similar to a normal .stabs
4975 pseudo-op, but slightly different. A sample is
4976 .stabx "main:F-1",.main,142,0
4977 The first argument is the symbol name to create. The second is the
4978 value, and the third is the storage class. The fourth seems to be
4979 always zero, and I am assuming it is the type. */
4980
4981static void
98027b10 4982ppc_stabx (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
4983{
4984 char *name;
4985 int len;
4986 symbolS *sym;
4987 expressionS exp;
4988
4989 name = demand_copy_C_string (&len);
4990
4991 if (*input_line_pointer != ',')
4992 {
4993 as_bad (_("missing value"));
4994 return;
4995 }
4996 ++input_line_pointer;
4997
b34976b6 4998 ppc_stab_symbol = TRUE;
252b5132 4999 sym = symbol_make (name);
b34976b6 5000 ppc_stab_symbol = FALSE;
252b5132 5001
809ffe0d 5002 symbol_get_tc (sym)->real_name = name;
252b5132
RH
5003
5004 (void) expression (&exp);
5005
5006 switch (exp.X_op)
5007 {
5008 case O_illegal:
5009 case O_absent:
5010 case O_big:
5011 as_bad (_("illegal .stabx expression; zero assumed"));
5012 exp.X_add_number = 0;
5013 /* Fall through. */
5014 case O_constant:
5015 S_SET_VALUE (sym, (valueT) exp.X_add_number);
809ffe0d 5016 symbol_set_frag (sym, &zero_address_frag);
252b5132
RH
5017 break;
5018
5019 case O_symbol:
5020 if (S_GET_SEGMENT (exp.X_add_symbol) == undefined_section)
809ffe0d 5021 symbol_set_value_expression (sym, &exp);
252b5132
RH
5022 else
5023 {
5024 S_SET_VALUE (sym,
5025 exp.X_add_number + S_GET_VALUE (exp.X_add_symbol));
809ffe0d 5026 symbol_set_frag (sym, symbol_get_frag (exp.X_add_symbol));
252b5132
RH
5027 }
5028 break;
5029
5030 default:
5031 /* The value is some complex expression. This will probably
99a814a1
AM
5032 fail at some later point, but this is probably the right
5033 thing to do here. */
809ffe0d 5034 symbol_set_value_expression (sym, &exp);
252b5132
RH
5035 break;
5036 }
5037
5038 S_SET_SEGMENT (sym, ppc_coff_debug_section);
809ffe0d 5039 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
252b5132
RH
5040
5041 if (*input_line_pointer != ',')
5042 {
5043 as_bad (_("missing class"));
5044 return;
5045 }
5046 ++input_line_pointer;
5047
5048 S_SET_STORAGE_CLASS (sym, get_absolute_expression ());
5049
5050 if (*input_line_pointer != ',')
5051 {
5052 as_bad (_("missing type"));
5053 return;
5054 }
5055 ++input_line_pointer;
5056
5057 S_SET_DATA_TYPE (sym, get_absolute_expression ());
5058
809ffe0d 5059 symbol_get_tc (sym)->output = 1;
252b5132 5060
c734e7e3
TG
5061 if (S_GET_STORAGE_CLASS (sym) == C_STSYM)
5062 {
5063 /* In this case :
252b5132 5064
c734e7e3
TG
5065 .bs name
5066 .stabx "z",arrays_,133,0
5067 .es
99a814a1 5068
c734e7e3 5069 .comm arrays_,13768,3
99a814a1 5070
c734e7e3
TG
5071 resolve_symbol_value will copy the exp's "within" into sym's when the
5072 offset is 0. Since this seems to be corner case problem,
5073 only do the correction for storage class C_STSYM. A better solution
5074 would be to have the tc field updated in ppc_symbol_new_hook. */
99a814a1 5075
c734e7e3
TG
5076 if (exp.X_op == O_symbol)
5077 {
5078 if (ppc_current_block == NULL)
5079 as_bad (_(".stabx of storage class stsym must be within .bs/.es"));
99a814a1 5080
c734e7e3
TG
5081 symbol_get_tc (sym)->within = ppc_current_block;
5082 symbol_get_tc (exp.X_add_symbol)->within = ppc_current_block;
5083 }
5084 }
99a814a1 5085
252b5132
RH
5086 if (exp.X_op != O_symbol
5087 || ! S_IS_EXTERNAL (exp.X_add_symbol)
5088 || S_GET_SEGMENT (exp.X_add_symbol) != bss_section)
5089 ppc_frob_label (sym);
5090 else
5091 {
5092 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
5093 symbol_append (sym, exp.X_add_symbol, &symbol_rootP, &symbol_lastP);
809ffe0d
ILT
5094 if (symbol_get_tc (ppc_current_csect)->within == exp.X_add_symbol)
5095 symbol_get_tc (ppc_current_csect)->within = sym;
252b5132
RH
5096 }
5097
5098 demand_empty_rest_of_line ();
5099}
5100
5101/* The .function pseudo-op. This takes several arguments. The first
5102 argument seems to be the external name of the symbol. The second
67c1ffbe 5103 argument seems to be the label for the start of the function. gcc
252b5132
RH
5104 uses the same name for both. I have no idea what the third and
5105 fourth arguments are meant to be. The optional fifth argument is
5106 an expression for the size of the function. In COFF this symbol
5107 gets an aux entry like that used for a csect. */
5108
5109static void
98027b10 5110ppc_function (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
5111{
5112 char *name;
5113 char endc;
5114 char *s;
5115 symbolS *ext_sym;
5116 symbolS *lab_sym;
5117
d02603dc 5118 endc = get_symbol_name (&name);
252b5132
RH
5119
5120 /* Ignore any [PR] suffix. */
5121 name = ppc_canonicalize_symbol_name (name);
5122 s = strchr (name, '[');
5123 if (s != (char *) NULL
5124 && strcmp (s + 1, "PR]") == 0)
5125 *s = '\0';
5126
5127 ext_sym = symbol_find_or_make (name);
5128
d02603dc 5129 (void) restore_line_pointer (endc);
252b5132
RH
5130
5131 if (*input_line_pointer != ',')
5132 {
5133 as_bad (_("missing symbol name"));
5134 ignore_rest_of_line ();
5135 return;
5136 }
5137 ++input_line_pointer;
5138
d02603dc 5139 endc = get_symbol_name (&name);
252b5132
RH
5140
5141 lab_sym = symbol_find_or_make (name);
5142
d02603dc 5143 (void) restore_line_pointer (endc);
252b5132
RH
5144
5145 if (ext_sym != lab_sym)
5146 {
809ffe0d
ILT
5147 expressionS exp;
5148
5149 exp.X_op = O_symbol;
5150 exp.X_add_symbol = lab_sym;
5151 exp.X_op_symbol = NULL;
5152 exp.X_add_number = 0;
5153 exp.X_unsigned = 0;
5154 symbol_set_value_expression (ext_sym, &exp);
252b5132
RH
5155 }
5156
96d56e9f
NC
5157 if (symbol_get_tc (ext_sym)->symbol_class == -1)
5158 symbol_get_tc (ext_sym)->symbol_class = XMC_PR;
809ffe0d 5159 symbol_get_tc (ext_sym)->output = 1;
252b5132
RH
5160
5161 if (*input_line_pointer == ',')
5162 {
91d6fa6a 5163 expressionS exp;
252b5132
RH
5164
5165 /* Ignore the third argument. */
5166 ++input_line_pointer;
91d6fa6a 5167 expression (& exp);
252b5132
RH
5168 if (*input_line_pointer == ',')
5169 {
5170 /* Ignore the fourth argument. */
5171 ++input_line_pointer;
91d6fa6a 5172 expression (& exp);
252b5132
RH
5173 if (*input_line_pointer == ',')
5174 {
5175 /* The fifth argument is the function size. */
5176 ++input_line_pointer;
85645aed
TG
5177 symbol_get_tc (ext_sym)->u.size = symbol_new
5178 ("L0\001", absolute_section,(valueT) 0, &zero_address_frag);
5179 pseudo_set (symbol_get_tc (ext_sym)->u.size);
252b5132
RH
5180 }
5181 }
5182 }
5183
5184 S_SET_DATA_TYPE (ext_sym, DT_FCN << N_BTSHFT);
5185 SF_SET_FUNCTION (ext_sym);
5186 SF_SET_PROCESS (ext_sym);
5187 coff_add_linesym (ext_sym);
5188
5189 demand_empty_rest_of_line ();
5190}
5191
5192/* The .bf pseudo-op. This is just like a COFF C_FCN symbol named
8642cce8
TR
5193 ".bf". If the pseudo op .bi was seen before .bf, patch the .bi sym
5194 with the correct line number */
5d6255fe 5195
8642cce8 5196static symbolS *saved_bi_sym = 0;
252b5132
RH
5197
5198static void
98027b10 5199ppc_bf (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
5200{
5201 symbolS *sym;
5202
5203 sym = symbol_make (".bf");
5204 S_SET_SEGMENT (sym, text_section);
809ffe0d 5205 symbol_set_frag (sym, frag_now);
252b5132
RH
5206 S_SET_VALUE (sym, frag_now_fix ());
5207 S_SET_STORAGE_CLASS (sym, C_FCN);
5208
5209 coff_line_base = get_absolute_expression ();
5210
5211 S_SET_NUMBER_AUXILIARY (sym, 1);
5212 SA_SET_SYM_LNNO (sym, coff_line_base);
5213
8642cce8 5214 /* Line number for bi. */
5d6255fe 5215 if (saved_bi_sym)
8642cce8
TR
5216 {
5217 S_SET_VALUE (saved_bi_sym, coff_n_line_nos);
5218 saved_bi_sym = 0;
5219 }
5d6255fe 5220
8642cce8 5221
809ffe0d 5222 symbol_get_tc (sym)->output = 1;
252b5132
RH
5223
5224 ppc_frob_label (sym);
5225
5226 demand_empty_rest_of_line ();
5227}
5228
5229/* The .ef pseudo-op. This is just like a COFF C_FCN symbol named
5230 ".ef", except that the line number is absolute, not relative to the
5231 most recent ".bf" symbol. */
5232
5233static void
98027b10 5234ppc_ef (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
5235{
5236 symbolS *sym;
5237
5238 sym = symbol_make (".ef");
5239 S_SET_SEGMENT (sym, text_section);
809ffe0d 5240 symbol_set_frag (sym, frag_now);
252b5132
RH
5241 S_SET_VALUE (sym, frag_now_fix ());
5242 S_SET_STORAGE_CLASS (sym, C_FCN);
5243 S_SET_NUMBER_AUXILIARY (sym, 1);
5244 SA_SET_SYM_LNNO (sym, get_absolute_expression ());
809ffe0d 5245 symbol_get_tc (sym)->output = 1;
252b5132
RH
5246
5247 ppc_frob_label (sym);
5248
5249 demand_empty_rest_of_line ();
5250}
5251
5252/* The .bi and .ei pseudo-ops. These take a string argument and
5253 generates a C_BINCL or C_EINCL symbol, which goes at the start of
8642cce8
TR
5254 the symbol list. The value of .bi will be know when the next .bf
5255 is encountered. */
252b5132
RH
5256
5257static void
98027b10 5258ppc_biei (int ei)
252b5132
RH
5259{
5260 static symbolS *last_biei;
5261
5262 char *name;
5263 int len;
5264 symbolS *sym;
5265 symbolS *look;
5266
5267 name = demand_copy_C_string (&len);
5268
5269 /* The value of these symbols is actually file offset. Here we set
5270 the value to the index into the line number entries. In
5271 ppc_frob_symbols we set the fix_line field, which will cause BFD
5272 to do the right thing. */
5273
5274 sym = symbol_make (name);
5275 /* obj-coff.c currently only handles line numbers correctly in the
5276 .text section. */
5277 S_SET_SEGMENT (sym, text_section);
5278 S_SET_VALUE (sym, coff_n_line_nos);
809ffe0d 5279 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
252b5132
RH
5280
5281 S_SET_STORAGE_CLASS (sym, ei ? C_EINCL : C_BINCL);
809ffe0d 5282 symbol_get_tc (sym)->output = 1;
81d4177b 5283
8642cce8 5284 /* Save bi. */
5d6255fe 5285 if (ei)
8642cce8
TR
5286 saved_bi_sym = 0;
5287 else
5288 saved_bi_sym = sym;
5289
252b5132
RH
5290 for (look = last_biei ? last_biei : symbol_rootP;
5291 (look != (symbolS *) NULL
5292 && (S_GET_STORAGE_CLASS (look) == C_FILE
5293 || S_GET_STORAGE_CLASS (look) == C_BINCL
5294 || S_GET_STORAGE_CLASS (look) == C_EINCL));
5295 look = symbol_next (look))
5296 ;
5297 if (look != (symbolS *) NULL)
5298 {
5299 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
5300 symbol_insert (sym, look, &symbol_rootP, &symbol_lastP);
5301 last_biei = sym;
5302 }
5303
5304 demand_empty_rest_of_line ();
5305}
5306
5307/* The .bs pseudo-op. This generates a C_BSTAT symbol named ".bs".
5308 There is one argument, which is a csect symbol. The value of the
5309 .bs symbol is the index of this csect symbol. */
5310
5311static void
98027b10 5312ppc_bs (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
5313{
5314 char *name;
5315 char endc;
5316 symbolS *csect;
5317 symbolS *sym;
5318
5319 if (ppc_current_block != NULL)
5320 as_bad (_("nested .bs blocks"));
5321
d02603dc 5322 endc = get_symbol_name (&name);
252b5132
RH
5323
5324 csect = symbol_find_or_make (name);
5325
d02603dc 5326 (void) restore_line_pointer (endc);
252b5132
RH
5327
5328 sym = symbol_make (".bs");
5329 S_SET_SEGMENT (sym, now_seg);
5330 S_SET_STORAGE_CLASS (sym, C_BSTAT);
809ffe0d
ILT
5331 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
5332 symbol_get_tc (sym)->output = 1;
252b5132 5333
809ffe0d 5334 symbol_get_tc (sym)->within = csect;
252b5132
RH
5335
5336 ppc_frob_label (sym);
5337
5338 ppc_current_block = sym;
5339
5340 demand_empty_rest_of_line ();
5341}
5342
5343/* The .es pseudo-op. Generate a C_ESTART symbol named .es. */
5344
5345static void
98027b10 5346ppc_es (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
5347{
5348 symbolS *sym;
5349
5350 if (ppc_current_block == NULL)
5351 as_bad (_(".es without preceding .bs"));
5352
5353 sym = symbol_make (".es");
5354 S_SET_SEGMENT (sym, now_seg);
5355 S_SET_STORAGE_CLASS (sym, C_ESTAT);
809ffe0d
ILT
5356 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
5357 symbol_get_tc (sym)->output = 1;
252b5132
RH
5358
5359 ppc_frob_label (sym);
5360
5361 ppc_current_block = NULL;
5362
5363 demand_empty_rest_of_line ();
5364}
5365
5366/* The .bb pseudo-op. Generate a C_BLOCK symbol named .bb, with a
5367 line number. */
5368
5369static void
98027b10 5370ppc_bb (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
5371{
5372 symbolS *sym;
5373
5374 sym = symbol_make (".bb");
5375 S_SET_SEGMENT (sym, text_section);
809ffe0d 5376 symbol_set_frag (sym, frag_now);
252b5132
RH
5377 S_SET_VALUE (sym, frag_now_fix ());
5378 S_SET_STORAGE_CLASS (sym, C_BLOCK);
5379
5380 S_SET_NUMBER_AUXILIARY (sym, 1);
5381 SA_SET_SYM_LNNO (sym, get_absolute_expression ());
5382
809ffe0d 5383 symbol_get_tc (sym)->output = 1;
252b5132
RH
5384
5385 SF_SET_PROCESS (sym);
5386
5387 ppc_frob_label (sym);
5388
5389 demand_empty_rest_of_line ();
5390}
5391
5392/* The .eb pseudo-op. Generate a C_BLOCK symbol named .eb, with a
5393 line number. */
5394
5395static void
98027b10 5396ppc_eb (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
5397{
5398 symbolS *sym;
5399
5400 sym = symbol_make (".eb");
5401 S_SET_SEGMENT (sym, text_section);
809ffe0d 5402 symbol_set_frag (sym, frag_now);
252b5132
RH
5403 S_SET_VALUE (sym, frag_now_fix ());
5404 S_SET_STORAGE_CLASS (sym, C_BLOCK);
5405 S_SET_NUMBER_AUXILIARY (sym, 1);
5406 SA_SET_SYM_LNNO (sym, get_absolute_expression ());
809ffe0d 5407 symbol_get_tc (sym)->output = 1;
252b5132
RH
5408
5409 SF_SET_PROCESS (sym);
5410
5411 ppc_frob_label (sym);
5412
5413 demand_empty_rest_of_line ();
5414}
5415
5416/* The .bc pseudo-op. This just creates a C_BCOMM symbol with a
5417 specified name. */
5418
5419static void
98027b10 5420ppc_bc (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
5421{
5422 char *name;
5423 int len;
5424 symbolS *sym;
5425
5426 name = demand_copy_C_string (&len);
5427 sym = symbol_make (name);
5428 S_SET_SEGMENT (sym, ppc_coff_debug_section);
809ffe0d 5429 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
252b5132
RH
5430 S_SET_STORAGE_CLASS (sym, C_BCOMM);
5431 S_SET_VALUE (sym, 0);
809ffe0d 5432 symbol_get_tc (sym)->output = 1;
252b5132
RH
5433
5434 ppc_frob_label (sym);
5435
5436 demand_empty_rest_of_line ();
5437}
5438
5439/* The .ec pseudo-op. This just creates a C_ECOMM symbol. */
5440
5441static void
98027b10 5442ppc_ec (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
5443{
5444 symbolS *sym;
5445
5446 sym = symbol_make (".ec");
5447 S_SET_SEGMENT (sym, ppc_coff_debug_section);
809ffe0d 5448 symbol_get_bfdsym (sym)->flags |= BSF_DEBUGGING;
252b5132
RH
5449 S_SET_STORAGE_CLASS (sym, C_ECOMM);
5450 S_SET_VALUE (sym, 0);
809ffe0d 5451 symbol_get_tc (sym)->output = 1;
252b5132
RH
5452
5453 ppc_frob_label (sym);
5454
5455 demand_empty_rest_of_line ();
5456}
5457
5458/* The .toc pseudo-op. Switch to the .toc subsegment. */
5459
5460static void
98027b10 5461ppc_toc (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
5462{
5463 if (ppc_toc_csect != (symbolS *) NULL)
809ffe0d 5464 subseg_set (data_section, symbol_get_tc (ppc_toc_csect)->subseg);
252b5132
RH
5465 else
5466 {
5467 subsegT subseg;
5468 symbolS *sym;
5469 symbolS *list;
81d4177b 5470
252b5132
RH
5471 subseg = ppc_data_subsegment;
5472 ++ppc_data_subsegment;
5473
5474 subseg_new (segment_name (data_section), subseg);
5475 ppc_toc_frag = frag_now;
5476
5477 sym = symbol_find_or_make ("TOC[TC0]");
809ffe0d 5478 symbol_set_frag (sym, frag_now);
252b5132
RH
5479 S_SET_SEGMENT (sym, data_section);
5480 S_SET_VALUE (sym, (valueT) frag_now_fix ());
809ffe0d
ILT
5481 symbol_get_tc (sym)->subseg = subseg;
5482 symbol_get_tc (sym)->output = 1;
5483 symbol_get_tc (sym)->within = sym;
252b5132
RH
5484
5485 ppc_toc_csect = sym;
81d4177b 5486
252b5132 5487 for (list = ppc_data_csects;
809ffe0d
ILT
5488 symbol_get_tc (list)->next != (symbolS *) NULL;
5489 list = symbol_get_tc (list)->next)
252b5132 5490 ;
809ffe0d 5491 symbol_get_tc (list)->next = sym;
252b5132
RH
5492
5493 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
809ffe0d
ILT
5494 symbol_append (sym, symbol_get_tc (list)->within, &symbol_rootP,
5495 &symbol_lastP);
252b5132
RH
5496 }
5497
5498 ppc_current_csect = ppc_toc_csect;
5499
5500 demand_empty_rest_of_line ();
5501}
5502
5503/* The AIX assembler automatically aligns the operands of a .long or
5504 .short pseudo-op, and we want to be compatible. */
5505
5506static void
98027b10 5507ppc_xcoff_cons (int log_size)
252b5132
RH
5508{
5509 frag_align (log_size, 0, 0);
5510 record_alignment (now_seg, log_size);
5511 cons (1 << log_size);
5512}
5513
5514static void
98027b10 5515ppc_vbyte (int dummy ATTRIBUTE_UNUSED)
252b5132
RH
5516{
5517 expressionS exp;
5518 int byte_count;
5519
5520 (void) expression (&exp);
5521
5522 if (exp.X_op != O_constant)
5523 {
5524 as_bad (_("non-constant byte count"));
5525 return;
5526 }
5527
5528 byte_count = exp.X_add_number;
5529
5530 if (*input_line_pointer != ',')
5531 {
5532 as_bad (_("missing value"));
5533 return;
5534 }
5535
5536 ++input_line_pointer;
5537 cons (byte_count);
5538}
5539
85645aed
TG
5540void
5541ppc_xcoff_end (void)
5542{
5543 int i;
5544
5545 for (i = 0; i < XCOFF_DWSECT_NBR_NAMES; i++)
5546 {
5547 struct dw_section *dws = &dw_sections[i];
5548 struct dw_subsection *dwss;
5549
5550 if (dws->anon_subseg)
5551 {
5552 dwss = dws->anon_subseg;
5553 dwss->link = dws->list_subseg;
5554 }
5555 else
5556 dwss = dws->list_subseg;
5557
5558 for (; dwss != NULL; dwss = dwss->link)
5559 if (dwss->end_exp.X_add_symbol != NULL)
5560 {
5561 subseg_set (dws->sect, dwss->subseg);
5562 symbol_set_value_now (dwss->end_exp.X_add_symbol);
5563 }
5564 }
5565}
5566
252b5132 5567#endif /* OBJ_XCOFF */
0baf16f2 5568#if defined (OBJ_XCOFF) || defined (OBJ_ELF)
252b5132
RH
5569\f
5570/* The .tc pseudo-op. This is used when generating either XCOFF or
5571 ELF. This takes two or more arguments.
5572
5573 When generating XCOFF output, the first argument is the name to
5574 give to this location in the toc; this will be a symbol with class
0baf16f2 5575 TC. The rest of the arguments are N-byte values to actually put at
252b5132 5576 this location in the TOC; often there is just one more argument, a
1049f94e 5577 relocatable symbol reference. The size of the value to store
0baf16f2
AM
5578 depends on target word size. A 32-bit target uses 4-byte values, a
5579 64-bit target uses 8-byte values.
252b5132
RH
5580
5581 When not generating XCOFF output, the arguments are the same, but
5582 the first argument is simply ignored. */
5583
5584static void
98027b10 5585ppc_tc (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
5586{
5587#ifdef OBJ_XCOFF
5588
5589 /* Define the TOC symbol name. */
5590 {
5591 char *name;
5592 char endc;
5593 symbolS *sym;
5594
5595 if (ppc_toc_csect == (symbolS *) NULL
5596 || ppc_toc_csect != ppc_current_csect)
5597 {
5598 as_bad (_(".tc not in .toc section"));
5599 ignore_rest_of_line ();
5600 return;
5601 }
5602
d02603dc 5603 endc = get_symbol_name (&name);
252b5132
RH
5604
5605 sym = symbol_find_or_make (name);
5606
d02603dc 5607 (void) restore_line_pointer (endc);
252b5132
RH
5608
5609 if (S_IS_DEFINED (sym))
5610 {
5611 symbolS *label;
5612
809ffe0d 5613 label = symbol_get_tc (ppc_current_csect)->within;
96d56e9f 5614 if (symbol_get_tc (label)->symbol_class != XMC_TC0)
252b5132
RH
5615 {
5616 as_bad (_(".tc with no label"));
5617 ignore_rest_of_line ();
5618 return;
5619 }
5620
5621 S_SET_SEGMENT (label, S_GET_SEGMENT (sym));
809ffe0d 5622 symbol_set_frag (label, symbol_get_frag (sym));
252b5132
RH
5623 S_SET_VALUE (label, S_GET_VALUE (sym));
5624
5625 while (! is_end_of_line[(unsigned char) *input_line_pointer])
5626 ++input_line_pointer;
5627
5628 return;
5629 }
5630
5631 S_SET_SEGMENT (sym, now_seg);
809ffe0d 5632 symbol_set_frag (sym, frag_now);
252b5132 5633 S_SET_VALUE (sym, (valueT) frag_now_fix ());
96d56e9f 5634 symbol_get_tc (sym)->symbol_class = XMC_TC;
809ffe0d 5635 symbol_get_tc (sym)->output = 1;
252b5132
RH
5636
5637 ppc_frob_label (sym);
5638 }
5639
0baf16f2
AM
5640#endif /* OBJ_XCOFF */
5641#ifdef OBJ_ELF
9c7977b3 5642 int align;
252b5132
RH
5643
5644 /* Skip the TOC symbol name. */
5645 while (is_part_of_name (*input_line_pointer)
d13d4015 5646 || *input_line_pointer == ' '
252b5132
RH
5647 || *input_line_pointer == '['
5648 || *input_line_pointer == ']'
5649 || *input_line_pointer == '{'
5650 || *input_line_pointer == '}')
5651 ++input_line_pointer;
5652
0baf16f2 5653 /* Align to a four/eight byte boundary. */
2b3c4602 5654 align = ppc_obj64 ? 3 : 2;
9c7977b3
AM
5655 frag_align (align, 0, 0);
5656 record_alignment (now_seg, align);
0baf16f2 5657#endif /* OBJ_ELF */
252b5132
RH
5658
5659 if (*input_line_pointer != ',')
5660 demand_empty_rest_of_line ();
5661 else
5662 {
5663 ++input_line_pointer;
2b3c4602 5664 cons (ppc_obj64 ? 8 : 4);
252b5132
RH
5665 }
5666}
0baf16f2
AM
5667
5668/* Pseudo-op .machine. */
0baf16f2
AM
5669
5670static void
98027b10 5671ppc_machine (int ignore ATTRIBUTE_UNUSED)
0baf16f2 5672{
d02603dc 5673 char c;
69c040df
AM
5674 char *cpu_string;
5675#define MAX_HISTORY 100
fa452fa6 5676 static ppc_cpu_t *cpu_history;
69c040df
AM
5677 static int curr_hist;
5678
5679 SKIP_WHITESPACE ();
5680
d02603dc
NC
5681 c = get_symbol_name (&cpu_string);
5682 cpu_string = xstrdup (cpu_string);
5683 (void) restore_line_pointer (c);
69c040df
AM
5684
5685 if (cpu_string != NULL)
5686 {
fa452fa6 5687 ppc_cpu_t old_cpu = ppc_cpu;
69fe9ce5 5688 ppc_cpu_t new_cpu;
69c040df
AM
5689 char *p;
5690
5691 for (p = cpu_string; *p != 0; p++)
5692 *p = TOLOWER (*p);
5693
5694 if (strcmp (cpu_string, "push") == 0)
5695 {
5696 if (cpu_history == NULL)
325801bd 5697 cpu_history = XNEWVEC (ppc_cpu_t, MAX_HISTORY);
69c040df
AM
5698
5699 if (curr_hist >= MAX_HISTORY)
5700 as_bad (_(".machine stack overflow"));
5701 else
5702 cpu_history[curr_hist++] = ppc_cpu;
5703 }
5704 else if (strcmp (cpu_string, "pop") == 0)
5705 {
5706 if (curr_hist <= 0)
5707 as_bad (_(".machine stack underflow"));
5708 else
5709 ppc_cpu = cpu_history[--curr_hist];
5710 }
776fc418 5711 else if ((new_cpu = ppc_parse_cpu (ppc_cpu, &sticky, cpu_string)) != 0)
69fe9ce5 5712 ppc_cpu = new_cpu;
69c040df
AM
5713 else
5714 as_bad (_("invalid machine `%s'"), cpu_string);
5715
5716 if (ppc_cpu != old_cpu)
5717 ppc_setup_opcodes ();
5718 }
5719
5720 demand_empty_rest_of_line ();
0baf16f2 5721}
0baf16f2 5722#endif /* defined (OBJ_XCOFF) || defined (OBJ_ELF) */
252b5132
RH
5723\f
5724#ifdef TE_PE
5725
99a814a1 5726/* Pseudo-ops specific to the Windows NT PowerPC PE (coff) format. */
252b5132
RH
5727
5728/* Set the current section. */
5729static void
98027b10 5730ppc_set_current_section (segT new)
252b5132
RH
5731{
5732 ppc_previous_section = ppc_current_section;
5733 ppc_current_section = new;
5734}
5735
5736/* pseudo-op: .previous
5737 behaviour: toggles the current section with the previous section.
5738 errors: None
99a814a1
AM
5739 warnings: "No previous section" */
5740
252b5132 5741static void
98027b10 5742ppc_previous (int ignore ATTRIBUTE_UNUSED)
252b5132 5743{
81d4177b 5744 if (ppc_previous_section == NULL)
252b5132 5745 {
d6ed37ed 5746 as_warn (_("no previous section to return to, ignored."));
252b5132
RH
5747 return;
5748 }
5749
99a814a1 5750 subseg_set (ppc_previous_section, 0);
252b5132 5751
99a814a1 5752 ppc_set_current_section (ppc_previous_section);
252b5132
RH
5753}
5754
5755/* pseudo-op: .pdata
5756 behaviour: predefined read only data section
b34976b6 5757 double word aligned
252b5132
RH
5758 errors: None
5759 warnings: None
5760 initial: .section .pdata "adr3"
b34976b6 5761 a - don't know -- maybe a misprint
252b5132
RH
5762 d - initialized data
5763 r - readable
5764 3 - double word aligned (that would be 4 byte boundary)
5765
5766 commentary:
5767 Tag index tables (also known as the function table) for exception
99a814a1 5768 handling, debugging, etc. */
252b5132 5769
252b5132 5770static void
98027b10 5771ppc_pdata (int ignore ATTRIBUTE_UNUSED)
252b5132 5772{
81d4177b 5773 if (pdata_section == 0)
252b5132
RH
5774 {
5775 pdata_section = subseg_new (".pdata", 0);
81d4177b 5776
252b5132
RH
5777 bfd_set_section_flags (stdoutput, pdata_section,
5778 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
5779 | SEC_READONLY | SEC_DATA ));
81d4177b 5780
252b5132
RH
5781 bfd_set_section_alignment (stdoutput, pdata_section, 2);
5782 }
5783 else
5784 {
99a814a1 5785 pdata_section = subseg_new (".pdata", 0);
252b5132 5786 }
99a814a1 5787 ppc_set_current_section (pdata_section);
252b5132
RH
5788}
5789
5790/* pseudo-op: .ydata
5791 behaviour: predefined read only data section
b34976b6 5792 double word aligned
252b5132
RH
5793 errors: None
5794 warnings: None
5795 initial: .section .ydata "drw3"
b34976b6 5796 a - don't know -- maybe a misprint
252b5132
RH
5797 d - initialized data
5798 r - readable
5799 3 - double word aligned (that would be 4 byte boundary)
5800 commentary:
5801 Tag tables (also known as the scope table) for exception handling,
99a814a1
AM
5802 debugging, etc. */
5803
252b5132 5804static void
98027b10 5805ppc_ydata (int ignore ATTRIBUTE_UNUSED)
252b5132 5806{
81d4177b 5807 if (ydata_section == 0)
252b5132
RH
5808 {
5809 ydata_section = subseg_new (".ydata", 0);
5810 bfd_set_section_flags (stdoutput, ydata_section,
99a814a1
AM
5811 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
5812 | SEC_READONLY | SEC_DATA ));
252b5132
RH
5813
5814 bfd_set_section_alignment (stdoutput, ydata_section, 3);
5815 }
5816 else
5817 {
5818 ydata_section = subseg_new (".ydata", 0);
5819 }
99a814a1 5820 ppc_set_current_section (ydata_section);
252b5132
RH
5821}
5822
5823/* pseudo-op: .reldata
5824 behaviour: predefined read write data section
b34976b6 5825 double word aligned (4-byte)
252b5132
RH
5826 FIXME: relocation is applied to it
5827 FIXME: what's the difference between this and .data?
5828 errors: None
5829 warnings: None
5830 initial: .section .reldata "drw3"
5831 d - initialized data
5832 r - readable
33eaf5de 5833 w - writable
252b5132
RH
5834 3 - double word aligned (that would be 8 byte boundary)
5835
5836 commentary:
5837 Like .data, but intended to hold data subject to relocation, such as
99a814a1
AM
5838 function descriptors, etc. */
5839
252b5132 5840static void
98027b10 5841ppc_reldata (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
5842{
5843 if (reldata_section == 0)
5844 {
5845 reldata_section = subseg_new (".reldata", 0);
5846
5847 bfd_set_section_flags (stdoutput, reldata_section,
99a814a1
AM
5848 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
5849 | SEC_DATA));
252b5132
RH
5850
5851 bfd_set_section_alignment (stdoutput, reldata_section, 2);
5852 }
5853 else
5854 {
5855 reldata_section = subseg_new (".reldata", 0);
5856 }
99a814a1 5857 ppc_set_current_section (reldata_section);
252b5132
RH
5858}
5859
5860/* pseudo-op: .rdata
5861 behaviour: predefined read only data section
b34976b6 5862 double word aligned
252b5132
RH
5863 errors: None
5864 warnings: None
5865 initial: .section .rdata "dr3"
5866 d - initialized data
5867 r - readable
99a814a1
AM
5868 3 - double word aligned (that would be 4 byte boundary) */
5869
252b5132 5870static void
98027b10 5871ppc_rdata (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
5872{
5873 if (rdata_section == 0)
5874 {
5875 rdata_section = subseg_new (".rdata", 0);
5876 bfd_set_section_flags (stdoutput, rdata_section,
5877 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
5878 | SEC_READONLY | SEC_DATA ));
5879
5880 bfd_set_section_alignment (stdoutput, rdata_section, 2);
5881 }
5882 else
5883 {
5884 rdata_section = subseg_new (".rdata", 0);
5885 }
99a814a1 5886 ppc_set_current_section (rdata_section);
252b5132
RH
5887}
5888
5889/* pseudo-op: .ualong
81d4177b 5890 behaviour: much like .int, with the exception that no alignment is
b34976b6 5891 performed.
252b5132
RH
5892 FIXME: test the alignment statement
5893 errors: None
99a814a1
AM
5894 warnings: None */
5895
252b5132 5896static void
98027b10 5897ppc_ualong (int ignore ATTRIBUTE_UNUSED)
252b5132 5898{
99a814a1
AM
5899 /* Try for long. */
5900 cons (4);
252b5132
RH
5901}
5902
5903/* pseudo-op: .znop <symbol name>
5904 behaviour: Issue a nop instruction
b34976b6 5905 Issue a IMAGE_REL_PPC_IFGLUE relocation against it, using
252b5132
RH
5906 the supplied symbol name.
5907 errors: None
99a814a1
AM
5908 warnings: Missing symbol name */
5909
252b5132 5910static void
98027b10 5911ppc_znop (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
5912{
5913 unsigned long insn;
5914 const struct powerpc_opcode *opcode;
252b5132 5915 char *f;
252b5132 5916 symbolS *sym;
252b5132
RH
5917 char *symbol_name;
5918 char c;
5919 char *name;
252b5132 5920
99a814a1 5921 /* Strip out the symbol name. */
d02603dc 5922 c = get_symbol_name (&symbol_name);
252b5132 5923
a44e2901 5924 name = xstrdup (symbol_name);
252b5132
RH
5925
5926 sym = symbol_find_or_make (name);
5927
5928 *input_line_pointer = c;
5929
d02603dc 5930 SKIP_WHITESPACE_AFTER_NAME ();
252b5132
RH
5931
5932 /* Look up the opcode in the hash table. */
5933 opcode = (const struct powerpc_opcode *) hash_find (ppc_hash, "nop");
5934
99a814a1 5935 /* Stick in the nop. */
252b5132
RH
5936 insn = opcode->opcode;
5937
5938 /* Write out the instruction. */
5939 f = frag_more (4);
5940 md_number_to_chars (f, insn, 4);
5941 fix_new (frag_now,
5942 f - frag_now->fr_literal,
5943 4,
5944 sym,
5945 0,
5946 0,
5947 BFD_RELOC_16_GOT_PCREL);
5948
5949}
5950
81d4177b
KH
5951/* pseudo-op:
5952 behaviour:
5953 errors:
99a814a1
AM
5954 warnings: */
5955
252b5132 5956static void
98027b10 5957ppc_pe_comm (int lcomm)
252b5132 5958{
98027b10
AM
5959 char *name;
5960 char c;
5961 char *p;
252b5132 5962 offsetT temp;
98027b10 5963 symbolS *symbolP;
252b5132
RH
5964 offsetT align;
5965
d02603dc 5966 c = get_symbol_name (&name);
252b5132 5967
99a814a1 5968 /* just after name is now '\0'. */
252b5132
RH
5969 p = input_line_pointer;
5970 *p = c;
d02603dc 5971 SKIP_WHITESPACE_AFTER_NAME ();
252b5132
RH
5972 if (*input_line_pointer != ',')
5973 {
d6ed37ed 5974 as_bad (_("expected comma after symbol-name: rest of line ignored."));
252b5132
RH
5975 ignore_rest_of_line ();
5976 return;
5977 }
5978
5979 input_line_pointer++; /* skip ',' */
5980 if ((temp = get_absolute_expression ()) < 0)
5981 {
5982 as_warn (_(".COMMon length (%ld.) <0! Ignored."), (long) temp);
5983 ignore_rest_of_line ();
5984 return;
5985 }
5986
5987 if (! lcomm)
5988 {
5989 /* The third argument to .comm is the alignment. */
5990 if (*input_line_pointer != ',')
5991 align = 3;
5992 else
5993 {
5994 ++input_line_pointer;
5995 align = get_absolute_expression ();
5996 if (align <= 0)
5997 {
5998 as_warn (_("ignoring bad alignment"));
5999 align = 3;
6000 }
6001 }
6002 }
6003
6004 *p = 0;
6005 symbolP = symbol_find_or_make (name);
6006
6007 *p = c;
6008 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
6009 {
d6ed37ed 6010 as_bad (_("ignoring attempt to re-define symbol `%s'."),
252b5132
RH
6011 S_GET_NAME (symbolP));
6012 ignore_rest_of_line ();
6013 return;
6014 }
6015
6016 if (S_GET_VALUE (symbolP))
6017 {
6018 if (S_GET_VALUE (symbolP) != (valueT) temp)
d6ed37ed 6019 as_bad (_("length of .comm \"%s\" is already %ld. Not changed to %ld."),
252b5132
RH
6020 S_GET_NAME (symbolP),
6021 (long) S_GET_VALUE (symbolP),
6022 (long) temp);
6023 }
6024 else
6025 {
6026 S_SET_VALUE (symbolP, (valueT) temp);
6027 S_SET_EXTERNAL (symbolP);
86ebace2 6028 S_SET_SEGMENT (symbolP, bfd_com_section_ptr);
252b5132
RH
6029 }
6030
6031 demand_empty_rest_of_line ();
6032}
6033
6034/*
6035 * implement the .section pseudo op:
6036 * .section name {, "flags"}
6037 * ^ ^
6038 * | +--- optional flags: 'b' for bss
6039 * | 'i' for info
6040 * +-- section name 'l' for lib
6041 * 'n' for noload
6042 * 'o' for over
6043 * 'w' for data
6044 * 'd' (apparently m88k for data)
6045 * 'x' for text
6046 * But if the argument is not a quoted string, treat it as a
6047 * subsegment number.
6048 *
6049 * FIXME: this is a copy of the section processing from obj-coff.c, with
6050 * additions/changes for the moto-pas assembler support. There are three
6051 * categories:
6052 *
81d4177b 6053 * FIXME: I just noticed this. This doesn't work at all really. It it
252b5132
RH
6054 * setting bits that bfd probably neither understands or uses. The
6055 * correct approach (?) will have to incorporate extra fields attached
6056 * to the section to hold the system specific stuff. (krk)
6057 *
6058 * Section Contents:
6059 * 'a' - unknown - referred to in documentation, but no definition supplied
6060 * 'c' - section has code
6061 * 'd' - section has initialized data
6062 * 'u' - section has uninitialized data
6063 * 'i' - section contains directives (info)
6064 * 'n' - section can be discarded
6065 * 'R' - remove section at link time
6066 *
6067 * Section Protection:
6068 * 'r' - section is readable
33eaf5de 6069 * 'w' - section is writable
252b5132
RH
6070 * 'x' - section is executable
6071 * 's' - section is sharable
6072 *
6073 * Section Alignment:
6074 * '0' - align to byte boundary
33eaf5de 6075 * '1' - align to halfword boundary
252b5132
RH
6076 * '2' - align to word boundary
6077 * '3' - align to doubleword boundary
6078 * '4' - align to quadword boundary
6079 * '5' - align to 32 byte boundary
6080 * '6' - align to 64 byte boundary
6081 *
6082 */
6083
6084void
98027b10 6085ppc_pe_section (int ignore ATTRIBUTE_UNUSED)
252b5132 6086{
99a814a1 6087 /* Strip out the section name. */
252b5132
RH
6088 char *section_name;
6089 char c;
6090 char *name;
6091 unsigned int exp;
6092 flagword flags;
6093 segT sec;
6094 int align;
6095
d02603dc 6096 c = get_symbol_name (&section_name);
252b5132 6097
a44e2901 6098 name = xstrdup (section_name);
252b5132
RH
6099
6100 *input_line_pointer = c;
6101
d02603dc 6102 SKIP_WHITESPACE_AFTER_NAME ();
252b5132
RH
6103
6104 exp = 0;
6105 flags = SEC_NO_FLAGS;
6106
6107 if (strcmp (name, ".idata$2") == 0)
6108 {
6109 align = 0;
6110 }
6111 else if (strcmp (name, ".idata$3") == 0)
6112 {
6113 align = 0;
6114 }
6115 else if (strcmp (name, ".idata$4") == 0)
6116 {
6117 align = 2;
6118 }
6119 else if (strcmp (name, ".idata$5") == 0)
6120 {
6121 align = 2;
6122 }
6123 else if (strcmp (name, ".idata$6") == 0)
6124 {
6125 align = 1;
6126 }
6127 else
99a814a1
AM
6128 /* Default alignment to 16 byte boundary. */
6129 align = 4;
252b5132
RH
6130
6131 if (*input_line_pointer == ',')
6132 {
6133 ++input_line_pointer;
6134 SKIP_WHITESPACE ();
6135 if (*input_line_pointer != '"')
6136 exp = get_absolute_expression ();
6137 else
6138 {
6139 ++input_line_pointer;
6140 while (*input_line_pointer != '"'
6141 && ! is_end_of_line[(unsigned char) *input_line_pointer])
6142 {
6143 switch (*input_line_pointer)
6144 {
6145 /* Section Contents */
6146 case 'a': /* unknown */
d6ed37ed 6147 as_bad (_("unsupported section attribute -- 'a'"));
252b5132
RH
6148 break;
6149 case 'c': /* code section */
81d4177b 6150 flags |= SEC_CODE;
252b5132
RH
6151 break;
6152 case 'd': /* section has initialized data */
6153 flags |= SEC_DATA;
6154 break;
6155 case 'u': /* section has uninitialized data */
6156 /* FIXME: This is IMAGE_SCN_CNT_UNINITIALIZED_DATA
6157 in winnt.h */
6158 flags |= SEC_ROM;
6159 break;
6160 case 'i': /* section contains directives (info) */
6161 /* FIXME: This is IMAGE_SCN_LNK_INFO
6162 in winnt.h */
6163 flags |= SEC_HAS_CONTENTS;
6164 break;
6165 case 'n': /* section can be discarded */
81d4177b 6166 flags &=~ SEC_LOAD;
252b5132
RH
6167 break;
6168 case 'R': /* Remove section at link time */
6169 flags |= SEC_NEVER_LOAD;
6170 break;
8d452c78 6171#if IFLICT_BRAIN_DAMAGE
252b5132
RH
6172 /* Section Protection */
6173 case 'r': /* section is readable */
6174 flags |= IMAGE_SCN_MEM_READ;
6175 break;
33eaf5de 6176 case 'w': /* section is writable */
252b5132
RH
6177 flags |= IMAGE_SCN_MEM_WRITE;
6178 break;
6179 case 'x': /* section is executable */
6180 flags |= IMAGE_SCN_MEM_EXECUTE;
6181 break;
6182 case 's': /* section is sharable */
6183 flags |= IMAGE_SCN_MEM_SHARED;
6184 break;
6185
6186 /* Section Alignment */
6187 case '0': /* align to byte boundary */
6188 flags |= IMAGE_SCN_ALIGN_1BYTES;
6189 align = 0;
6190 break;
6191 case '1': /* align to halfword boundary */
6192 flags |= IMAGE_SCN_ALIGN_2BYTES;
6193 align = 1;
6194 break;
6195 case '2': /* align to word boundary */
6196 flags |= IMAGE_SCN_ALIGN_4BYTES;
6197 align = 2;
6198 break;
6199 case '3': /* align to doubleword boundary */
6200 flags |= IMAGE_SCN_ALIGN_8BYTES;
6201 align = 3;
6202 break;
6203 case '4': /* align to quadword boundary */
6204 flags |= IMAGE_SCN_ALIGN_16BYTES;
6205 align = 4;
6206 break;
6207 case '5': /* align to 32 byte boundary */
6208 flags |= IMAGE_SCN_ALIGN_32BYTES;
6209 align = 5;
6210 break;
6211 case '6': /* align to 64 byte boundary */
6212 flags |= IMAGE_SCN_ALIGN_64BYTES;
6213 align = 6;
6214 break;
8d452c78 6215#endif
252b5132 6216 default:
99a814a1
AM
6217 as_bad (_("unknown section attribute '%c'"),
6218 *input_line_pointer);
252b5132
RH
6219 break;
6220 }
6221 ++input_line_pointer;
6222 }
6223 if (*input_line_pointer == '"')
6224 ++input_line_pointer;
6225 }
6226 }
6227
6228 sec = subseg_new (name, (subsegT) exp);
6229
99a814a1 6230 ppc_set_current_section (sec);
252b5132
RH
6231
6232 if (flags != SEC_NO_FLAGS)
6233 {
6234 if (! bfd_set_section_flags (stdoutput, sec, flags))
6235 as_bad (_("error setting flags for \"%s\": %s"),
6236 bfd_section_name (stdoutput, sec),
6237 bfd_errmsg (bfd_get_error ()));
6238 }
6239
99a814a1 6240 bfd_set_section_alignment (stdoutput, sec, align);
252b5132
RH
6241}
6242
6243static void
98027b10 6244ppc_pe_function (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
6245{
6246 char *name;
6247 char endc;
6248 symbolS *ext_sym;
6249
d02603dc 6250 endc = get_symbol_name (&name);
252b5132
RH
6251
6252 ext_sym = symbol_find_or_make (name);
6253
d02603dc 6254 (void) restore_line_pointer (endc);
252b5132
RH
6255
6256 S_SET_DATA_TYPE (ext_sym, DT_FCN << N_BTSHFT);
6257 SF_SET_FUNCTION (ext_sym);
6258 SF_SET_PROCESS (ext_sym);
6259 coff_add_linesym (ext_sym);
6260
6261 demand_empty_rest_of_line ();
6262}
6263
6264static void
98027b10 6265ppc_pe_tocd (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
6266{
6267 if (tocdata_section == 0)
6268 {
6269 tocdata_section = subseg_new (".tocd", 0);
99a814a1 6270 /* FIXME: section flags won't work. */
252b5132
RH
6271 bfd_set_section_flags (stdoutput, tocdata_section,
6272 (SEC_ALLOC | SEC_LOAD | SEC_RELOC
99a814a1 6273 | SEC_READONLY | SEC_DATA));
252b5132
RH
6274
6275 bfd_set_section_alignment (stdoutput, tocdata_section, 2);
6276 }
6277 else
6278 {
6279 rdata_section = subseg_new (".tocd", 0);
6280 }
6281
99a814a1 6282 ppc_set_current_section (tocdata_section);
252b5132
RH
6283
6284 demand_empty_rest_of_line ();
6285}
6286
6287/* Don't adjust TOC relocs to use the section symbol. */
6288
6289int
98027b10 6290ppc_pe_fix_adjustable (fixS *fix)
252b5132
RH
6291{
6292 return fix->fx_r_type != BFD_RELOC_PPC_TOC16;
6293}
6294
6295#endif
6296\f
6297#ifdef OBJ_XCOFF
6298
6299/* XCOFF specific symbol and file handling. */
6300
6301/* Canonicalize the symbol name. We use the to force the suffix, if
6302 any, to use square brackets, and to be in upper case. */
6303
6304char *
98027b10 6305ppc_canonicalize_symbol_name (char *name)
252b5132
RH
6306{
6307 char *s;
6308
6309 if (ppc_stab_symbol)
6310 return name;
6311
6312 for (s = name; *s != '\0' && *s != '{' && *s != '['; s++)
6313 ;
6314 if (*s != '\0')
6315 {
6316 char brac;
6317
6318 if (*s == '[')
6319 brac = ']';
6320 else
6321 {
6322 *s = '[';
6323 brac = '}';
6324 }
6325
6326 for (s++; *s != '\0' && *s != brac; s++)
3882b010 6327 *s = TOUPPER (*s);
252b5132
RH
6328
6329 if (*s == '\0' || s[1] != '\0')
6330 as_bad (_("bad symbol suffix"));
6331
6332 *s = ']';
6333 }
6334
6335 return name;
6336}
6337
6338/* Set the class of a symbol based on the suffix, if any. This is
6339 called whenever a new symbol is created. */
6340
6341void
98027b10 6342ppc_symbol_new_hook (symbolS *sym)
252b5132 6343{
809ffe0d 6344 struct ppc_tc_sy *tc;
252b5132
RH
6345 const char *s;
6346
809ffe0d
ILT
6347 tc = symbol_get_tc (sym);
6348 tc->next = NULL;
6349 tc->output = 0;
96d56e9f 6350 tc->symbol_class = -1;
809ffe0d
ILT
6351 tc->real_name = NULL;
6352 tc->subseg = 0;
6353 tc->align = 0;
85645aed
TG
6354 tc->u.size = NULL;
6355 tc->u.dw = NULL;
809ffe0d 6356 tc->within = NULL;
252b5132
RH
6357
6358 if (ppc_stab_symbol)
6359 return;
6360
6361 s = strchr (S_GET_NAME (sym), '[');
6362 if (s == (const char *) NULL)
6363 {
6364 /* There is no suffix. */
6365 return;
6366 }
6367
6368 ++s;
6369
6370 switch (s[0])
6371 {
6372 case 'B':
6373 if (strcmp (s, "BS]") == 0)
96d56e9f 6374 tc->symbol_class = XMC_BS;
252b5132
RH
6375 break;
6376 case 'D':
6377 if (strcmp (s, "DB]") == 0)
96d56e9f 6378 tc->symbol_class = XMC_DB;
252b5132 6379 else if (strcmp (s, "DS]") == 0)
96d56e9f 6380 tc->symbol_class = XMC_DS;
252b5132
RH
6381 break;
6382 case 'G':
6383 if (strcmp (s, "GL]") == 0)
96d56e9f 6384 tc->symbol_class = XMC_GL;
252b5132
RH
6385 break;
6386 case 'P':
6387 if (strcmp (s, "PR]") == 0)
96d56e9f 6388 tc->symbol_class = XMC_PR;
252b5132
RH
6389 break;
6390 case 'R':
6391 if (strcmp (s, "RO]") == 0)
96d56e9f 6392 tc->symbol_class = XMC_RO;
252b5132 6393 else if (strcmp (s, "RW]") == 0)
96d56e9f 6394 tc->symbol_class = XMC_RW;
252b5132
RH
6395 break;
6396 case 'S':
6397 if (strcmp (s, "SV]") == 0)
96d56e9f 6398 tc->symbol_class = XMC_SV;
252b5132
RH
6399 break;
6400 case 'T':
6401 if (strcmp (s, "TC]") == 0)
96d56e9f 6402 tc->symbol_class = XMC_TC;
252b5132 6403 else if (strcmp (s, "TI]") == 0)
96d56e9f 6404 tc->symbol_class = XMC_TI;
252b5132 6405 else if (strcmp (s, "TB]") == 0)
96d56e9f 6406 tc->symbol_class = XMC_TB;
252b5132 6407 else if (strcmp (s, "TC0]") == 0 || strcmp (s, "T0]") == 0)
96d56e9f 6408 tc->symbol_class = XMC_TC0;
252b5132
RH
6409 break;
6410 case 'U':
6411 if (strcmp (s, "UA]") == 0)
96d56e9f 6412 tc->symbol_class = XMC_UA;
252b5132 6413 else if (strcmp (s, "UC]") == 0)
96d56e9f 6414 tc->symbol_class = XMC_UC;
252b5132
RH
6415 break;
6416 case 'X':
6417 if (strcmp (s, "XO]") == 0)
96d56e9f 6418 tc->symbol_class = XMC_XO;
252b5132
RH
6419 break;
6420 }
6421
96d56e9f 6422 if (tc->symbol_class == -1)
d6ed37ed 6423 as_bad (_("unrecognized symbol suffix"));
252b5132
RH
6424}
6425
252b5132
RH
6426/* This variable is set by ppc_frob_symbol if any absolute symbols are
6427 seen. It tells ppc_adjust_symtab whether it needs to look through
6428 the symbols. */
6429
b34976b6 6430static bfd_boolean ppc_saw_abs;
252b5132
RH
6431
6432/* Change the name of a symbol just before writing it out. Set the
6433 real name if the .rename pseudo-op was used. Otherwise, remove any
6434 class suffix. Return 1 if the symbol should not be included in the
6435 symbol table. */
6436
6437int
98027b10 6438ppc_frob_symbol (symbolS *sym)
252b5132
RH
6439{
6440 static symbolS *ppc_last_function;
6441 static symbolS *set_end;
6442
6443 /* Discard symbols that should not be included in the output symbol
6444 table. */
809ffe0d
ILT
6445 if (! symbol_used_in_reloc_p (sym)
6446 && ((symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM) != 0
670ec21d 6447 || (! (S_IS_EXTERNAL (sym) || S_IS_WEAK (sym))
809ffe0d 6448 && ! symbol_get_tc (sym)->output
252b5132
RH
6449 && S_GET_STORAGE_CLASS (sym) != C_FILE)))
6450 return 1;
6451
a161fe53
AM
6452 /* This one will disappear anyway. Don't make a csect sym for it. */
6453 if (sym == abs_section_sym)
6454 return 1;
6455
809ffe0d
ILT
6456 if (symbol_get_tc (sym)->real_name != (char *) NULL)
6457 S_SET_NAME (sym, symbol_get_tc (sym)->real_name);
252b5132
RH
6458 else
6459 {
6460 const char *name;
6461 const char *s;
6462
6463 name = S_GET_NAME (sym);
6464 s = strchr (name, '[');
6465 if (s != (char *) NULL)
6466 {
6467 unsigned int len;
6468 char *snew;
6469
6470 len = s - name;
a44e2901 6471 snew = xstrndup (name, len);
252b5132
RH
6472
6473 S_SET_NAME (sym, snew);
6474 }
6475 }
6476
6477 if (set_end != (symbolS *) NULL)
6478 {
6479 SA_SET_SYM_ENDNDX (set_end, sym);
6480 set_end = NULL;
6481 }
6482
6483 if (SF_GET_FUNCTION (sym))
6484 {
6485 if (ppc_last_function != (symbolS *) NULL)
6486 as_bad (_("two .function pseudo-ops with no intervening .ef"));
6487 ppc_last_function = sym;
85645aed 6488 if (symbol_get_tc (sym)->u.size != (symbolS *) NULL)
252b5132 6489 {
85645aed 6490 resolve_symbol_value (symbol_get_tc (sym)->u.size);
809ffe0d 6491 SA_SET_SYM_FSIZE (sym,
85645aed 6492 (long) S_GET_VALUE (symbol_get_tc (sym)->u.size));
252b5132
RH
6493 }
6494 }
6495 else if (S_GET_STORAGE_CLASS (sym) == C_FCN
6496 && strcmp (S_GET_NAME (sym), ".ef") == 0)
6497 {
6498 if (ppc_last_function == (symbolS *) NULL)
6499 as_bad (_(".ef with no preceding .function"));
6500 else
6501 {
6502 set_end = ppc_last_function;
6503 ppc_last_function = NULL;
6504
6505 /* We don't have a C_EFCN symbol, but we need to force the
6506 COFF backend to believe that it has seen one. */
6507 coff_last_function = NULL;
6508 }
6509 }
6510
670ec21d 6511 if (! (S_IS_EXTERNAL (sym) || S_IS_WEAK (sym))
809ffe0d 6512 && (symbol_get_bfdsym (sym)->flags & BSF_SECTION_SYM) == 0
252b5132
RH
6513 && S_GET_STORAGE_CLASS (sym) != C_FILE
6514 && S_GET_STORAGE_CLASS (sym) != C_FCN
6515 && S_GET_STORAGE_CLASS (sym) != C_BLOCK
6516 && S_GET_STORAGE_CLASS (sym) != C_BSTAT
6517 && S_GET_STORAGE_CLASS (sym) != C_ESTAT
6518 && S_GET_STORAGE_CLASS (sym) != C_BINCL
6519 && S_GET_STORAGE_CLASS (sym) != C_EINCL
6520 && S_GET_SEGMENT (sym) != ppc_coff_debug_section)
6521 S_SET_STORAGE_CLASS (sym, C_HIDEXT);
6522
6523 if (S_GET_STORAGE_CLASS (sym) == C_EXT
8602d4fe 6524 || S_GET_STORAGE_CLASS (sym) == C_AIX_WEAKEXT
252b5132
RH
6525 || S_GET_STORAGE_CLASS (sym) == C_HIDEXT)
6526 {
6527 int i;
6528 union internal_auxent *a;
6529
6530 /* Create a csect aux. */
6531 i = S_GET_NUMBER_AUXILIARY (sym);
6532 S_SET_NUMBER_AUXILIARY (sym, i + 1);
809ffe0d 6533 a = &coffsymbol (symbol_get_bfdsym (sym))->native[i + 1].u.auxent;
96d56e9f 6534 if (symbol_get_tc (sym)->symbol_class == XMC_TC0)
252b5132
RH
6535 {
6536 /* This is the TOC table. */
6537 know (strcmp (S_GET_NAME (sym), "TOC") == 0);
6538 a->x_csect.x_scnlen.l = 0;
6539 a->x_csect.x_smtyp = (2 << 3) | XTY_SD;
6540 }
809ffe0d 6541 else if (symbol_get_tc (sym)->subseg != 0)
252b5132
RH
6542 {
6543 /* This is a csect symbol. x_scnlen is the size of the
6544 csect. */
809ffe0d 6545 if (symbol_get_tc (sym)->next == (symbolS *) NULL)
252b5132
RH
6546 a->x_csect.x_scnlen.l = (bfd_section_size (stdoutput,
6547 S_GET_SEGMENT (sym))
6548 - S_GET_VALUE (sym));
6549 else
6550 {
6386f3a7 6551 resolve_symbol_value (symbol_get_tc (sym)->next);
809ffe0d 6552 a->x_csect.x_scnlen.l = (S_GET_VALUE (symbol_get_tc (sym)->next)
252b5132
RH
6553 - S_GET_VALUE (sym));
6554 }
809ffe0d 6555 a->x_csect.x_smtyp = (symbol_get_tc (sym)->align << 3) | XTY_SD;
252b5132
RH
6556 }
6557 else if (S_GET_SEGMENT (sym) == bss_section)
6558 {
6559 /* This is a common symbol. */
809ffe0d
ILT
6560 a->x_csect.x_scnlen.l = symbol_get_frag (sym)->fr_offset;
6561 a->x_csect.x_smtyp = (symbol_get_tc (sym)->align << 3) | XTY_CM;
252b5132 6562 if (S_IS_EXTERNAL (sym))
96d56e9f 6563 symbol_get_tc (sym)->symbol_class = XMC_RW;
252b5132 6564 else
96d56e9f 6565 symbol_get_tc (sym)->symbol_class = XMC_BS;
252b5132
RH
6566 }
6567 else if (S_GET_SEGMENT (sym) == absolute_section)
6568 {
6569 /* This is an absolute symbol. The csect will be created by
99a814a1 6570 ppc_adjust_symtab. */
b34976b6 6571 ppc_saw_abs = TRUE;
252b5132 6572 a->x_csect.x_smtyp = XTY_LD;
96d56e9f
NC
6573 if (symbol_get_tc (sym)->symbol_class == -1)
6574 symbol_get_tc (sym)->symbol_class = XMC_XO;
252b5132
RH
6575 }
6576 else if (! S_IS_DEFINED (sym))
6577 {
6578 /* This is an external symbol. */
6579 a->x_csect.x_scnlen.l = 0;
6580 a->x_csect.x_smtyp = XTY_ER;
6581 }
96d56e9f 6582 else if (symbol_get_tc (sym)->symbol_class == XMC_TC)
252b5132
RH
6583 {
6584 symbolS *next;
6585
6586 /* This is a TOC definition. x_scnlen is the size of the
6587 TOC entry. */
6588 next = symbol_next (sym);
96d56e9f 6589 while (symbol_get_tc (next)->symbol_class == XMC_TC0)
252b5132
RH
6590 next = symbol_next (next);
6591 if (next == (symbolS *) NULL
96d56e9f 6592 || symbol_get_tc (next)->symbol_class != XMC_TC)
252b5132
RH
6593 {
6594 if (ppc_after_toc_frag == (fragS *) NULL)
6595 a->x_csect.x_scnlen.l = (bfd_section_size (stdoutput,
6596 data_section)
6597 - S_GET_VALUE (sym));
6598 else
6599 a->x_csect.x_scnlen.l = (ppc_after_toc_frag->fr_address
6600 - S_GET_VALUE (sym));
6601 }
6602 else
6603 {
6386f3a7 6604 resolve_symbol_value (next);
252b5132
RH
6605 a->x_csect.x_scnlen.l = (S_GET_VALUE (next)
6606 - S_GET_VALUE (sym));
6607 }
6608 a->x_csect.x_smtyp = (2 << 3) | XTY_SD;
6609 }
6610 else
6611 {
6612 symbolS *csect;
6613
6614 /* This is a normal symbol definition. x_scnlen is the
6615 symbol index of the containing csect. */
6616 if (S_GET_SEGMENT (sym) == text_section)
6617 csect = ppc_text_csects;
6618 else if (S_GET_SEGMENT (sym) == data_section)
6619 csect = ppc_data_csects;
6620 else
6621 abort ();
6622
6623 /* Skip the initial dummy symbol. */
809ffe0d 6624 csect = symbol_get_tc (csect)->next;
252b5132
RH
6625
6626 if (csect == (symbolS *) NULL)
6627 {
6628 as_warn (_("warning: symbol %s has no csect"), S_GET_NAME (sym));
6629 a->x_csect.x_scnlen.l = 0;
6630 }
6631 else
6632 {
809ffe0d 6633 while (symbol_get_tc (csect)->next != (symbolS *) NULL)
252b5132 6634 {
6386f3a7 6635 resolve_symbol_value (symbol_get_tc (csect)->next);
809ffe0d
ILT
6636 if (S_GET_VALUE (symbol_get_tc (csect)->next)
6637 > S_GET_VALUE (sym))
252b5132 6638 break;
809ffe0d 6639 csect = symbol_get_tc (csect)->next;
252b5132
RH
6640 }
6641
809ffe0d
ILT
6642 a->x_csect.x_scnlen.p =
6643 coffsymbol (symbol_get_bfdsym (csect))->native;
6644 coffsymbol (symbol_get_bfdsym (sym))->native[i + 1].fix_scnlen =
6645 1;
252b5132
RH
6646 }
6647 a->x_csect.x_smtyp = XTY_LD;
6648 }
81d4177b 6649
252b5132
RH
6650 a->x_csect.x_parmhash = 0;
6651 a->x_csect.x_snhash = 0;
96d56e9f 6652 if (symbol_get_tc (sym)->symbol_class == -1)
252b5132
RH
6653 a->x_csect.x_smclas = XMC_PR;
6654 else
96d56e9f 6655 a->x_csect.x_smclas = symbol_get_tc (sym)->symbol_class;
252b5132
RH
6656 a->x_csect.x_stab = 0;
6657 a->x_csect.x_snstab = 0;
6658
6659 /* Don't let the COFF backend resort these symbols. */
809ffe0d 6660 symbol_get_bfdsym (sym)->flags |= BSF_NOT_AT_END;
252b5132
RH
6661 }
6662 else if (S_GET_STORAGE_CLASS (sym) == C_BSTAT)
6663 {
6664 /* We want the value to be the symbol index of the referenced
6665 csect symbol. BFD will do that for us if we set the right
6666 flags. */
b782de16
AM
6667 asymbol *bsym = symbol_get_bfdsym (symbol_get_tc (sym)->within);
6668 combined_entry_type *c = coffsymbol (bsym)->native;
6669
6670 S_SET_VALUE (sym, (valueT) (size_t) c);
809ffe0d 6671 coffsymbol (symbol_get_bfdsym (sym))->native->fix_value = 1;
252b5132
RH
6672 }
6673 else if (S_GET_STORAGE_CLASS (sym) == C_STSYM)
6674 {
6675 symbolS *block;
c734e7e3 6676 valueT base;
252b5132 6677
809ffe0d 6678 block = symbol_get_tc (sym)->within;
c734e7e3
TG
6679 if (block)
6680 {
6681 /* The value is the offset from the enclosing csect. */
6682 symbolS *csect;
6683
6684 csect = symbol_get_tc (block)->within;
6685 resolve_symbol_value (csect);
6686 base = S_GET_VALUE (csect);
6687 }
6688 else
6689 base = 0;
6690
6691 S_SET_VALUE (sym, S_GET_VALUE (sym) - base);
252b5132
RH
6692 }
6693 else if (S_GET_STORAGE_CLASS (sym) == C_BINCL
6694 || S_GET_STORAGE_CLASS (sym) == C_EINCL)
6695 {
6696 /* We want the value to be a file offset into the line numbers.
99a814a1
AM
6697 BFD will do that for us if we set the right flags. We have
6698 already set the value correctly. */
809ffe0d 6699 coffsymbol (symbol_get_bfdsym (sym))->native->fix_line = 1;
252b5132
RH
6700 }
6701
6702 return 0;
6703}
6704
6705/* Adjust the symbol table. This creates csect symbols for all
6706 absolute symbols. */
6707
6708void
98027b10 6709ppc_adjust_symtab (void)
252b5132
RH
6710{
6711 symbolS *sym;
6712
6713 if (! ppc_saw_abs)
6714 return;
6715
6716 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
6717 {
6718 symbolS *csect;
6719 int i;
6720 union internal_auxent *a;
6721
6722 if (S_GET_SEGMENT (sym) != absolute_section)
6723 continue;
6724
6725 csect = symbol_create (".abs[XO]", absolute_section,
6726 S_GET_VALUE (sym), &zero_address_frag);
809ffe0d 6727 symbol_get_bfdsym (csect)->value = S_GET_VALUE (sym);
252b5132
RH
6728 S_SET_STORAGE_CLASS (csect, C_HIDEXT);
6729 i = S_GET_NUMBER_AUXILIARY (csect);
6730 S_SET_NUMBER_AUXILIARY (csect, i + 1);
809ffe0d 6731 a = &coffsymbol (symbol_get_bfdsym (csect))->native[i + 1].u.auxent;
252b5132
RH
6732 a->x_csect.x_scnlen.l = 0;
6733 a->x_csect.x_smtyp = XTY_SD;
6734 a->x_csect.x_parmhash = 0;
6735 a->x_csect.x_snhash = 0;
6736 a->x_csect.x_smclas = XMC_XO;
6737 a->x_csect.x_stab = 0;
6738 a->x_csect.x_snstab = 0;
6739
6740 symbol_insert (csect, sym, &symbol_rootP, &symbol_lastP);
6741
6742 i = S_GET_NUMBER_AUXILIARY (sym);
809ffe0d
ILT
6743 a = &coffsymbol (symbol_get_bfdsym (sym))->native[i].u.auxent;
6744 a->x_csect.x_scnlen.p = coffsymbol (symbol_get_bfdsym (csect))->native;
6745 coffsymbol (symbol_get_bfdsym (sym))->native[i].fix_scnlen = 1;
252b5132
RH
6746 }
6747
b34976b6 6748 ppc_saw_abs = FALSE;
252b5132
RH
6749}
6750
6751/* Set the VMA for a section. This is called on all the sections in
6752 turn. */
6753
6754void
98027b10 6755ppc_frob_section (asection *sec)
252b5132 6756{
931e13a6 6757 static bfd_vma vma = 0;
252b5132 6758
85645aed
TG
6759 /* Dwarf sections start at 0. */
6760 if (bfd_get_section_flags (NULL, sec) & SEC_DEBUGGING)
6761 return;
6762
931e13a6 6763 vma = md_section_align (sec, vma);
252b5132
RH
6764 bfd_set_section_vma (stdoutput, sec, vma);
6765 vma += bfd_section_size (stdoutput, sec);
6766}
6767
6768#endif /* OBJ_XCOFF */
6769\f
6d4af3c2 6770const char *
98027b10 6771md_atof (int type, char *litp, int *sizep)
252b5132 6772{
499ac353 6773 return ieee_md_atof (type, litp, sizep, target_big_endian);
252b5132
RH
6774}
6775
6776/* Write a value out to the object file, using the appropriate
6777 endianness. */
6778
6779void
98027b10 6780md_number_to_chars (char *buf, valueT val, int n)
252b5132
RH
6781{
6782 if (target_big_endian)
6783 number_to_chars_bigendian (buf, val, n);
6784 else
6785 number_to_chars_littleendian (buf, val, n);
6786}
6787
6788/* Align a section (I don't know why this is machine dependent). */
6789
6790valueT
3aeeedbb 6791md_section_align (asection *seg ATTRIBUTE_UNUSED, valueT addr)
252b5132 6792{
3aeeedbb
AM
6793#ifdef OBJ_ELF
6794 return addr;
6795#else
252b5132
RH
6796 int align = bfd_get_section_alignment (stdoutput, seg);
6797
8d3842cd 6798 return ((addr + (1 << align) - 1) & -(1 << align));
3aeeedbb 6799#endif
252b5132
RH
6800}
6801
6802/* We don't have any form of relaxing. */
6803
6804int
98027b10
AM
6805md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
6806 asection *seg ATTRIBUTE_UNUSED)
252b5132
RH
6807{
6808 abort ();
6809 return 0;
6810}
6811
6812/* Convert a machine dependent frag. We never generate these. */
6813
6814void
98027b10
AM
6815md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
6816 asection *sec ATTRIBUTE_UNUSED,
6817 fragS *fragp ATTRIBUTE_UNUSED)
252b5132
RH
6818{
6819 abort ();
6820}
6821
6822/* We have no need to default values of symbols. */
6823
252b5132 6824symbolS *
98027b10 6825md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
252b5132
RH
6826{
6827 return 0;
6828}
6829\f
6830/* Functions concerning relocs. */
6831
6832/* The location from which a PC relative jump should be calculated,
6833 given a PC relative reloc. */
6834
6835long
98027b10 6836md_pcrel_from_section (fixS *fixp, segT sec ATTRIBUTE_UNUSED)
252b5132
RH
6837{
6838 return fixp->fx_frag->fr_address + fixp->fx_where;
6839}
6840
6841#ifdef OBJ_XCOFF
6842
6843/* This is called to see whether a fixup should be adjusted to use a
6844 section symbol. We take the opportunity to change a fixup against
6845 a symbol in the TOC subsegment into a reloc against the
6846 corresponding .tc symbol. */
6847
6848int
98027b10 6849ppc_fix_adjustable (fixS *fix)
252b5132 6850{
b782de16
AM
6851 valueT val = resolve_symbol_value (fix->fx_addsy);
6852 segT symseg = S_GET_SEGMENT (fix->fx_addsy);
6853 TC_SYMFIELD_TYPE *tc;
6854
6855 if (symseg == absolute_section)
6856 return 0;
252b5132 6857
85645aed
TG
6858 /* Always adjust symbols in debugging sections. */
6859 if (bfd_get_section_flags (stdoutput, symseg) & SEC_DEBUGGING)
6860 return 1;
6861
252b5132 6862 if (ppc_toc_csect != (symbolS *) NULL
252b5132 6863 && fix->fx_addsy != ppc_toc_csect
b782de16 6864 && symseg == data_section
252b5132
RH
6865 && val >= ppc_toc_frag->fr_address
6866 && (ppc_after_toc_frag == (fragS *) NULL
6867 || val < ppc_after_toc_frag->fr_address))
6868 {
6869 symbolS *sy;
6870
6871 for (sy = symbol_next (ppc_toc_csect);
6872 sy != (symbolS *) NULL;
6873 sy = symbol_next (sy))
6874 {
b782de16
AM
6875 TC_SYMFIELD_TYPE *sy_tc = symbol_get_tc (sy);
6876
96d56e9f 6877 if (sy_tc->symbol_class == XMC_TC0)
252b5132 6878 continue;
96d56e9f 6879 if (sy_tc->symbol_class != XMC_TC)
252b5132 6880 break;
b782de16 6881 if (val == resolve_symbol_value (sy))
252b5132
RH
6882 {
6883 fix->fx_addsy = sy;
6884 fix->fx_addnumber = val - ppc_toc_frag->fr_address;
6885 return 0;
6886 }
6887 }
6888
6889 as_bad_where (fix->fx_file, fix->fx_line,
6890 _("symbol in .toc does not match any .tc"));
6891 }
6892
6893 /* Possibly adjust the reloc to be against the csect. */
b782de16
AM
6894 tc = symbol_get_tc (fix->fx_addsy);
6895 if (tc->subseg == 0
96d56e9f
NC
6896 && tc->symbol_class != XMC_TC0
6897 && tc->symbol_class != XMC_TC
b782de16 6898 && symseg != bss_section
252b5132 6899 /* Don't adjust if this is a reloc in the toc section. */
b782de16 6900 && (symseg != data_section
252b5132
RH
6901 || ppc_toc_csect == NULL
6902 || val < ppc_toc_frag->fr_address
6903 || (ppc_after_toc_frag != NULL
6904 && val >= ppc_after_toc_frag->fr_address)))
6905 {
2fb4b302 6906 symbolS *csect = tc->within;
252b5132 6907
2fb4b302
TG
6908 /* If the symbol was not declared by a label (eg: a section symbol),
6909 use the section instead of the csect. This doesn't happen in
6910 normal AIX assembly code. */
6911 if (csect == NULL)
6912 csect = seg_info (symseg)->sym;
252b5132 6913
2fb4b302
TG
6914 fix->fx_offset += val - symbol_get_frag (csect)->fr_address;
6915 fix->fx_addsy = csect;
252b5132 6916
b782de16 6917 return 0;
252b5132
RH
6918 }
6919
6920 /* Adjust a reloc against a .lcomm symbol to be against the base
6921 .lcomm. */
b782de16 6922 if (symseg == bss_section
252b5132
RH
6923 && ! S_IS_EXTERNAL (fix->fx_addsy))
6924 {
b782de16
AM
6925 symbolS *sy = symbol_get_frag (fix->fx_addsy)->fr_symbol;
6926
6927 fix->fx_offset += val - resolve_symbol_value (sy);
6928 fix->fx_addsy = sy;
252b5132
RH
6929 }
6930
6931 return 0;
6932}
6933
6934/* A reloc from one csect to another must be kept. The assembler
6935 will, of course, keep relocs between sections, and it will keep
6936 absolute relocs, but we need to force it to keep PC relative relocs
6937 between two csects in the same section. */
6938
6939int
98027b10 6940ppc_force_relocation (fixS *fix)
252b5132
RH
6941{
6942 /* At this point fix->fx_addsy should already have been converted to
6943 a csect symbol. If the csect does not include the fragment, then
6944 we need to force the relocation. */
6945 if (fix->fx_pcrel
6946 && fix->fx_addsy != NULL
809ffe0d
ILT
6947 && symbol_get_tc (fix->fx_addsy)->subseg != 0
6948 && ((symbol_get_frag (fix->fx_addsy)->fr_address
6949 > fix->fx_frag->fr_address)
6950 || (symbol_get_tc (fix->fx_addsy)->next != NULL
6951 && (symbol_get_frag (symbol_get_tc (fix->fx_addsy)->next)->fr_address
252b5132
RH
6952 <= fix->fx_frag->fr_address))))
6953 return 1;
6954
ae6063d4 6955 return generic_force_reloc (fix);
252b5132 6956}
252b5132
RH
6957#endif /* OBJ_XCOFF */
6958
0baf16f2 6959#ifdef OBJ_ELF
a161fe53
AM
6960/* If this function returns non-zero, it guarantees that a relocation
6961 will be emitted for a fixup. */
6962
6963int
98027b10 6964ppc_force_relocation (fixS *fix)
a161fe53
AM
6965{
6966 /* Branch prediction relocations must force a relocation, as must
6967 the vtable description relocs. */
6968 switch (fix->fx_r_type)
6969 {
6970 case BFD_RELOC_PPC_B16_BRTAKEN:
6971 case BFD_RELOC_PPC_B16_BRNTAKEN:
6972 case BFD_RELOC_PPC_BA16_BRTAKEN:
6973 case BFD_RELOC_PPC_BA16_BRNTAKEN:
c744ecf2 6974 case BFD_RELOC_24_PLT_PCREL:
a161fe53 6975 case BFD_RELOC_PPC64_TOC:
a161fe53 6976 return 1;
6911b7dc
AM
6977 case BFD_RELOC_PPC_B26:
6978 case BFD_RELOC_PPC_BA26:
6979 case BFD_RELOC_PPC_B16:
6980 case BFD_RELOC_PPC_BA16:
05d0e962 6981 case BFD_RELOC_PPC64_REL24_NOTOC:
6911b7dc
AM
6982 /* All branch fixups targeting a localentry symbol must
6983 force a relocation. */
6984 if (fix->fx_addsy)
6985 {
6986 asymbol *bfdsym = symbol_get_bfdsym (fix->fx_addsy);
6987 elf_symbol_type *elfsym
6988 = elf_symbol_from (bfd_asymbol_bfd (bfdsym), bfdsym);
6989 gas_assert (elfsym);
6990 if ((STO_PPC64_LOCAL_MASK & elfsym->internal_elf_sym.st_other) != 0)
6991 return 1;
6992 }
6993 break;
a161fe53
AM
6994 default:
6995 break;
6996 }
6997
cdba85ec
AM
6998 if (fix->fx_r_type >= BFD_RELOC_PPC_TLS
6999 && fix->fx_r_type <= BFD_RELOC_PPC64_DTPREL16_HIGHESTA)
7000 return 1;
7001
ae6063d4 7002 return generic_force_reloc (fix);
a161fe53
AM
7003}
7004
0baf16f2 7005int
98027b10 7006ppc_fix_adjustable (fixS *fix)
252b5132 7007{
6911b7dc
AM
7008 switch (fix->fx_r_type)
7009 {
7010 /* All branch fixups targeting a localentry symbol must
7011 continue using the symbol. */
7012 case BFD_RELOC_PPC_B26:
7013 case BFD_RELOC_PPC_BA26:
7014 case BFD_RELOC_PPC_B16:
7015 case BFD_RELOC_PPC_BA16:
7016 case BFD_RELOC_PPC_B16_BRTAKEN:
7017 case BFD_RELOC_PPC_B16_BRNTAKEN:
7018 case BFD_RELOC_PPC_BA16_BRTAKEN:
7019 case BFD_RELOC_PPC_BA16_BRNTAKEN:
05d0e962 7020 case BFD_RELOC_PPC64_REL24_NOTOC:
6911b7dc
AM
7021 if (fix->fx_addsy)
7022 {
7023 asymbol *bfdsym = symbol_get_bfdsym (fix->fx_addsy);
7024 elf_symbol_type *elfsym
7025 = elf_symbol_from (bfd_asymbol_bfd (bfdsym), bfdsym);
7026 gas_assert (elfsym);
7027 if ((STO_PPC64_LOCAL_MASK & elfsym->internal_elf_sym.st_other) != 0)
7028 return 0;
7029 }
7030 break;
7031 default:
7032 break;
7033 }
7034
0baf16f2
AM
7035 return (fix->fx_r_type != BFD_RELOC_16_GOTOFF
7036 && fix->fx_r_type != BFD_RELOC_LO16_GOTOFF
7037 && fix->fx_r_type != BFD_RELOC_HI16_GOTOFF
7038 && fix->fx_r_type != BFD_RELOC_HI16_S_GOTOFF
cc9edbf3
AM
7039 && fix->fx_r_type != BFD_RELOC_PPC64_GOT16_DS
7040 && fix->fx_r_type != BFD_RELOC_PPC64_GOT16_LO_DS
334d91b9
AM
7041 && fix->fx_r_type != BFD_RELOC_16_GOT_PCREL
7042 && fix->fx_r_type != BFD_RELOC_32_GOTOFF
5663e321 7043 && fix->fx_r_type != BFD_RELOC_PPC64_GOT_PCREL34
334d91b9
AM
7044 && fix->fx_r_type != BFD_RELOC_24_PLT_PCREL
7045 && fix->fx_r_type != BFD_RELOC_32_PLTOFF
7046 && fix->fx_r_type != BFD_RELOC_32_PLT_PCREL
7047 && fix->fx_r_type != BFD_RELOC_LO16_PLTOFF
7048 && fix->fx_r_type != BFD_RELOC_HI16_PLTOFF
7049 && fix->fx_r_type != BFD_RELOC_HI16_S_PLTOFF
7050 && fix->fx_r_type != BFD_RELOC_64_PLTOFF
7051 && fix->fx_r_type != BFD_RELOC_64_PLT_PCREL
7052 && fix->fx_r_type != BFD_RELOC_PPC64_PLT16_LO_DS
5663e321 7053 && fix->fx_r_type != BFD_RELOC_PPC64_PLT_PCREL34
334d91b9
AM
7054 && fix->fx_r_type != BFD_RELOC_PPC64_PLTGOT16
7055 && fix->fx_r_type != BFD_RELOC_PPC64_PLTGOT16_LO
7056 && fix->fx_r_type != BFD_RELOC_PPC64_PLTGOT16_HI
7057 && fix->fx_r_type != BFD_RELOC_PPC64_PLTGOT16_HA
7058 && fix->fx_r_type != BFD_RELOC_PPC64_PLTGOT16_DS
7059 && fix->fx_r_type != BFD_RELOC_PPC64_PLTGOT16_LO_DS
0baf16f2 7060 && fix->fx_r_type != BFD_RELOC_GPREL16
334d91b9
AM
7061 && fix->fx_r_type != BFD_RELOC_PPC_VLE_SDAREL_LO16A
7062 && fix->fx_r_type != BFD_RELOC_PPC_VLE_SDAREL_HI16A
7063 && fix->fx_r_type != BFD_RELOC_PPC_VLE_SDAREL_HA16A
0baf16f2
AM
7064 && fix->fx_r_type != BFD_RELOC_VTABLE_INHERIT
7065 && fix->fx_r_type != BFD_RELOC_VTABLE_ENTRY
cdba85ec 7066 && !(fix->fx_r_type >= BFD_RELOC_PPC_TLS
ab1e9ef7 7067 && fix->fx_r_type <= BFD_RELOC_PPC64_DTPREL16_HIGHESTA));
252b5132 7068}
0baf16f2 7069#endif
252b5132 7070
b9c361e0
JL
7071void
7072ppc_frag_check (struct frag *fragP)
7073{
a9479dc0
AM
7074 if ((fragP->fr_address & fragP->insn_addr) != 0)
7075 as_bad_where (fragP->fr_file, fragP->fr_line,
7076 _("instruction address is not a multiple of %d"),
7077 fragP->insn_addr + 1);
b9c361e0
JL
7078}
7079
3aeeedbb
AM
7080/* Implement HANDLE_ALIGN. This writes the NOP pattern into an
7081 rs_align_code frag. */
7082
7083void
7084ppc_handle_align (struct frag *fragP)
7085{
7086 valueT count = (fragP->fr_next->fr_address
7087 - (fragP->fr_address + fragP->fr_fix));
7088
f7d69005 7089 if ((ppc_cpu & PPC_OPCODE_VLE) != 0 && count != 0 && (count & 1) == 0)
b9c361e0
JL
7090 {
7091 char *dest = fragP->fr_literal + fragP->fr_fix;
7092
7093 fragP->fr_var = 2;
7094 md_number_to_chars (dest, 0x4400, 2);
7095 }
7096 else if (count != 0 && (count & 3) == 0)
3aeeedbb
AM
7097 {
7098 char *dest = fragP->fr_literal + fragP->fr_fix;
7099
7100 fragP->fr_var = 4;
cef4f754
AM
7101
7102 if (count > 4 * nop_limit && count < 0x2000000)
7103 {
7104 struct frag *rest;
7105
7106 /* Make a branch, then follow with nops. Insert another
7107 frag to handle the nops. */
7108 md_number_to_chars (dest, 0x48000000 + count, 4);
7109 count -= 4;
7110 if (count == 0)
7111 return;
7112
7113 rest = xmalloc (SIZEOF_STRUCT_FRAG + 4);
7114 memcpy (rest, fragP, SIZEOF_STRUCT_FRAG);
7115 fragP->fr_next = rest;
7116 fragP = rest;
7117 rest->fr_address += rest->fr_fix + 4;
7118 rest->fr_fix = 0;
7119 /* If we leave the next frag as rs_align_code we'll come here
7120 again, resulting in a bunch of branches rather than a
7121 branch followed by nops. */
7122 rest->fr_type = rs_align;
7123 dest = rest->fr_literal;
7124 }
7125
3aeeedbb
AM
7126 md_number_to_chars (dest, 0x60000000, 4);
7127
42240548 7128 if ((ppc_cpu & PPC_OPCODE_POWER6) != 0
6a7524c6 7129 && (ppc_cpu & PPC_OPCODE_POWER9) == 0)
3aeeedbb 7130 {
3fea0c3b
AM
7131 /* For power6, power7, and power8, we want the last nop to
7132 be a group terminating one. Do this by inserting an
7133 rs_fill frag immediately after this one, with its address
7134 set to the last nop location. This will automatically
7135 reduce the number of nops in the current frag by one. */
3aeeedbb
AM
7136 if (count > 4)
7137 {
7138 struct frag *group_nop = xmalloc (SIZEOF_STRUCT_FRAG + 4);
7139
7140 memcpy (group_nop, fragP, SIZEOF_STRUCT_FRAG);
7141 group_nop->fr_address = group_nop->fr_next->fr_address - 4;
7142 group_nop->fr_fix = 0;
7143 group_nop->fr_offset = 1;
7144 group_nop->fr_type = rs_fill;
7145 fragP->fr_next = group_nop;
7146 dest = group_nop->fr_literal;
7147 }
7148
6a7524c6 7149 if ((ppc_cpu & PPC_OPCODE_POWER7) != 0)
aea77599
AM
7150 {
7151 if (ppc_cpu & PPC_OPCODE_E500MC)
7152 /* e500mc group terminating nop: "ori 0,0,0". */
7153 md_number_to_chars (dest, 0x60000000, 4);
7154 else
3fea0c3b 7155 /* power7/power8 group terminating nop: "ori 2,2,0". */
aea77599
AM
7156 md_number_to_chars (dest, 0x60420000, 4);
7157 }
42240548
PB
7158 else
7159 /* power6 group terminating nop: "ori 1,1,0". */
7160 md_number_to_chars (dest, 0x60210000, 4);
3aeeedbb
AM
7161 }
7162 }
7163}
7164
252b5132 7165/* Apply a fixup to the object code. This is called for all the
3b8b57a9 7166 fixups we generated by the calls to fix_new_exp, above. */
252b5132 7167
94f592af 7168void
62ebcb5c 7169md_apply_fix (fixS *fixP, valueT *valP, segT seg)
252b5132 7170{
94f592af 7171 valueT value = * valP;
5656a981
AM
7172 offsetT fieldval;
7173 const struct powerpc_operand *operand;
252b5132
RH
7174
7175#ifdef OBJ_ELF
94f592af 7176 if (fixP->fx_addsy != NULL)
252b5132 7177 {
a161fe53 7178 /* Hack around bfd_install_relocation brain damage. */
94f592af
NC
7179 if (fixP->fx_pcrel)
7180 value += fixP->fx_frag->fr_address + fixP->fx_where;
a680de9a
PB
7181
7182 if (fixP->fx_addsy == abs_section_sym)
7183 fixP->fx_done = 1;
252b5132
RH
7184 }
7185 else
94f592af 7186 fixP->fx_done = 1;
252b5132 7187#else
a161fe53 7188 /* FIXME FIXME FIXME: The value we are passed in *valP includes
7be1c489
AM
7189 the symbol values. If we are doing this relocation the code in
7190 write.c is going to call bfd_install_relocation, which is also
7191 going to use the symbol value. That means that if the reloc is
7192 fully resolved we want to use *valP since bfd_install_relocation is
7193 not being used.
9f0eb232
RS
7194 However, if the reloc is not fully resolved we do not want to
7195 use *valP, and must use fx_offset instead. If the relocation
7196 is PC-relative, we then need to re-apply md_pcrel_from_section
7197 to this new relocation value. */
94f592af
NC
7198 if (fixP->fx_addsy == (symbolS *) NULL)
7199 fixP->fx_done = 1;
7200
252b5132 7201 else
9f0eb232
RS
7202 {
7203 value = fixP->fx_offset;
7204 if (fixP->fx_pcrel)
7205 value -= md_pcrel_from_section (fixP, seg);
7206 }
a161fe53
AM
7207#endif
7208
7ba71655
AM
7209 /* We are only able to convert some relocs to pc-relative. */
7210 if (fixP->fx_pcrel)
7211 {
7212 switch (fixP->fx_r_type)
7213 {
4a969973
AM
7214 case BFD_RELOC_64:
7215 fixP->fx_r_type = BFD_RELOC_64_PCREL;
7216 break;
7217
7218 case BFD_RELOC_32:
7219 fixP->fx_r_type = BFD_RELOC_32_PCREL;
7220 break;
7221
7222 case BFD_RELOC_16:
7223 fixP->fx_r_type = BFD_RELOC_16_PCREL;
7224 break;
7225
7ba71655
AM
7226 case BFD_RELOC_LO16:
7227 fixP->fx_r_type = BFD_RELOC_LO16_PCREL;
7228 break;
7229
7230 case BFD_RELOC_HI16:
7231 fixP->fx_r_type = BFD_RELOC_HI16_PCREL;
7232 break;
7233
7234 case BFD_RELOC_HI16_S:
7235 fixP->fx_r_type = BFD_RELOC_HI16_S_PCREL;
7236 break;
7237
4a969973
AM
7238 case BFD_RELOC_PPC64_ADDR16_HIGH:
7239 fixP->fx_r_type = BFD_RELOC_PPC64_REL16_HIGH;
7ba71655
AM
7240 break;
7241
4a969973
AM
7242 case BFD_RELOC_PPC64_ADDR16_HIGHA:
7243 fixP->fx_r_type = BFD_RELOC_PPC64_REL16_HIGHA;
7ba71655
AM
7244 break;
7245
4a969973
AM
7246 case BFD_RELOC_PPC64_HIGHER:
7247 fixP->fx_r_type = BFD_RELOC_PPC64_REL16_HIGHER;
7248 break;
7249
7250 case BFD_RELOC_PPC64_HIGHER_S:
7251 fixP->fx_r_type = BFD_RELOC_PPC64_REL16_HIGHERA;
7252 break;
7253
7254 case BFD_RELOC_PPC64_HIGHEST:
7255 fixP->fx_r_type = BFD_RELOC_PPC64_REL16_HIGHEST;
7256 break;
7257
7258 case BFD_RELOC_PPC64_HIGHEST_S:
7259 fixP->fx_r_type = BFD_RELOC_PPC64_REL16_HIGHESTA;
7ba71655
AM
7260 break;
7261
5663e321
AM
7262 case BFD_RELOC_PPC64_ADDR16_HIGHER34:
7263 fixP->fx_r_type = BFD_RELOC_PPC64_REL16_HIGHER34;
7264 break;
7265
7266 case BFD_RELOC_PPC64_ADDR16_HIGHERA34:
7267 fixP->fx_r_type = BFD_RELOC_PPC64_REL16_HIGHERA34;
7268 break;
7269
7270 case BFD_RELOC_PPC64_ADDR16_HIGHEST34:
7271 fixP->fx_r_type = BFD_RELOC_PPC64_REL16_HIGHEST34;
7272 break;
7273
7274 case BFD_RELOC_PPC64_ADDR16_HIGHESTA34:
7275 fixP->fx_r_type = BFD_RELOC_PPC64_REL16_HIGHESTA34;
7276 break;
7277
7ba71655
AM
7278 case BFD_RELOC_PPC_16DX_HA:
7279 fixP->fx_r_type = BFD_RELOC_PPC_REL16DX_HA;
7280 break;
7281
5663e321
AM
7282 case BFD_RELOC_PPC64_D34:
7283 fixP->fx_r_type = BFD_RELOC_PPC64_PCREL34;
7284 break;
7285
7286 case BFD_RELOC_PPC64_D28:
7287 fixP->fx_r_type = BFD_RELOC_PPC64_PCREL28;
7288 break;
7289
7ba71655
AM
7290 default:
7291 break;
7292 }
7293 }
7294 else if (!fixP->fx_done
7295 && fixP->fx_r_type == BFD_RELOC_PPC_16DX_HA)
252b5132 7296 {
7ba71655
AM
7297 /* addpcis is relative to next insn address. */
7298 value -= 4;
7299 fixP->fx_r_type = BFD_RELOC_PPC_REL16DX_HA;
7300 fixP->fx_pcrel = 1;
252b5132 7301 }
252b5132 7302
5656a981 7303 operand = NULL;
3b8b57a9 7304 if (fixP->fx_pcrel_adjust != 0)
252b5132 7305 {
5656a981 7306 /* This is a fixup on an instruction. */
3b8b57a9 7307 int opindex = fixP->fx_pcrel_adjust & 0xff;
252b5132 7308
5656a981 7309 operand = &powerpc_operands[opindex];
252b5132 7310#ifdef OBJ_XCOFF
0baf16f2
AM
7311 /* An instruction like `lwz 9,sym(30)' when `sym' is not a TOC symbol
7312 does not generate a reloc. It uses the offset of `sym' within its
7313 csect. Other usages, such as `.long sym', generate relocs. This
7314 is the documented behaviour of non-TOC symbols. */
252b5132 7315 if ((operand->flags & PPC_OPERAND_PARENS) != 0
b84bf58a 7316 && (operand->bitm & 0xfff0) == 0xfff0
252b5132 7317 && operand->shift == 0
2b3c4602 7318 && (operand->insert == NULL || ppc_obj64)
94f592af
NC
7319 && fixP->fx_addsy != NULL
7320 && symbol_get_tc (fixP->fx_addsy)->subseg != 0
96d56e9f
NC
7321 && symbol_get_tc (fixP->fx_addsy)->symbol_class != XMC_TC
7322 && symbol_get_tc (fixP->fx_addsy)->symbol_class != XMC_TC0
94f592af 7323 && S_GET_SEGMENT (fixP->fx_addsy) != bss_section)
252b5132 7324 {
94f592af
NC
7325 value = fixP->fx_offset;
7326 fixP->fx_done = 1;
252b5132 7327 }
ac21e7da
TG
7328
7329 /* During parsing of instructions, a TOC16 reloc is generated for
7330 instructions such as 'lwz RT,SYM(RB)' if SYM is a symbol defined
7331 in the toc. But at parse time, SYM may be not yet defined, so
7332 check again here. */
7333 if (fixP->fx_r_type == BFD_RELOC_16
7334 && fixP->fx_addsy != NULL
7335 && ppc_is_toc_sym (fixP->fx_addsy))
7336 fixP->fx_r_type = BFD_RELOC_PPC_TOC16;
252b5132 7337#endif
5656a981
AM
7338 }
7339
7340 /* Calculate value to be stored in field. */
7341 fieldval = value;
7342 switch (fixP->fx_r_type)
7343 {
1ec2d25e 7344#ifdef OBJ_ELF
5656a981
AM
7345 case BFD_RELOC_PPC64_ADDR16_LO_DS:
7346 case BFD_RELOC_PPC_VLE_LO16A:
7347 case BFD_RELOC_PPC_VLE_LO16D:
1ec2d25e 7348#endif
5656a981
AM
7349 case BFD_RELOC_LO16:
7350 case BFD_RELOC_LO16_PCREL:
7351 fieldval = value & 0xffff;
7352 sign_extend_16:
7353 if (operand != NULL && (operand->flags & PPC_OPERAND_SIGNED) != 0)
f9c6b907 7354 fieldval = SEX16 (fieldval);
5656a981
AM
7355 fixP->fx_no_overflow = 1;
7356 break;
3c9d25f4 7357
f9c6b907
AM
7358 case BFD_RELOC_HI16:
7359 case BFD_RELOC_HI16_PCREL:
5656a981 7360#ifdef OBJ_ELF
f9c6b907
AM
7361 if (REPORT_OVERFLOW_HI && ppc_obj64)
7362 {
7363 fieldval = value >> 16;
7364 if (operand != NULL && (operand->flags & PPC_OPERAND_SIGNED) != 0)
7365 {
7366 valueT sign = (((valueT) -1 >> 16) + 1) >> 1;
7367 fieldval = ((valueT) fieldval ^ sign) - sign;
7368 }
7369 break;
7370 }
2b0f3761 7371 /* Fallthru */
f9c6b907 7372
5656a981
AM
7373 case BFD_RELOC_PPC_VLE_HI16A:
7374 case BFD_RELOC_PPC_VLE_HI16D:
f9c6b907 7375 case BFD_RELOC_PPC64_ADDR16_HIGH:
5656a981 7376#endif
5656a981
AM
7377 fieldval = PPC_HI (value);
7378 goto sign_extend_16;
0baf16f2 7379
f9c6b907
AM
7380 case BFD_RELOC_HI16_S:
7381 case BFD_RELOC_HI16_S_PCREL:
7ba71655 7382 case BFD_RELOC_PPC_16DX_HA:
a680de9a 7383 case BFD_RELOC_PPC_REL16DX_HA:
5656a981 7384#ifdef OBJ_ELF
f9c6b907
AM
7385 if (REPORT_OVERFLOW_HI && ppc_obj64)
7386 {
7387 fieldval = (value + 0x8000) >> 16;
7388 if (operand != NULL && (operand->flags & PPC_OPERAND_SIGNED) != 0)
7389 {
7390 valueT sign = (((valueT) -1 >> 16) + 1) >> 1;
7391 fieldval = ((valueT) fieldval ^ sign) - sign;
7392 }
7393 break;
7394 }
2b0f3761 7395 /* Fallthru */
f9c6b907 7396
5656a981
AM
7397 case BFD_RELOC_PPC_VLE_HA16A:
7398 case BFD_RELOC_PPC_VLE_HA16D:
f9c6b907 7399 case BFD_RELOC_PPC64_ADDR16_HIGHA:
5656a981 7400#endif
5656a981
AM
7401 fieldval = PPC_HA (value);
7402 goto sign_extend_16;
0baf16f2 7403
3b8b57a9 7404#ifdef OBJ_ELF
5656a981
AM
7405 case BFD_RELOC_PPC64_HIGHER:
7406 fieldval = PPC_HIGHER (value);
7407 goto sign_extend_16;
252b5132 7408
5656a981
AM
7409 case BFD_RELOC_PPC64_HIGHER_S:
7410 fieldval = PPC_HIGHERA (value);
7411 goto sign_extend_16;
0baf16f2 7412
5656a981
AM
7413 case BFD_RELOC_PPC64_HIGHEST:
7414 fieldval = PPC_HIGHEST (value);
7415 goto sign_extend_16;
0baf16f2 7416
5656a981
AM
7417 case BFD_RELOC_PPC64_HIGHEST_S:
7418 fieldval = PPC_HIGHESTA (value);
7419 goto sign_extend_16;
7420#endif
7421
7422 default:
7423 break;
7424 }
7425
7426 if (operand != NULL)
7427 {
7428 /* Handle relocs in an insn. */
5656a981
AM
7429 switch (fixP->fx_r_type)
7430 {
7fa9fcb6 7431#ifdef OBJ_ELF
3b8b57a9
AM
7432 /* The following relocs can't be calculated by the assembler.
7433 Leave the field zero. */
cdba85ec
AM
7434 case BFD_RELOC_PPC_TPREL16:
7435 case BFD_RELOC_PPC_TPREL16_LO:
7436 case BFD_RELOC_PPC_TPREL16_HI:
7437 case BFD_RELOC_PPC_TPREL16_HA:
cdba85ec
AM
7438 case BFD_RELOC_PPC_DTPREL16:
7439 case BFD_RELOC_PPC_DTPREL16_LO:
7440 case BFD_RELOC_PPC_DTPREL16_HI:
7441 case BFD_RELOC_PPC_DTPREL16_HA:
cdba85ec
AM
7442 case BFD_RELOC_PPC_GOT_TLSGD16:
7443 case BFD_RELOC_PPC_GOT_TLSGD16_LO:
7444 case BFD_RELOC_PPC_GOT_TLSGD16_HI:
7445 case BFD_RELOC_PPC_GOT_TLSGD16_HA:
7446 case BFD_RELOC_PPC_GOT_TLSLD16:
7447 case BFD_RELOC_PPC_GOT_TLSLD16_LO:
7448 case BFD_RELOC_PPC_GOT_TLSLD16_HI:
7449 case BFD_RELOC_PPC_GOT_TLSLD16_HA:
7450 case BFD_RELOC_PPC_GOT_TPREL16:
7451 case BFD_RELOC_PPC_GOT_TPREL16_LO:
7452 case BFD_RELOC_PPC_GOT_TPREL16_HI:
7453 case BFD_RELOC_PPC_GOT_TPREL16_HA:
7454 case BFD_RELOC_PPC_GOT_DTPREL16:
7455 case BFD_RELOC_PPC_GOT_DTPREL16_LO:
7456 case BFD_RELOC_PPC_GOT_DTPREL16_HI:
7457 case BFD_RELOC_PPC_GOT_DTPREL16_HA:
7458 case BFD_RELOC_PPC64_TPREL16_DS:
7459 case BFD_RELOC_PPC64_TPREL16_LO_DS:
f9c6b907
AM
7460 case BFD_RELOC_PPC64_TPREL16_HIGH:
7461 case BFD_RELOC_PPC64_TPREL16_HIGHA:
cdba85ec
AM
7462 case BFD_RELOC_PPC64_TPREL16_HIGHER:
7463 case BFD_RELOC_PPC64_TPREL16_HIGHERA:
7464 case BFD_RELOC_PPC64_TPREL16_HIGHEST:
7465 case BFD_RELOC_PPC64_TPREL16_HIGHESTA:
f9c6b907
AM
7466 case BFD_RELOC_PPC64_DTPREL16_HIGH:
7467 case BFD_RELOC_PPC64_DTPREL16_HIGHA:
cdba85ec
AM
7468 case BFD_RELOC_PPC64_DTPREL16_DS:
7469 case BFD_RELOC_PPC64_DTPREL16_LO_DS:
7470 case BFD_RELOC_PPC64_DTPREL16_HIGHER:
7471 case BFD_RELOC_PPC64_DTPREL16_HIGHERA:
7472 case BFD_RELOC_PPC64_DTPREL16_HIGHEST:
7473 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA:
3b8b57a9 7474 gas_assert (fixP->fx_addsy != NULL);
7c1d0959 7475 S_SET_THREAD_LOCAL (fixP->fx_addsy);
3b8b57a9 7476 fieldval = 0;
cdba85ec 7477 break;
3b8b57a9
AM
7478
7479 /* These also should leave the field zero for the same
7480 reason. Note that older versions of gas wrote values
7481 here. If we want to go back to the old behaviour, then
7482 all _LO and _LO_DS cases will need to be treated like
7483 BFD_RELOC_LO16_PCREL above. Similarly for _HI etc. */
7484 case BFD_RELOC_16_GOTOFF:
7485 case BFD_RELOC_LO16_GOTOFF:
7486 case BFD_RELOC_HI16_GOTOFF:
7487 case BFD_RELOC_HI16_S_GOTOFF:
7488 case BFD_RELOC_LO16_PLTOFF:
7489 case BFD_RELOC_HI16_PLTOFF:
7490 case BFD_RELOC_HI16_S_PLTOFF:
7491 case BFD_RELOC_GPREL16:
7492 case BFD_RELOC_16_BASEREL:
7493 case BFD_RELOC_LO16_BASEREL:
7494 case BFD_RELOC_HI16_BASEREL:
7495 case BFD_RELOC_HI16_S_BASEREL:
7496 case BFD_RELOC_PPC_TOC16:
7497 case BFD_RELOC_PPC64_TOC16_LO:
7498 case BFD_RELOC_PPC64_TOC16_HI:
7499 case BFD_RELOC_PPC64_TOC16_HA:
7500 case BFD_RELOC_PPC64_PLTGOT16:
7501 case BFD_RELOC_PPC64_PLTGOT16_LO:
7502 case BFD_RELOC_PPC64_PLTGOT16_HI:
7503 case BFD_RELOC_PPC64_PLTGOT16_HA:
7504 case BFD_RELOC_PPC64_GOT16_DS:
7505 case BFD_RELOC_PPC64_GOT16_LO_DS:
7506 case BFD_RELOC_PPC64_PLT16_LO_DS:
7507 case BFD_RELOC_PPC64_SECTOFF_DS:
7508 case BFD_RELOC_PPC64_SECTOFF_LO_DS:
7509 case BFD_RELOC_PPC64_TOC16_DS:
7510 case BFD_RELOC_PPC64_TOC16_LO_DS:
7511 case BFD_RELOC_PPC64_PLTGOT16_DS:
7512 case BFD_RELOC_PPC64_PLTGOT16_LO_DS:
7513 case BFD_RELOC_PPC_EMB_NADDR16:
7514 case BFD_RELOC_PPC_EMB_NADDR16_LO:
7515 case BFD_RELOC_PPC_EMB_NADDR16_HI:
7516 case BFD_RELOC_PPC_EMB_NADDR16_HA:
7517 case BFD_RELOC_PPC_EMB_SDAI16:
7518 case BFD_RELOC_PPC_EMB_SDA2I16:
7519 case BFD_RELOC_PPC_EMB_SDA2REL:
252b5132 7520 case BFD_RELOC_PPC_EMB_SDA21:
3b8b57a9
AM
7521 case BFD_RELOC_PPC_EMB_MRKREF:
7522 case BFD_RELOC_PPC_EMB_RELSEC16:
7523 case BFD_RELOC_PPC_EMB_RELST_LO:
7524 case BFD_RELOC_PPC_EMB_RELST_HI:
7525 case BFD_RELOC_PPC_EMB_RELST_HA:
7526 case BFD_RELOC_PPC_EMB_BIT_FLD:
7527 case BFD_RELOC_PPC_EMB_RELSDA:
7528 case BFD_RELOC_PPC_VLE_SDA21:
7529 case BFD_RELOC_PPC_VLE_SDA21_LO:
7530 case BFD_RELOC_PPC_VLE_SDAREL_LO16A:
7531 case BFD_RELOC_PPC_VLE_SDAREL_LO16D:
7532 case BFD_RELOC_PPC_VLE_SDAREL_HI16A:
7533 case BFD_RELOC_PPC_VLE_SDAREL_HI16D:
7534 case BFD_RELOC_PPC_VLE_SDAREL_HA16A:
7535 case BFD_RELOC_PPC_VLE_SDAREL_HA16D:
5663e321
AM
7536 case BFD_RELOC_PPC64_GOT_PCREL34:
7537 case BFD_RELOC_PPC64_PLT_PCREL34:
3b8b57a9 7538 gas_assert (fixP->fx_addsy != NULL);
2b0f3761 7539 /* Fallthru */
3b8b57a9
AM
7540
7541 case BFD_RELOC_PPC_TLS:
7542 case BFD_RELOC_PPC_TLSGD:
7543 case BFD_RELOC_PPC_TLSLD:
7544 fieldval = 0;
3b8b57a9 7545 break;
7fa9fcb6
TG
7546#endif
7547
7548#ifdef OBJ_XCOFF
7549 case BFD_RELOC_PPC_B16:
7550 /* Adjust the offset to the instruction boundary. */
7551 fieldval += 2;
7552 break;
7553#endif
252b5132 7554
f728387b
AM
7555 case BFD_RELOC_VTABLE_INHERIT:
7556 case BFD_RELOC_VTABLE_ENTRY:
7557 case BFD_RELOC_PPC_DTPMOD:
7558 case BFD_RELOC_PPC_TPREL:
7559 case BFD_RELOC_PPC_DTPREL:
7560 case BFD_RELOC_PPC_COPY:
7561 case BFD_RELOC_PPC_GLOB_DAT:
7562 case BFD_RELOC_32_PLT_PCREL:
7563 case BFD_RELOC_PPC_EMB_NADDR32:
7564 case BFD_RELOC_PPC64_TOC:
7565 case BFD_RELOC_CTOR:
7566 case BFD_RELOC_32:
7567 case BFD_RELOC_32_PCREL:
7568 case BFD_RELOC_RVA:
7569 case BFD_RELOC_64:
7570 case BFD_RELOC_64_PCREL:
7571 case BFD_RELOC_PPC64_ADDR64_LOCAL:
7572 as_bad_where (fixP->fx_file, fixP->fx_line,
7573 _("%s unsupported as instruction fixup"),
7574 bfd_get_reloc_code_name (fixP->fx_r_type));
7575 fixP->fx_done = 1;
7576 return;
7577
3b8b57a9 7578 default:
252b5132 7579 break;
3b8b57a9 7580 }
252b5132 7581
3b8b57a9
AM
7582#ifdef OBJ_ELF
7583/* powerpc uses RELA style relocs, so if emitting a reloc the field
7584 contents can stay at zero. */
7585#define APPLY_RELOC fixP->fx_done
7586#else
7587#define APPLY_RELOC 1
7588#endif
5663e321
AM
7589 /* We need to call the insert function even when fieldval is
7590 zero if the insert function would translate that zero to a
7591 bit pattern other than all zeros. */
3b8b57a9
AM
7592 if ((fieldval != 0 && APPLY_RELOC) || operand->insert != NULL)
7593 {
5663e321 7594 uint64_t insn;
487b24d8
AM
7595 unsigned char *where;
7596
3b8b57a9
AM
7597 /* Fetch the instruction, insert the fully resolved operand
7598 value, and stuff the instruction back again. */
487b24d8 7599 where = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
3b8b57a9 7600 if (target_big_endian)
31a91399 7601 {
5663e321 7602 if (fixP->fx_size < 4)
487b24d8 7603 insn = bfd_getb16 (where);
5663e321
AM
7604 else
7605 {
7606 insn = bfd_getb32 (where);
7607 if (fixP->fx_size > 4)
7608 insn = insn << 32 | bfd_getb32 (where + 4);
7609 }
31a91399
NC
7610 }
7611 else
3b8b57a9 7612 {
5663e321 7613 if (fixP->fx_size < 4)
487b24d8 7614 insn = bfd_getl16 (where);
5663e321
AM
7615 else
7616 {
7617 insn = bfd_getl32 (where);
7618 if (fixP->fx_size > 4)
7619 insn = insn << 32 | bfd_getl32 (where + 4);
7620 }
3b8b57a9
AM
7621 }
7622 insn = ppc_insert_operand (insn, operand, fieldval,
7623 fixP->tc_fix_data.ppc_cpu,
7624 fixP->fx_file, fixP->fx_line);
7625 if (target_big_endian)
7626 {
5663e321 7627 if (fixP->fx_size < 4)
487b24d8 7628 bfd_putb16 (insn, where);
5663e321
AM
7629 else
7630 {
7631 if (fixP->fx_size > 4)
7632 {
7633 bfd_putb32 (insn, where + 4);
7634 insn >>= 32;
7635 }
7636 bfd_putb32 (insn, where);
7637 }
3b8b57a9
AM
7638 }
7639 else
7640 {
5663e321 7641 if (fixP->fx_size < 4)
487b24d8 7642 bfd_putl16 (insn, where);
5663e321
AM
7643 else
7644 {
7645 if (fixP->fx_size > 4)
7646 {
7647 bfd_putl32 (insn, where + 4);
7648 insn >>= 32;
7649 }
7650 bfd_putl32 (insn, where);
7651 }
3b8b57a9
AM
7652 }
7653 }
7654
7655 if (fixP->fx_done)
7656 /* Nothing else to do here. */
7657 return;
7658
7659 gas_assert (fixP->fx_addsy != NULL);
62ebcb5c 7660 if (fixP->fx_r_type == BFD_RELOC_NONE)
3b8b57a9 7661 {
3b4dbbbf 7662 const char *sfile;
3b8b57a9
AM
7663 unsigned int sline;
7664
7665 /* Use expr_symbol_where to see if this is an expression
7666 symbol. */
7667 if (expr_symbol_where (fixP->fx_addsy, &sfile, &sline))
7668 as_bad_where (fixP->fx_file, fixP->fx_line,
7669 _("unresolved expression that must be resolved"));
7670 else
7671 as_bad_where (fixP->fx_file, fixP->fx_line,
7672 _("unsupported relocation against %s"),
7673 S_GET_NAME (fixP->fx_addsy));
7674 fixP->fx_done = 1;
7675 return;
7676 }
7677 }
7678 else
7679 {
7680 /* Handle relocs in data. */
7681 switch (fixP->fx_r_type)
7682 {
252b5132 7683 case BFD_RELOC_VTABLE_INHERIT:
94f592af
NC
7684 if (fixP->fx_addsy
7685 && !S_IS_DEFINED (fixP->fx_addsy)
7686 && !S_IS_WEAK (fixP->fx_addsy))
7687 S_SET_WEAK (fixP->fx_addsy);
2b0f3761 7688 /* Fallthru */
252b5132
RH
7689
7690 case BFD_RELOC_VTABLE_ENTRY:
94f592af 7691 fixP->fx_done = 0;
252b5132
RH
7692 break;
7693
0baf16f2 7694#ifdef OBJ_ELF
3b8b57a9
AM
7695 /* These can appear with @l etc. in data. */
7696 case BFD_RELOC_LO16:
3b8b57a9 7697 case BFD_RELOC_LO16_PCREL:
3b8b57a9 7698 case BFD_RELOC_HI16:
3b8b57a9 7699 case BFD_RELOC_HI16_PCREL:
3b8b57a9 7700 case BFD_RELOC_HI16_S:
3b8b57a9 7701 case BFD_RELOC_HI16_S_PCREL:
3b8b57a9 7702 case BFD_RELOC_PPC64_HIGHER:
3b8b57a9 7703 case BFD_RELOC_PPC64_HIGHER_S:
3b8b57a9 7704 case BFD_RELOC_PPC64_HIGHEST:
3b8b57a9 7705 case BFD_RELOC_PPC64_HIGHEST_S:
f9c6b907
AM
7706 case BFD_RELOC_PPC64_ADDR16_HIGH:
7707 case BFD_RELOC_PPC64_ADDR16_HIGHA:
45965137 7708 case BFD_RELOC_PPC64_ADDR64_LOCAL:
3b8b57a9
AM
7709 break;
7710
7711 case BFD_RELOC_PPC_DTPMOD:
7712 case BFD_RELOC_PPC_TPREL:
7713 case BFD_RELOC_PPC_DTPREL:
7714 S_SET_THREAD_LOCAL (fixP->fx_addsy);
7715 break;
7716
7717 /* Just punt all of these to the linker. */
7718 case BFD_RELOC_PPC_B16_BRTAKEN:
7719 case BFD_RELOC_PPC_B16_BRNTAKEN:
7720 case BFD_RELOC_16_GOTOFF:
7721 case BFD_RELOC_LO16_GOTOFF:
7722 case BFD_RELOC_HI16_GOTOFF:
7723 case BFD_RELOC_HI16_S_GOTOFF:
7724 case BFD_RELOC_LO16_PLTOFF:
7725 case BFD_RELOC_HI16_PLTOFF:
7726 case BFD_RELOC_HI16_S_PLTOFF:
7727 case BFD_RELOC_PPC_COPY:
7728 case BFD_RELOC_PPC_GLOB_DAT:
7729 case BFD_RELOC_16_BASEREL:
7730 case BFD_RELOC_LO16_BASEREL:
7731 case BFD_RELOC_HI16_BASEREL:
7732 case BFD_RELOC_HI16_S_BASEREL:
7733 case BFD_RELOC_PPC_TLS:
7734 case BFD_RELOC_PPC_DTPREL16_LO:
7735 case BFD_RELOC_PPC_DTPREL16_HI:
7736 case BFD_RELOC_PPC_DTPREL16_HA:
7737 case BFD_RELOC_PPC_TPREL16_LO:
7738 case BFD_RELOC_PPC_TPREL16_HI:
7739 case BFD_RELOC_PPC_TPREL16_HA:
7740 case BFD_RELOC_PPC_GOT_TLSGD16:
7741 case BFD_RELOC_PPC_GOT_TLSGD16_LO:
7742 case BFD_RELOC_PPC_GOT_TLSGD16_HI:
7743 case BFD_RELOC_PPC_GOT_TLSGD16_HA:
7744 case BFD_RELOC_PPC_GOT_TLSLD16:
7745 case BFD_RELOC_PPC_GOT_TLSLD16_LO:
7746 case BFD_RELOC_PPC_GOT_TLSLD16_HI:
7747 case BFD_RELOC_PPC_GOT_TLSLD16_HA:
7748 case BFD_RELOC_PPC_GOT_DTPREL16:
7749 case BFD_RELOC_PPC_GOT_DTPREL16_LO:
7750 case BFD_RELOC_PPC_GOT_DTPREL16_HI:
7751 case BFD_RELOC_PPC_GOT_DTPREL16_HA:
7752 case BFD_RELOC_PPC_GOT_TPREL16:
7753 case BFD_RELOC_PPC_GOT_TPREL16_LO:
7754 case BFD_RELOC_PPC_GOT_TPREL16_HI:
7755 case BFD_RELOC_PPC_GOT_TPREL16_HA:
7756 case BFD_RELOC_24_PLT_PCREL:
7757 case BFD_RELOC_PPC_LOCAL24PC:
7758 case BFD_RELOC_32_PLT_PCREL:
7759 case BFD_RELOC_GPREL16:
7760 case BFD_RELOC_PPC_VLE_SDAREL_LO16A:
7761 case BFD_RELOC_PPC_VLE_SDAREL_HI16A:
7762 case BFD_RELOC_PPC_VLE_SDAREL_HA16A:
7763 case BFD_RELOC_PPC_EMB_NADDR32:
7764 case BFD_RELOC_PPC_EMB_NADDR16:
7765 case BFD_RELOC_PPC_EMB_NADDR16_LO:
7766 case BFD_RELOC_PPC_EMB_NADDR16_HI:
7767 case BFD_RELOC_PPC_EMB_NADDR16_HA:
7768 case BFD_RELOC_PPC_EMB_SDAI16:
7769 case BFD_RELOC_PPC_EMB_SDA2REL:
7770 case BFD_RELOC_PPC_EMB_SDA2I16:
7771 case BFD_RELOC_PPC_EMB_SDA21:
7772 case BFD_RELOC_PPC_VLE_SDA21_LO:
7773 case BFD_RELOC_PPC_EMB_MRKREF:
7774 case BFD_RELOC_PPC_EMB_RELSEC16:
7775 case BFD_RELOC_PPC_EMB_RELST_LO:
7776 case BFD_RELOC_PPC_EMB_RELST_HI:
7777 case BFD_RELOC_PPC_EMB_RELST_HA:
7778 case BFD_RELOC_PPC_EMB_BIT_FLD:
7779 case BFD_RELOC_PPC_EMB_RELSDA:
0baf16f2 7780 case BFD_RELOC_PPC64_TOC:
3b8b57a9
AM
7781 case BFD_RELOC_PPC_TOC16:
7782 case BFD_RELOC_PPC64_TOC16_LO:
7783 case BFD_RELOC_PPC64_TOC16_HI:
7784 case BFD_RELOC_PPC64_TOC16_HA:
f9c6b907
AM
7785 case BFD_RELOC_PPC64_DTPREL16_HIGH:
7786 case BFD_RELOC_PPC64_DTPREL16_HIGHA:
3b8b57a9
AM
7787 case BFD_RELOC_PPC64_DTPREL16_HIGHER:
7788 case BFD_RELOC_PPC64_DTPREL16_HIGHERA:
7789 case BFD_RELOC_PPC64_DTPREL16_HIGHEST:
7790 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA:
f9c6b907
AM
7791 case BFD_RELOC_PPC64_TPREL16_HIGH:
7792 case BFD_RELOC_PPC64_TPREL16_HIGHA:
3b8b57a9
AM
7793 case BFD_RELOC_PPC64_TPREL16_HIGHER:
7794 case BFD_RELOC_PPC64_TPREL16_HIGHERA:
7795 case BFD_RELOC_PPC64_TPREL16_HIGHEST:
7796 case BFD_RELOC_PPC64_TPREL16_HIGHESTA:
94f592af 7797 fixP->fx_done = 0;
0baf16f2 7798 break;
0baf16f2 7799#endif
3b8b57a9
AM
7800
7801#ifdef OBJ_XCOFF
7802 case BFD_RELOC_NONE:
3b8b57a9 7803#endif
5656a981
AM
7804 case BFD_RELOC_CTOR:
7805 case BFD_RELOC_32:
7806 case BFD_RELOC_32_PCREL:
7807 case BFD_RELOC_RVA:
7808 case BFD_RELOC_64:
7809 case BFD_RELOC_64_PCREL:
7810 case BFD_RELOC_16:
7811 case BFD_RELOC_16_PCREL:
7812 case BFD_RELOC_8:
7813 break;
3b8b57a9 7814
252b5132 7815 default:
bc805888 7816 fprintf (stderr,
94f592af 7817 _("Gas failure, reloc value %d\n"), fixP->fx_r_type);
99a814a1 7818 fflush (stderr);
252b5132
RH
7819 abort ();
7820 }
46b596ff 7821
5656a981 7822 if (fixP->fx_size && APPLY_RELOC)
46b596ff 7823 md_number_to_chars (fixP->fx_frag->fr_literal + fixP->fx_where,
5656a981 7824 fieldval, fixP->fx_size);
bf7279d5
AM
7825 if (warn_476
7826 && (seg->flags & SEC_CODE) != 0
7827 && fixP->fx_size == 4
7828 && fixP->fx_done
7829 && !fixP->fx_tcbit
7830 && (fixP->fx_r_type == BFD_RELOC_32
7831 || fixP->fx_r_type == BFD_RELOC_CTOR
7832 || fixP->fx_r_type == BFD_RELOC_32_PCREL))
7833 as_warn_where (fixP->fx_file, fixP->fx_line,
7834 _("data in executable section"));
5656a981
AM
7835 }
7836
252b5132 7837#ifdef OBJ_ELF
3b8b57a9 7838 ppc_elf_validate_fix (fixP, seg);
94f592af 7839 fixP->fx_addnumber = value;
4e6935a6
AM
7840
7841 /* PowerPC uses RELA relocs, ie. the reloc addend is stored separately
7842 from the section contents. If we are going to be emitting a reloc
7843 then the section contents are immaterial, so don't warn if they
7844 happen to overflow. Leave such warnings to ld. */
7845 if (!fixP->fx_done)
a38a07e0
AM
7846 {
7847 fixP->fx_no_overflow = 1;
7848
7849 /* Arrange to emit .TOC. as a normal symbol if used in anything
7850 but .TOC.@tocbase. */
7851 if (ppc_obj64
7852 && fixP->fx_r_type != BFD_RELOC_PPC64_TOC
7853 && fixP->fx_addsy != NULL
7854 && strcmp (S_GET_NAME (fixP->fx_addsy), ".TOC.") == 0)
7855 symbol_get_bfdsym (fixP->fx_addsy)->flags |= BSF_KEEP;
7856 }
252b5132 7857#else
94f592af
NC
7858 if (fixP->fx_r_type != BFD_RELOC_PPC_TOC16)
7859 fixP->fx_addnumber = 0;
252b5132
RH
7860 else
7861 {
7862#ifdef TE_PE
94f592af 7863 fixP->fx_addnumber = 0;
252b5132 7864#else
8edcbfcd
TG
7865 /* We want to use the offset within the toc, not the actual VMA
7866 of the symbol. */
94f592af 7867 fixP->fx_addnumber =
8edcbfcd
TG
7868 - bfd_get_section_vma (stdoutput, S_GET_SEGMENT (fixP->fx_addsy))
7869 - S_GET_VALUE (ppc_toc_csect);
ac21e7da
TG
7870 /* Set *valP to avoid errors. */
7871 *valP = value;
252b5132
RH
7872#endif
7873 }
7874#endif
252b5132
RH
7875}
7876
7877/* Generate a reloc for a fixup. */
7878
7879arelent *
98027b10 7880tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
252b5132
RH
7881{
7882 arelent *reloc;
7883
325801bd 7884 reloc = XNEW (arelent);
252b5132 7885
325801bd 7886 reloc->sym_ptr_ptr = XNEW (asymbol *);
49309057 7887 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
252b5132
RH
7888 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
7889 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
7890 if (reloc->howto == (reloc_howto_type *) NULL)
7891 {
7892 as_bad_where (fixp->fx_file, fixp->fx_line,
99a814a1
AM
7893 _("reloc %d not supported by object file format"),
7894 (int) fixp->fx_r_type);
252b5132
RH
7895 return NULL;
7896 }
7897 reloc->addend = fixp->fx_addnumber;
7898
7899 return reloc;
7900}
75e21f08
JJ
7901
7902void
98027b10 7903ppc_cfi_frame_initial_instructions (void)
75e21f08
JJ
7904{
7905 cfi_add_CFA_def_cfa (1, 0);
7906}
7907
7908int
1df69f4f 7909tc_ppc_regname_to_dw2regnum (char *regname)
75e21f08
JJ
7910{
7911 unsigned int regnum = -1;
7912 unsigned int i;
7913 const char *p;
7914 char *q;
e0471c16 7915 static struct { const char *name; int dw2regnum; } regnames[] =
75e21f08
JJ
7916 {
7917 { "sp", 1 }, { "r.sp", 1 }, { "rtoc", 2 }, { "r.toc", 2 },
7918 { "mq", 64 }, { "lr", 65 }, { "ctr", 66 }, { "ap", 67 },
80f846b6 7919 { "cr", 70 }, { "xer", 76 }, { "vrsave", 109 }, { "vscr", 110 },
75e21f08
JJ
7920 { "spe_acc", 111 }, { "spefscr", 112 }
7921 };
7922
7923 for (i = 0; i < ARRAY_SIZE (regnames); ++i)
7924 if (strcmp (regnames[i].name, regname) == 0)
7925 return regnames[i].dw2regnum;
7926
7927 if (regname[0] == 'r' || regname[0] == 'f' || regname[0] == 'v')
7928 {
7929 p = regname + 1 + (regname[1] == '.');
7930 regnum = strtoul (p, &q, 10);
7931 if (p == q || *q || regnum >= 32)
7932 return -1;
7933 if (regname[0] == 'f')
b7d7dc63 7934 regnum += 32;
75e21f08 7935 else if (regname[0] == 'v')
b7d7dc63 7936 regnum += 77;
75e21f08
JJ
7937 }
7938 else if (regname[0] == 'c' && regname[1] == 'r')
7939 {
7940 p = regname + 2 + (regname[2] == '.');
7941 if (p[0] < '0' || p[0] > '7' || p[1])
b7d7dc63 7942 return -1;
75e21f08
JJ
7943 regnum = p[0] - '0' + 68;
7944 }
7945 return regnum;
7946}
This page took 1.669354 seconds and 4 git commands to generate.