39ed40bd40f081719f7213a12057bbd38a48d576
[deliverable/binutils-gdb.git] / gas / config / tc-ia64.c
1 /* tc-ia64.c -- Assembler for the HP/Intel IA-64 architecture.
2 Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004
3 Free Software Foundation, Inc.
4 Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
5
6 This file is part of GAS, the GNU Assembler.
7
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to
20 the Free Software Foundation, 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
22
23 /*
24 TODO:
25
26 - optional operands
27 - directives:
28 .eb
29 .estate
30 .lb
31 .popsection
32 .previous
33 .psr
34 .pushsection
35 - labels are wrong if automatic alignment is introduced
36 (e.g., checkout the second real10 definition in test-data.s)
37 - DV-related stuff:
38 <reg>.safe_across_calls and any other DV-related directives I don't
39 have documentation for.
40 verify mod-sched-brs reads/writes are checked/marked (and other
41 notes)
42
43 */
44
45 #include "as.h"
46 #include "safe-ctype.h"
47 #include "dwarf2dbg.h"
48 #include "subsegs.h"
49
50 #include "opcode/ia64.h"
51
52 #include "elf/ia64.h"
53
54 #define NELEMS(a) ((int) (sizeof (a)/sizeof ((a)[0])))
55 #define MIN(a,b) ((a) < (b) ? (a) : (b))
56
57 #define NUM_SLOTS 4
58 #define PREV_SLOT md.slot[(md.curr_slot + NUM_SLOTS - 1) % NUM_SLOTS]
59 #define CURR_SLOT md.slot[md.curr_slot]
60
61 #define O_pseudo_fixup (O_max + 1)
62
63 enum special_section
64 {
65 /* IA-64 ABI section pseudo-ops. */
66 SPECIAL_SECTION_BSS = 0,
67 SPECIAL_SECTION_SBSS,
68 SPECIAL_SECTION_SDATA,
69 SPECIAL_SECTION_RODATA,
70 SPECIAL_SECTION_COMMENT,
71 SPECIAL_SECTION_UNWIND,
72 SPECIAL_SECTION_UNWIND_INFO,
73 /* HPUX specific section pseudo-ops. */
74 SPECIAL_SECTION_INIT_ARRAY,
75 SPECIAL_SECTION_FINI_ARRAY,
76 };
77
78 enum reloc_func
79 {
80 FUNC_DTP_MODULE,
81 FUNC_DTP_RELATIVE,
82 FUNC_FPTR_RELATIVE,
83 FUNC_GP_RELATIVE,
84 FUNC_LT_RELATIVE,
85 FUNC_LT_RELATIVE_X,
86 FUNC_PC_RELATIVE,
87 FUNC_PLT_RELATIVE,
88 FUNC_SEC_RELATIVE,
89 FUNC_SEG_RELATIVE,
90 FUNC_TP_RELATIVE,
91 FUNC_LTV_RELATIVE,
92 FUNC_LT_FPTR_RELATIVE,
93 FUNC_LT_DTP_MODULE,
94 FUNC_LT_DTP_RELATIVE,
95 FUNC_LT_TP_RELATIVE,
96 FUNC_IPLT_RELOC,
97 };
98
99 enum reg_symbol
100 {
101 REG_GR = 0,
102 REG_FR = (REG_GR + 128),
103 REG_AR = (REG_FR + 128),
104 REG_CR = (REG_AR + 128),
105 REG_P = (REG_CR + 128),
106 REG_BR = (REG_P + 64),
107 REG_IP = (REG_BR + 8),
108 REG_CFM,
109 REG_PR,
110 REG_PR_ROT,
111 REG_PSR,
112 REG_PSR_L,
113 REG_PSR_UM,
114 /* The following are pseudo-registers for use by gas only. */
115 IND_CPUID,
116 IND_DBR,
117 IND_DTR,
118 IND_ITR,
119 IND_IBR,
120 IND_MEM,
121 IND_MSR,
122 IND_PKR,
123 IND_PMC,
124 IND_PMD,
125 IND_RR,
126 /* The following pseudo-registers are used for unwind directives only: */
127 REG_PSP,
128 REG_PRIUNAT,
129 REG_NUM
130 };
131
132 enum dynreg_type
133 {
134 DYNREG_GR = 0, /* dynamic general purpose register */
135 DYNREG_FR, /* dynamic floating point register */
136 DYNREG_PR, /* dynamic predicate register */
137 DYNREG_NUM_TYPES
138 };
139
140 enum operand_match_result
141 {
142 OPERAND_MATCH,
143 OPERAND_OUT_OF_RANGE,
144 OPERAND_MISMATCH
145 };
146
147 /* On the ia64, we can't know the address of a text label until the
148 instructions are packed into a bundle. To handle this, we keep
149 track of the list of labels that appear in front of each
150 instruction. */
151 struct label_fix
152 {
153 struct label_fix *next;
154 struct symbol *sym;
155 };
156
157 /* This is the endianness of the current section. */
158 extern int target_big_endian;
159
160 /* This is the default endianness. */
161 static int default_big_endian = TARGET_BYTES_BIG_ENDIAN;
162
163 void (*ia64_number_to_chars) PARAMS ((char *, valueT, int));
164
165 static void ia64_float_to_chars_bigendian
166 PARAMS ((char *, LITTLENUM_TYPE *, int));
167 static void ia64_float_to_chars_littleendian
168 PARAMS ((char *, LITTLENUM_TYPE *, int));
169 static void (*ia64_float_to_chars)
170 PARAMS ((char *, LITTLENUM_TYPE *, int));
171
172 static struct hash_control *alias_hash;
173 static struct hash_control *alias_name_hash;
174 static struct hash_control *secalias_hash;
175 static struct hash_control *secalias_name_hash;
176
177 /* Characters which always start a comment. */
178 const char comment_chars[] = "";
179
180 /* Characters which start a comment at the beginning of a line. */
181 const char line_comment_chars[] = "#";
182
183 /* Characters which may be used to separate multiple commands on a
184 single line. */
185 const char line_separator_chars[] = ";";
186
187 /* Characters which are used to indicate an exponent in a floating
188 point number. */
189 const char EXP_CHARS[] = "eE";
190
191 /* Characters which mean that a number is a floating point constant,
192 as in 0d1.0. */
193 const char FLT_CHARS[] = "rRsSfFdDxXpP";
194
195 /* ia64-specific option processing: */
196
197 const char *md_shortopts = "m:N:x::";
198
199 struct option md_longopts[] =
200 {
201 #define OPTION_MCONSTANT_GP (OPTION_MD_BASE + 1)
202 {"mconstant-gp", no_argument, NULL, OPTION_MCONSTANT_GP},
203 #define OPTION_MAUTO_PIC (OPTION_MD_BASE + 2)
204 {"mauto-pic", no_argument, NULL, OPTION_MAUTO_PIC}
205 };
206
207 size_t md_longopts_size = sizeof (md_longopts);
208
209 static struct
210 {
211 struct hash_control *pseudo_hash; /* pseudo opcode hash table */
212 struct hash_control *reg_hash; /* register name hash table */
213 struct hash_control *dynreg_hash; /* dynamic register hash table */
214 struct hash_control *const_hash; /* constant hash table */
215 struct hash_control *entry_hash; /* code entry hint hash table */
216
217 symbolS *regsym[REG_NUM];
218
219 /* If X_op is != O_absent, the registername for the instruction's
220 qualifying predicate. If NULL, p0 is assumed for instructions
221 that are predicatable. */
222 expressionS qp;
223
224 unsigned int
225 manual_bundling : 1,
226 debug_dv: 1,
227 detect_dv: 1,
228 explicit_mode : 1, /* which mode we're in */
229 default_explicit_mode : 1, /* which mode is the default */
230 mode_explicitly_set : 1, /* was the current mode explicitly set? */
231 auto_align : 1,
232 keep_pending_output : 1;
233
234 /* What to do when something is wrong with unwind directives. */
235 enum
236 {
237 unwind_check_warning,
238 unwind_check_error
239 } unwind_check;
240
241 /* Each bundle consists of up to three instructions. We keep
242 track of four most recent instructions so we can correctly set
243 the end_of_insn_group for the last instruction in a bundle. */
244 int curr_slot;
245 int num_slots_in_use;
246 struct slot
247 {
248 unsigned int
249 end_of_insn_group : 1,
250 manual_bundling_on : 1,
251 manual_bundling_off : 1,
252 loc_directive_seen : 1;
253 signed char user_template; /* user-selected template, if any */
254 unsigned char qp_regno; /* qualifying predicate */
255 /* This duplicates a good fraction of "struct fix" but we
256 can't use a "struct fix" instead since we can't call
257 fix_new_exp() until we know the address of the instruction. */
258 int num_fixups;
259 struct insn_fix
260 {
261 bfd_reloc_code_real_type code;
262 enum ia64_opnd opnd; /* type of operand in need of fix */
263 unsigned int is_pcrel : 1; /* is operand pc-relative? */
264 expressionS expr; /* the value to be inserted */
265 }
266 fixup[2]; /* at most two fixups per insn */
267 struct ia64_opcode *idesc;
268 struct label_fix *label_fixups;
269 struct label_fix *tag_fixups;
270 struct unw_rec_list *unwind_record; /* Unwind directive. */
271 expressionS opnd[6];
272 char *src_file;
273 unsigned int src_line;
274 struct dwarf2_line_info debug_line;
275 }
276 slot[NUM_SLOTS];
277
278 segT last_text_seg;
279
280 struct dynreg
281 {
282 struct dynreg *next; /* next dynamic register */
283 const char *name;
284 unsigned short base; /* the base register number */
285 unsigned short num_regs; /* # of registers in this set */
286 }
287 *dynreg[DYNREG_NUM_TYPES], in, loc, out, rot;
288
289 flagword flags; /* ELF-header flags */
290
291 struct mem_offset {
292 unsigned hint:1; /* is this hint currently valid? */
293 bfd_vma offset; /* mem.offset offset */
294 bfd_vma base; /* mem.offset base */
295 } mem_offset;
296
297 int path; /* number of alt. entry points seen */
298 const char **entry_labels; /* labels of all alternate paths in
299 the current DV-checking block. */
300 int maxpaths; /* size currently allocated for
301 entry_labels */
302
303 int pointer_size; /* size in bytes of a pointer */
304 int pointer_size_shift; /* shift size of a pointer for alignment */
305 }
306 md;
307
308 /* application registers: */
309
310 #define AR_K0 0
311 #define AR_K7 7
312 #define AR_RSC 16
313 #define AR_BSP 17
314 #define AR_BSPSTORE 18
315 #define AR_RNAT 19
316 #define AR_UNAT 36
317 #define AR_FPSR 40
318 #define AR_ITC 44
319 #define AR_PFS 64
320 #define AR_LC 65
321
322 static const struct
323 {
324 const char *name;
325 int regnum;
326 }
327 ar[] =
328 {
329 {"ar.k0", 0}, {"ar.k1", 1}, {"ar.k2", 2}, {"ar.k3", 3},
330 {"ar.k4", 4}, {"ar.k5", 5}, {"ar.k6", 6}, {"ar.k7", 7},
331 {"ar.rsc", 16}, {"ar.bsp", 17},
332 {"ar.bspstore", 18}, {"ar.rnat", 19},
333 {"ar.fcr", 21}, {"ar.eflag", 24},
334 {"ar.csd", 25}, {"ar.ssd", 26},
335 {"ar.cflg", 27}, {"ar.fsr", 28},
336 {"ar.fir", 29}, {"ar.fdr", 30},
337 {"ar.ccv", 32}, {"ar.unat", 36},
338 {"ar.fpsr", 40}, {"ar.itc", 44},
339 {"ar.pfs", 64}, {"ar.lc", 65},
340 {"ar.ec", 66},
341 };
342
343 #define CR_IPSR 16
344 #define CR_ISR 17
345 #define CR_IIP 19
346 #define CR_IFA 20
347 #define CR_ITIR 21
348 #define CR_IIPA 22
349 #define CR_IFS 23
350 #define CR_IIM 24
351 #define CR_IHA 25
352 #define CR_IVR 65
353 #define CR_TPR 66
354 #define CR_EOI 67
355 #define CR_IRR0 68
356 #define CR_IRR3 71
357 #define CR_LRR0 80
358 #define CR_LRR1 81
359
360 /* control registers: */
361 static const struct
362 {
363 const char *name;
364 int regnum;
365 }
366 cr[] =
367 {
368 {"cr.dcr", 0},
369 {"cr.itm", 1},
370 {"cr.iva", 2},
371 {"cr.pta", 8},
372 {"cr.gpta", 9},
373 {"cr.ipsr", 16},
374 {"cr.isr", 17},
375 {"cr.iip", 19},
376 {"cr.ifa", 20},
377 {"cr.itir", 21},
378 {"cr.iipa", 22},
379 {"cr.ifs", 23},
380 {"cr.iim", 24},
381 {"cr.iha", 25},
382 {"cr.lid", 64},
383 {"cr.ivr", 65},
384 {"cr.tpr", 66},
385 {"cr.eoi", 67},
386 {"cr.irr0", 68},
387 {"cr.irr1", 69},
388 {"cr.irr2", 70},
389 {"cr.irr3", 71},
390 {"cr.itv", 72},
391 {"cr.pmv", 73},
392 {"cr.cmcv", 74},
393 {"cr.lrr0", 80},
394 {"cr.lrr1", 81}
395 };
396
397 #define PSR_MFL 4
398 #define PSR_IC 13
399 #define PSR_DFL 18
400 #define PSR_CPL 32
401
402 static const struct const_desc
403 {
404 const char *name;
405 valueT value;
406 }
407 const_bits[] =
408 {
409 /* PSR constant masks: */
410
411 /* 0: reserved */
412 {"psr.be", ((valueT) 1) << 1},
413 {"psr.up", ((valueT) 1) << 2},
414 {"psr.ac", ((valueT) 1) << 3},
415 {"psr.mfl", ((valueT) 1) << 4},
416 {"psr.mfh", ((valueT) 1) << 5},
417 /* 6-12: reserved */
418 {"psr.ic", ((valueT) 1) << 13},
419 {"psr.i", ((valueT) 1) << 14},
420 {"psr.pk", ((valueT) 1) << 15},
421 /* 16: reserved */
422 {"psr.dt", ((valueT) 1) << 17},
423 {"psr.dfl", ((valueT) 1) << 18},
424 {"psr.dfh", ((valueT) 1) << 19},
425 {"psr.sp", ((valueT) 1) << 20},
426 {"psr.pp", ((valueT) 1) << 21},
427 {"psr.di", ((valueT) 1) << 22},
428 {"psr.si", ((valueT) 1) << 23},
429 {"psr.db", ((valueT) 1) << 24},
430 {"psr.lp", ((valueT) 1) << 25},
431 {"psr.tb", ((valueT) 1) << 26},
432 {"psr.rt", ((valueT) 1) << 27},
433 /* 28-31: reserved */
434 /* 32-33: cpl (current privilege level) */
435 {"psr.is", ((valueT) 1) << 34},
436 {"psr.mc", ((valueT) 1) << 35},
437 {"psr.it", ((valueT) 1) << 36},
438 {"psr.id", ((valueT) 1) << 37},
439 {"psr.da", ((valueT) 1) << 38},
440 {"psr.dd", ((valueT) 1) << 39},
441 {"psr.ss", ((valueT) 1) << 40},
442 /* 41-42: ri (restart instruction) */
443 {"psr.ed", ((valueT) 1) << 43},
444 {"psr.bn", ((valueT) 1) << 44},
445 };
446
447 /* indirect register-sets/memory: */
448
449 static const struct
450 {
451 const char *name;
452 int regnum;
453 }
454 indirect_reg[] =
455 {
456 { "CPUID", IND_CPUID },
457 { "cpuid", IND_CPUID },
458 { "dbr", IND_DBR },
459 { "dtr", IND_DTR },
460 { "itr", IND_ITR },
461 { "ibr", IND_IBR },
462 { "msr", IND_MSR },
463 { "pkr", IND_PKR },
464 { "pmc", IND_PMC },
465 { "pmd", IND_PMD },
466 { "rr", IND_RR },
467 };
468
469 /* Pseudo functions used to indicate relocation types (these functions
470 start with an at sign (@). */
471 static struct
472 {
473 const char *name;
474 enum pseudo_type
475 {
476 PSEUDO_FUNC_NONE,
477 PSEUDO_FUNC_RELOC,
478 PSEUDO_FUNC_CONST,
479 PSEUDO_FUNC_REG,
480 PSEUDO_FUNC_FLOAT
481 }
482 type;
483 union
484 {
485 unsigned long ival;
486 symbolS *sym;
487 }
488 u;
489 }
490 pseudo_func[] =
491 {
492 /* reloc pseudo functions (these must come first!): */
493 { "dtpmod", PSEUDO_FUNC_RELOC, { 0 } },
494 { "dtprel", PSEUDO_FUNC_RELOC, { 0 } },
495 { "fptr", PSEUDO_FUNC_RELOC, { 0 } },
496 { "gprel", PSEUDO_FUNC_RELOC, { 0 } },
497 { "ltoff", PSEUDO_FUNC_RELOC, { 0 } },
498 { "ltoffx", PSEUDO_FUNC_RELOC, { 0 } },
499 { "pcrel", PSEUDO_FUNC_RELOC, { 0 } },
500 { "pltoff", PSEUDO_FUNC_RELOC, { 0 } },
501 { "secrel", PSEUDO_FUNC_RELOC, { 0 } },
502 { "segrel", PSEUDO_FUNC_RELOC, { 0 } },
503 { "tprel", PSEUDO_FUNC_RELOC, { 0 } },
504 { "ltv", PSEUDO_FUNC_RELOC, { 0 } },
505 { NULL, 0, { 0 } }, /* placeholder for FUNC_LT_FPTR_RELATIVE */
506 { NULL, 0, { 0 } }, /* placeholder for FUNC_LT_DTP_MODULE */
507 { NULL, 0, { 0 } }, /* placeholder for FUNC_LT_DTP_RELATIVE */
508 { NULL, 0, { 0 } }, /* placeholder for FUNC_LT_TP_RELATIVE */
509 { "iplt", PSEUDO_FUNC_RELOC, { 0 } },
510
511 /* mbtype4 constants: */
512 { "alt", PSEUDO_FUNC_CONST, { 0xa } },
513 { "brcst", PSEUDO_FUNC_CONST, { 0x0 } },
514 { "mix", PSEUDO_FUNC_CONST, { 0x8 } },
515 { "rev", PSEUDO_FUNC_CONST, { 0xb } },
516 { "shuf", PSEUDO_FUNC_CONST, { 0x9 } },
517
518 /* fclass constants: */
519 { "nat", PSEUDO_FUNC_CONST, { 0x100 } },
520 { "qnan", PSEUDO_FUNC_CONST, { 0x080 } },
521 { "snan", PSEUDO_FUNC_CONST, { 0x040 } },
522 { "pos", PSEUDO_FUNC_CONST, { 0x001 } },
523 { "neg", PSEUDO_FUNC_CONST, { 0x002 } },
524 { "zero", PSEUDO_FUNC_CONST, { 0x004 } },
525 { "unorm", PSEUDO_FUNC_CONST, { 0x008 } },
526 { "norm", PSEUDO_FUNC_CONST, { 0x010 } },
527 { "inf", PSEUDO_FUNC_CONST, { 0x020 } },
528
529 { "natval", PSEUDO_FUNC_CONST, { 0x100 } }, /* old usage */
530
531 /* hint constants: */
532 { "pause", PSEUDO_FUNC_CONST, { 0x0 } },
533
534 /* unwind-related constants: */
535 { "svr4", PSEUDO_FUNC_CONST, { ELFOSABI_NONE } },
536 { "hpux", PSEUDO_FUNC_CONST, { ELFOSABI_HPUX } },
537 { "nt", PSEUDO_FUNC_CONST, { 2 } }, /* conflicts w/ELFOSABI_NETBSD */
538 { "linux", PSEUDO_FUNC_CONST, { ELFOSABI_LINUX } },
539 { "freebsd", PSEUDO_FUNC_CONST, { ELFOSABI_FREEBSD } },
540 { "openvms", PSEUDO_FUNC_CONST, { ELFOSABI_OPENVMS } },
541 { "nsk", PSEUDO_FUNC_CONST, { ELFOSABI_NSK } },
542
543 /* unwind-related registers: */
544 { "priunat",PSEUDO_FUNC_REG, { REG_PRIUNAT } }
545 };
546
547 /* 41-bit nop opcodes (one per unit): */
548 static const bfd_vma nop[IA64_NUM_UNITS] =
549 {
550 0x0000000000LL, /* NIL => break 0 */
551 0x0008000000LL, /* I-unit nop */
552 0x0008000000LL, /* M-unit nop */
553 0x4000000000LL, /* B-unit nop */
554 0x0008000000LL, /* F-unit nop */
555 0x0008000000LL, /* L-"unit" nop */
556 0x0008000000LL, /* X-unit nop */
557 };
558
559 /* Can't be `const' as it's passed to input routines (which have the
560 habit of setting temporary sentinels. */
561 static char special_section_name[][20] =
562 {
563 {".bss"}, {".sbss"}, {".sdata"}, {".rodata"}, {".comment"},
564 {".IA_64.unwind"}, {".IA_64.unwind_info"},
565 {".init_array"}, {".fini_array"}
566 };
567
568 /* The best template for a particular sequence of up to three
569 instructions: */
570 #define N IA64_NUM_TYPES
571 static unsigned char best_template[N][N][N];
572 #undef N
573
574 /* Resource dependencies currently in effect */
575 static struct rsrc {
576 int depind; /* dependency index */
577 const struct ia64_dependency *dependency; /* actual dependency */
578 unsigned specific:1, /* is this a specific bit/regno? */
579 link_to_qp_branch:1; /* will a branch on the same QP clear it?*/
580 int index; /* specific regno/bit within dependency */
581 int note; /* optional qualifying note (0 if none) */
582 #define STATE_NONE 0
583 #define STATE_STOP 1
584 #define STATE_SRLZ 2
585 int insn_srlz; /* current insn serialization state */
586 int data_srlz; /* current data serialization state */
587 int qp_regno; /* qualifying predicate for this usage */
588 char *file; /* what file marked this dependency */
589 unsigned int line; /* what line marked this dependency */
590 struct mem_offset mem_offset; /* optional memory offset hint */
591 enum { CMP_NONE, CMP_OR, CMP_AND } cmp_type; /* OR or AND compare? */
592 int path; /* corresponding code entry index */
593 } *regdeps = NULL;
594 static int regdepslen = 0;
595 static int regdepstotlen = 0;
596 static const char *dv_mode[] = { "RAW", "WAW", "WAR" };
597 static const char *dv_sem[] = { "none", "implied", "impliedf",
598 "data", "instr", "specific", "stop", "other" };
599 static const char *dv_cmp_type[] = { "none", "OR", "AND" };
600
601 /* Current state of PR mutexation */
602 static struct qpmutex {
603 valueT prmask;
604 int path;
605 } *qp_mutexes = NULL; /* QP mutex bitmasks */
606 static int qp_mutexeslen = 0;
607 static int qp_mutexestotlen = 0;
608 static valueT qp_safe_across_calls = 0;
609
610 /* Current state of PR implications */
611 static struct qp_imply {
612 unsigned p1:6;
613 unsigned p2:6;
614 unsigned p2_branched:1;
615 int path;
616 } *qp_implies = NULL;
617 static int qp_implieslen = 0;
618 static int qp_impliestotlen = 0;
619
620 /* Keep track of static GR values so that indirect register usage can
621 sometimes be tracked. */
622 static struct gr {
623 unsigned known:1;
624 int path;
625 valueT value;
626 } gr_values[128] = {{ 1, 0, 0 }};
627
628 /* Remember the alignment frag. */
629 static fragS *align_frag;
630
631 /* These are the routines required to output the various types of
632 unwind records. */
633
634 /* A slot_number is a frag address plus the slot index (0-2). We use the
635 frag address here so that if there is a section switch in the middle of
636 a function, then instructions emitted to a different section are not
637 counted. Since there may be more than one frag for a function, this
638 means we also need to keep track of which frag this address belongs to
639 so we can compute inter-frag distances. This also nicely solves the
640 problem with nops emitted for align directives, which can't easily be
641 counted, but can easily be derived from frag sizes. */
642
643 typedef struct unw_rec_list {
644 unwind_record r;
645 unsigned long slot_number;
646 fragS *slot_frag;
647 unsigned long next_slot_number;
648 fragS *next_slot_frag;
649 struct unw_rec_list *next;
650 } unw_rec_list;
651
652 #define SLOT_NUM_NOT_SET (unsigned)-1
653
654 /* Linked list of saved prologue counts. A very poor
655 implementation of a map from label numbers to prologue counts. */
656 typedef struct label_prologue_count
657 {
658 struct label_prologue_count *next;
659 unsigned long label_number;
660 unsigned int prologue_count;
661 } label_prologue_count;
662
663 static struct
664 {
665 /* Maintain a list of unwind entries for the current function. */
666 unw_rec_list *list;
667 unw_rec_list *tail;
668
669 /* Any unwind entires that should be attached to the current slot
670 that an insn is being constructed for. */
671 unw_rec_list *current_entry;
672
673 /* These are used to create the unwind table entry for this function. */
674 symbolS *proc_start;
675 symbolS *info; /* pointer to unwind info */
676 symbolS *personality_routine;
677 segT saved_text_seg;
678 subsegT saved_text_subseg;
679 unsigned int force_unwind_entry : 1; /* force generation of unwind entry? */
680
681 /* TRUE if processing unwind directives in a prologue region. */
682 unsigned int prologue : 1;
683 unsigned int prologue_mask : 4;
684 unsigned int body : 1;
685 unsigned int insn : 1;
686 unsigned int prologue_count; /* number of .prologues seen so far */
687 /* Prologue counts at previous .label_state directives. */
688 struct label_prologue_count * saved_prologue_counts;
689 } unwind;
690
691 /* The input value is a negated offset from psp, and specifies an address
692 psp - offset. The encoded value is psp + 16 - (4 * offset). Thus we
693 must add 16 and divide by 4 to get the encoded value. */
694
695 #define ENCODED_PSP_OFFSET(OFFSET) (((OFFSET) + 16) / 4)
696
697 typedef void (*vbyte_func) PARAMS ((int, char *, char *));
698
699 /* Forward declarations: */
700 static void set_section PARAMS ((char *name));
701 static unsigned int set_regstack PARAMS ((unsigned int, unsigned int,
702 unsigned int, unsigned int));
703 static void dot_align (int);
704 static void dot_radix PARAMS ((int));
705 static void dot_special_section PARAMS ((int));
706 static void dot_proc PARAMS ((int));
707 static void dot_fframe PARAMS ((int));
708 static void dot_vframe PARAMS ((int));
709 static void dot_vframesp PARAMS ((int));
710 static void dot_vframepsp PARAMS ((int));
711 static void dot_save PARAMS ((int));
712 static void dot_restore PARAMS ((int));
713 static void dot_restorereg PARAMS ((int));
714 static void dot_restorereg_p PARAMS ((int));
715 static void dot_handlerdata PARAMS ((int));
716 static void dot_unwentry PARAMS ((int));
717 static void dot_altrp PARAMS ((int));
718 static void dot_savemem PARAMS ((int));
719 static void dot_saveg PARAMS ((int));
720 static void dot_savef PARAMS ((int));
721 static void dot_saveb PARAMS ((int));
722 static void dot_savegf PARAMS ((int));
723 static void dot_spill PARAMS ((int));
724 static void dot_spillreg PARAMS ((int));
725 static void dot_spillmem PARAMS ((int));
726 static void dot_spillreg_p PARAMS ((int));
727 static void dot_spillmem_p PARAMS ((int));
728 static void dot_label_state PARAMS ((int));
729 static void dot_copy_state PARAMS ((int));
730 static void dot_unwabi PARAMS ((int));
731 static void dot_personality PARAMS ((int));
732 static void dot_body PARAMS ((int));
733 static void dot_prologue PARAMS ((int));
734 static void dot_endp PARAMS ((int));
735 static void dot_template PARAMS ((int));
736 static void dot_regstk PARAMS ((int));
737 static void dot_rot PARAMS ((int));
738 static void dot_byteorder PARAMS ((int));
739 static void dot_psr PARAMS ((int));
740 static void dot_alias PARAMS ((int));
741 static void dot_ln PARAMS ((int));
742 static char *parse_section_name PARAMS ((void));
743 static void dot_xdata PARAMS ((int));
744 static void stmt_float_cons PARAMS ((int));
745 static void stmt_cons_ua PARAMS ((int));
746 static void dot_xfloat_cons PARAMS ((int));
747 static void dot_xstringer PARAMS ((int));
748 static void dot_xdata_ua PARAMS ((int));
749 static void dot_xfloat_cons_ua PARAMS ((int));
750 static void print_prmask PARAMS ((valueT mask));
751 static void dot_pred_rel PARAMS ((int));
752 static void dot_reg_val PARAMS ((int));
753 static void dot_serialize PARAMS ((int));
754 static void dot_dv_mode PARAMS ((int));
755 static void dot_entry PARAMS ((int));
756 static void dot_mem_offset PARAMS ((int));
757 static void add_unwind_entry PARAMS((unw_rec_list *ptr));
758 static symbolS *declare_register PARAMS ((const char *name, int regnum));
759 static void declare_register_set PARAMS ((const char *, int, int));
760 static unsigned int operand_width PARAMS ((enum ia64_opnd));
761 static enum operand_match_result operand_match PARAMS ((const struct ia64_opcode *idesc,
762 int index,
763 expressionS *e));
764 static int parse_operand PARAMS ((expressionS *e));
765 static struct ia64_opcode * parse_operands PARAMS ((struct ia64_opcode *));
766 static void build_insn PARAMS ((struct slot *, bfd_vma *));
767 static void emit_one_bundle PARAMS ((void));
768 static void fix_insn PARAMS ((fixS *, const struct ia64_operand *, valueT));
769 static bfd_reloc_code_real_type ia64_gen_real_reloc_type PARAMS ((struct symbol *sym,
770 bfd_reloc_code_real_type r_type));
771 static void insn_group_break PARAMS ((int, int, int));
772 static void mark_resource PARAMS ((struct ia64_opcode *, const struct ia64_dependency *,
773 struct rsrc *, int depind, int path));
774 static void add_qp_mutex PARAMS((valueT mask));
775 static void add_qp_imply PARAMS((int p1, int p2));
776 static void clear_qp_branch_flag PARAMS((valueT mask));
777 static void clear_qp_mutex PARAMS((valueT mask));
778 static void clear_qp_implies PARAMS((valueT p1_mask, valueT p2_mask));
779 static int has_suffix_p PARAMS((const char *, const char *));
780 static void clear_register_values PARAMS ((void));
781 static void print_dependency PARAMS ((const char *action, int depind));
782 static void instruction_serialization PARAMS ((void));
783 static void data_serialization PARAMS ((void));
784 static void remove_marked_resource PARAMS ((struct rsrc *));
785 static int is_conditional_branch PARAMS ((struct ia64_opcode *));
786 static int is_taken_branch PARAMS ((struct ia64_opcode *));
787 static int is_interruption_or_rfi PARAMS ((struct ia64_opcode *));
788 static int depends_on PARAMS ((int, struct ia64_opcode *));
789 static int specify_resource PARAMS ((const struct ia64_dependency *,
790 struct ia64_opcode *, int, struct rsrc [], int, int));
791 static int check_dv PARAMS((struct ia64_opcode *idesc));
792 static void check_dependencies PARAMS((struct ia64_opcode *));
793 static void mark_resources PARAMS((struct ia64_opcode *));
794 static void update_dependencies PARAMS((struct ia64_opcode *));
795 static void note_register_values PARAMS((struct ia64_opcode *));
796 static int qp_mutex PARAMS ((int, int, int));
797 static int resources_match PARAMS ((struct rsrc *, struct ia64_opcode *, int, int, int));
798 static void output_vbyte_mem PARAMS ((int, char *, char *));
799 static void count_output PARAMS ((int, char *, char *));
800 static void output_R1_format PARAMS ((vbyte_func, unw_record_type, int));
801 static void output_R2_format PARAMS ((vbyte_func, int, int, unsigned long));
802 static void output_R3_format PARAMS ((vbyte_func, unw_record_type, unsigned long));
803 static void output_P1_format PARAMS ((vbyte_func, int));
804 static void output_P2_format PARAMS ((vbyte_func, int, int));
805 static void output_P3_format PARAMS ((vbyte_func, unw_record_type, int));
806 static void output_P4_format PARAMS ((vbyte_func, unsigned char *, unsigned long));
807 static void output_P5_format PARAMS ((vbyte_func, int, unsigned long));
808 static void output_P6_format PARAMS ((vbyte_func, unw_record_type, int));
809 static void output_P7_format PARAMS ((vbyte_func, unw_record_type, unsigned long, unsigned long));
810 static void output_P8_format PARAMS ((vbyte_func, unw_record_type, unsigned long));
811 static void output_P9_format PARAMS ((vbyte_func, int, int));
812 static void output_P10_format PARAMS ((vbyte_func, int, int));
813 static void output_B1_format PARAMS ((vbyte_func, unw_record_type, unsigned long));
814 static void output_B2_format PARAMS ((vbyte_func, unsigned long, unsigned long));
815 static void output_B3_format PARAMS ((vbyte_func, unsigned long, unsigned long));
816 static void output_B4_format PARAMS ((vbyte_func, unw_record_type, unsigned long));
817 static char format_ab_reg PARAMS ((int, int));
818 static void output_X1_format PARAMS ((vbyte_func, unw_record_type, int, int, unsigned long,
819 unsigned long));
820 static void output_X2_format PARAMS ((vbyte_func, int, int, int, int, int, unsigned long));
821 static void output_X3_format PARAMS ((vbyte_func, unw_record_type, int, int, int, unsigned long,
822 unsigned long));
823 static void output_X4_format PARAMS ((vbyte_func, int, int, int, int, int, int, unsigned long));
824 static unw_rec_list *output_endp PARAMS ((void));
825 static unw_rec_list *output_prologue PARAMS ((void));
826 static unw_rec_list *output_prologue_gr PARAMS ((unsigned int, unsigned int));
827 static unw_rec_list *output_body PARAMS ((void));
828 static unw_rec_list *output_mem_stack_f PARAMS ((unsigned int));
829 static unw_rec_list *output_mem_stack_v PARAMS ((void));
830 static unw_rec_list *output_psp_gr PARAMS ((unsigned int));
831 static unw_rec_list *output_psp_sprel PARAMS ((unsigned int));
832 static unw_rec_list *output_rp_when PARAMS ((void));
833 static unw_rec_list *output_rp_gr PARAMS ((unsigned int));
834 static unw_rec_list *output_rp_br PARAMS ((unsigned int));
835 static unw_rec_list *output_rp_psprel PARAMS ((unsigned int));
836 static unw_rec_list *output_rp_sprel PARAMS ((unsigned int));
837 static unw_rec_list *output_pfs_when PARAMS ((void));
838 static unw_rec_list *output_pfs_gr PARAMS ((unsigned int));
839 static unw_rec_list *output_pfs_psprel PARAMS ((unsigned int));
840 static unw_rec_list *output_pfs_sprel PARAMS ((unsigned int));
841 static unw_rec_list *output_preds_when PARAMS ((void));
842 static unw_rec_list *output_preds_gr PARAMS ((unsigned int));
843 static unw_rec_list *output_preds_psprel PARAMS ((unsigned int));
844 static unw_rec_list *output_preds_sprel PARAMS ((unsigned int));
845 static unw_rec_list *output_fr_mem PARAMS ((unsigned int));
846 static unw_rec_list *output_frgr_mem PARAMS ((unsigned int, unsigned int));
847 static unw_rec_list *output_gr_gr PARAMS ((unsigned int, unsigned int));
848 static unw_rec_list *output_gr_mem PARAMS ((unsigned int));
849 static unw_rec_list *output_br_mem PARAMS ((unsigned int));
850 static unw_rec_list *output_br_gr PARAMS ((unsigned int, unsigned int));
851 static unw_rec_list *output_spill_base PARAMS ((unsigned int));
852 static unw_rec_list *output_unat_when PARAMS ((void));
853 static unw_rec_list *output_unat_gr PARAMS ((unsigned int));
854 static unw_rec_list *output_unat_psprel PARAMS ((unsigned int));
855 static unw_rec_list *output_unat_sprel PARAMS ((unsigned int));
856 static unw_rec_list *output_lc_when PARAMS ((void));
857 static unw_rec_list *output_lc_gr PARAMS ((unsigned int));
858 static unw_rec_list *output_lc_psprel PARAMS ((unsigned int));
859 static unw_rec_list *output_lc_sprel PARAMS ((unsigned int));
860 static unw_rec_list *output_fpsr_when PARAMS ((void));
861 static unw_rec_list *output_fpsr_gr PARAMS ((unsigned int));
862 static unw_rec_list *output_fpsr_psprel PARAMS ((unsigned int));
863 static unw_rec_list *output_fpsr_sprel PARAMS ((unsigned int));
864 static unw_rec_list *output_priunat_when_gr PARAMS ((void));
865 static unw_rec_list *output_priunat_when_mem PARAMS ((void));
866 static unw_rec_list *output_priunat_gr PARAMS ((unsigned int));
867 static unw_rec_list *output_priunat_psprel PARAMS ((unsigned int));
868 static unw_rec_list *output_priunat_sprel PARAMS ((unsigned int));
869 static unw_rec_list *output_bsp_when PARAMS ((void));
870 static unw_rec_list *output_bsp_gr PARAMS ((unsigned int));
871 static unw_rec_list *output_bsp_psprel PARAMS ((unsigned int));
872 static unw_rec_list *output_bsp_sprel PARAMS ((unsigned int));
873 static unw_rec_list *output_bspstore_when PARAMS ((void));
874 static unw_rec_list *output_bspstore_gr PARAMS ((unsigned int));
875 static unw_rec_list *output_bspstore_psprel PARAMS ((unsigned int));
876 static unw_rec_list *output_bspstore_sprel PARAMS ((unsigned int));
877 static unw_rec_list *output_rnat_when PARAMS ((void));
878 static unw_rec_list *output_rnat_gr PARAMS ((unsigned int));
879 static unw_rec_list *output_rnat_psprel PARAMS ((unsigned int));
880 static unw_rec_list *output_rnat_sprel PARAMS ((unsigned int));
881 static unw_rec_list *output_unwabi PARAMS ((unsigned long, unsigned long));
882 static unw_rec_list *output_epilogue PARAMS ((unsigned long));
883 static unw_rec_list *output_label_state PARAMS ((unsigned long));
884 static unw_rec_list *output_copy_state PARAMS ((unsigned long));
885 static unw_rec_list *output_spill_psprel PARAMS ((unsigned int, unsigned int, unsigned int));
886 static unw_rec_list *output_spill_sprel PARAMS ((unsigned int, unsigned int, unsigned int));
887 static unw_rec_list *output_spill_psprel_p PARAMS ((unsigned int, unsigned int, unsigned int,
888 unsigned int));
889 static unw_rec_list *output_spill_sprel_p PARAMS ((unsigned int, unsigned int, unsigned int,
890 unsigned int));
891 static unw_rec_list *output_spill_reg PARAMS ((unsigned int, unsigned int, unsigned int,
892 unsigned int));
893 static unw_rec_list *output_spill_reg_p PARAMS ((unsigned int, unsigned int, unsigned int,
894 unsigned int, unsigned int));
895 static void process_one_record PARAMS ((unw_rec_list *, vbyte_func));
896 static void process_unw_records PARAMS ((unw_rec_list *, vbyte_func));
897 static int calc_record_size PARAMS ((unw_rec_list *));
898 static void set_imask PARAMS ((unw_rec_list *, unsigned long, unsigned long, unsigned int));
899 static unsigned long slot_index PARAMS ((unsigned long, fragS *,
900 unsigned long, fragS *,
901 int));
902 static unw_rec_list *optimize_unw_records PARAMS ((unw_rec_list *));
903 static void fixup_unw_records PARAMS ((unw_rec_list *, int));
904 static int convert_expr_to_ab_reg PARAMS ((expressionS *, unsigned int *, unsigned int *));
905 static int convert_expr_to_xy_reg PARAMS ((expressionS *, unsigned int *, unsigned int *));
906 static unsigned int get_saved_prologue_count PARAMS ((unsigned long));
907 static void save_prologue_count PARAMS ((unsigned long, unsigned int));
908 static void free_saved_prologue_counts PARAMS ((void));
909
910 /* Determine if application register REGNUM resides only in the integer
911 unit (as opposed to the memory unit). */
912 static int
913 ar_is_only_in_integer_unit (int reg)
914 {
915 reg -= REG_AR;
916 return reg >= 64 && reg <= 111;
917 }
918
919 /* Determine if application register REGNUM resides only in the memory
920 unit (as opposed to the integer unit). */
921 static int
922 ar_is_only_in_memory_unit (int reg)
923 {
924 reg -= REG_AR;
925 return reg >= 0 && reg <= 47;
926 }
927
928 /* Switch to section NAME and create section if necessary. It's
929 rather ugly that we have to manipulate input_line_pointer but I
930 don't see any other way to accomplish the same thing without
931 changing obj-elf.c (which may be the Right Thing, in the end). */
932 static void
933 set_section (name)
934 char *name;
935 {
936 char *saved_input_line_pointer;
937
938 saved_input_line_pointer = input_line_pointer;
939 input_line_pointer = name;
940 obj_elf_section (0);
941 input_line_pointer = saved_input_line_pointer;
942 }
943
944 /* Map 's' to SHF_IA_64_SHORT. */
945
946 int
947 ia64_elf_section_letter (letter, ptr_msg)
948 int letter;
949 char **ptr_msg;
950 {
951 if (letter == 's')
952 return SHF_IA_64_SHORT;
953 else if (letter == 'o')
954 return SHF_LINK_ORDER;
955
956 *ptr_msg = _("Bad .section directive: want a,o,s,w,x,M,S,G,T in string");
957 return -1;
958 }
959
960 /* Map SHF_IA_64_SHORT to SEC_SMALL_DATA. */
961
962 flagword
963 ia64_elf_section_flags (flags, attr, type)
964 flagword flags;
965 int attr, type ATTRIBUTE_UNUSED;
966 {
967 if (attr & SHF_IA_64_SHORT)
968 flags |= SEC_SMALL_DATA;
969 return flags;
970 }
971
972 int
973 ia64_elf_section_type (str, len)
974 const char *str;
975 size_t len;
976 {
977 #define STREQ(s) ((len == sizeof (s) - 1) && (strncmp (str, s, sizeof (s) - 1) == 0))
978
979 if (STREQ (ELF_STRING_ia64_unwind_info))
980 return SHT_PROGBITS;
981
982 if (STREQ (ELF_STRING_ia64_unwind_info_once))
983 return SHT_PROGBITS;
984
985 if (STREQ (ELF_STRING_ia64_unwind))
986 return SHT_IA_64_UNWIND;
987
988 if (STREQ (ELF_STRING_ia64_unwind_once))
989 return SHT_IA_64_UNWIND;
990
991 if (STREQ ("unwind"))
992 return SHT_IA_64_UNWIND;
993
994 return -1;
995 #undef STREQ
996 }
997
998 static unsigned int
999 set_regstack (ins, locs, outs, rots)
1000 unsigned int ins, locs, outs, rots;
1001 {
1002 /* Size of frame. */
1003 unsigned int sof;
1004
1005 sof = ins + locs + outs;
1006 if (sof > 96)
1007 {
1008 as_bad ("Size of frame exceeds maximum of 96 registers");
1009 return 0;
1010 }
1011 if (rots > sof)
1012 {
1013 as_warn ("Size of rotating registers exceeds frame size");
1014 return 0;
1015 }
1016 md.in.base = REG_GR + 32;
1017 md.loc.base = md.in.base + ins;
1018 md.out.base = md.loc.base + locs;
1019
1020 md.in.num_regs = ins;
1021 md.loc.num_regs = locs;
1022 md.out.num_regs = outs;
1023 md.rot.num_regs = rots;
1024 return sof;
1025 }
1026
1027 void
1028 ia64_flush_insns ()
1029 {
1030 struct label_fix *lfix;
1031 segT saved_seg;
1032 subsegT saved_subseg;
1033 unw_rec_list *ptr;
1034
1035 if (!md.last_text_seg)
1036 return;
1037
1038 saved_seg = now_seg;
1039 saved_subseg = now_subseg;
1040
1041 subseg_set (md.last_text_seg, 0);
1042
1043 while (md.num_slots_in_use > 0)
1044 emit_one_bundle (); /* force out queued instructions */
1045
1046 /* In case there are labels following the last instruction, resolve
1047 those now: */
1048 for (lfix = CURR_SLOT.label_fixups; lfix; lfix = lfix->next)
1049 {
1050 S_SET_VALUE (lfix->sym, frag_now_fix ());
1051 symbol_set_frag (lfix->sym, frag_now);
1052 }
1053 CURR_SLOT.label_fixups = 0;
1054 for (lfix = CURR_SLOT.tag_fixups; lfix; lfix = lfix->next)
1055 {
1056 S_SET_VALUE (lfix->sym, frag_now_fix ());
1057 symbol_set_frag (lfix->sym, frag_now);
1058 }
1059 CURR_SLOT.tag_fixups = 0;
1060
1061 /* In case there are unwind directives following the last instruction,
1062 resolve those now. We only handle prologue, body, and endp directives
1063 here. Give an error for others. */
1064 for (ptr = unwind.current_entry; ptr; ptr = ptr->next)
1065 {
1066 switch (ptr->r.type)
1067 {
1068 case prologue:
1069 case prologue_gr:
1070 case body:
1071 case endp:
1072 ptr->slot_number = (unsigned long) frag_more (0);
1073 ptr->slot_frag = frag_now;
1074 break;
1075
1076 /* Allow any record which doesn't have a "t" field (i.e.,
1077 doesn't relate to a particular instruction). */
1078 case unwabi:
1079 case br_gr:
1080 case copy_state:
1081 case fr_mem:
1082 case frgr_mem:
1083 case gr_gr:
1084 case gr_mem:
1085 case label_state:
1086 case rp_br:
1087 case spill_base:
1088 case spill_mask:
1089 /* nothing */
1090 break;
1091
1092 default:
1093 as_bad (_("Unwind directive not followed by an instruction."));
1094 break;
1095 }
1096 }
1097 unwind.current_entry = NULL;
1098
1099 subseg_set (saved_seg, saved_subseg);
1100
1101 if (md.qp.X_op == O_register)
1102 as_bad ("qualifying predicate not followed by instruction");
1103 }
1104
1105 static void
1106 ia64_do_align (int nbytes)
1107 {
1108 char *saved_input_line_pointer = input_line_pointer;
1109
1110 input_line_pointer = "";
1111 s_align_bytes (nbytes);
1112 input_line_pointer = saved_input_line_pointer;
1113 }
1114
1115 void
1116 ia64_cons_align (nbytes)
1117 int nbytes;
1118 {
1119 if (md.auto_align)
1120 {
1121 char *saved_input_line_pointer = input_line_pointer;
1122 input_line_pointer = "";
1123 s_align_bytes (nbytes);
1124 input_line_pointer = saved_input_line_pointer;
1125 }
1126 }
1127
1128 /* Output COUNT bytes to a memory location. */
1129 static unsigned char *vbyte_mem_ptr = NULL;
1130
1131 void
1132 output_vbyte_mem (count, ptr, comment)
1133 int count;
1134 char *ptr;
1135 char *comment ATTRIBUTE_UNUSED;
1136 {
1137 int x;
1138 if (vbyte_mem_ptr == NULL)
1139 abort ();
1140
1141 if (count == 0)
1142 return;
1143 for (x = 0; x < count; x++)
1144 *(vbyte_mem_ptr++) = ptr[x];
1145 }
1146
1147 /* Count the number of bytes required for records. */
1148 static int vbyte_count = 0;
1149 void
1150 count_output (count, ptr, comment)
1151 int count;
1152 char *ptr ATTRIBUTE_UNUSED;
1153 char *comment ATTRIBUTE_UNUSED;
1154 {
1155 vbyte_count += count;
1156 }
1157
1158 static void
1159 output_R1_format (f, rtype, rlen)
1160 vbyte_func f;
1161 unw_record_type rtype;
1162 int rlen;
1163 {
1164 int r = 0;
1165 char byte;
1166 if (rlen > 0x1f)
1167 {
1168 output_R3_format (f, rtype, rlen);
1169 return;
1170 }
1171
1172 if (rtype == body)
1173 r = 1;
1174 else if (rtype != prologue)
1175 as_bad ("record type is not valid");
1176
1177 byte = UNW_R1 | (r << 5) | (rlen & 0x1f);
1178 (*f) (1, &byte, NULL);
1179 }
1180
1181 static void
1182 output_R2_format (f, mask, grsave, rlen)
1183 vbyte_func f;
1184 int mask, grsave;
1185 unsigned long rlen;
1186 {
1187 char bytes[20];
1188 int count = 2;
1189 mask = (mask & 0x0f);
1190 grsave = (grsave & 0x7f);
1191
1192 bytes[0] = (UNW_R2 | (mask >> 1));
1193 bytes[1] = (((mask & 0x01) << 7) | grsave);
1194 count += output_leb128 (bytes + 2, rlen, 0);
1195 (*f) (count, bytes, NULL);
1196 }
1197
1198 static void
1199 output_R3_format (f, rtype, rlen)
1200 vbyte_func f;
1201 unw_record_type rtype;
1202 unsigned long rlen;
1203 {
1204 int r = 0, count;
1205 char bytes[20];
1206 if (rlen <= 0x1f)
1207 {
1208 output_R1_format (f, rtype, rlen);
1209 return;
1210 }
1211
1212 if (rtype == body)
1213 r = 1;
1214 else if (rtype != prologue)
1215 as_bad ("record type is not valid");
1216 bytes[0] = (UNW_R3 | r);
1217 count = output_leb128 (bytes + 1, rlen, 0);
1218 (*f) (count + 1, bytes, NULL);
1219 }
1220
1221 static void
1222 output_P1_format (f, brmask)
1223 vbyte_func f;
1224 int brmask;
1225 {
1226 char byte;
1227 byte = UNW_P1 | (brmask & 0x1f);
1228 (*f) (1, &byte, NULL);
1229 }
1230
1231 static void
1232 output_P2_format (f, brmask, gr)
1233 vbyte_func f;
1234 int brmask;
1235 int gr;
1236 {
1237 char bytes[2];
1238 brmask = (brmask & 0x1f);
1239 bytes[0] = UNW_P2 | (brmask >> 1);
1240 bytes[1] = (((brmask & 1) << 7) | gr);
1241 (*f) (2, bytes, NULL);
1242 }
1243
1244 static void
1245 output_P3_format (f, rtype, reg)
1246 vbyte_func f;
1247 unw_record_type rtype;
1248 int reg;
1249 {
1250 char bytes[2];
1251 int r = 0;
1252 reg = (reg & 0x7f);
1253 switch (rtype)
1254 {
1255 case psp_gr:
1256 r = 0;
1257 break;
1258 case rp_gr:
1259 r = 1;
1260 break;
1261 case pfs_gr:
1262 r = 2;
1263 break;
1264 case preds_gr:
1265 r = 3;
1266 break;
1267 case unat_gr:
1268 r = 4;
1269 break;
1270 case lc_gr:
1271 r = 5;
1272 break;
1273 case rp_br:
1274 r = 6;
1275 break;
1276 case rnat_gr:
1277 r = 7;
1278 break;
1279 case bsp_gr:
1280 r = 8;
1281 break;
1282 case bspstore_gr:
1283 r = 9;
1284 break;
1285 case fpsr_gr:
1286 r = 10;
1287 break;
1288 case priunat_gr:
1289 r = 11;
1290 break;
1291 default:
1292 as_bad ("Invalid record type for P3 format.");
1293 }
1294 bytes[0] = (UNW_P3 | (r >> 1));
1295 bytes[1] = (((r & 1) << 7) | reg);
1296 (*f) (2, bytes, NULL);
1297 }
1298
1299 static void
1300 output_P4_format (f, imask, imask_size)
1301 vbyte_func f;
1302 unsigned char *imask;
1303 unsigned long imask_size;
1304 {
1305 imask[0] = UNW_P4;
1306 (*f) (imask_size, imask, NULL);
1307 }
1308
1309 static void
1310 output_P5_format (f, grmask, frmask)
1311 vbyte_func f;
1312 int grmask;
1313 unsigned long frmask;
1314 {
1315 char bytes[4];
1316 grmask = (grmask & 0x0f);
1317
1318 bytes[0] = UNW_P5;
1319 bytes[1] = ((grmask << 4) | ((frmask & 0x000f0000) >> 16));
1320 bytes[2] = ((frmask & 0x0000ff00) >> 8);
1321 bytes[3] = (frmask & 0x000000ff);
1322 (*f) (4, bytes, NULL);
1323 }
1324
1325 static void
1326 output_P6_format (f, rtype, rmask)
1327 vbyte_func f;
1328 unw_record_type rtype;
1329 int rmask;
1330 {
1331 char byte;
1332 int r = 0;
1333
1334 if (rtype == gr_mem)
1335 r = 1;
1336 else if (rtype != fr_mem)
1337 as_bad ("Invalid record type for format P6");
1338 byte = (UNW_P6 | (r << 4) | (rmask & 0x0f));
1339 (*f) (1, &byte, NULL);
1340 }
1341
1342 static void
1343 output_P7_format (f, rtype, w1, w2)
1344 vbyte_func f;
1345 unw_record_type rtype;
1346 unsigned long w1;
1347 unsigned long w2;
1348 {
1349 char bytes[20];
1350 int count = 1;
1351 int r = 0;
1352 count += output_leb128 (bytes + 1, w1, 0);
1353 switch (rtype)
1354 {
1355 case mem_stack_f:
1356 r = 0;
1357 count += output_leb128 (bytes + count, w2 >> 4, 0);
1358 break;
1359 case mem_stack_v:
1360 r = 1;
1361 break;
1362 case spill_base:
1363 r = 2;
1364 break;
1365 case psp_sprel:
1366 r = 3;
1367 break;
1368 case rp_when:
1369 r = 4;
1370 break;
1371 case rp_psprel:
1372 r = 5;
1373 break;
1374 case pfs_when:
1375 r = 6;
1376 break;
1377 case pfs_psprel:
1378 r = 7;
1379 break;
1380 case preds_when:
1381 r = 8;
1382 break;
1383 case preds_psprel:
1384 r = 9;
1385 break;
1386 case lc_when:
1387 r = 10;
1388 break;
1389 case lc_psprel:
1390 r = 11;
1391 break;
1392 case unat_when:
1393 r = 12;
1394 break;
1395 case unat_psprel:
1396 r = 13;
1397 break;
1398 case fpsr_when:
1399 r = 14;
1400 break;
1401 case fpsr_psprel:
1402 r = 15;
1403 break;
1404 default:
1405 break;
1406 }
1407 bytes[0] = (UNW_P7 | r);
1408 (*f) (count, bytes, NULL);
1409 }
1410
1411 static void
1412 output_P8_format (f, rtype, t)
1413 vbyte_func f;
1414 unw_record_type rtype;
1415 unsigned long t;
1416 {
1417 char bytes[20];
1418 int r = 0;
1419 int count = 2;
1420 bytes[0] = UNW_P8;
1421 switch (rtype)
1422 {
1423 case rp_sprel:
1424 r = 1;
1425 break;
1426 case pfs_sprel:
1427 r = 2;
1428 break;
1429 case preds_sprel:
1430 r = 3;
1431 break;
1432 case lc_sprel:
1433 r = 4;
1434 break;
1435 case unat_sprel:
1436 r = 5;
1437 break;
1438 case fpsr_sprel:
1439 r = 6;
1440 break;
1441 case bsp_when:
1442 r = 7;
1443 break;
1444 case bsp_psprel:
1445 r = 8;
1446 break;
1447 case bsp_sprel:
1448 r = 9;
1449 break;
1450 case bspstore_when:
1451 r = 10;
1452 break;
1453 case bspstore_psprel:
1454 r = 11;
1455 break;
1456 case bspstore_sprel:
1457 r = 12;
1458 break;
1459 case rnat_when:
1460 r = 13;
1461 break;
1462 case rnat_psprel:
1463 r = 14;
1464 break;
1465 case rnat_sprel:
1466 r = 15;
1467 break;
1468 case priunat_when_gr:
1469 r = 16;
1470 break;
1471 case priunat_psprel:
1472 r = 17;
1473 break;
1474 case priunat_sprel:
1475 r = 18;
1476 break;
1477 case priunat_when_mem:
1478 r = 19;
1479 break;
1480 default:
1481 break;
1482 }
1483 bytes[1] = r;
1484 count += output_leb128 (bytes + 2, t, 0);
1485 (*f) (count, bytes, NULL);
1486 }
1487
1488 static void
1489 output_P9_format (f, grmask, gr)
1490 vbyte_func f;
1491 int grmask;
1492 int gr;
1493 {
1494 char bytes[3];
1495 bytes[0] = UNW_P9;
1496 bytes[1] = (grmask & 0x0f);
1497 bytes[2] = (gr & 0x7f);
1498 (*f) (3, bytes, NULL);
1499 }
1500
1501 static void
1502 output_P10_format (f, abi, context)
1503 vbyte_func f;
1504 int abi;
1505 int context;
1506 {
1507 char bytes[3];
1508 bytes[0] = UNW_P10;
1509 bytes[1] = (abi & 0xff);
1510 bytes[2] = (context & 0xff);
1511 (*f) (3, bytes, NULL);
1512 }
1513
1514 static void
1515 output_B1_format (f, rtype, label)
1516 vbyte_func f;
1517 unw_record_type rtype;
1518 unsigned long label;
1519 {
1520 char byte;
1521 int r = 0;
1522 if (label > 0x1f)
1523 {
1524 output_B4_format (f, rtype, label);
1525 return;
1526 }
1527 if (rtype == copy_state)
1528 r = 1;
1529 else if (rtype != label_state)
1530 as_bad ("Invalid record type for format B1");
1531
1532 byte = (UNW_B1 | (r << 5) | (label & 0x1f));
1533 (*f) (1, &byte, NULL);
1534 }
1535
1536 static void
1537 output_B2_format (f, ecount, t)
1538 vbyte_func f;
1539 unsigned long ecount;
1540 unsigned long t;
1541 {
1542 char bytes[20];
1543 int count = 1;
1544 if (ecount > 0x1f)
1545 {
1546 output_B3_format (f, ecount, t);
1547 return;
1548 }
1549 bytes[0] = (UNW_B2 | (ecount & 0x1f));
1550 count += output_leb128 (bytes + 1, t, 0);
1551 (*f) (count, bytes, NULL);
1552 }
1553
1554 static void
1555 output_B3_format (f, ecount, t)
1556 vbyte_func f;
1557 unsigned long ecount;
1558 unsigned long t;
1559 {
1560 char bytes[20];
1561 int count = 1;
1562 if (ecount <= 0x1f)
1563 {
1564 output_B2_format (f, ecount, t);
1565 return;
1566 }
1567 bytes[0] = UNW_B3;
1568 count += output_leb128 (bytes + 1, t, 0);
1569 count += output_leb128 (bytes + count, ecount, 0);
1570 (*f) (count, bytes, NULL);
1571 }
1572
1573 static void
1574 output_B4_format (f, rtype, label)
1575 vbyte_func f;
1576 unw_record_type rtype;
1577 unsigned long label;
1578 {
1579 char bytes[20];
1580 int r = 0;
1581 int count = 1;
1582 if (label <= 0x1f)
1583 {
1584 output_B1_format (f, rtype, label);
1585 return;
1586 }
1587
1588 if (rtype == copy_state)
1589 r = 1;
1590 else if (rtype != label_state)
1591 as_bad ("Invalid record type for format B1");
1592
1593 bytes[0] = (UNW_B4 | (r << 3));
1594 count += output_leb128 (bytes + 1, label, 0);
1595 (*f) (count, bytes, NULL);
1596 }
1597
1598 static char
1599 format_ab_reg (ab, reg)
1600 int ab;
1601 int reg;
1602 {
1603 int ret;
1604 ab = (ab & 3);
1605 reg = (reg & 0x1f);
1606 ret = (ab << 5) | reg;
1607 return ret;
1608 }
1609
1610 static void
1611 output_X1_format (f, rtype, ab, reg, t, w1)
1612 vbyte_func f;
1613 unw_record_type rtype;
1614 int ab, reg;
1615 unsigned long t;
1616 unsigned long w1;
1617 {
1618 char bytes[20];
1619 int r = 0;
1620 int count = 2;
1621 bytes[0] = UNW_X1;
1622
1623 if (rtype == spill_sprel)
1624 r = 1;
1625 else if (rtype != spill_psprel)
1626 as_bad ("Invalid record type for format X1");
1627 bytes[1] = ((r << 7) | format_ab_reg (ab, reg));
1628 count += output_leb128 (bytes + 2, t, 0);
1629 count += output_leb128 (bytes + count, w1, 0);
1630 (*f) (count, bytes, NULL);
1631 }
1632
1633 static void
1634 output_X2_format (f, ab, reg, x, y, treg, t)
1635 vbyte_func f;
1636 int ab, reg;
1637 int x, y, treg;
1638 unsigned long t;
1639 {
1640 char bytes[20];
1641 int count = 3;
1642 bytes[0] = UNW_X2;
1643 bytes[1] = (((x & 1) << 7) | format_ab_reg (ab, reg));
1644 bytes[2] = (((y & 1) << 7) | (treg & 0x7f));
1645 count += output_leb128 (bytes + 3, t, 0);
1646 (*f) (count, bytes, NULL);
1647 }
1648
1649 static void
1650 output_X3_format (f, rtype, qp, ab, reg, t, w1)
1651 vbyte_func f;
1652 unw_record_type rtype;
1653 int qp;
1654 int ab, reg;
1655 unsigned long t;
1656 unsigned long w1;
1657 {
1658 char bytes[20];
1659 int r = 0;
1660 int count = 3;
1661 bytes[0] = UNW_X3;
1662
1663 if (rtype == spill_sprel_p)
1664 r = 1;
1665 else if (rtype != spill_psprel_p)
1666 as_bad ("Invalid record type for format X3");
1667 bytes[1] = ((r << 7) | (qp & 0x3f));
1668 bytes[2] = format_ab_reg (ab, reg);
1669 count += output_leb128 (bytes + 3, t, 0);
1670 count += output_leb128 (bytes + count, w1, 0);
1671 (*f) (count, bytes, NULL);
1672 }
1673
1674 static void
1675 output_X4_format (f, qp, ab, reg, x, y, treg, t)
1676 vbyte_func f;
1677 int qp;
1678 int ab, reg;
1679 int x, y, treg;
1680 unsigned long t;
1681 {
1682 char bytes[20];
1683 int count = 4;
1684 bytes[0] = UNW_X4;
1685 bytes[1] = (qp & 0x3f);
1686 bytes[2] = (((x & 1) << 7) | format_ab_reg (ab, reg));
1687 bytes[3] = (((y & 1) << 7) | (treg & 0x7f));
1688 count += output_leb128 (bytes + 4, t, 0);
1689 (*f) (count, bytes, NULL);
1690 }
1691
1692 /* This function allocates a record list structure, and initializes fields. */
1693
1694 static unw_rec_list *
1695 alloc_record (unw_record_type t)
1696 {
1697 unw_rec_list *ptr;
1698 ptr = xmalloc (sizeof (*ptr));
1699 ptr->next = NULL;
1700 ptr->slot_number = SLOT_NUM_NOT_SET;
1701 ptr->r.type = t;
1702 ptr->next_slot_number = 0;
1703 ptr->next_slot_frag = 0;
1704 return ptr;
1705 }
1706
1707 /* Dummy unwind record used for calculating the length of the last prologue or
1708 body region. */
1709
1710 static unw_rec_list *
1711 output_endp ()
1712 {
1713 unw_rec_list *ptr = alloc_record (endp);
1714 return ptr;
1715 }
1716
1717 static unw_rec_list *
1718 output_prologue ()
1719 {
1720 unw_rec_list *ptr = alloc_record (prologue);
1721 memset (&ptr->r.record.r.mask, 0, sizeof (ptr->r.record.r.mask));
1722 return ptr;
1723 }
1724
1725 static unw_rec_list *
1726 output_prologue_gr (saved_mask, reg)
1727 unsigned int saved_mask;
1728 unsigned int reg;
1729 {
1730 unw_rec_list *ptr = alloc_record (prologue_gr);
1731 memset (&ptr->r.record.r.mask, 0, sizeof (ptr->r.record.r.mask));
1732 ptr->r.record.r.grmask = saved_mask;
1733 ptr->r.record.r.grsave = reg;
1734 return ptr;
1735 }
1736
1737 static unw_rec_list *
1738 output_body ()
1739 {
1740 unw_rec_list *ptr = alloc_record (body);
1741 return ptr;
1742 }
1743
1744 static unw_rec_list *
1745 output_mem_stack_f (size)
1746 unsigned int size;
1747 {
1748 unw_rec_list *ptr = alloc_record (mem_stack_f);
1749 ptr->r.record.p.size = size;
1750 return ptr;
1751 }
1752
1753 static unw_rec_list *
1754 output_mem_stack_v ()
1755 {
1756 unw_rec_list *ptr = alloc_record (mem_stack_v);
1757 return ptr;
1758 }
1759
1760 static unw_rec_list *
1761 output_psp_gr (gr)
1762 unsigned int gr;
1763 {
1764 unw_rec_list *ptr = alloc_record (psp_gr);
1765 ptr->r.record.p.gr = gr;
1766 return ptr;
1767 }
1768
1769 static unw_rec_list *
1770 output_psp_sprel (offset)
1771 unsigned int offset;
1772 {
1773 unw_rec_list *ptr = alloc_record (psp_sprel);
1774 ptr->r.record.p.spoff = offset / 4;
1775 return ptr;
1776 }
1777
1778 static unw_rec_list *
1779 output_rp_when ()
1780 {
1781 unw_rec_list *ptr = alloc_record (rp_when);
1782 return ptr;
1783 }
1784
1785 static unw_rec_list *
1786 output_rp_gr (gr)
1787 unsigned int gr;
1788 {
1789 unw_rec_list *ptr = alloc_record (rp_gr);
1790 ptr->r.record.p.gr = gr;
1791 return ptr;
1792 }
1793
1794 static unw_rec_list *
1795 output_rp_br (br)
1796 unsigned int br;
1797 {
1798 unw_rec_list *ptr = alloc_record (rp_br);
1799 ptr->r.record.p.br = br;
1800 return ptr;
1801 }
1802
1803 static unw_rec_list *
1804 output_rp_psprel (offset)
1805 unsigned int offset;
1806 {
1807 unw_rec_list *ptr = alloc_record (rp_psprel);
1808 ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
1809 return ptr;
1810 }
1811
1812 static unw_rec_list *
1813 output_rp_sprel (offset)
1814 unsigned int offset;
1815 {
1816 unw_rec_list *ptr = alloc_record (rp_sprel);
1817 ptr->r.record.p.spoff = offset / 4;
1818 return ptr;
1819 }
1820
1821 static unw_rec_list *
1822 output_pfs_when ()
1823 {
1824 unw_rec_list *ptr = alloc_record (pfs_when);
1825 return ptr;
1826 }
1827
1828 static unw_rec_list *
1829 output_pfs_gr (gr)
1830 unsigned int gr;
1831 {
1832 unw_rec_list *ptr = alloc_record (pfs_gr);
1833 ptr->r.record.p.gr = gr;
1834 return ptr;
1835 }
1836
1837 static unw_rec_list *
1838 output_pfs_psprel (offset)
1839 unsigned int offset;
1840 {
1841 unw_rec_list *ptr = alloc_record (pfs_psprel);
1842 ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
1843 return ptr;
1844 }
1845
1846 static unw_rec_list *
1847 output_pfs_sprel (offset)
1848 unsigned int offset;
1849 {
1850 unw_rec_list *ptr = alloc_record (pfs_sprel);
1851 ptr->r.record.p.spoff = offset / 4;
1852 return ptr;
1853 }
1854
1855 static unw_rec_list *
1856 output_preds_when ()
1857 {
1858 unw_rec_list *ptr = alloc_record (preds_when);
1859 return ptr;
1860 }
1861
1862 static unw_rec_list *
1863 output_preds_gr (gr)
1864 unsigned int gr;
1865 {
1866 unw_rec_list *ptr = alloc_record (preds_gr);
1867 ptr->r.record.p.gr = gr;
1868 return ptr;
1869 }
1870
1871 static unw_rec_list *
1872 output_preds_psprel (offset)
1873 unsigned int offset;
1874 {
1875 unw_rec_list *ptr = alloc_record (preds_psprel);
1876 ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
1877 return ptr;
1878 }
1879
1880 static unw_rec_list *
1881 output_preds_sprel (offset)
1882 unsigned int offset;
1883 {
1884 unw_rec_list *ptr = alloc_record (preds_sprel);
1885 ptr->r.record.p.spoff = offset / 4;
1886 return ptr;
1887 }
1888
1889 static unw_rec_list *
1890 output_fr_mem (mask)
1891 unsigned int mask;
1892 {
1893 unw_rec_list *ptr = alloc_record (fr_mem);
1894 ptr->r.record.p.rmask = mask;
1895 return ptr;
1896 }
1897
1898 static unw_rec_list *
1899 output_frgr_mem (gr_mask, fr_mask)
1900 unsigned int gr_mask;
1901 unsigned int fr_mask;
1902 {
1903 unw_rec_list *ptr = alloc_record (frgr_mem);
1904 ptr->r.record.p.grmask = gr_mask;
1905 ptr->r.record.p.frmask = fr_mask;
1906 return ptr;
1907 }
1908
1909 static unw_rec_list *
1910 output_gr_gr (mask, reg)
1911 unsigned int mask;
1912 unsigned int reg;
1913 {
1914 unw_rec_list *ptr = alloc_record (gr_gr);
1915 ptr->r.record.p.grmask = mask;
1916 ptr->r.record.p.gr = reg;
1917 return ptr;
1918 }
1919
1920 static unw_rec_list *
1921 output_gr_mem (mask)
1922 unsigned int mask;
1923 {
1924 unw_rec_list *ptr = alloc_record (gr_mem);
1925 ptr->r.record.p.rmask = mask;
1926 return ptr;
1927 }
1928
1929 static unw_rec_list *
1930 output_br_mem (unsigned int mask)
1931 {
1932 unw_rec_list *ptr = alloc_record (br_mem);
1933 ptr->r.record.p.brmask = mask;
1934 return ptr;
1935 }
1936
1937 static unw_rec_list *
1938 output_br_gr (save_mask, reg)
1939 unsigned int save_mask;
1940 unsigned int reg;
1941 {
1942 unw_rec_list *ptr = alloc_record (br_gr);
1943 ptr->r.record.p.brmask = save_mask;
1944 ptr->r.record.p.gr = reg;
1945 return ptr;
1946 }
1947
1948 static unw_rec_list *
1949 output_spill_base (offset)
1950 unsigned int offset;
1951 {
1952 unw_rec_list *ptr = alloc_record (spill_base);
1953 ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
1954 return ptr;
1955 }
1956
1957 static unw_rec_list *
1958 output_unat_when ()
1959 {
1960 unw_rec_list *ptr = alloc_record (unat_when);
1961 return ptr;
1962 }
1963
1964 static unw_rec_list *
1965 output_unat_gr (gr)
1966 unsigned int gr;
1967 {
1968 unw_rec_list *ptr = alloc_record (unat_gr);
1969 ptr->r.record.p.gr = gr;
1970 return ptr;
1971 }
1972
1973 static unw_rec_list *
1974 output_unat_psprel (offset)
1975 unsigned int offset;
1976 {
1977 unw_rec_list *ptr = alloc_record (unat_psprel);
1978 ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
1979 return ptr;
1980 }
1981
1982 static unw_rec_list *
1983 output_unat_sprel (offset)
1984 unsigned int offset;
1985 {
1986 unw_rec_list *ptr = alloc_record (unat_sprel);
1987 ptr->r.record.p.spoff = offset / 4;
1988 return ptr;
1989 }
1990
1991 static unw_rec_list *
1992 output_lc_when ()
1993 {
1994 unw_rec_list *ptr = alloc_record (lc_when);
1995 return ptr;
1996 }
1997
1998 static unw_rec_list *
1999 output_lc_gr (gr)
2000 unsigned int gr;
2001 {
2002 unw_rec_list *ptr = alloc_record (lc_gr);
2003 ptr->r.record.p.gr = gr;
2004 return ptr;
2005 }
2006
2007 static unw_rec_list *
2008 output_lc_psprel (offset)
2009 unsigned int offset;
2010 {
2011 unw_rec_list *ptr = alloc_record (lc_psprel);
2012 ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
2013 return ptr;
2014 }
2015
2016 static unw_rec_list *
2017 output_lc_sprel (offset)
2018 unsigned int offset;
2019 {
2020 unw_rec_list *ptr = alloc_record (lc_sprel);
2021 ptr->r.record.p.spoff = offset / 4;
2022 return ptr;
2023 }
2024
2025 static unw_rec_list *
2026 output_fpsr_when ()
2027 {
2028 unw_rec_list *ptr = alloc_record (fpsr_when);
2029 return ptr;
2030 }
2031
2032 static unw_rec_list *
2033 output_fpsr_gr (gr)
2034 unsigned int gr;
2035 {
2036 unw_rec_list *ptr = alloc_record (fpsr_gr);
2037 ptr->r.record.p.gr = gr;
2038 return ptr;
2039 }
2040
2041 static unw_rec_list *
2042 output_fpsr_psprel (offset)
2043 unsigned int offset;
2044 {
2045 unw_rec_list *ptr = alloc_record (fpsr_psprel);
2046 ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
2047 return ptr;
2048 }
2049
2050 static unw_rec_list *
2051 output_fpsr_sprel (offset)
2052 unsigned int offset;
2053 {
2054 unw_rec_list *ptr = alloc_record (fpsr_sprel);
2055 ptr->r.record.p.spoff = offset / 4;
2056 return ptr;
2057 }
2058
2059 static unw_rec_list *
2060 output_priunat_when_gr ()
2061 {
2062 unw_rec_list *ptr = alloc_record (priunat_when_gr);
2063 return ptr;
2064 }
2065
2066 static unw_rec_list *
2067 output_priunat_when_mem ()
2068 {
2069 unw_rec_list *ptr = alloc_record (priunat_when_mem);
2070 return ptr;
2071 }
2072
2073 static unw_rec_list *
2074 output_priunat_gr (gr)
2075 unsigned int gr;
2076 {
2077 unw_rec_list *ptr = alloc_record (priunat_gr);
2078 ptr->r.record.p.gr = gr;
2079 return ptr;
2080 }
2081
2082 static unw_rec_list *
2083 output_priunat_psprel (offset)
2084 unsigned int offset;
2085 {
2086 unw_rec_list *ptr = alloc_record (priunat_psprel);
2087 ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
2088 return ptr;
2089 }
2090
2091 static unw_rec_list *
2092 output_priunat_sprel (offset)
2093 unsigned int offset;
2094 {
2095 unw_rec_list *ptr = alloc_record (priunat_sprel);
2096 ptr->r.record.p.spoff = offset / 4;
2097 return ptr;
2098 }
2099
2100 static unw_rec_list *
2101 output_bsp_when ()
2102 {
2103 unw_rec_list *ptr = alloc_record (bsp_when);
2104 return ptr;
2105 }
2106
2107 static unw_rec_list *
2108 output_bsp_gr (gr)
2109 unsigned int gr;
2110 {
2111 unw_rec_list *ptr = alloc_record (bsp_gr);
2112 ptr->r.record.p.gr = gr;
2113 return ptr;
2114 }
2115
2116 static unw_rec_list *
2117 output_bsp_psprel (offset)
2118 unsigned int offset;
2119 {
2120 unw_rec_list *ptr = alloc_record (bsp_psprel);
2121 ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
2122 return ptr;
2123 }
2124
2125 static unw_rec_list *
2126 output_bsp_sprel (offset)
2127 unsigned int offset;
2128 {
2129 unw_rec_list *ptr = alloc_record (bsp_sprel);
2130 ptr->r.record.p.spoff = offset / 4;
2131 return ptr;
2132 }
2133
2134 static unw_rec_list *
2135 output_bspstore_when ()
2136 {
2137 unw_rec_list *ptr = alloc_record (bspstore_when);
2138 return ptr;
2139 }
2140
2141 static unw_rec_list *
2142 output_bspstore_gr (gr)
2143 unsigned int gr;
2144 {
2145 unw_rec_list *ptr = alloc_record (bspstore_gr);
2146 ptr->r.record.p.gr = gr;
2147 return ptr;
2148 }
2149
2150 static unw_rec_list *
2151 output_bspstore_psprel (offset)
2152 unsigned int offset;
2153 {
2154 unw_rec_list *ptr = alloc_record (bspstore_psprel);
2155 ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
2156 return ptr;
2157 }
2158
2159 static unw_rec_list *
2160 output_bspstore_sprel (offset)
2161 unsigned int offset;
2162 {
2163 unw_rec_list *ptr = alloc_record (bspstore_sprel);
2164 ptr->r.record.p.spoff = offset / 4;
2165 return ptr;
2166 }
2167
2168 static unw_rec_list *
2169 output_rnat_when ()
2170 {
2171 unw_rec_list *ptr = alloc_record (rnat_when);
2172 return ptr;
2173 }
2174
2175 static unw_rec_list *
2176 output_rnat_gr (gr)
2177 unsigned int gr;
2178 {
2179 unw_rec_list *ptr = alloc_record (rnat_gr);
2180 ptr->r.record.p.gr = gr;
2181 return ptr;
2182 }
2183
2184 static unw_rec_list *
2185 output_rnat_psprel (offset)
2186 unsigned int offset;
2187 {
2188 unw_rec_list *ptr = alloc_record (rnat_psprel);
2189 ptr->r.record.p.pspoff = ENCODED_PSP_OFFSET (offset);
2190 return ptr;
2191 }
2192
2193 static unw_rec_list *
2194 output_rnat_sprel (offset)
2195 unsigned int offset;
2196 {
2197 unw_rec_list *ptr = alloc_record (rnat_sprel);
2198 ptr->r.record.p.spoff = offset / 4;
2199 return ptr;
2200 }
2201
2202 static unw_rec_list *
2203 output_unwabi (abi, context)
2204 unsigned long abi;
2205 unsigned long context;
2206 {
2207 unw_rec_list *ptr = alloc_record (unwabi);
2208 ptr->r.record.p.abi = abi;
2209 ptr->r.record.p.context = context;
2210 return ptr;
2211 }
2212
2213 static unw_rec_list *
2214 output_epilogue (unsigned long ecount)
2215 {
2216 unw_rec_list *ptr = alloc_record (epilogue);
2217 ptr->r.record.b.ecount = ecount;
2218 return ptr;
2219 }
2220
2221 static unw_rec_list *
2222 output_label_state (unsigned long label)
2223 {
2224 unw_rec_list *ptr = alloc_record (label_state);
2225 ptr->r.record.b.label = label;
2226 return ptr;
2227 }
2228
2229 static unw_rec_list *
2230 output_copy_state (unsigned long label)
2231 {
2232 unw_rec_list *ptr = alloc_record (copy_state);
2233 ptr->r.record.b.label = label;
2234 return ptr;
2235 }
2236
2237 static unw_rec_list *
2238 output_spill_psprel (ab, reg, offset)
2239 unsigned int ab;
2240 unsigned int reg;
2241 unsigned int offset;
2242 {
2243 unw_rec_list *ptr = alloc_record (spill_psprel);
2244 ptr->r.record.x.ab = ab;
2245 ptr->r.record.x.reg = reg;
2246 ptr->r.record.x.pspoff = ENCODED_PSP_OFFSET (offset);
2247 return ptr;
2248 }
2249
2250 static unw_rec_list *
2251 output_spill_sprel (ab, reg, offset)
2252 unsigned int ab;
2253 unsigned int reg;
2254 unsigned int offset;
2255 {
2256 unw_rec_list *ptr = alloc_record (spill_sprel);
2257 ptr->r.record.x.ab = ab;
2258 ptr->r.record.x.reg = reg;
2259 ptr->r.record.x.spoff = offset / 4;
2260 return ptr;
2261 }
2262
2263 static unw_rec_list *
2264 output_spill_psprel_p (ab, reg, offset, predicate)
2265 unsigned int ab;
2266 unsigned int reg;
2267 unsigned int offset;
2268 unsigned int predicate;
2269 {
2270 unw_rec_list *ptr = alloc_record (spill_psprel_p);
2271 ptr->r.record.x.ab = ab;
2272 ptr->r.record.x.reg = reg;
2273 ptr->r.record.x.pspoff = ENCODED_PSP_OFFSET (offset);
2274 ptr->r.record.x.qp = predicate;
2275 return ptr;
2276 }
2277
2278 static unw_rec_list *
2279 output_spill_sprel_p (ab, reg, offset, predicate)
2280 unsigned int ab;
2281 unsigned int reg;
2282 unsigned int offset;
2283 unsigned int predicate;
2284 {
2285 unw_rec_list *ptr = alloc_record (spill_sprel_p);
2286 ptr->r.record.x.ab = ab;
2287 ptr->r.record.x.reg = reg;
2288 ptr->r.record.x.spoff = offset / 4;
2289 ptr->r.record.x.qp = predicate;
2290 return ptr;
2291 }
2292
2293 static unw_rec_list *
2294 output_spill_reg (ab, reg, targ_reg, xy)
2295 unsigned int ab;
2296 unsigned int reg;
2297 unsigned int targ_reg;
2298 unsigned int xy;
2299 {
2300 unw_rec_list *ptr = alloc_record (spill_reg);
2301 ptr->r.record.x.ab = ab;
2302 ptr->r.record.x.reg = reg;
2303 ptr->r.record.x.treg = targ_reg;
2304 ptr->r.record.x.xy = xy;
2305 return ptr;
2306 }
2307
2308 static unw_rec_list *
2309 output_spill_reg_p (ab, reg, targ_reg, xy, predicate)
2310 unsigned int ab;
2311 unsigned int reg;
2312 unsigned int targ_reg;
2313 unsigned int xy;
2314 unsigned int predicate;
2315 {
2316 unw_rec_list *ptr = alloc_record (spill_reg_p);
2317 ptr->r.record.x.ab = ab;
2318 ptr->r.record.x.reg = reg;
2319 ptr->r.record.x.treg = targ_reg;
2320 ptr->r.record.x.xy = xy;
2321 ptr->r.record.x.qp = predicate;
2322 return ptr;
2323 }
2324
2325 /* Given a unw_rec_list process the correct format with the
2326 specified function. */
2327
2328 static void
2329 process_one_record (ptr, f)
2330 unw_rec_list *ptr;
2331 vbyte_func f;
2332 {
2333 unsigned long fr_mask, gr_mask;
2334
2335 switch (ptr->r.type)
2336 {
2337 /* This is a dummy record that takes up no space in the output. */
2338 case endp:
2339 break;
2340
2341 case gr_mem:
2342 case fr_mem:
2343 case br_mem:
2344 case frgr_mem:
2345 /* These are taken care of by prologue/prologue_gr. */
2346 break;
2347
2348 case prologue_gr:
2349 case prologue:
2350 if (ptr->r.type == prologue_gr)
2351 output_R2_format (f, ptr->r.record.r.grmask,
2352 ptr->r.record.r.grsave, ptr->r.record.r.rlen);
2353 else
2354 output_R1_format (f, ptr->r.type, ptr->r.record.r.rlen);
2355
2356 /* Output descriptor(s) for union of register spills (if any). */
2357 gr_mask = ptr->r.record.r.mask.gr_mem;
2358 fr_mask = ptr->r.record.r.mask.fr_mem;
2359 if (fr_mask)
2360 {
2361 if ((fr_mask & ~0xfUL) == 0)
2362 output_P6_format (f, fr_mem, fr_mask);
2363 else
2364 {
2365 output_P5_format (f, gr_mask, fr_mask);
2366 gr_mask = 0;
2367 }
2368 }
2369 if (gr_mask)
2370 output_P6_format (f, gr_mem, gr_mask);
2371 if (ptr->r.record.r.mask.br_mem)
2372 output_P1_format (f, ptr->r.record.r.mask.br_mem);
2373
2374 /* output imask descriptor if necessary: */
2375 if (ptr->r.record.r.mask.i)
2376 output_P4_format (f, ptr->r.record.r.mask.i,
2377 ptr->r.record.r.imask_size);
2378 break;
2379
2380 case body:
2381 output_R1_format (f, ptr->r.type, ptr->r.record.r.rlen);
2382 break;
2383 case mem_stack_f:
2384 case mem_stack_v:
2385 output_P7_format (f, ptr->r.type, ptr->r.record.p.t,
2386 ptr->r.record.p.size);
2387 break;
2388 case psp_gr:
2389 case rp_gr:
2390 case pfs_gr:
2391 case preds_gr:
2392 case unat_gr:
2393 case lc_gr:
2394 case fpsr_gr:
2395 case priunat_gr:
2396 case bsp_gr:
2397 case bspstore_gr:
2398 case rnat_gr:
2399 output_P3_format (f, ptr->r.type, ptr->r.record.p.gr);
2400 break;
2401 case rp_br:
2402 output_P3_format (f, rp_br, ptr->r.record.p.br);
2403 break;
2404 case psp_sprel:
2405 output_P7_format (f, psp_sprel, ptr->r.record.p.spoff, 0);
2406 break;
2407 case rp_when:
2408 case pfs_when:
2409 case preds_when:
2410 case unat_when:
2411 case lc_when:
2412 case fpsr_when:
2413 output_P7_format (f, ptr->r.type, ptr->r.record.p.t, 0);
2414 break;
2415 case rp_psprel:
2416 case pfs_psprel:
2417 case preds_psprel:
2418 case unat_psprel:
2419 case lc_psprel:
2420 case fpsr_psprel:
2421 case spill_base:
2422 output_P7_format (f, ptr->r.type, ptr->r.record.p.pspoff, 0);
2423 break;
2424 case rp_sprel:
2425 case pfs_sprel:
2426 case preds_sprel:
2427 case unat_sprel:
2428 case lc_sprel:
2429 case fpsr_sprel:
2430 case priunat_sprel:
2431 case bsp_sprel:
2432 case bspstore_sprel:
2433 case rnat_sprel:
2434 output_P8_format (f, ptr->r.type, ptr->r.record.p.spoff);
2435 break;
2436 case gr_gr:
2437 output_P9_format (f, ptr->r.record.p.grmask, ptr->r.record.p.gr);
2438 break;
2439 case br_gr:
2440 output_P2_format (f, ptr->r.record.p.brmask, ptr->r.record.p.gr);
2441 break;
2442 case spill_mask:
2443 as_bad ("spill_mask record unimplemented.");
2444 break;
2445 case priunat_when_gr:
2446 case priunat_when_mem:
2447 case bsp_when:
2448 case bspstore_when:
2449 case rnat_when:
2450 output_P8_format (f, ptr->r.type, ptr->r.record.p.t);
2451 break;
2452 case priunat_psprel:
2453 case bsp_psprel:
2454 case bspstore_psprel:
2455 case rnat_psprel:
2456 output_P8_format (f, ptr->r.type, ptr->r.record.p.pspoff);
2457 break;
2458 case unwabi:
2459 output_P10_format (f, ptr->r.record.p.abi, ptr->r.record.p.context);
2460 break;
2461 case epilogue:
2462 output_B3_format (f, ptr->r.record.b.ecount, ptr->r.record.b.t);
2463 break;
2464 case label_state:
2465 case copy_state:
2466 output_B4_format (f, ptr->r.type, ptr->r.record.b.label);
2467 break;
2468 case spill_psprel:
2469 output_X1_format (f, ptr->r.type, ptr->r.record.x.ab,
2470 ptr->r.record.x.reg, ptr->r.record.x.t,
2471 ptr->r.record.x.pspoff);
2472 break;
2473 case spill_sprel:
2474 output_X1_format (f, ptr->r.type, ptr->r.record.x.ab,
2475 ptr->r.record.x.reg, ptr->r.record.x.t,
2476 ptr->r.record.x.spoff);
2477 break;
2478 case spill_reg:
2479 output_X2_format (f, ptr->r.record.x.ab, ptr->r.record.x.reg,
2480 ptr->r.record.x.xy >> 1, ptr->r.record.x.xy,
2481 ptr->r.record.x.treg, ptr->r.record.x.t);
2482 break;
2483 case spill_psprel_p:
2484 output_X3_format (f, ptr->r.type, ptr->r.record.x.qp,
2485 ptr->r.record.x.ab, ptr->r.record.x.reg,
2486 ptr->r.record.x.t, ptr->r.record.x.pspoff);
2487 break;
2488 case spill_sprel_p:
2489 output_X3_format (f, ptr->r.type, ptr->r.record.x.qp,
2490 ptr->r.record.x.ab, ptr->r.record.x.reg,
2491 ptr->r.record.x.t, ptr->r.record.x.spoff);
2492 break;
2493 case spill_reg_p:
2494 output_X4_format (f, ptr->r.record.x.qp, ptr->r.record.x.ab,
2495 ptr->r.record.x.reg, ptr->r.record.x.xy >> 1,
2496 ptr->r.record.x.xy, ptr->r.record.x.treg,
2497 ptr->r.record.x.t);
2498 break;
2499 default:
2500 as_bad ("record_type_not_valid");
2501 break;
2502 }
2503 }
2504
2505 /* Given a unw_rec_list list, process all the records with
2506 the specified function. */
2507 static void
2508 process_unw_records (list, f)
2509 unw_rec_list *list;
2510 vbyte_func f;
2511 {
2512 unw_rec_list *ptr;
2513 for (ptr = list; ptr; ptr = ptr->next)
2514 process_one_record (ptr, f);
2515 }
2516
2517 /* Determine the size of a record list in bytes. */
2518 static int
2519 calc_record_size (list)
2520 unw_rec_list *list;
2521 {
2522 vbyte_count = 0;
2523 process_unw_records (list, count_output);
2524 return vbyte_count;
2525 }
2526
2527 /* Update IMASK bitmask to reflect the fact that one or more registers
2528 of type TYPE are saved starting at instruction with index T. If N
2529 bits are set in REGMASK, it is assumed that instructions T through
2530 T+N-1 save these registers.
2531
2532 TYPE values:
2533 0: no save
2534 1: instruction saves next fp reg
2535 2: instruction saves next general reg
2536 3: instruction saves next branch reg */
2537 static void
2538 set_imask (region, regmask, t, type)
2539 unw_rec_list *region;
2540 unsigned long regmask;
2541 unsigned long t;
2542 unsigned int type;
2543 {
2544 unsigned char *imask;
2545 unsigned long imask_size;
2546 unsigned int i;
2547 int pos;
2548
2549 imask = region->r.record.r.mask.i;
2550 imask_size = region->r.record.r.imask_size;
2551 if (!imask)
2552 {
2553 imask_size = (region->r.record.r.rlen * 2 + 7) / 8 + 1;
2554 imask = xmalloc (imask_size);
2555 memset (imask, 0, imask_size);
2556
2557 region->r.record.r.imask_size = imask_size;
2558 region->r.record.r.mask.i = imask;
2559 }
2560
2561 i = (t / 4) + 1;
2562 pos = 2 * (3 - t % 4);
2563 while (regmask)
2564 {
2565 if (i >= imask_size)
2566 {
2567 as_bad ("Ignoring attempt to spill beyond end of region");
2568 return;
2569 }
2570
2571 imask[i] |= (type & 0x3) << pos;
2572
2573 regmask &= (regmask - 1);
2574 pos -= 2;
2575 if (pos < 0)
2576 {
2577 pos = 0;
2578 ++i;
2579 }
2580 }
2581 }
2582
2583 /* Return the number of instruction slots from FIRST_ADDR to SLOT_ADDR.
2584 SLOT_FRAG is the frag containing SLOT_ADDR, and FIRST_FRAG is the frag
2585 containing FIRST_ADDR. If BEFORE_RELAX, then we use worst-case estimates
2586 for frag sizes. */
2587
2588 unsigned long
2589 slot_index (slot_addr, slot_frag, first_addr, first_frag, before_relax)
2590 unsigned long slot_addr;
2591 fragS *slot_frag;
2592 unsigned long first_addr;
2593 fragS *first_frag;
2594 int before_relax;
2595 {
2596 unsigned long index = 0;
2597
2598 /* First time we are called, the initial address and frag are invalid. */
2599 if (first_addr == 0)
2600 return 0;
2601
2602 /* If the two addresses are in different frags, then we need to add in
2603 the remaining size of this frag, and then the entire size of intermediate
2604 frags. */
2605 while (slot_frag != first_frag)
2606 {
2607 unsigned long start_addr = (unsigned long) &first_frag->fr_literal;
2608
2609 if (! before_relax)
2610 {
2611 /* We can get the final addresses only during and after
2612 relaxation. */
2613 if (first_frag->fr_next && first_frag->fr_next->fr_address)
2614 index += 3 * ((first_frag->fr_next->fr_address
2615 - first_frag->fr_address
2616 - first_frag->fr_fix) >> 4);
2617 }
2618 else
2619 /* We don't know what the final addresses will be. We try our
2620 best to estimate. */
2621 switch (first_frag->fr_type)
2622 {
2623 default:
2624 break;
2625
2626 case rs_space:
2627 as_fatal ("only constant space allocation is supported");
2628 break;
2629
2630 case rs_align:
2631 case rs_align_code:
2632 case rs_align_test:
2633 /* Take alignment into account. Assume the worst case
2634 before relaxation. */
2635 index += 3 * ((1 << first_frag->fr_offset) >> 4);
2636 break;
2637
2638 case rs_org:
2639 if (first_frag->fr_symbol)
2640 {
2641 as_fatal ("only constant offsets are supported");
2642 break;
2643 }
2644 case rs_fill:
2645 index += 3 * (first_frag->fr_offset >> 4);
2646 break;
2647 }
2648
2649 /* Add in the full size of the frag converted to instruction slots. */
2650 index += 3 * (first_frag->fr_fix >> 4);
2651 /* Subtract away the initial part before first_addr. */
2652 index -= (3 * ((first_addr >> 4) - (start_addr >> 4))
2653 + ((first_addr & 0x3) - (start_addr & 0x3)));
2654
2655 /* Move to the beginning of the next frag. */
2656 first_frag = first_frag->fr_next;
2657 first_addr = (unsigned long) &first_frag->fr_literal;
2658 }
2659
2660 /* Add in the used part of the last frag. */
2661 index += (3 * ((slot_addr >> 4) - (first_addr >> 4))
2662 + ((slot_addr & 0x3) - (first_addr & 0x3)));
2663 return index;
2664 }
2665
2666 /* Optimize unwind record directives. */
2667
2668 static unw_rec_list *
2669 optimize_unw_records (list)
2670 unw_rec_list *list;
2671 {
2672 if (!list)
2673 return NULL;
2674
2675 /* If the only unwind record is ".prologue" or ".prologue" followed
2676 by ".body", then we can optimize the unwind directives away. */
2677 if (list->r.type == prologue
2678 && (list->next->r.type == endp
2679 || (list->next->r.type == body && list->next->next->r.type == endp)))
2680 return NULL;
2681
2682 return list;
2683 }
2684
2685 /* Given a complete record list, process any records which have
2686 unresolved fields, (ie length counts for a prologue). After
2687 this has been run, all necessary information should be available
2688 within each record to generate an image. */
2689
2690 static void
2691 fixup_unw_records (list, before_relax)
2692 unw_rec_list *list;
2693 int before_relax;
2694 {
2695 unw_rec_list *ptr, *region = 0;
2696 unsigned long first_addr = 0, rlen = 0, t;
2697 fragS *first_frag = 0;
2698
2699 for (ptr = list; ptr; ptr = ptr->next)
2700 {
2701 if (ptr->slot_number == SLOT_NUM_NOT_SET)
2702 as_bad (" Insn slot not set in unwind record.");
2703 t = slot_index (ptr->slot_number, ptr->slot_frag,
2704 first_addr, first_frag, before_relax);
2705 switch (ptr->r.type)
2706 {
2707 case prologue:
2708 case prologue_gr:
2709 case body:
2710 {
2711 unw_rec_list *last;
2712 int size;
2713 unsigned long last_addr = 0;
2714 fragS *last_frag = NULL;
2715
2716 first_addr = ptr->slot_number;
2717 first_frag = ptr->slot_frag;
2718 /* Find either the next body/prologue start, or the end of
2719 the function, and determine the size of the region. */
2720 for (last = ptr->next; last != NULL; last = last->next)
2721 if (last->r.type == prologue || last->r.type == prologue_gr
2722 || last->r.type == body || last->r.type == endp)
2723 {
2724 last_addr = last->slot_number;
2725 last_frag = last->slot_frag;
2726 break;
2727 }
2728 size = slot_index (last_addr, last_frag, first_addr, first_frag,
2729 before_relax);
2730 rlen = ptr->r.record.r.rlen = size;
2731 if (ptr->r.type == body)
2732 /* End of region. */
2733 region = 0;
2734 else
2735 region = ptr;
2736 break;
2737 }
2738 case epilogue:
2739 if (t < rlen)
2740 ptr->r.record.b.t = rlen - 1 - t;
2741 else
2742 /* This happens when a memory-stack-less procedure uses a
2743 ".restore sp" directive at the end of a region to pop
2744 the frame state. */
2745 ptr->r.record.b.t = 0;
2746 break;
2747
2748 case mem_stack_f:
2749 case mem_stack_v:
2750 case rp_when:
2751 case pfs_when:
2752 case preds_when:
2753 case unat_when:
2754 case lc_when:
2755 case fpsr_when:
2756 case priunat_when_gr:
2757 case priunat_when_mem:
2758 case bsp_when:
2759 case bspstore_when:
2760 case rnat_when:
2761 ptr->r.record.p.t = t;
2762 break;
2763
2764 case spill_reg:
2765 case spill_sprel:
2766 case spill_psprel:
2767 case spill_reg_p:
2768 case spill_sprel_p:
2769 case spill_psprel_p:
2770 ptr->r.record.x.t = t;
2771 break;
2772
2773 case frgr_mem:
2774 if (!region)
2775 {
2776 as_bad ("frgr_mem record before region record!");
2777 return;
2778 }
2779 region->r.record.r.mask.fr_mem |= ptr->r.record.p.frmask;
2780 region->r.record.r.mask.gr_mem |= ptr->r.record.p.grmask;
2781 set_imask (region, ptr->r.record.p.frmask, t, 1);
2782 set_imask (region, ptr->r.record.p.grmask, t, 2);
2783 break;
2784 case fr_mem:
2785 if (!region)
2786 {
2787 as_bad ("fr_mem record before region record!");
2788 return;
2789 }
2790 region->r.record.r.mask.fr_mem |= ptr->r.record.p.rmask;
2791 set_imask (region, ptr->r.record.p.rmask, t, 1);
2792 break;
2793 case gr_mem:
2794 if (!region)
2795 {
2796 as_bad ("gr_mem record before region record!");
2797 return;
2798 }
2799 region->r.record.r.mask.gr_mem |= ptr->r.record.p.rmask;
2800 set_imask (region, ptr->r.record.p.rmask, t, 2);
2801 break;
2802 case br_mem:
2803 if (!region)
2804 {
2805 as_bad ("br_mem record before region record!");
2806 return;
2807 }
2808 region->r.record.r.mask.br_mem |= ptr->r.record.p.brmask;
2809 set_imask (region, ptr->r.record.p.brmask, t, 3);
2810 break;
2811
2812 case gr_gr:
2813 if (!region)
2814 {
2815 as_bad ("gr_gr record before region record!");
2816 return;
2817 }
2818 set_imask (region, ptr->r.record.p.grmask, t, 2);
2819 break;
2820 case br_gr:
2821 if (!region)
2822 {
2823 as_bad ("br_gr record before region record!");
2824 return;
2825 }
2826 set_imask (region, ptr->r.record.p.brmask, t, 3);
2827 break;
2828
2829 default:
2830 break;
2831 }
2832 }
2833 }
2834
2835 /* Estimate the size of a frag before relaxing. We only have one type of frag
2836 to handle here, which is the unwind info frag. */
2837
2838 int
2839 ia64_estimate_size_before_relax (fragS *frag,
2840 asection *segtype ATTRIBUTE_UNUSED)
2841 {
2842 unw_rec_list *list;
2843 int len, size, pad;
2844
2845 /* ??? This code is identical to the first part of ia64_convert_frag. */
2846 list = (unw_rec_list *) frag->fr_opcode;
2847 fixup_unw_records (list, 0);
2848
2849 len = calc_record_size (list);
2850 /* pad to pointer-size boundary. */
2851 pad = len % md.pointer_size;
2852 if (pad != 0)
2853 len += md.pointer_size - pad;
2854 /* Add 8 for the header. */
2855 size = len + 8;
2856 /* Add a pointer for the personality offset. */
2857 if (frag->fr_offset)
2858 size += md.pointer_size;
2859
2860 /* fr_var carries the max_chars that we created the fragment with.
2861 We must, of course, have allocated enough memory earlier. */
2862 assert (frag->fr_var >= size);
2863
2864 return frag->fr_fix + size;
2865 }
2866
2867 /* This function converts a rs_machine_dependent variant frag into a
2868 normal fill frag with the unwind image from the the record list. */
2869 void
2870 ia64_convert_frag (fragS *frag)
2871 {
2872 unw_rec_list *list;
2873 int len, size, pad;
2874 valueT flag_value;
2875
2876 /* ??? This code is identical to ia64_estimate_size_before_relax. */
2877 list = (unw_rec_list *) frag->fr_opcode;
2878 fixup_unw_records (list, 0);
2879
2880 len = calc_record_size (list);
2881 /* pad to pointer-size boundary. */
2882 pad = len % md.pointer_size;
2883 if (pad != 0)
2884 len += md.pointer_size - pad;
2885 /* Add 8 for the header. */
2886 size = len + 8;
2887 /* Add a pointer for the personality offset. */
2888 if (frag->fr_offset)
2889 size += md.pointer_size;
2890
2891 /* fr_var carries the max_chars that we created the fragment with.
2892 We must, of course, have allocated enough memory earlier. */
2893 assert (frag->fr_var >= size);
2894
2895 /* Initialize the header area. fr_offset is initialized with
2896 unwind.personality_routine. */
2897 if (frag->fr_offset)
2898 {
2899 if (md.flags & EF_IA_64_ABI64)
2900 flag_value = (bfd_vma) 3 << 32;
2901 else
2902 /* 32-bit unwind info block. */
2903 flag_value = (bfd_vma) 0x1003 << 32;
2904 }
2905 else
2906 flag_value = 0;
2907
2908 md_number_to_chars (frag->fr_literal,
2909 (((bfd_vma) 1 << 48) /* Version. */
2910 | flag_value /* U & E handler flags. */
2911 | (len / md.pointer_size)), /* Length. */
2912 8);
2913
2914 /* Skip the header. */
2915 vbyte_mem_ptr = frag->fr_literal + 8;
2916 process_unw_records (list, output_vbyte_mem);
2917
2918 /* Fill the padding bytes with zeros. */
2919 if (pad != 0)
2920 md_number_to_chars (frag->fr_literal + len + 8 - md.pointer_size + pad, 0,
2921 md.pointer_size - pad);
2922
2923 frag->fr_fix += size;
2924 frag->fr_type = rs_fill;
2925 frag->fr_var = 0;
2926 frag->fr_offset = 0;
2927 }
2928
2929 static int
2930 convert_expr_to_ab_reg (e, ab, regp)
2931 expressionS *e;
2932 unsigned int *ab;
2933 unsigned int *regp;
2934 {
2935 unsigned int reg;
2936
2937 if (e->X_op != O_register)
2938 return 0;
2939
2940 reg = e->X_add_number;
2941 if (reg >= (REG_GR + 4) && reg <= (REG_GR + 7))
2942 {
2943 *ab = 0;
2944 *regp = reg - REG_GR;
2945 }
2946 else if ((reg >= (REG_FR + 2) && reg <= (REG_FR + 5))
2947 || (reg >= (REG_FR + 16) && reg <= (REG_FR + 31)))
2948 {
2949 *ab = 1;
2950 *regp = reg - REG_FR;
2951 }
2952 else if (reg >= (REG_BR + 1) && reg <= (REG_BR + 5))
2953 {
2954 *ab = 2;
2955 *regp = reg - REG_BR;
2956 }
2957 else
2958 {
2959 *ab = 3;
2960 switch (reg)
2961 {
2962 case REG_PR: *regp = 0; break;
2963 case REG_PSP: *regp = 1; break;
2964 case REG_PRIUNAT: *regp = 2; break;
2965 case REG_BR + 0: *regp = 3; break;
2966 case REG_AR + AR_BSP: *regp = 4; break;
2967 case REG_AR + AR_BSPSTORE: *regp = 5; break;
2968 case REG_AR + AR_RNAT: *regp = 6; break;
2969 case REG_AR + AR_UNAT: *regp = 7; break;
2970 case REG_AR + AR_FPSR: *regp = 8; break;
2971 case REG_AR + AR_PFS: *regp = 9; break;
2972 case REG_AR + AR_LC: *regp = 10; break;
2973
2974 default:
2975 return 0;
2976 }
2977 }
2978 return 1;
2979 }
2980
2981 static int
2982 convert_expr_to_xy_reg (e, xy, regp)
2983 expressionS *e;
2984 unsigned int *xy;
2985 unsigned int *regp;
2986 {
2987 unsigned int reg;
2988
2989 if (e->X_op != O_register)
2990 return 0;
2991
2992 reg = e->X_add_number;
2993
2994 if (/* reg >= REG_GR && */ reg <= (REG_GR + 127))
2995 {
2996 *xy = 0;
2997 *regp = reg - REG_GR;
2998 }
2999 else if (reg >= REG_FR && reg <= (REG_FR + 127))
3000 {
3001 *xy = 1;
3002 *regp = reg - REG_FR;
3003 }
3004 else if (reg >= REG_BR && reg <= (REG_BR + 7))
3005 {
3006 *xy = 2;
3007 *regp = reg - REG_BR;
3008 }
3009 else
3010 return -1;
3011 return 1;
3012 }
3013
3014 static void
3015 dot_align (int arg)
3016 {
3017 /* The current frag is an alignment frag. */
3018 align_frag = frag_now;
3019 s_align_bytes (arg);
3020 }
3021
3022 static void
3023 dot_radix (dummy)
3024 int dummy ATTRIBUTE_UNUSED;
3025 {
3026 int radix;
3027
3028 SKIP_WHITESPACE ();
3029 radix = *input_line_pointer++;
3030
3031 if (radix != 'C' && !is_end_of_line[(unsigned char) radix])
3032 {
3033 as_bad ("Radix `%c' unsupported", *input_line_pointer);
3034 ignore_rest_of_line ();
3035 return;
3036 }
3037 }
3038
3039 /* Helper function for .loc directives. If the assembler is not generating
3040 line number info, then we need to remember which instructions have a .loc
3041 directive, and only call dwarf2_gen_line_info for those instructions. */
3042
3043 static void
3044 dot_loc (int x)
3045 {
3046 CURR_SLOT.loc_directive_seen = 1;
3047 dwarf2_directive_loc (x);
3048 }
3049
3050 /* .sbss, .bss etc. are macros that expand into ".section SECNAME". */
3051 static void
3052 dot_special_section (which)
3053 int which;
3054 {
3055 set_section ((char *) special_section_name[which]);
3056 }
3057
3058 static void
3059 unwind_diagnostic (const char * region, const char *directive)
3060 {
3061 if (md.unwind_check == unwind_check_warning)
3062 as_warn (".%s outside of %s", directive, region);
3063 else
3064 {
3065 as_bad (".%s outside of %s", directive, region);
3066 ignore_rest_of_line ();
3067 }
3068 }
3069
3070 static int
3071 in_procedure (const char *directive)
3072 {
3073 if (unwind.proc_start
3074 && (!unwind.saved_text_seg || strcmp (directive, "endp") == 0))
3075 return 1;
3076 unwind_diagnostic ("procedure", directive);
3077 return 0;
3078 }
3079
3080 static int
3081 in_prologue (const char *directive)
3082 {
3083 if (in_procedure (directive))
3084 {
3085 /* We are in a procedure. Check if we are in a prologue. */
3086 if (unwind.prologue)
3087 return 1;
3088 unwind_diagnostic ("prologue", directive);
3089 }
3090 return 0;
3091 }
3092
3093 static int
3094 in_body (const char *directive)
3095 {
3096 if (in_procedure (directive))
3097 {
3098 /* We are in a procedure. Check if we are in a body. */
3099 if (unwind.body)
3100 return 1;
3101 unwind_diagnostic ("body region", directive);
3102 }
3103 return 0;
3104 }
3105
3106 static void
3107 add_unwind_entry (ptr)
3108 unw_rec_list *ptr;
3109 {
3110 if (unwind.tail)
3111 unwind.tail->next = ptr;
3112 else
3113 unwind.list = ptr;
3114 unwind.tail = ptr;
3115
3116 /* The current entry can in fact be a chain of unwind entries. */
3117 if (unwind.current_entry == NULL)
3118 unwind.current_entry = ptr;
3119 }
3120
3121 static void
3122 dot_fframe (dummy)
3123 int dummy ATTRIBUTE_UNUSED;
3124 {
3125 expressionS e;
3126
3127 if (!in_prologue ("fframe"))
3128 return;
3129
3130 parse_operand (&e);
3131
3132 if (e.X_op != O_constant)
3133 as_bad ("Operand to .fframe must be a constant");
3134 else
3135 add_unwind_entry (output_mem_stack_f (e.X_add_number));
3136 }
3137
3138 static void
3139 dot_vframe (dummy)
3140 int dummy ATTRIBUTE_UNUSED;
3141 {
3142 expressionS e;
3143 unsigned reg;
3144
3145 if (!in_prologue ("vframe"))
3146 return;
3147
3148 parse_operand (&e);
3149 reg = e.X_add_number - REG_GR;
3150 if (e.X_op == O_register && reg < 128)
3151 {
3152 add_unwind_entry (output_mem_stack_v ());
3153 if (! (unwind.prologue_mask & 2))
3154 add_unwind_entry (output_psp_gr (reg));
3155 }
3156 else
3157 as_bad ("First operand to .vframe must be a general register");
3158 }
3159
3160 static void
3161 dot_vframesp (dummy)
3162 int dummy ATTRIBUTE_UNUSED;
3163 {
3164 expressionS e;
3165
3166 if (!in_prologue ("vframesp"))
3167 return;
3168
3169 parse_operand (&e);
3170 if (e.X_op == O_constant)
3171 {
3172 add_unwind_entry (output_mem_stack_v ());
3173 add_unwind_entry (output_psp_sprel (e.X_add_number));
3174 }
3175 else
3176 as_bad ("Operand to .vframesp must be a constant (sp-relative offset)");
3177 }
3178
3179 static void
3180 dot_vframepsp (dummy)
3181 int dummy ATTRIBUTE_UNUSED;
3182 {
3183 expressionS e;
3184
3185 if (!in_prologue ("vframepsp"))
3186 return;
3187
3188 parse_operand (&e);
3189 if (e.X_op == O_constant)
3190 {
3191 add_unwind_entry (output_mem_stack_v ());
3192 add_unwind_entry (output_psp_sprel (e.X_add_number));
3193 }
3194 else
3195 as_bad ("Operand to .vframepsp must be a constant (psp-relative offset)");
3196 }
3197
3198 static void
3199 dot_save (dummy)
3200 int dummy ATTRIBUTE_UNUSED;
3201 {
3202 expressionS e1, e2;
3203 int sep;
3204 int reg1, reg2;
3205
3206 if (!in_prologue ("save"))
3207 return;
3208
3209 sep = parse_operand (&e1);
3210 if (sep != ',')
3211 as_bad ("No second operand to .save");
3212 sep = parse_operand (&e2);
3213
3214 reg1 = e1.X_add_number;
3215 reg2 = e2.X_add_number - REG_GR;
3216
3217 /* Make sure its a valid ar.xxx reg, OR its br0, aka 'rp'. */
3218 if (e1.X_op == O_register)
3219 {
3220 if (e2.X_op == O_register && reg2 >= 0 && reg2 < 128)
3221 {
3222 switch (reg1)
3223 {
3224 case REG_AR + AR_BSP:
3225 add_unwind_entry (output_bsp_when ());
3226 add_unwind_entry (output_bsp_gr (reg2));
3227 break;
3228 case REG_AR + AR_BSPSTORE:
3229 add_unwind_entry (output_bspstore_when ());
3230 add_unwind_entry (output_bspstore_gr (reg2));
3231 break;
3232 case REG_AR + AR_RNAT:
3233 add_unwind_entry (output_rnat_when ());
3234 add_unwind_entry (output_rnat_gr (reg2));
3235 break;
3236 case REG_AR + AR_UNAT:
3237 add_unwind_entry (output_unat_when ());
3238 add_unwind_entry (output_unat_gr (reg2));
3239 break;
3240 case REG_AR + AR_FPSR:
3241 add_unwind_entry (output_fpsr_when ());
3242 add_unwind_entry (output_fpsr_gr (reg2));
3243 break;
3244 case REG_AR + AR_PFS:
3245 add_unwind_entry (output_pfs_when ());
3246 if (! (unwind.prologue_mask & 4))
3247 add_unwind_entry (output_pfs_gr (reg2));
3248 break;
3249 case REG_AR + AR_LC:
3250 add_unwind_entry (output_lc_when ());
3251 add_unwind_entry (output_lc_gr (reg2));
3252 break;
3253 case REG_BR:
3254 add_unwind_entry (output_rp_when ());
3255 if (! (unwind.prologue_mask & 8))
3256 add_unwind_entry (output_rp_gr (reg2));
3257 break;
3258 case REG_PR:
3259 add_unwind_entry (output_preds_when ());
3260 if (! (unwind.prologue_mask & 1))
3261 add_unwind_entry (output_preds_gr (reg2));
3262 break;
3263 case REG_PRIUNAT:
3264 add_unwind_entry (output_priunat_when_gr ());
3265 add_unwind_entry (output_priunat_gr (reg2));
3266 break;
3267 default:
3268 as_bad ("First operand not a valid register");
3269 }
3270 }
3271 else
3272 as_bad (" Second operand not a valid register");
3273 }
3274 else
3275 as_bad ("First operand not a register");
3276 }
3277
3278 static void
3279 dot_restore (dummy)
3280 int dummy ATTRIBUTE_UNUSED;
3281 {
3282 expressionS e1, e2;
3283 unsigned long ecount; /* # of _additional_ regions to pop */
3284 int sep;
3285
3286 if (!in_body ("restore"))
3287 return;
3288
3289 sep = parse_operand (&e1);
3290 if (e1.X_op != O_register || e1.X_add_number != REG_GR + 12)
3291 {
3292 as_bad ("First operand to .restore must be stack pointer (sp)");
3293 return;
3294 }
3295
3296 if (sep == ',')
3297 {
3298 parse_operand (&e2);
3299 if (e2.X_op != O_constant || e2.X_add_number < 0)
3300 {
3301 as_bad ("Second operand to .restore must be a constant >= 0");
3302 return;
3303 }
3304 ecount = e2.X_add_number;
3305 }
3306 else
3307 ecount = unwind.prologue_count - 1;
3308
3309 if (ecount >= unwind.prologue_count)
3310 {
3311 as_bad ("Epilogue count of %lu exceeds number of nested prologues (%u)",
3312 ecount + 1, unwind.prologue_count);
3313 return;
3314 }
3315
3316 add_unwind_entry (output_epilogue (ecount));
3317
3318 if (ecount < unwind.prologue_count)
3319 unwind.prologue_count -= ecount + 1;
3320 else
3321 unwind.prologue_count = 0;
3322 }
3323
3324 static void
3325 dot_restorereg (dummy)
3326 int dummy ATTRIBUTE_UNUSED;
3327 {
3328 unsigned int ab, reg;
3329 expressionS e;
3330
3331 if (!in_procedure ("restorereg"))
3332 return;
3333
3334 parse_operand (&e);
3335
3336 if (!convert_expr_to_ab_reg (&e, &ab, &reg))
3337 {
3338 as_bad ("First operand to .restorereg must be a preserved register");
3339 return;
3340 }
3341 add_unwind_entry (output_spill_reg (ab, reg, 0, 0));
3342 }
3343
3344 static void
3345 dot_restorereg_p (dummy)
3346 int dummy ATTRIBUTE_UNUSED;
3347 {
3348 unsigned int qp, ab, reg;
3349 expressionS e1, e2;
3350 int sep;
3351
3352 if (!in_procedure ("restorereg.p"))
3353 return;
3354
3355 sep = parse_operand (&e1);
3356 if (sep != ',')
3357 {
3358 as_bad ("No second operand to .restorereg.p");
3359 return;
3360 }
3361
3362 parse_operand (&e2);
3363
3364 qp = e1.X_add_number - REG_P;
3365 if (e1.X_op != O_register || qp > 63)
3366 {
3367 as_bad ("First operand to .restorereg.p must be a predicate");
3368 return;
3369 }
3370
3371 if (!convert_expr_to_ab_reg (&e2, &ab, &reg))
3372 {
3373 as_bad ("Second operand to .restorereg.p must be a preserved register");
3374 return;
3375 }
3376 add_unwind_entry (output_spill_reg_p (ab, reg, 0, 0, qp));
3377 }
3378
3379 static char *special_linkonce_name[] =
3380 {
3381 ".gnu.linkonce.ia64unw.", ".gnu.linkonce.ia64unwi."
3382 };
3383
3384 static void
3385 start_unwind_section (const segT text_seg, int sec_index, int linkonce_empty)
3386 {
3387 /*
3388 Use a slightly ugly scheme to derive the unwind section names from
3389 the text section name:
3390
3391 text sect. unwind table sect.
3392 name: name: comments:
3393 ---------- ----------------- --------------------------------
3394 .text .IA_64.unwind
3395 .text.foo .IA_64.unwind.text.foo
3396 .foo .IA_64.unwind.foo
3397 .gnu.linkonce.t.foo
3398 .gnu.linkonce.ia64unw.foo
3399 _info .IA_64.unwind_info gas issues error message (ditto)
3400 _infoFOO .IA_64.unwind_infoFOO gas issues error message (ditto)
3401
3402 This mapping is done so that:
3403
3404 (a) An object file with unwind info only in .text will use
3405 unwind section names .IA_64.unwind and .IA_64.unwind_info.
3406 This follows the letter of the ABI and also ensures backwards
3407 compatibility with older toolchains.
3408
3409 (b) An object file with unwind info in multiple text sections
3410 will use separate unwind sections for each text section.
3411 This allows us to properly set the "sh_info" and "sh_link"
3412 fields in SHT_IA_64_UNWIND as required by the ABI and also
3413 lets GNU ld support programs with multiple segments
3414 containing unwind info (as might be the case for certain
3415 embedded applications).
3416
3417 (c) An error is issued if there would be a name clash.
3418 */
3419
3420 const char *text_name, *sec_text_name;
3421 char *sec_name;
3422 const char *prefix = special_section_name [sec_index];
3423 const char *suffix;
3424 size_t prefix_len, suffix_len, sec_name_len;
3425
3426 sec_text_name = segment_name (text_seg);
3427 text_name = sec_text_name;
3428 if (strncmp (text_name, "_info", 5) == 0)
3429 {
3430 as_bad ("Illegal section name `%s' (causes unwind section name clash)",
3431 text_name);
3432 ignore_rest_of_line ();
3433 return;
3434 }
3435 if (strcmp (text_name, ".text") == 0)
3436 text_name = "";
3437
3438 /* Build the unwind section name by appending the (possibly stripped)
3439 text section name to the unwind prefix. */
3440 suffix = text_name;
3441 if (strncmp (text_name, ".gnu.linkonce.t.",
3442 sizeof (".gnu.linkonce.t.") - 1) == 0)
3443 {
3444 prefix = special_linkonce_name [sec_index - SPECIAL_SECTION_UNWIND];
3445 suffix += sizeof (".gnu.linkonce.t.") - 1;
3446 }
3447 else if (linkonce_empty)
3448 return;
3449
3450 prefix_len = strlen (prefix);
3451 suffix_len = strlen (suffix);
3452 sec_name_len = prefix_len + suffix_len;
3453 sec_name = alloca (sec_name_len + 1);
3454 memcpy (sec_name, prefix, prefix_len);
3455 memcpy (sec_name + prefix_len, suffix, suffix_len);
3456 sec_name [sec_name_len] = '\0';
3457
3458 /* Handle COMDAT group. */
3459 if (suffix == text_name && (text_seg->flags & SEC_LINK_ONCE) != 0)
3460 {
3461 char *section;
3462 size_t len, group_name_len;
3463 const char *group_name = elf_group_name (text_seg);
3464
3465 if (group_name == NULL)
3466 {
3467 as_bad ("Group section `%s' has no group signature",
3468 sec_text_name);
3469 ignore_rest_of_line ();
3470 return;
3471 }
3472 /* We have to construct a fake section directive. */
3473 group_name_len = strlen (group_name);
3474 len = (sec_name_len
3475 + 16 /* ,"aG",@progbits, */
3476 + group_name_len /* ,group_name */
3477 + 7); /* ,comdat */
3478
3479 section = alloca (len + 1);
3480 memcpy (section, sec_name, sec_name_len);
3481 memcpy (section + sec_name_len, ",\"aG\",@progbits,", 16);
3482 memcpy (section + sec_name_len + 16, group_name, group_name_len);
3483 memcpy (section + len - 7, ",comdat", 7);
3484 section [len] = '\0';
3485 set_section (section);
3486 }
3487 else
3488 {
3489 set_section (sec_name);
3490 bfd_set_section_flags (stdoutput, now_seg,
3491 SEC_LOAD | SEC_ALLOC | SEC_READONLY);
3492 }
3493
3494 elf_linked_to_section (now_seg) = text_seg;
3495 }
3496
3497 static void
3498 generate_unwind_image (const segT text_seg)
3499 {
3500 int size, pad;
3501 unw_rec_list *list;
3502
3503 /* Mark the end of the unwind info, so that we can compute the size of the
3504 last unwind region. */
3505 add_unwind_entry (output_endp ());
3506
3507 /* Force out pending instructions, to make sure all unwind records have
3508 a valid slot_number field. */
3509 ia64_flush_insns ();
3510
3511 /* Generate the unwind record. */
3512 list = optimize_unw_records (unwind.list);
3513 fixup_unw_records (list, 1);
3514 size = calc_record_size (list);
3515
3516 if (size > 0 || unwind.force_unwind_entry)
3517 {
3518 unwind.force_unwind_entry = 0;
3519 /* pad to pointer-size boundary. */
3520 pad = size % md.pointer_size;
3521 if (pad != 0)
3522 size += md.pointer_size - pad;
3523 /* Add 8 for the header. */
3524 size += 8;
3525 /* Add a pointer for the personality offset. */
3526 if (unwind.personality_routine)
3527 size += md.pointer_size;
3528 }
3529
3530 /* If there are unwind records, switch sections, and output the info. */
3531 if (size != 0)
3532 {
3533 expressionS exp;
3534 bfd_reloc_code_real_type reloc;
3535
3536 start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 0);
3537
3538 /* Make sure the section has 4 byte alignment for ILP32 and
3539 8 byte alignment for LP64. */
3540 frag_align (md.pointer_size_shift, 0, 0);
3541 record_alignment (now_seg, md.pointer_size_shift);
3542
3543 /* Set expression which points to start of unwind descriptor area. */
3544 unwind.info = expr_build_dot ();
3545
3546 frag_var (rs_machine_dependent, size, size, 0, 0,
3547 (offsetT) (long) unwind.personality_routine,
3548 (char *) list);
3549
3550 /* Add the personality address to the image. */
3551 if (unwind.personality_routine != 0)
3552 {
3553 exp.X_op = O_symbol;
3554 exp.X_add_symbol = unwind.personality_routine;
3555 exp.X_add_number = 0;
3556
3557 if (md.flags & EF_IA_64_BE)
3558 {
3559 if (md.flags & EF_IA_64_ABI64)
3560 reloc = BFD_RELOC_IA64_LTOFF_FPTR64MSB;
3561 else
3562 reloc = BFD_RELOC_IA64_LTOFF_FPTR32MSB;
3563 }
3564 else
3565 {
3566 if (md.flags & EF_IA_64_ABI64)
3567 reloc = BFD_RELOC_IA64_LTOFF_FPTR64LSB;
3568 else
3569 reloc = BFD_RELOC_IA64_LTOFF_FPTR32LSB;
3570 }
3571
3572 fix_new_exp (frag_now, frag_now_fix () - md.pointer_size,
3573 md.pointer_size, &exp, 0, reloc);
3574 unwind.personality_routine = 0;
3575 }
3576 }
3577 else
3578 start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 1);
3579
3580 free_saved_prologue_counts ();
3581 unwind.list = unwind.tail = unwind.current_entry = NULL;
3582 }
3583
3584 static void
3585 dot_handlerdata (dummy)
3586 int dummy ATTRIBUTE_UNUSED;
3587 {
3588 if (!in_procedure ("handlerdata"))
3589 return;
3590 unwind.force_unwind_entry = 1;
3591
3592 /* Remember which segment we're in so we can switch back after .endp */
3593 unwind.saved_text_seg = now_seg;
3594 unwind.saved_text_subseg = now_subseg;
3595
3596 /* Generate unwind info into unwind-info section and then leave that
3597 section as the currently active one so dataXX directives go into
3598 the language specific data area of the unwind info block. */
3599 generate_unwind_image (now_seg);
3600 demand_empty_rest_of_line ();
3601 }
3602
3603 static void
3604 dot_unwentry (dummy)
3605 int dummy ATTRIBUTE_UNUSED;
3606 {
3607 if (!in_procedure ("unwentry"))
3608 return;
3609 unwind.force_unwind_entry = 1;
3610 demand_empty_rest_of_line ();
3611 }
3612
3613 static void
3614 dot_altrp (dummy)
3615 int dummy ATTRIBUTE_UNUSED;
3616 {
3617 expressionS e;
3618 unsigned reg;
3619
3620 if (!in_prologue ("altrp"))
3621 return;
3622
3623 parse_operand (&e);
3624 reg = e.X_add_number - REG_BR;
3625 if (e.X_op == O_register && reg < 8)
3626 add_unwind_entry (output_rp_br (reg));
3627 else
3628 as_bad ("First operand not a valid branch register");
3629 }
3630
3631 static void
3632 dot_savemem (psprel)
3633 int psprel;
3634 {
3635 expressionS e1, e2;
3636 int sep;
3637 int reg1, val;
3638
3639 if (!in_prologue (psprel ? "savepsp" : "savesp"))
3640 return;
3641
3642 sep = parse_operand (&e1);
3643 if (sep != ',')
3644 as_bad ("No second operand to .save%ssp", psprel ? "p" : "");
3645 sep = parse_operand (&e2);
3646
3647 reg1 = e1.X_add_number;
3648 val = e2.X_add_number;
3649
3650 /* Make sure its a valid ar.xxx reg, OR its br0, aka 'rp'. */
3651 if (e1.X_op == O_register)
3652 {
3653 if (e2.X_op == O_constant)
3654 {
3655 switch (reg1)
3656 {
3657 case REG_AR + AR_BSP:
3658 add_unwind_entry (output_bsp_when ());
3659 add_unwind_entry ((psprel
3660 ? output_bsp_psprel
3661 : output_bsp_sprel) (val));
3662 break;
3663 case REG_AR + AR_BSPSTORE:
3664 add_unwind_entry (output_bspstore_when ());
3665 add_unwind_entry ((psprel
3666 ? output_bspstore_psprel
3667 : output_bspstore_sprel) (val));
3668 break;
3669 case REG_AR + AR_RNAT:
3670 add_unwind_entry (output_rnat_when ());
3671 add_unwind_entry ((psprel
3672 ? output_rnat_psprel
3673 : output_rnat_sprel) (val));
3674 break;
3675 case REG_AR + AR_UNAT:
3676 add_unwind_entry (output_unat_when ());
3677 add_unwind_entry ((psprel
3678 ? output_unat_psprel
3679 : output_unat_sprel) (val));
3680 break;
3681 case REG_AR + AR_FPSR:
3682 add_unwind_entry (output_fpsr_when ());
3683 add_unwind_entry ((psprel
3684 ? output_fpsr_psprel
3685 : output_fpsr_sprel) (val));
3686 break;
3687 case REG_AR + AR_PFS:
3688 add_unwind_entry (output_pfs_when ());
3689 add_unwind_entry ((psprel
3690 ? output_pfs_psprel
3691 : output_pfs_sprel) (val));
3692 break;
3693 case REG_AR + AR_LC:
3694 add_unwind_entry (output_lc_when ());
3695 add_unwind_entry ((psprel
3696 ? output_lc_psprel
3697 : output_lc_sprel) (val));
3698 break;
3699 case REG_BR:
3700 add_unwind_entry (output_rp_when ());
3701 add_unwind_entry ((psprel
3702 ? output_rp_psprel
3703 : output_rp_sprel) (val));
3704 break;
3705 case REG_PR:
3706 add_unwind_entry (output_preds_when ());
3707 add_unwind_entry ((psprel
3708 ? output_preds_psprel
3709 : output_preds_sprel) (val));
3710 break;
3711 case REG_PRIUNAT:
3712 add_unwind_entry (output_priunat_when_mem ());
3713 add_unwind_entry ((psprel
3714 ? output_priunat_psprel
3715 : output_priunat_sprel) (val));
3716 break;
3717 default:
3718 as_bad ("First operand not a valid register");
3719 }
3720 }
3721 else
3722 as_bad (" Second operand not a valid constant");
3723 }
3724 else
3725 as_bad ("First operand not a register");
3726 }
3727
3728 static void
3729 dot_saveg (dummy)
3730 int dummy ATTRIBUTE_UNUSED;
3731 {
3732 expressionS e1, e2;
3733 int sep;
3734
3735 if (!in_prologue ("save.g"))
3736 return;
3737
3738 sep = parse_operand (&e1);
3739 if (sep == ',')
3740 parse_operand (&e2);
3741
3742 if (e1.X_op != O_constant)
3743 as_bad ("First operand to .save.g must be a constant.");
3744 else
3745 {
3746 int grmask = e1.X_add_number;
3747 if (sep != ',')
3748 add_unwind_entry (output_gr_mem (grmask));
3749 else
3750 {
3751 int reg = e2.X_add_number - REG_GR;
3752 if (e2.X_op == O_register && reg >= 0 && reg < 128)
3753 add_unwind_entry (output_gr_gr (grmask, reg));
3754 else
3755 as_bad ("Second operand is an invalid register.");
3756 }
3757 }
3758 }
3759
3760 static void
3761 dot_savef (dummy)
3762 int dummy ATTRIBUTE_UNUSED;
3763 {
3764 expressionS e1;
3765 int sep;
3766
3767 if (!in_prologue ("save.f"))
3768 return;
3769
3770 sep = parse_operand (&e1);
3771
3772 if (e1.X_op != O_constant)
3773 as_bad ("Operand to .save.f must be a constant.");
3774 else
3775 add_unwind_entry (output_fr_mem (e1.X_add_number));
3776 }
3777
3778 static void
3779 dot_saveb (dummy)
3780 int dummy ATTRIBUTE_UNUSED;
3781 {
3782 expressionS e1, e2;
3783 unsigned int reg;
3784 unsigned char sep;
3785 int brmask;
3786
3787 if (!in_prologue ("save.b"))
3788 return;
3789
3790 sep = parse_operand (&e1);
3791 if (e1.X_op != O_constant)
3792 {
3793 as_bad ("First operand to .save.b must be a constant.");
3794 return;
3795 }
3796 brmask = e1.X_add_number;
3797
3798 if (sep == ',')
3799 {
3800 sep = parse_operand (&e2);
3801 reg = e2.X_add_number - REG_GR;
3802 if (e2.X_op != O_register || reg > 127)
3803 {
3804 as_bad ("Second operand to .save.b must be a general register.");
3805 return;
3806 }
3807 add_unwind_entry (output_br_gr (brmask, e2.X_add_number));
3808 }
3809 else
3810 add_unwind_entry (output_br_mem (brmask));
3811
3812 if (!is_end_of_line[sep] && !is_it_end_of_statement ())
3813 demand_empty_rest_of_line ();
3814 }
3815
3816 static void
3817 dot_savegf (dummy)
3818 int dummy ATTRIBUTE_UNUSED;
3819 {
3820 expressionS e1, e2;
3821 int sep;
3822
3823 if (!in_prologue ("save.gf"))
3824 return;
3825
3826 sep = parse_operand (&e1);
3827 if (sep == ',')
3828 parse_operand (&e2);
3829
3830 if (e1.X_op != O_constant || sep != ',' || e2.X_op != O_constant)
3831 as_bad ("Both operands of .save.gf must be constants.");
3832 else
3833 {
3834 int grmask = e1.X_add_number;
3835 int frmask = e2.X_add_number;
3836 add_unwind_entry (output_frgr_mem (grmask, frmask));
3837 }
3838 }
3839
3840 static void
3841 dot_spill (dummy)
3842 int dummy ATTRIBUTE_UNUSED;
3843 {
3844 expressionS e;
3845 unsigned char sep;
3846
3847 if (!in_prologue ("spill"))
3848 return;
3849
3850 sep = parse_operand (&e);
3851 if (!is_end_of_line[sep] && !is_it_end_of_statement ())
3852 demand_empty_rest_of_line ();
3853
3854 if (e.X_op != O_constant)
3855 as_bad ("Operand to .spill must be a constant");
3856 else
3857 add_unwind_entry (output_spill_base (e.X_add_number));
3858 }
3859
3860 static void
3861 dot_spillreg (dummy)
3862 int dummy ATTRIBUTE_UNUSED;
3863 {
3864 int sep, ab, xy, reg, treg;
3865 expressionS e1, e2;
3866
3867 if (!in_procedure ("spillreg"))
3868 return;
3869
3870 sep = parse_operand (&e1);
3871 if (sep != ',')
3872 {
3873 as_bad ("No second operand to .spillreg");
3874 return;
3875 }
3876
3877 parse_operand (&e2);
3878
3879 if (!convert_expr_to_ab_reg (&e1, &ab, &reg))
3880 {
3881 as_bad ("First operand to .spillreg must be a preserved register");
3882 return;
3883 }
3884
3885 if (!convert_expr_to_xy_reg (&e2, &xy, &treg))
3886 {
3887 as_bad ("Second operand to .spillreg must be a register");
3888 return;
3889 }
3890
3891 add_unwind_entry (output_spill_reg (ab, reg, treg, xy));
3892 }
3893
3894 static void
3895 dot_spillmem (psprel)
3896 int psprel;
3897 {
3898 expressionS e1, e2;
3899 int sep, ab, reg;
3900
3901 if (!in_procedure ("spillmem"))
3902 return;
3903
3904 sep = parse_operand (&e1);
3905 if (sep != ',')
3906 {
3907 as_bad ("Second operand missing");
3908 return;
3909 }
3910
3911 parse_operand (&e2);
3912
3913 if (!convert_expr_to_ab_reg (&e1, &ab, &reg))
3914 {
3915 as_bad ("First operand to .spill%s must be a preserved register",
3916 psprel ? "psp" : "sp");
3917 return;
3918 }
3919
3920 if (e2.X_op != O_constant)
3921 {
3922 as_bad ("Second operand to .spill%s must be a constant",
3923 psprel ? "psp" : "sp");
3924 return;
3925 }
3926
3927 if (psprel)
3928 add_unwind_entry (output_spill_psprel (ab, reg, e2.X_add_number));
3929 else
3930 add_unwind_entry (output_spill_sprel (ab, reg, e2.X_add_number));
3931 }
3932
3933 static void
3934 dot_spillreg_p (dummy)
3935 int dummy ATTRIBUTE_UNUSED;
3936 {
3937 int sep, ab, xy, reg, treg;
3938 expressionS e1, e2, e3;
3939 unsigned int qp;
3940
3941 if (!in_procedure ("spillreg.p"))
3942 return;
3943
3944 sep = parse_operand (&e1);
3945 if (sep != ',')
3946 {
3947 as_bad ("No second and third operand to .spillreg.p");
3948 return;
3949 }
3950
3951 sep = parse_operand (&e2);
3952 if (sep != ',')
3953 {
3954 as_bad ("No third operand to .spillreg.p");
3955 return;
3956 }
3957
3958 parse_operand (&e3);
3959
3960 qp = e1.X_add_number - REG_P;
3961
3962 if (e1.X_op != O_register || qp > 63)
3963 {
3964 as_bad ("First operand to .spillreg.p must be a predicate");
3965 return;
3966 }
3967
3968 if (!convert_expr_to_ab_reg (&e2, &ab, &reg))
3969 {
3970 as_bad ("Second operand to .spillreg.p must be a preserved register");
3971 return;
3972 }
3973
3974 if (!convert_expr_to_xy_reg (&e3, &xy, &treg))
3975 {
3976 as_bad ("Third operand to .spillreg.p must be a register");
3977 return;
3978 }
3979
3980 add_unwind_entry (output_spill_reg_p (ab, reg, treg, xy, qp));
3981 }
3982
3983 static void
3984 dot_spillmem_p (psprel)
3985 int psprel;
3986 {
3987 expressionS e1, e2, e3;
3988 int sep, ab, reg;
3989 unsigned int qp;
3990
3991 if (!in_procedure ("spillmem.p"))
3992 return;
3993
3994 sep = parse_operand (&e1);
3995 if (sep != ',')
3996 {
3997 as_bad ("Second operand missing");
3998 return;
3999 }
4000
4001 parse_operand (&e2);
4002 if (sep != ',')
4003 {
4004 as_bad ("Second operand missing");
4005 return;
4006 }
4007
4008 parse_operand (&e3);
4009
4010 qp = e1.X_add_number - REG_P;
4011 if (e1.X_op != O_register || qp > 63)
4012 {
4013 as_bad ("First operand to .spill%s_p must be a predicate",
4014 psprel ? "psp" : "sp");
4015 return;
4016 }
4017
4018 if (!convert_expr_to_ab_reg (&e2, &ab, &reg))
4019 {
4020 as_bad ("Second operand to .spill%s_p must be a preserved register",
4021 psprel ? "psp" : "sp");
4022 return;
4023 }
4024
4025 if (e3.X_op != O_constant)
4026 {
4027 as_bad ("Third operand to .spill%s_p must be a constant",
4028 psprel ? "psp" : "sp");
4029 return;
4030 }
4031
4032 if (psprel)
4033 add_unwind_entry (output_spill_psprel_p (ab, reg, e3.X_add_number, qp));
4034 else
4035 add_unwind_entry (output_spill_sprel_p (ab, reg, e3.X_add_number, qp));
4036 }
4037
4038 static unsigned int
4039 get_saved_prologue_count (lbl)
4040 unsigned long lbl;
4041 {
4042 label_prologue_count *lpc = unwind.saved_prologue_counts;
4043
4044 while (lpc != NULL && lpc->label_number != lbl)
4045 lpc = lpc->next;
4046
4047 if (lpc != NULL)
4048 return lpc->prologue_count;
4049
4050 as_bad ("Missing .label_state %ld", lbl);
4051 return 1;
4052 }
4053
4054 static void
4055 save_prologue_count (lbl, count)
4056 unsigned long lbl;
4057 unsigned int count;
4058 {
4059 label_prologue_count *lpc = unwind.saved_prologue_counts;
4060
4061 while (lpc != NULL && lpc->label_number != lbl)
4062 lpc = lpc->next;
4063
4064 if (lpc != NULL)
4065 lpc->prologue_count = count;
4066 else
4067 {
4068 label_prologue_count *new_lpc = xmalloc (sizeof (* new_lpc));
4069
4070 new_lpc->next = unwind.saved_prologue_counts;
4071 new_lpc->label_number = lbl;
4072 new_lpc->prologue_count = count;
4073 unwind.saved_prologue_counts = new_lpc;
4074 }
4075 }
4076
4077 static void
4078 free_saved_prologue_counts ()
4079 {
4080 label_prologue_count *lpc = unwind.saved_prologue_counts;
4081 label_prologue_count *next;
4082
4083 while (lpc != NULL)
4084 {
4085 next = lpc->next;
4086 free (lpc);
4087 lpc = next;
4088 }
4089
4090 unwind.saved_prologue_counts = NULL;
4091 }
4092
4093 static void
4094 dot_label_state (dummy)
4095 int dummy ATTRIBUTE_UNUSED;
4096 {
4097 expressionS e;
4098
4099 if (!in_body ("label_state"))
4100 return;
4101
4102 parse_operand (&e);
4103 if (e.X_op != O_constant)
4104 {
4105 as_bad ("Operand to .label_state must be a constant");
4106 return;
4107 }
4108 add_unwind_entry (output_label_state (e.X_add_number));
4109 save_prologue_count (e.X_add_number, unwind.prologue_count);
4110 }
4111
4112 static void
4113 dot_copy_state (dummy)
4114 int dummy ATTRIBUTE_UNUSED;
4115 {
4116 expressionS e;
4117
4118 if (!in_body ("copy_state"))
4119 return;
4120
4121 parse_operand (&e);
4122 if (e.X_op != O_constant)
4123 {
4124 as_bad ("Operand to .copy_state must be a constant");
4125 return;
4126 }
4127 add_unwind_entry (output_copy_state (e.X_add_number));
4128 unwind.prologue_count = get_saved_prologue_count (e.X_add_number);
4129 }
4130
4131 static void
4132 dot_unwabi (dummy)
4133 int dummy ATTRIBUTE_UNUSED;
4134 {
4135 expressionS e1, e2;
4136 unsigned char sep;
4137
4138 if (!in_procedure ("unwabi"))
4139 return;
4140
4141 sep = parse_operand (&e1);
4142 if (sep != ',')
4143 {
4144 as_bad ("Second operand to .unwabi missing");
4145 return;
4146 }
4147 sep = parse_operand (&e2);
4148 if (!is_end_of_line[sep] && !is_it_end_of_statement ())
4149 demand_empty_rest_of_line ();
4150
4151 if (e1.X_op != O_constant)
4152 {
4153 as_bad ("First operand to .unwabi must be a constant");
4154 return;
4155 }
4156
4157 if (e2.X_op != O_constant)
4158 {
4159 as_bad ("Second operand to .unwabi must be a constant");
4160 return;
4161 }
4162
4163 add_unwind_entry (output_unwabi (e1.X_add_number, e2.X_add_number));
4164 }
4165
4166 static void
4167 dot_personality (dummy)
4168 int dummy ATTRIBUTE_UNUSED;
4169 {
4170 char *name, *p, c;
4171 if (!in_procedure ("personality"))
4172 return;
4173 SKIP_WHITESPACE ();
4174 name = input_line_pointer;
4175 c = get_symbol_end ();
4176 p = input_line_pointer;
4177 unwind.personality_routine = symbol_find_or_make (name);
4178 unwind.force_unwind_entry = 1;
4179 *p = c;
4180 SKIP_WHITESPACE ();
4181 demand_empty_rest_of_line ();
4182 }
4183
4184 static void
4185 dot_proc (dummy)
4186 int dummy ATTRIBUTE_UNUSED;
4187 {
4188 char *name, *p, c;
4189 symbolS *sym;
4190
4191 unwind.proc_start = 0;
4192 /* Parse names of main and alternate entry points and mark them as
4193 function symbols: */
4194 while (1)
4195 {
4196 SKIP_WHITESPACE ();
4197 name = input_line_pointer;
4198 c = get_symbol_end ();
4199 p = input_line_pointer;
4200 if (!*name)
4201 as_bad ("Empty argument of .proc");
4202 else
4203 {
4204 sym = symbol_find_or_make (name);
4205 if (S_IS_DEFINED (sym))
4206 as_bad ("`%s' was already defined", name);
4207 else if (unwind.proc_start == 0)
4208 {
4209 unwind.proc_start = sym;
4210 }
4211 symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
4212 }
4213 *p = c;
4214 SKIP_WHITESPACE ();
4215 if (*input_line_pointer != ',')
4216 break;
4217 ++input_line_pointer;
4218 }
4219 if (unwind.proc_start == 0)
4220 unwind.proc_start = expr_build_dot ();
4221 demand_empty_rest_of_line ();
4222 ia64_do_align (16);
4223
4224 unwind.prologue = 0;
4225 unwind.prologue_count = 0;
4226 unwind.body = 0;
4227 unwind.insn = 0;
4228 unwind.list = unwind.tail = unwind.current_entry = NULL;
4229 unwind.personality_routine = 0;
4230 }
4231
4232 static void
4233 dot_body (dummy)
4234 int dummy ATTRIBUTE_UNUSED;
4235 {
4236 if (!in_procedure ("body"))
4237 return;
4238 if (!unwind.prologue && !unwind.body && unwind.insn)
4239 as_warn ("Initial .body should precede any instructions");
4240
4241 unwind.prologue = 0;
4242 unwind.prologue_mask = 0;
4243 unwind.body = 1;
4244
4245 add_unwind_entry (output_body ());
4246 demand_empty_rest_of_line ();
4247 }
4248
4249 static void
4250 dot_prologue (dummy)
4251 int dummy ATTRIBUTE_UNUSED;
4252 {
4253 unsigned char sep;
4254 int mask = 0, grsave = 0;
4255
4256 if (!in_procedure ("prologue"))
4257 return;
4258 if (unwind.prologue)
4259 {
4260 as_bad (".prologue within prologue");
4261 ignore_rest_of_line ();
4262 return;
4263 }
4264 if (!unwind.body && unwind.insn)
4265 as_warn ("Initial .prologue should precede any instructions");
4266
4267 if (!is_it_end_of_statement ())
4268 {
4269 expressionS e1, e2;
4270 sep = parse_operand (&e1);
4271 if (sep != ',')
4272 as_bad ("No second operand to .prologue");
4273 sep = parse_operand (&e2);
4274 if (!is_end_of_line[sep] && !is_it_end_of_statement ())
4275 demand_empty_rest_of_line ();
4276
4277 if (e1.X_op == O_constant)
4278 {
4279 mask = e1.X_add_number;
4280
4281 if (e2.X_op == O_constant)
4282 grsave = e2.X_add_number;
4283 else if (e2.X_op == O_register
4284 && (grsave = e2.X_add_number - REG_GR) < 128)
4285 ;
4286 else
4287 as_bad ("Second operand not a constant or general register");
4288
4289 add_unwind_entry (output_prologue_gr (mask, grsave));
4290 }
4291 else
4292 as_bad ("First operand not a constant");
4293 }
4294 else
4295 add_unwind_entry (output_prologue ());
4296
4297 unwind.prologue = 1;
4298 unwind.prologue_mask = mask;
4299 unwind.body = 0;
4300 ++unwind.prologue_count;
4301 }
4302
4303 static void
4304 dot_endp (dummy)
4305 int dummy ATTRIBUTE_UNUSED;
4306 {
4307 expressionS e;
4308 unsigned char *ptr;
4309 int bytes_per_address;
4310 long where;
4311 segT saved_seg;
4312 subsegT saved_subseg;
4313 char *name, *default_name, *p, c;
4314 symbolS *sym;
4315 int unwind_check = md.unwind_check;
4316
4317 md.unwind_check = unwind_check_error;
4318 if (!in_procedure ("endp"))
4319 return;
4320 md.unwind_check = unwind_check;
4321
4322 if (unwind.saved_text_seg)
4323 {
4324 saved_seg = unwind.saved_text_seg;
4325 saved_subseg = unwind.saved_text_subseg;
4326 unwind.saved_text_seg = NULL;
4327 }
4328 else
4329 {
4330 saved_seg = now_seg;
4331 saved_subseg = now_subseg;
4332 }
4333
4334 insn_group_break (1, 0, 0);
4335
4336 /* If there wasn't a .handlerdata, we haven't generated an image yet. */
4337 if (!unwind.info)
4338 generate_unwind_image (saved_seg);
4339
4340 if (unwind.info || unwind.force_unwind_entry)
4341 {
4342 symbolS *proc_end;
4343
4344 subseg_set (md.last_text_seg, 0);
4345 proc_end = expr_build_dot ();
4346
4347 start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 0);
4348
4349 /* Make sure that section has 4 byte alignment for ILP32 and
4350 8 byte alignment for LP64. */
4351 record_alignment (now_seg, md.pointer_size_shift);
4352
4353 /* Need space for 3 pointers for procedure start, procedure end,
4354 and unwind info. */
4355 ptr = frag_more (3 * md.pointer_size);
4356 where = frag_now_fix () - (3 * md.pointer_size);
4357 bytes_per_address = bfd_arch_bits_per_address (stdoutput) / 8;
4358
4359 /* Issue the values of a) Proc Begin, b) Proc End, c) Unwind Record. */
4360 e.X_op = O_pseudo_fixup;
4361 e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
4362 e.X_add_number = 0;
4363 e.X_add_symbol = unwind.proc_start;
4364 ia64_cons_fix_new (frag_now, where, bytes_per_address, &e);
4365
4366 e.X_op = O_pseudo_fixup;
4367 e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
4368 e.X_add_number = 0;
4369 e.X_add_symbol = proc_end;
4370 ia64_cons_fix_new (frag_now, where + bytes_per_address,
4371 bytes_per_address, &e);
4372
4373 if (unwind.info)
4374 {
4375 e.X_op = O_pseudo_fixup;
4376 e.X_op_symbol = pseudo_func[FUNC_SEG_RELATIVE].u.sym;
4377 e.X_add_number = 0;
4378 e.X_add_symbol = unwind.info;
4379 ia64_cons_fix_new (frag_now, where + (bytes_per_address * 2),
4380 bytes_per_address, &e);
4381 }
4382 else
4383 md_number_to_chars (ptr + (bytes_per_address * 2), 0,
4384 bytes_per_address);
4385
4386 }
4387 else
4388 start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 1);
4389
4390 subseg_set (saved_seg, saved_subseg);
4391
4392 if (unwind.proc_start)
4393 default_name = (char *) S_GET_NAME (unwind.proc_start);
4394 else
4395 default_name = NULL;
4396
4397 /* Parse names of main and alternate entry points and set symbol sizes. */
4398 while (1)
4399 {
4400 SKIP_WHITESPACE ();
4401 name = input_line_pointer;
4402 c = get_symbol_end ();
4403 p = input_line_pointer;
4404 if (!*name)
4405 {
4406 if (md.unwind_check == unwind_check_warning)
4407 {
4408 if (default_name)
4409 {
4410 as_warn ("Empty argument of .endp. Use the default name `%s'",
4411 default_name);
4412 name = default_name;
4413 }
4414 else
4415 as_warn ("Empty argument of .endp");
4416 }
4417 else
4418 as_bad ("Empty argument of .endp");
4419 }
4420 if (*name)
4421 {
4422 sym = symbol_find (name);
4423 if (!sym
4424 && md.unwind_check == unwind_check_warning
4425 && default_name
4426 && default_name != name)
4427 {
4428 /* We have a bad name. Try the default one if needed. */
4429 as_warn ("`%s' was not defined within procedure. Use the default name `%s'",
4430 name, default_name);
4431 name = default_name;
4432 sym = symbol_find (name);
4433 }
4434 if (!sym || !S_IS_DEFINED (sym))
4435 as_bad ("`%s' was not defined within procedure", name);
4436 else if (unwind.proc_start
4437 && (symbol_get_bfdsym (sym)->flags & BSF_FUNCTION)
4438 && S_GET_SIZE (sym) == 0 && symbol_get_obj (sym)->size == NULL)
4439 {
4440 fragS *fr = symbol_get_frag (unwind.proc_start);
4441 fragS *frag = symbol_get_frag (sym);
4442
4443 /* Check whether the function label is at or beyond last
4444 .proc directive. */
4445 while (fr && fr != frag)
4446 fr = fr->fr_next;
4447 if (fr)
4448 {
4449 if (frag == frag_now && SEG_NORMAL (now_seg))
4450 S_SET_SIZE (sym, frag_now_fix () - S_GET_VALUE (sym));
4451 else
4452 {
4453 symbol_get_obj (sym)->size =
4454 (expressionS *) xmalloc (sizeof (expressionS));
4455 symbol_get_obj (sym)->size->X_op = O_subtract;
4456 symbol_get_obj (sym)->size->X_add_symbol
4457 = symbol_new (FAKE_LABEL_NAME, now_seg,
4458 frag_now_fix (), frag_now);
4459 symbol_get_obj (sym)->size->X_op_symbol = sym;
4460 symbol_get_obj (sym)->size->X_add_number = 0;
4461 }
4462 }
4463 }
4464 }
4465 *p = c;
4466 SKIP_WHITESPACE ();
4467 if (*input_line_pointer != ',')
4468 break;
4469 ++input_line_pointer;
4470 }
4471 demand_empty_rest_of_line ();
4472 unwind.proc_start = unwind.info = 0;
4473 }
4474
4475 static void
4476 dot_template (template)
4477 int template;
4478 {
4479 CURR_SLOT.user_template = template;
4480 }
4481
4482 static void
4483 dot_regstk (dummy)
4484 int dummy ATTRIBUTE_UNUSED;
4485 {
4486 int ins, locs, outs, rots;
4487
4488 if (is_it_end_of_statement ())
4489 ins = locs = outs = rots = 0;
4490 else
4491 {
4492 ins = get_absolute_expression ();
4493 if (*input_line_pointer++ != ',')
4494 goto err;
4495 locs = get_absolute_expression ();
4496 if (*input_line_pointer++ != ',')
4497 goto err;
4498 outs = get_absolute_expression ();
4499 if (*input_line_pointer++ != ',')
4500 goto err;
4501 rots = get_absolute_expression ();
4502 }
4503 set_regstack (ins, locs, outs, rots);
4504 return;
4505
4506 err:
4507 as_bad ("Comma expected");
4508 ignore_rest_of_line ();
4509 }
4510
4511 static void
4512 dot_rot (type)
4513 int type;
4514 {
4515 unsigned num_regs, num_alloced = 0;
4516 struct dynreg **drpp, *dr;
4517 int ch, base_reg = 0;
4518 char *name, *start;
4519 size_t len;
4520
4521 switch (type)
4522 {
4523 case DYNREG_GR: base_reg = REG_GR + 32; break;
4524 case DYNREG_FR: base_reg = REG_FR + 32; break;
4525 case DYNREG_PR: base_reg = REG_P + 16; break;
4526 default: break;
4527 }
4528
4529 /* First, remove existing names from hash table. */
4530 for (dr = md.dynreg[type]; dr && dr->num_regs; dr = dr->next)
4531 {
4532 hash_delete (md.dynreg_hash, dr->name);
4533 dr->num_regs = 0;
4534 }
4535
4536 drpp = &md.dynreg[type];
4537 while (1)
4538 {
4539 start = input_line_pointer;
4540 ch = get_symbol_end ();
4541 *input_line_pointer = ch;
4542 len = (input_line_pointer - start);
4543
4544 SKIP_WHITESPACE ();
4545 if (*input_line_pointer != '[')
4546 {
4547 as_bad ("Expected '['");
4548 goto err;
4549 }
4550 ++input_line_pointer; /* skip '[' */
4551
4552 num_regs = get_absolute_expression ();
4553
4554 if (*input_line_pointer++ != ']')
4555 {
4556 as_bad ("Expected ']'");
4557 goto err;
4558 }
4559 SKIP_WHITESPACE ();
4560
4561 num_alloced += num_regs;
4562 switch (type)
4563 {
4564 case DYNREG_GR:
4565 if (num_alloced > md.rot.num_regs)
4566 {
4567 as_bad ("Used more than the declared %d rotating registers",
4568 md.rot.num_regs);
4569 goto err;
4570 }
4571 break;
4572 case DYNREG_FR:
4573 if (num_alloced > 96)
4574 {
4575 as_bad ("Used more than the available 96 rotating registers");
4576 goto err;
4577 }
4578 break;
4579 case DYNREG_PR:
4580 if (num_alloced > 48)
4581 {
4582 as_bad ("Used more than the available 48 rotating registers");
4583 goto err;
4584 }
4585 break;
4586
4587 default:
4588 break;
4589 }
4590
4591 name = obstack_alloc (&notes, len + 1);
4592 memcpy (name, start, len);
4593 name[len] = '\0';
4594
4595 if (!*drpp)
4596 {
4597 *drpp = obstack_alloc (&notes, sizeof (*dr));
4598 memset (*drpp, 0, sizeof (*dr));
4599 }
4600
4601 dr = *drpp;
4602 dr->name = name;
4603 dr->num_regs = num_regs;
4604 dr->base = base_reg;
4605 drpp = &dr->next;
4606 base_reg += num_regs;
4607
4608 if (hash_insert (md.dynreg_hash, name, dr))
4609 {
4610 as_bad ("Attempt to redefine register set `%s'", name);
4611 goto err;
4612 }
4613
4614 if (*input_line_pointer != ',')
4615 break;
4616 ++input_line_pointer; /* skip comma */
4617 SKIP_WHITESPACE ();
4618 }
4619 demand_empty_rest_of_line ();
4620 return;
4621
4622 err:
4623 ignore_rest_of_line ();
4624 }
4625
4626 static void
4627 dot_byteorder (byteorder)
4628 int byteorder;
4629 {
4630 segment_info_type *seginfo = seg_info (now_seg);
4631
4632 if (byteorder == -1)
4633 {
4634 if (seginfo->tc_segment_info_data.endian == 0)
4635 seginfo->tc_segment_info_data.endian = default_big_endian ? 1 : 2;
4636 byteorder = seginfo->tc_segment_info_data.endian == 1;
4637 }
4638 else
4639 seginfo->tc_segment_info_data.endian = byteorder ? 1 : 2;
4640
4641 if (target_big_endian != byteorder)
4642 {
4643 target_big_endian = byteorder;
4644 if (target_big_endian)
4645 {
4646 ia64_number_to_chars = number_to_chars_bigendian;
4647 ia64_float_to_chars = ia64_float_to_chars_bigendian;
4648 }
4649 else
4650 {
4651 ia64_number_to_chars = number_to_chars_littleendian;
4652 ia64_float_to_chars = ia64_float_to_chars_littleendian;
4653 }
4654 }
4655 }
4656
4657 static void
4658 dot_psr (dummy)
4659 int dummy ATTRIBUTE_UNUSED;
4660 {
4661 char *option;
4662 int ch;
4663
4664 while (1)
4665 {
4666 option = input_line_pointer;
4667 ch = get_symbol_end ();
4668 if (strcmp (option, "lsb") == 0)
4669 md.flags &= ~EF_IA_64_BE;
4670 else if (strcmp (option, "msb") == 0)
4671 md.flags |= EF_IA_64_BE;
4672 else if (strcmp (option, "abi32") == 0)
4673 md.flags &= ~EF_IA_64_ABI64;
4674 else if (strcmp (option, "abi64") == 0)
4675 md.flags |= EF_IA_64_ABI64;
4676 else
4677 as_bad ("Unknown psr option `%s'", option);
4678 *input_line_pointer = ch;
4679
4680 SKIP_WHITESPACE ();
4681 if (*input_line_pointer != ',')
4682 break;
4683
4684 ++input_line_pointer;
4685 SKIP_WHITESPACE ();
4686 }
4687 demand_empty_rest_of_line ();
4688 }
4689
4690 static void
4691 dot_ln (dummy)
4692 int dummy ATTRIBUTE_UNUSED;
4693 {
4694 new_logical_line (0, get_absolute_expression ());
4695 demand_empty_rest_of_line ();
4696 }
4697
4698 static char *
4699 parse_section_name ()
4700 {
4701 char *name;
4702 int len;
4703
4704 SKIP_WHITESPACE ();
4705 if (*input_line_pointer == '"')
4706 name = demand_copy_C_string (&len);
4707 else
4708 {
4709 char *start = input_line_pointer;
4710 char c = get_symbol_end ();
4711
4712 if (input_line_pointer == start)
4713 {
4714 as_bad ("Missing section name");
4715 ignore_rest_of_line ();
4716 return 0;
4717 }
4718 name = obstack_copy (&notes, start, input_line_pointer - start + 1);
4719 *input_line_pointer = c;
4720 }
4721 if (!name)
4722 {
4723 ignore_rest_of_line ();
4724 return 0;
4725 }
4726 SKIP_WHITESPACE ();
4727 if (*input_line_pointer != ',')
4728 {
4729 as_bad ("Comma expected after section name");
4730 ignore_rest_of_line ();
4731 return 0;
4732 }
4733 ++input_line_pointer; /* skip comma */
4734 return name;
4735 }
4736
4737 static void
4738 dot_xdata (size)
4739 int size;
4740 {
4741 char *name = parse_section_name ();
4742 if (!name)
4743 return;
4744
4745 md.keep_pending_output = 1;
4746 set_section (name);
4747 obstack_free (&notes, name);
4748 cons (size);
4749 obj_elf_previous (0);
4750 md.keep_pending_output = 0;
4751 }
4752
4753 /* Why doesn't float_cons() call md_cons_align() the way cons() does? */
4754
4755 static void
4756 stmt_float_cons (kind)
4757 int kind;
4758 {
4759 size_t alignment;
4760
4761 switch (kind)
4762 {
4763 case 'd':
4764 alignment = 8;
4765 break;
4766
4767 case 'x':
4768 case 'X':
4769 alignment = 16;
4770 break;
4771
4772 case 'f':
4773 default:
4774 alignment = 4;
4775 break;
4776 }
4777 ia64_do_align (alignment);
4778 float_cons (kind);
4779 }
4780
4781 static void
4782 stmt_cons_ua (size)
4783 int size;
4784 {
4785 int saved_auto_align = md.auto_align;
4786
4787 md.auto_align = 0;
4788 cons (size);
4789 md.auto_align = saved_auto_align;
4790 }
4791
4792 static void
4793 dot_xfloat_cons (kind)
4794 int kind;
4795 {
4796 char *name = parse_section_name ();
4797 if (!name)
4798 return;
4799
4800 md.keep_pending_output = 1;
4801 set_section (name);
4802 obstack_free (&notes, name);
4803 stmt_float_cons (kind);
4804 obj_elf_previous (0);
4805 md.keep_pending_output = 0;
4806 }
4807
4808 static void
4809 dot_xstringer (zero)
4810 int zero;
4811 {
4812 char *name = parse_section_name ();
4813 if (!name)
4814 return;
4815
4816 md.keep_pending_output = 1;
4817 set_section (name);
4818 obstack_free (&notes, name);
4819 stringer (zero);
4820 obj_elf_previous (0);
4821 md.keep_pending_output = 0;
4822 }
4823
4824 static void
4825 dot_xdata_ua (size)
4826 int size;
4827 {
4828 int saved_auto_align = md.auto_align;
4829 char *name = parse_section_name ();
4830 if (!name)
4831 return;
4832
4833 md.keep_pending_output = 1;
4834 set_section (name);
4835 obstack_free (&notes, name);
4836 md.auto_align = 0;
4837 cons (size);
4838 md.auto_align = saved_auto_align;
4839 obj_elf_previous (0);
4840 md.keep_pending_output = 0;
4841 }
4842
4843 static void
4844 dot_xfloat_cons_ua (kind)
4845 int kind;
4846 {
4847 int saved_auto_align = md.auto_align;
4848 char *name = parse_section_name ();
4849 if (!name)
4850 return;
4851
4852 md.keep_pending_output = 1;
4853 set_section (name);
4854 obstack_free (&notes, name);
4855 md.auto_align = 0;
4856 stmt_float_cons (kind);
4857 md.auto_align = saved_auto_align;
4858 obj_elf_previous (0);
4859 md.keep_pending_output = 0;
4860 }
4861
4862 /* .reg.val <regname>,value */
4863
4864 static void
4865 dot_reg_val (dummy)
4866 int dummy ATTRIBUTE_UNUSED;
4867 {
4868 expressionS reg;
4869
4870 expression (&reg);
4871 if (reg.X_op != O_register)
4872 {
4873 as_bad (_("Register name expected"));
4874 ignore_rest_of_line ();
4875 }
4876 else if (*input_line_pointer++ != ',')
4877 {
4878 as_bad (_("Comma expected"));
4879 ignore_rest_of_line ();
4880 }
4881 else
4882 {
4883 valueT value = get_absolute_expression ();
4884 int regno = reg.X_add_number;
4885 if (regno < REG_GR || regno > REG_GR + 128)
4886 as_warn (_("Register value annotation ignored"));
4887 else
4888 {
4889 gr_values[regno - REG_GR].known = 1;
4890 gr_values[regno - REG_GR].value = value;
4891 gr_values[regno - REG_GR].path = md.path;
4892 }
4893 }
4894 demand_empty_rest_of_line ();
4895 }
4896
4897 /*
4898 .serialize.data
4899 .serialize.instruction
4900 */
4901 static void
4902 dot_serialize (type)
4903 int type;
4904 {
4905 insn_group_break (0, 0, 0);
4906 if (type)
4907 instruction_serialization ();
4908 else
4909 data_serialization ();
4910 insn_group_break (0, 0, 0);
4911 demand_empty_rest_of_line ();
4912 }
4913
4914 /* select dv checking mode
4915 .auto
4916 .explicit
4917 .default
4918
4919 A stop is inserted when changing modes
4920 */
4921
4922 static void
4923 dot_dv_mode (type)
4924 int type;
4925 {
4926 if (md.manual_bundling)
4927 as_warn (_("Directive invalid within a bundle"));
4928
4929 if (type == 'E' || type == 'A')
4930 md.mode_explicitly_set = 0;
4931 else
4932 md.mode_explicitly_set = 1;
4933
4934 md.detect_dv = 1;
4935 switch (type)
4936 {
4937 case 'A':
4938 case 'a':
4939 if (md.explicit_mode)
4940 insn_group_break (1, 0, 0);
4941 md.explicit_mode = 0;
4942 break;
4943 case 'E':
4944 case 'e':
4945 if (!md.explicit_mode)
4946 insn_group_break (1, 0, 0);
4947 md.explicit_mode = 1;
4948 break;
4949 default:
4950 case 'd':
4951 if (md.explicit_mode != md.default_explicit_mode)
4952 insn_group_break (1, 0, 0);
4953 md.explicit_mode = md.default_explicit_mode;
4954 md.mode_explicitly_set = 0;
4955 break;
4956 }
4957 }
4958
4959 static void
4960 print_prmask (mask)
4961 valueT mask;
4962 {
4963 int regno;
4964 char *comma = "";
4965 for (regno = 0; regno < 64; regno++)
4966 {
4967 if (mask & ((valueT) 1 << regno))
4968 {
4969 fprintf (stderr, "%s p%d", comma, regno);
4970 comma = ",";
4971 }
4972 }
4973 }
4974
4975 /*
4976 .pred.rel.clear [p1 [,p2 [,...]]] (also .pred.rel "clear" or @clear)
4977 .pred.rel.imply p1, p2 (also .pred.rel "imply" or @imply)
4978 .pred.rel.mutex p1, p2 [,...] (also .pred.rel "mutex" or @mutex)
4979 .pred.safe_across_calls p1 [, p2 [,...]]
4980 */
4981
4982 static void
4983 dot_pred_rel (type)
4984 int type;
4985 {
4986 valueT mask = 0;
4987 int count = 0;
4988 int p1 = -1, p2 = -1;
4989
4990 if (type == 0)
4991 {
4992 if (*input_line_pointer == '"')
4993 {
4994 int len;
4995 char *form = demand_copy_C_string (&len);
4996
4997 if (strcmp (form, "mutex") == 0)
4998 type = 'm';
4999 else if (strcmp (form, "clear") == 0)
5000 type = 'c';
5001 else if (strcmp (form, "imply") == 0)
5002 type = 'i';
5003 obstack_free (&notes, form);
5004 }
5005 else if (*input_line_pointer == '@')
5006 {
5007 char *form = ++input_line_pointer;
5008 char c = get_symbol_end();
5009
5010 if (strcmp (form, "mutex") == 0)
5011 type = 'm';
5012 else if (strcmp (form, "clear") == 0)
5013 type = 'c';
5014 else if (strcmp (form, "imply") == 0)
5015 type = 'i';
5016 *input_line_pointer = c;
5017 }
5018 else
5019 {
5020 as_bad (_("Missing predicate relation type"));
5021 ignore_rest_of_line ();
5022 return;
5023 }
5024 if (type == 0)
5025 {
5026 as_bad (_("Unrecognized predicate relation type"));
5027 ignore_rest_of_line ();
5028 return;
5029 }
5030 if (*input_line_pointer == ',')
5031 ++input_line_pointer;
5032 SKIP_WHITESPACE ();
5033 }
5034
5035 SKIP_WHITESPACE ();
5036 while (1)
5037 {
5038 valueT bit = 1;
5039 int regno;
5040
5041 if (TOUPPER (*input_line_pointer) != 'P'
5042 || (regno = atoi (++input_line_pointer)) < 0
5043 || regno > 63)
5044 {
5045 as_bad (_("Predicate register expected"));
5046 ignore_rest_of_line ();
5047 return;
5048 }
5049 while (ISDIGIT (*input_line_pointer))
5050 ++input_line_pointer;
5051 if (p1 == -1)
5052 p1 = regno;
5053 else if (p2 == -1)
5054 p2 = regno;
5055 bit <<= regno;
5056 if (mask & bit)
5057 as_warn (_("Duplicate predicate register ignored"));
5058 mask |= bit;
5059 count++;
5060 /* See if it's a range. */
5061 if (*input_line_pointer == '-')
5062 {
5063 valueT stop = 1;
5064 ++input_line_pointer;
5065
5066 if (TOUPPER (*input_line_pointer) != 'P'
5067 || (regno = atoi (++input_line_pointer)) < 0
5068 || regno > 63)
5069 {
5070 as_bad (_("Predicate register expected"));
5071 ignore_rest_of_line ();
5072 return;
5073 }
5074 while (ISDIGIT (*input_line_pointer))
5075 ++input_line_pointer;
5076 stop <<= regno;
5077 if (bit >= stop)
5078 {
5079 as_bad (_("Bad register range"));
5080 ignore_rest_of_line ();
5081 return;
5082 }
5083 while (bit < stop)
5084 {
5085 bit <<= 1;
5086 mask |= bit;
5087 count++;
5088 }
5089 SKIP_WHITESPACE ();
5090 }
5091 if (*input_line_pointer != ',')
5092 break;
5093 ++input_line_pointer;
5094 SKIP_WHITESPACE ();
5095 }
5096
5097 switch (type)
5098 {
5099 case 'c':
5100 if (count == 0)
5101 mask = ~(valueT) 0;
5102 clear_qp_mutex (mask);
5103 clear_qp_implies (mask, (valueT) 0);
5104 break;
5105 case 'i':
5106 if (count != 2 || p1 == -1 || p2 == -1)
5107 as_bad (_("Predicate source and target required"));
5108 else if (p1 == 0 || p2 == 0)
5109 as_bad (_("Use of p0 is not valid in this context"));
5110 else
5111 add_qp_imply (p1, p2);
5112 break;
5113 case 'm':
5114 if (count < 2)
5115 {
5116 as_bad (_("At least two PR arguments expected"));
5117 break;
5118 }
5119 else if (mask & 1)
5120 {
5121 as_bad (_("Use of p0 is not valid in this context"));
5122 break;
5123 }
5124 add_qp_mutex (mask);
5125 break;
5126 case 's':
5127 /* note that we don't override any existing relations */
5128 if (count == 0)
5129 {
5130 as_bad (_("At least one PR argument expected"));
5131 break;
5132 }
5133 if (md.debug_dv)
5134 {
5135 fprintf (stderr, "Safe across calls: ");
5136 print_prmask (mask);
5137 fprintf (stderr, "\n");
5138 }
5139 qp_safe_across_calls = mask;
5140 break;
5141 }
5142 demand_empty_rest_of_line ();
5143 }
5144
5145 /* .entry label [, label [, ...]]
5146 Hint to DV code that the given labels are to be considered entry points.
5147 Otherwise, only global labels are considered entry points. */
5148
5149 static void
5150 dot_entry (dummy)
5151 int dummy ATTRIBUTE_UNUSED;
5152 {
5153 const char *err;
5154 char *name;
5155 int c;
5156 symbolS *symbolP;
5157
5158 do
5159 {
5160 name = input_line_pointer;
5161 c = get_symbol_end ();
5162 symbolP = symbol_find_or_make (name);
5163
5164 err = hash_insert (md.entry_hash, S_GET_NAME (symbolP), (PTR) symbolP);
5165 if (err)
5166 as_fatal (_("Inserting \"%s\" into entry hint table failed: %s"),
5167 name, err);
5168
5169 *input_line_pointer = c;
5170 SKIP_WHITESPACE ();
5171 c = *input_line_pointer;
5172 if (c == ',')
5173 {
5174 input_line_pointer++;
5175 SKIP_WHITESPACE ();
5176 if (*input_line_pointer == '\n')
5177 c = '\n';
5178 }
5179 }
5180 while (c == ',');
5181
5182 demand_empty_rest_of_line ();
5183 }
5184
5185 /* .mem.offset offset, base
5186 "base" is used to distinguish between offsets from a different base. */
5187
5188 static void
5189 dot_mem_offset (dummy)
5190 int dummy ATTRIBUTE_UNUSED;
5191 {
5192 md.mem_offset.hint = 1;
5193 md.mem_offset.offset = get_absolute_expression ();
5194 if (*input_line_pointer != ',')
5195 {
5196 as_bad (_("Comma expected"));
5197 ignore_rest_of_line ();
5198 return;
5199 }
5200 ++input_line_pointer;
5201 md.mem_offset.base = get_absolute_expression ();
5202 demand_empty_rest_of_line ();
5203 }
5204
5205 /* ia64-specific pseudo-ops: */
5206 const pseudo_typeS md_pseudo_table[] =
5207 {
5208 { "radix", dot_radix, 0 },
5209 { "lcomm", s_lcomm_bytes, 1 },
5210 { "loc", dot_loc, 0 },
5211 { "bss", dot_special_section, SPECIAL_SECTION_BSS },
5212 { "sbss", dot_special_section, SPECIAL_SECTION_SBSS },
5213 { "sdata", dot_special_section, SPECIAL_SECTION_SDATA },
5214 { "rodata", dot_special_section, SPECIAL_SECTION_RODATA },
5215 { "comment", dot_special_section, SPECIAL_SECTION_COMMENT },
5216 { "ia_64.unwind", dot_special_section, SPECIAL_SECTION_UNWIND },
5217 { "ia_64.unwind_info", dot_special_section, SPECIAL_SECTION_UNWIND_INFO },
5218 { "init_array", dot_special_section, SPECIAL_SECTION_INIT_ARRAY },
5219 { "fini_array", dot_special_section, SPECIAL_SECTION_FINI_ARRAY },
5220 { "proc", dot_proc, 0 },
5221 { "body", dot_body, 0 },
5222 { "prologue", dot_prologue, 0 },
5223 { "endp", dot_endp, 0 },
5224
5225 { "fframe", dot_fframe, 0 },
5226 { "vframe", dot_vframe, 0 },
5227 { "vframesp", dot_vframesp, 0 },
5228 { "vframepsp", dot_vframepsp, 0 },
5229 { "save", dot_save, 0 },
5230 { "restore", dot_restore, 0 },
5231 { "restorereg", dot_restorereg, 0 },
5232 { "restorereg.p", dot_restorereg_p, 0 },
5233 { "handlerdata", dot_handlerdata, 0 },
5234 { "unwentry", dot_unwentry, 0 },
5235 { "altrp", dot_altrp, 0 },
5236 { "savesp", dot_savemem, 0 },
5237 { "savepsp", dot_savemem, 1 },
5238 { "save.g", dot_saveg, 0 },
5239 { "save.f", dot_savef, 0 },
5240 { "save.b", dot_saveb, 0 },
5241 { "save.gf", dot_savegf, 0 },
5242 { "spill", dot_spill, 0 },
5243 { "spillreg", dot_spillreg, 0 },
5244 { "spillsp", dot_spillmem, 0 },
5245 { "spillpsp", dot_spillmem, 1 },
5246 { "spillreg.p", dot_spillreg_p, 0 },
5247 { "spillsp.p", dot_spillmem_p, 0 },
5248 { "spillpsp.p", dot_spillmem_p, 1 },
5249 { "label_state", dot_label_state, 0 },
5250 { "copy_state", dot_copy_state, 0 },
5251 { "unwabi", dot_unwabi, 0 },
5252 { "personality", dot_personality, 0 },
5253 { "mii", dot_template, 0x0 },
5254 { "mli", dot_template, 0x2 }, /* old format, for compatibility */
5255 { "mlx", dot_template, 0x2 },
5256 { "mmi", dot_template, 0x4 },
5257 { "mfi", dot_template, 0x6 },
5258 { "mmf", dot_template, 0x7 },
5259 { "mib", dot_template, 0x8 },
5260 { "mbb", dot_template, 0x9 },
5261 { "bbb", dot_template, 0xb },
5262 { "mmb", dot_template, 0xc },
5263 { "mfb", dot_template, 0xe },
5264 { "align", dot_align, 0 },
5265 { "regstk", dot_regstk, 0 },
5266 { "rotr", dot_rot, DYNREG_GR },
5267 { "rotf", dot_rot, DYNREG_FR },
5268 { "rotp", dot_rot, DYNREG_PR },
5269 { "lsb", dot_byteorder, 0 },
5270 { "msb", dot_byteorder, 1 },
5271 { "psr", dot_psr, 0 },
5272 { "alias", dot_alias, 0 },
5273 { "secalias", dot_alias, 1 },
5274 { "ln", dot_ln, 0 }, /* source line info (for debugging) */
5275
5276 { "xdata1", dot_xdata, 1 },
5277 { "xdata2", dot_xdata, 2 },
5278 { "xdata4", dot_xdata, 4 },
5279 { "xdata8", dot_xdata, 8 },
5280 { "xdata16", dot_xdata, 16 },
5281 { "xreal4", dot_xfloat_cons, 'f' },
5282 { "xreal8", dot_xfloat_cons, 'd' },
5283 { "xreal10", dot_xfloat_cons, 'x' },
5284 { "xreal16", dot_xfloat_cons, 'X' },
5285 { "xstring", dot_xstringer, 0 },
5286 { "xstringz", dot_xstringer, 1 },
5287
5288 /* unaligned versions: */
5289 { "xdata2.ua", dot_xdata_ua, 2 },
5290 { "xdata4.ua", dot_xdata_ua, 4 },
5291 { "xdata8.ua", dot_xdata_ua, 8 },
5292 { "xdata16.ua", dot_xdata_ua, 16 },
5293 { "xreal4.ua", dot_xfloat_cons_ua, 'f' },
5294 { "xreal8.ua", dot_xfloat_cons_ua, 'd' },
5295 { "xreal10.ua", dot_xfloat_cons_ua, 'x' },
5296 { "xreal16.ua", dot_xfloat_cons_ua, 'X' },
5297
5298 /* annotations/DV checking support */
5299 { "entry", dot_entry, 0 },
5300 { "mem.offset", dot_mem_offset, 0 },
5301 { "pred.rel", dot_pred_rel, 0 },
5302 { "pred.rel.clear", dot_pred_rel, 'c' },
5303 { "pred.rel.imply", dot_pred_rel, 'i' },
5304 { "pred.rel.mutex", dot_pred_rel, 'm' },
5305 { "pred.safe_across_calls", dot_pred_rel, 's' },
5306 { "reg.val", dot_reg_val, 0 },
5307 { "serialize.data", dot_serialize, 0 },
5308 { "serialize.instruction", dot_serialize, 1 },
5309 { "auto", dot_dv_mode, 'a' },
5310 { "explicit", dot_dv_mode, 'e' },
5311 { "default", dot_dv_mode, 'd' },
5312
5313 /* ??? These are needed to make gas/testsuite/gas/elf/ehopt.s work.
5314 IA-64 aligns data allocation pseudo-ops by default, so we have to
5315 tell it that these ones are supposed to be unaligned. Long term,
5316 should rewrite so that only IA-64 specific data allocation pseudo-ops
5317 are aligned by default. */
5318 {"2byte", stmt_cons_ua, 2},
5319 {"4byte", stmt_cons_ua, 4},
5320 {"8byte", stmt_cons_ua, 8},
5321
5322 { NULL, 0, 0 }
5323 };
5324
5325 static const struct pseudo_opcode
5326 {
5327 const char *name;
5328 void (*handler) (int);
5329 int arg;
5330 }
5331 pseudo_opcode[] =
5332 {
5333 /* these are more like pseudo-ops, but don't start with a dot */
5334 { "data1", cons, 1 },
5335 { "data2", cons, 2 },
5336 { "data4", cons, 4 },
5337 { "data8", cons, 8 },
5338 { "data16", cons, 16 },
5339 { "real4", stmt_float_cons, 'f' },
5340 { "real8", stmt_float_cons, 'd' },
5341 { "real10", stmt_float_cons, 'x' },
5342 { "real16", stmt_float_cons, 'X' },
5343 { "string", stringer, 0 },
5344 { "stringz", stringer, 1 },
5345
5346 /* unaligned versions: */
5347 { "data2.ua", stmt_cons_ua, 2 },
5348 { "data4.ua", stmt_cons_ua, 4 },
5349 { "data8.ua", stmt_cons_ua, 8 },
5350 { "data16.ua", stmt_cons_ua, 16 },
5351 { "real4.ua", float_cons, 'f' },
5352 { "real8.ua", float_cons, 'd' },
5353 { "real10.ua", float_cons, 'x' },
5354 { "real16.ua", float_cons, 'X' },
5355 };
5356
5357 /* Declare a register by creating a symbol for it and entering it in
5358 the symbol table. */
5359
5360 static symbolS *
5361 declare_register (name, regnum)
5362 const char *name;
5363 int regnum;
5364 {
5365 const char *err;
5366 symbolS *sym;
5367
5368 sym = symbol_new (name, reg_section, regnum, &zero_address_frag);
5369
5370 err = hash_insert (md.reg_hash, S_GET_NAME (sym), (PTR) sym);
5371 if (err)
5372 as_fatal ("Inserting \"%s\" into register table failed: %s",
5373 name, err);
5374
5375 return sym;
5376 }
5377
5378 static void
5379 declare_register_set (prefix, num_regs, base_regnum)
5380 const char *prefix;
5381 int num_regs;
5382 int base_regnum;
5383 {
5384 char name[8];
5385 int i;
5386
5387 for (i = 0; i < num_regs; ++i)
5388 {
5389 sprintf (name, "%s%u", prefix, i);
5390 declare_register (name, base_regnum + i);
5391 }
5392 }
5393
5394 static unsigned int
5395 operand_width (opnd)
5396 enum ia64_opnd opnd;
5397 {
5398 const struct ia64_operand *odesc = &elf64_ia64_operands[opnd];
5399 unsigned int bits = 0;
5400 int i;
5401
5402 bits = 0;
5403 for (i = 0; i < NELEMS (odesc->field) && odesc->field[i].bits; ++i)
5404 bits += odesc->field[i].bits;
5405
5406 return bits;
5407 }
5408
5409 static enum operand_match_result
5410 operand_match (idesc, index, e)
5411 const struct ia64_opcode *idesc;
5412 int index;
5413 expressionS *e;
5414 {
5415 enum ia64_opnd opnd = idesc->operands[index];
5416 int bits, relocatable = 0;
5417 struct insn_fix *fix;
5418 bfd_signed_vma val;
5419
5420 switch (opnd)
5421 {
5422 /* constants: */
5423
5424 case IA64_OPND_AR_CCV:
5425 if (e->X_op == O_register && e->X_add_number == REG_AR + 32)
5426 return OPERAND_MATCH;
5427 break;
5428
5429 case IA64_OPND_AR_CSD:
5430 if (e->X_op == O_register && e->X_add_number == REG_AR + 25)
5431 return OPERAND_MATCH;
5432 break;
5433
5434 case IA64_OPND_AR_PFS:
5435 if (e->X_op == O_register && e->X_add_number == REG_AR + 64)
5436 return OPERAND_MATCH;
5437 break;
5438
5439 case IA64_OPND_GR0:
5440 if (e->X_op == O_register && e->X_add_number == REG_GR + 0)
5441 return OPERAND_MATCH;
5442 break;
5443
5444 case IA64_OPND_IP:
5445 if (e->X_op == O_register && e->X_add_number == REG_IP)
5446 return OPERAND_MATCH;
5447 break;
5448
5449 case IA64_OPND_PR:
5450 if (e->X_op == O_register && e->X_add_number == REG_PR)
5451 return OPERAND_MATCH;
5452 break;
5453
5454 case IA64_OPND_PR_ROT:
5455 if (e->X_op == O_register && e->X_add_number == REG_PR_ROT)
5456 return OPERAND_MATCH;
5457 break;
5458
5459 case IA64_OPND_PSR:
5460 if (e->X_op == O_register && e->X_add_number == REG_PSR)
5461 return OPERAND_MATCH;
5462 break;
5463
5464 case IA64_OPND_PSR_L:
5465 if (e->X_op == O_register && e->X_add_number == REG_PSR_L)
5466 return OPERAND_MATCH;
5467 break;
5468
5469 case IA64_OPND_PSR_UM:
5470 if (e->X_op == O_register && e->X_add_number == REG_PSR_UM)
5471 return OPERAND_MATCH;
5472 break;
5473
5474 case IA64_OPND_C1:
5475 if (e->X_op == O_constant)
5476 {
5477 if (e->X_add_number == 1)
5478 return OPERAND_MATCH;
5479 else
5480 return OPERAND_OUT_OF_RANGE;
5481 }
5482 break;
5483
5484 case IA64_OPND_C8:
5485 if (e->X_op == O_constant)
5486 {
5487 if (e->X_add_number == 8)
5488 return OPERAND_MATCH;
5489 else
5490 return OPERAND_OUT_OF_RANGE;
5491 }
5492 break;
5493
5494 case IA64_OPND_C16:
5495 if (e->X_op == O_constant)
5496 {
5497 if (e->X_add_number == 16)
5498 return OPERAND_MATCH;
5499 else
5500 return OPERAND_OUT_OF_RANGE;
5501 }
5502 break;
5503
5504 /* register operands: */
5505
5506 case IA64_OPND_AR3:
5507 if (e->X_op == O_register && e->X_add_number >= REG_AR
5508 && e->X_add_number < REG_AR + 128)
5509 return OPERAND_MATCH;
5510 break;
5511
5512 case IA64_OPND_B1:
5513 case IA64_OPND_B2:
5514 if (e->X_op == O_register && e->X_add_number >= REG_BR
5515 && e->X_add_number < REG_BR + 8)
5516 return OPERAND_MATCH;
5517 break;
5518
5519 case IA64_OPND_CR3:
5520 if (e->X_op == O_register && e->X_add_number >= REG_CR
5521 && e->X_add_number < REG_CR + 128)
5522 return OPERAND_MATCH;
5523 break;
5524
5525 case IA64_OPND_F1:
5526 case IA64_OPND_F2:
5527 case IA64_OPND_F3:
5528 case IA64_OPND_F4:
5529 if (e->X_op == O_register && e->X_add_number >= REG_FR
5530 && e->X_add_number < REG_FR + 128)
5531 return OPERAND_MATCH;
5532 break;
5533
5534 case IA64_OPND_P1:
5535 case IA64_OPND_P2:
5536 if (e->X_op == O_register && e->X_add_number >= REG_P
5537 && e->X_add_number < REG_P + 64)
5538 return OPERAND_MATCH;
5539 break;
5540
5541 case IA64_OPND_R1:
5542 case IA64_OPND_R2:
5543 case IA64_OPND_R3:
5544 if (e->X_op == O_register && e->X_add_number >= REG_GR
5545 && e->X_add_number < REG_GR + 128)
5546 return OPERAND_MATCH;
5547 break;
5548
5549 case IA64_OPND_R3_2:
5550 if (e->X_op == O_register && e->X_add_number >= REG_GR)
5551 {
5552 if (e->X_add_number < REG_GR + 4)
5553 return OPERAND_MATCH;
5554 else if (e->X_add_number < REG_GR + 128)
5555 return OPERAND_OUT_OF_RANGE;
5556 }
5557 break;
5558
5559 /* indirect operands: */
5560 case IA64_OPND_CPUID_R3:
5561 case IA64_OPND_DBR_R3:
5562 case IA64_OPND_DTR_R3:
5563 case IA64_OPND_ITR_R3:
5564 case IA64_OPND_IBR_R3:
5565 case IA64_OPND_MSR_R3:
5566 case IA64_OPND_PKR_R3:
5567 case IA64_OPND_PMC_R3:
5568 case IA64_OPND_PMD_R3:
5569 case IA64_OPND_RR_R3:
5570 if (e->X_op == O_index && e->X_op_symbol
5571 && (S_GET_VALUE (e->X_op_symbol) - IND_CPUID
5572 == opnd - IA64_OPND_CPUID_R3))
5573 return OPERAND_MATCH;
5574 break;
5575
5576 case IA64_OPND_MR3:
5577 if (e->X_op == O_index && !e->X_op_symbol)
5578 return OPERAND_MATCH;
5579 break;
5580
5581 /* immediate operands: */
5582 case IA64_OPND_CNT2a:
5583 case IA64_OPND_LEN4:
5584 case IA64_OPND_LEN6:
5585 bits = operand_width (idesc->operands[index]);
5586 if (e->X_op == O_constant)
5587 {
5588 if ((bfd_vma) (e->X_add_number - 1) < ((bfd_vma) 1 << bits))
5589 return OPERAND_MATCH;
5590 else
5591 return OPERAND_OUT_OF_RANGE;
5592 }
5593 break;
5594
5595 case IA64_OPND_CNT2b:
5596 if (e->X_op == O_constant)
5597 {
5598 if ((bfd_vma) (e->X_add_number - 1) < 3)
5599 return OPERAND_MATCH;
5600 else
5601 return OPERAND_OUT_OF_RANGE;
5602 }
5603 break;
5604
5605 case IA64_OPND_CNT2c:
5606 val = e->X_add_number;
5607 if (e->X_op == O_constant)
5608 {
5609 if ((val == 0 || val == 7 || val == 15 || val == 16))
5610 return OPERAND_MATCH;
5611 else
5612 return OPERAND_OUT_OF_RANGE;
5613 }
5614 break;
5615
5616 case IA64_OPND_SOR:
5617 /* SOR must be an integer multiple of 8 */
5618 if (e->X_op == O_constant && e->X_add_number & 0x7)
5619 return OPERAND_OUT_OF_RANGE;
5620 case IA64_OPND_SOF:
5621 case IA64_OPND_SOL:
5622 if (e->X_op == O_constant)
5623 {
5624 if ((bfd_vma) e->X_add_number <= 96)
5625 return OPERAND_MATCH;
5626 else
5627 return OPERAND_OUT_OF_RANGE;
5628 }
5629 break;
5630
5631 case IA64_OPND_IMMU62:
5632 if (e->X_op == O_constant)
5633 {
5634 if ((bfd_vma) e->X_add_number < ((bfd_vma) 1 << 62))
5635 return OPERAND_MATCH;
5636 else
5637 return OPERAND_OUT_OF_RANGE;
5638 }
5639 else
5640 {
5641 /* FIXME -- need 62-bit relocation type */
5642 as_bad (_("62-bit relocation not yet implemented"));
5643 }
5644 break;
5645
5646 case IA64_OPND_IMMU64:
5647 if (e->X_op == O_symbol || e->X_op == O_pseudo_fixup
5648 || e->X_op == O_subtract)
5649 {
5650 fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5651 fix->code = BFD_RELOC_IA64_IMM64;
5652 if (e->X_op != O_subtract)
5653 {
5654 fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5655 if (e->X_op == O_pseudo_fixup)
5656 e->X_op = O_symbol;
5657 }
5658
5659 fix->opnd = idesc->operands[index];
5660 fix->expr = *e;
5661 fix->is_pcrel = 0;
5662 ++CURR_SLOT.num_fixups;
5663 return OPERAND_MATCH;
5664 }
5665 else if (e->X_op == O_constant)
5666 return OPERAND_MATCH;
5667 break;
5668
5669 case IA64_OPND_CCNT5:
5670 case IA64_OPND_CNT5:
5671 case IA64_OPND_CNT6:
5672 case IA64_OPND_CPOS6a:
5673 case IA64_OPND_CPOS6b:
5674 case IA64_OPND_CPOS6c:
5675 case IA64_OPND_IMMU2:
5676 case IA64_OPND_IMMU7a:
5677 case IA64_OPND_IMMU7b:
5678 case IA64_OPND_IMMU21:
5679 case IA64_OPND_IMMU24:
5680 case IA64_OPND_MBTYPE4:
5681 case IA64_OPND_MHTYPE8:
5682 case IA64_OPND_POS6:
5683 bits = operand_width (idesc->operands[index]);
5684 if (e->X_op == O_constant)
5685 {
5686 if ((bfd_vma) e->X_add_number < ((bfd_vma) 1 << bits))
5687 return OPERAND_MATCH;
5688 else
5689 return OPERAND_OUT_OF_RANGE;
5690 }
5691 break;
5692
5693 case IA64_OPND_IMMU9:
5694 bits = operand_width (idesc->operands[index]);
5695 if (e->X_op == O_constant)
5696 {
5697 if ((bfd_vma) e->X_add_number < ((bfd_vma) 1 << bits))
5698 {
5699 int lobits = e->X_add_number & 0x3;
5700 if (((bfd_vma) e->X_add_number & 0x3C) != 0 && lobits == 0)
5701 e->X_add_number |= (bfd_vma) 0x3;
5702 return OPERAND_MATCH;
5703 }
5704 else
5705 return OPERAND_OUT_OF_RANGE;
5706 }
5707 break;
5708
5709 case IA64_OPND_IMM44:
5710 /* least 16 bits must be zero */
5711 if ((e->X_add_number & 0xffff) != 0)
5712 /* XXX technically, this is wrong: we should not be issuing warning
5713 messages until we're sure this instruction pattern is going to
5714 be used! */
5715 as_warn (_("lower 16 bits of mask ignored"));
5716
5717 if (e->X_op == O_constant)
5718 {
5719 if (((e->X_add_number >= 0
5720 && (bfd_vma) e->X_add_number < ((bfd_vma) 1 << 44))
5721 || (e->X_add_number < 0
5722 && (bfd_vma) -e->X_add_number <= ((bfd_vma) 1 << 44))))
5723 {
5724 /* sign-extend */
5725 if (e->X_add_number >= 0
5726 && (e->X_add_number & ((bfd_vma) 1 << 43)) != 0)
5727 {
5728 e->X_add_number |= ~(((bfd_vma) 1 << 44) - 1);
5729 }
5730 return OPERAND_MATCH;
5731 }
5732 else
5733 return OPERAND_OUT_OF_RANGE;
5734 }
5735 break;
5736
5737 case IA64_OPND_IMM17:
5738 /* bit 0 is a don't care (pr0 is hardwired to 1) */
5739 if (e->X_op == O_constant)
5740 {
5741 if (((e->X_add_number >= 0
5742 && (bfd_vma) e->X_add_number < ((bfd_vma) 1 << 17))
5743 || (e->X_add_number < 0
5744 && (bfd_vma) -e->X_add_number <= ((bfd_vma) 1 << 17))))
5745 {
5746 /* sign-extend */
5747 if (e->X_add_number >= 0
5748 && (e->X_add_number & ((bfd_vma) 1 << 16)) != 0)
5749 {
5750 e->X_add_number |= ~(((bfd_vma) 1 << 17) - 1);
5751 }
5752 return OPERAND_MATCH;
5753 }
5754 else
5755 return OPERAND_OUT_OF_RANGE;
5756 }
5757 break;
5758
5759 case IA64_OPND_IMM14:
5760 case IA64_OPND_IMM22:
5761 relocatable = 1;
5762 case IA64_OPND_IMM1:
5763 case IA64_OPND_IMM8:
5764 case IA64_OPND_IMM8U4:
5765 case IA64_OPND_IMM8M1:
5766 case IA64_OPND_IMM8M1U4:
5767 case IA64_OPND_IMM8M1U8:
5768 case IA64_OPND_IMM9a:
5769 case IA64_OPND_IMM9b:
5770 bits = operand_width (idesc->operands[index]);
5771 if (relocatable && (e->X_op == O_symbol
5772 || e->X_op == O_subtract
5773 || e->X_op == O_pseudo_fixup))
5774 {
5775 fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5776
5777 if (idesc->operands[index] == IA64_OPND_IMM14)
5778 fix->code = BFD_RELOC_IA64_IMM14;
5779 else
5780 fix->code = BFD_RELOC_IA64_IMM22;
5781
5782 if (e->X_op != O_subtract)
5783 {
5784 fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5785 if (e->X_op == O_pseudo_fixup)
5786 e->X_op = O_symbol;
5787 }
5788
5789 fix->opnd = idesc->operands[index];
5790 fix->expr = *e;
5791 fix->is_pcrel = 0;
5792 ++CURR_SLOT.num_fixups;
5793 return OPERAND_MATCH;
5794 }
5795 else if (e->X_op != O_constant
5796 && ! (e->X_op == O_big && opnd == IA64_OPND_IMM8M1U8))
5797 return OPERAND_MISMATCH;
5798
5799 if (opnd == IA64_OPND_IMM8M1U4)
5800 {
5801 /* Zero is not valid for unsigned compares that take an adjusted
5802 constant immediate range. */
5803 if (e->X_add_number == 0)
5804 return OPERAND_OUT_OF_RANGE;
5805
5806 /* Sign-extend 32-bit unsigned numbers, so that the following range
5807 checks will work. */
5808 val = e->X_add_number;
5809 if (((val & (~(bfd_vma) 0 << 32)) == 0)
5810 && ((val & ((bfd_vma) 1 << 31)) != 0))
5811 val = ((val << 32) >> 32);
5812
5813 /* Check for 0x100000000. This is valid because
5814 0x100000000-1 is the same as ((uint32_t) -1). */
5815 if (val == ((bfd_signed_vma) 1 << 32))
5816 return OPERAND_MATCH;
5817
5818 val = val - 1;
5819 }
5820 else if (opnd == IA64_OPND_IMM8M1U8)
5821 {
5822 /* Zero is not valid for unsigned compares that take an adjusted
5823 constant immediate range. */
5824 if (e->X_add_number == 0)
5825 return OPERAND_OUT_OF_RANGE;
5826
5827 /* Check for 0x10000000000000000. */
5828 if (e->X_op == O_big)
5829 {
5830 if (generic_bignum[0] == 0
5831 && generic_bignum[1] == 0
5832 && generic_bignum[2] == 0
5833 && generic_bignum[3] == 0
5834 && generic_bignum[4] == 1)
5835 return OPERAND_MATCH;
5836 else
5837 return OPERAND_OUT_OF_RANGE;
5838 }
5839 else
5840 val = e->X_add_number - 1;
5841 }
5842 else if (opnd == IA64_OPND_IMM8M1)
5843 val = e->X_add_number - 1;
5844 else if (opnd == IA64_OPND_IMM8U4)
5845 {
5846 /* Sign-extend 32-bit unsigned numbers, so that the following range
5847 checks will work. */
5848 val = e->X_add_number;
5849 if (((val & (~(bfd_vma) 0 << 32)) == 0)
5850 && ((val & ((bfd_vma) 1 << 31)) != 0))
5851 val = ((val << 32) >> 32);
5852 }
5853 else
5854 val = e->X_add_number;
5855
5856 if ((val >= 0 && (bfd_vma) val < ((bfd_vma) 1 << (bits - 1)))
5857 || (val < 0 && (bfd_vma) -val <= ((bfd_vma) 1 << (bits - 1))))
5858 return OPERAND_MATCH;
5859 else
5860 return OPERAND_OUT_OF_RANGE;
5861
5862 case IA64_OPND_INC3:
5863 /* +/- 1, 4, 8, 16 */
5864 val = e->X_add_number;
5865 if (val < 0)
5866 val = -val;
5867 if (e->X_op == O_constant)
5868 {
5869 if ((val == 1 || val == 4 || val == 8 || val == 16))
5870 return OPERAND_MATCH;
5871 else
5872 return OPERAND_OUT_OF_RANGE;
5873 }
5874 break;
5875
5876 case IA64_OPND_TGT25:
5877 case IA64_OPND_TGT25b:
5878 case IA64_OPND_TGT25c:
5879 case IA64_OPND_TGT64:
5880 if (e->X_op == O_symbol)
5881 {
5882 fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5883 if (opnd == IA64_OPND_TGT25)
5884 fix->code = BFD_RELOC_IA64_PCREL21F;
5885 else if (opnd == IA64_OPND_TGT25b)
5886 fix->code = BFD_RELOC_IA64_PCREL21M;
5887 else if (opnd == IA64_OPND_TGT25c)
5888 fix->code = BFD_RELOC_IA64_PCREL21B;
5889 else if (opnd == IA64_OPND_TGT64)
5890 fix->code = BFD_RELOC_IA64_PCREL60B;
5891 else
5892 abort ();
5893
5894 fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5895 fix->opnd = idesc->operands[index];
5896 fix->expr = *e;
5897 fix->is_pcrel = 1;
5898 ++CURR_SLOT.num_fixups;
5899 return OPERAND_MATCH;
5900 }
5901 case IA64_OPND_TAG13:
5902 case IA64_OPND_TAG13b:
5903 switch (e->X_op)
5904 {
5905 case O_constant:
5906 return OPERAND_MATCH;
5907
5908 case O_symbol:
5909 fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5910 /* There are no external relocs for TAG13/TAG13b fields, so we
5911 create a dummy reloc. This will not live past md_apply_fix3. */
5912 fix->code = BFD_RELOC_UNUSED;
5913 fix->code = ia64_gen_real_reloc_type (e->X_op_symbol, fix->code);
5914 fix->opnd = idesc->operands[index];
5915 fix->expr = *e;
5916 fix->is_pcrel = 1;
5917 ++CURR_SLOT.num_fixups;
5918 return OPERAND_MATCH;
5919
5920 default:
5921 break;
5922 }
5923 break;
5924
5925 case IA64_OPND_LDXMOV:
5926 fix = CURR_SLOT.fixup + CURR_SLOT.num_fixups;
5927 fix->code = BFD_RELOC_IA64_LDXMOV;
5928 fix->opnd = idesc->operands[index];
5929 fix->expr = *e;
5930 fix->is_pcrel = 0;
5931 ++CURR_SLOT.num_fixups;
5932 return OPERAND_MATCH;
5933
5934 default:
5935 break;
5936 }
5937 return OPERAND_MISMATCH;
5938 }
5939
5940 static int
5941 parse_operand (e)
5942 expressionS *e;
5943 {
5944 int sep = '\0';
5945
5946 memset (e, 0, sizeof (*e));
5947 e->X_op = O_absent;
5948 SKIP_WHITESPACE ();
5949 if (*input_line_pointer != '}')
5950 expression (e);
5951 sep = *input_line_pointer++;
5952
5953 if (sep == '}')
5954 {
5955 if (!md.manual_bundling)
5956 as_warn ("Found '}' when manual bundling is off");
5957 else
5958 CURR_SLOT.manual_bundling_off = 1;
5959 md.manual_bundling = 0;
5960 sep = '\0';
5961 }
5962 return sep;
5963 }
5964
5965 /* Returns the next entry in the opcode table that matches the one in
5966 IDESC, and frees the entry in IDESC. If no matching entry is
5967 found, NULL is returned instead. */
5968
5969 static struct ia64_opcode *
5970 get_next_opcode (struct ia64_opcode *idesc)
5971 {
5972 struct ia64_opcode *next = ia64_find_next_opcode (idesc);
5973 ia64_free_opcode (idesc);
5974 return next;
5975 }
5976
5977 /* Parse the operands for the opcode and find the opcode variant that
5978 matches the specified operands, or NULL if no match is possible. */
5979
5980 static struct ia64_opcode *
5981 parse_operands (idesc)
5982 struct ia64_opcode *idesc;
5983 {
5984 int i = 0, highest_unmatched_operand, num_operands = 0, num_outputs = 0;
5985 int error_pos, out_of_range_pos, curr_out_of_range_pos, sep = 0;
5986 enum ia64_opnd expected_operand = IA64_OPND_NIL;
5987 enum operand_match_result result;
5988 char mnemonic[129];
5989 char *first_arg = 0, *end, *saved_input_pointer;
5990 unsigned int sof;
5991
5992 assert (strlen (idesc->name) <= 128);
5993
5994 strcpy (mnemonic, idesc->name);
5995 if (idesc->operands[2] == IA64_OPND_SOF
5996 || idesc->operands[1] == IA64_OPND_SOF)
5997 {
5998 /* To make the common idiom "alloc loc?=ar.pfs,0,1,0,0" work, we
5999 can't parse the first operand until we have parsed the
6000 remaining operands of the "alloc" instruction. */
6001 SKIP_WHITESPACE ();
6002 first_arg = input_line_pointer;
6003 end = strchr (input_line_pointer, '=');
6004 if (!end)
6005 {
6006 as_bad ("Expected separator `='");
6007 return 0;
6008 }
6009 input_line_pointer = end + 1;
6010 ++i;
6011 ++num_outputs;
6012 }
6013
6014 for (; ; ++i)
6015 {
6016 if (i < NELEMS (CURR_SLOT.opnd))
6017 {
6018 sep = parse_operand (CURR_SLOT.opnd + i);
6019 if (CURR_SLOT.opnd[i].X_op == O_absent)
6020 break;
6021 }
6022 else
6023 {
6024 expressionS dummy;
6025
6026 sep = parse_operand (&dummy);
6027 if (dummy.X_op == O_absent)
6028 break;
6029 }
6030
6031 ++num_operands;
6032
6033 if (sep != '=' && sep != ',')
6034 break;
6035
6036 if (sep == '=')
6037 {
6038 if (num_outputs > 0)
6039 as_bad ("Duplicate equal sign (=) in instruction");
6040 else
6041 num_outputs = i + 1;
6042 }
6043 }
6044 if (sep != '\0')
6045 {
6046 as_bad ("Illegal operand separator `%c'", sep);
6047 return 0;
6048 }
6049
6050 if (idesc->operands[2] == IA64_OPND_SOF
6051 || idesc->operands[1] == IA64_OPND_SOF)
6052 {
6053 /* map alloc r1=ar.pfs,i,l,o,r to alloc r1=ar.pfs,(i+l+o),(i+l),r */
6054 know (strcmp (idesc->name, "alloc") == 0);
6055 i = (CURR_SLOT.opnd[1].X_op == O_register
6056 && CURR_SLOT.opnd[1].X_add_number == REG_AR + AR_PFS) ? 2 : 1;
6057 if (num_operands == i + 3 /* first_arg not included in this count! */
6058 && CURR_SLOT.opnd[i].X_op == O_constant
6059 && CURR_SLOT.opnd[i + 1].X_op == O_constant
6060 && CURR_SLOT.opnd[i + 2].X_op == O_constant
6061 && CURR_SLOT.opnd[i + 3].X_op == O_constant)
6062 {
6063 sof = set_regstack (CURR_SLOT.opnd[i].X_add_number,
6064 CURR_SLOT.opnd[i + 1].X_add_number,
6065 CURR_SLOT.opnd[i + 2].X_add_number,
6066 CURR_SLOT.opnd[i + 3].X_add_number);
6067
6068 /* now we can parse the first arg: */
6069 saved_input_pointer = input_line_pointer;
6070 input_line_pointer = first_arg;
6071 sep = parse_operand (CURR_SLOT.opnd + 0);
6072 if (sep != '=')
6073 --num_outputs; /* force error */
6074 input_line_pointer = saved_input_pointer;
6075
6076 CURR_SLOT.opnd[i].X_add_number = sof;
6077 CURR_SLOT.opnd[i + 1].X_add_number
6078 = sof - CURR_SLOT.opnd[i + 2].X_add_number;
6079 CURR_SLOT.opnd[i + 2] = CURR_SLOT.opnd[i + 3];
6080 }
6081 }
6082
6083 highest_unmatched_operand = -4;
6084 curr_out_of_range_pos = -1;
6085 error_pos = 0;
6086 for (; idesc; idesc = get_next_opcode (idesc))
6087 {
6088 if (num_outputs != idesc->num_outputs)
6089 continue; /* mismatch in # of outputs */
6090 if (highest_unmatched_operand < 0)
6091 highest_unmatched_operand |= 1;
6092 if (num_operands > NELEMS (idesc->operands)
6093 || (num_operands < NELEMS (idesc->operands)
6094 && idesc->operands[num_operands])
6095 || (num_operands > 0 && !idesc->operands[num_operands - 1]))
6096 continue; /* mismatch in number of arguments */
6097 if (highest_unmatched_operand < 0)
6098 highest_unmatched_operand |= 2;
6099
6100 CURR_SLOT.num_fixups = 0;
6101
6102 /* Try to match all operands. If we see an out-of-range operand,
6103 then continue trying to match the rest of the operands, since if
6104 the rest match, then this idesc will give the best error message. */
6105
6106 out_of_range_pos = -1;
6107 for (i = 0; i < num_operands && idesc->operands[i]; ++i)
6108 {
6109 result = operand_match (idesc, i, CURR_SLOT.opnd + i);
6110 if (result != OPERAND_MATCH)
6111 {
6112 if (result != OPERAND_OUT_OF_RANGE)
6113 break;
6114 if (out_of_range_pos < 0)
6115 /* remember position of the first out-of-range operand: */
6116 out_of_range_pos = i;
6117 }
6118 }
6119
6120 /* If we did not match all operands, or if at least one operand was
6121 out-of-range, then this idesc does not match. Keep track of which
6122 idesc matched the most operands before failing. If we have two
6123 idescs that failed at the same position, and one had an out-of-range
6124 operand, then prefer the out-of-range operand. Thus if we have
6125 "add r0=0x1000000,r1" we get an error saying the constant is out
6126 of range instead of an error saying that the constant should have been
6127 a register. */
6128
6129 if (i != num_operands || out_of_range_pos >= 0)
6130 {
6131 if (i > highest_unmatched_operand
6132 || (i == highest_unmatched_operand
6133 && out_of_range_pos > curr_out_of_range_pos))
6134 {
6135 highest_unmatched_operand = i;
6136 if (out_of_range_pos >= 0)
6137 {
6138 expected_operand = idesc->operands[out_of_range_pos];
6139 error_pos = out_of_range_pos;
6140 }
6141 else
6142 {
6143 expected_operand = idesc->operands[i];
6144 error_pos = i;
6145 }
6146 curr_out_of_range_pos = out_of_range_pos;
6147 }
6148 continue;
6149 }
6150
6151 break;
6152 }
6153 if (!idesc)
6154 {
6155 if (expected_operand)
6156 as_bad ("Operand %u of `%s' should be %s",
6157 error_pos + 1, mnemonic,
6158 elf64_ia64_operands[expected_operand].desc);
6159 else if (highest_unmatched_operand < 0 && !(highest_unmatched_operand & 1))
6160 as_bad ("Wrong number of output operands");
6161 else if (highest_unmatched_operand < 0 && !(highest_unmatched_operand & 2))
6162 as_bad ("Wrong number of input operands");
6163 else
6164 as_bad ("Operand mismatch");
6165 return 0;
6166 }
6167 return idesc;
6168 }
6169
6170 static void
6171 build_insn (slot, insnp)
6172 struct slot *slot;
6173 bfd_vma *insnp;
6174 {
6175 const struct ia64_operand *odesc, *o2desc;
6176 struct ia64_opcode *idesc = slot->idesc;
6177 bfd_signed_vma insn, val;
6178 const char *err;
6179 int i;
6180
6181 insn = idesc->opcode | slot->qp_regno;
6182
6183 for (i = 0; i < NELEMS (idesc->operands) && idesc->operands[i]; ++i)
6184 {
6185 if (slot->opnd[i].X_op == O_register
6186 || slot->opnd[i].X_op == O_constant
6187 || slot->opnd[i].X_op == O_index)
6188 val = slot->opnd[i].X_add_number;
6189 else if (slot->opnd[i].X_op == O_big)
6190 {
6191 /* This must be the value 0x10000000000000000. */
6192 assert (idesc->operands[i] == IA64_OPND_IMM8M1U8);
6193 val = 0;
6194 }
6195 else
6196 val = 0;
6197
6198 switch (idesc->operands[i])
6199 {
6200 case IA64_OPND_IMMU64:
6201 *insnp++ = (val >> 22) & 0x1ffffffffffLL;
6202 insn |= (((val & 0x7f) << 13) | (((val >> 7) & 0x1ff) << 27)
6203 | (((val >> 16) & 0x1f) << 22) | (((val >> 21) & 0x1) << 21)
6204 | (((val >> 63) & 0x1) << 36));
6205 continue;
6206
6207 case IA64_OPND_IMMU62:
6208 val &= 0x3fffffffffffffffULL;
6209 if (val != slot->opnd[i].X_add_number)
6210 as_warn (_("Value truncated to 62 bits"));
6211 *insnp++ = (val >> 21) & 0x1ffffffffffLL;
6212 insn |= (((val & 0xfffff) << 6) | (((val >> 20) & 0x1) << 36));
6213 continue;
6214
6215 case IA64_OPND_TGT64:
6216 val >>= 4;
6217 *insnp++ = ((val >> 20) & 0x7fffffffffLL) << 2;
6218 insn |= ((((val >> 59) & 0x1) << 36)
6219 | (((val >> 0) & 0xfffff) << 13));
6220 continue;
6221
6222 case IA64_OPND_AR3:
6223 val -= REG_AR;
6224 break;
6225
6226 case IA64_OPND_B1:
6227 case IA64_OPND_B2:
6228 val -= REG_BR;
6229 break;
6230
6231 case IA64_OPND_CR3:
6232 val -= REG_CR;
6233 break;
6234
6235 case IA64_OPND_F1:
6236 case IA64_OPND_F2:
6237 case IA64_OPND_F3:
6238 case IA64_OPND_F4:
6239 val -= REG_FR;
6240 break;
6241
6242 case IA64_OPND_P1:
6243 case IA64_OPND_P2:
6244 val -= REG_P;
6245 break;
6246
6247 case IA64_OPND_R1:
6248 case IA64_OPND_R2:
6249 case IA64_OPND_R3:
6250 case IA64_OPND_R3_2:
6251 case IA64_OPND_CPUID_R3:
6252 case IA64_OPND_DBR_R3:
6253 case IA64_OPND_DTR_R3:
6254 case IA64_OPND_ITR_R3:
6255 case IA64_OPND_IBR_R3:
6256 case IA64_OPND_MR3:
6257 case IA64_OPND_MSR_R3:
6258 case IA64_OPND_PKR_R3:
6259 case IA64_OPND_PMC_R3:
6260 case IA64_OPND_PMD_R3:
6261 case IA64_OPND_RR_R3:
6262 val -= REG_GR;
6263 break;
6264
6265 default:
6266 break;
6267 }
6268
6269 odesc = elf64_ia64_operands + idesc->operands[i];
6270 err = (*odesc->insert) (odesc, val, &insn);
6271 if (err)
6272 as_bad_where (slot->src_file, slot->src_line,
6273 "Bad operand value: %s", err);
6274 if (idesc->flags & IA64_OPCODE_PSEUDO)
6275 {
6276 if ((idesc->flags & IA64_OPCODE_F2_EQ_F3)
6277 && odesc == elf64_ia64_operands + IA64_OPND_F3)
6278 {
6279 o2desc = elf64_ia64_operands + IA64_OPND_F2;
6280 (*o2desc->insert) (o2desc, val, &insn);
6281 }
6282 if ((idesc->flags & IA64_OPCODE_LEN_EQ_64MCNT)
6283 && (odesc == elf64_ia64_operands + IA64_OPND_CPOS6a
6284 || odesc == elf64_ia64_operands + IA64_OPND_POS6))
6285 {
6286 o2desc = elf64_ia64_operands + IA64_OPND_LEN6;
6287 (*o2desc->insert) (o2desc, 64 - val, &insn);
6288 }
6289 }
6290 }
6291 *insnp = insn;
6292 }
6293
6294 static void
6295 emit_one_bundle ()
6296 {
6297 int manual_bundling_off = 0, manual_bundling = 0;
6298 enum ia64_unit required_unit, insn_unit = 0;
6299 enum ia64_insn_type type[3], insn_type;
6300 unsigned int template, orig_template;
6301 bfd_vma insn[3] = { -1, -1, -1 };
6302 struct ia64_opcode *idesc;
6303 int end_of_insn_group = 0, user_template = -1;
6304 int n, i, j, first, curr;
6305 unw_rec_list *ptr, *last_ptr, *end_ptr;
6306 bfd_vma t0 = 0, t1 = 0;
6307 struct label_fix *lfix;
6308 struct insn_fix *ifix;
6309 char mnemonic[16];
6310 fixS *fix;
6311 char *f;
6312 int addr_mod;
6313
6314 first = (md.curr_slot + NUM_SLOTS - md.num_slots_in_use) % NUM_SLOTS;
6315 know (first >= 0 & first < NUM_SLOTS);
6316 n = MIN (3, md.num_slots_in_use);
6317
6318 /* Determine template: user user_template if specified, best match
6319 otherwise: */
6320
6321 if (md.slot[first].user_template >= 0)
6322 user_template = template = md.slot[first].user_template;
6323 else
6324 {
6325 /* Auto select appropriate template. */
6326 memset (type, 0, sizeof (type));
6327 curr = first;
6328 for (i = 0; i < n; ++i)
6329 {
6330 if (md.slot[curr].label_fixups && i != 0)
6331 break;
6332 type[i] = md.slot[curr].idesc->type;
6333 curr = (curr + 1) % NUM_SLOTS;
6334 }
6335 template = best_template[type[0]][type[1]][type[2]];
6336 }
6337
6338 /* initialize instructions with appropriate nops: */
6339 for (i = 0; i < 3; ++i)
6340 insn[i] = nop[ia64_templ_desc[template].exec_unit[i]];
6341
6342 f = frag_more (16);
6343
6344 /* Check to see if this bundle is at an offset that is a multiple of 16-bytes
6345 from the start of the frag. */
6346 addr_mod = frag_now_fix () & 15;
6347 if (frag_now->has_code && frag_now->insn_addr != addr_mod)
6348 as_bad (_("instruction address is not a multiple of 16"));
6349 frag_now->insn_addr = addr_mod;
6350 frag_now->has_code = 1;
6351
6352 /* now fill in slots with as many insns as possible: */
6353 curr = first;
6354 idesc = md.slot[curr].idesc;
6355 end_of_insn_group = 0;
6356 for (i = 0; i < 3 && md.num_slots_in_use > 0; ++i)
6357 {
6358 /* If we have unwind records, we may need to update some now. */
6359 ptr = md.slot[curr].unwind_record;
6360 if (ptr)
6361 {
6362 /* Find the last prologue/body record in the list for the current
6363 insn, and set the slot number for all records up to that point.
6364 This needs to be done now, because prologue/body records refer to
6365 the current point, not the point after the instruction has been
6366 issued. This matters because there may have been nops emitted
6367 meanwhile. Any non-prologue non-body record followed by a
6368 prologue/body record must also refer to the current point. */
6369 last_ptr = NULL;
6370 end_ptr = md.slot[(curr + 1) % NUM_SLOTS].unwind_record;
6371 for (; ptr != end_ptr; ptr = ptr->next)
6372 if (ptr->r.type == prologue || ptr->r.type == prologue_gr
6373 || ptr->r.type == body)
6374 last_ptr = ptr;
6375 if (last_ptr)
6376 {
6377 /* Make last_ptr point one after the last prologue/body
6378 record. */
6379 last_ptr = last_ptr->next;
6380 for (ptr = md.slot[curr].unwind_record; ptr != last_ptr;
6381 ptr = ptr->next)
6382 {
6383 ptr->slot_number = (unsigned long) f + i;
6384 ptr->slot_frag = frag_now;
6385 }
6386 /* Remove the initialized records, so that we won't accidentally
6387 update them again if we insert a nop and continue. */
6388 md.slot[curr].unwind_record = last_ptr;
6389 }
6390 }
6391
6392 manual_bundling_off = md.slot[curr].manual_bundling_off;
6393 if (md.slot[curr].manual_bundling_on)
6394 {
6395 if (curr == first)
6396 manual_bundling = 1;
6397 else
6398 break; /* Need to start a new bundle. */
6399 }
6400
6401 if (idesc->flags & IA64_OPCODE_SLOT2)
6402 {
6403 if (manual_bundling && !manual_bundling_off)
6404 {
6405 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6406 "`%s' must be last in bundle", idesc->name);
6407 if (i < 2)
6408 manual_bundling = -1; /* Suppress meaningless post-loop errors. */
6409 }
6410 i = 2;
6411 }
6412 if (idesc->flags & IA64_OPCODE_LAST)
6413 {
6414 int required_slot;
6415 unsigned int required_template;
6416
6417 /* If we need a stop bit after an M slot, our only choice is
6418 template 5 (M;;MI). If we need a stop bit after a B
6419 slot, our only choice is to place it at the end of the
6420 bundle, because the only available templates are MIB,
6421 MBB, BBB, MMB, and MFB. We don't handle anything other
6422 than M and B slots because these are the only kind of
6423 instructions that can have the IA64_OPCODE_LAST bit set. */
6424 required_template = template;
6425 switch (idesc->type)
6426 {
6427 case IA64_TYPE_M:
6428 required_slot = 0;
6429 required_template = 5;
6430 break;
6431
6432 case IA64_TYPE_B:
6433 required_slot = 2;
6434 break;
6435
6436 default:
6437 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6438 "Internal error: don't know how to force %s to end"
6439 "of instruction group", idesc->name);
6440 required_slot = i;
6441 break;
6442 }
6443 if (manual_bundling
6444 && (i > required_slot
6445 || (required_slot == 2 && !manual_bundling_off)
6446 || (user_template >= 0
6447 /* Changing from MMI to M;MI is OK. */
6448 && (template ^ required_template) > 1)))
6449 {
6450 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6451 "`%s' must be last in instruction group",
6452 idesc->name);
6453 if (i < 2 && required_slot == 2 && !manual_bundling_off)
6454 manual_bundling = -1; /* Suppress meaningless post-loop errors. */
6455 }
6456 if (required_slot < i)
6457 /* Can't fit this instruction. */
6458 break;
6459
6460 i = required_slot;
6461 if (required_template != template)
6462 {
6463 /* If we switch the template, we need to reset the NOPs
6464 after slot i. The slot-types of the instructions ahead
6465 of i never change, so we don't need to worry about
6466 changing NOPs in front of this slot. */
6467 for (j = i; j < 3; ++j)
6468 insn[j] = nop[ia64_templ_desc[required_template].exec_unit[j]];
6469 }
6470 template = required_template;
6471 }
6472 if (curr != first && md.slot[curr].label_fixups)
6473 {
6474 if (manual_bundling)
6475 {
6476 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6477 "Label must be first in a bundle");
6478 manual_bundling = -1; /* Suppress meaningless post-loop errors. */
6479 }
6480 /* This insn must go into the first slot of a bundle. */
6481 break;
6482 }
6483
6484 if (end_of_insn_group && md.num_slots_in_use >= 1)
6485 {
6486 /* We need an instruction group boundary in the middle of a
6487 bundle. See if we can switch to an other template with
6488 an appropriate boundary. */
6489
6490 orig_template = template;
6491 if (i == 1 && (user_template == 4
6492 || (user_template < 0
6493 && (ia64_templ_desc[template].exec_unit[0]
6494 == IA64_UNIT_M))))
6495 {
6496 template = 5;
6497 end_of_insn_group = 0;
6498 }
6499 else if (i == 2 && (user_template == 0
6500 || (user_template < 0
6501 && (ia64_templ_desc[template].exec_unit[1]
6502 == IA64_UNIT_I)))
6503 /* This test makes sure we don't switch the template if
6504 the next instruction is one that needs to be first in
6505 an instruction group. Since all those instructions are
6506 in the M group, there is no way such an instruction can
6507 fit in this bundle even if we switch the template. The
6508 reason we have to check for this is that otherwise we
6509 may end up generating "MI;;I M.." which has the deadly
6510 effect that the second M instruction is no longer the
6511 first in the group! --davidm 99/12/16 */
6512 && (idesc->flags & IA64_OPCODE_FIRST) == 0)
6513 {
6514 template = 1;
6515 end_of_insn_group = 0;
6516 }
6517 else if (i == 1
6518 && user_template == 0
6519 && !(idesc->flags & IA64_OPCODE_FIRST))
6520 /* Use the next slot. */
6521 continue;
6522 else if (curr != first)
6523 /* can't fit this insn */
6524 break;
6525
6526 if (template != orig_template)
6527 /* if we switch the template, we need to reset the NOPs
6528 after slot i. The slot-types of the instructions ahead
6529 of i never change, so we don't need to worry about
6530 changing NOPs in front of this slot. */
6531 for (j = i; j < 3; ++j)
6532 insn[j] = nop[ia64_templ_desc[template].exec_unit[j]];
6533 }
6534 required_unit = ia64_templ_desc[template].exec_unit[i];
6535
6536 /* resolve dynamic opcodes such as "break", "hint", and "nop": */
6537 if (idesc->type == IA64_TYPE_DYN)
6538 {
6539 enum ia64_opnd opnd1, opnd2;
6540
6541 if ((strcmp (idesc->name, "nop") == 0)
6542 || (strcmp (idesc->name, "hint") == 0)
6543 || (strcmp (idesc->name, "break") == 0))
6544 insn_unit = required_unit;
6545 else if (strcmp (idesc->name, "chk.s") == 0
6546 || strcmp (idesc->name, "mov") == 0)
6547 {
6548 insn_unit = IA64_UNIT_M;
6549 if (required_unit == IA64_UNIT_I
6550 || (required_unit == IA64_UNIT_F && template == 6))
6551 insn_unit = IA64_UNIT_I;
6552 }
6553 else
6554 as_fatal ("emit_one_bundle: unexpected dynamic op");
6555
6556 sprintf (mnemonic, "%s.%c", idesc->name, "?imbfxx"[insn_unit]);
6557 opnd1 = idesc->operands[0];
6558 opnd2 = idesc->operands[1];
6559 ia64_free_opcode (idesc);
6560 idesc = ia64_find_opcode (mnemonic);
6561 /* moves to/from ARs have collisions */
6562 if (opnd1 == IA64_OPND_AR3 || opnd2 == IA64_OPND_AR3)
6563 {
6564 while (idesc != NULL
6565 && (idesc->operands[0] != opnd1
6566 || idesc->operands[1] != opnd2))
6567 idesc = get_next_opcode (idesc);
6568 }
6569 md.slot[curr].idesc = idesc;
6570 }
6571 else
6572 {
6573 insn_type = idesc->type;
6574 insn_unit = IA64_UNIT_NIL;
6575 switch (insn_type)
6576 {
6577 case IA64_TYPE_A:
6578 if (required_unit == IA64_UNIT_I || required_unit == IA64_UNIT_M)
6579 insn_unit = required_unit;
6580 break;
6581 case IA64_TYPE_X: insn_unit = IA64_UNIT_L; break;
6582 case IA64_TYPE_I: insn_unit = IA64_UNIT_I; break;
6583 case IA64_TYPE_M: insn_unit = IA64_UNIT_M; break;
6584 case IA64_TYPE_B: insn_unit = IA64_UNIT_B; break;
6585 case IA64_TYPE_F: insn_unit = IA64_UNIT_F; break;
6586 default: break;
6587 }
6588 }
6589
6590 if (insn_unit != required_unit)
6591 {
6592 if (required_unit == IA64_UNIT_L
6593 && insn_unit == IA64_UNIT_I
6594 && !(idesc->flags & IA64_OPCODE_X_IN_MLX))
6595 {
6596 /* we got ourselves an MLX template but the current
6597 instruction isn't an X-unit, or an I-unit instruction
6598 that can go into the X slot of an MLX template. Duh. */
6599 if (md.num_slots_in_use >= NUM_SLOTS)
6600 {
6601 as_bad_where (md.slot[curr].src_file,
6602 md.slot[curr].src_line,
6603 "`%s' can't go in X slot of "
6604 "MLX template", idesc->name);
6605 /* drop this insn so we don't livelock: */
6606 --md.num_slots_in_use;
6607 }
6608 break;
6609 }
6610 continue; /* try next slot */
6611 }
6612
6613 if (debug_type == DEBUG_DWARF2 || md.slot[curr].loc_directive_seen)
6614 {
6615 bfd_vma addr = frag_now->fr_address + frag_now_fix () - 16 + i;
6616
6617 md.slot[curr].loc_directive_seen = 0;
6618 dwarf2_gen_line_info (addr, &md.slot[curr].debug_line);
6619 }
6620
6621 build_insn (md.slot + curr, insn + i);
6622
6623 ptr = md.slot[curr].unwind_record;
6624 if (ptr)
6625 {
6626 /* Set slot numbers for all remaining unwind records belonging to the
6627 current insn. There can not be any prologue/body unwind records
6628 here. */
6629 end_ptr = md.slot[(curr + 1) % NUM_SLOTS].unwind_record;
6630 for (; ptr != end_ptr; ptr = ptr->next)
6631 {
6632 ptr->slot_number = (unsigned long) f + i;
6633 ptr->slot_frag = frag_now;
6634 }
6635 md.slot[curr].unwind_record = NULL;
6636 }
6637
6638 if (required_unit == IA64_UNIT_L)
6639 {
6640 know (i == 1);
6641 /* skip one slot for long/X-unit instructions */
6642 ++i;
6643 }
6644 --md.num_slots_in_use;
6645
6646 /* now is a good time to fix up the labels for this insn: */
6647 for (lfix = md.slot[curr].label_fixups; lfix; lfix = lfix->next)
6648 {
6649 S_SET_VALUE (lfix->sym, frag_now_fix () - 16);
6650 symbol_set_frag (lfix->sym, frag_now);
6651 }
6652 /* and fix up the tags also. */
6653 for (lfix = md.slot[curr].tag_fixups; lfix; lfix = lfix->next)
6654 {
6655 S_SET_VALUE (lfix->sym, frag_now_fix () - 16 + i);
6656 symbol_set_frag (lfix->sym, frag_now);
6657 }
6658
6659 for (j = 0; j < md.slot[curr].num_fixups; ++j)
6660 {
6661 ifix = md.slot[curr].fixup + j;
6662 fix = fix_new_exp (frag_now, frag_now_fix () - 16 + i, 8,
6663 &ifix->expr, ifix->is_pcrel, ifix->code);
6664 fix->tc_fix_data.opnd = ifix->opnd;
6665 fix->fx_plt = (fix->fx_r_type == BFD_RELOC_IA64_PLTOFF22);
6666 fix->fx_file = md.slot[curr].src_file;
6667 fix->fx_line = md.slot[curr].src_line;
6668 }
6669
6670 end_of_insn_group = md.slot[curr].end_of_insn_group;
6671
6672 /* clear slot: */
6673 ia64_free_opcode (md.slot[curr].idesc);
6674 memset (md.slot + curr, 0, sizeof (md.slot[curr]));
6675 md.slot[curr].user_template = -1;
6676
6677 if (manual_bundling_off)
6678 {
6679 manual_bundling = 0;
6680 break;
6681 }
6682 curr = (curr + 1) % NUM_SLOTS;
6683 idesc = md.slot[curr].idesc;
6684 }
6685 if (manual_bundling > 0)
6686 {
6687 if (md.num_slots_in_use > 0)
6688 {
6689 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6690 "`%s' does not fit into %s template",
6691 idesc->name, ia64_templ_desc[template].name);
6692 --md.num_slots_in_use;
6693 }
6694 else
6695 as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
6696 "Missing '}' at end of file");
6697 }
6698 know (md.num_slots_in_use < NUM_SLOTS);
6699
6700 t0 = end_of_insn_group | (template << 1) | (insn[0] << 5) | (insn[1] << 46);
6701 t1 = ((insn[1] >> 18) & 0x7fffff) | (insn[2] << 23);
6702
6703 number_to_chars_littleendian (f + 0, t0, 8);
6704 number_to_chars_littleendian (f + 8, t1, 8);
6705
6706 if (unwind.list)
6707 {
6708 unwind.list->next_slot_number = (unsigned long) f + 16;
6709 unwind.list->next_slot_frag = frag_now;
6710 }
6711 }
6712
6713 int
6714 md_parse_option (c, arg)
6715 int c;
6716 char *arg;
6717 {
6718
6719 switch (c)
6720 {
6721 /* Switches from the Intel assembler. */
6722 case 'm':
6723 if (strcmp (arg, "ilp64") == 0
6724 || strcmp (arg, "lp64") == 0
6725 || strcmp (arg, "p64") == 0)
6726 {
6727 md.flags |= EF_IA_64_ABI64;
6728 }
6729 else if (strcmp (arg, "ilp32") == 0)
6730 {
6731 md.flags &= ~EF_IA_64_ABI64;
6732 }
6733 else if (strcmp (arg, "le") == 0)
6734 {
6735 md.flags &= ~EF_IA_64_BE;
6736 default_big_endian = 0;
6737 }
6738 else if (strcmp (arg, "be") == 0)
6739 {
6740 md.flags |= EF_IA_64_BE;
6741 default_big_endian = 1;
6742 }
6743 else if (strncmp (arg, "unwind-check=", 13) == 0)
6744 {
6745 arg += 13;
6746 if (strcmp (arg, "warning") == 0)
6747 md.unwind_check = unwind_check_warning;
6748 else if (strcmp (arg, "error") == 0)
6749 md.unwind_check = unwind_check_error;
6750 else
6751 return 0;
6752 }
6753 else
6754 return 0;
6755 break;
6756
6757 case 'N':
6758 if (strcmp (arg, "so") == 0)
6759 {
6760 /* Suppress signon message. */
6761 }
6762 else if (strcmp (arg, "pi") == 0)
6763 {
6764 /* Reject privileged instructions. FIXME */
6765 }
6766 else if (strcmp (arg, "us") == 0)
6767 {
6768 /* Allow union of signed and unsigned range. FIXME */
6769 }
6770 else if (strcmp (arg, "close_fcalls") == 0)
6771 {
6772 /* Do not resolve global function calls. */
6773 }
6774 else
6775 return 0;
6776 break;
6777
6778 case 'C':
6779 /* temp[="prefix"] Insert temporary labels into the object file
6780 symbol table prefixed by "prefix".
6781 Default prefix is ":temp:".
6782 */
6783 break;
6784
6785 case 'a':
6786 /* indirect=<tgt> Assume unannotated indirect branches behavior
6787 according to <tgt> --
6788 exit: branch out from the current context (default)
6789 labels: all labels in context may be branch targets
6790 */
6791 if (strncmp (arg, "indirect=", 9) != 0)
6792 return 0;
6793 break;
6794
6795 case 'x':
6796 /* -X conflicts with an ignored option, use -x instead */
6797 md.detect_dv = 1;
6798 if (!arg || strcmp (arg, "explicit") == 0)
6799 {
6800 /* set default mode to explicit */
6801 md.default_explicit_mode = 1;
6802 break;
6803 }
6804 else if (strcmp (arg, "auto") == 0)
6805 {
6806 md.default_explicit_mode = 0;
6807 }
6808 else if (strcmp (arg, "debug") == 0)
6809 {
6810 md.debug_dv = 1;
6811 }
6812 else if (strcmp (arg, "debugx") == 0)
6813 {
6814 md.default_explicit_mode = 1;
6815 md.debug_dv = 1;
6816 }
6817 else
6818 {
6819 as_bad (_("Unrecognized option '-x%s'"), arg);
6820 }
6821 break;
6822
6823 case 'S':
6824 /* nops Print nops statistics. */
6825 break;
6826
6827 /* GNU specific switches for gcc. */
6828 case OPTION_MCONSTANT_GP:
6829 md.flags |= EF_IA_64_CONS_GP;
6830 break;
6831
6832 case OPTION_MAUTO_PIC:
6833 md.flags |= EF_IA_64_NOFUNCDESC_CONS_GP;
6834 break;
6835
6836 default:
6837 return 0;
6838 }
6839
6840 return 1;
6841 }
6842
6843 void
6844 md_show_usage (stream)
6845 FILE *stream;
6846 {
6847 fputs (_("\
6848 IA-64 options:\n\
6849 --mconstant-gp mark output file as using the constant-GP model\n\
6850 (sets ELF header flag EF_IA_64_CONS_GP)\n\
6851 --mauto-pic mark output file as using the constant-GP model\n\
6852 without function descriptors (sets ELF header flag\n\
6853 EF_IA_64_NOFUNCDESC_CONS_GP)\n\
6854 -milp32|-milp64|-mlp64|-mp64 select data model (default -mlp64)\n\
6855 -mle | -mbe select little- or big-endian byte order (default -mle)\n\
6856 -munwind-check=[warning|error]\n\
6857 unwind directive check (default -munwind-check=warning)\n\
6858 -x | -xexplicit turn on dependency violation checking (default)\n\
6859 -xauto automagically remove dependency violations\n\
6860 -xdebug debug dependency violation checker\n"),
6861 stream);
6862 }
6863
6864 void
6865 ia64_after_parse_args ()
6866 {
6867 if (debug_type == DEBUG_STABS)
6868 as_fatal (_("--gstabs is not supported for ia64"));
6869 }
6870
6871 /* Return true if TYPE fits in TEMPL at SLOT. */
6872
6873 static int
6874 match (int templ, int type, int slot)
6875 {
6876 enum ia64_unit unit;
6877 int result;
6878
6879 unit = ia64_templ_desc[templ].exec_unit[slot];
6880 switch (type)
6881 {
6882 case IA64_TYPE_DYN: result = 1; break; /* for nop and break */
6883 case IA64_TYPE_A:
6884 result = (unit == IA64_UNIT_I || unit == IA64_UNIT_M);
6885 break;
6886 case IA64_TYPE_X: result = (unit == IA64_UNIT_L); break;
6887 case IA64_TYPE_I: result = (unit == IA64_UNIT_I); break;
6888 case IA64_TYPE_M: result = (unit == IA64_UNIT_M); break;
6889 case IA64_TYPE_B: result = (unit == IA64_UNIT_B); break;
6890 case IA64_TYPE_F: result = (unit == IA64_UNIT_F); break;
6891 default: result = 0; break;
6892 }
6893 return result;
6894 }
6895
6896 /* Add a bit of extra goodness if a nop of type F or B would fit
6897 in TEMPL at SLOT. */
6898
6899 static inline int
6900 extra_goodness (int templ, int slot)
6901 {
6902 if (slot == 1 && match (templ, IA64_TYPE_F, slot))
6903 return 2;
6904 if (slot == 2 && match (templ, IA64_TYPE_B, slot))
6905 return 1;
6906 return 0;
6907 }
6908
6909 /* This function is called once, at assembler startup time. It sets
6910 up all the tables, etc. that the MD part of the assembler will need
6911 that can be determined before arguments are parsed. */
6912 void
6913 md_begin ()
6914 {
6915 int i, j, k, t, total, ar_base, cr_base, goodness, best, regnum, ok;
6916 const char *err;
6917 char name[8];
6918
6919 md.auto_align = 1;
6920 md.explicit_mode = md.default_explicit_mode;
6921
6922 bfd_set_section_alignment (stdoutput, text_section, 4);
6923
6924 /* Make sure function pointers get initialized. */
6925 target_big_endian = -1;
6926 dot_byteorder (default_big_endian);
6927
6928 alias_hash = hash_new ();
6929 alias_name_hash = hash_new ();
6930 secalias_hash = hash_new ();
6931 secalias_name_hash = hash_new ();
6932
6933 pseudo_func[FUNC_DTP_MODULE].u.sym =
6934 symbol_new (".<dtpmod>", undefined_section, FUNC_DTP_MODULE,
6935 &zero_address_frag);
6936
6937 pseudo_func[FUNC_DTP_RELATIVE].u.sym =
6938 symbol_new (".<dtprel>", undefined_section, FUNC_DTP_RELATIVE,
6939 &zero_address_frag);
6940
6941 pseudo_func[FUNC_FPTR_RELATIVE].u.sym =
6942 symbol_new (".<fptr>", undefined_section, FUNC_FPTR_RELATIVE,
6943 &zero_address_frag);
6944
6945 pseudo_func[FUNC_GP_RELATIVE].u.sym =
6946 symbol_new (".<gprel>", undefined_section, FUNC_GP_RELATIVE,
6947 &zero_address_frag);
6948
6949 pseudo_func[FUNC_LT_RELATIVE].u.sym =
6950 symbol_new (".<ltoff>", undefined_section, FUNC_LT_RELATIVE,
6951 &zero_address_frag);
6952
6953 pseudo_func[FUNC_LT_RELATIVE_X].u.sym =
6954 symbol_new (".<ltoffx>", undefined_section, FUNC_LT_RELATIVE_X,
6955 &zero_address_frag);
6956
6957 pseudo_func[FUNC_PC_RELATIVE].u.sym =
6958 symbol_new (".<pcrel>", undefined_section, FUNC_PC_RELATIVE,
6959 &zero_address_frag);
6960
6961 pseudo_func[FUNC_PLT_RELATIVE].u.sym =
6962 symbol_new (".<pltoff>", undefined_section, FUNC_PLT_RELATIVE,
6963 &zero_address_frag);
6964
6965 pseudo_func[FUNC_SEC_RELATIVE].u.sym =
6966 symbol_new (".<secrel>", undefined_section, FUNC_SEC_RELATIVE,
6967 &zero_address_frag);
6968
6969 pseudo_func[FUNC_SEG_RELATIVE].u.sym =
6970 symbol_new (".<segrel>", undefined_section, FUNC_SEG_RELATIVE,
6971 &zero_address_frag);
6972
6973 pseudo_func[FUNC_TP_RELATIVE].u.sym =
6974 symbol_new (".<tprel>", undefined_section, FUNC_TP_RELATIVE,
6975 &zero_address_frag);
6976
6977 pseudo_func[FUNC_LTV_RELATIVE].u.sym =
6978 symbol_new (".<ltv>", undefined_section, FUNC_LTV_RELATIVE,
6979 &zero_address_frag);
6980
6981 pseudo_func[FUNC_LT_FPTR_RELATIVE].u.sym =
6982 symbol_new (".<ltoff.fptr>", undefined_section, FUNC_LT_FPTR_RELATIVE,
6983 &zero_address_frag);
6984
6985 pseudo_func[FUNC_LT_DTP_MODULE].u.sym =
6986 symbol_new (".<ltoff.dtpmod>", undefined_section, FUNC_LT_DTP_MODULE,
6987 &zero_address_frag);
6988
6989 pseudo_func[FUNC_LT_DTP_RELATIVE].u.sym =
6990 symbol_new (".<ltoff.dptrel>", undefined_section, FUNC_LT_DTP_RELATIVE,
6991 &zero_address_frag);
6992
6993 pseudo_func[FUNC_LT_TP_RELATIVE].u.sym =
6994 symbol_new (".<ltoff.tprel>", undefined_section, FUNC_LT_TP_RELATIVE,
6995 &zero_address_frag);
6996
6997 pseudo_func[FUNC_IPLT_RELOC].u.sym =
6998 symbol_new (".<iplt>", undefined_section, FUNC_IPLT_RELOC,
6999 &zero_address_frag);
7000
7001 /* Compute the table of best templates. We compute goodness as a
7002 base 4 value, in which each match counts for 3, each F counts
7003 for 2, each B counts for 1. This should maximize the number of
7004 F and B nops in the chosen bundles, which is good because these
7005 pipelines are least likely to be overcommitted. */
7006 for (i = 0; i < IA64_NUM_TYPES; ++i)
7007 for (j = 0; j < IA64_NUM_TYPES; ++j)
7008 for (k = 0; k < IA64_NUM_TYPES; ++k)
7009 {
7010 best = 0;
7011 for (t = 0; t < NELEMS (ia64_templ_desc); ++t)
7012 {
7013 goodness = 0;
7014 if (match (t, i, 0))
7015 {
7016 if (match (t, j, 1))
7017 {
7018 if (match (t, k, 2))
7019 goodness = 3 + 3 + 3;
7020 else
7021 goodness = 3 + 3 + extra_goodness (t, 2);
7022 }
7023 else if (match (t, j, 2))
7024 goodness = 3 + 3 + extra_goodness (t, 1);
7025 else
7026 {
7027 goodness = 3;
7028 goodness += extra_goodness (t, 1);
7029 goodness += extra_goodness (t, 2);
7030 }
7031 }
7032 else if (match (t, i, 1))
7033 {
7034 if (match (t, j, 2))
7035 goodness = 3 + 3;
7036 else
7037 goodness = 3 + extra_goodness (t, 2);
7038 }
7039 else if (match (t, i, 2))
7040 goodness = 3 + extra_goodness (t, 1);
7041
7042 if (goodness > best)
7043 {
7044 best = goodness;
7045 best_template[i][j][k] = t;
7046 }
7047 }
7048 }
7049
7050 for (i = 0; i < NUM_SLOTS; ++i)
7051 md.slot[i].user_template = -1;
7052
7053 md.pseudo_hash = hash_new ();
7054 for (i = 0; i < NELEMS (pseudo_opcode); ++i)
7055 {
7056 err = hash_insert (md.pseudo_hash, pseudo_opcode[i].name,
7057 (void *) (pseudo_opcode + i));
7058 if (err)
7059 as_fatal ("ia64.md_begin: can't hash `%s': %s",
7060 pseudo_opcode[i].name, err);
7061 }
7062
7063 md.reg_hash = hash_new ();
7064 md.dynreg_hash = hash_new ();
7065 md.const_hash = hash_new ();
7066 md.entry_hash = hash_new ();
7067
7068 /* general registers: */
7069
7070 total = 128;
7071 for (i = 0; i < total; ++i)
7072 {
7073 sprintf (name, "r%d", i - REG_GR);
7074 md.regsym[i] = declare_register (name, i);
7075 }
7076
7077 /* floating point registers: */
7078 total += 128;
7079 for (; i < total; ++i)
7080 {
7081 sprintf (name, "f%d", i - REG_FR);
7082 md.regsym[i] = declare_register (name, i);
7083 }
7084
7085 /* application registers: */
7086 total += 128;
7087 ar_base = i;
7088 for (; i < total; ++i)
7089 {
7090 sprintf (name, "ar%d", i - REG_AR);
7091 md.regsym[i] = declare_register (name, i);
7092 }
7093
7094 /* control registers: */
7095 total += 128;
7096 cr_base = i;
7097 for (; i < total; ++i)
7098 {
7099 sprintf (name, "cr%d", i - REG_CR);
7100 md.regsym[i] = declare_register (name, i);
7101 }
7102
7103 /* predicate registers: */
7104 total += 64;
7105 for (; i < total; ++i)
7106 {
7107 sprintf (name, "p%d", i - REG_P);
7108 md.regsym[i] = declare_register (name, i);
7109 }
7110
7111 /* branch registers: */
7112 total += 8;
7113 for (; i < total; ++i)
7114 {
7115 sprintf (name, "b%d", i - REG_BR);
7116 md.regsym[i] = declare_register (name, i);
7117 }
7118
7119 md.regsym[REG_IP] = declare_register ("ip", REG_IP);
7120 md.regsym[REG_CFM] = declare_register ("cfm", REG_CFM);
7121 md.regsym[REG_PR] = declare_register ("pr", REG_PR);
7122 md.regsym[REG_PR_ROT] = declare_register ("pr.rot", REG_PR_ROT);
7123 md.regsym[REG_PSR] = declare_register ("psr", REG_PSR);
7124 md.regsym[REG_PSR_L] = declare_register ("psr.l", REG_PSR_L);
7125 md.regsym[REG_PSR_UM] = declare_register ("psr.um", REG_PSR_UM);
7126
7127 for (i = 0; i < NELEMS (indirect_reg); ++i)
7128 {
7129 regnum = indirect_reg[i].regnum;
7130 md.regsym[regnum] = declare_register (indirect_reg[i].name, regnum);
7131 }
7132
7133 /* define synonyms for application registers: */
7134 for (i = REG_AR; i < REG_AR + NELEMS (ar); ++i)
7135 md.regsym[i] = declare_register (ar[i - REG_AR].name,
7136 REG_AR + ar[i - REG_AR].regnum);
7137
7138 /* define synonyms for control registers: */
7139 for (i = REG_CR; i < REG_CR + NELEMS (cr); ++i)
7140 md.regsym[i] = declare_register (cr[i - REG_CR].name,
7141 REG_CR + cr[i - REG_CR].regnum);
7142
7143 declare_register ("gp", REG_GR + 1);
7144 declare_register ("sp", REG_GR + 12);
7145 declare_register ("rp", REG_BR + 0);
7146
7147 /* pseudo-registers used to specify unwind info: */
7148 declare_register ("psp", REG_PSP);
7149
7150 declare_register_set ("ret", 4, REG_GR + 8);
7151 declare_register_set ("farg", 8, REG_FR + 8);
7152 declare_register_set ("fret", 8, REG_FR + 8);
7153
7154 for (i = 0; i < NELEMS (const_bits); ++i)
7155 {
7156 err = hash_insert (md.const_hash, const_bits[i].name,
7157 (PTR) (const_bits + i));
7158 if (err)
7159 as_fatal ("Inserting \"%s\" into constant hash table failed: %s",
7160 name, err);
7161 }
7162
7163 /* Set the architecture and machine depending on defaults and command line
7164 options. */
7165 if (md.flags & EF_IA_64_ABI64)
7166 ok = bfd_set_arch_mach (stdoutput, bfd_arch_ia64, bfd_mach_ia64_elf64);
7167 else
7168 ok = bfd_set_arch_mach (stdoutput, bfd_arch_ia64, bfd_mach_ia64_elf32);
7169
7170 if (! ok)
7171 as_warn (_("Could not set architecture and machine"));
7172
7173 /* Set the pointer size and pointer shift size depending on md.flags */
7174
7175 if (md.flags & EF_IA_64_ABI64)
7176 {
7177 md.pointer_size = 8; /* pointers are 8 bytes */
7178 md.pointer_size_shift = 3; /* alignment is 8 bytes = 2^2 */
7179 }
7180 else
7181 {
7182 md.pointer_size = 4; /* pointers are 4 bytes */
7183 md.pointer_size_shift = 2; /* alignment is 4 bytes = 2^2 */
7184 }
7185
7186 md.mem_offset.hint = 0;
7187 md.path = 0;
7188 md.maxpaths = 0;
7189 md.entry_labels = NULL;
7190 }
7191
7192 /* Set the default options in md. Cannot do this in md_begin because
7193 that is called after md_parse_option which is where we set the
7194 options in md based on command line options. */
7195
7196 void
7197 ia64_init (argc, argv)
7198 int argc ATTRIBUTE_UNUSED;
7199 char **argv ATTRIBUTE_UNUSED;
7200 {
7201 md.flags = MD_FLAGS_DEFAULT;
7202 /* FIXME: We should change it to unwind_check_error someday. */
7203 md.unwind_check = unwind_check_warning;
7204 }
7205
7206 /* Return a string for the target object file format. */
7207
7208 const char *
7209 ia64_target_format ()
7210 {
7211 if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
7212 {
7213 if (md.flags & EF_IA_64_BE)
7214 {
7215 if (md.flags & EF_IA_64_ABI64)
7216 #if defined(TE_AIX50)
7217 return "elf64-ia64-aix-big";
7218 #elif defined(TE_HPUX)
7219 return "elf64-ia64-hpux-big";
7220 #else
7221 return "elf64-ia64-big";
7222 #endif
7223 else
7224 #if defined(TE_AIX50)
7225 return "elf32-ia64-aix-big";
7226 #elif defined(TE_HPUX)
7227 return "elf32-ia64-hpux-big";
7228 #else
7229 return "elf32-ia64-big";
7230 #endif
7231 }
7232 else
7233 {
7234 if (md.flags & EF_IA_64_ABI64)
7235 #ifdef TE_AIX50
7236 return "elf64-ia64-aix-little";
7237 #else
7238 return "elf64-ia64-little";
7239 #endif
7240 else
7241 #ifdef TE_AIX50
7242 return "elf32-ia64-aix-little";
7243 #else
7244 return "elf32-ia64-little";
7245 #endif
7246 }
7247 }
7248 else
7249 return "unknown-format";
7250 }
7251
7252 void
7253 ia64_end_of_source ()
7254 {
7255 /* terminate insn group upon reaching end of file: */
7256 insn_group_break (1, 0, 0);
7257
7258 /* emits slots we haven't written yet: */
7259 ia64_flush_insns ();
7260
7261 bfd_set_private_flags (stdoutput, md.flags);
7262
7263 md.mem_offset.hint = 0;
7264 }
7265
7266 void
7267 ia64_start_line ()
7268 {
7269 if (md.qp.X_op == O_register)
7270 as_bad ("qualifying predicate not followed by instruction");
7271 md.qp.X_op = O_absent;
7272
7273 if (ignore_input ())
7274 return;
7275
7276 if (input_line_pointer[0] == ';' && input_line_pointer[-1] == ';')
7277 {
7278 if (md.detect_dv && !md.explicit_mode)
7279 as_warn (_("Explicit stops are ignored in auto mode"));
7280 else
7281 insn_group_break (1, 0, 0);
7282 }
7283 }
7284
7285 /* This is a hook for ia64_frob_label, so that it can distinguish tags from
7286 labels. */
7287 static int defining_tag = 0;
7288
7289 int
7290 ia64_unrecognized_line (ch)
7291 int ch;
7292 {
7293 switch (ch)
7294 {
7295 case '(':
7296 expression (&md.qp);
7297 if (*input_line_pointer++ != ')')
7298 {
7299 as_bad ("Expected ')'");
7300 return 0;
7301 }
7302 if (md.qp.X_op != O_register)
7303 {
7304 as_bad ("Qualifying predicate expected");
7305 return 0;
7306 }
7307 if (md.qp.X_add_number < REG_P || md.qp.X_add_number >= REG_P + 64)
7308 {
7309 as_bad ("Predicate register expected");
7310 return 0;
7311 }
7312 return 1;
7313
7314 case '{':
7315 if (md.manual_bundling)
7316 as_warn ("Found '{' when manual bundling is already turned on");
7317 else
7318 CURR_SLOT.manual_bundling_on = 1;
7319 md.manual_bundling = 1;
7320
7321 /* Bundling is only acceptable in explicit mode
7322 or when in default automatic mode. */
7323 if (md.detect_dv && !md.explicit_mode)
7324 {
7325 if (!md.mode_explicitly_set
7326 && !md.default_explicit_mode)
7327 dot_dv_mode ('E');
7328 else
7329 as_warn (_("Found '{' after explicit switch to automatic mode"));
7330 }
7331 return 1;
7332
7333 case '}':
7334 if (!md.manual_bundling)
7335 as_warn ("Found '}' when manual bundling is off");
7336 else
7337 PREV_SLOT.manual_bundling_off = 1;
7338 md.manual_bundling = 0;
7339
7340 /* switch back to automatic mode, if applicable */
7341 if (md.detect_dv
7342 && md.explicit_mode
7343 && !md.mode_explicitly_set
7344 && !md.default_explicit_mode)
7345 dot_dv_mode ('A');
7346
7347 /* Allow '{' to follow on the same line. We also allow ";;", but that
7348 happens automatically because ';' is an end of line marker. */
7349 SKIP_WHITESPACE ();
7350 if (input_line_pointer[0] == '{')
7351 {
7352 input_line_pointer++;
7353 return ia64_unrecognized_line ('{');
7354 }
7355
7356 demand_empty_rest_of_line ();
7357 return 1;
7358
7359 case '[':
7360 {
7361 char *s;
7362 char c;
7363 symbolS *tag;
7364 int temp;
7365
7366 if (md.qp.X_op == O_register)
7367 {
7368 as_bad ("Tag must come before qualifying predicate.");
7369 return 0;
7370 }
7371
7372 /* This implements just enough of read_a_source_file in read.c to
7373 recognize labels. */
7374 if (is_name_beginner (*input_line_pointer))
7375 {
7376 s = input_line_pointer;
7377 c = get_symbol_end ();
7378 }
7379 else if (LOCAL_LABELS_FB
7380 && ISDIGIT (*input_line_pointer))
7381 {
7382 temp = 0;
7383 while (ISDIGIT (*input_line_pointer))
7384 temp = (temp * 10) + *input_line_pointer++ - '0';
7385 fb_label_instance_inc (temp);
7386 s = fb_label_name (temp, 0);
7387 c = *input_line_pointer;
7388 }
7389 else
7390 {
7391 s = NULL;
7392 c = '\0';
7393 }
7394 if (c != ':')
7395 {
7396 /* Put ':' back for error messages' sake. */
7397 *input_line_pointer++ = ':';
7398 as_bad ("Expected ':'");
7399 return 0;
7400 }
7401
7402 defining_tag = 1;
7403 tag = colon (s);
7404 defining_tag = 0;
7405 /* Put ':' back for error messages' sake. */
7406 *input_line_pointer++ = ':';
7407 if (*input_line_pointer++ != ']')
7408 {
7409 as_bad ("Expected ']'");
7410 return 0;
7411 }
7412 if (! tag)
7413 {
7414 as_bad ("Tag name expected");
7415 return 0;
7416 }
7417 return 1;
7418 }
7419
7420 default:
7421 break;
7422 }
7423
7424 /* Not a valid line. */
7425 return 0;
7426 }
7427
7428 void
7429 ia64_frob_label (sym)
7430 struct symbol *sym;
7431 {
7432 struct label_fix *fix;
7433
7434 /* Tags need special handling since they are not bundle breaks like
7435 labels. */
7436 if (defining_tag)
7437 {
7438 fix = obstack_alloc (&notes, sizeof (*fix));
7439 fix->sym = sym;
7440 fix->next = CURR_SLOT.tag_fixups;
7441 CURR_SLOT.tag_fixups = fix;
7442
7443 return;
7444 }
7445
7446 if (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE)
7447 {
7448 md.last_text_seg = now_seg;
7449 fix = obstack_alloc (&notes, sizeof (*fix));
7450 fix->sym = sym;
7451 fix->next = CURR_SLOT.label_fixups;
7452 CURR_SLOT.label_fixups = fix;
7453
7454 /* Keep track of how many code entry points we've seen. */
7455 if (md.path == md.maxpaths)
7456 {
7457 md.maxpaths += 20;
7458 md.entry_labels = (const char **)
7459 xrealloc ((void *) md.entry_labels,
7460 md.maxpaths * sizeof (char *));
7461 }
7462 md.entry_labels[md.path++] = S_GET_NAME (sym);
7463 }
7464 }
7465
7466 #ifdef TE_HPUX
7467 /* The HP-UX linker will give unresolved symbol errors for symbols
7468 that are declared but unused. This routine removes declared,
7469 unused symbols from an object. */
7470 int
7471 ia64_frob_symbol (sym)
7472 struct symbol *sym;
7473 {
7474 if ((S_GET_SEGMENT (sym) == &bfd_und_section && ! symbol_used_p (sym) &&
7475 ELF_ST_VISIBILITY (S_GET_OTHER (sym)) == STV_DEFAULT)
7476 || (S_GET_SEGMENT (sym) == &bfd_abs_section
7477 && ! S_IS_EXTERNAL (sym)))
7478 return 1;
7479 return 0;
7480 }
7481 #endif
7482
7483 void
7484 ia64_flush_pending_output ()
7485 {
7486 if (!md.keep_pending_output
7487 && bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE)
7488 {
7489 /* ??? This causes many unnecessary stop bits to be emitted.
7490 Unfortunately, it isn't clear if it is safe to remove this. */
7491 insn_group_break (1, 0, 0);
7492 ia64_flush_insns ();
7493 }
7494 }
7495
7496 /* Do ia64-specific expression optimization. All that's done here is
7497 to transform index expressions that are either due to the indexing
7498 of rotating registers or due to the indexing of indirect register
7499 sets. */
7500 int
7501 ia64_optimize_expr (l, op, r)
7502 expressionS *l;
7503 operatorT op;
7504 expressionS *r;
7505 {
7506 unsigned num_regs;
7507
7508 if (op == O_index)
7509 {
7510 if (l->X_op == O_register && r->X_op == O_constant)
7511 {
7512 num_regs = (l->X_add_number >> 16);
7513 if ((unsigned) r->X_add_number >= num_regs)
7514 {
7515 if (!num_regs)
7516 as_bad ("No current frame");
7517 else
7518 as_bad ("Index out of range 0..%u", num_regs - 1);
7519 r->X_add_number = 0;
7520 }
7521 l->X_add_number = (l->X_add_number & 0xffff) + r->X_add_number;
7522 return 1;
7523 }
7524 else if (l->X_op == O_register && r->X_op == O_register)
7525 {
7526 if (l->X_add_number < IND_CPUID || l->X_add_number > IND_RR
7527 || l->X_add_number == IND_MEM)
7528 {
7529 as_bad ("Indirect register set name expected");
7530 l->X_add_number = IND_CPUID;
7531 }
7532 l->X_op = O_index;
7533 l->X_op_symbol = md.regsym[l->X_add_number];
7534 l->X_add_number = r->X_add_number;
7535 return 1;
7536 }
7537 }
7538 return 0;
7539 }
7540
7541 int
7542 ia64_parse_name (name, e, nextcharP)
7543 char *name;
7544 expressionS *e;
7545 char *nextcharP;
7546 {
7547 struct const_desc *cdesc;
7548 struct dynreg *dr = 0;
7549 unsigned int regnum;
7550 unsigned int idx;
7551 struct symbol *sym;
7552 char *end;
7553
7554 if (*name == '@')
7555 {
7556 enum pseudo_type pseudo_type = PSEUDO_FUNC_NONE;
7557
7558 /* Find what relocation pseudo-function we're dealing with. */
7559 for (idx = 0; idx < NELEMS (pseudo_func); ++idx)
7560 if (pseudo_func[idx].name
7561 && pseudo_func[idx].name[0] == name[1]
7562 && strcmp (pseudo_func[idx].name + 1, name + 2) == 0)
7563 {
7564 pseudo_type = pseudo_func[idx].type;
7565 break;
7566 }
7567 switch (pseudo_type)
7568 {
7569 case PSEUDO_FUNC_RELOC:
7570 end = input_line_pointer;
7571 if (*nextcharP != '(')
7572 {
7573 as_bad ("Expected '('");
7574 goto done;
7575 }
7576 /* Skip '('. */
7577 ++input_line_pointer;
7578 expression (e);
7579 if (*input_line_pointer != ')')
7580 {
7581 as_bad ("Missing ')'");
7582 goto done;
7583 }
7584 /* Skip ')'. */
7585 ++input_line_pointer;
7586 if (e->X_op != O_symbol)
7587 {
7588 if (e->X_op != O_pseudo_fixup)
7589 {
7590 as_bad ("Not a symbolic expression");
7591 goto done;
7592 }
7593 if (idx != FUNC_LT_RELATIVE)
7594 {
7595 as_bad ("Illegal combination of relocation functions");
7596 goto done;
7597 }
7598 switch (S_GET_VALUE (e->X_op_symbol))
7599 {
7600 case FUNC_FPTR_RELATIVE:
7601 idx = FUNC_LT_FPTR_RELATIVE; break;
7602 case FUNC_DTP_MODULE:
7603 idx = FUNC_LT_DTP_MODULE; break;
7604 case FUNC_DTP_RELATIVE:
7605 idx = FUNC_LT_DTP_RELATIVE; break;
7606 case FUNC_TP_RELATIVE:
7607 idx = FUNC_LT_TP_RELATIVE; break;
7608 default:
7609 as_bad ("Illegal combination of relocation functions");
7610 goto done;
7611 }
7612 }
7613 /* Make sure gas doesn't get rid of local symbols that are used
7614 in relocs. */
7615 e->X_op = O_pseudo_fixup;
7616 e->X_op_symbol = pseudo_func[idx].u.sym;
7617 break;
7618
7619 case PSEUDO_FUNC_CONST:
7620 e->X_op = O_constant;
7621 e->X_add_number = pseudo_func[idx].u.ival;
7622 break;
7623
7624 case PSEUDO_FUNC_REG:
7625 e->X_op = O_register;
7626 e->X_add_number = pseudo_func[idx].u.ival;
7627 break;
7628
7629 default:
7630 return 0;
7631 }
7632 done:
7633 *nextcharP = *input_line_pointer;
7634 return 1;
7635 }
7636
7637 /* first see if NAME is a known register name: */
7638 sym = hash_find (md.reg_hash, name);
7639 if (sym)
7640 {
7641 e->X_op = O_register;
7642 e->X_add_number = S_GET_VALUE (sym);
7643 return 1;
7644 }
7645
7646 cdesc = hash_find (md.const_hash, name);
7647 if (cdesc)
7648 {
7649 e->X_op = O_constant;
7650 e->X_add_number = cdesc->value;
7651 return 1;
7652 }
7653
7654 /* check for inN, locN, or outN: */
7655 switch (name[0])
7656 {
7657 case 'i':
7658 if (name[1] == 'n' && ISDIGIT (name[2]))
7659 {
7660 dr = &md.in;
7661 name += 2;
7662 }
7663 break;
7664
7665 case 'l':
7666 if (name[1] == 'o' && name[2] == 'c' && ISDIGIT (name[3]))
7667 {
7668 dr = &md.loc;
7669 name += 3;
7670 }
7671 break;
7672
7673 case 'o':
7674 if (name[1] == 'u' && name[2] == 't' && ISDIGIT (name[3]))
7675 {
7676 dr = &md.out;
7677 name += 3;
7678 }
7679 break;
7680
7681 default:
7682 break;
7683 }
7684
7685 if (dr)
7686 {
7687 /* The name is inN, locN, or outN; parse the register number. */
7688 regnum = strtoul (name, &end, 10);
7689 if (end > name && *end == '\0')
7690 {
7691 if ((unsigned) regnum >= dr->num_regs)
7692 {
7693 if (!dr->num_regs)
7694 as_bad ("No current frame");
7695 else
7696 as_bad ("Register number out of range 0..%u",
7697 dr->num_regs - 1);
7698 regnum = 0;
7699 }
7700 e->X_op = O_register;
7701 e->X_add_number = dr->base + regnum;
7702 return 1;
7703 }
7704 }
7705
7706 if ((dr = hash_find (md.dynreg_hash, name)))
7707 {
7708 /* We've got ourselves the name of a rotating register set.
7709 Store the base register number in the low 16 bits of
7710 X_add_number and the size of the register set in the top 16
7711 bits. */
7712 e->X_op = O_register;
7713 e->X_add_number = dr->base | (dr->num_regs << 16);
7714 return 1;
7715 }
7716 return 0;
7717 }
7718
7719 /* Remove the '#' suffix that indicates a symbol as opposed to a register. */
7720
7721 char *
7722 ia64_canonicalize_symbol_name (name)
7723 char *name;
7724 {
7725 size_t len = strlen (name);
7726 if (len > 1 && name[len - 1] == '#')
7727 name[len - 1] = '\0';
7728 return name;
7729 }
7730
7731 /* Return true if idesc is a conditional branch instruction. This excludes
7732 the modulo scheduled branches, and br.ia. Mod-sched branches are excluded
7733 because they always read/write resources regardless of the value of the
7734 qualifying predicate. br.ia must always use p0, and hence is always
7735 taken. Thus this function returns true for branches which can fall
7736 through, and which use no resources if they do fall through. */
7737
7738 static int
7739 is_conditional_branch (idesc)
7740 struct ia64_opcode *idesc;
7741 {
7742 /* br is a conditional branch. Everything that starts with br. except
7743 br.ia, br.c{loop,top,exit}, and br.w{top,exit} is a conditional branch.
7744 Everything that starts with brl is a conditional branch. */
7745 return (idesc->name[0] == 'b' && idesc->name[1] == 'r'
7746 && (idesc->name[2] == '\0'
7747 || (idesc->name[2] == '.' && idesc->name[3] != 'i'
7748 && idesc->name[3] != 'c' && idesc->name[3] != 'w')
7749 || idesc->name[2] == 'l'
7750 /* br.cond, br.call, br.clr */
7751 || (idesc->name[2] == '.' && idesc->name[3] == 'c'
7752 && (idesc->name[4] == 'a' || idesc->name[4] == 'o'
7753 || (idesc->name[4] == 'l' && idesc->name[5] == 'r')))));
7754 }
7755
7756 /* Return whether the given opcode is a taken branch. If there's any doubt,
7757 returns zero. */
7758
7759 static int
7760 is_taken_branch (idesc)
7761 struct ia64_opcode *idesc;
7762 {
7763 return ((is_conditional_branch (idesc) && CURR_SLOT.qp_regno == 0)
7764 || strncmp (idesc->name, "br.ia", 5) == 0);
7765 }
7766
7767 /* Return whether the given opcode is an interruption or rfi. If there's any
7768 doubt, returns zero. */
7769
7770 static int
7771 is_interruption_or_rfi (idesc)
7772 struct ia64_opcode *idesc;
7773 {
7774 if (strcmp (idesc->name, "rfi") == 0)
7775 return 1;
7776 return 0;
7777 }
7778
7779 /* Returns the index of the given dependency in the opcode's list of chks, or
7780 -1 if there is no dependency. */
7781
7782 static int
7783 depends_on (depind, idesc)
7784 int depind;
7785 struct ia64_opcode *idesc;
7786 {
7787 int i;
7788 const struct ia64_opcode_dependency *dep = idesc->dependencies;
7789 for (i = 0; i < dep->nchks; i++)
7790 {
7791 if (depind == DEP (dep->chks[i]))
7792 return i;
7793 }
7794 return -1;
7795 }
7796
7797 /* Determine a set of specific resources used for a particular resource
7798 class. Returns the number of specific resources identified For those
7799 cases which are not determinable statically, the resource returned is
7800 marked nonspecific.
7801
7802 Meanings of value in 'NOTE':
7803 1) only read/write when the register number is explicitly encoded in the
7804 insn.
7805 2) only read CFM when accessing a rotating GR, FR, or PR. mov pr only
7806 accesses CFM when qualifying predicate is in the rotating region.
7807 3) general register value is used to specify an indirect register; not
7808 determinable statically.
7809 4) only read the given resource when bits 7:0 of the indirect index
7810 register value does not match the register number of the resource; not
7811 determinable statically.
7812 5) all rules are implementation specific.
7813 6) only when both the index specified by the reader and the index specified
7814 by the writer have the same value in bits 63:61; not determinable
7815 statically.
7816 7) only access the specified resource when the corresponding mask bit is
7817 set
7818 8) PSR.dfh is only read when these insns reference FR32-127. PSR.dfl is
7819 only read when these insns reference FR2-31
7820 9) PSR.mfl is only written when these insns write FR2-31. PSR.mfh is only
7821 written when these insns write FR32-127
7822 10) The PSR.bn bit is only accessed when one of GR16-31 is specified in the
7823 instruction
7824 11) The target predicates are written independently of PR[qp], but source
7825 registers are only read if PR[qp] is true. Since the state of PR[qp]
7826 cannot statically be determined, all source registers are marked used.
7827 12) This insn only reads the specified predicate register when that
7828 register is the PR[qp].
7829 13) This reference to ld-c only applies to teh GR whose value is loaded
7830 with data returned from memory, not the post-incremented address register.
7831 14) The RSE resource includes the implementation-specific RSE internal
7832 state resources. At least one (and possibly more) of these resources are
7833 read by each instruction listed in IC:rse-readers. At least one (and
7834 possibly more) of these resources are written by each insn listed in
7835 IC:rse-writers.
7836 15+16) Represents reserved instructions, which the assembler does not
7837 generate.
7838
7839 Memory resources (i.e. locations in memory) are *not* marked or tracked by
7840 this code; there are no dependency violations based on memory access.
7841 */
7842
7843 #define MAX_SPECS 256
7844 #define DV_CHK 1
7845 #define DV_REG 0
7846
7847 static int
7848 specify_resource (dep, idesc, type, specs, note, path)
7849 const struct ia64_dependency *dep;
7850 struct ia64_opcode *idesc;
7851 int type; /* is this a DV chk or a DV reg? */
7852 struct rsrc specs[MAX_SPECS]; /* returned specific resources */
7853 int note; /* resource note for this insn's usage */
7854 int path; /* which execution path to examine */
7855 {
7856 int count = 0;
7857 int i;
7858 int rsrc_write = 0;
7859 struct rsrc tmpl;
7860
7861 if (dep->mode == IA64_DV_WAW
7862 || (dep->mode == IA64_DV_RAW && type == DV_REG)
7863 || (dep->mode == IA64_DV_WAR && type == DV_CHK))
7864 rsrc_write = 1;
7865
7866 /* template for any resources we identify */
7867 tmpl.dependency = dep;
7868 tmpl.note = note;
7869 tmpl.insn_srlz = tmpl.data_srlz = 0;
7870 tmpl.qp_regno = CURR_SLOT.qp_regno;
7871 tmpl.link_to_qp_branch = 1;
7872 tmpl.mem_offset.hint = 0;
7873 tmpl.specific = 1;
7874 tmpl.index = 0;
7875 tmpl.cmp_type = CMP_NONE;
7876
7877 #define UNHANDLED \
7878 as_warn (_("Unhandled dependency %s for %s (%s), note %d"), \
7879 dep->name, idesc->name, (rsrc_write?"write":"read"), note)
7880 #define KNOWN(REG) (gr_values[REG].known && gr_values[REG].path >= path)
7881
7882 /* we don't need to track these */
7883 if (dep->semantics == IA64_DVS_NONE)
7884 return 0;
7885
7886 switch (dep->specifier)
7887 {
7888 case IA64_RS_AR_K:
7889 if (note == 1)
7890 {
7891 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
7892 {
7893 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
7894 if (regno >= 0 && regno <= 7)
7895 {
7896 specs[count] = tmpl;
7897 specs[count++].index = regno;
7898 }
7899 }
7900 }
7901 else if (note == 0)
7902 {
7903 for (i = 0; i < 8; i++)
7904 {
7905 specs[count] = tmpl;
7906 specs[count++].index = i;
7907 }
7908 }
7909 else
7910 {
7911 UNHANDLED;
7912 }
7913 break;
7914
7915 case IA64_RS_AR_UNAT:
7916 /* This is a mov =AR or mov AR= instruction. */
7917 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
7918 {
7919 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
7920 if (regno == AR_UNAT)
7921 {
7922 specs[count++] = tmpl;
7923 }
7924 }
7925 else
7926 {
7927 /* This is a spill/fill, or other instruction that modifies the
7928 unat register. */
7929
7930 /* Unless we can determine the specific bits used, mark the whole
7931 thing; bits 8:3 of the memory address indicate the bit used in
7932 UNAT. The .mem.offset hint may be used to eliminate a small
7933 subset of conflicts. */
7934 specs[count] = tmpl;
7935 if (md.mem_offset.hint)
7936 {
7937 if (md.debug_dv)
7938 fprintf (stderr, " Using hint for spill/fill\n");
7939 /* The index isn't actually used, just set it to something
7940 approximating the bit index. */
7941 specs[count].index = (md.mem_offset.offset >> 3) & 0x3F;
7942 specs[count].mem_offset.hint = 1;
7943 specs[count].mem_offset.offset = md.mem_offset.offset;
7944 specs[count++].mem_offset.base = md.mem_offset.base;
7945 }
7946 else
7947 {
7948 specs[count++].specific = 0;
7949 }
7950 }
7951 break;
7952
7953 case IA64_RS_AR:
7954 if (note == 1)
7955 {
7956 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
7957 {
7958 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
7959 if ((regno >= 8 && regno <= 15)
7960 || (regno >= 20 && regno <= 23)
7961 || (regno >= 31 && regno <= 39)
7962 || (regno >= 41 && regno <= 47)
7963 || (regno >= 67 && regno <= 111))
7964 {
7965 specs[count] = tmpl;
7966 specs[count++].index = regno;
7967 }
7968 }
7969 }
7970 else
7971 {
7972 UNHANDLED;
7973 }
7974 break;
7975
7976 case IA64_RS_ARb:
7977 if (note == 1)
7978 {
7979 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
7980 {
7981 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
7982 if ((regno >= 48 && regno <= 63)
7983 || (regno >= 112 && regno <= 127))
7984 {
7985 specs[count] = tmpl;
7986 specs[count++].index = regno;
7987 }
7988 }
7989 }
7990 else if (note == 0)
7991 {
7992 for (i = 48; i < 64; i++)
7993 {
7994 specs[count] = tmpl;
7995 specs[count++].index = i;
7996 }
7997 for (i = 112; i < 128; i++)
7998 {
7999 specs[count] = tmpl;
8000 specs[count++].index = i;
8001 }
8002 }
8003 else
8004 {
8005 UNHANDLED;
8006 }
8007 break;
8008
8009 case IA64_RS_BR:
8010 if (note != 1)
8011 {
8012 UNHANDLED;
8013 }
8014 else
8015 {
8016 if (rsrc_write)
8017 {
8018 for (i = 0; i < idesc->num_outputs; i++)
8019 if (idesc->operands[i] == IA64_OPND_B1
8020 || idesc->operands[i] == IA64_OPND_B2)
8021 {
8022 specs[count] = tmpl;
8023 specs[count++].index =
8024 CURR_SLOT.opnd[i].X_add_number - REG_BR;
8025 }
8026 }
8027 else
8028 {
8029 for (i = idesc->num_outputs; i < NELEMS (idesc->operands); i++)
8030 if (idesc->operands[i] == IA64_OPND_B1
8031 || idesc->operands[i] == IA64_OPND_B2)
8032 {
8033 specs[count] = tmpl;
8034 specs[count++].index =
8035 CURR_SLOT.opnd[i].X_add_number - REG_BR;
8036 }
8037 }
8038 }
8039 break;
8040
8041 case IA64_RS_CPUID: /* four or more registers */
8042 if (note == 3)
8043 {
8044 if (idesc->operands[!rsrc_write] == IA64_OPND_CPUID_R3)
8045 {
8046 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
8047 if (regno >= 0 && regno < NELEMS (gr_values)
8048 && KNOWN (regno))
8049 {
8050 specs[count] = tmpl;
8051 specs[count++].index = gr_values[regno].value & 0xFF;
8052 }
8053 else
8054 {
8055 specs[count] = tmpl;
8056 specs[count++].specific = 0;
8057 }
8058 }
8059 }
8060 else
8061 {
8062 UNHANDLED;
8063 }
8064 break;
8065
8066 case IA64_RS_DBR: /* four or more registers */
8067 if (note == 3)
8068 {
8069 if (idesc->operands[!rsrc_write] == IA64_OPND_DBR_R3)
8070 {
8071 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
8072 if (regno >= 0 && regno < NELEMS (gr_values)
8073 && KNOWN (regno))
8074 {
8075 specs[count] = tmpl;
8076 specs[count++].index = gr_values[regno].value & 0xFF;
8077 }
8078 else
8079 {
8080 specs[count] = tmpl;
8081 specs[count++].specific = 0;
8082 }
8083 }
8084 }
8085 else if (note == 0 && !rsrc_write)
8086 {
8087 specs[count] = tmpl;
8088 specs[count++].specific = 0;
8089 }
8090 else
8091 {
8092 UNHANDLED;
8093 }
8094 break;
8095
8096 case IA64_RS_IBR: /* four or more registers */
8097 if (note == 3)
8098 {
8099 if (idesc->operands[!rsrc_write] == IA64_OPND_IBR_R3)
8100 {
8101 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
8102 if (regno >= 0 && regno < NELEMS (gr_values)
8103 && KNOWN (regno))
8104 {
8105 specs[count] = tmpl;
8106 specs[count++].index = gr_values[regno].value & 0xFF;
8107 }
8108 else
8109 {
8110 specs[count] = tmpl;
8111 specs[count++].specific = 0;
8112 }
8113 }
8114 }
8115 else
8116 {
8117 UNHANDLED;
8118 }
8119 break;
8120
8121 case IA64_RS_MSR:
8122 if (note == 5)
8123 {
8124 /* These are implementation specific. Force all references to
8125 conflict with all other references. */
8126 specs[count] = tmpl;
8127 specs[count++].specific = 0;
8128 }
8129 else
8130 {
8131 UNHANDLED;
8132 }
8133 break;
8134
8135 case IA64_RS_PKR: /* 16 or more registers */
8136 if (note == 3 || note == 4)
8137 {
8138 if (idesc->operands[!rsrc_write] == IA64_OPND_PKR_R3)
8139 {
8140 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
8141 if (regno >= 0 && regno < NELEMS (gr_values)
8142 && KNOWN (regno))
8143 {
8144 if (note == 3)
8145 {
8146 specs[count] = tmpl;
8147 specs[count++].index = gr_values[regno].value & 0xFF;
8148 }
8149 else
8150 for (i = 0; i < NELEMS (gr_values); i++)
8151 {
8152 /* Uses all registers *except* the one in R3. */
8153 if ((unsigned)i != (gr_values[regno].value & 0xFF))
8154 {
8155 specs[count] = tmpl;
8156 specs[count++].index = i;
8157 }
8158 }
8159 }
8160 else
8161 {
8162 specs[count] = tmpl;
8163 specs[count++].specific = 0;
8164 }
8165 }
8166 }
8167 else if (note == 0)
8168 {
8169 /* probe et al. */
8170 specs[count] = tmpl;
8171 specs[count++].specific = 0;
8172 }
8173 break;
8174
8175 case IA64_RS_PMC: /* four or more registers */
8176 if (note == 3)
8177 {
8178 if (idesc->operands[!rsrc_write] == IA64_OPND_PMC_R3
8179 || (!rsrc_write && idesc->operands[1] == IA64_OPND_PMD_R3))
8180
8181 {
8182 int index = ((idesc->operands[1] == IA64_OPND_R3 && !rsrc_write)
8183 ? 1 : !rsrc_write);
8184 int regno = CURR_SLOT.opnd[index].X_add_number - REG_GR;
8185 if (regno >= 0 && regno < NELEMS (gr_values)
8186 && KNOWN (regno))
8187 {
8188 specs[count] = tmpl;
8189 specs[count++].index = gr_values[regno].value & 0xFF;
8190 }
8191 else
8192 {
8193 specs[count] = tmpl;
8194 specs[count++].specific = 0;
8195 }
8196 }
8197 }
8198 else
8199 {
8200 UNHANDLED;
8201 }
8202 break;
8203
8204 case IA64_RS_PMD: /* four or more registers */
8205 if (note == 3)
8206 {
8207 if (idesc->operands[!rsrc_write] == IA64_OPND_PMD_R3)
8208 {
8209 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
8210 if (regno >= 0 && regno < NELEMS (gr_values)
8211 && KNOWN (regno))
8212 {
8213 specs[count] = tmpl;
8214 specs[count++].index = gr_values[regno].value & 0xFF;
8215 }
8216 else
8217 {
8218 specs[count] = tmpl;
8219 specs[count++].specific = 0;
8220 }
8221 }
8222 }
8223 else
8224 {
8225 UNHANDLED;
8226 }
8227 break;
8228
8229 case IA64_RS_RR: /* eight registers */
8230 if (note == 6)
8231 {
8232 if (idesc->operands[!rsrc_write] == IA64_OPND_RR_R3)
8233 {
8234 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_GR;
8235 if (regno >= 0 && regno < NELEMS (gr_values)
8236 && KNOWN (regno))
8237 {
8238 specs[count] = tmpl;
8239 specs[count++].index = (gr_values[regno].value >> 61) & 0x7;
8240 }
8241 else
8242 {
8243 specs[count] = tmpl;
8244 specs[count++].specific = 0;
8245 }
8246 }
8247 }
8248 else if (note == 0 && !rsrc_write)
8249 {
8250 specs[count] = tmpl;
8251 specs[count++].specific = 0;
8252 }
8253 else
8254 {
8255 UNHANDLED;
8256 }
8257 break;
8258
8259 case IA64_RS_CR_IRR:
8260 if (note == 0)
8261 {
8262 /* handle mov-from-CR-IVR; it's a read that writes CR[IRR] */
8263 int regno = CURR_SLOT.opnd[1].X_add_number - REG_CR;
8264 if (rsrc_write
8265 && idesc->operands[1] == IA64_OPND_CR3
8266 && regno == CR_IVR)
8267 {
8268 for (i = 0; i < 4; i++)
8269 {
8270 specs[count] = tmpl;
8271 specs[count++].index = CR_IRR0 + i;
8272 }
8273 }
8274 }
8275 else if (note == 1)
8276 {
8277 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
8278 if (idesc->operands[!rsrc_write] == IA64_OPND_CR3
8279 && regno >= CR_IRR0
8280 && regno <= CR_IRR3)
8281 {
8282 specs[count] = tmpl;
8283 specs[count++].index = regno;
8284 }
8285 }
8286 else
8287 {
8288 UNHANDLED;
8289 }
8290 break;
8291
8292 case IA64_RS_CR_LRR:
8293 if (note != 1)
8294 {
8295 UNHANDLED;
8296 }
8297 else
8298 {
8299 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
8300 if (idesc->operands[!rsrc_write] == IA64_OPND_CR3
8301 && (regno == CR_LRR0 || regno == CR_LRR1))
8302 {
8303 specs[count] = tmpl;
8304 specs[count++].index = regno;
8305 }
8306 }
8307 break;
8308
8309 case IA64_RS_CR:
8310 if (note == 1)
8311 {
8312 if (idesc->operands[!rsrc_write] == IA64_OPND_CR3)
8313 {
8314 specs[count] = tmpl;
8315 specs[count++].index =
8316 CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
8317 }
8318 }
8319 else
8320 {
8321 UNHANDLED;
8322 }
8323 break;
8324
8325 case IA64_RS_FR:
8326 case IA64_RS_FRb:
8327 if (note != 1)
8328 {
8329 UNHANDLED;
8330 }
8331 else if (rsrc_write)
8332 {
8333 if (dep->specifier == IA64_RS_FRb
8334 && idesc->operands[0] == IA64_OPND_F1)
8335 {
8336 specs[count] = tmpl;
8337 specs[count++].index = CURR_SLOT.opnd[0].X_add_number - REG_FR;
8338 }
8339 }
8340 else
8341 {
8342 for (i = idesc->num_outputs; i < NELEMS (idesc->operands); i++)
8343 {
8344 if (idesc->operands[i] == IA64_OPND_F2
8345 || idesc->operands[i] == IA64_OPND_F3
8346 || idesc->operands[i] == IA64_OPND_F4)
8347 {
8348 specs[count] = tmpl;
8349 specs[count++].index =
8350 CURR_SLOT.opnd[i].X_add_number - REG_FR;
8351 }
8352 }
8353 }
8354 break;
8355
8356 case IA64_RS_GR:
8357 if (note == 13)
8358 {
8359 /* This reference applies only to the GR whose value is loaded with
8360 data returned from memory. */
8361 specs[count] = tmpl;
8362 specs[count++].index = CURR_SLOT.opnd[0].X_add_number - REG_GR;
8363 }
8364 else if (note == 1)
8365 {
8366 if (rsrc_write)
8367 {
8368 for (i = 0; i < idesc->num_outputs; i++)
8369 if (idesc->operands[i] == IA64_OPND_R1
8370 || idesc->operands[i] == IA64_OPND_R2
8371 || idesc->operands[i] == IA64_OPND_R3)
8372 {
8373 specs[count] = tmpl;
8374 specs[count++].index =
8375 CURR_SLOT.opnd[i].X_add_number - REG_GR;
8376 }
8377 if (idesc->flags & IA64_OPCODE_POSTINC)
8378 for (i = 0; i < NELEMS (idesc->operands); i++)
8379 if (idesc->operands[i] == IA64_OPND_MR3)
8380 {
8381 specs[count] = tmpl;
8382 specs[count++].index =
8383 CURR_SLOT.opnd[i].X_add_number - REG_GR;
8384 }
8385 }
8386 else
8387 {
8388 /* Look for anything that reads a GR. */
8389 for (i = 0; i < NELEMS (idesc->operands); i++)
8390 {
8391 if (idesc->operands[i] == IA64_OPND_MR3
8392 || idesc->operands[i] == IA64_OPND_CPUID_R3
8393 || idesc->operands[i] == IA64_OPND_DBR_R3
8394 || idesc->operands[i] == IA64_OPND_IBR_R3
8395 || idesc->operands[i] == IA64_OPND_MSR_R3
8396 || idesc->operands[i] == IA64_OPND_PKR_R3
8397 || idesc->operands[i] == IA64_OPND_PMC_R3
8398 || idesc->operands[i] == IA64_OPND_PMD_R3
8399 || idesc->operands[i] == IA64_OPND_RR_R3
8400 || ((i >= idesc->num_outputs)
8401 && (idesc->operands[i] == IA64_OPND_R1
8402 || idesc->operands[i] == IA64_OPND_R2
8403 || idesc->operands[i] == IA64_OPND_R3
8404 /* addl source register. */
8405 || idesc->operands[i] == IA64_OPND_R3_2)))
8406 {
8407 specs[count] = tmpl;
8408 specs[count++].index =
8409 CURR_SLOT.opnd[i].X_add_number - REG_GR;
8410 }
8411 }
8412 }
8413 }
8414 else
8415 {
8416 UNHANDLED;
8417 }
8418 break;
8419
8420 /* This is the same as IA64_RS_PRr, except that the register range is
8421 from 1 - 15, and there are no rotating register reads/writes here. */
8422 case IA64_RS_PR:
8423 if (note == 0)
8424 {
8425 for (i = 1; i < 16; i++)
8426 {
8427 specs[count] = tmpl;
8428 specs[count++].index = i;
8429 }
8430 }
8431 else if (note == 7)
8432 {
8433 valueT mask = 0;
8434 /* Mark only those registers indicated by the mask. */
8435 if (rsrc_write)
8436 {
8437 mask = CURR_SLOT.opnd[2].X_add_number;
8438 for (i = 1; i < 16; i++)
8439 if (mask & ((valueT) 1 << i))
8440 {
8441 specs[count] = tmpl;
8442 specs[count++].index = i;
8443 }
8444 }
8445 else
8446 {
8447 UNHANDLED;
8448 }
8449 }
8450 else if (note == 11) /* note 11 implies note 1 as well */
8451 {
8452 if (rsrc_write)
8453 {
8454 for (i = 0; i < idesc->num_outputs; i++)
8455 {
8456 if (idesc->operands[i] == IA64_OPND_P1
8457 || idesc->operands[i] == IA64_OPND_P2)
8458 {
8459 int regno = CURR_SLOT.opnd[i].X_add_number - REG_P;
8460 if (regno >= 1 && regno < 16)
8461 {
8462 specs[count] = tmpl;
8463 specs[count++].index = regno;
8464 }
8465 }
8466 }
8467 }
8468 else
8469 {
8470 UNHANDLED;
8471 }
8472 }
8473 else if (note == 12)
8474 {
8475 if (CURR_SLOT.qp_regno >= 1 && CURR_SLOT.qp_regno < 16)
8476 {
8477 specs[count] = tmpl;
8478 specs[count++].index = CURR_SLOT.qp_regno;
8479 }
8480 }
8481 else if (note == 1)
8482 {
8483 if (rsrc_write)
8484 {
8485 int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
8486 int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
8487 int or_andcm = strstr (idesc->name, "or.andcm") != NULL;
8488 int and_orcm = strstr (idesc->name, "and.orcm") != NULL;
8489
8490 if ((idesc->operands[0] == IA64_OPND_P1
8491 || idesc->operands[0] == IA64_OPND_P2)
8492 && p1 >= 1 && p1 < 16)
8493 {
8494 specs[count] = tmpl;
8495 specs[count].cmp_type =
8496 (or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
8497 specs[count++].index = p1;
8498 }
8499 if ((idesc->operands[1] == IA64_OPND_P1
8500 || idesc->operands[1] == IA64_OPND_P2)
8501 && p2 >= 1 && p2 < 16)
8502 {
8503 specs[count] = tmpl;
8504 specs[count].cmp_type =
8505 (or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
8506 specs[count++].index = p2;
8507 }
8508 }
8509 else
8510 {
8511 if (CURR_SLOT.qp_regno >= 1 && CURR_SLOT.qp_regno < 16)
8512 {
8513 specs[count] = tmpl;
8514 specs[count++].index = CURR_SLOT.qp_regno;
8515 }
8516 if (idesc->operands[1] == IA64_OPND_PR)
8517 {
8518 for (i = 1; i < 16; i++)
8519 {
8520 specs[count] = tmpl;
8521 specs[count++].index = i;
8522 }
8523 }
8524 }
8525 }
8526 else
8527 {
8528 UNHANDLED;
8529 }
8530 break;
8531
8532 /* This is the general case for PRs. IA64_RS_PR and IA64_RS_PR63 are
8533 simplified cases of this. */
8534 case IA64_RS_PRr:
8535 if (note == 0)
8536 {
8537 for (i = 16; i < 63; i++)
8538 {
8539 specs[count] = tmpl;
8540 specs[count++].index = i;
8541 }
8542 }
8543 else if (note == 7)
8544 {
8545 valueT mask = 0;
8546 /* Mark only those registers indicated by the mask. */
8547 if (rsrc_write
8548 && idesc->operands[0] == IA64_OPND_PR)
8549 {
8550 mask = CURR_SLOT.opnd[2].X_add_number;
8551 if (mask & ((valueT) 1 << 16))
8552 for (i = 16; i < 63; i++)
8553 {
8554 specs[count] = tmpl;
8555 specs[count++].index = i;
8556 }
8557 }
8558 else if (rsrc_write
8559 && idesc->operands[0] == IA64_OPND_PR_ROT)
8560 {
8561 for (i = 16; i < 63; i++)
8562 {
8563 specs[count] = tmpl;
8564 specs[count++].index = i;
8565 }
8566 }
8567 else
8568 {
8569 UNHANDLED;
8570 }
8571 }
8572 else if (note == 11) /* note 11 implies note 1 as well */
8573 {
8574 if (rsrc_write)
8575 {
8576 for (i = 0; i < idesc->num_outputs; i++)
8577 {
8578 if (idesc->operands[i] == IA64_OPND_P1
8579 || idesc->operands[i] == IA64_OPND_P2)
8580 {
8581 int regno = CURR_SLOT.opnd[i].X_add_number - REG_P;
8582 if (regno >= 16 && regno < 63)
8583 {
8584 specs[count] = tmpl;
8585 specs[count++].index = regno;
8586 }
8587 }
8588 }
8589 }
8590 else
8591 {
8592 UNHANDLED;
8593 }
8594 }
8595 else if (note == 12)
8596 {
8597 if (CURR_SLOT.qp_regno >= 16 && CURR_SLOT.qp_regno < 63)
8598 {
8599 specs[count] = tmpl;
8600 specs[count++].index = CURR_SLOT.qp_regno;
8601 }
8602 }
8603 else if (note == 1)
8604 {
8605 if (rsrc_write)
8606 {
8607 int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
8608 int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
8609 int or_andcm = strstr (idesc->name, "or.andcm") != NULL;
8610 int and_orcm = strstr (idesc->name, "and.orcm") != NULL;
8611
8612 if ((idesc->operands[0] == IA64_OPND_P1
8613 || idesc->operands[0] == IA64_OPND_P2)
8614 && p1 >= 16 && p1 < 63)
8615 {
8616 specs[count] = tmpl;
8617 specs[count].cmp_type =
8618 (or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
8619 specs[count++].index = p1;
8620 }
8621 if ((idesc->operands[1] == IA64_OPND_P1
8622 || idesc->operands[1] == IA64_OPND_P2)
8623 && p2 >= 16 && p2 < 63)
8624 {
8625 specs[count] = tmpl;
8626 specs[count].cmp_type =
8627 (or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
8628 specs[count++].index = p2;
8629 }
8630 }
8631 else
8632 {
8633 if (CURR_SLOT.qp_regno >= 16 && CURR_SLOT.qp_regno < 63)
8634 {
8635 specs[count] = tmpl;
8636 specs[count++].index = CURR_SLOT.qp_regno;
8637 }
8638 if (idesc->operands[1] == IA64_OPND_PR)
8639 {
8640 for (i = 16; i < 63; i++)
8641 {
8642 specs[count] = tmpl;
8643 specs[count++].index = i;
8644 }
8645 }
8646 }
8647 }
8648 else
8649 {
8650 UNHANDLED;
8651 }
8652 break;
8653
8654 case IA64_RS_PSR:
8655 /* Verify that the instruction is using the PSR bit indicated in
8656 dep->regindex. */
8657 if (note == 0)
8658 {
8659 if (idesc->operands[!rsrc_write] == IA64_OPND_PSR_UM)
8660 {
8661 if (dep->regindex < 6)
8662 {
8663 specs[count++] = tmpl;
8664 }
8665 }
8666 else if (idesc->operands[!rsrc_write] == IA64_OPND_PSR)
8667 {
8668 if (dep->regindex < 32
8669 || dep->regindex == 35
8670 || dep->regindex == 36
8671 || (!rsrc_write && dep->regindex == PSR_CPL))
8672 {
8673 specs[count++] = tmpl;
8674 }
8675 }
8676 else if (idesc->operands[!rsrc_write] == IA64_OPND_PSR_L)
8677 {
8678 if (dep->regindex < 32
8679 || dep->regindex == 35
8680 || dep->regindex == 36
8681 || (rsrc_write && dep->regindex == PSR_CPL))
8682 {
8683 specs[count++] = tmpl;
8684 }
8685 }
8686 else
8687 {
8688 /* Several PSR bits have very specific dependencies. */
8689 switch (dep->regindex)
8690 {
8691 default:
8692 specs[count++] = tmpl;
8693 break;
8694 case PSR_IC:
8695 if (rsrc_write)
8696 {
8697 specs[count++] = tmpl;
8698 }
8699 else
8700 {
8701 /* Only certain CR accesses use PSR.ic */
8702 if (idesc->operands[0] == IA64_OPND_CR3
8703 || idesc->operands[1] == IA64_OPND_CR3)
8704 {
8705 int index =
8706 ((idesc->operands[0] == IA64_OPND_CR3)
8707 ? 0 : 1);
8708 int regno =
8709 CURR_SLOT.opnd[index].X_add_number - REG_CR;
8710
8711 switch (regno)
8712 {
8713 default:
8714 break;
8715 case CR_ITIR:
8716 case CR_IFS:
8717 case CR_IIM:
8718 case CR_IIP:
8719 case CR_IPSR:
8720 case CR_ISR:
8721 case CR_IFA:
8722 case CR_IHA:
8723 case CR_IIPA:
8724 specs[count++] = tmpl;
8725 break;
8726 }
8727 }
8728 }
8729 break;
8730 case PSR_CPL:
8731 if (rsrc_write)
8732 {
8733 specs[count++] = tmpl;
8734 }
8735 else
8736 {
8737 /* Only some AR accesses use cpl */
8738 if (idesc->operands[0] == IA64_OPND_AR3
8739 || idesc->operands[1] == IA64_OPND_AR3)
8740 {
8741 int index =
8742 ((idesc->operands[0] == IA64_OPND_AR3)
8743 ? 0 : 1);
8744 int regno =
8745 CURR_SLOT.opnd[index].X_add_number - REG_AR;
8746
8747 if (regno == AR_ITC
8748 || (index == 0
8749 && (regno == AR_ITC
8750 || regno == AR_RSC
8751 || (regno >= AR_K0
8752 && regno <= AR_K7))))
8753 {
8754 specs[count++] = tmpl;
8755 }
8756 }
8757 else
8758 {
8759 specs[count++] = tmpl;
8760 }
8761 break;
8762 }
8763 }
8764 }
8765 }
8766 else if (note == 7)
8767 {
8768 valueT mask = 0;
8769 if (idesc->operands[0] == IA64_OPND_IMMU24)
8770 {
8771 mask = CURR_SLOT.opnd[0].X_add_number;
8772 }
8773 else
8774 {
8775 UNHANDLED;
8776 }
8777 if (mask & ((valueT) 1 << dep->regindex))
8778 {
8779 specs[count++] = tmpl;
8780 }
8781 }
8782 else if (note == 8)
8783 {
8784 int min = dep->regindex == PSR_DFL ? 2 : 32;
8785 int max = dep->regindex == PSR_DFL ? 31 : 127;
8786 /* dfh is read on FR32-127; dfl is read on FR2-31 */
8787 for (i = 0; i < NELEMS (idesc->operands); i++)
8788 {
8789 if (idesc->operands[i] == IA64_OPND_F1
8790 || idesc->operands[i] == IA64_OPND_F2
8791 || idesc->operands[i] == IA64_OPND_F3
8792 || idesc->operands[i] == IA64_OPND_F4)
8793 {
8794 int reg = CURR_SLOT.opnd[i].X_add_number - REG_FR;
8795 if (reg >= min && reg <= max)
8796 {
8797 specs[count++] = tmpl;
8798 }
8799 }
8800 }
8801 }
8802 else if (note == 9)
8803 {
8804 int min = dep->regindex == PSR_MFL ? 2 : 32;
8805 int max = dep->regindex == PSR_MFL ? 31 : 127;
8806 /* mfh is read on writes to FR32-127; mfl is read on writes to
8807 FR2-31 */
8808 for (i = 0; i < idesc->num_outputs; i++)
8809 {
8810 if (idesc->operands[i] == IA64_OPND_F1)
8811 {
8812 int reg = CURR_SLOT.opnd[i].X_add_number - REG_FR;
8813 if (reg >= min && reg <= max)
8814 {
8815 specs[count++] = tmpl;
8816 }
8817 }
8818 }
8819 }
8820 else if (note == 10)
8821 {
8822 for (i = 0; i < NELEMS (idesc->operands); i++)
8823 {
8824 if (idesc->operands[i] == IA64_OPND_R1
8825 || idesc->operands[i] == IA64_OPND_R2
8826 || idesc->operands[i] == IA64_OPND_R3)
8827 {
8828 int regno = CURR_SLOT.opnd[i].X_add_number - REG_GR;
8829 if (regno >= 16 && regno <= 31)
8830 {
8831 specs[count++] = tmpl;
8832 }
8833 }
8834 }
8835 }
8836 else
8837 {
8838 UNHANDLED;
8839 }
8840 break;
8841
8842 case IA64_RS_AR_FPSR:
8843 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3)
8844 {
8845 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
8846 if (regno == AR_FPSR)
8847 {
8848 specs[count++] = tmpl;
8849 }
8850 }
8851 else
8852 {
8853 specs[count++] = tmpl;
8854 }
8855 break;
8856
8857 case IA64_RS_ARX:
8858 /* Handle all AR[REG] resources */
8859 if (note == 0 || note == 1)
8860 {
8861 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_AR;
8862 if (idesc->operands[!rsrc_write] == IA64_OPND_AR3
8863 && regno == dep->regindex)
8864 {
8865 specs[count++] = tmpl;
8866 }
8867 /* other AR[REG] resources may be affected by AR accesses */
8868 else if (idesc->operands[0] == IA64_OPND_AR3)
8869 {
8870 /* AR[] writes */
8871 regno = CURR_SLOT.opnd[0].X_add_number - REG_AR;
8872 switch (dep->regindex)
8873 {
8874 default:
8875 break;
8876 case AR_BSP:
8877 case AR_RNAT:
8878 if (regno == AR_BSPSTORE)
8879 {
8880 specs[count++] = tmpl;
8881 }
8882 case AR_RSC:
8883 if (!rsrc_write &&
8884 (regno == AR_BSPSTORE
8885 || regno == AR_RNAT))
8886 {
8887 specs[count++] = tmpl;
8888 }
8889 break;
8890 }
8891 }
8892 else if (idesc->operands[1] == IA64_OPND_AR3)
8893 {
8894 /* AR[] reads */
8895 regno = CURR_SLOT.opnd[1].X_add_number - REG_AR;
8896 switch (dep->regindex)
8897 {
8898 default:
8899 break;
8900 case AR_RSC:
8901 if (regno == AR_BSPSTORE || regno == AR_RNAT)
8902 {
8903 specs[count++] = tmpl;
8904 }
8905 break;
8906 }
8907 }
8908 else
8909 {
8910 specs[count++] = tmpl;
8911 }
8912 }
8913 else
8914 {
8915 UNHANDLED;
8916 }
8917 break;
8918
8919 case IA64_RS_CRX:
8920 /* Handle all CR[REG] resources */
8921 if (note == 0 || note == 1)
8922 {
8923 if (idesc->operands[!rsrc_write] == IA64_OPND_CR3)
8924 {
8925 int regno = CURR_SLOT.opnd[!rsrc_write].X_add_number - REG_CR;
8926 if (regno == dep->regindex)
8927 {
8928 specs[count++] = tmpl;
8929 }
8930 else if (!rsrc_write)
8931 {
8932 /* Reads from CR[IVR] affect other resources. */
8933 if (regno == CR_IVR)
8934 {
8935 if ((dep->regindex >= CR_IRR0
8936 && dep->regindex <= CR_IRR3)
8937 || dep->regindex == CR_TPR)
8938 {
8939 specs[count++] = tmpl;
8940 }
8941 }
8942 }
8943 }
8944 else
8945 {
8946 specs[count++] = tmpl;
8947 }
8948 }
8949 else
8950 {
8951 UNHANDLED;
8952 }
8953 break;
8954
8955 case IA64_RS_INSERVICE:
8956 /* look for write of EOI (67) or read of IVR (65) */
8957 if ((idesc->operands[0] == IA64_OPND_CR3
8958 && CURR_SLOT.opnd[0].X_add_number - REG_CR == CR_EOI)
8959 || (idesc->operands[1] == IA64_OPND_CR3
8960 && CURR_SLOT.opnd[1].X_add_number - REG_CR == CR_IVR))
8961 {
8962 specs[count++] = tmpl;
8963 }
8964 break;
8965
8966 case IA64_RS_GR0:
8967 if (note == 1)
8968 {
8969 specs[count++] = tmpl;
8970 }
8971 else
8972 {
8973 UNHANDLED;
8974 }
8975 break;
8976
8977 case IA64_RS_CFM:
8978 if (note != 2)
8979 {
8980 specs[count++] = tmpl;
8981 }
8982 else
8983 {
8984 /* Check if any of the registers accessed are in the rotating region.
8985 mov to/from pr accesses CFM only when qp_regno is in the rotating
8986 region */
8987 for (i = 0; i < NELEMS (idesc->operands); i++)
8988 {
8989 if (idesc->operands[i] == IA64_OPND_R1
8990 || idesc->operands[i] == IA64_OPND_R2
8991 || idesc->operands[i] == IA64_OPND_R3)
8992 {
8993 int num = CURR_SLOT.opnd[i].X_add_number - REG_GR;
8994 /* Assumes that md.rot.num_regs is always valid */
8995 if (md.rot.num_regs > 0
8996 && num > 31
8997 && num < 31 + md.rot.num_regs)
8998 {
8999 specs[count] = tmpl;
9000 specs[count++].specific = 0;
9001 }
9002 }
9003 else if (idesc->operands[i] == IA64_OPND_F1
9004 || idesc->operands[i] == IA64_OPND_F2
9005 || idesc->operands[i] == IA64_OPND_F3
9006 || idesc->operands[i] == IA64_OPND_F4)
9007 {
9008 int num = CURR_SLOT.opnd[i].X_add_number - REG_FR;
9009 if (num > 31)
9010 {
9011 specs[count] = tmpl;
9012 specs[count++].specific = 0;
9013 }
9014 }
9015 else if (idesc->operands[i] == IA64_OPND_P1
9016 || idesc->operands[i] == IA64_OPND_P2)
9017 {
9018 int num = CURR_SLOT.opnd[i].X_add_number - REG_P;
9019 if (num > 15)
9020 {
9021 specs[count] = tmpl;
9022 specs[count++].specific = 0;
9023 }
9024 }
9025 }
9026 if (CURR_SLOT.qp_regno > 15)
9027 {
9028 specs[count] = tmpl;
9029 specs[count++].specific = 0;
9030 }
9031 }
9032 break;
9033
9034 /* This is the same as IA64_RS_PRr, except simplified to account for
9035 the fact that there is only one register. */
9036 case IA64_RS_PR63:
9037 if (note == 0)
9038 {
9039 specs[count++] = tmpl;
9040 }
9041 else if (note == 7)
9042 {
9043 valueT mask = 0;
9044 if (idesc->operands[2] == IA64_OPND_IMM17)
9045 mask = CURR_SLOT.opnd[2].X_add_number;
9046 if (mask & ((valueT) 1 << 63))
9047 specs[count++] = tmpl;
9048 }
9049 else if (note == 11)
9050 {
9051 if ((idesc->operands[0] == IA64_OPND_P1
9052 && CURR_SLOT.opnd[0].X_add_number - REG_P == 63)
9053 || (idesc->operands[1] == IA64_OPND_P2
9054 && CURR_SLOT.opnd[1].X_add_number - REG_P == 63))
9055 {
9056 specs[count++] = tmpl;
9057 }
9058 }
9059 else if (note == 12)
9060 {
9061 if (CURR_SLOT.qp_regno == 63)
9062 {
9063 specs[count++] = tmpl;
9064 }
9065 }
9066 else if (note == 1)
9067 {
9068 if (rsrc_write)
9069 {
9070 int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
9071 int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
9072 int or_andcm = strstr (idesc->name, "or.andcm") != NULL;
9073 int and_orcm = strstr (idesc->name, "and.orcm") != NULL;
9074
9075 if (p1 == 63
9076 && (idesc->operands[0] == IA64_OPND_P1
9077 || idesc->operands[0] == IA64_OPND_P2))
9078 {
9079 specs[count] = tmpl;
9080 specs[count++].cmp_type =
9081 (or_andcm ? CMP_OR : (and_orcm ? CMP_AND : CMP_NONE));
9082 }
9083 if (p2 == 63
9084 && (idesc->operands[1] == IA64_OPND_P1
9085 || idesc->operands[1] == IA64_OPND_P2))
9086 {
9087 specs[count] = tmpl;
9088 specs[count++].cmp_type =
9089 (or_andcm ? CMP_AND : (and_orcm ? CMP_OR : CMP_NONE));
9090 }
9091 }
9092 else
9093 {
9094 if (CURR_SLOT.qp_regno == 63)
9095 {
9096 specs[count++] = tmpl;
9097 }
9098 }
9099 }
9100 else
9101 {
9102 UNHANDLED;
9103 }
9104 break;
9105
9106 case IA64_RS_RSE:
9107 /* FIXME we can identify some individual RSE written resources, but RSE
9108 read resources have not yet been completely identified, so for now
9109 treat RSE as a single resource */
9110 if (strncmp (idesc->name, "mov", 3) == 0)
9111 {
9112 if (rsrc_write)
9113 {
9114 if (idesc->operands[0] == IA64_OPND_AR3
9115 && CURR_SLOT.opnd[0].X_add_number - REG_AR == AR_BSPSTORE)
9116 {
9117 specs[count] = tmpl;
9118 specs[count++].index = 0; /* IA64_RSE_BSPLOAD/RNATBITINDEX */
9119 }
9120 }
9121 else
9122 {
9123 if (idesc->operands[0] == IA64_OPND_AR3)
9124 {
9125 if (CURR_SLOT.opnd[0].X_add_number - REG_AR == AR_BSPSTORE
9126 || CURR_SLOT.opnd[0].X_add_number - REG_AR == AR_RNAT)
9127 {
9128 specs[count++] = tmpl;
9129 }
9130 }
9131 else if (idesc->operands[1] == IA64_OPND_AR3)
9132 {
9133 if (CURR_SLOT.opnd[1].X_add_number - REG_AR == AR_BSP
9134 || CURR_SLOT.opnd[1].X_add_number - REG_AR == AR_BSPSTORE
9135 || CURR_SLOT.opnd[1].X_add_number - REG_AR == AR_RNAT)
9136 {
9137 specs[count++] = tmpl;
9138 }
9139 }
9140 }
9141 }
9142 else
9143 {
9144 specs[count++] = tmpl;
9145 }
9146 break;
9147
9148 case IA64_RS_ANY:
9149 /* FIXME -- do any of these need to be non-specific? */
9150 specs[count++] = tmpl;
9151 break;
9152
9153 default:
9154 as_bad (_("Unrecognized dependency specifier %d\n"), dep->specifier);
9155 break;
9156 }
9157
9158 return count;
9159 }
9160
9161 /* Clear branch flags on marked resources. This breaks the link between the
9162 QP of the marking instruction and a subsequent branch on the same QP. */
9163
9164 static void
9165 clear_qp_branch_flag (mask)
9166 valueT mask;
9167 {
9168 int i;
9169 for (i = 0; i < regdepslen; i++)
9170 {
9171 valueT bit = ((valueT) 1 << regdeps[i].qp_regno);
9172 if ((bit & mask) != 0)
9173 {
9174 regdeps[i].link_to_qp_branch = 0;
9175 }
9176 }
9177 }
9178
9179 /* MASK contains 2 and only 2 PRs which are mutually exclusive. Remove
9180 any mutexes which contain one of the PRs and create new ones when
9181 needed. */
9182
9183 static int
9184 update_qp_mutex (valueT mask)
9185 {
9186 int i;
9187 int add = 0;
9188
9189 i = 0;
9190 while (i < qp_mutexeslen)
9191 {
9192 if ((qp_mutexes[i].prmask & mask) != 0)
9193 {
9194 /* If it destroys and creates the same mutex, do nothing. */
9195 if (qp_mutexes[i].prmask == mask
9196 && qp_mutexes[i].path == md.path)
9197 {
9198 i++;
9199 add = -1;
9200 }
9201 else
9202 {
9203 int keep = 0;
9204
9205 if (md.debug_dv)
9206 {
9207 fprintf (stderr, " Clearing mutex relation");
9208 print_prmask (qp_mutexes[i].prmask);
9209 fprintf (stderr, "\n");
9210 }
9211
9212 /* Deal with the old mutex with more than 3+ PRs only if
9213 the new mutex on the same execution path with it.
9214
9215 FIXME: The 3+ mutex support is incomplete.
9216 dot_pred_rel () may be a better place to fix it. */
9217 if (qp_mutexes[i].path == md.path)
9218 {
9219 /* If it is a proper subset of the mutex, create a
9220 new mutex. */
9221 if (add == 0
9222 && (qp_mutexes[i].prmask & mask) == mask)
9223 add = 1;
9224
9225 qp_mutexes[i].prmask &= ~mask;
9226 if (qp_mutexes[i].prmask & (qp_mutexes[i].prmask - 1))
9227 {
9228 /* Modify the mutex if there are more than one
9229 PR left. */
9230 keep = 1;
9231 i++;
9232 }
9233 }
9234
9235 if (keep == 0)
9236 /* Remove the mutex. */
9237 qp_mutexes[i] = qp_mutexes[--qp_mutexeslen];
9238 }
9239 }
9240 else
9241 ++i;
9242 }
9243
9244 if (add == 1)
9245 add_qp_mutex (mask);
9246
9247 return add;
9248 }
9249
9250 /* Remove any mutexes which contain any of the PRs indicated in the mask.
9251
9252 Any changes to a PR clears the mutex relations which include that PR. */
9253
9254 static void
9255 clear_qp_mutex (mask)
9256 valueT mask;
9257 {
9258 int i;
9259
9260 i = 0;
9261 while (i < qp_mutexeslen)
9262 {
9263 if ((qp_mutexes[i].prmask & mask) != 0)
9264 {
9265 if (md.debug_dv)
9266 {
9267 fprintf (stderr, " Clearing mutex relation");
9268 print_prmask (qp_mutexes[i].prmask);
9269 fprintf (stderr, "\n");
9270 }
9271 qp_mutexes[i] = qp_mutexes[--qp_mutexeslen];
9272 }
9273 else
9274 ++i;
9275 }
9276 }
9277
9278 /* Clear implies relations which contain PRs in the given masks.
9279 P1_MASK indicates the source of the implies relation, while P2_MASK
9280 indicates the implied PR. */
9281
9282 static void
9283 clear_qp_implies (p1_mask, p2_mask)
9284 valueT p1_mask;
9285 valueT p2_mask;
9286 {
9287 int i;
9288
9289 i = 0;
9290 while (i < qp_implieslen)
9291 {
9292 if ((((valueT) 1 << qp_implies[i].p1) & p1_mask) != 0
9293 || (((valueT) 1 << qp_implies[i].p2) & p2_mask) != 0)
9294 {
9295 if (md.debug_dv)
9296 fprintf (stderr, "Clearing implied relation PR%d->PR%d\n",
9297 qp_implies[i].p1, qp_implies[i].p2);
9298 qp_implies[i] = qp_implies[--qp_implieslen];
9299 }
9300 else
9301 ++i;
9302 }
9303 }
9304
9305 /* Add the PRs specified to the list of implied relations. */
9306
9307 static void
9308 add_qp_imply (p1, p2)
9309 int p1, p2;
9310 {
9311 valueT mask;
9312 valueT bit;
9313 int i;
9314
9315 /* p0 is not meaningful here. */
9316 if (p1 == 0 || p2 == 0)
9317 abort ();
9318
9319 if (p1 == p2)
9320 return;
9321
9322 /* If it exists already, ignore it. */
9323 for (i = 0; i < qp_implieslen; i++)
9324 {
9325 if (qp_implies[i].p1 == p1
9326 && qp_implies[i].p2 == p2
9327 && qp_implies[i].path == md.path
9328 && !qp_implies[i].p2_branched)
9329 return;
9330 }
9331
9332 if (qp_implieslen == qp_impliestotlen)
9333 {
9334 qp_impliestotlen += 20;
9335 qp_implies = (struct qp_imply *)
9336 xrealloc ((void *) qp_implies,
9337 qp_impliestotlen * sizeof (struct qp_imply));
9338 }
9339 if (md.debug_dv)
9340 fprintf (stderr, " Registering PR%d implies PR%d\n", p1, p2);
9341 qp_implies[qp_implieslen].p1 = p1;
9342 qp_implies[qp_implieslen].p2 = p2;
9343 qp_implies[qp_implieslen].path = md.path;
9344 qp_implies[qp_implieslen++].p2_branched = 0;
9345
9346 /* Add in the implied transitive relations; for everything that p2 implies,
9347 make p1 imply that, too; for everything that implies p1, make it imply p2
9348 as well. */
9349 for (i = 0; i < qp_implieslen; i++)
9350 {
9351 if (qp_implies[i].p1 == p2)
9352 add_qp_imply (p1, qp_implies[i].p2);
9353 if (qp_implies[i].p2 == p1)
9354 add_qp_imply (qp_implies[i].p1, p2);
9355 }
9356 /* Add in mutex relations implied by this implies relation; for each mutex
9357 relation containing p2, duplicate it and replace p2 with p1. */
9358 bit = (valueT) 1 << p1;
9359 mask = (valueT) 1 << p2;
9360 for (i = 0; i < qp_mutexeslen; i++)
9361 {
9362 if (qp_mutexes[i].prmask & mask)
9363 add_qp_mutex ((qp_mutexes[i].prmask & ~mask) | bit);
9364 }
9365 }
9366
9367 /* Add the PRs specified in the mask to the mutex list; this means that only
9368 one of the PRs can be true at any time. PR0 should never be included in
9369 the mask. */
9370
9371 static void
9372 add_qp_mutex (mask)
9373 valueT mask;
9374 {
9375 if (mask & 0x1)
9376 abort ();
9377
9378 if (qp_mutexeslen == qp_mutexestotlen)
9379 {
9380 qp_mutexestotlen += 20;
9381 qp_mutexes = (struct qpmutex *)
9382 xrealloc ((void *) qp_mutexes,
9383 qp_mutexestotlen * sizeof (struct qpmutex));
9384 }
9385 if (md.debug_dv)
9386 {
9387 fprintf (stderr, " Registering mutex on");
9388 print_prmask (mask);
9389 fprintf (stderr, "\n");
9390 }
9391 qp_mutexes[qp_mutexeslen].path = md.path;
9392 qp_mutexes[qp_mutexeslen++].prmask = mask;
9393 }
9394
9395 static int
9396 has_suffix_p (name, suffix)
9397 const char *name;
9398 const char *suffix;
9399 {
9400 size_t namelen = strlen (name);
9401 size_t sufflen = strlen (suffix);
9402
9403 if (namelen <= sufflen)
9404 return 0;
9405 return strcmp (name + namelen - sufflen, suffix) == 0;
9406 }
9407
9408 static void
9409 clear_register_values ()
9410 {
9411 int i;
9412 if (md.debug_dv)
9413 fprintf (stderr, " Clearing register values\n");
9414 for (i = 1; i < NELEMS (gr_values); i++)
9415 gr_values[i].known = 0;
9416 }
9417
9418 /* Keep track of register values/changes which affect DV tracking.
9419
9420 optimization note: should add a flag to classes of insns where otherwise we
9421 have to examine a group of strings to identify them. */
9422
9423 static void
9424 note_register_values (idesc)
9425 struct ia64_opcode *idesc;
9426 {
9427 valueT qp_changemask = 0;
9428 int i;
9429
9430 /* Invalidate values for registers being written to. */
9431 for (i = 0; i < idesc->num_outputs; i++)
9432 {
9433 if (idesc->operands[i] == IA64_OPND_R1
9434 || idesc->operands[i] == IA64_OPND_R2
9435 || idesc->operands[i] == IA64_OPND_R3)
9436 {
9437 int regno = CURR_SLOT.opnd[i].X_add_number - REG_GR;
9438 if (regno > 0 && regno < NELEMS (gr_values))
9439 gr_values[regno].known = 0;
9440 }
9441 else if (idesc->operands[i] == IA64_OPND_R3_2)
9442 {
9443 int regno = CURR_SLOT.opnd[i].X_add_number - REG_GR;
9444 if (regno > 0 && regno < 4)
9445 gr_values[regno].known = 0;
9446 }
9447 else if (idesc->operands[i] == IA64_OPND_P1
9448 || idesc->operands[i] == IA64_OPND_P2)
9449 {
9450 int regno = CURR_SLOT.opnd[i].X_add_number - REG_P;
9451 qp_changemask |= (valueT) 1 << regno;
9452 }
9453 else if (idesc->operands[i] == IA64_OPND_PR)
9454 {
9455 if (idesc->operands[2] & (valueT) 0x10000)
9456 qp_changemask = ~(valueT) 0x1FFFF | idesc->operands[2];
9457 else
9458 qp_changemask = idesc->operands[2];
9459 break;
9460 }
9461 else if (idesc->operands[i] == IA64_OPND_PR_ROT)
9462 {
9463 if (idesc->operands[1] & ((valueT) 1 << 43))
9464 qp_changemask = -((valueT) 1 << 44) | idesc->operands[1];
9465 else
9466 qp_changemask = idesc->operands[1];
9467 qp_changemask &= ~(valueT) 0xFFFF;
9468 break;
9469 }
9470 }
9471
9472 /* Always clear qp branch flags on any PR change. */
9473 /* FIXME there may be exceptions for certain compares. */
9474 clear_qp_branch_flag (qp_changemask);
9475
9476 /* Invalidate rotating registers on insns which affect RRBs in CFM. */
9477 if (idesc->flags & IA64_OPCODE_MOD_RRBS)
9478 {
9479 qp_changemask |= ~(valueT) 0xFFFF;
9480 if (strcmp (idesc->name, "clrrrb.pr") != 0)
9481 {
9482 for (i = 32; i < 32 + md.rot.num_regs; i++)
9483 gr_values[i].known = 0;
9484 }
9485 clear_qp_mutex (qp_changemask);
9486 clear_qp_implies (qp_changemask, qp_changemask);
9487 }
9488 /* After a call, all register values are undefined, except those marked
9489 as "safe". */
9490 else if (strncmp (idesc->name, "br.call", 6) == 0
9491 || strncmp (idesc->name, "brl.call", 7) == 0)
9492 {
9493 /* FIXME keep GR values which are marked as "safe_across_calls" */
9494 clear_register_values ();
9495 clear_qp_mutex (~qp_safe_across_calls);
9496 clear_qp_implies (~qp_safe_across_calls, ~qp_safe_across_calls);
9497 clear_qp_branch_flag (~qp_safe_across_calls);
9498 }
9499 else if (is_interruption_or_rfi (idesc)
9500 || is_taken_branch (idesc))
9501 {
9502 clear_register_values ();
9503 clear_qp_mutex (~(valueT) 0);
9504 clear_qp_implies (~(valueT) 0, ~(valueT) 0);
9505 }
9506 /* Look for mutex and implies relations. */
9507 else if ((idesc->operands[0] == IA64_OPND_P1
9508 || idesc->operands[0] == IA64_OPND_P2)
9509 && (idesc->operands[1] == IA64_OPND_P1
9510 || idesc->operands[1] == IA64_OPND_P2))
9511 {
9512 int p1 = CURR_SLOT.opnd[0].X_add_number - REG_P;
9513 int p2 = CURR_SLOT.opnd[1].X_add_number - REG_P;
9514 valueT p1mask = (p1 != 0) ? (valueT) 1 << p1 : 0;
9515 valueT p2mask = (p2 != 0) ? (valueT) 1 << p2 : 0;
9516
9517 /* If both PRs are PR0, we can't really do anything. */
9518 if (p1 == 0 && p2 == 0)
9519 {
9520 if (md.debug_dv)
9521 fprintf (stderr, " Ignoring PRs due to inclusion of p0\n");
9522 }
9523 /* In general, clear mutexes and implies which include P1 or P2,
9524 with the following exceptions. */
9525 else if (has_suffix_p (idesc->name, ".or.andcm")
9526 || has_suffix_p (idesc->name, ".and.orcm"))
9527 {
9528 clear_qp_implies (p2mask, p1mask);
9529 }
9530 else if (has_suffix_p (idesc->name, ".andcm")
9531 || has_suffix_p (idesc->name, ".and"))
9532 {
9533 clear_qp_implies (0, p1mask | p2mask);
9534 }
9535 else if (has_suffix_p (idesc->name, ".orcm")
9536 || has_suffix_p (idesc->name, ".or"))
9537 {
9538 clear_qp_mutex (p1mask | p2mask);
9539 clear_qp_implies (p1mask | p2mask, 0);
9540 }
9541 else
9542 {
9543 int added = 0;
9544
9545 clear_qp_implies (p1mask | p2mask, p1mask | p2mask);
9546
9547 /* If one of the PRs is PR0, we call clear_qp_mutex. */
9548 if (p1 == 0 || p2 == 0)
9549 clear_qp_mutex (p1mask | p2mask);
9550 else
9551 added = update_qp_mutex (p1mask | p2mask);
9552
9553 if (CURR_SLOT.qp_regno == 0
9554 || has_suffix_p (idesc->name, ".unc"))
9555 {
9556 if (added == 0 && p1 && p2)
9557 add_qp_mutex (p1mask | p2mask);
9558 if (CURR_SLOT.qp_regno != 0)
9559 {
9560 if (p1)
9561 add_qp_imply (p1, CURR_SLOT.qp_regno);
9562 if (p2)
9563 add_qp_imply (p2, CURR_SLOT.qp_regno);
9564 }
9565 }
9566 }
9567 }
9568 /* Look for mov imm insns into GRs. */
9569 else if (idesc->operands[0] == IA64_OPND_R1
9570 && (idesc->operands[1] == IA64_OPND_IMM22
9571 || idesc->operands[1] == IA64_OPND_IMMU64)
9572 && (strcmp (idesc->name, "mov") == 0
9573 || strcmp (idesc->name, "movl") == 0))
9574 {
9575 int regno = CURR_SLOT.opnd[0].X_add_number - REG_GR;
9576 if (regno > 0 && regno < NELEMS (gr_values))
9577 {
9578 gr_values[regno].known = 1;
9579 gr_values[regno].value = CURR_SLOT.opnd[1].X_add_number;
9580 gr_values[regno].path = md.path;
9581 if (md.debug_dv)
9582 {
9583 fprintf (stderr, " Know gr%d = ", regno);
9584 fprintf_vma (stderr, gr_values[regno].value);
9585 fputs ("\n", stderr);
9586 }
9587 }
9588 }
9589 else
9590 {
9591 clear_qp_mutex (qp_changemask);
9592 clear_qp_implies (qp_changemask, qp_changemask);
9593 }
9594 }
9595
9596 /* Return whether the given predicate registers are currently mutex. */
9597
9598 static int
9599 qp_mutex (p1, p2, path)
9600 int p1;
9601 int p2;
9602 int path;
9603 {
9604 int i;
9605 valueT mask;
9606
9607 if (p1 != p2)
9608 {
9609 mask = ((valueT) 1 << p1) | (valueT) 1 << p2;
9610 for (i = 0; i < qp_mutexeslen; i++)
9611 {
9612 if (qp_mutexes[i].path >= path
9613 && (qp_mutexes[i].prmask & mask) == mask)
9614 return 1;
9615 }
9616 }
9617 return 0;
9618 }
9619
9620 /* Return whether the given resource is in the given insn's list of chks
9621 Return 1 if the conflict is absolutely determined, 2 if it's a potential
9622 conflict. */
9623
9624 static int
9625 resources_match (rs, idesc, note, qp_regno, path)
9626 struct rsrc *rs;
9627 struct ia64_opcode *idesc;
9628 int note;
9629 int qp_regno;
9630 int path;
9631 {
9632 struct rsrc specs[MAX_SPECS];
9633 int count;
9634
9635 /* If the marked resource's qp_regno and the given qp_regno are mutex,
9636 we don't need to check. One exception is note 11, which indicates that
9637 target predicates are written regardless of PR[qp]. */
9638 if (qp_mutex (rs->qp_regno, qp_regno, path)
9639 && note != 11)
9640 return 0;
9641
9642 count = specify_resource (rs->dependency, idesc, DV_CHK, specs, note, path);
9643 while (count-- > 0)
9644 {
9645 /* UNAT checking is a bit more specific than other resources */
9646 if (rs->dependency->specifier == IA64_RS_AR_UNAT
9647 && specs[count].mem_offset.hint
9648 && rs->mem_offset.hint)
9649 {
9650 if (rs->mem_offset.base == specs[count].mem_offset.base)
9651 {
9652 if (((rs->mem_offset.offset >> 3) & 0x3F) ==
9653 ((specs[count].mem_offset.offset >> 3) & 0x3F))
9654 return 1;
9655 else
9656 continue;
9657 }
9658 }
9659
9660 /* Skip apparent PR write conflicts where both writes are an AND or both
9661 writes are an OR. */
9662 if (rs->dependency->specifier == IA64_RS_PR
9663 || rs->dependency->specifier == IA64_RS_PRr
9664 || rs->dependency->specifier == IA64_RS_PR63)
9665 {
9666 if (specs[count].cmp_type != CMP_NONE
9667 && specs[count].cmp_type == rs->cmp_type)
9668 {
9669 if (md.debug_dv)
9670 fprintf (stderr, " %s on parallel compare allowed (PR%d)\n",
9671 dv_mode[rs->dependency->mode],
9672 rs->dependency->specifier != IA64_RS_PR63 ?
9673 specs[count].index : 63);
9674 continue;
9675 }
9676 if (md.debug_dv)
9677 fprintf (stderr,
9678 " %s on parallel compare conflict %s vs %s on PR%d\n",
9679 dv_mode[rs->dependency->mode],
9680 dv_cmp_type[rs->cmp_type],
9681 dv_cmp_type[specs[count].cmp_type],
9682 rs->dependency->specifier != IA64_RS_PR63 ?
9683 specs[count].index : 63);
9684
9685 }
9686
9687 /* If either resource is not specific, conservatively assume a conflict
9688 */
9689 if (!specs[count].specific || !rs->specific)
9690 return 2;
9691 else if (specs[count].index == rs->index)
9692 return 1;
9693 }
9694
9695 return 0;
9696 }
9697
9698 /* Indicate an instruction group break; if INSERT_STOP is non-zero, then
9699 insert a stop to create the break. Update all resource dependencies
9700 appropriately. If QP_REGNO is non-zero, only apply the break to resources
9701 which use the same QP_REGNO and have the link_to_qp_branch flag set.
9702 If SAVE_CURRENT is non-zero, don't affect resources marked by the current
9703 instruction. */
9704
9705 static void
9706 insn_group_break (insert_stop, qp_regno, save_current)
9707 int insert_stop;
9708 int qp_regno;
9709 int save_current;
9710 {
9711 int i;
9712
9713 if (insert_stop && md.num_slots_in_use > 0)
9714 PREV_SLOT.end_of_insn_group = 1;
9715
9716 if (md.debug_dv)
9717 {
9718 fprintf (stderr, " Insn group break%s",
9719 (insert_stop ? " (w/stop)" : ""));
9720 if (qp_regno != 0)
9721 fprintf (stderr, " effective for QP=%d", qp_regno);
9722 fprintf (stderr, "\n");
9723 }
9724
9725 i = 0;
9726 while (i < regdepslen)
9727 {
9728 const struct ia64_dependency *dep = regdeps[i].dependency;
9729
9730 if (qp_regno != 0
9731 && regdeps[i].qp_regno != qp_regno)
9732 {
9733 ++i;
9734 continue;
9735 }
9736
9737 if (save_current
9738 && CURR_SLOT.src_file == regdeps[i].file
9739 && CURR_SLOT.src_line == regdeps[i].line)
9740 {
9741 ++i;
9742 continue;
9743 }
9744
9745 /* clear dependencies which are automatically cleared by a stop, or
9746 those that have reached the appropriate state of insn serialization */
9747 if (dep->semantics == IA64_DVS_IMPLIED
9748 || dep->semantics == IA64_DVS_IMPLIEDF
9749 || regdeps[i].insn_srlz == STATE_SRLZ)
9750 {
9751 print_dependency ("Removing", i);
9752 regdeps[i] = regdeps[--regdepslen];
9753 }
9754 else
9755 {
9756 if (dep->semantics == IA64_DVS_DATA
9757 || dep->semantics == IA64_DVS_INSTR
9758 || dep->semantics == IA64_DVS_SPECIFIC)
9759 {
9760 if (regdeps[i].insn_srlz == STATE_NONE)
9761 regdeps[i].insn_srlz = STATE_STOP;
9762 if (regdeps[i].data_srlz == STATE_NONE)
9763 regdeps[i].data_srlz = STATE_STOP;
9764 }
9765 ++i;
9766 }
9767 }
9768 }
9769
9770 /* Add the given resource usage spec to the list of active dependencies. */
9771
9772 static void
9773 mark_resource (idesc, dep, spec, depind, path)
9774 struct ia64_opcode *idesc ATTRIBUTE_UNUSED;
9775 const struct ia64_dependency *dep ATTRIBUTE_UNUSED;
9776 struct rsrc *spec;
9777 int depind;
9778 int path;
9779 {
9780 if (regdepslen == regdepstotlen)
9781 {
9782 regdepstotlen += 20;
9783 regdeps = (struct rsrc *)
9784 xrealloc ((void *) regdeps,
9785 regdepstotlen * sizeof (struct rsrc));
9786 }
9787
9788 regdeps[regdepslen] = *spec;
9789 regdeps[regdepslen].depind = depind;
9790 regdeps[regdepslen].path = path;
9791 regdeps[regdepslen].file = CURR_SLOT.src_file;
9792 regdeps[regdepslen].line = CURR_SLOT.src_line;
9793
9794 print_dependency ("Adding", regdepslen);
9795
9796 ++regdepslen;
9797 }
9798
9799 static void
9800 print_dependency (action, depind)
9801 const char *action;
9802 int depind;
9803 {
9804 if (md.debug_dv)
9805 {
9806 fprintf (stderr, " %s %s '%s'",
9807 action, dv_mode[(regdeps[depind].dependency)->mode],
9808 (regdeps[depind].dependency)->name);
9809 if (regdeps[depind].specific && regdeps[depind].index != 0)
9810 fprintf (stderr, " (%d)", regdeps[depind].index);
9811 if (regdeps[depind].mem_offset.hint)
9812 {
9813 fputs (" ", stderr);
9814 fprintf_vma (stderr, regdeps[depind].mem_offset.base);
9815 fputs ("+", stderr);
9816 fprintf_vma (stderr, regdeps[depind].mem_offset.offset);
9817 }
9818 fprintf (stderr, "\n");
9819 }
9820 }
9821
9822 static void
9823 instruction_serialization ()
9824 {
9825 int i;
9826 if (md.debug_dv)
9827 fprintf (stderr, " Instruction serialization\n");
9828 for (i = 0; i < regdepslen; i++)
9829 if (regdeps[i].insn_srlz == STATE_STOP)
9830 regdeps[i].insn_srlz = STATE_SRLZ;
9831 }
9832
9833 static void
9834 data_serialization ()
9835 {
9836 int i = 0;
9837 if (md.debug_dv)
9838 fprintf (stderr, " Data serialization\n");
9839 while (i < regdepslen)
9840 {
9841 if (regdeps[i].data_srlz == STATE_STOP
9842 /* Note: as of 991210, all "other" dependencies are cleared by a
9843 data serialization. This might change with new tables */
9844 || (regdeps[i].dependency)->semantics == IA64_DVS_OTHER)
9845 {
9846 print_dependency ("Removing", i);
9847 regdeps[i] = regdeps[--regdepslen];
9848 }
9849 else
9850 ++i;
9851 }
9852 }
9853
9854 /* Insert stops and serializations as needed to avoid DVs. */
9855
9856 static void
9857 remove_marked_resource (rs)
9858 struct rsrc *rs;
9859 {
9860 switch (rs->dependency->semantics)
9861 {
9862 case IA64_DVS_SPECIFIC:
9863 if (md.debug_dv)
9864 fprintf (stderr, "Implementation-specific, assume worst case...\n");
9865 /* ...fall through... */
9866 case IA64_DVS_INSTR:
9867 if (md.debug_dv)
9868 fprintf (stderr, "Inserting instr serialization\n");
9869 if (rs->insn_srlz < STATE_STOP)
9870 insn_group_break (1, 0, 0);
9871 if (rs->insn_srlz < STATE_SRLZ)
9872 {
9873 struct slot oldslot = CURR_SLOT;
9874 /* Manually jam a srlz.i insn into the stream */
9875 memset (&CURR_SLOT, 0, sizeof (CURR_SLOT));
9876 CURR_SLOT.idesc = ia64_find_opcode ("srlz.i");
9877 instruction_serialization ();
9878 md.curr_slot = (md.curr_slot + 1) % NUM_SLOTS;
9879 if (++md.num_slots_in_use >= NUM_SLOTS)
9880 emit_one_bundle ();
9881 CURR_SLOT = oldslot;
9882 }
9883 insn_group_break (1, 0, 0);
9884 break;
9885 case IA64_DVS_OTHER: /* as of rev2 (991220) of the DV tables, all
9886 "other" types of DV are eliminated
9887 by a data serialization */
9888 case IA64_DVS_DATA:
9889 if (md.debug_dv)
9890 fprintf (stderr, "Inserting data serialization\n");
9891 if (rs->data_srlz < STATE_STOP)
9892 insn_group_break (1, 0, 0);
9893 {
9894 struct slot oldslot = CURR_SLOT;
9895 /* Manually jam a srlz.d insn into the stream */
9896 memset (&CURR_SLOT, 0, sizeof (CURR_SLOT));
9897 CURR_SLOT.idesc = ia64_find_opcode ("srlz.d");
9898 data_serialization ();
9899 md.curr_slot = (md.curr_slot + 1) % NUM_SLOTS;
9900 if (++md.num_slots_in_use >= NUM_SLOTS)
9901 emit_one_bundle ();
9902 CURR_SLOT = oldslot;
9903 }
9904 break;
9905 case IA64_DVS_IMPLIED:
9906 case IA64_DVS_IMPLIEDF:
9907 if (md.debug_dv)
9908 fprintf (stderr, "Inserting stop\n");
9909 insn_group_break (1, 0, 0);
9910 break;
9911 default:
9912 break;
9913 }
9914 }
9915
9916 /* Check the resources used by the given opcode against the current dependency
9917 list.
9918
9919 The check is run once for each execution path encountered. In this case,
9920 a unique execution path is the sequence of instructions following a code
9921 entry point, e.g. the following has three execution paths, one starting
9922 at L0, one at L1, and one at L2.
9923
9924 L0: nop
9925 L1: add
9926 L2: add
9927 br.ret
9928 */
9929
9930 static void
9931 check_dependencies (idesc)
9932 struct ia64_opcode *idesc;
9933 {
9934 const struct ia64_opcode_dependency *opdeps = idesc->dependencies;
9935 int path;
9936 int i;
9937
9938 /* Note that the number of marked resources may change within the
9939 loop if in auto mode. */
9940 i = 0;
9941 while (i < regdepslen)
9942 {
9943 struct rsrc *rs = &regdeps[i];
9944 const struct ia64_dependency *dep = rs->dependency;
9945 int chkind;
9946 int note;
9947 int start_over = 0;
9948
9949 if (dep->semantics == IA64_DVS_NONE
9950 || (chkind = depends_on (rs->depind, idesc)) == -1)
9951 {
9952 ++i;
9953 continue;
9954 }
9955
9956 note = NOTE (opdeps->chks[chkind]);
9957
9958 /* Check this resource against each execution path seen thus far. */
9959 for (path = 0; path <= md.path; path++)
9960 {
9961 int matchtype;
9962
9963 /* If the dependency wasn't on the path being checked, ignore it. */
9964 if (rs->path < path)
9965 continue;
9966
9967 /* If the QP for this insn implies a QP which has branched, don't
9968 bother checking. Ed. NOTE: I don't think this check is terribly
9969 useful; what's the point of generating code which will only be
9970 reached if its QP is zero?
9971 This code was specifically inserted to handle the following code,
9972 based on notes from Intel's DV checking code, where p1 implies p2.
9973
9974 mov r4 = 2
9975 (p2) br.cond L
9976 (p1) mov r4 = 7
9977 */
9978 if (CURR_SLOT.qp_regno != 0)
9979 {
9980 int skip = 0;
9981 int implies;
9982 for (implies = 0; implies < qp_implieslen; implies++)
9983 {
9984 if (qp_implies[implies].path >= path
9985 && qp_implies[implies].p1 == CURR_SLOT.qp_regno
9986 && qp_implies[implies].p2_branched)
9987 {
9988 skip = 1;
9989 break;
9990 }
9991 }
9992 if (skip)
9993 continue;
9994 }
9995
9996 if ((matchtype = resources_match (rs, idesc, note,
9997 CURR_SLOT.qp_regno, path)) != 0)
9998 {
9999 char msg[1024];
10000 char pathmsg[256] = "";
10001 char indexmsg[256] = "";
10002 int certain = (matchtype == 1 && CURR_SLOT.qp_regno == 0);
10003
10004 if (path != 0)
10005 sprintf (pathmsg, " when entry is at label '%s'",
10006 md.entry_labels[path - 1]);
10007 if (rs->specific && rs->index != 0)
10008 sprintf (indexmsg, ", specific resource number is %d",
10009 rs->index);
10010 sprintf (msg, "Use of '%s' %s %s dependency '%s' (%s)%s%s",
10011 idesc->name,
10012 (certain ? "violates" : "may violate"),
10013 dv_mode[dep->mode], dep->name,
10014 dv_sem[dep->semantics],
10015 pathmsg, indexmsg);
10016
10017 if (md.explicit_mode)
10018 {
10019 as_warn ("%s", msg);
10020 if (path < md.path)
10021 as_warn (_("Only the first path encountering the conflict "
10022 "is reported"));
10023 as_warn_where (rs->file, rs->line,
10024 _("This is the location of the "
10025 "conflicting usage"));
10026 /* Don't bother checking other paths, to avoid duplicating
10027 the same warning */
10028 break;
10029 }
10030 else
10031 {
10032 if (md.debug_dv)
10033 fprintf (stderr, "%s @ %s:%d\n", msg, rs->file, rs->line);
10034
10035 remove_marked_resource (rs);
10036
10037 /* since the set of dependencies has changed, start over */
10038 /* FIXME -- since we're removing dvs as we go, we
10039 probably don't really need to start over... */
10040 start_over = 1;
10041 break;
10042 }
10043 }
10044 }
10045 if (start_over)
10046 i = 0;
10047 else
10048 ++i;
10049 }
10050 }
10051
10052 /* Register new dependencies based on the given opcode. */
10053
10054 static void
10055 mark_resources (idesc)
10056 struct ia64_opcode *idesc;
10057 {
10058 int i;
10059 const struct ia64_opcode_dependency *opdeps = idesc->dependencies;
10060 int add_only_qp_reads = 0;
10061
10062 /* A conditional branch only uses its resources if it is taken; if it is
10063 taken, we stop following that path. The other branch types effectively
10064 *always* write their resources. If it's not taken, register only QP
10065 reads. */
10066 if (is_conditional_branch (idesc) || is_interruption_or_rfi (idesc))
10067 {
10068 add_only_qp_reads = 1;
10069 }
10070
10071 if (md.debug_dv)
10072 fprintf (stderr, "Registering '%s' resource usage\n", idesc->name);
10073
10074 for (i = 0; i < opdeps->nregs; i++)
10075 {
10076 const struct ia64_dependency *dep;
10077 struct rsrc specs[MAX_SPECS];
10078 int note;
10079 int path;
10080 int count;
10081
10082 dep = ia64_find_dependency (opdeps->regs[i]);
10083 note = NOTE (opdeps->regs[i]);
10084
10085 if (add_only_qp_reads
10086 && !(dep->mode == IA64_DV_WAR
10087 && (dep->specifier == IA64_RS_PR
10088 || dep->specifier == IA64_RS_PRr
10089 || dep->specifier == IA64_RS_PR63)))
10090 continue;
10091
10092 count = specify_resource (dep, idesc, DV_REG, specs, note, md.path);
10093
10094 while (count-- > 0)
10095 {
10096 mark_resource (idesc, dep, &specs[count],
10097 DEP (opdeps->regs[i]), md.path);
10098 }
10099
10100 /* The execution path may affect register values, which may in turn
10101 affect which indirect-access resources are accessed. */
10102 switch (dep->specifier)
10103 {
10104 default:
10105 break;
10106 case IA64_RS_CPUID:
10107 case IA64_RS_DBR:
10108 case IA64_RS_IBR:
10109 case IA64_RS_MSR:
10110 case IA64_RS_PKR:
10111 case IA64_RS_PMC:
10112 case IA64_RS_PMD:
10113 case IA64_RS_RR:
10114 for (path = 0; path < md.path; path++)
10115 {
10116 count = specify_resource (dep, idesc, DV_REG, specs, note, path);
10117 while (count-- > 0)
10118 mark_resource (idesc, dep, &specs[count],
10119 DEP (opdeps->regs[i]), path);
10120 }
10121 break;
10122 }
10123 }
10124 }
10125
10126 /* Remove dependencies when they no longer apply. */
10127
10128 static void
10129 update_dependencies (idesc)
10130 struct ia64_opcode *idesc;
10131 {
10132 int i;
10133
10134 if (strcmp (idesc->name, "srlz.i") == 0)
10135 {
10136 instruction_serialization ();
10137 }
10138 else if (strcmp (idesc->name, "srlz.d") == 0)
10139 {
10140 data_serialization ();
10141 }
10142 else if (is_interruption_or_rfi (idesc)
10143 || is_taken_branch (idesc))
10144 {
10145 /* Although technically the taken branch doesn't clear dependencies
10146 which require a srlz.[id], we don't follow the branch; the next
10147 instruction is assumed to start with a clean slate. */
10148 regdepslen = 0;
10149 md.path = 0;
10150 }
10151 else if (is_conditional_branch (idesc)
10152 && CURR_SLOT.qp_regno != 0)
10153 {
10154 int is_call = strstr (idesc->name, ".call") != NULL;
10155
10156 for (i = 0; i < qp_implieslen; i++)
10157 {
10158 /* If the conditional branch's predicate is implied by the predicate
10159 in an existing dependency, remove that dependency. */
10160 if (qp_implies[i].p2 == CURR_SLOT.qp_regno)
10161 {
10162 int depind = 0;
10163 /* Note that this implied predicate takes a branch so that if
10164 a later insn generates a DV but its predicate implies this
10165 one, we can avoid the false DV warning. */
10166 qp_implies[i].p2_branched = 1;
10167 while (depind < regdepslen)
10168 {
10169 if (regdeps[depind].qp_regno == qp_implies[i].p1)
10170 {
10171 print_dependency ("Removing", depind);
10172 regdeps[depind] = regdeps[--regdepslen];
10173 }
10174 else
10175 ++depind;
10176 }
10177 }
10178 }
10179 /* Any marked resources which have this same predicate should be
10180 cleared, provided that the QP hasn't been modified between the
10181 marking instruction and the branch. */
10182 if (is_call)
10183 {
10184 insn_group_break (0, CURR_SLOT.qp_regno, 1);
10185 }
10186 else
10187 {
10188 i = 0;
10189 while (i < regdepslen)
10190 {
10191 if (regdeps[i].qp_regno == CURR_SLOT.qp_regno
10192 && regdeps[i].link_to_qp_branch
10193 && (regdeps[i].file != CURR_SLOT.src_file
10194 || regdeps[i].line != CURR_SLOT.src_line))
10195 {
10196 /* Treat like a taken branch */
10197 print_dependency ("Removing", i);
10198 regdeps[i] = regdeps[--regdepslen];
10199 }
10200 else
10201 ++i;
10202 }
10203 }
10204 }
10205 }
10206
10207 /* Examine the current instruction for dependency violations. */
10208
10209 static int
10210 check_dv (idesc)
10211 struct ia64_opcode *idesc;
10212 {
10213 if (md.debug_dv)
10214 {
10215 fprintf (stderr, "Checking %s for violations (line %d, %d/%d)\n",
10216 idesc->name, CURR_SLOT.src_line,
10217 idesc->dependencies->nchks,
10218 idesc->dependencies->nregs);
10219 }
10220
10221 /* Look through the list of currently marked resources; if the current
10222 instruction has the dependency in its chks list which uses that resource,
10223 check against the specific resources used. */
10224 check_dependencies (idesc);
10225
10226 /* Look up the instruction's regdeps (RAW writes, WAW writes, and WAR reads),
10227 then add them to the list of marked resources. */
10228 mark_resources (idesc);
10229
10230 /* There are several types of dependency semantics, and each has its own
10231 requirements for being cleared
10232
10233 Instruction serialization (insns separated by interruption, rfi, or
10234 writer + srlz.i + reader, all in separate groups) clears DVS_INSTR.
10235
10236 Data serialization (instruction serialization, or writer + srlz.d +
10237 reader, where writer and srlz.d are in separate groups) clears
10238 DVS_DATA. (This also clears DVS_OTHER, but that is not guaranteed to
10239 always be the case).
10240
10241 Instruction group break (groups separated by stop, taken branch,
10242 interruption or rfi) clears DVS_IMPLIED and DVS_IMPLIEDF.
10243 */
10244 update_dependencies (idesc);
10245
10246 /* Sometimes, knowing a register value allows us to avoid giving a false DV
10247 warning. Keep track of as many as possible that are useful. */
10248 note_register_values (idesc);
10249
10250 /* We don't need or want this anymore. */
10251 md.mem_offset.hint = 0;
10252
10253 return 0;
10254 }
10255
10256 /* Translate one line of assembly. Pseudo ops and labels do not show
10257 here. */
10258 void
10259 md_assemble (str)
10260 char *str;
10261 {
10262 char *saved_input_line_pointer, *mnemonic;
10263 const struct pseudo_opcode *pdesc;
10264 struct ia64_opcode *idesc;
10265 unsigned char qp_regno;
10266 unsigned int flags;
10267 int ch;
10268
10269 saved_input_line_pointer = input_line_pointer;
10270 input_line_pointer = str;
10271
10272 /* extract the opcode (mnemonic): */
10273
10274 mnemonic = input_line_pointer;
10275 ch = get_symbol_end ();
10276 pdesc = (struct pseudo_opcode *) hash_find (md.pseudo_hash, mnemonic);
10277 if (pdesc)
10278 {
10279 *input_line_pointer = ch;
10280 (*pdesc->handler) (pdesc->arg);
10281 goto done;
10282 }
10283
10284 /* Find the instruction descriptor matching the arguments. */
10285
10286 idesc = ia64_find_opcode (mnemonic);
10287 *input_line_pointer = ch;
10288 if (!idesc)
10289 {
10290 as_bad ("Unknown opcode `%s'", mnemonic);
10291 goto done;
10292 }
10293
10294 idesc = parse_operands (idesc);
10295 if (!idesc)
10296 goto done;
10297
10298 /* Handle the dynamic ops we can handle now: */
10299 if (idesc->type == IA64_TYPE_DYN)
10300 {
10301 if (strcmp (idesc->name, "add") == 0)
10302 {
10303 if (CURR_SLOT.opnd[2].X_op == O_register
10304 && CURR_SLOT.opnd[2].X_add_number < 4)
10305 mnemonic = "addl";
10306 else
10307 mnemonic = "adds";
10308 ia64_free_opcode (idesc);
10309 idesc = ia64_find_opcode (mnemonic);
10310 }
10311 else if (strcmp (idesc->name, "mov") == 0)
10312 {
10313 enum ia64_opnd opnd1, opnd2;
10314 int rop;
10315
10316 opnd1 = idesc->operands[0];
10317 opnd2 = idesc->operands[1];
10318 if (opnd1 == IA64_OPND_AR3)
10319 rop = 0;
10320 else if (opnd2 == IA64_OPND_AR3)
10321 rop = 1;
10322 else
10323 abort ();
10324 if (CURR_SLOT.opnd[rop].X_op == O_register)
10325 {
10326 if (ar_is_only_in_integer_unit (CURR_SLOT.opnd[rop].X_add_number))
10327 mnemonic = "mov.i";
10328 else if (ar_is_only_in_memory_unit (CURR_SLOT.opnd[rop].X_add_number))
10329 mnemonic = "mov.m";
10330 else
10331 rop = -1;
10332 }
10333 else
10334 abort ();
10335 if (rop >= 0)
10336 {
10337 ia64_free_opcode (idesc);
10338 idesc = ia64_find_opcode (mnemonic);
10339 while (idesc != NULL
10340 && (idesc->operands[0] != opnd1
10341 || idesc->operands[1] != opnd2))
10342 idesc = get_next_opcode (idesc);
10343 }
10344 }
10345 }
10346 else if (strcmp (idesc->name, "mov.i") == 0
10347 || strcmp (idesc->name, "mov.m") == 0)
10348 {
10349 enum ia64_opnd opnd1, opnd2;
10350 int rop;
10351
10352 opnd1 = idesc->operands[0];
10353 opnd2 = idesc->operands[1];
10354 if (opnd1 == IA64_OPND_AR3)
10355 rop = 0;
10356 else if (opnd2 == IA64_OPND_AR3)
10357 rop = 1;
10358 else
10359 abort ();
10360 if (CURR_SLOT.opnd[rop].X_op == O_register)
10361 {
10362 char unit = 'a';
10363 if (ar_is_only_in_integer_unit (CURR_SLOT.opnd[rop].X_add_number))
10364 unit = 'i';
10365 else if (ar_is_only_in_memory_unit (CURR_SLOT.opnd[rop].X_add_number))
10366 unit = 'm';
10367 if (unit != 'a' && unit != idesc->name [4])
10368 as_bad ("AR %d cannot be accessed by %c-unit",
10369 (int) (CURR_SLOT.opnd[rop].X_add_number - REG_AR),
10370 TOUPPER (unit));
10371 }
10372 }
10373
10374 qp_regno = 0;
10375 if (md.qp.X_op == O_register)
10376 {
10377 qp_regno = md.qp.X_add_number - REG_P;
10378 md.qp.X_op = O_absent;
10379 }
10380
10381 flags = idesc->flags;
10382
10383 if ((flags & IA64_OPCODE_FIRST) != 0)
10384 {
10385 /* The alignment frag has to end with a stop bit only if the
10386 next instruction after the alignment directive has to be
10387 the first instruction in an instruction group. */
10388 if (align_frag)
10389 {
10390 while (align_frag->fr_type != rs_align_code)
10391 {
10392 align_frag = align_frag->fr_next;
10393 if (!align_frag)
10394 break;
10395 }
10396 /* align_frag can be NULL if there are directives in
10397 between. */
10398 if (align_frag && align_frag->fr_next == frag_now)
10399 align_frag->tc_frag_data = 1;
10400 }
10401
10402 insn_group_break (1, 0, 0);
10403 }
10404 align_frag = NULL;
10405
10406 if ((flags & IA64_OPCODE_NO_PRED) != 0 && qp_regno != 0)
10407 {
10408 as_bad ("`%s' cannot be predicated", idesc->name);
10409 goto done;
10410 }
10411
10412 /* Build the instruction. */
10413 CURR_SLOT.qp_regno = qp_regno;
10414 CURR_SLOT.idesc = idesc;
10415 as_where (&CURR_SLOT.src_file, &CURR_SLOT.src_line);
10416 dwarf2_where (&CURR_SLOT.debug_line);
10417
10418 /* Add unwind entry, if there is one. */
10419 if (unwind.current_entry)
10420 {
10421 CURR_SLOT.unwind_record = unwind.current_entry;
10422 unwind.current_entry = NULL;
10423 }
10424 if (unwind.proc_start && S_IS_DEFINED (unwind.proc_start))
10425 unwind.insn = 1;
10426
10427 /* Check for dependency violations. */
10428 if (md.detect_dv)
10429 check_dv (idesc);
10430
10431 md.curr_slot = (md.curr_slot + 1) % NUM_SLOTS;
10432 if (++md.num_slots_in_use >= NUM_SLOTS)
10433 emit_one_bundle ();
10434
10435 if ((flags & IA64_OPCODE_LAST) != 0)
10436 insn_group_break (1, 0, 0);
10437
10438 md.last_text_seg = now_seg;
10439
10440 done:
10441 input_line_pointer = saved_input_line_pointer;
10442 }
10443
10444 /* Called when symbol NAME cannot be found in the symbol table.
10445 Should be used for dynamic valued symbols only. */
10446
10447 symbolS *
10448 md_undefined_symbol (name)
10449 char *name ATTRIBUTE_UNUSED;
10450 {
10451 return 0;
10452 }
10453
10454 /* Called for any expression that can not be recognized. When the
10455 function is called, `input_line_pointer' will point to the start of
10456 the expression. */
10457
10458 void
10459 md_operand (e)
10460 expressionS *e;
10461 {
10462 switch (*input_line_pointer)
10463 {
10464 case '[':
10465 ++input_line_pointer;
10466 expression (e);
10467 if (*input_line_pointer != ']')
10468 {
10469 as_bad ("Closing bracket missing");
10470 goto err;
10471 }
10472 else
10473 {
10474 if (e->X_op != O_register)
10475 as_bad ("Register expected as index");
10476
10477 ++input_line_pointer;
10478 e->X_op = O_index;
10479 }
10480 break;
10481
10482 default:
10483 break;
10484 }
10485 return;
10486
10487 err:
10488 ignore_rest_of_line ();
10489 }
10490
10491 /* Return 1 if it's OK to adjust a reloc by replacing the symbol with
10492 a section symbol plus some offset. For relocs involving @fptr(),
10493 directives we don't want such adjustments since we need to have the
10494 original symbol's name in the reloc. */
10495 int
10496 ia64_fix_adjustable (fix)
10497 fixS *fix;
10498 {
10499 /* Prevent all adjustments to global symbols */
10500 if (S_IS_EXTERN (fix->fx_addsy) || S_IS_WEAK (fix->fx_addsy))
10501 return 0;
10502
10503 switch (fix->fx_r_type)
10504 {
10505 case BFD_RELOC_IA64_FPTR64I:
10506 case BFD_RELOC_IA64_FPTR32MSB:
10507 case BFD_RELOC_IA64_FPTR32LSB:
10508 case BFD_RELOC_IA64_FPTR64MSB:
10509 case BFD_RELOC_IA64_FPTR64LSB:
10510 case BFD_RELOC_IA64_LTOFF_FPTR22:
10511 case BFD_RELOC_IA64_LTOFF_FPTR64I:
10512 return 0;
10513 default:
10514 break;
10515 }
10516
10517 return 1;
10518 }
10519
10520 int
10521 ia64_force_relocation (fix)
10522 fixS *fix;
10523 {
10524 switch (fix->fx_r_type)
10525 {
10526 case BFD_RELOC_IA64_FPTR64I:
10527 case BFD_RELOC_IA64_FPTR32MSB:
10528 case BFD_RELOC_IA64_FPTR32LSB:
10529 case BFD_RELOC_IA64_FPTR64MSB:
10530 case BFD_RELOC_IA64_FPTR64LSB:
10531
10532 case BFD_RELOC_IA64_LTOFF22:
10533 case BFD_RELOC_IA64_LTOFF64I:
10534 case BFD_RELOC_IA64_LTOFF_FPTR22:
10535 case BFD_RELOC_IA64_LTOFF_FPTR64I:
10536 case BFD_RELOC_IA64_PLTOFF22:
10537 case BFD_RELOC_IA64_PLTOFF64I:
10538 case BFD_RELOC_IA64_PLTOFF64MSB:
10539 case BFD_RELOC_IA64_PLTOFF64LSB:
10540
10541 case BFD_RELOC_IA64_LTOFF22X:
10542 case BFD_RELOC_IA64_LDXMOV:
10543 return 1;
10544
10545 default:
10546 break;
10547 }
10548
10549 return generic_force_reloc (fix);
10550 }
10551
10552 /* Decide from what point a pc-relative relocation is relative to,
10553 relative to the pc-relative fixup. Er, relatively speaking. */
10554 long
10555 ia64_pcrel_from_section (fix, sec)
10556 fixS *fix;
10557 segT sec;
10558 {
10559 unsigned long off = fix->fx_frag->fr_address + fix->fx_where;
10560
10561 if (bfd_get_section_flags (stdoutput, sec) & SEC_CODE)
10562 off &= ~0xfUL;
10563
10564 return off;
10565 }
10566
10567
10568 /* Used to emit section-relative relocs for the dwarf2 debug data. */
10569 void
10570 ia64_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
10571 {
10572 expressionS expr;
10573
10574 expr.X_op = O_pseudo_fixup;
10575 expr.X_op_symbol = pseudo_func[FUNC_SEC_RELATIVE].u.sym;
10576 expr.X_add_number = 0;
10577 expr.X_add_symbol = symbol;
10578 emit_expr (&expr, size);
10579 }
10580
10581 /* This is called whenever some data item (not an instruction) needs a
10582 fixup. We pick the right reloc code depending on the byteorder
10583 currently in effect. */
10584 void
10585 ia64_cons_fix_new (f, where, nbytes, exp)
10586 fragS *f;
10587 int where;
10588 int nbytes;
10589 expressionS *exp;
10590 {
10591 bfd_reloc_code_real_type code;
10592 fixS *fix;
10593
10594 switch (nbytes)
10595 {
10596 /* There are no reloc for 8 and 16 bit quantities, but we allow
10597 them here since they will work fine as long as the expression
10598 is fully defined at the end of the pass over the source file. */
10599 case 1: code = BFD_RELOC_8; break;
10600 case 2: code = BFD_RELOC_16; break;
10601 case 4:
10602 if (target_big_endian)
10603 code = BFD_RELOC_IA64_DIR32MSB;
10604 else
10605 code = BFD_RELOC_IA64_DIR32LSB;
10606 break;
10607
10608 case 8:
10609 /* In 32-bit mode, data8 could mean function descriptors too. */
10610 if (exp->X_op == O_pseudo_fixup
10611 && exp->X_op_symbol
10612 && S_GET_VALUE (exp->X_op_symbol) == FUNC_IPLT_RELOC
10613 && !(md.flags & EF_IA_64_ABI64))
10614 {
10615 if (target_big_endian)
10616 code = BFD_RELOC_IA64_IPLTMSB;
10617 else
10618 code = BFD_RELOC_IA64_IPLTLSB;
10619 exp->X_op = O_symbol;
10620 break;
10621 }
10622 else
10623 {
10624 if (target_big_endian)
10625 code = BFD_RELOC_IA64_DIR64MSB;
10626 else
10627 code = BFD_RELOC_IA64_DIR64LSB;
10628 break;
10629 }
10630
10631 case 16:
10632 if (exp->X_op == O_pseudo_fixup
10633 && exp->X_op_symbol
10634 && S_GET_VALUE (exp->X_op_symbol) == FUNC_IPLT_RELOC)
10635 {
10636 if (target_big_endian)
10637 code = BFD_RELOC_IA64_IPLTMSB;
10638 else
10639 code = BFD_RELOC_IA64_IPLTLSB;
10640 exp->X_op = O_symbol;
10641 break;
10642 }
10643 /* FALLTHRU */
10644
10645 default:
10646 as_bad ("Unsupported fixup size %d", nbytes);
10647 ignore_rest_of_line ();
10648 return;
10649 }
10650
10651 if (exp->X_op == O_pseudo_fixup)
10652 {
10653 exp->X_op = O_symbol;
10654 code = ia64_gen_real_reloc_type (exp->X_op_symbol, code);
10655 /* ??? If code unchanged, unsupported. */
10656 }
10657
10658 fix = fix_new_exp (f, where, nbytes, exp, 0, code);
10659 /* We need to store the byte order in effect in case we're going
10660 to fix an 8 or 16 bit relocation (for which there no real
10661 relocs available). See md_apply_fix3(). */
10662 fix->tc_fix_data.bigendian = target_big_endian;
10663 }
10664
10665 /* Return the actual relocation we wish to associate with the pseudo
10666 reloc described by SYM and R_TYPE. SYM should be one of the
10667 symbols in the pseudo_func array, or NULL. */
10668
10669 static bfd_reloc_code_real_type
10670 ia64_gen_real_reloc_type (sym, r_type)
10671 struct symbol *sym;
10672 bfd_reloc_code_real_type r_type;
10673 {
10674 bfd_reloc_code_real_type new = 0;
10675
10676 if (sym == NULL)
10677 {
10678 return r_type;
10679 }
10680
10681 switch (S_GET_VALUE (sym))
10682 {
10683 case FUNC_FPTR_RELATIVE:
10684 switch (r_type)
10685 {
10686 case BFD_RELOC_IA64_IMM64: new = BFD_RELOC_IA64_FPTR64I; break;
10687 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_FPTR32MSB; break;
10688 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_FPTR32LSB; break;
10689 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_FPTR64MSB; break;
10690 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_FPTR64LSB; break;
10691 default: break;
10692 }
10693 break;
10694
10695 case FUNC_GP_RELATIVE:
10696 switch (r_type)
10697 {
10698 case BFD_RELOC_IA64_IMM22: new = BFD_RELOC_IA64_GPREL22; break;
10699 case BFD_RELOC_IA64_IMM64: new = BFD_RELOC_IA64_GPREL64I; break;
10700 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_GPREL32MSB; break;
10701 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_GPREL32LSB; break;
10702 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_GPREL64MSB; break;
10703 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_GPREL64LSB; break;
10704 default: break;
10705 }
10706 break;
10707
10708 case FUNC_LT_RELATIVE:
10709 switch (r_type)
10710 {
10711 case BFD_RELOC_IA64_IMM22: new = BFD_RELOC_IA64_LTOFF22; break;
10712 case BFD_RELOC_IA64_IMM64: new = BFD_RELOC_IA64_LTOFF64I; break;
10713 default: break;
10714 }
10715 break;
10716
10717 case FUNC_LT_RELATIVE_X:
10718 switch (r_type)
10719 {
10720 case BFD_RELOC_IA64_IMM22: new = BFD_RELOC_IA64_LTOFF22X; break;
10721 default: break;
10722 }
10723 break;
10724
10725 case FUNC_PC_RELATIVE:
10726 switch (r_type)
10727 {
10728 case BFD_RELOC_IA64_IMM22: new = BFD_RELOC_IA64_PCREL22; break;
10729 case BFD_RELOC_IA64_IMM64: new = BFD_RELOC_IA64_PCREL64I; break;
10730 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_PCREL32MSB; break;
10731 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_PCREL32LSB; break;
10732 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_PCREL64MSB; break;
10733 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_PCREL64LSB; break;
10734 default: break;
10735 }
10736 break;
10737
10738 case FUNC_PLT_RELATIVE:
10739 switch (r_type)
10740 {
10741 case BFD_RELOC_IA64_IMM22: new = BFD_RELOC_IA64_PLTOFF22; break;
10742 case BFD_RELOC_IA64_IMM64: new = BFD_RELOC_IA64_PLTOFF64I; break;
10743 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_PLTOFF64MSB;break;
10744 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_PLTOFF64LSB;break;
10745 default: break;
10746 }
10747 break;
10748
10749 case FUNC_SEC_RELATIVE:
10750 switch (r_type)
10751 {
10752 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_SECREL32MSB;break;
10753 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_SECREL32LSB;break;
10754 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_SECREL64MSB;break;
10755 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_SECREL64LSB;break;
10756 default: break;
10757 }
10758 break;
10759
10760 case FUNC_SEG_RELATIVE:
10761 switch (r_type)
10762 {
10763 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_SEGREL32MSB;break;
10764 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_SEGREL32LSB;break;
10765 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_SEGREL64MSB;break;
10766 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_SEGREL64LSB;break;
10767 default: break;
10768 }
10769 break;
10770
10771 case FUNC_LTV_RELATIVE:
10772 switch (r_type)
10773 {
10774 case BFD_RELOC_IA64_DIR32MSB: new = BFD_RELOC_IA64_LTV32MSB; break;
10775 case BFD_RELOC_IA64_DIR32LSB: new = BFD_RELOC_IA64_LTV32LSB; break;
10776 case BFD_RELOC_IA64_DIR64MSB: new = BFD_RELOC_IA64_LTV64MSB; break;
10777 case BFD_RELOC_IA64_DIR64LSB: new = BFD_RELOC_IA64_LTV64LSB; break;
10778 default: break;
10779 }
10780 break;
10781
10782 case FUNC_LT_FPTR_RELATIVE:
10783 switch (r_type)
10784 {
10785 case BFD_RELOC_IA64_IMM22:
10786 new = BFD_RELOC_IA64_LTOFF_FPTR22; break;
10787 case BFD_RELOC_IA64_IMM64:
10788 new = BFD_RELOC_IA64_LTOFF_FPTR64I; break;
10789 default:
10790 break;
10791 }
10792 break;
10793
10794 case FUNC_TP_RELATIVE:
10795 switch (r_type)
10796 {
10797 case BFD_RELOC_IA64_IMM14:
10798 new = BFD_RELOC_IA64_TPREL14; break;
10799 case BFD_RELOC_IA64_IMM22:
10800 new = BFD_RELOC_IA64_TPREL22; break;
10801 case BFD_RELOC_IA64_IMM64:
10802 new = BFD_RELOC_IA64_TPREL64I; break;
10803 default:
10804 break;
10805 }
10806 break;
10807
10808 case FUNC_LT_TP_RELATIVE:
10809 switch (r_type)
10810 {
10811 case BFD_RELOC_IA64_IMM22:
10812 new = BFD_RELOC_IA64_LTOFF_TPREL22; break;
10813 default:
10814 break;
10815 }
10816 break;
10817
10818 case FUNC_LT_DTP_MODULE:
10819 switch (r_type)
10820 {
10821 case BFD_RELOC_IA64_IMM22:
10822 new = BFD_RELOC_IA64_LTOFF_DTPMOD22; break;
10823 default:
10824 break;
10825 }
10826 break;
10827
10828 case FUNC_DTP_RELATIVE:
10829 switch (r_type)
10830 {
10831 case BFD_RELOC_IA64_DIR64MSB:
10832 new = BFD_RELOC_IA64_DTPREL64MSB; break;
10833 case BFD_RELOC_IA64_DIR64LSB:
10834 new = BFD_RELOC_IA64_DTPREL64LSB; break;
10835 case BFD_RELOC_IA64_IMM14:
10836 new = BFD_RELOC_IA64_DTPREL14; break;
10837 case BFD_RELOC_IA64_IMM22:
10838 new = BFD_RELOC_IA64_DTPREL22; break;
10839 case BFD_RELOC_IA64_IMM64:
10840 new = BFD_RELOC_IA64_DTPREL64I; break;
10841 default:
10842 break;
10843 }
10844 break;
10845
10846 case FUNC_LT_DTP_RELATIVE:
10847 switch (r_type)
10848 {
10849 case BFD_RELOC_IA64_IMM22:
10850 new = BFD_RELOC_IA64_LTOFF_DTPREL22; break;
10851 default:
10852 break;
10853 }
10854 break;
10855
10856 case FUNC_IPLT_RELOC:
10857 break;
10858
10859 default:
10860 abort ();
10861 }
10862
10863 /* Hmmmm. Should this ever occur? */
10864 if (new)
10865 return new;
10866 else
10867 return r_type;
10868 }
10869
10870 /* Here is where generate the appropriate reloc for pseudo relocation
10871 functions. */
10872 void
10873 ia64_validate_fix (fix)
10874 fixS *fix;
10875 {
10876 switch (fix->fx_r_type)
10877 {
10878 case BFD_RELOC_IA64_FPTR64I:
10879 case BFD_RELOC_IA64_FPTR32MSB:
10880 case BFD_RELOC_IA64_FPTR64LSB:
10881 case BFD_RELOC_IA64_LTOFF_FPTR22:
10882 case BFD_RELOC_IA64_LTOFF_FPTR64I:
10883 if (fix->fx_offset != 0)
10884 as_bad_where (fix->fx_file, fix->fx_line,
10885 "No addend allowed in @fptr() relocation");
10886 break;
10887 default:
10888 break;
10889 }
10890 }
10891
10892 static void
10893 fix_insn (fix, odesc, value)
10894 fixS *fix;
10895 const struct ia64_operand *odesc;
10896 valueT value;
10897 {
10898 bfd_vma insn[3], t0, t1, control_bits;
10899 const char *err;
10900 char *fixpos;
10901 long slot;
10902
10903 slot = fix->fx_where & 0x3;
10904 fixpos = fix->fx_frag->fr_literal + (fix->fx_where - slot);
10905
10906 /* Bundles are always in little-endian byte order */
10907 t0 = bfd_getl64 (fixpos);
10908 t1 = bfd_getl64 (fixpos + 8);
10909 control_bits = t0 & 0x1f;
10910 insn[0] = (t0 >> 5) & 0x1ffffffffffLL;
10911 insn[1] = ((t0 >> 46) & 0x3ffff) | ((t1 & 0x7fffff) << 18);
10912 insn[2] = (t1 >> 23) & 0x1ffffffffffLL;
10913
10914 err = NULL;
10915 if (odesc - elf64_ia64_operands == IA64_OPND_IMMU64)
10916 {
10917 insn[1] = (value >> 22) & 0x1ffffffffffLL;
10918 insn[2] |= (((value & 0x7f) << 13)
10919 | (((value >> 7) & 0x1ff) << 27)
10920 | (((value >> 16) & 0x1f) << 22)
10921 | (((value >> 21) & 0x1) << 21)
10922 | (((value >> 63) & 0x1) << 36));
10923 }
10924 else if (odesc - elf64_ia64_operands == IA64_OPND_IMMU62)
10925 {
10926 if (value & ~0x3fffffffffffffffULL)
10927 err = "integer operand out of range";
10928 insn[1] = (value >> 21) & 0x1ffffffffffLL;
10929 insn[2] |= (((value & 0xfffff) << 6) | (((value >> 20) & 0x1) << 36));
10930 }
10931 else if (odesc - elf64_ia64_operands == IA64_OPND_TGT64)
10932 {
10933 value >>= 4;
10934 insn[1] = ((value >> 20) & 0x7fffffffffLL) << 2;
10935 insn[2] |= ((((value >> 59) & 0x1) << 36)
10936 | (((value >> 0) & 0xfffff) << 13));
10937 }
10938 else
10939 err = (*odesc->insert) (odesc, value, insn + slot);
10940
10941 if (err)
10942 as_bad_where (fix->fx_file, fix->fx_line, err);
10943
10944 t0 = control_bits | (insn[0] << 5) | (insn[1] << 46);
10945 t1 = ((insn[1] >> 18) & 0x7fffff) | (insn[2] << 23);
10946 number_to_chars_littleendian (fixpos + 0, t0, 8);
10947 number_to_chars_littleendian (fixpos + 8, t1, 8);
10948 }
10949
10950 /* Attempt to simplify or even eliminate a fixup. The return value is
10951 ignored; perhaps it was once meaningful, but now it is historical.
10952 To indicate that a fixup has been eliminated, set FIXP->FX_DONE.
10953
10954 If fixp->fx_addsy is non-NULL, we'll have to generate a reloc entry
10955 (if possible). */
10956
10957 void
10958 md_apply_fix3 (fix, valP, seg)
10959 fixS *fix;
10960 valueT *valP;
10961 segT seg ATTRIBUTE_UNUSED;
10962 {
10963 char *fixpos;
10964 valueT value = *valP;
10965
10966 fixpos = fix->fx_frag->fr_literal + fix->fx_where;
10967
10968 if (fix->fx_pcrel)
10969 {
10970 switch (fix->fx_r_type)
10971 {
10972 case BFD_RELOC_IA64_DIR32MSB:
10973 fix->fx_r_type = BFD_RELOC_IA64_PCREL32MSB;
10974 break;
10975
10976 case BFD_RELOC_IA64_DIR32LSB:
10977 fix->fx_r_type = BFD_RELOC_IA64_PCREL32LSB;
10978 break;
10979
10980 case BFD_RELOC_IA64_DIR64MSB:
10981 fix->fx_r_type = BFD_RELOC_IA64_PCREL64MSB;
10982 break;
10983
10984 case BFD_RELOC_IA64_DIR64LSB:
10985 fix->fx_r_type = BFD_RELOC_IA64_PCREL64LSB;
10986 break;
10987
10988 default:
10989 break;
10990 }
10991 }
10992 if (fix->fx_addsy)
10993 {
10994 switch (fix->fx_r_type)
10995 {
10996 case BFD_RELOC_UNUSED:
10997 /* This must be a TAG13 or TAG13b operand. There are no external
10998 relocs defined for them, so we must give an error. */
10999 as_bad_where (fix->fx_file, fix->fx_line,
11000 "%s must have a constant value",
11001 elf64_ia64_operands[fix->tc_fix_data.opnd].desc);
11002 fix->fx_done = 1;
11003 return;
11004
11005 case BFD_RELOC_IA64_TPREL14:
11006 case BFD_RELOC_IA64_TPREL22:
11007 case BFD_RELOC_IA64_TPREL64I:
11008 case BFD_RELOC_IA64_LTOFF_TPREL22:
11009 case BFD_RELOC_IA64_LTOFF_DTPMOD22:
11010 case BFD_RELOC_IA64_DTPREL14:
11011 case BFD_RELOC_IA64_DTPREL22:
11012 case BFD_RELOC_IA64_DTPREL64I:
11013 case BFD_RELOC_IA64_LTOFF_DTPREL22:
11014 S_SET_THREAD_LOCAL (fix->fx_addsy);
11015 break;
11016
11017 default:
11018 break;
11019 }
11020 }
11021 else if (fix->tc_fix_data.opnd == IA64_OPND_NIL)
11022 {
11023 if (fix->tc_fix_data.bigendian)
11024 number_to_chars_bigendian (fixpos, value, fix->fx_size);
11025 else
11026 number_to_chars_littleendian (fixpos, value, fix->fx_size);
11027 fix->fx_done = 1;
11028 }
11029 else
11030 {
11031 fix_insn (fix, elf64_ia64_operands + fix->tc_fix_data.opnd, value);
11032 fix->fx_done = 1;
11033 }
11034 }
11035
11036 /* Generate the BFD reloc to be stuck in the object file from the
11037 fixup used internally in the assembler. */
11038
11039 arelent *
11040 tc_gen_reloc (sec, fixp)
11041 asection *sec ATTRIBUTE_UNUSED;
11042 fixS *fixp;
11043 {
11044 arelent *reloc;
11045
11046 reloc = xmalloc (sizeof (*reloc));
11047 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
11048 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
11049 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
11050 reloc->addend = fixp->fx_offset;
11051 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
11052
11053 if (!reloc->howto)
11054 {
11055 as_bad_where (fixp->fx_file, fixp->fx_line,
11056 "Cannot represent %s relocation in object file",
11057 bfd_get_reloc_code_name (fixp->fx_r_type));
11058 }
11059 return reloc;
11060 }
11061
11062 /* Turn a string in input_line_pointer into a floating point constant
11063 of type TYPE, and store the appropriate bytes in *LIT. The number
11064 of LITTLENUMS emitted is stored in *SIZE. An error message is
11065 returned, or NULL on OK. */
11066
11067 #define MAX_LITTLENUMS 5
11068
11069 char *
11070 md_atof (type, lit, size)
11071 int type;
11072 char *lit;
11073 int *size;
11074 {
11075 LITTLENUM_TYPE words[MAX_LITTLENUMS];
11076 char *t;
11077 int prec;
11078
11079 switch (type)
11080 {
11081 /* IEEE floats */
11082 case 'f':
11083 case 'F':
11084 case 's':
11085 case 'S':
11086 prec = 2;
11087 break;
11088
11089 case 'd':
11090 case 'D':
11091 case 'r':
11092 case 'R':
11093 prec = 4;
11094 break;
11095
11096 case 'x':
11097 case 'X':
11098 case 'p':
11099 case 'P':
11100 prec = 5;
11101 break;
11102
11103 default:
11104 *size = 0;
11105 return "Bad call to MD_ATOF()";
11106 }
11107 t = atof_ieee (input_line_pointer, type, words);
11108 if (t)
11109 input_line_pointer = t;
11110
11111 (*ia64_float_to_chars) (lit, words, prec);
11112
11113 if (type == 'X')
11114 {
11115 /* It is 10 byte floating point with 6 byte padding. */
11116 memset (&lit [10], 0, 6);
11117 *size = 8 * sizeof (LITTLENUM_TYPE);
11118 }
11119 else
11120 *size = prec * sizeof (LITTLENUM_TYPE);
11121
11122 return 0;
11123 }
11124
11125 /* Handle ia64 specific semantics of the align directive. */
11126
11127 void
11128 ia64_md_do_align (n, fill, len, max)
11129 int n ATTRIBUTE_UNUSED;
11130 const char *fill ATTRIBUTE_UNUSED;
11131 int len ATTRIBUTE_UNUSED;
11132 int max ATTRIBUTE_UNUSED;
11133 {
11134 if (subseg_text_p (now_seg))
11135 ia64_flush_insns ();
11136 }
11137
11138 /* This is called from HANDLE_ALIGN in write.c. Fill in the contents
11139 of an rs_align_code fragment. */
11140
11141 void
11142 ia64_handle_align (fragp)
11143 fragS *fragp;
11144 {
11145 /* Use mfi bundle of nops with no stop bits. */
11146 static const unsigned char le_nop[]
11147 = { 0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
11148 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00};
11149 static const unsigned char le_nop_stop[]
11150 = { 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
11151 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00};
11152
11153 int bytes;
11154 char *p;
11155 const unsigned char *nop;
11156
11157 if (fragp->fr_type != rs_align_code)
11158 return;
11159
11160 /* Check if this frag has to end with a stop bit. */
11161 nop = fragp->tc_frag_data ? le_nop_stop : le_nop;
11162
11163 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
11164 p = fragp->fr_literal + fragp->fr_fix;
11165
11166 /* If no paddings are needed, we check if we need a stop bit. */
11167 if (!bytes && fragp->tc_frag_data)
11168 {
11169 if (fragp->fr_fix < 16)
11170 #if 1
11171 /* FIXME: It won't work with
11172 .align 16
11173 alloc r32=ar.pfs,1,2,4,0
11174 */
11175 ;
11176 #else
11177 as_bad_where (fragp->fr_file, fragp->fr_line,
11178 _("Can't add stop bit to mark end of instruction group"));
11179 #endif
11180 else
11181 /* Bundles are always in little-endian byte order. Make sure
11182 the previous bundle has the stop bit. */
11183 *(p - 16) |= 1;
11184 }
11185
11186 /* Make sure we are on a 16-byte boundary, in case someone has been
11187 putting data into a text section. */
11188 if (bytes & 15)
11189 {
11190 int fix = bytes & 15;
11191 memset (p, 0, fix);
11192 p += fix;
11193 bytes -= fix;
11194 fragp->fr_fix += fix;
11195 }
11196
11197 /* Instruction bundles are always little-endian. */
11198 memcpy (p, nop, 16);
11199 fragp->fr_var = 16;
11200 }
11201
11202 static void
11203 ia64_float_to_chars_bigendian (char *lit, LITTLENUM_TYPE *words,
11204 int prec)
11205 {
11206 while (prec--)
11207 {
11208 number_to_chars_bigendian (lit, (long) (*words++),
11209 sizeof (LITTLENUM_TYPE));
11210 lit += sizeof (LITTLENUM_TYPE);
11211 }
11212 }
11213
11214 static void
11215 ia64_float_to_chars_littleendian (char *lit, LITTLENUM_TYPE *words,
11216 int prec)
11217 {
11218 while (prec--)
11219 {
11220 number_to_chars_littleendian (lit, (long) (words[prec]),
11221 sizeof (LITTLENUM_TYPE));
11222 lit += sizeof (LITTLENUM_TYPE);
11223 }
11224 }
11225
11226 void
11227 ia64_elf_section_change_hook (void)
11228 {
11229 if (elf_section_type (now_seg) == SHT_IA_64_UNWIND
11230 && elf_linked_to_section (now_seg) == NULL)
11231 elf_linked_to_section (now_seg) = text_section;
11232 dot_byteorder (-1);
11233 }
11234
11235 /* Check if a label should be made global. */
11236 void
11237 ia64_check_label (symbolS *label)
11238 {
11239 if (*input_line_pointer == ':')
11240 {
11241 S_SET_EXTERNAL (label);
11242 input_line_pointer++;
11243 }
11244 }
11245
11246 /* Used to remember where .alias and .secalias directives are seen. We
11247 will rename symbol and section names when we are about to output
11248 the relocatable file. */
11249 struct alias
11250 {
11251 char *file; /* The file where the directive is seen. */
11252 unsigned int line; /* The line number the directive is at. */
11253 const char *name; /* The orignale name of the symbol. */
11254 };
11255
11256 /* Called for .alias and .secalias directives. If SECTION is 1, it is
11257 .secalias. Otherwise, it is .alias. */
11258 static void
11259 dot_alias (int section)
11260 {
11261 char *name, *alias;
11262 char delim;
11263 char *end_name;
11264 int len;
11265 const char *error_string;
11266 struct alias *h;
11267 const char *a;
11268 struct hash_control *ahash, *nhash;
11269 const char *kind;
11270
11271 name = input_line_pointer;
11272 delim = get_symbol_end ();
11273 end_name = input_line_pointer;
11274 *end_name = delim;
11275
11276 if (name == end_name)
11277 {
11278 as_bad (_("expected symbol name"));
11279 discard_rest_of_line ();
11280 return;
11281 }
11282
11283 SKIP_WHITESPACE ();
11284
11285 if (*input_line_pointer != ',')
11286 {
11287 *end_name = 0;
11288 as_bad (_("expected comma after \"%s\""), name);
11289 *end_name = delim;
11290 ignore_rest_of_line ();
11291 return;
11292 }
11293
11294 input_line_pointer++;
11295 *end_name = 0;
11296
11297 /* We call demand_copy_C_string to check if alias string is valid.
11298 There should be a closing `"' and no `\0' in the string. */
11299 alias = demand_copy_C_string (&len);
11300 if (alias == NULL)
11301 {
11302 ignore_rest_of_line ();
11303 return;
11304 }
11305
11306 /* Make a copy of name string. */
11307 len = strlen (name) + 1;
11308 obstack_grow (&notes, name, len);
11309 name = obstack_finish (&notes);
11310
11311 if (section)
11312 {
11313 kind = "section";
11314 ahash = secalias_hash;
11315 nhash = secalias_name_hash;
11316 }
11317 else
11318 {
11319 kind = "symbol";
11320 ahash = alias_hash;
11321 nhash = alias_name_hash;
11322 }
11323
11324 /* Check if alias has been used before. */
11325 h = (struct alias *) hash_find (ahash, alias);
11326 if (h)
11327 {
11328 if (strcmp (h->name, name))
11329 as_bad (_("`%s' is already the alias of %s `%s'"),
11330 alias, kind, h->name);
11331 goto out;
11332 }
11333
11334 /* Check if name already has an alias. */
11335 a = (const char *) hash_find (nhash, name);
11336 if (a)
11337 {
11338 if (strcmp (a, alias))
11339 as_bad (_("%s `%s' already has an alias `%s'"), kind, name, a);
11340 goto out;
11341 }
11342
11343 h = (struct alias *) xmalloc (sizeof (struct alias));
11344 as_where (&h->file, &h->line);
11345 h->name = name;
11346
11347 error_string = hash_jam (ahash, alias, (PTR) h);
11348 if (error_string)
11349 {
11350 as_fatal (_("inserting \"%s\" into %s alias hash table failed: %s"),
11351 alias, kind, error_string);
11352 goto out;
11353 }
11354
11355 error_string = hash_jam (nhash, name, (PTR) alias);
11356 if (error_string)
11357 {
11358 as_fatal (_("inserting \"%s\" into %s name hash table failed: %s"),
11359 alias, kind, error_string);
11360 out:
11361 obstack_free (&notes, name);
11362 obstack_free (&notes, alias);
11363 }
11364
11365 demand_empty_rest_of_line ();
11366 }
11367
11368 /* It renames the original symbol name to its alias. */
11369 static void
11370 do_alias (const char *alias, PTR value)
11371 {
11372 struct alias *h = (struct alias *) value;
11373 symbolS *sym = symbol_find (h->name);
11374
11375 if (sym == NULL)
11376 as_warn_where (h->file, h->line,
11377 _("symbol `%s' aliased to `%s' is not used"),
11378 h->name, alias);
11379 else
11380 S_SET_NAME (sym, (char *) alias);
11381 }
11382
11383 /* Called from write_object_file. */
11384 void
11385 ia64_adjust_symtab (void)
11386 {
11387 hash_traverse (alias_hash, do_alias);
11388 }
11389
11390 /* It renames the original section name to its alias. */
11391 static void
11392 do_secalias (const char *alias, PTR value)
11393 {
11394 struct alias *h = (struct alias *) value;
11395 segT sec = bfd_get_section_by_name (stdoutput, h->name);
11396
11397 if (sec == NULL)
11398 as_warn_where (h->file, h->line,
11399 _("section `%s' aliased to `%s' is not used"),
11400 h->name, alias);
11401 else
11402 sec->name = alias;
11403 }
11404
11405 /* Called from write_object_file. */
11406 void
11407 ia64_frob_file (void)
11408 {
11409 hash_traverse (secalias_hash, do_secalias);
11410 }
This page took 0.289264 seconds and 4 git commands to generate.