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