Fix unwind offset for start_symbol.
[deliverable/binutils-gdb.git] / gas / config / tc-hppa.c
1 /* tc-hppa.c -- Assemble for the PA
2 Copyright (C) 1989-2018 Free Software Foundation, Inc.
3
4 This file is part of GAS, the GNU Assembler.
5
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19 02110-1301, USA. */
20
21 /* HP PA-RISC support was contributed by the Center for Software Science
22 at the University of Utah. */
23
24 #include "as.h"
25 #include "safe-ctype.h"
26 #include "struc-symbol.h"
27 #include "subsegs.h"
28 #include "dw2gencfi.h"
29
30 #include "bfd/libhppa.h"
31
32 /* Be careful, this file includes data *declarations*. */
33 #include "opcode/hppa.h"
34
35 #if defined (OBJ_ELF) && defined (OBJ_SOM)
36 error only one of OBJ_ELF and OBJ_SOM can be defined
37 #endif
38
39 /* If we are using ELF, then we probably can support dwarf2 debug
40 records. Furthermore, if we are supporting dwarf2 debug records,
41 then we want to use the assembler support for compact line numbers. */
42 #ifdef OBJ_ELF
43 #include "dwarf2dbg.h"
44
45 /* A "convenient" place to put object file dependencies which do
46 not need to be seen outside of tc-hppa.c. */
47
48 /* Object file formats specify relocation types. */
49 typedef enum elf_hppa_reloc_type reloc_type;
50
51 /* Object file formats specify BFD symbol types. */
52 typedef elf_symbol_type obj_symbol_type;
53 #define symbol_arg_reloc_info(sym)\
54 (((obj_symbol_type *) symbol_get_bfdsym (sym))->tc_data.hppa_arg_reloc)
55
56 #if TARGET_ARCH_SIZE == 64
57 /* How to generate a relocation. */
58 #define hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
59 #define elf_hppa_reloc_final_type elf64_hppa_reloc_final_type
60 #else
61 #define hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
62 #define elf_hppa_reloc_final_type elf32_hppa_reloc_final_type
63 #endif
64
65 /* ELF objects can have versions, but apparently do not have anywhere
66 to store a copyright string. */
67 #define obj_version obj_elf_version
68 #define obj_copyright obj_elf_version
69
70 #define UNWIND_SECTION_NAME ".PARISC.unwind"
71 #endif /* OBJ_ELF */
72
73 #ifdef OBJ_SOM
74 /* Names of various debugging spaces/subspaces. */
75 #define GDB_DEBUG_SPACE_NAME "$GDB_DEBUG$"
76 #define GDB_STRINGS_SUBSPACE_NAME "$GDB_STRINGS$"
77 #define GDB_SYMBOLS_SUBSPACE_NAME "$GDB_SYMBOLS$"
78 #define UNWIND_SECTION_NAME "$UNWIND$"
79
80 /* Object file formats specify relocation types. */
81 typedef int reloc_type;
82
83 /* SOM objects can have both a version string and a copyright string. */
84 #define obj_version obj_som_version
85 #define obj_copyright obj_som_copyright
86
87 /* How to generate a relocation. */
88 #define hppa_gen_reloc_type hppa_som_gen_reloc_type
89
90 /* Object file formats specify BFD symbol types. */
91 typedef som_symbol_type obj_symbol_type;
92 #define symbol_arg_reloc_info(sym)\
93 (((obj_symbol_type *) symbol_get_bfdsym (sym))->tc_data.ap.hppa_arg_reloc)
94
95 /* This apparently isn't in older versions of hpux reloc.h. */
96 #ifndef R_DLT_REL
97 #define R_DLT_REL 0x78
98 #endif
99
100 #ifndef R_N0SEL
101 #define R_N0SEL 0xd8
102 #endif
103
104 #ifndef R_N1SEL
105 #define R_N1SEL 0xd9
106 #endif
107 #endif /* OBJ_SOM */
108
109 #if TARGET_ARCH_SIZE == 64
110 #define DEFAULT_LEVEL 25
111 #else
112 #define DEFAULT_LEVEL 10
113 #endif
114
115 /* Various structures and types used internally in tc-hppa.c. */
116
117 /* Unwind table and descriptor. FIXME: Sync this with GDB version. */
118
119 struct unwind_desc
120 {
121 unsigned int cannot_unwind:1;
122 unsigned int millicode:1;
123 unsigned int millicode_save_rest:1;
124 unsigned int region_desc:2;
125 unsigned int save_sr:2;
126 unsigned int entry_fr:4;
127 unsigned int entry_gr:5;
128 unsigned int args_stored:1;
129 unsigned int call_fr:5;
130 unsigned int call_gr:5;
131 unsigned int save_sp:1;
132 unsigned int save_rp:1;
133 unsigned int save_rp_in_frame:1;
134 unsigned int extn_ptr_defined:1;
135 unsigned int cleanup_defined:1;
136
137 unsigned int hpe_interrupt_marker:1;
138 unsigned int hpux_interrupt_marker:1;
139 unsigned int reserved:3;
140 unsigned int frame_size:27;
141 };
142
143 /* We can't rely on compilers placing bitfields in any particular
144 place, so use these macros when dumping unwind descriptors to
145 object files. */
146 #define UNWIND_LOW32(U) \
147 (((U)->cannot_unwind << 31) \
148 | ((U)->millicode << 30) \
149 | ((U)->millicode_save_rest << 29) \
150 | ((U)->region_desc << 27) \
151 | ((U)->save_sr << 25) \
152 | ((U)->entry_fr << 21) \
153 | ((U)->entry_gr << 16) \
154 | ((U)->args_stored << 15) \
155 | ((U)->call_fr << 10) \
156 | ((U)->call_gr << 5) \
157 | ((U)->save_sp << 4) \
158 | ((U)->save_rp << 3) \
159 | ((U)->save_rp_in_frame << 2) \
160 | ((U)->extn_ptr_defined << 1) \
161 | ((U)->cleanup_defined << 0))
162
163 #define UNWIND_HIGH32(U) \
164 (((U)->hpe_interrupt_marker << 31) \
165 | ((U)->hpux_interrupt_marker << 30) \
166 | ((U)->frame_size << 0))
167
168 struct unwind_table
169 {
170 /* Starting and ending offsets of the region described by
171 descriptor. */
172 unsigned int start_offset;
173 unsigned int end_offset;
174 struct unwind_desc descriptor;
175 };
176
177 /* This structure is used by the .callinfo, .enter, .leave pseudo-ops to
178 control the entry and exit code they generate. It is also used in
179 creation of the correct stack unwind descriptors.
180
181 NOTE: GAS does not support .enter and .leave for the generation of
182 prologues and epilogues. FIXME.
183
184 The fields in structure roughly correspond to the arguments available on the
185 .callinfo pseudo-op. */
186
187 struct call_info
188 {
189 /* The unwind descriptor being built. */
190 struct unwind_table ci_unwind;
191
192 /* Name of this function. */
193 symbolS *start_symbol;
194
195 /* (temporary) symbol used to mark the end of this function. */
196 symbolS *end_symbol;
197
198 /* Next entry in the chain. */
199 struct call_info *ci_next;
200 };
201
202 /* Operand formats for FP instructions. Note not all FP instructions
203 allow all four formats to be used (for example fmpysub only allows
204 SGL and DBL). */
205 typedef enum
206 {
207 SGL, DBL, ILLEGAL_FMT, QUAD, W, UW, DW, UDW, QW, UQW
208 }
209 fp_operand_format;
210
211 /* This fully describes the symbol types which may be attached to
212 an EXPORT or IMPORT directive. Only SOM uses this formation
213 (ELF has no need for it). */
214 typedef enum
215 {
216 SYMBOL_TYPE_UNKNOWN,
217 SYMBOL_TYPE_ABSOLUTE,
218 SYMBOL_TYPE_CODE,
219 SYMBOL_TYPE_DATA,
220 SYMBOL_TYPE_ENTRY,
221 SYMBOL_TYPE_MILLICODE,
222 SYMBOL_TYPE_PLABEL,
223 SYMBOL_TYPE_PRI_PROG,
224 SYMBOL_TYPE_SEC_PROG,
225 }
226 pa_symbol_type;
227
228 /* This structure contains information needed to assemble
229 individual instructions. */
230 struct pa_it
231 {
232 /* Holds the opcode after parsing by pa_ip. */
233 unsigned long opcode;
234
235 /* Holds an expression associated with the current instruction. */
236 expressionS exp;
237
238 /* Does this instruction use PC-relative addressing. */
239 int pcrel;
240
241 /* Floating point formats for operand1 and operand2. */
242 fp_operand_format fpof1;
243 fp_operand_format fpof2;
244
245 /* Whether or not we saw a truncation request on an fcnv insn. */
246 int trunc;
247
248 /* Holds the field selector for this instruction
249 (for example L%, LR%, etc). */
250 long field_selector;
251
252 /* Holds any argument relocation bits associated with this
253 instruction. (instruction should be some sort of call). */
254 unsigned int arg_reloc;
255
256 /* The format specification for this instruction. */
257 int format;
258
259 /* The relocation (if any) associated with this instruction. */
260 reloc_type reloc;
261 };
262
263 /* PA-89 floating point registers are arranged like this:
264
265 +--------------+--------------+
266 | 0 or 16L | 16 or 16R |
267 +--------------+--------------+
268 | 1 or 17L | 17 or 17R |
269 +--------------+--------------+
270 | | |
271
272 . . .
273 . . .
274 . . .
275
276 | | |
277 +--------------+--------------+
278 | 14 or 30L | 30 or 30R |
279 +--------------+--------------+
280 | 15 or 31L | 31 or 31R |
281 +--------------+--------------+ */
282
283 /* Additional information needed to build argument relocation stubs. */
284 struct call_desc
285 {
286 /* The argument relocation specification. */
287 unsigned int arg_reloc;
288
289 /* Number of arguments. */
290 unsigned int arg_count;
291 };
292
293 #ifdef OBJ_SOM
294 /* This structure defines an entry in the subspace dictionary
295 chain. */
296
297 struct subspace_dictionary_chain
298 {
299 /* Nonzero if this space has been defined by the user code. */
300 unsigned int ssd_defined;
301
302 /* Name of this subspace. */
303 char *ssd_name;
304
305 /* GAS segment and subsegment associated with this subspace. */
306 asection *ssd_seg;
307 int ssd_subseg;
308
309 /* Next space in the subspace dictionary chain. */
310 struct subspace_dictionary_chain *ssd_next;
311 };
312
313 typedef struct subspace_dictionary_chain ssd_chain_struct;
314
315 /* This structure defines an entry in the subspace dictionary
316 chain. */
317
318 struct space_dictionary_chain
319 {
320 /* Nonzero if this space has been defined by the user code or
321 as a default space. */
322 unsigned int sd_defined;
323
324 /* Nonzero if this spaces has been defined by the user code. */
325 unsigned int sd_user_defined;
326
327 /* The space number (or index). */
328 unsigned int sd_spnum;
329
330 /* The name of this subspace. */
331 char *sd_name;
332
333 /* GAS segment to which this subspace corresponds. */
334 asection *sd_seg;
335
336 /* Current subsegment number being used. */
337 int sd_last_subseg;
338
339 /* The chain of subspaces contained within this space. */
340 ssd_chain_struct *sd_subspaces;
341
342 /* The next entry in the space dictionary chain. */
343 struct space_dictionary_chain *sd_next;
344 };
345
346 typedef struct space_dictionary_chain sd_chain_struct;
347
348 /* This structure defines attributes of the default subspace
349 dictionary entries. */
350
351 struct default_subspace_dict
352 {
353 /* Name of the subspace. */
354 const char *name;
355
356 /* FIXME. Is this still needed? */
357 char defined;
358
359 /* Nonzero if this subspace is loadable. */
360 char loadable;
361
362 /* Nonzero if this subspace contains only code. */
363 char code_only;
364
365 /* Nonzero if this is a comdat subspace. */
366 char comdat;
367
368 /* Nonzero if this is a common subspace. */
369 char common;
370
371 /* Nonzero if this is a common subspace which allows symbols
372 to be multiply defined. */
373 char dup_common;
374
375 /* Nonzero if this subspace should be zero filled. */
376 char zero;
377
378 /* Sort key for this subspace. */
379 unsigned char sort;
380
381 /* Access control bits for this subspace. Can represent RWX access
382 as well as privilege level changes for gateways. */
383 int access;
384
385 /* Index of containing space. */
386 int space_index;
387
388 /* Alignment (in bytes) of this subspace. */
389 int alignment;
390
391 /* Quadrant within space where this subspace should be loaded. */
392 int quadrant;
393
394 /* An index into the default spaces array. */
395 int def_space_index;
396
397 /* Subsegment associated with this subspace. */
398 subsegT subsegment;
399 };
400
401 /* This structure defines attributes of the default space
402 dictionary entries. */
403
404 struct default_space_dict
405 {
406 /* Name of the space. */
407 const char *name;
408
409 /* Space number. It is possible to identify spaces within
410 assembly code numerically! */
411 int spnum;
412
413 /* Nonzero if this space is loadable. */
414 char loadable;
415
416 /* Nonzero if this space is "defined". FIXME is still needed */
417 char defined;
418
419 /* Nonzero if this space can not be shared. */
420 char private;
421
422 /* Sort key for this space. */
423 unsigned char sort;
424
425 /* Segment associated with this space. */
426 asection *segment;
427 };
428 #endif
429
430 /* Structure for previous label tracking. Needed so that alignments,
431 callinfo declarations, etc can be easily attached to a particular
432 label. */
433 typedef struct label_symbol_struct
434 {
435 struct symbol *lss_label;
436 #ifdef OBJ_SOM
437 sd_chain_struct *lss_space;
438 #endif
439 #ifdef OBJ_ELF
440 segT lss_segment;
441 #endif
442 struct label_symbol_struct *lss_next;
443 }
444 label_symbol_struct;
445
446 /* Extra information needed to perform fixups (relocations) on the PA. */
447 struct hppa_fix_struct
448 {
449 /* The field selector. */
450 enum hppa_reloc_field_selector_type_alt fx_r_field;
451
452 /* Type of fixup. */
453 int fx_r_type;
454
455 /* Format of fixup. */
456 int fx_r_format;
457
458 /* Argument relocation bits. */
459 unsigned int fx_arg_reloc;
460
461 /* The segment this fixup appears in. */
462 segT segment;
463 };
464
465 /* Structure to hold information about predefined registers. */
466
467 struct pd_reg
468 {
469 const char *name;
470 int value;
471 };
472
473 /* This structure defines the mapping from a FP condition string
474 to a condition number which can be recorded in an instruction. */
475 struct fp_cond_map
476 {
477 const char *string;
478 int cond;
479 };
480
481 /* This structure defines a mapping from a field selector
482 string to a field selector type. */
483 struct selector_entry
484 {
485 const char *prefix;
486 int field_selector;
487 };
488
489 /* Prototypes for functions local to tc-hppa.c. */
490
491 #ifdef OBJ_SOM
492 static void pa_check_current_space_and_subspace (void);
493 #endif
494
495 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
496 static void pa_text (int);
497 static void pa_data (int);
498 static void pa_comm (int);
499 #endif
500 #ifdef OBJ_SOM
501 static int exact_log2 (int);
502 static void pa_compiler (int);
503 static void pa_align (int);
504 static void pa_space (int);
505 static void pa_spnum (int);
506 static void pa_subspace (int);
507 static sd_chain_struct *create_new_space (const char *, int, int,
508 int, int, int,
509 asection *, int);
510 static ssd_chain_struct *create_new_subspace (sd_chain_struct *,
511 const char *, int, int,
512 int, int, int, int,
513 int, int, int, int,
514 int, asection *);
515 static ssd_chain_struct *update_subspace (sd_chain_struct *,
516 char *, int, int, int,
517 int, int, int, int,
518 int, int, int, int,
519 asection *);
520 static sd_chain_struct *is_defined_space (const char *);
521 static ssd_chain_struct *is_defined_subspace (const char *);
522 static sd_chain_struct *pa_segment_to_space (asection *);
523 static ssd_chain_struct *pa_subsegment_to_subspace (asection *,
524 subsegT);
525 static sd_chain_struct *pa_find_space_by_number (int);
526 static unsigned int pa_subspace_start (sd_chain_struct *, int);
527 static sd_chain_struct *pa_parse_space_stmt (const char *, int);
528 #endif
529
530 /* File and globally scoped variable declarations. */
531
532 #ifdef OBJ_SOM
533 /* Root and final entry in the space chain. */
534 static sd_chain_struct *space_dict_root;
535 static sd_chain_struct *space_dict_last;
536
537 /* The current space and subspace. */
538 static sd_chain_struct *current_space;
539 static ssd_chain_struct *current_subspace;
540 #endif
541
542 /* Root of the call_info chain. */
543 static struct call_info *call_info_root;
544
545 /* The last call_info (for functions) structure
546 seen so it can be associated with fixups and
547 function labels. */
548 static struct call_info *last_call_info;
549
550 /* The last call description (for actual calls). */
551 static struct call_desc last_call_desc;
552
553 /* handle of the OPCODE hash table */
554 static struct hash_control *op_hash = NULL;
555
556 /* These characters can be suffixes of opcode names and they may be
557 followed by meaningful whitespace. We don't include `,' and `!'
558 as they never appear followed by meaningful whitespace. */
559 const char hppa_symbol_chars[] = "*?=<>";
560
561 /* This array holds the chars that only start a comment at the beginning of
562 a line. If the line seems to have the form '# 123 filename'
563 .line and .file directives will appear in the pre-processed output.
564
565 Note that input_file.c hand checks for '#' at the beginning of the
566 first line of the input file. This is because the compiler outputs
567 #NO_APP at the beginning of its output.
568
569 Also note that C style comments will always work. */
570 const char line_comment_chars[] = "#";
571
572 /* This array holds the chars that always start a comment. If the
573 pre-processor is disabled, these aren't very useful. */
574 const char comment_chars[] = ";";
575
576 /* This array holds the characters which act as line separators. */
577 const char line_separator_chars[] = "!";
578
579 /* Chars that can be used to separate mant from exp in floating point nums. */
580 const char EXP_CHARS[] = "eE";
581
582 /* Chars that mean this number is a floating point constant.
583 As in 0f12.456 or 0d1.2345e12.
584
585 Be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
586 changed in read.c. Ideally it shouldn't have to know about it
587 at all, but nothing is ideal around here. */
588 const char FLT_CHARS[] = "rRsSfFdDxXpP";
589
590 static struct pa_it the_insn;
591
592 /* Points to the end of an expression just parsed by get_expression
593 and friends. FIXME. This shouldn't be handled with a file-global
594 variable. */
595 static char *expr_end;
596
597 /* Nonzero if a .callinfo appeared within the current procedure. */
598 static int callinfo_found;
599
600 /* Nonzero if the assembler is currently within a .entry/.exit pair. */
601 static int within_entry_exit;
602
603 /* Nonzero if the assembler is currently within a procedure definition. */
604 static int within_procedure;
605
606 /* Handle on structure which keep track of the last symbol
607 seen in each subspace. */
608 static label_symbol_struct *label_symbols_rootp = NULL;
609
610 /* Last label symbol */
611 static label_symbol_struct last_label_symbol;
612
613 /* Nonzero when strict matching is enabled. Zero otherwise.
614
615 Each opcode in the table has a flag which indicates whether or
616 not strict matching should be enabled for that instruction.
617
618 Mainly, strict causes errors to be ignored when a match failure
619 occurs. However, it also affects the parsing of register fields
620 by pa_parse_number. */
621 static int strict;
622
623 /* pa_parse_number returns values in `pa_number'. Mostly
624 pa_parse_number is used to return a register number, with floating
625 point registers being numbered from FP_REG_BASE upwards.
626 The bit specified with FP_REG_RSEL is set if the floating point
627 register has a `r' suffix. */
628 #define FP_REG_BASE 64
629 #define FP_REG_RSEL 128
630 static int pa_number;
631
632 #ifdef OBJ_SOM
633 /* A dummy bfd symbol so that all relocations have symbols of some kind. */
634 static symbolS *dummy_symbol;
635 #endif
636
637 /* Nonzero if errors are to be printed. */
638 static int print_errors = 1;
639
640 /* List of registers that are pre-defined:
641
642 Each general register has one predefined name of the form
643 %r<REGNUM> which has the value <REGNUM>.
644
645 Space and control registers are handled in a similar manner,
646 but use %sr<REGNUM> and %cr<REGNUM> as their predefined names.
647
648 Likewise for the floating point registers, but of the form
649 %fr<REGNUM>. Floating point registers have additional predefined
650 names with 'L' and 'R' suffixes (e.g. %fr19L, %fr19R) which
651 again have the value <REGNUM>.
652
653 Many registers also have synonyms:
654
655 %r26 - %r23 have %arg0 - %arg3 as synonyms
656 %r28 - %r29 have %ret0 - %ret1 as synonyms
657 %fr4 - %fr7 have %farg0 - %farg3 as synonyms
658 %r30 has %sp as a synonym
659 %r27 has %dp as a synonym
660 %r2 has %rp as a synonym
661
662 Almost every control register has a synonym; they are not listed
663 here for brevity.
664
665 The table is sorted. Suitable for searching by a binary search. */
666
667 static const struct pd_reg pre_defined_registers[] =
668 {
669 {"%arg0", 26},
670 {"%arg1", 25},
671 {"%arg2", 24},
672 {"%arg3", 23},
673 {"%cr0", 0},
674 {"%cr10", 10},
675 {"%cr11", 11},
676 {"%cr12", 12},
677 {"%cr13", 13},
678 {"%cr14", 14},
679 {"%cr15", 15},
680 {"%cr16", 16},
681 {"%cr17", 17},
682 {"%cr18", 18},
683 {"%cr19", 19},
684 {"%cr20", 20},
685 {"%cr21", 21},
686 {"%cr22", 22},
687 {"%cr23", 23},
688 {"%cr24", 24},
689 {"%cr25", 25},
690 {"%cr26", 26},
691 {"%cr27", 27},
692 {"%cr28", 28},
693 {"%cr29", 29},
694 {"%cr30", 30},
695 {"%cr31", 31},
696 {"%cr8", 8},
697 {"%cr9", 9},
698 {"%dp", 27},
699 {"%eiem", 15},
700 {"%eirr", 23},
701 {"%farg0", 4 + FP_REG_BASE},
702 {"%farg1", 5 + FP_REG_BASE},
703 {"%farg2", 6 + FP_REG_BASE},
704 {"%farg3", 7 + FP_REG_BASE},
705 {"%fr0", 0 + FP_REG_BASE},
706 {"%fr0l", 0 + FP_REG_BASE},
707 {"%fr0r", 0 + FP_REG_BASE + FP_REG_RSEL},
708 {"%fr1", 1 + FP_REG_BASE},
709 {"%fr10", 10 + FP_REG_BASE},
710 {"%fr10l", 10 + FP_REG_BASE},
711 {"%fr10r", 10 + FP_REG_BASE + FP_REG_RSEL},
712 {"%fr11", 11 + FP_REG_BASE},
713 {"%fr11l", 11 + FP_REG_BASE},
714 {"%fr11r", 11 + FP_REG_BASE + FP_REG_RSEL},
715 {"%fr12", 12 + FP_REG_BASE},
716 {"%fr12l", 12 + FP_REG_BASE},
717 {"%fr12r", 12 + FP_REG_BASE + FP_REG_RSEL},
718 {"%fr13", 13 + FP_REG_BASE},
719 {"%fr13l", 13 + FP_REG_BASE},
720 {"%fr13r", 13 + FP_REG_BASE + FP_REG_RSEL},
721 {"%fr14", 14 + FP_REG_BASE},
722 {"%fr14l", 14 + FP_REG_BASE},
723 {"%fr14r", 14 + FP_REG_BASE + FP_REG_RSEL},
724 {"%fr15", 15 + FP_REG_BASE},
725 {"%fr15l", 15 + FP_REG_BASE},
726 {"%fr15r", 15 + FP_REG_BASE + FP_REG_RSEL},
727 {"%fr16", 16 + FP_REG_BASE},
728 {"%fr16l", 16 + FP_REG_BASE},
729 {"%fr16r", 16 + FP_REG_BASE + FP_REG_RSEL},
730 {"%fr17", 17 + FP_REG_BASE},
731 {"%fr17l", 17 + FP_REG_BASE},
732 {"%fr17r", 17 + FP_REG_BASE + FP_REG_RSEL},
733 {"%fr18", 18 + FP_REG_BASE},
734 {"%fr18l", 18 + FP_REG_BASE},
735 {"%fr18r", 18 + FP_REG_BASE + FP_REG_RSEL},
736 {"%fr19", 19 + FP_REG_BASE},
737 {"%fr19l", 19 + FP_REG_BASE},
738 {"%fr19r", 19 + FP_REG_BASE + FP_REG_RSEL},
739 {"%fr1l", 1 + FP_REG_BASE},
740 {"%fr1r", 1 + FP_REG_BASE + FP_REG_RSEL},
741 {"%fr2", 2 + FP_REG_BASE},
742 {"%fr20", 20 + FP_REG_BASE},
743 {"%fr20l", 20 + FP_REG_BASE},
744 {"%fr20r", 20 + FP_REG_BASE + FP_REG_RSEL},
745 {"%fr21", 21 + FP_REG_BASE},
746 {"%fr21l", 21 + FP_REG_BASE},
747 {"%fr21r", 21 + FP_REG_BASE + FP_REG_RSEL},
748 {"%fr22", 22 + FP_REG_BASE},
749 {"%fr22l", 22 + FP_REG_BASE},
750 {"%fr22r", 22 + FP_REG_BASE + FP_REG_RSEL},
751 {"%fr23", 23 + FP_REG_BASE},
752 {"%fr23l", 23 + FP_REG_BASE},
753 {"%fr23r", 23 + FP_REG_BASE + FP_REG_RSEL},
754 {"%fr24", 24 + FP_REG_BASE},
755 {"%fr24l", 24 + FP_REG_BASE},
756 {"%fr24r", 24 + FP_REG_BASE + FP_REG_RSEL},
757 {"%fr25", 25 + FP_REG_BASE},
758 {"%fr25l", 25 + FP_REG_BASE},
759 {"%fr25r", 25 + FP_REG_BASE + FP_REG_RSEL},
760 {"%fr26", 26 + FP_REG_BASE},
761 {"%fr26l", 26 + FP_REG_BASE},
762 {"%fr26r", 26 + FP_REG_BASE + FP_REG_RSEL},
763 {"%fr27", 27 + FP_REG_BASE},
764 {"%fr27l", 27 + FP_REG_BASE},
765 {"%fr27r", 27 + FP_REG_BASE + FP_REG_RSEL},
766 {"%fr28", 28 + FP_REG_BASE},
767 {"%fr28l", 28 + FP_REG_BASE},
768 {"%fr28r", 28 + FP_REG_BASE + FP_REG_RSEL},
769 {"%fr29", 29 + FP_REG_BASE},
770 {"%fr29l", 29 + FP_REG_BASE},
771 {"%fr29r", 29 + FP_REG_BASE + FP_REG_RSEL},
772 {"%fr2l", 2 + FP_REG_BASE},
773 {"%fr2r", 2 + FP_REG_BASE + FP_REG_RSEL},
774 {"%fr3", 3 + FP_REG_BASE},
775 {"%fr30", 30 + FP_REG_BASE},
776 {"%fr30l", 30 + FP_REG_BASE},
777 {"%fr30r", 30 + FP_REG_BASE + FP_REG_RSEL},
778 {"%fr31", 31 + FP_REG_BASE},
779 {"%fr31l", 31 + FP_REG_BASE},
780 {"%fr31r", 31 + FP_REG_BASE + FP_REG_RSEL},
781 {"%fr3l", 3 + FP_REG_BASE},
782 {"%fr3r", 3 + FP_REG_BASE + FP_REG_RSEL},
783 {"%fr4", 4 + FP_REG_BASE},
784 {"%fr4l", 4 + FP_REG_BASE},
785 {"%fr4r", 4 + FP_REG_BASE + FP_REG_RSEL},
786 {"%fr5", 5 + FP_REG_BASE},
787 {"%fr5l", 5 + FP_REG_BASE},
788 {"%fr5r", 5 + FP_REG_BASE + FP_REG_RSEL},
789 {"%fr6", 6 + FP_REG_BASE},
790 {"%fr6l", 6 + FP_REG_BASE},
791 {"%fr6r", 6 + FP_REG_BASE + FP_REG_RSEL},
792 {"%fr7", 7 + FP_REG_BASE},
793 {"%fr7l", 7 + FP_REG_BASE},
794 {"%fr7r", 7 + FP_REG_BASE + FP_REG_RSEL},
795 {"%fr8", 8 + FP_REG_BASE},
796 {"%fr8l", 8 + FP_REG_BASE},
797 {"%fr8r", 8 + FP_REG_BASE + FP_REG_RSEL},
798 {"%fr9", 9 + FP_REG_BASE},
799 {"%fr9l", 9 + FP_REG_BASE},
800 {"%fr9r", 9 + FP_REG_BASE + FP_REG_RSEL},
801 {"%fret", 4},
802 {"%hta", 25},
803 {"%iir", 19},
804 {"%ior", 21},
805 {"%ipsw", 22},
806 {"%isr", 20},
807 {"%itmr", 16},
808 {"%iva", 14},
809 #if TARGET_ARCH_SIZE == 64
810 {"%mrp", 2},
811 #else
812 {"%mrp", 31},
813 #endif
814 {"%pcoq", 18},
815 {"%pcsq", 17},
816 {"%pidr1", 8},
817 {"%pidr2", 9},
818 {"%pidr3", 12},
819 {"%pidr4", 13},
820 {"%ppda", 24},
821 {"%r0", 0},
822 {"%r1", 1},
823 {"%r10", 10},
824 {"%r11", 11},
825 {"%r12", 12},
826 {"%r13", 13},
827 {"%r14", 14},
828 {"%r15", 15},
829 {"%r16", 16},
830 {"%r17", 17},
831 {"%r18", 18},
832 {"%r19", 19},
833 {"%r2", 2},
834 {"%r20", 20},
835 {"%r21", 21},
836 {"%r22", 22},
837 {"%r23", 23},
838 {"%r24", 24},
839 {"%r25", 25},
840 {"%r26", 26},
841 {"%r27", 27},
842 {"%r28", 28},
843 {"%r29", 29},
844 {"%r3", 3},
845 {"%r30", 30},
846 {"%r31", 31},
847 {"%r4", 4},
848 {"%r5", 5},
849 {"%r6", 6},
850 {"%r7", 7},
851 {"%r8", 8},
852 {"%r9", 9},
853 {"%rctr", 0},
854 {"%ret0", 28},
855 {"%ret1", 29},
856 {"%rp", 2},
857 {"%sar", 11},
858 {"%sp", 30},
859 {"%sr0", 0},
860 {"%sr1", 1},
861 {"%sr2", 2},
862 {"%sr3", 3},
863 {"%sr4", 4},
864 {"%sr5", 5},
865 {"%sr6", 6},
866 {"%sr7", 7},
867 {"%t1", 22},
868 {"%t2", 21},
869 {"%t3", 20},
870 {"%t4", 19},
871 {"%tf1", 11},
872 {"%tf2", 10},
873 {"%tf3", 9},
874 {"%tf4", 8},
875 {"%tr0", 24},
876 {"%tr1", 25},
877 {"%tr2", 26},
878 {"%tr3", 27},
879 {"%tr4", 28},
880 {"%tr5", 29},
881 {"%tr6", 30},
882 {"%tr7", 31}
883 };
884
885 /* This table is sorted by order of the length of the string. This is
886 so we check for <> before we check for <. If we had a <> and checked
887 for < first, we would get a false match. */
888 static const struct fp_cond_map fp_cond_map[] =
889 {
890 {"false?", 0},
891 {"false", 1},
892 {"true?", 30},
893 {"true", 31},
894 {"!<=>", 3},
895 {"!?>=", 8},
896 {"!?<=", 16},
897 {"!<>", 7},
898 {"!>=", 11},
899 {"!?>", 12},
900 {"?<=", 14},
901 {"!<=", 19},
902 {"!?<", 20},
903 {"?>=", 22},
904 {"!?=", 24},
905 {"!=t", 27},
906 {"<=>", 29},
907 {"=t", 5},
908 {"?=", 6},
909 {"?<", 10},
910 {"<=", 13},
911 {"!>", 15},
912 {"?>", 18},
913 {">=", 21},
914 {"!<", 23},
915 {"<>", 25},
916 {"!=", 26},
917 {"!?", 28},
918 {"?", 2},
919 {"=", 4},
920 {"<", 9},
921 {">", 17}
922 };
923
924 static const struct selector_entry selector_table[] =
925 {
926 {"f", e_fsel},
927 {"l", e_lsel},
928 {"ld", e_ldsel},
929 {"lp", e_lpsel},
930 {"lr", e_lrsel},
931 {"ls", e_lssel},
932 {"lt", e_ltsel},
933 {"ltp", e_ltpsel},
934 {"n", e_nsel},
935 {"nl", e_nlsel},
936 {"nlr", e_nlrsel},
937 {"p", e_psel},
938 {"r", e_rsel},
939 {"rd", e_rdsel},
940 {"rp", e_rpsel},
941 {"rr", e_rrsel},
942 {"rs", e_rssel},
943 {"rt", e_rtsel},
944 {"rtp", e_rtpsel},
945 {"t", e_tsel},
946 };
947
948 #ifdef OBJ_SOM
949 /* default space and subspace dictionaries */
950
951 #define GDB_SYMBOLS GDB_SYMBOLS_SUBSPACE_NAME
952 #define GDB_STRINGS GDB_STRINGS_SUBSPACE_NAME
953
954 /* pre-defined subsegments (subspaces) for the HPPA. */
955 #define SUBSEG_CODE 0
956 #define SUBSEG_LIT 1
957 #define SUBSEG_MILLI 2
958 #define SUBSEG_DATA 0
959 #define SUBSEG_BSS 2
960 #define SUBSEG_UNWIND 3
961 #define SUBSEG_GDB_STRINGS 0
962 #define SUBSEG_GDB_SYMBOLS 1
963
964 static struct default_subspace_dict pa_def_subspaces[] =
965 {
966 {"$CODE$", 1, 1, 1, 0, 0, 0, 0, 24, 0x2c, 0, 8, 0, 0, SUBSEG_CODE},
967 {"$DATA$", 1, 1, 0, 0, 0, 0, 0, 24, 0x1f, 1, 8, 1, 1, SUBSEG_DATA},
968 {"$LIT$", 1, 1, 0, 0, 0, 0, 0, 16, 0x2c, 0, 8, 0, 0, SUBSEG_LIT},
969 {"$MILLICODE$", 1, 1, 0, 0, 0, 0, 0, 8, 0x2c, 0, 8, 0, 0, SUBSEG_MILLI},
970 {"$BSS$", 1, 1, 0, 0, 0, 0, 1, 80, 0x1f, 1, 8, 1, 1, SUBSEG_BSS},
971 {NULL, 0, 1, 0, 0, 0, 0, 0, 255, 0x1f, 0, 4, 0, 0, 0}
972 };
973
974 static struct default_space_dict pa_def_spaces[] =
975 {
976 {"$TEXT$", 0, 1, 1, 0, 8, ASEC_NULL},
977 {"$PRIVATE$", 1, 1, 1, 1, 16, ASEC_NULL},
978 {NULL, 0, 0, 0, 0, 0, ASEC_NULL}
979 };
980
981 /* Misc local definitions used by the assembler. */
982
983 /* These macros are used to maintain spaces/subspaces. */
984 #define SPACE_DEFINED(space_chain) (space_chain)->sd_defined
985 #define SPACE_USER_DEFINED(space_chain) (space_chain)->sd_user_defined
986 #define SPACE_SPNUM(space_chain) (space_chain)->sd_spnum
987 #define SPACE_NAME(space_chain) (space_chain)->sd_name
988
989 #define SUBSPACE_DEFINED(ss_chain) (ss_chain)->ssd_defined
990 #define SUBSPACE_NAME(ss_chain) (ss_chain)->ssd_name
991 #endif
992
993 /* Return nonzero if the string pointed to by S potentially represents
994 a right or left half of a FP register */
995 #define IS_R_SELECT(S) (*(S) == 'R' || *(S) == 'r')
996 #define IS_L_SELECT(S) (*(S) == 'L' || *(S) == 'l')
997
998 /* Store immediate values of shift/deposit/extract functions. */
999
1000 #define SAVE_IMMEDIATE(VALUE) \
1001 { \
1002 if (immediate_check) \
1003 { \
1004 if (pos == -1) \
1005 pos = (VALUE); \
1006 else if (len == -1) \
1007 len = (VALUE); \
1008 } \
1009 }
1010
1011 /* Insert FIELD into OPCODE starting at bit START. Continue pa_ip
1012 main loop after insertion. */
1013
1014 #define INSERT_FIELD_AND_CONTINUE(OPCODE, FIELD, START) \
1015 { \
1016 ((OPCODE) |= (FIELD) << (START)); \
1017 continue; \
1018 }
1019
1020 /* Simple range checking for FIELD against HIGH and LOW bounds.
1021 IGNORE is used to suppress the error message. */
1022
1023 #define CHECK_FIELD(FIELD, HIGH, LOW, IGNORE) \
1024 { \
1025 if ((FIELD) > (HIGH) || (FIELD) < (LOW)) \
1026 { \
1027 if (! IGNORE) \
1028 as_bad (_("Field out of range [%d..%d] (%d)."), (LOW), (HIGH), \
1029 (int) (FIELD));\
1030 break; \
1031 } \
1032 }
1033
1034 /* Variant of CHECK_FIELD for use in md_apply_fix and other places where
1035 the current file and line number are not valid. */
1036
1037 #define CHECK_FIELD_WHERE(FIELD, HIGH, LOW, FILENAME, LINE) \
1038 { \
1039 if ((FIELD) > (HIGH) || (FIELD) < (LOW)) \
1040 { \
1041 as_bad_where ((FILENAME), (LINE), \
1042 _("Field out of range [%d..%d] (%d)."), (LOW), (HIGH), \
1043 (int) (FIELD));\
1044 break; \
1045 } \
1046 }
1047
1048 /* Simple alignment checking for FIELD against ALIGN (a power of two).
1049 IGNORE is used to suppress the error message. */
1050
1051 #define CHECK_ALIGN(FIELD, ALIGN, IGNORE) \
1052 { \
1053 if ((FIELD) & ((ALIGN) - 1)) \
1054 { \
1055 if (! IGNORE) \
1056 as_bad (_("Field not properly aligned [%d] (%d)."), (ALIGN), \
1057 (int) (FIELD));\
1058 break; \
1059 } \
1060 }
1061
1062 #define is_DP_relative(exp) \
1063 ((exp).X_op == O_subtract \
1064 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$global$") == 0)
1065
1066 #define is_SB_relative(exp) \
1067 ((exp).X_op == O_subtract \
1068 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$segrel$") == 0)
1069
1070 #define is_PC_relative(exp) \
1071 ((exp).X_op == O_subtract \
1072 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$PIC_pcrel$0") == 0)
1073
1074 #define is_tls_gdidx(exp) \
1075 ((exp).X_op == O_subtract \
1076 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_gdidx$") == 0)
1077
1078 #define is_tls_ldidx(exp) \
1079 ((exp).X_op == O_subtract \
1080 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_ldidx$") == 0)
1081
1082 #define is_tls_dtpoff(exp) \
1083 ((exp).X_op == O_subtract \
1084 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_dtpoff$") == 0)
1085
1086 #define is_tls_ieoff(exp) \
1087 ((exp).X_op == O_subtract \
1088 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_ieoff$") == 0)
1089
1090 #define is_tls_leoff(exp) \
1091 ((exp).X_op == O_subtract \
1092 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_leoff$") == 0)
1093
1094 /* We need some complex handling for stabs (sym1 - sym2). Luckily, we'll
1095 always be able to reduce the expression to a constant, so we don't
1096 need real complex handling yet. */
1097 #define is_complex(exp) \
1098 ((exp).X_op != O_constant && (exp).X_op != O_symbol)
1099
1100 /* Actual functions to implement the PA specific code for the assembler. */
1101
1102 /* Called before writing the object file. Make sure entry/exit and
1103 proc/procend pairs match. */
1104
1105 void
1106 pa_check_eof (void)
1107 {
1108 if (within_entry_exit)
1109 as_fatal (_("Missing .exit\n"));
1110
1111 if (within_procedure)
1112 as_fatal (_("Missing .procend\n"));
1113 }
1114
1115 /* Returns a pointer to the label_symbol_struct for the current space.
1116 or NULL if no label_symbol_struct exists for the current space. */
1117
1118 static label_symbol_struct *
1119 pa_get_label (void)
1120 {
1121 label_symbol_struct *label_chain = label_symbols_rootp;
1122
1123 if (label_chain)
1124 {
1125 #ifdef OBJ_SOM
1126 if (current_space == label_chain->lss_space && label_chain->lss_label)
1127 return label_chain;
1128 #endif
1129 #ifdef OBJ_ELF
1130 if (now_seg == label_chain->lss_segment && label_chain->lss_label)
1131 return label_chain;
1132 #endif
1133 }
1134
1135 return NULL;
1136 }
1137
1138 /* Defines a label for the current space. If one is already defined,
1139 this function will replace it with the new label. */
1140
1141 void
1142 pa_define_label (symbolS *symbol)
1143 {
1144 label_symbol_struct *label_chain = label_symbols_rootp;
1145
1146 if (!label_chain)
1147 label_chain = &last_label_symbol;
1148
1149 label_chain->lss_label = symbol;
1150 #ifdef OBJ_SOM
1151 label_chain->lss_space = current_space;
1152 #endif
1153 #ifdef OBJ_ELF
1154 label_chain->lss_segment = now_seg;
1155 #endif
1156
1157 /* Not used. */
1158 label_chain->lss_next = NULL;
1159
1160 label_symbols_rootp = label_chain;
1161
1162 #ifdef OBJ_ELF
1163 dwarf2_emit_label (symbol);
1164 #endif
1165 }
1166
1167 /* Removes a label definition for the current space.
1168 If there is no label_symbol_struct entry, then no action is taken. */
1169
1170 static void
1171 pa_undefine_label (void)
1172 {
1173 label_symbols_rootp = NULL;
1174 }
1175
1176 /* An HPPA-specific version of fix_new. This is required because the HPPA
1177 code needs to keep track of some extra stuff. Each call to fix_new_hppa
1178 results in the creation of an instance of an hppa_fix_struct. An
1179 hppa_fix_struct stores the extra information along with a pointer to the
1180 original fixS. This is attached to the original fixup via the
1181 tc_fix_data field. */
1182
1183 static void
1184 fix_new_hppa (fragS *frag,
1185 int where,
1186 int size,
1187 symbolS *add_symbol,
1188 offsetT offset,
1189 expressionS *exp,
1190 int pcrel,
1191 bfd_reloc_code_real_type r_type,
1192 enum hppa_reloc_field_selector_type_alt r_field,
1193 int r_format,
1194 unsigned int arg_reloc,
1195 int unwind_bits ATTRIBUTE_UNUSED)
1196 {
1197 fixS *new_fix;
1198 struct hppa_fix_struct *hppa_fix = XOBNEW (&notes, struct hppa_fix_struct);
1199
1200 if (exp != NULL)
1201 new_fix = fix_new_exp (frag, where, size, exp, pcrel, r_type);
1202 else
1203 new_fix = fix_new (frag, where, size, add_symbol, offset, pcrel, r_type);
1204 new_fix->tc_fix_data = (void *) hppa_fix;
1205 hppa_fix->fx_r_type = r_type;
1206 hppa_fix->fx_r_field = r_field;
1207 hppa_fix->fx_r_format = r_format;
1208 hppa_fix->fx_arg_reloc = arg_reloc;
1209 hppa_fix->segment = now_seg;
1210 #ifdef OBJ_SOM
1211 if (r_type == R_ENTRY || r_type == R_EXIT)
1212 new_fix->fx_offset = unwind_bits;
1213 #endif
1214
1215 /* foo-$global$ is used to access non-automatic storage. $global$
1216 is really just a marker and has served its purpose, so eliminate
1217 it now so as not to confuse write.c. Ditto for $PIC_pcrel$0. */
1218 if (new_fix->fx_subsy
1219 && (strcmp (S_GET_NAME (new_fix->fx_subsy), "$global$") == 0
1220 || strcmp (S_GET_NAME (new_fix->fx_subsy), "$segrel$") == 0
1221 || strcmp (S_GET_NAME (new_fix->fx_subsy), "$PIC_pcrel$0") == 0
1222 || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_gdidx$") == 0
1223 || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_ldidx$") == 0
1224 || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_dtpoff$") == 0
1225 || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_ieoff$") == 0
1226 || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_leoff$") == 0))
1227 new_fix->fx_subsy = NULL;
1228 }
1229
1230 /* This fix_new is called by cons via TC_CONS_FIX_NEW.
1231 hppa_field_selector is set by the parse_cons_expression_hppa. */
1232
1233 void
1234 cons_fix_new_hppa (fragS *frag, int where, int size, expressionS *exp,
1235 int hppa_field_selector)
1236 {
1237 unsigned int rel_type;
1238
1239 /* Get a base relocation type. */
1240 if (is_DP_relative (*exp))
1241 rel_type = R_HPPA_GOTOFF;
1242 else if (is_PC_relative (*exp))
1243 rel_type = R_HPPA_PCREL_CALL;
1244 #ifdef OBJ_ELF
1245 else if (is_SB_relative (*exp))
1246 rel_type = R_PARISC_SEGREL32;
1247 else if (is_tls_gdidx (*exp))
1248 rel_type = R_PARISC_TLS_GD21L;
1249 else if (is_tls_ldidx (*exp))
1250 rel_type = R_PARISC_TLS_LDM21L;
1251 else if (is_tls_dtpoff (*exp))
1252 rel_type = R_PARISC_TLS_LDO21L;
1253 else if (is_tls_ieoff (*exp))
1254 rel_type = R_PARISC_TLS_IE21L;
1255 else if (is_tls_leoff (*exp))
1256 rel_type = R_PARISC_TLS_LE21L;
1257 #endif
1258 else if (is_complex (*exp))
1259 rel_type = R_HPPA_COMPLEX;
1260 else
1261 rel_type = R_HPPA;
1262
1263 if (hppa_field_selector != e_psel && hppa_field_selector != e_fsel)
1264 {
1265 as_warn (_("Invalid field selector. Assuming F%%."));
1266 hppa_field_selector = e_fsel;
1267 }
1268
1269 fix_new_hppa (frag, where, size,
1270 (symbolS *) NULL, (offsetT) 0, exp, 0, rel_type,
1271 hppa_field_selector, size * 8, 0, 0);
1272 }
1273
1274 /* Mark (via expr_end) the end of an expression (I think). FIXME. */
1275
1276 static void
1277 get_expression (char *str)
1278 {
1279 char *save_in;
1280 asection *seg;
1281
1282 save_in = input_line_pointer;
1283 input_line_pointer = str;
1284 seg = expression (&the_insn.exp);
1285 if (!(seg == absolute_section
1286 || seg == undefined_section
1287 || SEG_NORMAL (seg)))
1288 {
1289 as_warn (_("Bad segment in expression."));
1290 expr_end = input_line_pointer;
1291 input_line_pointer = save_in;
1292 return;
1293 }
1294 expr_end = input_line_pointer;
1295 input_line_pointer = save_in;
1296 }
1297
1298 /* Parse a PA nullification completer (,n). Return nonzero if the
1299 completer was found; return zero if no completer was found. */
1300
1301 static int
1302 pa_parse_nullif (char **s)
1303 {
1304 int nullif;
1305
1306 nullif = 0;
1307 if (**s == ',')
1308 {
1309 *s = *s + 1;
1310 if (strncasecmp (*s, "n", 1) == 0)
1311 nullif = 1;
1312 else
1313 {
1314 as_bad (_("Invalid Nullification: (%c)"), **s);
1315 nullif = 0;
1316 }
1317 *s = *s + 1;
1318 }
1319
1320 return nullif;
1321 }
1322
1323 const char *
1324 md_atof (int type, char *litP, int *sizeP)
1325 {
1326 return ieee_md_atof (type, litP, sizeP, TRUE);
1327 }
1328
1329 /* Write out big-endian. */
1330
1331 void
1332 md_number_to_chars (char *buf, valueT val, int n)
1333 {
1334 number_to_chars_bigendian (buf, val, n);
1335 }
1336
1337 /* Translate internal representation of relocation info to BFD target
1338 format. */
1339
1340 arelent **
1341 tc_gen_reloc (asection *section, fixS *fixp)
1342 {
1343 arelent *reloc;
1344 struct hppa_fix_struct *hppa_fixp;
1345 static arelent *no_relocs = NULL;
1346 arelent **relocs;
1347 reloc_type **codes;
1348 reloc_type code;
1349 int n_relocs;
1350 int i;
1351
1352 hppa_fixp = (struct hppa_fix_struct *) fixp->tc_fix_data;
1353 if (fixp->fx_addsy == 0)
1354 return &no_relocs;
1355
1356 gas_assert (hppa_fixp != 0);
1357 gas_assert (section != 0);
1358
1359 reloc = XNEW (arelent);
1360
1361 reloc->sym_ptr_ptr = XNEW (asymbol *);
1362 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1363
1364 /* Allow fixup_segment to recognize hand-written pc-relative relocations.
1365 When we went through cons_fix_new_hppa, we classified them as complex. */
1366 /* ??? It might be better to hide this +8 stuff in tc_cfi_emit_pcrel_expr,
1367 undefine DIFF_EXPR_OK, and let these sorts of complex expressions fail
1368 when R_HPPA_COMPLEX == R_PARISC_UNIMPLEMENTED. */
1369 if (fixp->fx_r_type == (bfd_reloc_code_real_type) R_HPPA_COMPLEX
1370 && fixp->fx_pcrel)
1371 {
1372 fixp->fx_r_type = R_HPPA_PCREL_CALL;
1373 fixp->fx_offset += 8;
1374 }
1375
1376 codes = hppa_gen_reloc_type (stdoutput,
1377 fixp->fx_r_type,
1378 hppa_fixp->fx_r_format,
1379 hppa_fixp->fx_r_field,
1380 fixp->fx_subsy != NULL,
1381 symbol_get_bfdsym (fixp->fx_addsy));
1382
1383 if (codes == NULL)
1384 {
1385 as_bad_where (fixp->fx_file, fixp->fx_line, _("Cannot handle fixup"));
1386 abort ();
1387 }
1388
1389 for (n_relocs = 0; codes[n_relocs]; n_relocs++)
1390 ;
1391
1392 relocs = XNEWVEC (arelent *, n_relocs + 1);
1393 reloc = XNEWVEC (arelent, n_relocs);
1394 for (i = 0; i < n_relocs; i++)
1395 relocs[i] = &reloc[i];
1396
1397 relocs[n_relocs] = NULL;
1398
1399 #ifdef OBJ_ELF
1400 switch (fixp->fx_r_type)
1401 {
1402 default:
1403 gas_assert (n_relocs == 1);
1404
1405 code = *codes[0];
1406
1407 /* Now, do any processing that is dependent on the relocation type. */
1408 switch (code)
1409 {
1410 case R_PARISC_DLTREL21L:
1411 case R_PARISC_DLTREL14R:
1412 case R_PARISC_DLTREL14F:
1413 case R_PARISC_PLABEL32:
1414 case R_PARISC_PLABEL21L:
1415 case R_PARISC_PLABEL14R:
1416 /* For plabel relocations, the addend of the
1417 relocation should be either 0 (no static link) or 2
1418 (static link required). This adjustment is done in
1419 bfd/elf32-hppa.c:elf32_hppa_relocate_section.
1420
1421 We also slam a zero addend into the DLT relative relocs;
1422 it doesn't make a lot of sense to use any addend since
1423 it gets you a different (eg unknown) DLT entry. */
1424 reloc->addend = 0;
1425 break;
1426
1427 #ifdef ELF_ARG_RELOC
1428 case R_PARISC_PCREL17R:
1429 case R_PARISC_PCREL17F:
1430 case R_PARISC_PCREL17C:
1431 case R_PARISC_DIR17R:
1432 case R_PARISC_DIR17F:
1433 case R_PARISC_PCREL21L:
1434 case R_PARISC_DIR21L:
1435 reloc->addend = HPPA_R_ADDEND (hppa_fixp->fx_arg_reloc,
1436 fixp->fx_offset);
1437 break;
1438 #endif
1439
1440 case R_PARISC_DIR32:
1441 /* Facilitate hand-crafted unwind info. */
1442 if (strcmp (section->name, UNWIND_SECTION_NAME) == 0)
1443 code = R_PARISC_SEGREL32;
1444 /* Fallthru */
1445
1446 default:
1447 reloc->addend = fixp->fx_offset;
1448 break;
1449 }
1450
1451 reloc->sym_ptr_ptr = XNEW (asymbol *);
1452 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1453 reloc->howto = bfd_reloc_type_lookup (stdoutput,
1454 (bfd_reloc_code_real_type) code);
1455 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1456
1457 gas_assert (reloc->howto && (unsigned int) code == reloc->howto->type);
1458 break;
1459 }
1460 #else /* OBJ_SOM */
1461
1462 /* Walk over reach relocation returned by the BFD backend. */
1463 for (i = 0; i < n_relocs; i++)
1464 {
1465 code = *codes[i];
1466
1467 relocs[i]->sym_ptr_ptr = XNEW (asymbol *);
1468 *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1469 relocs[i]->howto =
1470 bfd_reloc_type_lookup (stdoutput,
1471 (bfd_reloc_code_real_type) code);
1472 relocs[i]->address = fixp->fx_frag->fr_address + fixp->fx_where;
1473
1474 switch (code)
1475 {
1476 case R_COMP2:
1477 /* The only time we ever use a R_COMP2 fixup is for the difference
1478 of two symbols. With that in mind we fill in all four
1479 relocs now and break out of the loop. */
1480 gas_assert (i == 1);
1481 relocs[0]->sym_ptr_ptr
1482 = (asymbol **) bfd_abs_section_ptr->symbol_ptr_ptr;
1483 relocs[0]->howto
1484 = bfd_reloc_type_lookup (stdoutput,
1485 (bfd_reloc_code_real_type) *codes[0]);
1486 relocs[0]->address = fixp->fx_frag->fr_address + fixp->fx_where;
1487 relocs[0]->addend = 0;
1488 relocs[1]->sym_ptr_ptr = XNEW (asymbol *);
1489 *relocs[1]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1490 relocs[1]->howto
1491 = bfd_reloc_type_lookup (stdoutput,
1492 (bfd_reloc_code_real_type) *codes[1]);
1493 relocs[1]->address = fixp->fx_frag->fr_address + fixp->fx_where;
1494 relocs[1]->addend = 0;
1495 relocs[2]->sym_ptr_ptr = XNEW (asymbol *);
1496 *relocs[2]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_subsy);
1497 relocs[2]->howto
1498 = bfd_reloc_type_lookup (stdoutput,
1499 (bfd_reloc_code_real_type) *codes[2]);
1500 relocs[2]->address = fixp->fx_frag->fr_address + fixp->fx_where;
1501 relocs[2]->addend = 0;
1502 relocs[3]->sym_ptr_ptr
1503 = (asymbol **) bfd_abs_section_ptr->symbol_ptr_ptr;
1504 relocs[3]->howto
1505 = bfd_reloc_type_lookup (stdoutput,
1506 (bfd_reloc_code_real_type) *codes[3]);
1507 relocs[3]->address = fixp->fx_frag->fr_address + fixp->fx_where;
1508 relocs[3]->addend = 0;
1509 relocs[4]->sym_ptr_ptr
1510 = (asymbol **) bfd_abs_section_ptr->symbol_ptr_ptr;
1511 relocs[4]->howto
1512 = bfd_reloc_type_lookup (stdoutput,
1513 (bfd_reloc_code_real_type) *codes[4]);
1514 relocs[4]->address = fixp->fx_frag->fr_address + fixp->fx_where;
1515 relocs[4]->addend = 0;
1516 goto done;
1517 case R_PCREL_CALL:
1518 case R_ABS_CALL:
1519 relocs[i]->addend = HPPA_R_ADDEND (hppa_fixp->fx_arg_reloc, 0);
1520 break;
1521
1522 case R_DLT_REL:
1523 case R_DATA_PLABEL:
1524 case R_CODE_PLABEL:
1525 /* For plabel relocations, the addend of the
1526 relocation should be either 0 (no static link) or 2
1527 (static link required).
1528
1529 FIXME: We always assume no static link!
1530
1531 We also slam a zero addend into the DLT relative relocs;
1532 it doesn't make a lot of sense to use any addend since
1533 it gets you a different (eg unknown) DLT entry. */
1534 relocs[i]->addend = 0;
1535 break;
1536
1537 case R_N_MODE:
1538 case R_S_MODE:
1539 case R_D_MODE:
1540 case R_R_MODE:
1541 case R_FSEL:
1542 case R_LSEL:
1543 case R_RSEL:
1544 case R_BEGIN_BRTAB:
1545 case R_END_BRTAB:
1546 case R_BEGIN_TRY:
1547 case R_N0SEL:
1548 case R_N1SEL:
1549 /* There is no symbol or addend associated with these fixups. */
1550 relocs[i]->sym_ptr_ptr = XNEW (asymbol *);
1551 *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
1552 relocs[i]->addend = 0;
1553 break;
1554
1555 case R_END_TRY:
1556 case R_ENTRY:
1557 case R_EXIT:
1558 /* There is no symbol associated with these fixups. */
1559 relocs[i]->sym_ptr_ptr = XNEW (asymbol *);
1560 *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
1561 relocs[i]->addend = fixp->fx_offset;
1562 break;
1563
1564 default:
1565 relocs[i]->addend = fixp->fx_offset;
1566 }
1567 }
1568
1569 done:
1570 #endif
1571
1572 return relocs;
1573 }
1574
1575 /* Process any machine dependent frag types. */
1576
1577 void
1578 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
1579 asection *sec ATTRIBUTE_UNUSED,
1580 fragS *fragP)
1581 {
1582 unsigned int address;
1583
1584 if (fragP->fr_type == rs_machine_dependent)
1585 {
1586 switch ((int) fragP->fr_subtype)
1587 {
1588 case 0:
1589 fragP->fr_type = rs_fill;
1590 know (fragP->fr_var == 1);
1591 know (fragP->fr_next);
1592 address = fragP->fr_address + fragP->fr_fix;
1593 if (address % fragP->fr_offset)
1594 {
1595 fragP->fr_offset =
1596 fragP->fr_next->fr_address
1597 - fragP->fr_address
1598 - fragP->fr_fix;
1599 }
1600 else
1601 fragP->fr_offset = 0;
1602 break;
1603 }
1604 }
1605 }
1606
1607 /* Round up a section size to the appropriate boundary. */
1608
1609 valueT
1610 md_section_align (asection *segment, valueT size)
1611 {
1612 int align = bfd_get_section_alignment (stdoutput, segment);
1613 int align2 = (1 << align) - 1;
1614
1615 return (size + align2) & ~align2;
1616 }
1617
1618 /* Return the approximate size of a frag before relaxation has occurred. */
1619
1620 int
1621 md_estimate_size_before_relax (fragS *fragP, asection *segment ATTRIBUTE_UNUSED)
1622 {
1623 int size;
1624
1625 size = 0;
1626
1627 while ((fragP->fr_fix + size) % fragP->fr_offset)
1628 size++;
1629
1630 return size;
1631 }
1632 \f
1633 #ifdef OBJ_ELF
1634 # ifdef WARN_COMMENTS
1635 const char *md_shortopts = "Vc";
1636 # else
1637 const char *md_shortopts = "V";
1638 # endif
1639 #else
1640 # ifdef WARN_COMMENTS
1641 const char *md_shortopts = "c";
1642 # else
1643 const char *md_shortopts = "";
1644 # endif
1645 #endif
1646
1647 struct option md_longopts[] =
1648 {
1649 #ifdef WARN_COMMENTS
1650 {"warn-comment", no_argument, NULL, 'c'},
1651 #endif
1652 {NULL, no_argument, NULL, 0}
1653 };
1654 size_t md_longopts_size = sizeof (md_longopts);
1655
1656 int
1657 md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED)
1658 {
1659 switch (c)
1660 {
1661 default:
1662 return 0;
1663
1664 #ifdef OBJ_ELF
1665 case 'V':
1666 print_version_id ();
1667 break;
1668 #endif
1669 #ifdef WARN_COMMENTS
1670 case 'c':
1671 warn_comment = 1;
1672 break;
1673 #endif
1674 }
1675
1676 return 1;
1677 }
1678
1679 void
1680 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
1681 {
1682 #ifdef OBJ_ELF
1683 fprintf (stream, _("\
1684 -Q ignored\n"));
1685 #endif
1686 #ifdef WARN_COMMENTS
1687 fprintf (stream, _("\
1688 -c print a warning if a comment is found\n"));
1689 #endif
1690 }
1691 \f
1692 /* We have no need to default values of symbols. */
1693
1694 symbolS *
1695 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
1696 {
1697 return NULL;
1698 }
1699
1700 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
1701 #define nonzero_dibits(x) \
1702 ((x) | (((x) & 0x55555555) << 1) | (((x) & 0xAAAAAAAA) >> 1))
1703 #define arg_reloc_stub_needed(CALLER, CALLEE) \
1704 (((CALLER) ^ (CALLEE)) & nonzero_dibits (CALLER) & nonzero_dibits (CALLEE))
1705 #else
1706 #define arg_reloc_stub_needed(CALLER, CALLEE) 0
1707 #endif
1708
1709 /* Apply a fixup to an instruction. */
1710
1711 void
1712 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
1713 {
1714 char *fixpos;
1715 struct hppa_fix_struct *hppa_fixP;
1716 offsetT new_val;
1717 int insn, val, fmt;
1718
1719 /* SOM uses R_HPPA_ENTRY and R_HPPA_EXIT relocations which can
1720 never be "applied" (they are just markers). Likewise for
1721 R_HPPA_BEGIN_BRTAB and R_HPPA_END_BRTAB. */
1722 #ifdef OBJ_SOM
1723 if (fixP->fx_r_type == R_HPPA_ENTRY
1724 || fixP->fx_r_type == R_HPPA_EXIT
1725 || fixP->fx_r_type == R_HPPA_BEGIN_BRTAB
1726 || fixP->fx_r_type == R_HPPA_END_BRTAB
1727 || fixP->fx_r_type == R_HPPA_BEGIN_TRY)
1728 return;
1729
1730 /* Disgusting. We must set fx_offset ourselves -- R_HPPA_END_TRY
1731 fixups are considered not adjustable, which in turn causes
1732 adjust_reloc_syms to not set fx_offset. Ugh. */
1733 if (fixP->fx_r_type == R_HPPA_END_TRY)
1734 {
1735 fixP->fx_offset = * valP;
1736 return;
1737 }
1738 #endif
1739 #ifdef OBJ_ELF
1740 if (fixP->fx_r_type == (int) R_PARISC_GNU_VTENTRY
1741 || fixP->fx_r_type == (int) R_PARISC_GNU_VTINHERIT)
1742 return;
1743 #endif
1744
1745 if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
1746 fixP->fx_done = 1;
1747
1748 /* There should be a HPPA specific fixup associated with the GAS fixup. */
1749 hppa_fixP = (struct hppa_fix_struct *) fixP->tc_fix_data;
1750 if (hppa_fixP == NULL)
1751 {
1752 as_bad_where (fixP->fx_file, fixP->fx_line,
1753 _("no hppa_fixup entry for fixup type 0x%x"),
1754 fixP->fx_r_type);
1755 return;
1756 }
1757
1758 fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
1759
1760 if (fixP->fx_size != 4 || hppa_fixP->fx_r_format == 32)
1761 {
1762 /* Handle constant output. */
1763 number_to_chars_bigendian (fixpos, *valP, fixP->fx_size);
1764 return;
1765 }
1766
1767 insn = bfd_get_32 (stdoutput, fixpos);
1768 fmt = bfd_hppa_insn2fmt (stdoutput, insn);
1769
1770 /* If there is a symbol associated with this fixup, then it's something
1771 which will need a SOM relocation (except for some PC-relative relocs).
1772 In such cases we should treat the "val" or "addend" as zero since it
1773 will be added in as needed from fx_offset in tc_gen_reloc. */
1774 if ((fixP->fx_addsy != NULL
1775 || fixP->fx_r_type == (int) R_HPPA_NONE)
1776 #ifdef OBJ_SOM
1777 && fmt != 32
1778 #endif
1779 )
1780 new_val = ((fmt == 12 || fmt == 17 || fmt == 22) ? 8 : 0);
1781 #ifdef OBJ_SOM
1782 /* These field selectors imply that we do not want an addend. */
1783 else if (hppa_fixP->fx_r_field == e_psel
1784 || hppa_fixP->fx_r_field == e_rpsel
1785 || hppa_fixP->fx_r_field == e_lpsel
1786 || hppa_fixP->fx_r_field == e_tsel
1787 || hppa_fixP->fx_r_field == e_rtsel
1788 || hppa_fixP->fx_r_field == e_ltsel)
1789 new_val = ((fmt == 12 || fmt == 17 || fmt == 22) ? 8 : 0);
1790 #endif
1791 else
1792 new_val = hppa_field_adjust (* valP, 0, hppa_fixP->fx_r_field);
1793
1794 /* Handle pc-relative exceptions from above. */
1795 if ((fmt == 12 || fmt == 17 || fmt == 22)
1796 && fixP->fx_addsy
1797 && fixP->fx_pcrel
1798 && !arg_reloc_stub_needed (symbol_arg_reloc_info (fixP->fx_addsy),
1799 hppa_fixP->fx_arg_reloc)
1800 #ifdef OBJ_ELF
1801 && (* valP - 8 + 8192 < 16384
1802 || (fmt == 17 && * valP - 8 + 262144 < 524288)
1803 || (fmt == 22 && * valP - 8 + 8388608 < 16777216))
1804 #endif
1805 #ifdef OBJ_SOM
1806 && (* valP - 8 + 262144 < 524288
1807 || (fmt == 22 && * valP - 8 + 8388608 < 16777216))
1808 #endif
1809 && !S_IS_EXTERNAL (fixP->fx_addsy)
1810 && !S_IS_WEAK (fixP->fx_addsy)
1811 && S_GET_SEGMENT (fixP->fx_addsy) == hppa_fixP->segment
1812 && !(fixP->fx_subsy
1813 && S_GET_SEGMENT (fixP->fx_subsy) != hppa_fixP->segment))
1814 {
1815 new_val = hppa_field_adjust (* valP, 0, hppa_fixP->fx_r_field);
1816 }
1817
1818 switch (fmt)
1819 {
1820 case 10:
1821 CHECK_FIELD_WHERE (new_val, 8191, -8192,
1822 fixP->fx_file, fixP->fx_line);
1823 val = new_val;
1824
1825 insn = (insn & ~ 0x3ff1) | (((val & 0x1ff8) << 1)
1826 | ((val & 0x2000) >> 13));
1827 break;
1828 case -11:
1829 CHECK_FIELD_WHERE (new_val, 8191, -8192,
1830 fixP->fx_file, fixP->fx_line);
1831 val = new_val;
1832
1833 insn = (insn & ~ 0x3ff9) | (((val & 0x1ffc) << 1)
1834 | ((val & 0x2000) >> 13));
1835 break;
1836 /* Handle all opcodes with the 'j' operand type. */
1837 case 14:
1838 CHECK_FIELD_WHERE (new_val, 8191, -8192,
1839 fixP->fx_file, fixP->fx_line);
1840 val = new_val;
1841
1842 insn = ((insn & ~ 0x3fff) | low_sign_unext (val, 14));
1843 break;
1844
1845 /* Handle all opcodes with the 'k' operand type. */
1846 case 21:
1847 CHECK_FIELD_WHERE (new_val, 1048575, -1048576,
1848 fixP->fx_file, fixP->fx_line);
1849 val = new_val;
1850
1851 insn = (insn & ~ 0x1fffff) | re_assemble_21 (val);
1852 break;
1853
1854 /* Handle all the opcodes with the 'i' operand type. */
1855 case 11:
1856 CHECK_FIELD_WHERE (new_val, 1023, -1024,
1857 fixP->fx_file, fixP->fx_line);
1858 val = new_val;
1859
1860 insn = (insn & ~ 0x7ff) | low_sign_unext (val, 11);
1861 break;
1862
1863 /* Handle all the opcodes with the 'w' operand type. */
1864 case 12:
1865 CHECK_FIELD_WHERE (new_val - 8, 8191, -8192,
1866 fixP->fx_file, fixP->fx_line);
1867 val = new_val - 8;
1868
1869 insn = (insn & ~ 0x1ffd) | re_assemble_12 (val >> 2);
1870 break;
1871
1872 /* Handle some of the opcodes with the 'W' operand type. */
1873 case 17:
1874 {
1875 offsetT distance = * valP;
1876
1877 /* If this is an absolute branch (ie no link) with an out of
1878 range target, then we want to complain. */
1879 if (fixP->fx_r_type == (int) R_HPPA_PCREL_CALL
1880 && (insn & 0xffe00000) == 0xe8000000)
1881 CHECK_FIELD_WHERE (distance - 8, 262143, -262144,
1882 fixP->fx_file, fixP->fx_line);
1883
1884 CHECK_FIELD_WHERE (new_val - 8, 262143, -262144,
1885 fixP->fx_file, fixP->fx_line);
1886 val = new_val - 8;
1887
1888 insn = (insn & ~ 0x1f1ffd) | re_assemble_17 (val >> 2);
1889 break;
1890 }
1891
1892 case 22:
1893 {
1894 offsetT distance = * valP;
1895
1896 /* If this is an absolute branch (ie no link) with an out of
1897 range target, then we want to complain. */
1898 if (fixP->fx_r_type == (int) R_HPPA_PCREL_CALL
1899 && (insn & 0xffe00000) == 0xe8000000)
1900 CHECK_FIELD_WHERE (distance - 8, 8388607, -8388608,
1901 fixP->fx_file, fixP->fx_line);
1902
1903 CHECK_FIELD_WHERE (new_val - 8, 8388607, -8388608,
1904 fixP->fx_file, fixP->fx_line);
1905 val = new_val - 8;
1906
1907 insn = (insn & ~ 0x3ff1ffd) | re_assemble_22 (val >> 2);
1908 break;
1909 }
1910
1911 case -10:
1912 val = new_val;
1913 insn = (insn & ~ 0xfff1) | re_assemble_16 (val & -8);
1914 break;
1915
1916 case -16:
1917 val = new_val;
1918 insn = (insn & ~ 0xfff9) | re_assemble_16 (val & -4);
1919 break;
1920
1921 case 16:
1922 val = new_val;
1923 insn = (insn & ~ 0xffff) | re_assemble_16 (val);
1924 break;
1925
1926 case 32:
1927 insn = new_val;
1928 break;
1929
1930 default:
1931 as_bad_where (fixP->fx_file, fixP->fx_line,
1932 _("Unknown relocation encountered in md_apply_fix."));
1933 return;
1934 }
1935
1936 #ifdef OBJ_ELF
1937 switch (fixP->fx_r_type)
1938 {
1939 case R_PARISC_TLS_GD21L:
1940 case R_PARISC_TLS_GD14R:
1941 case R_PARISC_TLS_LDM21L:
1942 case R_PARISC_TLS_LDM14R:
1943 case R_PARISC_TLS_LE21L:
1944 case R_PARISC_TLS_LE14R:
1945 case R_PARISC_TLS_IE21L:
1946 case R_PARISC_TLS_IE14R:
1947 if (fixP->fx_addsy)
1948 S_SET_THREAD_LOCAL (fixP->fx_addsy);
1949 break;
1950 default:
1951 break;
1952 }
1953 #endif
1954
1955 /* Insert the relocation. */
1956 bfd_put_32 (stdoutput, insn, fixpos);
1957 }
1958
1959 /* Exactly what point is a PC-relative offset relative TO?
1960 On the PA, they're relative to the address of the offset. */
1961
1962 long
1963 md_pcrel_from (fixS *fixP)
1964 {
1965 return fixP->fx_where + fixP->fx_frag->fr_address;
1966 }
1967
1968 /* Return nonzero if the input line pointer is at the end of
1969 a statement. */
1970
1971 static int
1972 is_end_of_statement (void)
1973 {
1974 return ((*input_line_pointer == '\n')
1975 || (*input_line_pointer == ';')
1976 || (*input_line_pointer == '!'));
1977 }
1978
1979 #define REG_NAME_CNT (sizeof (pre_defined_registers) / sizeof (struct pd_reg))
1980
1981 /* Given NAME, find the register number associated with that name, return
1982 the integer value associated with the given name or -1 on failure. */
1983
1984 static int
1985 reg_name_search (char *name)
1986 {
1987 int middle, low, high;
1988 int cmp;
1989
1990 low = 0;
1991 high = REG_NAME_CNT - 1;
1992
1993 do
1994 {
1995 middle = (low + high) / 2;
1996 cmp = strcasecmp (name, pre_defined_registers[middle].name);
1997 if (cmp < 0)
1998 high = middle - 1;
1999 else if (cmp > 0)
2000 low = middle + 1;
2001 else
2002 return pre_defined_registers[middle].value;
2003 }
2004 while (low <= high);
2005
2006 return -1;
2007 }
2008
2009 /* Read a number from S. The number might come in one of many forms,
2010 the most common will be a hex or decimal constant, but it could be
2011 a pre-defined register (Yuk!), or an absolute symbol.
2012
2013 Return 1 on success or 0 on failure. If STRICT, then a missing
2014 register prefix will cause a failure. The number itself is
2015 returned in `pa_number'.
2016
2017 IS_FLOAT indicates that a PA-89 FP register number should be
2018 parsed; A `l' or `r' suffix is checked for if but 2 of IS_FLOAT is
2019 not set.
2020
2021 pa_parse_number can not handle negative constants and will fail
2022 horribly if it is passed such a constant. */
2023
2024 static int
2025 pa_parse_number (char **s, int is_float)
2026 {
2027 int num;
2028 char *name;
2029 char c;
2030 symbolS *sym;
2031 int status;
2032 char *p = *s;
2033 bfd_boolean have_prefix;
2034
2035 /* Skip whitespace before the number. */
2036 while (*p == ' ' || *p == '\t')
2037 p = p + 1;
2038
2039 pa_number = -1;
2040 have_prefix = 0;
2041 num = 0;
2042 if (!strict && ISDIGIT (*p))
2043 {
2044 /* Looks like a number. */
2045
2046 if (*p == '0' && (*(p + 1) == 'x' || *(p + 1) == 'X'))
2047 {
2048 /* The number is specified in hex. */
2049 p += 2;
2050 while (ISDIGIT (*p) || ((*p >= 'a') && (*p <= 'f'))
2051 || ((*p >= 'A') && (*p <= 'F')))
2052 {
2053 if (ISDIGIT (*p))
2054 num = num * 16 + *p - '0';
2055 else if (*p >= 'a' && *p <= 'f')
2056 num = num * 16 + *p - 'a' + 10;
2057 else
2058 num = num * 16 + *p - 'A' + 10;
2059 ++p;
2060 }
2061 }
2062 else
2063 {
2064 /* The number is specified in decimal. */
2065 while (ISDIGIT (*p))
2066 {
2067 num = num * 10 + *p - '0';
2068 ++p;
2069 }
2070 }
2071
2072 pa_number = num;
2073
2074 /* Check for a `l' or `r' suffix. */
2075 if (is_float)
2076 {
2077 pa_number += FP_REG_BASE;
2078 if (! (is_float & 2))
2079 {
2080 if (IS_R_SELECT (p))
2081 {
2082 pa_number += FP_REG_RSEL;
2083 ++p;
2084 }
2085 else if (IS_L_SELECT (p))
2086 {
2087 ++p;
2088 }
2089 }
2090 }
2091 }
2092 else if (*p == '%')
2093 {
2094 /* The number might be a predefined register. */
2095 have_prefix = 1;
2096 name = p;
2097 p++;
2098 c = *p;
2099 /* Tege hack: Special case for general registers as the general
2100 code makes a binary search with case translation, and is VERY
2101 slow. */
2102 if (c == 'r')
2103 {
2104 p++;
2105 if (*p == 'e' && *(p + 1) == 't'
2106 && (*(p + 2) == '0' || *(p + 2) == '1'))
2107 {
2108 p += 2;
2109 num = *p - '0' + 28;
2110 p++;
2111 }
2112 else if (*p == 'p')
2113 {
2114 num = 2;
2115 p++;
2116 }
2117 else if (!ISDIGIT (*p))
2118 {
2119 if (print_errors)
2120 as_bad (_("Undefined register: '%s'."), name);
2121 num = -1;
2122 }
2123 else
2124 {
2125 do
2126 num = num * 10 + *p++ - '0';
2127 while (ISDIGIT (*p));
2128 }
2129 }
2130 else
2131 {
2132 /* Do a normal register search. */
2133 while (is_part_of_name (c))
2134 {
2135 p = p + 1;
2136 c = *p;
2137 }
2138 *p = 0;
2139 status = reg_name_search (name);
2140 if (status >= 0)
2141 num = status;
2142 else
2143 {
2144 if (print_errors)
2145 as_bad (_("Undefined register: '%s'."), name);
2146 num = -1;
2147 }
2148 *p = c;
2149 }
2150
2151 pa_number = num;
2152 }
2153 else
2154 {
2155 /* And finally, it could be a symbol in the absolute section which
2156 is effectively a constant, or a register alias symbol. */
2157 name = p;
2158 c = *p;
2159 while (is_part_of_name (c))
2160 {
2161 p = p + 1;
2162 c = *p;
2163 }
2164 *p = 0;
2165 if ((sym = symbol_find (name)) != NULL)
2166 {
2167 if (S_GET_SEGMENT (sym) == reg_section)
2168 {
2169 num = S_GET_VALUE (sym);
2170 /* Well, we don't really have one, but we do have a
2171 register, so... */
2172 have_prefix = TRUE;
2173 }
2174 else if (S_GET_SEGMENT (sym) == bfd_abs_section_ptr)
2175 num = S_GET_VALUE (sym);
2176 else if (!strict)
2177 {
2178 if (print_errors)
2179 as_bad (_("Non-absolute symbol: '%s'."), name);
2180 num = -1;
2181 }
2182 }
2183 else if (!strict)
2184 {
2185 /* There is where we'd come for an undefined symbol
2186 or for an empty string. For an empty string we
2187 will return zero. That's a concession made for
2188 compatibility with the braindamaged HP assemblers. */
2189 if (*name == 0)
2190 num = 0;
2191 else
2192 {
2193 if (print_errors)
2194 as_bad (_("Undefined absolute constant: '%s'."), name);
2195 num = -1;
2196 }
2197 }
2198 *p = c;
2199
2200 pa_number = num;
2201 }
2202
2203 if (!strict || have_prefix)
2204 {
2205 *s = p;
2206 return 1;
2207 }
2208 return 0;
2209 }
2210
2211 /* Return nonzero if the given INSN and L/R information will require
2212 a new PA-1.1 opcode. */
2213
2214 static int
2215 need_pa11_opcode (void)
2216 {
2217 if ((pa_number & FP_REG_RSEL) != 0
2218 && !(the_insn.fpof1 == DBL && the_insn.fpof2 == DBL))
2219 {
2220 /* If this instruction is specific to a particular architecture,
2221 then set a new architecture. */
2222 if (bfd_get_mach (stdoutput) < pa11)
2223 {
2224 if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, pa11))
2225 as_warn (_("could not update architecture and machine"));
2226 }
2227 return TRUE;
2228 }
2229 else
2230 return FALSE;
2231 }
2232
2233 /* Parse a condition for a fcmp instruction. Return the numerical
2234 code associated with the condition. */
2235
2236 static int
2237 pa_parse_fp_cmp_cond (char **s)
2238 {
2239 int cond, i;
2240
2241 cond = 0;
2242
2243 for (i = 0; i < 32; i++)
2244 {
2245 if (strncasecmp (*s, fp_cond_map[i].string,
2246 strlen (fp_cond_map[i].string)) == 0)
2247 {
2248 cond = fp_cond_map[i].cond;
2249 *s += strlen (fp_cond_map[i].string);
2250 /* If not a complete match, back up the input string and
2251 report an error. */
2252 if (**s != ' ' && **s != '\t')
2253 {
2254 *s -= strlen (fp_cond_map[i].string);
2255 break;
2256 }
2257 while (**s == ' ' || **s == '\t')
2258 *s = *s + 1;
2259 return cond;
2260 }
2261 }
2262
2263 as_bad (_("Invalid FP Compare Condition: %s"), *s);
2264
2265 /* Advance over the bogus completer. */
2266 while (**s != ',' && **s != ' ' && **s != '\t')
2267 *s += 1;
2268
2269 return 0;
2270 }
2271
2272 /* Parse a graphics test complete for ftest. */
2273
2274 static int
2275 pa_parse_ftest_gfx_completer (char **s)
2276 {
2277 int value;
2278
2279 value = 0;
2280 if (strncasecmp (*s, "acc8", 4) == 0)
2281 {
2282 value = 5;
2283 *s += 4;
2284 }
2285 else if (strncasecmp (*s, "acc6", 4) == 0)
2286 {
2287 value = 9;
2288 *s += 4;
2289 }
2290 else if (strncasecmp (*s, "acc4", 4) == 0)
2291 {
2292 value = 13;
2293 *s += 4;
2294 }
2295 else if (strncasecmp (*s, "acc2", 4) == 0)
2296 {
2297 value = 17;
2298 *s += 4;
2299 }
2300 else if (strncasecmp (*s, "acc", 3) == 0)
2301 {
2302 value = 1;
2303 *s += 3;
2304 }
2305 else if (strncasecmp (*s, "rej8", 4) == 0)
2306 {
2307 value = 6;
2308 *s += 4;
2309 }
2310 else if (strncasecmp (*s, "rej", 3) == 0)
2311 {
2312 value = 2;
2313 *s += 3;
2314 }
2315 else
2316 {
2317 value = 0;
2318 as_bad (_("Invalid FTEST completer: %s"), *s);
2319 }
2320
2321 return value;
2322 }
2323
2324 /* Parse an FP operand format completer returning the completer
2325 type. */
2326
2327 static fp_operand_format
2328 pa_parse_fp_cnv_format (char **s)
2329 {
2330 int format;
2331
2332 format = SGL;
2333 if (**s == ',')
2334 {
2335 *s += 1;
2336 if (strncasecmp (*s, "sgl", 3) == 0)
2337 {
2338 format = SGL;
2339 *s += 4;
2340 }
2341 else if (strncasecmp (*s, "dbl", 3) == 0)
2342 {
2343 format = DBL;
2344 *s += 4;
2345 }
2346 else if (strncasecmp (*s, "quad", 4) == 0)
2347 {
2348 format = QUAD;
2349 *s += 5;
2350 }
2351 else if (strncasecmp (*s, "w", 1) == 0)
2352 {
2353 format = W;
2354 *s += 2;
2355 }
2356 else if (strncasecmp (*s, "uw", 2) == 0)
2357 {
2358 format = UW;
2359 *s += 3;
2360 }
2361 else if (strncasecmp (*s, "dw", 2) == 0)
2362 {
2363 format = DW;
2364 *s += 3;
2365 }
2366 else if (strncasecmp (*s, "udw", 3) == 0)
2367 {
2368 format = UDW;
2369 *s += 4;
2370 }
2371 else if (strncasecmp (*s, "qw", 2) == 0)
2372 {
2373 format = QW;
2374 *s += 3;
2375 }
2376 else if (strncasecmp (*s, "uqw", 3) == 0)
2377 {
2378 format = UQW;
2379 *s += 4;
2380 }
2381 else
2382 {
2383 format = ILLEGAL_FMT;
2384 as_bad (_("Invalid FP Operand Format: %3s"), *s);
2385 }
2386 }
2387
2388 return format;
2389 }
2390
2391 /* Parse an FP operand format completer returning the completer
2392 type. */
2393
2394 static fp_operand_format
2395 pa_parse_fp_format (char **s)
2396 {
2397 int format;
2398
2399 format = SGL;
2400 if (**s == ',')
2401 {
2402 *s += 1;
2403 if (strncasecmp (*s, "sgl", 3) == 0)
2404 {
2405 format = SGL;
2406 *s += 4;
2407 }
2408 else if (strncasecmp (*s, "dbl", 3) == 0)
2409 {
2410 format = DBL;
2411 *s += 4;
2412 }
2413 else if (strncasecmp (*s, "quad", 4) == 0)
2414 {
2415 format = QUAD;
2416 *s += 5;
2417 }
2418 else
2419 {
2420 format = ILLEGAL_FMT;
2421 as_bad (_("Invalid FP Operand Format: %3s"), *s);
2422 }
2423 }
2424
2425 return format;
2426 }
2427
2428 /* Convert from a selector string into a selector type. */
2429
2430 static int
2431 pa_chk_field_selector (char **str)
2432 {
2433 int middle, low, high;
2434 int cmp;
2435 char name[4];
2436
2437 /* Read past any whitespace. */
2438 /* FIXME: should we read past newlines and formfeeds??? */
2439 while (**str == ' ' || **str == '\t' || **str == '\n' || **str == '\f')
2440 *str = *str + 1;
2441
2442 if ((*str)[1] == '\'' || (*str)[1] == '%')
2443 name[0] = TOLOWER ((*str)[0]),
2444 name[1] = 0;
2445 else if ((*str)[2] == '\'' || (*str)[2] == '%')
2446 name[0] = TOLOWER ((*str)[0]),
2447 name[1] = TOLOWER ((*str)[1]),
2448 name[2] = 0;
2449 else if ((*str)[3] == '\'' || (*str)[3] == '%')
2450 name[0] = TOLOWER ((*str)[0]),
2451 name[1] = TOLOWER ((*str)[1]),
2452 name[2] = TOLOWER ((*str)[2]),
2453 name[3] = 0;
2454 else
2455 return e_fsel;
2456
2457 low = 0;
2458 high = sizeof (selector_table) / sizeof (struct selector_entry) - 1;
2459
2460 do
2461 {
2462 middle = (low + high) / 2;
2463 cmp = strcmp (name, selector_table[middle].prefix);
2464 if (cmp < 0)
2465 high = middle - 1;
2466 else if (cmp > 0)
2467 low = middle + 1;
2468 else
2469 {
2470 *str += strlen (name) + 1;
2471 #ifndef OBJ_SOM
2472 if (selector_table[middle].field_selector == e_nsel)
2473 return e_fsel;
2474 #endif
2475 return selector_table[middle].field_selector;
2476 }
2477 }
2478 while (low <= high);
2479
2480 return e_fsel;
2481 }
2482
2483 /* Parse a .byte, .word, .long expression for the HPPA. Called by
2484 cons via the TC_PARSE_CONS_EXPRESSION macro. */
2485
2486 int
2487 parse_cons_expression_hppa (expressionS *exp)
2488 {
2489 int hppa_field_selector = pa_chk_field_selector (&input_line_pointer);
2490 expression (exp);
2491 return hppa_field_selector;
2492 }
2493
2494 /* Evaluate an absolute expression EXP which may be modified by
2495 the selector FIELD_SELECTOR. Return the value of the expression. */
2496 static int
2497 evaluate_absolute (struct pa_it *insn)
2498 {
2499 offsetT value;
2500 expressionS exp;
2501 int field_selector = insn->field_selector;
2502
2503 exp = insn->exp;
2504 value = exp.X_add_number;
2505
2506 return hppa_field_adjust (0, value, field_selector);
2507 }
2508
2509 /* Mark (via expr_end) the end of an absolute expression. FIXME. */
2510
2511 static int
2512 pa_get_absolute_expression (struct pa_it *insn, char **strp)
2513 {
2514 char *save_in;
2515
2516 insn->field_selector = pa_chk_field_selector (strp);
2517 save_in = input_line_pointer;
2518 input_line_pointer = *strp;
2519 expression (&insn->exp);
2520 expr_end = input_line_pointer;
2521 input_line_pointer = save_in;
2522 if (insn->exp.X_op != O_constant)
2523 {
2524 /* We have a non-match in strict mode. */
2525 if (!strict)
2526 as_bad (_("Bad segment (should be absolute)."));
2527 return 0;
2528 }
2529 return evaluate_absolute (insn);
2530 }
2531
2532 /* Get an absolute number. The input string is terminated at the
2533 first whitespace character. */
2534
2535 static int
2536 pa_get_number (struct pa_it *insn, char **strp)
2537 {
2538 char *save_in;
2539 char *s, c;
2540 int result;
2541
2542 save_in = input_line_pointer;
2543 input_line_pointer = *strp;
2544
2545 /* The PA assembly syntax is ambiguous in a variety of ways. Consider
2546 this string "4 %r5" Is that the number 4 followed by the register
2547 r5, or is that 4 MOD r5? This situation occurs for example in the
2548 coprocessor load and store instructions. Previously, calling
2549 pa_get_absolute_expression directly results in r5 being entered
2550 in the symbol table.
2551
2552 So, when looking for an absolute number, we cut off the input string
2553 at the first whitespace character. Thus, expressions should generally
2554 contain no whitespace. */
2555
2556 s = *strp;
2557 while (*s != ',' && *s != ' ' && *s != '\t')
2558 s++;
2559
2560 c = *s;
2561 *s = 0;
2562
2563 result = pa_get_absolute_expression (insn, strp);
2564
2565 input_line_pointer = save_in;
2566 *s = c;
2567 return result;
2568 }
2569
2570 /* Given an argument location specification return the associated
2571 argument location number. */
2572
2573 static unsigned int
2574 pa_build_arg_reloc (char *type_name)
2575 {
2576
2577 if (strncasecmp (type_name, "no", 2) == 0)
2578 return 0;
2579 if (strncasecmp (type_name, "gr", 2) == 0)
2580 return 1;
2581 else if (strncasecmp (type_name, "fr", 2) == 0)
2582 return 2;
2583 else if (strncasecmp (type_name, "fu", 2) == 0)
2584 return 3;
2585 else
2586 as_bad (_("Invalid argument location: %s\n"), type_name);
2587
2588 return 0;
2589 }
2590
2591 /* Encode and return an argument relocation specification for
2592 the given register in the location specified by arg_reloc. */
2593
2594 static unsigned int
2595 pa_align_arg_reloc (unsigned int reg, unsigned int arg_reloc)
2596 {
2597 unsigned int new_reloc;
2598
2599 new_reloc = arg_reloc;
2600 switch (reg)
2601 {
2602 case 0:
2603 new_reloc <<= 8;
2604 break;
2605 case 1:
2606 new_reloc <<= 6;
2607 break;
2608 case 2:
2609 new_reloc <<= 4;
2610 break;
2611 case 3:
2612 new_reloc <<= 2;
2613 break;
2614 default:
2615 as_bad (_("Invalid argument description: %d"), reg);
2616 }
2617
2618 return new_reloc;
2619 }
2620
2621 /* Parse a non-negated compare/subtract completer returning the
2622 number (for encoding in instructions) of the given completer. */
2623
2624 static int
2625 pa_parse_nonneg_cmpsub_cmpltr (char **s)
2626 {
2627 int cmpltr;
2628 char *name = *s + 1;
2629 char c;
2630 char *save_s = *s;
2631 int nullify = 0;
2632
2633 cmpltr = 0;
2634 if (**s == ',')
2635 {
2636 *s += 1;
2637 while (**s != ',' && **s != ' ' && **s != '\t')
2638 *s += 1;
2639 c = **s;
2640 **s = 0x00;
2641
2642 if (strcmp (name, "=") == 0)
2643 {
2644 cmpltr = 1;
2645 }
2646 else if (strcmp (name, "<") == 0)
2647 {
2648 cmpltr = 2;
2649 }
2650 else if (strcmp (name, "<=") == 0)
2651 {
2652 cmpltr = 3;
2653 }
2654 else if (strcmp (name, "<<") == 0)
2655 {
2656 cmpltr = 4;
2657 }
2658 else if (strcmp (name, "<<=") == 0)
2659 {
2660 cmpltr = 5;
2661 }
2662 else if (strcasecmp (name, "sv") == 0)
2663 {
2664 cmpltr = 6;
2665 }
2666 else if (strcasecmp (name, "od") == 0)
2667 {
2668 cmpltr = 7;
2669 }
2670 /* If we have something like addb,n then there is no condition
2671 completer. */
2672 else if (strcasecmp (name, "n") == 0)
2673 {
2674 cmpltr = 0;
2675 nullify = 1;
2676 }
2677 else
2678 {
2679 cmpltr = -1;
2680 }
2681 **s = c;
2682 }
2683
2684 /* Reset pointers if this was really a ,n for a branch instruction. */
2685 if (nullify)
2686 *s = save_s;
2687
2688 return cmpltr;
2689 }
2690
2691 /* Parse a negated compare/subtract completer returning the
2692 number (for encoding in instructions) of the given completer. */
2693
2694 static int
2695 pa_parse_neg_cmpsub_cmpltr (char **s)
2696 {
2697 int cmpltr;
2698 char *name = *s + 1;
2699 char c;
2700 char *save_s = *s;
2701 int nullify = 0;
2702
2703 cmpltr = 0;
2704 if (**s == ',')
2705 {
2706 *s += 1;
2707 while (**s != ',' && **s != ' ' && **s != '\t')
2708 *s += 1;
2709 c = **s;
2710 **s = 0x00;
2711
2712 if (strcasecmp (name, "tr") == 0)
2713 {
2714 cmpltr = 0;
2715 }
2716 else if (strcmp (name, "<>") == 0)
2717 {
2718 cmpltr = 1;
2719 }
2720 else if (strcmp (name, ">=") == 0)
2721 {
2722 cmpltr = 2;
2723 }
2724 else if (strcmp (name, ">") == 0)
2725 {
2726 cmpltr = 3;
2727 }
2728 else if (strcmp (name, ">>=") == 0)
2729 {
2730 cmpltr = 4;
2731 }
2732 else if (strcmp (name, ">>") == 0)
2733 {
2734 cmpltr = 5;
2735 }
2736 else if (strcasecmp (name, "nsv") == 0)
2737 {
2738 cmpltr = 6;
2739 }
2740 else if (strcasecmp (name, "ev") == 0)
2741 {
2742 cmpltr = 7;
2743 }
2744 /* If we have something like addb,n then there is no condition
2745 completer. */
2746 else if (strcasecmp (name, "n") == 0)
2747 {
2748 cmpltr = 0;
2749 nullify = 1;
2750 }
2751 else
2752 {
2753 cmpltr = -1;
2754 }
2755 **s = c;
2756 }
2757
2758 /* Reset pointers if this was really a ,n for a branch instruction. */
2759 if (nullify)
2760 *s = save_s;
2761
2762 return cmpltr;
2763 }
2764
2765 /* Parse a 64 bit compare and branch completer returning the number (for
2766 encoding in instructions) of the given completer.
2767
2768 Nonnegated comparisons are returned as 0-7, negated comparisons are
2769 returned as 8-15. */
2770
2771 static int
2772 pa_parse_cmpb_64_cmpltr (char **s)
2773 {
2774 int cmpltr;
2775 char *name = *s + 1;
2776 char c;
2777
2778 cmpltr = -1;
2779 if (**s == ',')
2780 {
2781 *s += 1;
2782 while (**s != ',' && **s != ' ' && **s != '\t')
2783 *s += 1;
2784 c = **s;
2785 **s = 0x00;
2786
2787 if (strcmp (name, "*") == 0)
2788 {
2789 cmpltr = 0;
2790 }
2791 else if (strcmp (name, "*=") == 0)
2792 {
2793 cmpltr = 1;
2794 }
2795 else if (strcmp (name, "*<") == 0)
2796 {
2797 cmpltr = 2;
2798 }
2799 else if (strcmp (name, "*<=") == 0)
2800 {
2801 cmpltr = 3;
2802 }
2803 else if (strcmp (name, "*<<") == 0)
2804 {
2805 cmpltr = 4;
2806 }
2807 else if (strcmp (name, "*<<=") == 0)
2808 {
2809 cmpltr = 5;
2810 }
2811 else if (strcasecmp (name, "*sv") == 0)
2812 {
2813 cmpltr = 6;
2814 }
2815 else if (strcasecmp (name, "*od") == 0)
2816 {
2817 cmpltr = 7;
2818 }
2819 else if (strcasecmp (name, "*tr") == 0)
2820 {
2821 cmpltr = 8;
2822 }
2823 else if (strcmp (name, "*<>") == 0)
2824 {
2825 cmpltr = 9;
2826 }
2827 else if (strcmp (name, "*>=") == 0)
2828 {
2829 cmpltr = 10;
2830 }
2831 else if (strcmp (name, "*>") == 0)
2832 {
2833 cmpltr = 11;
2834 }
2835 else if (strcmp (name, "*>>=") == 0)
2836 {
2837 cmpltr = 12;
2838 }
2839 else if (strcmp (name, "*>>") == 0)
2840 {
2841 cmpltr = 13;
2842 }
2843 else if (strcasecmp (name, "*nsv") == 0)
2844 {
2845 cmpltr = 14;
2846 }
2847 else if (strcasecmp (name, "*ev") == 0)
2848 {
2849 cmpltr = 15;
2850 }
2851 else
2852 {
2853 cmpltr = -1;
2854 }
2855 **s = c;
2856 }
2857
2858 return cmpltr;
2859 }
2860
2861 /* Parse a 64 bit compare immediate and branch completer returning the number
2862 (for encoding in instructions) of the given completer. */
2863
2864 static int
2865 pa_parse_cmpib_64_cmpltr (char **s)
2866 {
2867 int cmpltr;
2868 char *name = *s + 1;
2869 char c;
2870
2871 cmpltr = -1;
2872 if (**s == ',')
2873 {
2874 *s += 1;
2875 while (**s != ',' && **s != ' ' && **s != '\t')
2876 *s += 1;
2877 c = **s;
2878 **s = 0x00;
2879
2880 if (strcmp (name, "*<<") == 0)
2881 {
2882 cmpltr = 0;
2883 }
2884 else if (strcmp (name, "*=") == 0)
2885 {
2886 cmpltr = 1;
2887 }
2888 else if (strcmp (name, "*<") == 0)
2889 {
2890 cmpltr = 2;
2891 }
2892 else if (strcmp (name, "*<=") == 0)
2893 {
2894 cmpltr = 3;
2895 }
2896 else if (strcmp (name, "*>>=") == 0)
2897 {
2898 cmpltr = 4;
2899 }
2900 else if (strcmp (name, "*<>") == 0)
2901 {
2902 cmpltr = 5;
2903 }
2904 else if (strcasecmp (name, "*>=") == 0)
2905 {
2906 cmpltr = 6;
2907 }
2908 else if (strcasecmp (name, "*>") == 0)
2909 {
2910 cmpltr = 7;
2911 }
2912 else
2913 {
2914 cmpltr = -1;
2915 }
2916 **s = c;
2917 }
2918
2919 return cmpltr;
2920 }
2921
2922 /* Parse a non-negated addition completer returning the number
2923 (for encoding in instructions) of the given completer. */
2924
2925 static int
2926 pa_parse_nonneg_add_cmpltr (char **s)
2927 {
2928 int cmpltr;
2929 char *name = *s + 1;
2930 char c;
2931 char *save_s = *s;
2932 int nullify = 0;
2933
2934 cmpltr = 0;
2935 if (**s == ',')
2936 {
2937 *s += 1;
2938 while (**s != ',' && **s != ' ' && **s != '\t')
2939 *s += 1;
2940 c = **s;
2941 **s = 0x00;
2942 if (strcmp (name, "=") == 0)
2943 {
2944 cmpltr = 1;
2945 }
2946 else if (strcmp (name, "<") == 0)
2947 {
2948 cmpltr = 2;
2949 }
2950 else if (strcmp (name, "<=") == 0)
2951 {
2952 cmpltr = 3;
2953 }
2954 else if (strcasecmp (name, "nuv") == 0)
2955 {
2956 cmpltr = 4;
2957 }
2958 else if (strcasecmp (name, "znv") == 0)
2959 {
2960 cmpltr = 5;
2961 }
2962 else if (strcasecmp (name, "sv") == 0)
2963 {
2964 cmpltr = 6;
2965 }
2966 else if (strcasecmp (name, "od") == 0)
2967 {
2968 cmpltr = 7;
2969 }
2970 /* If we have something like addb,n then there is no condition
2971 completer. */
2972 else if (strcasecmp (name, "n") == 0)
2973 {
2974 cmpltr = 0;
2975 nullify = 1;
2976 }
2977 else
2978 {
2979 cmpltr = -1;
2980 }
2981 **s = c;
2982 }
2983
2984 /* Reset pointers if this was really a ,n for a branch instruction. */
2985 if (nullify)
2986 *s = save_s;
2987
2988 return cmpltr;
2989 }
2990
2991 /* Parse a negated addition completer returning the number
2992 (for encoding in instructions) of the given completer. */
2993
2994 static int
2995 pa_parse_neg_add_cmpltr (char **s)
2996 {
2997 int cmpltr;
2998 char *name = *s + 1;
2999 char c;
3000 char *save_s = *s;
3001 int nullify = 0;
3002
3003 cmpltr = 0;
3004 if (**s == ',')
3005 {
3006 *s += 1;
3007 while (**s != ',' && **s != ' ' && **s != '\t')
3008 *s += 1;
3009 c = **s;
3010 **s = 0x00;
3011 if (strcasecmp (name, "tr") == 0)
3012 {
3013 cmpltr = 0;
3014 }
3015 else if (strcmp (name, "<>") == 0)
3016 {
3017 cmpltr = 1;
3018 }
3019 else if (strcmp (name, ">=") == 0)
3020 {
3021 cmpltr = 2;
3022 }
3023 else if (strcmp (name, ">") == 0)
3024 {
3025 cmpltr = 3;
3026 }
3027 else if (strcasecmp (name, "uv") == 0)
3028 {
3029 cmpltr = 4;
3030 }
3031 else if (strcasecmp (name, "vnz") == 0)
3032 {
3033 cmpltr = 5;
3034 }
3035 else if (strcasecmp (name, "nsv") == 0)
3036 {
3037 cmpltr = 6;
3038 }
3039 else if (strcasecmp (name, "ev") == 0)
3040 {
3041 cmpltr = 7;
3042 }
3043 /* If we have something like addb,n then there is no condition
3044 completer. */
3045 else if (strcasecmp (name, "n") == 0)
3046 {
3047 cmpltr = 0;
3048 nullify = 1;
3049 }
3050 else
3051 {
3052 cmpltr = -1;
3053 }
3054 **s = c;
3055 }
3056
3057 /* Reset pointers if this was really a ,n for a branch instruction. */
3058 if (nullify)
3059 *s = save_s;
3060
3061 return cmpltr;
3062 }
3063
3064 /* Parse a 64 bit wide mode add and branch completer returning the number (for
3065 encoding in instructions) of the given completer. */
3066
3067 static int
3068 pa_parse_addb_64_cmpltr (char **s)
3069 {
3070 int cmpltr;
3071 char *name = *s + 1;
3072 char c;
3073 char *save_s = *s;
3074 int nullify = 0;
3075
3076 cmpltr = 0;
3077 if (**s == ',')
3078 {
3079 *s += 1;
3080 while (**s != ',' && **s != ' ' && **s != '\t')
3081 *s += 1;
3082 c = **s;
3083 **s = 0x00;
3084 if (strcmp (name, "=") == 0)
3085 {
3086 cmpltr = 1;
3087 }
3088 else if (strcmp (name, "<") == 0)
3089 {
3090 cmpltr = 2;
3091 }
3092 else if (strcmp (name, "<=") == 0)
3093 {
3094 cmpltr = 3;
3095 }
3096 else if (strcasecmp (name, "nuv") == 0)
3097 {
3098 cmpltr = 4;
3099 }
3100 else if (strcasecmp (name, "*=") == 0)
3101 {
3102 cmpltr = 5;
3103 }
3104 else if (strcasecmp (name, "*<") == 0)
3105 {
3106 cmpltr = 6;
3107 }
3108 else if (strcasecmp (name, "*<=") == 0)
3109 {
3110 cmpltr = 7;
3111 }
3112 else if (strcmp (name, "tr") == 0)
3113 {
3114 cmpltr = 8;
3115 }
3116 else if (strcmp (name, "<>") == 0)
3117 {
3118 cmpltr = 9;
3119 }
3120 else if (strcmp (name, ">=") == 0)
3121 {
3122 cmpltr = 10;
3123 }
3124 else if (strcmp (name, ">") == 0)
3125 {
3126 cmpltr = 11;
3127 }
3128 else if (strcasecmp (name, "uv") == 0)
3129 {
3130 cmpltr = 12;
3131 }
3132 else if (strcasecmp (name, "*<>") == 0)
3133 {
3134 cmpltr = 13;
3135 }
3136 else if (strcasecmp (name, "*>=") == 0)
3137 {
3138 cmpltr = 14;
3139 }
3140 else if (strcasecmp (name, "*>") == 0)
3141 {
3142 cmpltr = 15;
3143 }
3144 /* If we have something like addb,n then there is no condition
3145 completer. */
3146 else if (strcasecmp (name, "n") == 0)
3147 {
3148 cmpltr = 0;
3149 nullify = 1;
3150 }
3151 else
3152 {
3153 cmpltr = -1;
3154 }
3155 **s = c;
3156 }
3157
3158 /* Reset pointers if this was really a ,n for a branch instruction. */
3159 if (nullify)
3160 *s = save_s;
3161
3162 return cmpltr;
3163 }
3164
3165 /* Do the real work for assembling a single instruction. Store results
3166 into the global "the_insn" variable. */
3167
3168 static void
3169 pa_ip (char *str)
3170 {
3171 const char *error_message = "";
3172 char *s, c, *argstart, *name, *save_s;
3173 const char *args;
3174 int match = FALSE;
3175 int comma = 0;
3176 int cmpltr, nullif, flag, cond, need_cond, num;
3177 int immediate_check = 0, pos = -1, len = -1;
3178 unsigned long opcode;
3179 struct pa_opcode *insn;
3180
3181 #ifdef OBJ_SOM
3182 /* We must have a valid space and subspace. */
3183 pa_check_current_space_and_subspace ();
3184 #endif
3185
3186 /* Convert everything up to the first whitespace character into lower
3187 case. */
3188 for (s = str; *s != ' ' && *s != '\t' && *s != '\n' && *s != '\0'; s++)
3189 *s = TOLOWER (*s);
3190
3191 /* Skip to something interesting. */
3192 for (s = str;
3193 ISUPPER (*s) || ISLOWER (*s) || (*s >= '0' && *s <= '3');
3194 ++s)
3195 ;
3196
3197 switch (*s)
3198 {
3199
3200 case '\0':
3201 break;
3202
3203 case ',':
3204 comma = 1;
3205
3206 /*FALLTHROUGH */
3207
3208 case ' ':
3209 *s++ = '\0';
3210 break;
3211
3212 default:
3213 as_bad (_("Unknown opcode: `%s'"), str);
3214 return;
3215 }
3216
3217 /* Look up the opcode in the hash table. */
3218 if ((insn = (struct pa_opcode *) hash_find (op_hash, str)) == NULL)
3219 {
3220 as_bad (_("Unknown opcode: `%s'"), str);
3221 return;
3222 }
3223
3224 if (comma)
3225 *--s = ',';
3226
3227 /* Mark the location where arguments for the instruction start, then
3228 start processing them. */
3229 argstart = s;
3230 for (;;)
3231 {
3232 /* Do some initialization. */
3233 opcode = insn->match;
3234 strict = (insn->flags & FLAG_STRICT);
3235 memset (&the_insn, 0, sizeof (the_insn));
3236 need_cond = 1;
3237
3238 the_insn.reloc = R_HPPA_NONE;
3239
3240 if (insn->arch >= pa20
3241 && bfd_get_mach (stdoutput) < insn->arch)
3242 goto failed;
3243
3244 /* Build the opcode, checking as we go to make
3245 sure that the operands match. */
3246 for (args = insn->args;; ++args)
3247 {
3248 /* Absorb white space in instruction. */
3249 while (*s == ' ' || *s == '\t')
3250 s++;
3251
3252 switch (*args)
3253 {
3254 /* End of arguments. */
3255 case '\0':
3256 if (*s == '\0')
3257 match = TRUE;
3258 break;
3259
3260 case '+':
3261 if (*s == '+')
3262 {
3263 ++s;
3264 continue;
3265 }
3266 if (*s == '-')
3267 continue;
3268 break;
3269
3270 /* These must match exactly. */
3271 case '(':
3272 case ')':
3273 case ',':
3274 case ' ':
3275 if (*s++ == *args)
3276 continue;
3277 break;
3278
3279 /* Handle a 5 bit register or control register field at 10. */
3280 case 'b':
3281 case '^':
3282 if (!pa_parse_number (&s, 0))
3283 break;
3284 num = pa_number;
3285 CHECK_FIELD (num, 31, 0, 0);
3286 INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
3287
3288 /* Handle %sar or %cr11. No bits get set, we just verify that it
3289 is there. */
3290 case '!':
3291 /* Skip whitespace before register. */
3292 while (*s == ' ' || *s == '\t')
3293 s = s + 1;
3294
3295 if (!strncasecmp (s, "%sar", 4))
3296 {
3297 s += 4;
3298 continue;
3299 }
3300 else if (!strncasecmp (s, "%cr11", 5))
3301 {
3302 s += 5;
3303 continue;
3304 }
3305 break;
3306
3307 /* Handle a 5 bit register field at 15. */
3308 case 'x':
3309 if (!pa_parse_number (&s, 0))
3310 break;
3311 num = pa_number;
3312 CHECK_FIELD (num, 31, 0, 0);
3313 INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
3314
3315 /* Handle a 5 bit register field at 31. */
3316 case 't':
3317 if (!pa_parse_number (&s, 0))
3318 break;
3319 num = pa_number;
3320 CHECK_FIELD (num, 31, 0, 0);
3321 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
3322
3323 /* Handle a 5 bit register field at 10 and 15. */
3324 case 'a':
3325 if (!pa_parse_number (&s, 0))
3326 break;
3327 num = pa_number;
3328 CHECK_FIELD (num, 31, 0, 0);
3329 opcode |= num << 16;
3330 INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
3331
3332 /* Handle a 5 bit field length at 31. */
3333 case 'T':
3334 num = pa_get_absolute_expression (&the_insn, &s);
3335 if (strict && the_insn.exp.X_op != O_constant)
3336 break;
3337 s = expr_end;
3338 CHECK_FIELD (num, 32, 1, 0);
3339 SAVE_IMMEDIATE(num);
3340 INSERT_FIELD_AND_CONTINUE (opcode, 32 - num, 0);
3341
3342 /* Handle a 5 bit immediate at 15. */
3343 case '5':
3344 num = pa_get_absolute_expression (&the_insn, &s);
3345 if (strict && the_insn.exp.X_op != O_constant)
3346 break;
3347 s = expr_end;
3348 /* When in strict mode, we want to just reject this
3349 match instead of giving an out of range error. */
3350 CHECK_FIELD (num, 15, -16, strict);
3351 num = low_sign_unext (num, 5);
3352 INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
3353
3354 /* Handle a 5 bit immediate at 31. */
3355 case 'V':
3356 num = pa_get_absolute_expression (&the_insn, &s);
3357 if (strict && the_insn.exp.X_op != O_constant)
3358 break;
3359 s = expr_end;
3360 /* When in strict mode, we want to just reject this
3361 match instead of giving an out of range error. */
3362 CHECK_FIELD (num, 15, -16, strict);
3363 num = low_sign_unext (num, 5);
3364 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
3365
3366 /* Handle an unsigned 5 bit immediate at 31. */
3367 case 'r':
3368 num = pa_get_absolute_expression (&the_insn, &s);
3369 if (strict && the_insn.exp.X_op != O_constant)
3370 break;
3371 s = expr_end;
3372 CHECK_FIELD (num, 31, 0, strict);
3373 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
3374
3375 /* Handle an unsigned 5 bit immediate at 15. */
3376 case 'R':
3377 num = pa_get_absolute_expression (&the_insn, &s);
3378 if (strict && the_insn.exp.X_op != O_constant)
3379 break;
3380 s = expr_end;
3381 CHECK_FIELD (num, 31, 0, strict);
3382 INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
3383
3384 /* Handle an unsigned 10 bit immediate at 15. */
3385 case 'U':
3386 num = pa_get_absolute_expression (&the_insn, &s);
3387 if (strict && the_insn.exp.X_op != O_constant)
3388 break;
3389 s = expr_end;
3390 CHECK_FIELD (num, 1023, 0, strict);
3391 INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
3392
3393 /* Handle a 2 bit space identifier at 17. */
3394 case 's':
3395 if (!pa_parse_number (&s, 0))
3396 break;
3397 num = pa_number;
3398 CHECK_FIELD (num, 3, 0, 1);
3399 INSERT_FIELD_AND_CONTINUE (opcode, num, 14);
3400
3401 /* Handle a 3 bit space identifier at 18. */
3402 case 'S':
3403 if (!pa_parse_number (&s, 0))
3404 break;
3405 num = pa_number;
3406 CHECK_FIELD (num, 7, 0, 1);
3407 opcode |= re_assemble_3 (num);
3408 continue;
3409
3410 /* Handle all completers. */
3411 case 'c':
3412 switch (*++args)
3413 {
3414
3415 /* Handle a completer for an indexing load or store. */
3416 case 'X':
3417 case 'x':
3418 {
3419 int uu = 0;
3420 int m = 0;
3421 int i = 0;
3422 while (*s == ',' && i < 2)
3423 {
3424 s++;
3425 if (strncasecmp (s, "sm", 2) == 0)
3426 {
3427 uu = 1;
3428 m = 1;
3429 s++;
3430 i++;
3431 }
3432 else if (strncasecmp (s, "m", 1) == 0)
3433 m = 1;
3434 else if ((strncasecmp (s, "s ", 2) == 0)
3435 || (strncasecmp (s, "s,", 2) == 0))
3436 uu = 1;
3437 else if (strict)
3438 {
3439 /* This is a match failure. */
3440 s--;
3441 break;
3442 }
3443 else
3444 as_bad (_("Invalid Indexed Load Completer."));
3445 s++;
3446 i++;
3447 }
3448 if (i > 2)
3449 as_bad (_("Invalid Indexed Load Completer Syntax."));
3450 opcode |= m << 5;
3451 INSERT_FIELD_AND_CONTINUE (opcode, uu, 13);
3452 }
3453
3454 /* Handle a short load/store completer. */
3455 case 'M':
3456 case 'm':
3457 case 'q':
3458 case 'J':
3459 case 'e':
3460 {
3461 int a = 0;
3462 int m = 0;
3463 if (*s == ',')
3464 {
3465 s++;
3466 if (strncasecmp (s, "ma", 2) == 0)
3467 {
3468 a = 0;
3469 m = 1;
3470 s += 2;
3471 }
3472 else if (strncasecmp (s, "mb", 2) == 0)
3473 {
3474 a = 1;
3475 m = 1;
3476 s += 2;
3477 }
3478 else if (strict)
3479 /* This is a match failure. */
3480 s--;
3481 else
3482 {
3483 as_bad (_("Invalid Short Load/Store Completer."));
3484 s += 2;
3485 }
3486 }
3487 /* If we did not get a ma/mb completer, then we do not
3488 consider this a positive match for 'ce'. */
3489 else if (*args == 'e')
3490 break;
3491
3492 /* 'J', 'm', 'M' and 'q' are the same, except for where they
3493 encode the before/after field. */
3494 if (*args == 'm' || *args == 'M')
3495 {
3496 opcode |= m << 5;
3497 INSERT_FIELD_AND_CONTINUE (opcode, a, 13);
3498 }
3499 else if (*args == 'q')
3500 {
3501 opcode |= m << 3;
3502 INSERT_FIELD_AND_CONTINUE (opcode, a, 2);
3503 }
3504 else if (*args == 'J')
3505 {
3506 /* M bit is explicit in the major opcode. */
3507 INSERT_FIELD_AND_CONTINUE (opcode, a, 2);
3508 }
3509 else
3510 {
3511 gas_assert (*args == 'e');
3512 /* Stash the ma/mb flag temporarily in the
3513 instruction. We will use (and remove it)
3514 later when handling 'J', 'K', '<' & '>'. */
3515 opcode |= a;
3516 continue;
3517 }
3518 }
3519
3520 /* Handle a stbys completer. */
3521 case 'A':
3522 case 's':
3523 {
3524 int a = 0;
3525 int m = 0;
3526 int i = 0;
3527 while (*s == ',' && i < 2)
3528 {
3529 s++;
3530 if (strncasecmp (s, "m", 1) == 0)
3531 m = 1;
3532 else if ((strncasecmp (s, "b ", 2) == 0)
3533 || (strncasecmp (s, "b,", 2) == 0))
3534 a = 0;
3535 else if (strncasecmp (s, "e", 1) == 0)
3536 a = 1;
3537 /* In strict mode, this is a match failure. */
3538 else if (strict)
3539 {
3540 s--;
3541 break;
3542 }
3543 else
3544 as_bad (_("Invalid Store Bytes Short Completer"));
3545 s++;
3546 i++;
3547 }
3548 if (i > 2)
3549 as_bad (_("Invalid Store Bytes Short Completer"));
3550 opcode |= m << 5;
3551 INSERT_FIELD_AND_CONTINUE (opcode, a, 13);
3552 }
3553
3554 /* Handle load cache hint completer. */
3555 case 'c':
3556 cmpltr = 0;
3557 if (!strncmp (s, ",sl", 3))
3558 {
3559 s += 3;
3560 cmpltr = 2;
3561 }
3562 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10);
3563
3564 /* Handle store cache hint completer. */
3565 case 'C':
3566 cmpltr = 0;
3567 if (!strncmp (s, ",sl", 3))
3568 {
3569 s += 3;
3570 cmpltr = 2;
3571 }
3572 else if (!strncmp (s, ",bc", 3))
3573 {
3574 s += 3;
3575 cmpltr = 1;
3576 }
3577 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10);
3578
3579 /* Handle load and clear cache hint completer. */
3580 case 'd':
3581 cmpltr = 0;
3582 if (!strncmp (s, ",co", 3))
3583 {
3584 s += 3;
3585 cmpltr = 1;
3586 }
3587 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10);
3588
3589 /* Handle load ordering completer. */
3590 case 'o':
3591 if (strncmp (s, ",o", 2) != 0)
3592 break;
3593 s += 2;
3594 continue;
3595
3596 /* Handle a branch gate completer. */
3597 case 'g':
3598 if (strncasecmp (s, ",gate", 5) != 0)
3599 break;
3600 s += 5;
3601 continue;
3602
3603 /* Handle a branch link and push completer. */
3604 case 'p':
3605 if (strncasecmp (s, ",l,push", 7) != 0)
3606 break;
3607 s += 7;
3608 continue;
3609
3610 /* Handle a branch link completer. */
3611 case 'l':
3612 if (strncasecmp (s, ",l", 2) != 0)
3613 break;
3614 s += 2;
3615 continue;
3616
3617 /* Handle a branch pop completer. */
3618 case 'P':
3619 if (strncasecmp (s, ",pop", 4) != 0)
3620 break;
3621 s += 4;
3622 continue;
3623
3624 /* Handle a local processor completer. */
3625 case 'L':
3626 if (strncasecmp (s, ",l", 2) != 0)
3627 break;
3628 s += 2;
3629 continue;
3630
3631 /* Handle a PROBE read/write completer. */
3632 case 'w':
3633 flag = 0;
3634 if (!strncasecmp (s, ",w", 2))
3635 {
3636 flag = 1;
3637 s += 2;
3638 }
3639 else if (!strncasecmp (s, ",r", 2))
3640 {
3641 flag = 0;
3642 s += 2;
3643 }
3644
3645 INSERT_FIELD_AND_CONTINUE (opcode, flag, 6);
3646
3647 /* Handle MFCTL wide completer. */
3648 case 'W':
3649 if (strncasecmp (s, ",w", 2) != 0)
3650 break;
3651 s += 2;
3652 continue;
3653
3654 /* Handle an RFI restore completer. */
3655 case 'r':
3656 flag = 0;
3657 if (!strncasecmp (s, ",r", 2))
3658 {
3659 flag = 5;
3660 s += 2;
3661 }
3662
3663 INSERT_FIELD_AND_CONTINUE (opcode, flag, 5);
3664
3665 /* Handle a system control completer. */
3666 case 'Z':
3667 if (*s == ',' && (*(s + 1) == 'm' || *(s + 1) == 'M'))
3668 {
3669 flag = 1;
3670 s += 2;
3671 }
3672 else
3673 flag = 0;
3674
3675 INSERT_FIELD_AND_CONTINUE (opcode, flag, 5);
3676
3677 /* Handle intermediate/final completer for DCOR. */
3678 case 'i':
3679 flag = 0;
3680 if (!strncasecmp (s, ",i", 2))
3681 {
3682 flag = 1;
3683 s += 2;
3684 }
3685
3686 INSERT_FIELD_AND_CONTINUE (opcode, flag, 6);
3687
3688 /* Handle zero/sign extension completer. */
3689 case 'z':
3690 flag = 1;
3691 if (!strncasecmp (s, ",z", 2))
3692 {
3693 flag = 0;
3694 s += 2;
3695 }
3696
3697 INSERT_FIELD_AND_CONTINUE (opcode, flag, 10);
3698
3699 /* Handle add completer. */
3700 case 'a':
3701 flag = 1;
3702 if (!strncasecmp (s, ",l", 2))
3703 {
3704 flag = 2;
3705 s += 2;
3706 }
3707 else if (!strncasecmp (s, ",tsv", 4))
3708 {
3709 flag = 3;
3710 s += 4;
3711 }
3712
3713 INSERT_FIELD_AND_CONTINUE (opcode, flag, 10);
3714
3715 /* Handle 64 bit carry for ADD. */
3716 case 'Y':
3717 flag = 0;
3718 if (!strncasecmp (s, ",dc,tsv", 7) ||
3719 !strncasecmp (s, ",tsv,dc", 7))
3720 {
3721 flag = 1;
3722 s += 7;
3723 }
3724 else if (!strncasecmp (s, ",dc", 3))
3725 {
3726 flag = 0;
3727 s += 3;
3728 }
3729 else
3730 break;
3731
3732 /* Condition is not required with "dc". */
3733 need_cond = 0;
3734 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
3735
3736 /* Handle 32 bit carry for ADD. */
3737 case 'y':
3738 flag = 0;
3739 if (!strncasecmp (s, ",c,tsv", 6) ||
3740 !strncasecmp (s, ",tsv,c", 6))
3741 {
3742 flag = 1;
3743 s += 6;
3744 }
3745 else if (!strncasecmp (s, ",c", 2))
3746 {
3747 flag = 0;
3748 s += 2;
3749 }
3750 else
3751 break;
3752
3753 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
3754
3755 /* Handle trap on signed overflow. */
3756 case 'v':
3757 flag = 0;
3758 if (!strncasecmp (s, ",tsv", 4))
3759 {
3760 flag = 1;
3761 s += 4;
3762 }
3763
3764 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
3765
3766 /* Handle trap on condition and overflow. */
3767 case 't':
3768 flag = 0;
3769 if (!strncasecmp (s, ",tc,tsv", 7) ||
3770 !strncasecmp (s, ",tsv,tc", 7))
3771 {
3772 flag = 1;
3773 s += 7;
3774 }
3775 else if (!strncasecmp (s, ",tc", 3))
3776 {
3777 flag = 0;
3778 s += 3;
3779 }
3780 else
3781 break;
3782
3783 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
3784
3785 /* Handle 64 bit borrow for SUB. */
3786 case 'B':
3787 flag = 0;
3788 if (!strncasecmp (s, ",db,tsv", 7) ||
3789 !strncasecmp (s, ",tsv,db", 7))
3790 {
3791 flag = 1;
3792 s += 7;
3793 }
3794 else if (!strncasecmp (s, ",db", 3))
3795 {
3796 flag = 0;
3797 s += 3;
3798 }
3799 else
3800 break;
3801
3802 /* Condition is not required with "db". */
3803 need_cond = 0;
3804 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
3805
3806 /* Handle 32 bit borrow for SUB. */
3807 case 'b':
3808 flag = 0;
3809 if (!strncasecmp (s, ",b,tsv", 6) ||
3810 !strncasecmp (s, ",tsv,b", 6))
3811 {
3812 flag = 1;
3813 s += 6;
3814 }
3815 else if (!strncasecmp (s, ",b", 2))
3816 {
3817 flag = 0;
3818 s += 2;
3819 }
3820 else
3821 break;
3822
3823 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
3824
3825 /* Handle trap condition completer for UADDCM. */
3826 case 'T':
3827 flag = 0;
3828 if (!strncasecmp (s, ",tc", 3))
3829 {
3830 flag = 1;
3831 s += 3;
3832 }
3833
3834 INSERT_FIELD_AND_CONTINUE (opcode, flag, 6);
3835
3836 /* Handle signed/unsigned at 21. */
3837 case 'S':
3838 {
3839 int sign = 1;
3840 if (strncasecmp (s, ",s", 2) == 0)
3841 {
3842 sign = 1;
3843 s += 2;
3844 }
3845 else if (strncasecmp (s, ",u", 2) == 0)
3846 {
3847 sign = 0;
3848 s += 2;
3849 }
3850
3851 INSERT_FIELD_AND_CONTINUE (opcode, sign, 10);
3852 }
3853
3854 /* Handle left/right combination at 17:18. */
3855 case 'h':
3856 if (*s++ == ',')
3857 {
3858 int lr = 0;
3859 if (*s == 'r')
3860 lr = 2;
3861 else if (*s == 'l')
3862 lr = 0;
3863 else
3864 as_bad (_("Invalid left/right combination completer"));
3865
3866 s++;
3867 INSERT_FIELD_AND_CONTINUE (opcode, lr, 13);
3868 }
3869 else
3870 as_bad (_("Invalid left/right combination completer"));
3871 break;
3872
3873 /* Handle saturation at 24:25. */
3874 case 'H':
3875 {
3876 int sat = 3;
3877 if (strncasecmp (s, ",ss", 3) == 0)
3878 {
3879 sat = 1;
3880 s += 3;
3881 }
3882 else if (strncasecmp (s, ",us", 3) == 0)
3883 {
3884 sat = 0;
3885 s += 3;
3886 }
3887
3888 INSERT_FIELD_AND_CONTINUE (opcode, sat, 6);
3889 }
3890
3891 /* Handle permutation completer. */
3892 case '*':
3893 if (*s++ == ',')
3894 {
3895 int permloc[4];
3896 int perm = 0;
3897 int i = 0;
3898 permloc[0] = 13;
3899 permloc[1] = 10;
3900 permloc[2] = 8;
3901 permloc[3] = 6;
3902 for (; i < 4; i++)
3903 {
3904 switch (*s++)
3905 {
3906 case '0':
3907 perm = 0;
3908 break;
3909 case '1':
3910 perm = 1;
3911 break;
3912 case '2':
3913 perm = 2;
3914 break;
3915 case '3':
3916 perm = 3;
3917 break;
3918 default:
3919 as_bad (_("Invalid permutation completer"));
3920 }
3921 opcode |= perm << permloc[i];
3922 }
3923 continue;
3924 }
3925 else
3926 as_bad (_("Invalid permutation completer"));
3927 break;
3928
3929 default:
3930 abort ();
3931 }
3932 break;
3933
3934 /* Handle all conditions. */
3935 case '?':
3936 {
3937 args++;
3938 switch (*args)
3939 {
3940 /* Handle FP compare conditions. */
3941 case 'f':
3942 cond = pa_parse_fp_cmp_cond (&s);
3943 INSERT_FIELD_AND_CONTINUE (opcode, cond, 0);
3944
3945 /* Handle an add condition. */
3946 case 'A':
3947 case 'a':
3948 cmpltr = 0;
3949 flag = 0;
3950 if (*s == ',')
3951 {
3952 s++;
3953
3954 /* 64 bit conditions. */
3955 if (*args == 'A')
3956 {
3957 if (*s == '*')
3958 s++;
3959 else
3960 break;
3961 }
3962 else if (*s == '*')
3963 break;
3964
3965 name = s;
3966 while (*s != ',' && *s != ' ' && *s != '\t')
3967 s += 1;
3968 c = *s;
3969 *s = 0x00;
3970 if (strcmp (name, "=") == 0)
3971 cmpltr = 1;
3972 else if (strcmp (name, "<") == 0)
3973 cmpltr = 2;
3974 else if (strcmp (name, "<=") == 0)
3975 cmpltr = 3;
3976 else if (strcasecmp (name, "nuv") == 0)
3977 cmpltr = 4;
3978 else if (strcasecmp (name, "znv") == 0)
3979 cmpltr = 5;
3980 else if (strcasecmp (name, "sv") == 0)
3981 cmpltr = 6;
3982 else if (strcasecmp (name, "od") == 0)
3983 cmpltr = 7;
3984 else if (strcasecmp (name, "tr") == 0)
3985 {
3986 cmpltr = 0;
3987 flag = 1;
3988 }
3989 else if (strcmp (name, "<>") == 0)
3990 {
3991 cmpltr = 1;
3992 flag = 1;
3993 }
3994 else if (strcmp (name, ">=") == 0)
3995 {
3996 cmpltr = 2;
3997 flag = 1;
3998 }
3999 else if (strcmp (name, ">") == 0)
4000 {
4001 cmpltr = 3;
4002 flag = 1;
4003 }
4004 else if (strcasecmp (name, "uv") == 0)
4005 {
4006 cmpltr = 4;
4007 flag = 1;
4008 }
4009 else if (strcasecmp (name, "vnz") == 0)
4010 {
4011 cmpltr = 5;
4012 flag = 1;
4013 }
4014 else if (strcasecmp (name, "nsv") == 0)
4015 {
4016 cmpltr = 6;
4017 flag = 1;
4018 }
4019 else if (strcasecmp (name, "ev") == 0)
4020 {
4021 cmpltr = 7;
4022 flag = 1;
4023 }
4024 /* ",*" is a valid condition. */
4025 else if (*args == 'a' || *name)
4026 as_bad (_("Invalid Add Condition: %s"), name);
4027 *s = c;
4028 }
4029 /* Except with "dc", we have a match failure with
4030 'A' if we don't have a doubleword condition. */
4031 else if (*args == 'A' && need_cond)
4032 break;
4033
4034 opcode |= cmpltr << 13;
4035 INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
4036
4037 /* Handle non-negated add and branch condition. */
4038 case 'd':
4039 cmpltr = pa_parse_nonneg_add_cmpltr (&s);
4040 if (cmpltr < 0)
4041 {
4042 as_bad (_("Invalid Add and Branch Condition"));
4043 cmpltr = 0;
4044 }
4045 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
4046
4047 /* Handle 64 bit wide-mode add and branch condition. */
4048 case 'W':
4049 cmpltr = pa_parse_addb_64_cmpltr (&s);
4050 if (cmpltr < 0)
4051 {
4052 as_bad (_("Invalid Add and Branch Condition"));
4053 cmpltr = 0;
4054 }
4055 else
4056 {
4057 /* Negated condition requires an opcode change. */
4058 opcode |= (cmpltr & 8) << 24;
4059 }
4060 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr & 7, 13);
4061
4062 /* Handle a negated or non-negated add and branch
4063 condition. */
4064 case '@':
4065 save_s = s;
4066 cmpltr = pa_parse_nonneg_add_cmpltr (&s);
4067 if (cmpltr < 0)
4068 {
4069 s = save_s;
4070 cmpltr = pa_parse_neg_add_cmpltr (&s);
4071 if (cmpltr < 0)
4072 {
4073 as_bad (_("Invalid Compare/Subtract Condition"));
4074 cmpltr = 0;
4075 }
4076 else
4077 {
4078 /* Negated condition requires an opcode change. */
4079 opcode |= 1 << 27;
4080 }
4081 }
4082 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
4083
4084 /* Handle branch on bit conditions. */
4085 case 'B':
4086 case 'b':
4087 cmpltr = 0;
4088 if (*s == ',')
4089 {
4090 s++;
4091
4092 if (*args == 'B')
4093 {
4094 if (*s == '*')
4095 s++;
4096 else
4097 break;
4098 }
4099 else if (*s == '*')
4100 break;
4101
4102 if (strncmp (s, "<", 1) == 0)
4103 {
4104 cmpltr = 0;
4105 s++;
4106 }
4107 else if (strncmp (s, ">=", 2) == 0)
4108 {
4109 cmpltr = 1;
4110 s += 2;
4111 }
4112 else
4113 as_bad (_("Invalid Branch On Bit Condition: %c"), *s);
4114 }
4115 else
4116 as_bad (_("Missing Branch On Bit Condition"));
4117
4118 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 15);
4119
4120 /* Handle a compare/subtract condition. */
4121 case 'S':
4122 case 's':
4123 cmpltr = 0;
4124 flag = 0;
4125 if (*s == ',')
4126 {
4127 s++;
4128
4129 /* 64 bit conditions. */
4130 if (*args == 'S')
4131 {
4132 if (*s == '*')
4133 s++;
4134 else
4135 break;
4136 }
4137 else if (*s == '*')
4138 break;
4139
4140 name = s;
4141 while (*s != ',' && *s != ' ' && *s != '\t')
4142 s += 1;
4143 c = *s;
4144 *s = 0x00;
4145 if (strcmp (name, "=") == 0)
4146 cmpltr = 1;
4147 else if (strcmp (name, "<") == 0)
4148 cmpltr = 2;
4149 else if (strcmp (name, "<=") == 0)
4150 cmpltr = 3;
4151 else if (strcasecmp (name, "<<") == 0)
4152 cmpltr = 4;
4153 else if (strcasecmp (name, "<<=") == 0)
4154 cmpltr = 5;
4155 else if (strcasecmp (name, "sv") == 0)
4156 cmpltr = 6;
4157 else if (strcasecmp (name, "od") == 0)
4158 cmpltr = 7;
4159 else if (strcasecmp (name, "tr") == 0)
4160 {
4161 cmpltr = 0;
4162 flag = 1;
4163 }
4164 else if (strcmp (name, "<>") == 0)
4165 {
4166 cmpltr = 1;
4167 flag = 1;
4168 }
4169 else if (strcmp (name, ">=") == 0)
4170 {
4171 cmpltr = 2;
4172 flag = 1;
4173 }
4174 else if (strcmp (name, ">") == 0)
4175 {
4176 cmpltr = 3;
4177 flag = 1;
4178 }
4179 else if (strcasecmp (name, ">>=") == 0)
4180 {
4181 cmpltr = 4;
4182 flag = 1;
4183 }
4184 else if (strcasecmp (name, ">>") == 0)
4185 {
4186 cmpltr = 5;
4187 flag = 1;
4188 }
4189 else if (strcasecmp (name, "nsv") == 0)
4190 {
4191 cmpltr = 6;
4192 flag = 1;
4193 }
4194 else if (strcasecmp (name, "ev") == 0)
4195 {
4196 cmpltr = 7;
4197 flag = 1;
4198 }
4199 /* ",*" is a valid condition. */
4200 else if (*args != 'S' || *name)
4201 as_bad (_("Invalid Compare/Subtract Condition: %s"),
4202 name);
4203 *s = c;
4204 }
4205 /* Except with "db", we have a match failure with
4206 'S' if we don't have a doubleword condition. */
4207 else if (*args == 'S' && need_cond)
4208 break;
4209
4210 opcode |= cmpltr << 13;
4211 INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
4212
4213 /* Handle a non-negated compare condition. */
4214 case 't':
4215 cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s);
4216 if (cmpltr < 0)
4217 {
4218 as_bad (_("Invalid Compare/Subtract Condition"));
4219 cmpltr = 0;
4220 }
4221 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
4222
4223 /* Handle a 32 bit compare and branch condition. */
4224 case 'n':
4225 save_s = s;
4226 cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s);
4227 if (cmpltr < 0)
4228 {
4229 s = save_s;
4230 cmpltr = pa_parse_neg_cmpsub_cmpltr (&s);
4231 if (cmpltr < 0)
4232 {
4233 as_bad (_("Invalid Compare and Branch Condition"));
4234 cmpltr = 0;
4235 }
4236 else
4237 {
4238 /* Negated condition requires an opcode change. */
4239 opcode |= 1 << 27;
4240 }
4241 }
4242
4243 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
4244
4245 /* Handle a 64 bit compare and branch condition. */
4246 case 'N':
4247 cmpltr = pa_parse_cmpb_64_cmpltr (&s);
4248 if (cmpltr >= 0)
4249 {
4250 /* Negated condition requires an opcode change. */
4251 opcode |= (cmpltr & 8) << 26;
4252 }
4253 else
4254 /* Not a 64 bit cond. Give 32 bit a chance. */
4255 break;
4256
4257 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr & 7, 13);
4258
4259 /* Handle a 64 bit cmpib condition. */
4260 case 'Q':
4261 cmpltr = pa_parse_cmpib_64_cmpltr (&s);
4262 if (cmpltr < 0)
4263 /* Not a 64 bit cond. Give 32 bit a chance. */
4264 break;
4265
4266 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
4267
4268 /* Handle a logical instruction condition. */
4269 case 'L':
4270 case 'l':
4271 cmpltr = 0;
4272 flag = 0;
4273 if (*s == ',')
4274 {
4275 s++;
4276
4277 /* 64 bit conditions. */
4278 if (*args == 'L')
4279 {
4280 if (*s == '*')
4281 s++;
4282 else
4283 break;
4284 }
4285 else if (*s == '*')
4286 break;
4287
4288 name = s;
4289 while (*s != ',' && *s != ' ' && *s != '\t')
4290 s += 1;
4291 c = *s;
4292 *s = 0x00;
4293
4294 if (strcmp (name, "=") == 0)
4295 cmpltr = 1;
4296 else if (strcmp (name, "<") == 0)
4297 cmpltr = 2;
4298 else if (strcmp (name, "<=") == 0)
4299 cmpltr = 3;
4300 else if (strcasecmp (name, "od") == 0)
4301 cmpltr = 7;
4302 else if (strcasecmp (name, "tr") == 0)
4303 {
4304 cmpltr = 0;
4305 flag = 1;
4306 }
4307 else if (strcmp (name, "<>") == 0)
4308 {
4309 cmpltr = 1;
4310 flag = 1;
4311 }
4312 else if (strcmp (name, ">=") == 0)
4313 {
4314 cmpltr = 2;
4315 flag = 1;
4316 }
4317 else if (strcmp (name, ">") == 0)
4318 {
4319 cmpltr = 3;
4320 flag = 1;
4321 }
4322 else if (strcasecmp (name, "ev") == 0)
4323 {
4324 cmpltr = 7;
4325 flag = 1;
4326 }
4327 /* ",*" is a valid condition. */
4328 else if (*args != 'L' || *name)
4329 as_bad (_("Invalid Logical Instruction Condition."));
4330 *s = c;
4331 }
4332 /* 32-bit is default for no condition. */
4333 else if (*args == 'L')
4334 break;
4335
4336 opcode |= cmpltr << 13;
4337 INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
4338
4339 /* Handle a shift/extract/deposit condition. */
4340 case 'X':
4341 case 'x':
4342 case 'y':
4343 cmpltr = 0;
4344 /* Check immediate values in shift/extract/deposit
4345 * instructions if they will give undefined behaviour. */
4346 immediate_check = 1;
4347 if (*s == ',')
4348 {
4349 save_s = s++;
4350
4351 /* 64 bit conditions. */
4352 if (*args == 'X')
4353 {
4354 if (*s == '*')
4355 s++;
4356 else
4357 break;
4358 }
4359 else if (*s == '*')
4360 break;
4361
4362 name = s;
4363 while (*s != ',' && *s != ' ' && *s != '\t')
4364 s += 1;
4365 c = *s;
4366 *s = 0x00;
4367 if (strcmp (name, "=") == 0)
4368 cmpltr = 1;
4369 else if (strcmp (name, "<") == 0)
4370 cmpltr = 2;
4371 else if (strcasecmp (name, "od") == 0)
4372 cmpltr = 3;
4373 else if (strcasecmp (name, "tr") == 0)
4374 cmpltr = 4;
4375 else if (strcmp (name, "<>") == 0)
4376 cmpltr = 5;
4377 else if (strcmp (name, ">=") == 0)
4378 cmpltr = 6;
4379 else if (strcasecmp (name, "ev") == 0)
4380 cmpltr = 7;
4381 /* Handle movb,n. Put things back the way they were.
4382 This includes moving s back to where it started. */
4383 else if (strcasecmp (name, "n") == 0 && *args == 'y')
4384 {
4385 *s = c;
4386 s = save_s;
4387 continue;
4388 }
4389 /* ",*" is a valid condition. */
4390 else if (*args != 'X' || *name)
4391 as_bad (_("Invalid Shift/Extract/Deposit Condition."));
4392 *s = c;
4393 }
4394
4395 INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
4396
4397 /* Handle a unit instruction condition. */
4398 case 'U':
4399 case 'u':
4400 cmpltr = 0;
4401 flag = 0;
4402 if (*s == ',')
4403 {
4404 int uxor;
4405 s++;
4406
4407 /* 64 bit conditions. */
4408 if (*args == 'U')
4409 {
4410 if (*s == '*')
4411 s++;
4412 else
4413 break;
4414 }
4415 else if (*s == '*')
4416 break;
4417
4418 /* The uxor instruction only supports unit conditions
4419 not involving carries. */
4420 uxor = (opcode & 0xfc000fc0) == 0x08000380;
4421 if (strncasecmp (s, "sbz", 3) == 0)
4422 {
4423 cmpltr = 2;
4424 s += 3;
4425 }
4426 else if (strncasecmp (s, "shz", 3) == 0)
4427 {
4428 cmpltr = 3;
4429 s += 3;
4430 }
4431 else if (!uxor && strncasecmp (s, "sdc", 3) == 0)
4432 {
4433 cmpltr = 4;
4434 s += 3;
4435 }
4436 else if (!uxor && strncasecmp (s, "sbc", 3) == 0)
4437 {
4438 cmpltr = 6;
4439 s += 3;
4440 }
4441 else if (!uxor && strncasecmp (s, "shc", 3) == 0)
4442 {
4443 cmpltr = 7;
4444 s += 3;
4445 }
4446 else if (strncasecmp (s, "tr", 2) == 0)
4447 {
4448 cmpltr = 0;
4449 flag = 1;
4450 s += 2;
4451 }
4452 else if (strncasecmp (s, "nbz", 3) == 0)
4453 {
4454 cmpltr = 2;
4455 flag = 1;
4456 s += 3;
4457 }
4458 else if (strncasecmp (s, "nhz", 3) == 0)
4459 {
4460 cmpltr = 3;
4461 flag = 1;
4462 s += 3;
4463 }
4464 else if (!uxor && strncasecmp (s, "ndc", 3) == 0)
4465 {
4466 cmpltr = 4;
4467 flag = 1;
4468 s += 3;
4469 }
4470 else if (!uxor && strncasecmp (s, "nbc", 3) == 0)
4471 {
4472 cmpltr = 6;
4473 flag = 1;
4474 s += 3;
4475 }
4476 else if (!uxor && strncasecmp (s, "nhc", 3) == 0)
4477 {
4478 cmpltr = 7;
4479 flag = 1;
4480 s += 3;
4481 }
4482 else if (strncasecmp (s, "swz", 3) == 0)
4483 {
4484 cmpltr = 1;
4485 flag = 0;
4486 s += 3;
4487 }
4488 else if (!uxor && strncasecmp (s, "swc", 3) == 0)
4489 {
4490 cmpltr = 5;
4491 flag = 0;
4492 s += 3;
4493 }
4494 else if (strncasecmp (s, "nwz", 3) == 0)
4495 {
4496 cmpltr = 1;
4497 flag = 1;
4498 s += 3;
4499 }
4500 else if (!uxor && strncasecmp (s, "nwc", 3) == 0)
4501 {
4502 cmpltr = 5;
4503 flag = 1;
4504 s += 3;
4505 }
4506 /* ",*" is a valid condition. */
4507 else if (*args != 'U' || (*s != ' ' && *s != '\t'))
4508 as_bad (_("Invalid Unit Instruction Condition."));
4509 }
4510 /* 32-bit is default for no condition. */
4511 else if (*args == 'U')
4512 break;
4513
4514 opcode |= cmpltr << 13;
4515 INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
4516
4517 default:
4518 abort ();
4519 }
4520 break;
4521 }
4522
4523 /* Handle a nullification completer for branch instructions. */
4524 case 'n':
4525 nullif = pa_parse_nullif (&s);
4526 INSERT_FIELD_AND_CONTINUE (opcode, nullif, 1);
4527
4528 /* Handle a nullification completer for copr and spop insns. */
4529 case 'N':
4530 nullif = pa_parse_nullif (&s);
4531 INSERT_FIELD_AND_CONTINUE (opcode, nullif, 5);
4532
4533 /* Handle ,%r2 completer for new syntax branches. */
4534 case 'L':
4535 if (*s == ',' && strncasecmp (s + 1, "%r2", 3) == 0)
4536 s += 4;
4537 else if (*s == ',' && strncasecmp (s + 1, "%rp", 3) == 0)
4538 s += 4;
4539 else
4540 break;
4541 continue;
4542
4543 /* Handle 3 bit entry into the fp compare array. Valid values
4544 are 0..6 inclusive. */
4545 case 'h':
4546 get_expression (s);
4547 s = expr_end;
4548 if (the_insn.exp.X_op == O_constant)
4549 {
4550 num = evaluate_absolute (&the_insn);
4551 CHECK_FIELD (num, 6, 0, 0);
4552 num++;
4553 INSERT_FIELD_AND_CONTINUE (opcode, num, 13);
4554 }
4555 else
4556 break;
4557
4558 /* Handle 3 bit entry into the fp compare array. Valid values
4559 are 0..6 inclusive. */
4560 case 'm':
4561 get_expression (s);
4562 if (the_insn.exp.X_op == O_constant)
4563 {
4564 s = expr_end;
4565 num = evaluate_absolute (&the_insn);
4566 CHECK_FIELD (num, 6, 0, 0);
4567 num = (num + 1) ^ 1;
4568 INSERT_FIELD_AND_CONTINUE (opcode, num, 13);
4569 }
4570 else
4571 break;
4572
4573 /* Handle graphics test completers for ftest */
4574 case '=':
4575 {
4576 num = pa_parse_ftest_gfx_completer (&s);
4577 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
4578 }
4579
4580 /* Handle a 11 bit immediate at 31. */
4581 case 'i':
4582 the_insn.field_selector = pa_chk_field_selector (&s);
4583 get_expression (s);
4584 s = expr_end;
4585 if (the_insn.exp.X_op == O_constant)
4586 {
4587 num = evaluate_absolute (&the_insn);
4588 CHECK_FIELD (num, 1023, -1024, 0);
4589 num = low_sign_unext (num, 11);
4590 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
4591 }
4592 else
4593 {
4594 if (is_DP_relative (the_insn.exp))
4595 the_insn.reloc = R_HPPA_GOTOFF;
4596 else if (is_PC_relative (the_insn.exp))
4597 the_insn.reloc = R_HPPA_PCREL_CALL;
4598 #ifdef OBJ_ELF
4599 else if (is_tls_gdidx (the_insn.exp))
4600 the_insn.reloc = R_PARISC_TLS_GD21L;
4601 else if (is_tls_ldidx (the_insn.exp))
4602 the_insn.reloc = R_PARISC_TLS_LDM21L;
4603 else if (is_tls_dtpoff (the_insn.exp))
4604 the_insn.reloc = R_PARISC_TLS_LDO21L;
4605 else if (is_tls_ieoff (the_insn.exp))
4606 the_insn.reloc = R_PARISC_TLS_IE21L;
4607 else if (is_tls_leoff (the_insn.exp))
4608 the_insn.reloc = R_PARISC_TLS_LE21L;
4609 #endif
4610 else
4611 the_insn.reloc = R_HPPA;
4612 the_insn.format = 11;
4613 continue;
4614 }
4615
4616 /* Handle a 14 bit immediate at 31. */
4617 case 'J':
4618 the_insn.field_selector = pa_chk_field_selector (&s);
4619 get_expression (s);
4620 s = expr_end;
4621 if (the_insn.exp.X_op == O_constant)
4622 {
4623 int mb;
4624
4625 /* XXX the completer stored away tidbits of information
4626 for us to extract. We need a cleaner way to do this.
4627 Now that we have lots of letters again, it would be
4628 good to rethink this. */
4629 mb = opcode & 1;
4630 opcode -= mb;
4631 num = evaluate_absolute (&the_insn);
4632 if (mb != (num < 0))
4633 break;
4634 CHECK_FIELD (num, 8191, -8192, 0);
4635 num = low_sign_unext (num, 14);
4636 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
4637 }
4638 break;
4639
4640 /* Handle a 14 bit immediate at 31. */
4641 case 'K':
4642 the_insn.field_selector = pa_chk_field_selector (&s);
4643 get_expression (s);
4644 s = expr_end;
4645 if (the_insn.exp.X_op == O_constant)
4646 {
4647 int mb;
4648
4649 mb = opcode & 1;
4650 opcode -= mb;
4651 num = evaluate_absolute (&the_insn);
4652 if (mb == (num < 0))
4653 break;
4654 if (num % 4)
4655 break;
4656 CHECK_FIELD (num, 8191, -8192, 0);
4657 num = low_sign_unext (num, 14);
4658 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
4659 }
4660 break;
4661
4662 /* Handle a 16 bit immediate at 31. */
4663 case '<':
4664 the_insn.field_selector = pa_chk_field_selector (&s);
4665 get_expression (s);
4666 s = expr_end;
4667 if (the_insn.exp.X_op == O_constant)
4668 {
4669 int mb;
4670
4671 mb = opcode & 1;
4672 opcode -= mb;
4673 num = evaluate_absolute (&the_insn);
4674 if (mb != (num < 0))
4675 break;
4676 CHECK_FIELD (num, 32767, -32768, 0);
4677 num = re_assemble_16 (num);
4678 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
4679 }
4680 break;
4681
4682 /* Handle a 16 bit immediate at 31. */
4683 case '>':
4684 the_insn.field_selector = pa_chk_field_selector (&s);
4685 get_expression (s);
4686 s = expr_end;
4687 if (the_insn.exp.X_op == O_constant)
4688 {
4689 int mb;
4690
4691 mb = opcode & 1;
4692 opcode -= mb;
4693 num = evaluate_absolute (&the_insn);
4694 if (mb == (num < 0))
4695 break;
4696 if (num % 4)
4697 break;
4698 CHECK_FIELD (num, 32767, -32768, 0);
4699 num = re_assemble_16 (num);
4700 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
4701 }
4702 break;
4703
4704 /* Handle 14 bit immediate, shifted left three times. */
4705 case '#':
4706 if (bfd_get_mach (stdoutput) != pa20)
4707 break;
4708 the_insn.field_selector = pa_chk_field_selector (&s);
4709 get_expression (s);
4710 s = expr_end;
4711 if (the_insn.exp.X_op == O_constant)
4712 {
4713 num = evaluate_absolute (&the_insn);
4714 if (num & 0x7)
4715 break;
4716 CHECK_FIELD (num, 8191, -8192, 0);
4717 if (num < 0)
4718 opcode |= 1;
4719 num &= 0x1fff;
4720 num >>= 3;
4721 INSERT_FIELD_AND_CONTINUE (opcode, num, 4);
4722 }
4723 else
4724 {
4725 if (is_DP_relative (the_insn.exp))
4726 the_insn.reloc = R_HPPA_GOTOFF;
4727 else if (is_PC_relative (the_insn.exp))
4728 the_insn.reloc = R_HPPA_PCREL_CALL;
4729 #ifdef OBJ_ELF
4730 else if (is_tls_gdidx (the_insn.exp))
4731 the_insn.reloc = R_PARISC_TLS_GD21L;
4732 else if (is_tls_ldidx (the_insn.exp))
4733 the_insn.reloc = R_PARISC_TLS_LDM21L;
4734 else if (is_tls_dtpoff (the_insn.exp))
4735 the_insn.reloc = R_PARISC_TLS_LDO21L;
4736 else if (is_tls_ieoff (the_insn.exp))
4737 the_insn.reloc = R_PARISC_TLS_IE21L;
4738 else if (is_tls_leoff (the_insn.exp))
4739 the_insn.reloc = R_PARISC_TLS_LE21L;
4740 #endif
4741 else
4742 the_insn.reloc = R_HPPA;
4743 the_insn.format = 14;
4744 continue;
4745 }
4746 break;
4747
4748 /* Handle 14 bit immediate, shifted left twice. */
4749 case 'd':
4750 the_insn.field_selector = pa_chk_field_selector (&s);
4751 get_expression (s);
4752 s = expr_end;
4753 if (the_insn.exp.X_op == O_constant)
4754 {
4755 num = evaluate_absolute (&the_insn);
4756 if (num & 0x3)
4757 break;
4758 CHECK_FIELD (num, 8191, -8192, 0);
4759 if (num < 0)
4760 opcode |= 1;
4761 num &= 0x1fff;
4762 num >>= 2;
4763 INSERT_FIELD_AND_CONTINUE (opcode, num, 3);
4764 }
4765 else
4766 {
4767 if (is_DP_relative (the_insn.exp))
4768 the_insn.reloc = R_HPPA_GOTOFF;
4769 else if (is_PC_relative (the_insn.exp))
4770 the_insn.reloc = R_HPPA_PCREL_CALL;
4771 #ifdef OBJ_ELF
4772 else if (is_tls_gdidx (the_insn.exp))
4773 the_insn.reloc = R_PARISC_TLS_GD21L;
4774 else if (is_tls_ldidx (the_insn.exp))
4775 the_insn.reloc = R_PARISC_TLS_LDM21L;
4776 else if (is_tls_dtpoff (the_insn.exp))
4777 the_insn.reloc = R_PARISC_TLS_LDO21L;
4778 else if (is_tls_ieoff (the_insn.exp))
4779 the_insn.reloc = R_PARISC_TLS_IE21L;
4780 else if (is_tls_leoff (the_insn.exp))
4781 the_insn.reloc = R_PARISC_TLS_LE21L;
4782 #endif
4783 else
4784 the_insn.reloc = R_HPPA;
4785 the_insn.format = 14;
4786 continue;
4787 }
4788
4789 /* Handle a 14 bit immediate at 31. */
4790 case 'j':
4791 the_insn.field_selector = pa_chk_field_selector (&s);
4792 get_expression (s);
4793 s = expr_end;
4794 if (the_insn.exp.X_op == O_constant)
4795 {
4796 num = evaluate_absolute (&the_insn);
4797 CHECK_FIELD (num, 8191, -8192, 0);
4798 num = low_sign_unext (num, 14);
4799 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
4800 }
4801 else
4802 {
4803 if (is_DP_relative (the_insn.exp))
4804 the_insn.reloc = R_HPPA_GOTOFF;
4805 else if (is_PC_relative (the_insn.exp))
4806 the_insn.reloc = R_HPPA_PCREL_CALL;
4807 #ifdef OBJ_ELF
4808 else if (is_tls_gdidx (the_insn.exp))
4809 the_insn.reloc = R_PARISC_TLS_GD21L;
4810 else if (is_tls_ldidx (the_insn.exp))
4811 the_insn.reloc = R_PARISC_TLS_LDM21L;
4812 else if (is_tls_dtpoff (the_insn.exp))
4813 the_insn.reloc = R_PARISC_TLS_LDO21L;
4814 else if (is_tls_ieoff (the_insn.exp))
4815 the_insn.reloc = R_PARISC_TLS_IE21L;
4816 else if (is_tls_leoff (the_insn.exp))
4817 the_insn.reloc = R_PARISC_TLS_LE21L;
4818 #endif
4819 else
4820 the_insn.reloc = R_HPPA;
4821 the_insn.format = 14;
4822 continue;
4823 }
4824
4825 /* Handle a 21 bit immediate at 31. */
4826 case 'k':
4827 the_insn.field_selector = pa_chk_field_selector (&s);
4828 get_expression (s);
4829 s = expr_end;
4830 if (the_insn.exp.X_op == O_constant)
4831 {
4832 num = evaluate_absolute (&the_insn);
4833 CHECK_FIELD (num >> 11, 1048575, -1048576, 0);
4834 opcode |= re_assemble_21 (num);
4835 continue;
4836 }
4837 else
4838 {
4839 if (is_DP_relative (the_insn.exp))
4840 the_insn.reloc = R_HPPA_GOTOFF;
4841 else if (is_PC_relative (the_insn.exp))
4842 the_insn.reloc = R_HPPA_PCREL_CALL;
4843 #ifdef OBJ_ELF
4844 else if (is_tls_gdidx (the_insn.exp))
4845 the_insn.reloc = R_PARISC_TLS_GD21L;
4846 else if (is_tls_ldidx (the_insn.exp))
4847 the_insn.reloc = R_PARISC_TLS_LDM21L;
4848 else if (is_tls_dtpoff (the_insn.exp))
4849 the_insn.reloc = R_PARISC_TLS_LDO21L;
4850 else if (is_tls_ieoff (the_insn.exp))
4851 the_insn.reloc = R_PARISC_TLS_IE21L;
4852 else if (is_tls_leoff (the_insn.exp))
4853 the_insn.reloc = R_PARISC_TLS_LE21L;
4854 #endif
4855 else
4856 the_insn.reloc = R_HPPA;
4857 the_insn.format = 21;
4858 continue;
4859 }
4860
4861 /* Handle a 16 bit immediate at 31 (PA 2.0 wide mode only). */
4862 case 'l':
4863 the_insn.field_selector = pa_chk_field_selector (&s);
4864 get_expression (s);
4865 s = expr_end;
4866 if (the_insn.exp.X_op == O_constant)
4867 {
4868 num = evaluate_absolute (&the_insn);
4869 CHECK_FIELD (num, 32767, -32768, 0);
4870 opcode |= re_assemble_16 (num);
4871 continue;
4872 }
4873 else
4874 {
4875 /* ??? Is this valid for wide mode? */
4876 if (is_DP_relative (the_insn.exp))
4877 the_insn.reloc = R_HPPA_GOTOFF;
4878 else if (is_PC_relative (the_insn.exp))
4879 the_insn.reloc = R_HPPA_PCREL_CALL;
4880 #ifdef OBJ_ELF
4881 else if (is_tls_gdidx (the_insn.exp))
4882 the_insn.reloc = R_PARISC_TLS_GD21L;
4883 else if (is_tls_ldidx (the_insn.exp))
4884 the_insn.reloc = R_PARISC_TLS_LDM21L;
4885 else if (is_tls_dtpoff (the_insn.exp))
4886 the_insn.reloc = R_PARISC_TLS_LDO21L;
4887 else if (is_tls_ieoff (the_insn.exp))
4888 the_insn.reloc = R_PARISC_TLS_IE21L;
4889 else if (is_tls_leoff (the_insn.exp))
4890 the_insn.reloc = R_PARISC_TLS_LE21L;
4891 #endif
4892 else
4893 the_insn.reloc = R_HPPA;
4894 the_insn.format = 14;
4895 continue;
4896 }
4897
4898 /* Handle a word-aligned 16-bit imm. at 31 (PA2.0 wide). */
4899 case 'y':
4900 the_insn.field_selector = pa_chk_field_selector (&s);
4901 get_expression (s);
4902 s = expr_end;
4903 if (the_insn.exp.X_op == O_constant)
4904 {
4905 num = evaluate_absolute (&the_insn);
4906 CHECK_FIELD (num, 32767, -32768, 0);
4907 CHECK_ALIGN (num, 4, 0);
4908 opcode |= re_assemble_16 (num);
4909 continue;
4910 }
4911 else
4912 {
4913 /* ??? Is this valid for wide mode? */
4914 if (is_DP_relative (the_insn.exp))
4915 the_insn.reloc = R_HPPA_GOTOFF;
4916 else if (is_PC_relative (the_insn.exp))
4917 the_insn.reloc = R_HPPA_PCREL_CALL;
4918 #ifdef OBJ_ELF
4919 else if (is_tls_gdidx (the_insn.exp))
4920 the_insn.reloc = R_PARISC_TLS_GD21L;
4921 else if (is_tls_ldidx (the_insn.exp))
4922 the_insn.reloc = R_PARISC_TLS_LDM21L;
4923 else if (is_tls_dtpoff (the_insn.exp))
4924 the_insn.reloc = R_PARISC_TLS_LDO21L;
4925 else if (is_tls_ieoff (the_insn.exp))
4926 the_insn.reloc = R_PARISC_TLS_IE21L;
4927 else if (is_tls_leoff (the_insn.exp))
4928 the_insn.reloc = R_PARISC_TLS_LE21L;
4929 #endif
4930 else
4931 the_insn.reloc = R_HPPA;
4932 the_insn.format = 14;
4933 continue;
4934 }
4935
4936 /* Handle a dword-aligned 16-bit imm. at 31 (PA2.0 wide). */
4937 case '&':
4938 the_insn.field_selector = pa_chk_field_selector (&s);
4939 get_expression (s);
4940 s = expr_end;
4941 if (the_insn.exp.X_op == O_constant)
4942 {
4943 num = evaluate_absolute (&the_insn);
4944 CHECK_FIELD (num, 32767, -32768, 0);
4945 CHECK_ALIGN (num, 8, 0);
4946 opcode |= re_assemble_16 (num);
4947 continue;
4948 }
4949 else
4950 {
4951 /* ??? Is this valid for wide mode? */
4952 if (is_DP_relative (the_insn.exp))
4953 the_insn.reloc = R_HPPA_GOTOFF;
4954 else if (is_PC_relative (the_insn.exp))
4955 the_insn.reloc = R_HPPA_PCREL_CALL;
4956 #ifdef OBJ_ELF
4957 else if (is_tls_gdidx (the_insn.exp))
4958 the_insn.reloc = R_PARISC_TLS_GD21L;
4959 else if (is_tls_ldidx (the_insn.exp))
4960 the_insn.reloc = R_PARISC_TLS_LDM21L;
4961 else if (is_tls_dtpoff (the_insn.exp))
4962 the_insn.reloc = R_PARISC_TLS_LDO21L;
4963 else if (is_tls_ieoff (the_insn.exp))
4964 the_insn.reloc = R_PARISC_TLS_IE21L;
4965 else if (is_tls_leoff (the_insn.exp))
4966 the_insn.reloc = R_PARISC_TLS_LE21L;
4967 #endif
4968 else
4969 the_insn.reloc = R_HPPA;
4970 the_insn.format = 14;
4971 continue;
4972 }
4973
4974 /* Handle a 12 bit branch displacement. */
4975 case 'w':
4976 the_insn.field_selector = pa_chk_field_selector (&s);
4977 get_expression (s);
4978 s = expr_end;
4979 the_insn.pcrel = 1;
4980 if (!the_insn.exp.X_add_symbol
4981 || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
4982 FAKE_LABEL_NAME))
4983 {
4984 num = evaluate_absolute (&the_insn);
4985 if (num % 4)
4986 {
4987 as_bad (_("Branch to unaligned address"));
4988 break;
4989 }
4990 if (the_insn.exp.X_add_symbol)
4991 num -= 8;
4992 CHECK_FIELD (num, 8191, -8192, 0);
4993 opcode |= re_assemble_12 (num >> 2);
4994 continue;
4995 }
4996 else
4997 {
4998 the_insn.reloc = R_HPPA_PCREL_CALL;
4999 the_insn.format = 12;
5000 the_insn.arg_reloc = last_call_desc.arg_reloc;
5001 memset (&last_call_desc, 0, sizeof (struct call_desc));
5002 s = expr_end;
5003 continue;
5004 }
5005
5006 /* Handle a 17 bit branch displacement. */
5007 case 'W':
5008 the_insn.field_selector = pa_chk_field_selector (&s);
5009 get_expression (s);
5010 s = expr_end;
5011 the_insn.pcrel = 1;
5012 if (!the_insn.exp.X_add_symbol
5013 || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
5014 FAKE_LABEL_NAME))
5015 {
5016 num = evaluate_absolute (&the_insn);
5017 if (num % 4)
5018 {
5019 as_bad (_("Branch to unaligned address"));
5020 break;
5021 }
5022 if (the_insn.exp.X_add_symbol)
5023 num -= 8;
5024 CHECK_FIELD (num, 262143, -262144, 0);
5025 opcode |= re_assemble_17 (num >> 2);
5026 continue;
5027 }
5028 else
5029 {
5030 the_insn.reloc = R_HPPA_PCREL_CALL;
5031 the_insn.format = 17;
5032 the_insn.arg_reloc = last_call_desc.arg_reloc;
5033 memset (&last_call_desc, 0, sizeof (struct call_desc));
5034 continue;
5035 }
5036
5037 /* Handle a 22 bit branch displacement. */
5038 case 'X':
5039 the_insn.field_selector = pa_chk_field_selector (&s);
5040 get_expression (s);
5041 s = expr_end;
5042 the_insn.pcrel = 1;
5043 if (!the_insn.exp.X_add_symbol
5044 || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
5045 FAKE_LABEL_NAME))
5046 {
5047 num = evaluate_absolute (&the_insn);
5048 if (num % 4)
5049 {
5050 as_bad (_("Branch to unaligned address"));
5051 break;
5052 }
5053 if (the_insn.exp.X_add_symbol)
5054 num -= 8;
5055 CHECK_FIELD (num, 8388607, -8388608, 0);
5056 opcode |= re_assemble_22 (num >> 2);
5057 }
5058 else
5059 {
5060 the_insn.reloc = R_HPPA_PCREL_CALL;
5061 the_insn.format = 22;
5062 the_insn.arg_reloc = last_call_desc.arg_reloc;
5063 memset (&last_call_desc, 0, sizeof (struct call_desc));
5064 continue;
5065 }
5066
5067 /* Handle an absolute 17 bit branch target. */
5068 case 'z':
5069 the_insn.field_selector = pa_chk_field_selector (&s);
5070 get_expression (s);
5071 s = expr_end;
5072 the_insn.pcrel = 0;
5073 if (!the_insn.exp.X_add_symbol
5074 || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
5075 FAKE_LABEL_NAME))
5076 {
5077 num = evaluate_absolute (&the_insn);
5078 if (num % 4)
5079 {
5080 as_bad (_("Branch to unaligned address"));
5081 break;
5082 }
5083 if (the_insn.exp.X_add_symbol)
5084 num -= 8;
5085 CHECK_FIELD (num, 262143, -262144, 0);
5086 opcode |= re_assemble_17 (num >> 2);
5087 continue;
5088 }
5089 else
5090 {
5091 the_insn.reloc = R_HPPA_ABS_CALL;
5092 the_insn.format = 17;
5093 the_insn.arg_reloc = last_call_desc.arg_reloc;
5094 memset (&last_call_desc, 0, sizeof (struct call_desc));
5095 continue;
5096 }
5097
5098 /* Handle '%r1' implicit operand of addil instruction. */
5099 case 'Z':
5100 if (*s == ',' && *(s + 1) == '%' && *(s + 3) == '1'
5101 && (*(s + 2) == 'r' || *(s + 2) == 'R'))
5102 {
5103 s += 4;
5104 continue;
5105 }
5106 else
5107 break;
5108
5109 /* Handle '%sr0,%r31' implicit operand of be,l instruction. */
5110 case 'Y':
5111 if (strncasecmp (s, "%sr0,%r31", 9) != 0)
5112 break;
5113 s += 9;
5114 continue;
5115
5116 /* Handle immediate value of 0 for ordered load/store instructions. */
5117 case '@':
5118 if (*s != '0')
5119 break;
5120 s++;
5121 continue;
5122
5123 /* Handle a 2 bit shift count at 25. */
5124 case '.':
5125 num = pa_get_absolute_expression (&the_insn, &s);
5126 if (strict && the_insn.exp.X_op != O_constant)
5127 break;
5128 s = expr_end;
5129 CHECK_FIELD (num, 3, 1, strict);
5130 INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
5131
5132 /* Handle a 4 bit shift count at 25. */
5133 case '*':
5134 num = pa_get_absolute_expression (&the_insn, &s);
5135 if (strict && the_insn.exp.X_op != O_constant)
5136 break;
5137 s = expr_end;
5138 CHECK_FIELD (num, 15, 0, strict);
5139 INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
5140
5141 /* Handle a 5 bit shift count at 26. */
5142 case 'p':
5143 num = pa_get_absolute_expression (&the_insn, &s);
5144 if (strict && the_insn.exp.X_op != O_constant)
5145 break;
5146 s = expr_end;
5147 CHECK_FIELD (num, 31, 0, strict);
5148 SAVE_IMMEDIATE(num);
5149 INSERT_FIELD_AND_CONTINUE (opcode, 31 - num, 5);
5150
5151 /* Handle a 6 bit shift count at 20,22:26. */
5152 case '~':
5153 num = pa_get_absolute_expression (&the_insn, &s);
5154 if (strict && the_insn.exp.X_op != O_constant)
5155 break;
5156 s = expr_end;
5157 CHECK_FIELD (num, 63, 0, strict);
5158 SAVE_IMMEDIATE(num);
5159 num = 63 - num;
5160 opcode |= (num & 0x20) << 6;
5161 INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 5);
5162
5163 /* Handle a 6 bit field length at 23,27:31. */
5164 case '%':
5165 flag = 0;
5166 num = pa_get_absolute_expression (&the_insn, &s);
5167 if (strict && the_insn.exp.X_op != O_constant)
5168 break;
5169 s = expr_end;
5170 CHECK_FIELD (num, 64, 1, strict);
5171 SAVE_IMMEDIATE(num);
5172 num--;
5173 opcode |= (num & 0x20) << 3;
5174 num = 31 - (num & 0x1f);
5175 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5176
5177 /* Handle a 6 bit field length at 19,27:31. */
5178 case '|':
5179 num = pa_get_absolute_expression (&the_insn, &s);
5180 if (strict && the_insn.exp.X_op != O_constant)
5181 break;
5182 s = expr_end;
5183 CHECK_FIELD (num, 64, 1, strict);
5184 SAVE_IMMEDIATE(num);
5185 num--;
5186 opcode |= (num & 0x20) << 7;
5187 num = 31 - (num & 0x1f);
5188 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5189
5190 /* Handle a 5 bit bit position at 26. */
5191 case 'P':
5192 num = pa_get_absolute_expression (&the_insn, &s);
5193 if (strict && the_insn.exp.X_op != O_constant)
5194 break;
5195 s = expr_end;
5196 CHECK_FIELD (num, 31, 0, strict);
5197 SAVE_IMMEDIATE(num);
5198 INSERT_FIELD_AND_CONTINUE (opcode, num, 5);
5199
5200 /* Handle a 6 bit bit position at 20,22:26. */
5201 case 'q':
5202 num = pa_get_absolute_expression (&the_insn, &s);
5203 if (strict && the_insn.exp.X_op != O_constant)
5204 break;
5205 s = expr_end;
5206 CHECK_FIELD (num, 63, 0, strict);
5207 SAVE_IMMEDIATE(num);
5208 opcode |= (num & 0x20) << 6;
5209 INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 5);
5210
5211 /* Handle a 5 bit immediate at 10 with 'd' as the complement
5212 of the high bit of the immediate. */
5213 case 'B':
5214 num = pa_get_absolute_expression (&the_insn, &s);
5215 if (strict && the_insn.exp.X_op != O_constant)
5216 break;
5217 s = expr_end;
5218 CHECK_FIELD (num, 63, 0, strict);
5219 if (num & 0x20)
5220 opcode &= ~(1 << 13);
5221 INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 21);
5222
5223 /* Handle a 5 bit immediate at 10. */
5224 case 'Q':
5225 num = pa_get_absolute_expression (&the_insn, &s);
5226 if (strict && the_insn.exp.X_op != O_constant)
5227 break;
5228 s = expr_end;
5229 CHECK_FIELD (num, 31, 0, strict);
5230 INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
5231
5232 /* Handle a 9 bit immediate at 28. */
5233 case '$':
5234 num = pa_get_absolute_expression (&the_insn, &s);
5235 if (strict && the_insn.exp.X_op != O_constant)
5236 break;
5237 s = expr_end;
5238 CHECK_FIELD (num, 511, 1, strict);
5239 INSERT_FIELD_AND_CONTINUE (opcode, num, 3);
5240
5241 /* Handle a 13 bit immediate at 18. */
5242 case 'A':
5243 num = pa_get_absolute_expression (&the_insn, &s);
5244 if (strict && the_insn.exp.X_op != O_constant)
5245 break;
5246 s = expr_end;
5247 CHECK_FIELD (num, 8191, 0, strict);
5248 INSERT_FIELD_AND_CONTINUE (opcode, num, 13);
5249
5250 /* Handle a 26 bit immediate at 31. */
5251 case 'D':
5252 num = pa_get_absolute_expression (&the_insn, &s);
5253 if (strict && the_insn.exp.X_op != O_constant)
5254 break;
5255 s = expr_end;
5256 CHECK_FIELD (num, 67108863, 0, strict);
5257 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5258
5259 /* Handle a 3 bit SFU identifier at 25. */
5260 case 'v':
5261 if (*s++ != ',')
5262 as_bad (_("Invalid SFU identifier"));
5263 num = pa_get_number (&the_insn, &s);
5264 if (strict && the_insn.exp.X_op != O_constant)
5265 break;
5266 s = expr_end;
5267 CHECK_FIELD (num, 7, 0, strict);
5268 INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
5269
5270 /* Handle a 20 bit SOP field for spop0. */
5271 case 'O':
5272 num = pa_get_number (&the_insn, &s);
5273 if (strict && the_insn.exp.X_op != O_constant)
5274 break;
5275 s = expr_end;
5276 CHECK_FIELD (num, 1048575, 0, strict);
5277 num = (num & 0x1f) | ((num & 0x000fffe0) << 6);
5278 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5279
5280 /* Handle a 15bit SOP field for spop1. */
5281 case 'o':
5282 num = pa_get_number (&the_insn, &s);
5283 if (strict && the_insn.exp.X_op != O_constant)
5284 break;
5285 s = expr_end;
5286 CHECK_FIELD (num, 32767, 0, strict);
5287 INSERT_FIELD_AND_CONTINUE (opcode, num, 11);
5288
5289 /* Handle a 10bit SOP field for spop3. */
5290 case '0':
5291 num = pa_get_number (&the_insn, &s);
5292 if (strict && the_insn.exp.X_op != O_constant)
5293 break;
5294 s = expr_end;
5295 CHECK_FIELD (num, 1023, 0, strict);
5296 num = (num & 0x1f) | ((num & 0x000003e0) << 6);
5297 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5298
5299 /* Handle a 15 bit SOP field for spop2. */
5300 case '1':
5301 num = pa_get_number (&the_insn, &s);
5302 if (strict && the_insn.exp.X_op != O_constant)
5303 break;
5304 s = expr_end;
5305 CHECK_FIELD (num, 32767, 0, strict);
5306 num = (num & 0x1f) | ((num & 0x00007fe0) << 6);
5307 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5308
5309 /* Handle a 3-bit co-processor ID field. */
5310 case 'u':
5311 if (*s++ != ',')
5312 as_bad (_("Invalid COPR identifier"));
5313 num = pa_get_number (&the_insn, &s);
5314 if (strict && the_insn.exp.X_op != O_constant)
5315 break;
5316 s = expr_end;
5317 CHECK_FIELD (num, 7, 0, strict);
5318 INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
5319
5320 /* Handle a 22bit SOP field for copr. */
5321 case '2':
5322 num = pa_get_number (&the_insn, &s);
5323 if (strict && the_insn.exp.X_op != O_constant)
5324 break;
5325 s = expr_end;
5326 CHECK_FIELD (num, 4194303, 0, strict);
5327 num = (num & 0x1f) | ((num & 0x003fffe0) << 4);
5328 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5329
5330 /* Handle a source FP operand format completer. */
5331 case '{':
5332 if (*s == ',' && *(s+1) == 't')
5333 {
5334 the_insn.trunc = 1;
5335 s += 2;
5336 }
5337 else
5338 the_insn.trunc = 0;
5339 flag = pa_parse_fp_cnv_format (&s);
5340 the_insn.fpof1 = flag;
5341 if (flag == W || flag == UW)
5342 flag = SGL;
5343 if (flag == DW || flag == UDW)
5344 flag = DBL;
5345 if (flag == QW || flag == UQW)
5346 flag = QUAD;
5347 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
5348
5349 /* Handle a destination FP operand format completer. */
5350 case '_':
5351 /* pa_parse_format needs the ',' prefix. */
5352 s--;
5353 flag = pa_parse_fp_cnv_format (&s);
5354 the_insn.fpof2 = flag;
5355 if (flag == W || flag == UW)
5356 flag = SGL;
5357 if (flag == DW || flag == UDW)
5358 flag = DBL;
5359 if (flag == QW || flag == UQW)
5360 flag = QUAD;
5361 opcode |= flag << 13;
5362 if (the_insn.fpof1 == SGL
5363 || the_insn.fpof1 == DBL
5364 || the_insn.fpof1 == QUAD)
5365 {
5366 if (the_insn.fpof2 == SGL
5367 || the_insn.fpof2 == DBL
5368 || the_insn.fpof2 == QUAD)
5369 flag = 0;
5370 else if (the_insn.fpof2 == W
5371 || the_insn.fpof2 == DW
5372 || the_insn.fpof2 == QW)
5373 flag = 2;
5374 else if (the_insn.fpof2 == UW
5375 || the_insn.fpof2 == UDW
5376 || the_insn.fpof2 == UQW)
5377 flag = 6;
5378 else
5379 abort ();
5380 }
5381 else if (the_insn.fpof1 == W
5382 || the_insn.fpof1 == DW
5383 || the_insn.fpof1 == QW)
5384 {
5385 if (the_insn.fpof2 == SGL
5386 || the_insn.fpof2 == DBL
5387 || the_insn.fpof2 == QUAD)
5388 flag = 1;
5389 else
5390 abort ();
5391 }
5392 else if (the_insn.fpof1 == UW
5393 || the_insn.fpof1 == UDW
5394 || the_insn.fpof1 == UQW)
5395 {
5396 if (the_insn.fpof2 == SGL
5397 || the_insn.fpof2 == DBL
5398 || the_insn.fpof2 == QUAD)
5399 flag = 5;
5400 else
5401 abort ();
5402 }
5403 flag |= the_insn.trunc;
5404 INSERT_FIELD_AND_CONTINUE (opcode, flag, 15);
5405
5406 /* Handle a source FP operand format completer. */
5407 case 'F':
5408 flag = pa_parse_fp_format (&s);
5409 the_insn.fpof1 = flag;
5410 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
5411
5412 /* Handle a destination FP operand format completer. */
5413 case 'G':
5414 /* pa_parse_format needs the ',' prefix. */
5415 s--;
5416 flag = pa_parse_fp_format (&s);
5417 the_insn.fpof2 = flag;
5418 INSERT_FIELD_AND_CONTINUE (opcode, flag, 13);
5419
5420 /* Handle a source FP operand format completer at 20. */
5421 case 'I':
5422 flag = pa_parse_fp_format (&s);
5423 the_insn.fpof1 = flag;
5424 INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
5425
5426 /* Handle a floating point operand format at 26.
5427 Only allows single and double precision. */
5428 case 'H':
5429 flag = pa_parse_fp_format (&s);
5430 switch (flag)
5431 {
5432 case SGL:
5433 opcode |= 0x20;
5434 /* Fall through. */
5435 case DBL:
5436 the_insn.fpof1 = flag;
5437 continue;
5438
5439 case QUAD:
5440 case ILLEGAL_FMT:
5441 default:
5442 as_bad (_("Invalid Floating Point Operand Format."));
5443 }
5444 break;
5445
5446 /* Handle all floating point registers. */
5447 case 'f':
5448 switch (*++args)
5449 {
5450 /* Float target register. */
5451 case 't':
5452 if (!pa_parse_number (&s, 3))
5453 break;
5454 /* RSEL should not be set. */
5455 if (pa_number & FP_REG_RSEL)
5456 break;
5457 num = pa_number - FP_REG_BASE;
5458 CHECK_FIELD (num, 31, 0, 0);
5459 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5460
5461 /* Float target register with L/R selection. */
5462 case 'T':
5463 {
5464 if (!pa_parse_number (&s, 1))
5465 break;
5466 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5467 CHECK_FIELD (num, 31, 0, 0);
5468 opcode |= num;
5469
5470 /* 0x30 opcodes are FP arithmetic operation opcodes
5471 and need to be turned into 0x38 opcodes. This
5472 is not necessary for loads/stores. */
5473 if (need_pa11_opcode ()
5474 && ((opcode & 0xfc000000) == 0x30000000))
5475 opcode |= 1 << 27;
5476
5477 opcode |= (pa_number & FP_REG_RSEL ? 1 << 6 : 0);
5478 continue;
5479 }
5480
5481 /* Float operand 1. */
5482 case 'a':
5483 {
5484 if (!pa_parse_number (&s, 1))
5485 break;
5486 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5487 CHECK_FIELD (num, 31, 0, 0);
5488 opcode |= num << 21;
5489 if (need_pa11_opcode ())
5490 {
5491 opcode |= (pa_number & FP_REG_RSEL ? 1 << 7 : 0);
5492 opcode |= 1 << 27;
5493 }
5494 continue;
5495 }
5496
5497 /* Float operand 1 with L/R selection. */
5498 case 'X':
5499 case 'A':
5500 {
5501 if (!pa_parse_number (&s, 1))
5502 break;
5503 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5504 CHECK_FIELD (num, 31, 0, 0);
5505 opcode |= num << 21;
5506 opcode |= (pa_number & FP_REG_RSEL ? 1 << 7 : 0);
5507 continue;
5508 }
5509
5510 /* Float operand 2. */
5511 case 'b':
5512 {
5513 if (!pa_parse_number (&s, 1))
5514 break;
5515 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5516 CHECK_FIELD (num, 31, 0, 0);
5517 opcode |= num << 16;
5518 if (need_pa11_opcode ())
5519 {
5520 opcode |= (pa_number & FP_REG_RSEL ? 1 << 12 : 0);
5521 opcode |= 1 << 27;
5522 }
5523 continue;
5524 }
5525
5526 /* Float operand 2 with L/R selection. */
5527 case 'B':
5528 {
5529 if (!pa_parse_number (&s, 1))
5530 break;
5531 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5532 CHECK_FIELD (num, 31, 0, 0);
5533 opcode |= num << 16;
5534 opcode |= (pa_number & FP_REG_RSEL ? 1 << 12 : 0);
5535 continue;
5536 }
5537
5538 /* Float operand 3 for fmpyfadd, fmpynfadd. */
5539 case 'C':
5540 {
5541 if (!pa_parse_number (&s, 1))
5542 break;
5543 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5544 CHECK_FIELD (num, 31, 0, 0);
5545 opcode |= (num & 0x1c) << 11;
5546 opcode |= (num & 0x03) << 9;
5547 opcode |= (pa_number & FP_REG_RSEL ? 1 << 8 : 0);
5548 continue;
5549 }
5550
5551 /* Float mult operand 1 for fmpyadd, fmpysub */
5552 case 'i':
5553 {
5554 if (!pa_parse_number (&s, 1))
5555 break;
5556 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5557 CHECK_FIELD (num, 31, 0, 0);
5558 if (the_insn.fpof1 == SGL)
5559 {
5560 if (num < 16)
5561 {
5562 as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5563 break;
5564 }
5565 num &= 0xF;
5566 num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
5567 }
5568 INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
5569 }
5570
5571 /* Float mult operand 2 for fmpyadd, fmpysub */
5572 case 'j':
5573 {
5574 if (!pa_parse_number (&s, 1))
5575 break;
5576 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5577 CHECK_FIELD (num, 31, 0, 0);
5578 if (the_insn.fpof1 == SGL)
5579 {
5580 if (num < 16)
5581 {
5582 as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5583 break;
5584 }
5585 num &= 0xF;
5586 num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
5587 }
5588 INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
5589 }
5590
5591 /* Float mult target for fmpyadd, fmpysub */
5592 case 'k':
5593 {
5594 if (!pa_parse_number (&s, 1))
5595 break;
5596 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5597 CHECK_FIELD (num, 31, 0, 0);
5598 if (the_insn.fpof1 == SGL)
5599 {
5600 if (num < 16)
5601 {
5602 as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5603 break;
5604 }
5605 num &= 0xF;
5606 num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
5607 }
5608 INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5609 }
5610
5611 /* Float add operand 1 for fmpyadd, fmpysub */
5612 case 'l':
5613 {
5614 if (!pa_parse_number (&s, 1))
5615 break;
5616 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5617 CHECK_FIELD (num, 31, 0, 0);
5618 if (the_insn.fpof1 == SGL)
5619 {
5620 if (num < 16)
5621 {
5622 as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5623 break;
5624 }
5625 num &= 0xF;
5626 num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
5627 }
5628 INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
5629 }
5630
5631 /* Float add target for fmpyadd, fmpysub */
5632 case 'm':
5633 {
5634 if (!pa_parse_number (&s, 1))
5635 break;
5636 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5637 CHECK_FIELD (num, 31, 0, 0);
5638 if (the_insn.fpof1 == SGL)
5639 {
5640 if (num < 16)
5641 {
5642 as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5643 break;
5644 }
5645 num &= 0xF;
5646 num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
5647 }
5648 INSERT_FIELD_AND_CONTINUE (opcode, num, 11);
5649 }
5650
5651 /* Handle L/R register halves like 'x'. */
5652 case 'E':
5653 case 'e':
5654 {
5655 if (!pa_parse_number (&s, 1))
5656 break;
5657 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5658 CHECK_FIELD (num, 31, 0, 0);
5659 opcode |= num << 16;
5660 if (need_pa11_opcode ())
5661 {
5662 opcode |= (pa_number & FP_REG_RSEL ? 1 << 1 : 0);
5663 }
5664 continue;
5665 }
5666
5667 /* Float target register (PA 2.0 wide). */
5668 case 'x':
5669 if (!pa_parse_number (&s, 3))
5670 break;
5671 num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5672 CHECK_FIELD (num, 31, 0, 0);
5673 INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
5674
5675 default:
5676 abort ();
5677 }
5678 break;
5679
5680 default:
5681 abort ();
5682 }
5683 break;
5684 }
5685
5686 /* If this instruction is specific to a particular architecture,
5687 then set a new architecture. This automatic promotion crud is
5688 for compatibility with HP's old assemblers only. */
5689 if (match
5690 && bfd_get_mach (stdoutput) < insn->arch
5691 && !bfd_set_arch_mach (stdoutput, bfd_arch_hppa, insn->arch))
5692 {
5693 as_warn (_("could not update architecture and machine"));
5694 match = FALSE;
5695 }
5696
5697 failed:
5698 /* Check if the args matched. */
5699 if (!match)
5700 {
5701 if (&insn[1] - pa_opcodes < (int) NUMOPCODES
5702 && !strcmp (insn->name, insn[1].name))
5703 {
5704 ++insn;
5705 s = argstart;
5706 continue;
5707 }
5708 else
5709 {
5710 as_bad (_("Invalid operands %s"), error_message);
5711 return;
5712 }
5713 }
5714 break;
5715 }
5716
5717 if (immediate_check)
5718 {
5719 if (pos != -1 && len != -1 && pos < len - 1)
5720 as_warn (_("Immediates %d and %d will give undefined behavior."),
5721 pos, len);
5722 }
5723
5724 the_insn.opcode = opcode;
5725 }
5726
5727 /* Assemble a single instruction storing it into a frag. */
5728
5729 void
5730 md_assemble (char *str)
5731 {
5732 char *to;
5733
5734 /* The had better be something to assemble. */
5735 gas_assert (str);
5736
5737 /* If we are within a procedure definition, make sure we've
5738 defined a label for the procedure; handle case where the
5739 label was defined after the .PROC directive.
5740
5741 Note there's not need to diddle with the segment or fragment
5742 for the label symbol in this case. We have already switched
5743 into the new $CODE$ subspace at this point. */
5744 if (within_procedure && last_call_info->start_symbol == NULL)
5745 {
5746 label_symbol_struct *label_symbol = pa_get_label ();
5747
5748 if (label_symbol)
5749 {
5750 if (label_symbol->lss_label)
5751 {
5752 last_call_info->start_symbol = label_symbol->lss_label;
5753 symbol_get_bfdsym (label_symbol->lss_label)->flags
5754 |= BSF_FUNCTION;
5755 #ifdef OBJ_SOM
5756 /* Also handle allocation of a fixup to hold the unwind
5757 information when the label appears after the proc/procend. */
5758 if (within_entry_exit)
5759 {
5760 char *where;
5761 unsigned int u;
5762
5763 where = frag_more (0);
5764 u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor);
5765 fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
5766 NULL, (offsetT) 0, NULL,
5767 0, R_HPPA_ENTRY, e_fsel, 0, 0, u);
5768 }
5769 #endif
5770 }
5771 else
5772 as_bad (_("Missing function name for .PROC (corrupted label chain)"));
5773 }
5774 else
5775 as_bad (_("Missing function name for .PROC"));
5776 }
5777
5778 /* Assemble the instruction. Results are saved into "the_insn". */
5779 pa_ip (str);
5780
5781 /* Get somewhere to put the assembled instruction. */
5782 to = frag_more (4);
5783
5784 /* Output the opcode. */
5785 md_number_to_chars (to, the_insn.opcode, 4);
5786
5787 /* If necessary output more stuff. */
5788 if (the_insn.reloc != R_HPPA_NONE)
5789 fix_new_hppa (frag_now, (to - frag_now->fr_literal), 4, NULL,
5790 (offsetT) 0, &the_insn.exp, the_insn.pcrel,
5791 the_insn.reloc, the_insn.field_selector,
5792 the_insn.format, the_insn.arg_reloc, 0);
5793
5794 #ifdef OBJ_ELF
5795 dwarf2_emit_insn (4);
5796 #endif
5797 }
5798
5799 #ifdef OBJ_SOM
5800 /* Handle an alignment directive. Special so that we can update the
5801 alignment of the subspace if necessary. */
5802 static void
5803 pa_align (int bytes)
5804 {
5805 /* We must have a valid space and subspace. */
5806 pa_check_current_space_and_subspace ();
5807
5808 /* Let the generic gas code do most of the work. */
5809 s_align_bytes (bytes);
5810
5811 /* If bytes is a power of 2, then update the current subspace's
5812 alignment if necessary. */
5813 if (exact_log2 (bytes) != -1)
5814 record_alignment (current_subspace->ssd_seg, exact_log2 (bytes));
5815 }
5816 #endif
5817
5818 /* Handle a .BLOCK type pseudo-op. */
5819
5820 static void
5821 pa_block (int z ATTRIBUTE_UNUSED)
5822 {
5823 unsigned int temp_size;
5824
5825 #ifdef OBJ_SOM
5826 /* We must have a valid space and subspace. */
5827 pa_check_current_space_and_subspace ();
5828 #endif
5829
5830 temp_size = get_absolute_expression ();
5831
5832 if (temp_size > 0x3FFFFFFF)
5833 {
5834 as_bad (_("Argument to .BLOCK/.BLOCKZ must be between 0 and 0x3fffffff"));
5835 temp_size = 0;
5836 }
5837 else
5838 {
5839 /* Always fill with zeros, that's what the HP assembler does. */
5840 char *p = frag_var (rs_fill, 1, 1, 0, NULL, temp_size, NULL);
5841 *p = 0;
5842 }
5843
5844 pa_undefine_label ();
5845 demand_empty_rest_of_line ();
5846 }
5847
5848 /* Handle a .begin_brtab and .end_brtab pseudo-op. */
5849
5850 static void
5851 pa_brtab (int begin ATTRIBUTE_UNUSED)
5852 {
5853
5854 #ifdef OBJ_SOM
5855 /* The BRTAB relocations are only available in SOM (to denote
5856 the beginning and end of branch tables). */
5857 char *where = frag_more (0);
5858
5859 fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
5860 NULL, (offsetT) 0, NULL,
5861 0, begin ? R_HPPA_BEGIN_BRTAB : R_HPPA_END_BRTAB,
5862 e_fsel, 0, 0, 0);
5863 #endif
5864
5865 demand_empty_rest_of_line ();
5866 }
5867
5868 /* Handle a .begin_try and .end_try pseudo-op. */
5869
5870 static void
5871 pa_try (int begin ATTRIBUTE_UNUSED)
5872 {
5873 #ifdef OBJ_SOM
5874 expressionS exp;
5875 char *where = frag_more (0);
5876
5877 if (! begin)
5878 expression (&exp);
5879
5880 /* The TRY relocations are only available in SOM (to denote
5881 the beginning and end of exception handling regions). */
5882
5883 fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
5884 NULL, (offsetT) 0, begin ? NULL : &exp,
5885 0, begin ? R_HPPA_BEGIN_TRY : R_HPPA_END_TRY,
5886 e_fsel, 0, 0, 0);
5887 #endif
5888
5889 demand_empty_rest_of_line ();
5890 }
5891
5892 /* Do the dirty work of building a call descriptor which describes
5893 where the caller placed arguments to a function call. */
5894
5895 static void
5896 pa_call_args (struct call_desc *call_desc)
5897 {
5898 char *name, c;
5899 unsigned int temp, arg_reloc;
5900
5901 while (!is_end_of_statement ())
5902 {
5903 c = get_symbol_name (&name);
5904 /* Process a source argument. */
5905 if ((strncasecmp (name, "argw", 4) == 0))
5906 {
5907 temp = atoi (name + 4);
5908 (void) restore_line_pointer (c);
5909 input_line_pointer++;
5910 c = get_symbol_name (&name);
5911 arg_reloc = pa_build_arg_reloc (name);
5912 call_desc->arg_reloc |= pa_align_arg_reloc (temp, arg_reloc);
5913 }
5914 /* Process a return value. */
5915 else if ((strncasecmp (name, "rtnval", 6) == 0))
5916 {
5917 (void) restore_line_pointer (c);
5918 input_line_pointer++;
5919 c = get_symbol_name (&name);
5920 arg_reloc = pa_build_arg_reloc (name);
5921 call_desc->arg_reloc |= (arg_reloc & 0x3);
5922 }
5923 else
5924 {
5925 as_bad (_("Invalid .CALL argument: %s"), name);
5926 }
5927
5928 (void) restore_line_pointer (c);
5929 if (!is_end_of_statement ())
5930 input_line_pointer++;
5931 }
5932 }
5933
5934 /* Handle a .CALL pseudo-op. This involves storing away information
5935 about where arguments are to be found so the linker can detect
5936 (and correct) argument location mismatches between caller and callee. */
5937
5938 static void
5939 pa_call (int unused ATTRIBUTE_UNUSED)
5940 {
5941 #ifdef OBJ_SOM
5942 /* We must have a valid space and subspace. */
5943 pa_check_current_space_and_subspace ();
5944 #endif
5945
5946 pa_call_args (&last_call_desc);
5947 demand_empty_rest_of_line ();
5948 }
5949
5950 #ifdef OBJ_ELF
5951 /* Build an entry in the UNWIND subspace from the given function
5952 attributes in CALL_INFO. This is not needed for SOM as using
5953 R_ENTRY and R_EXIT relocations allow the linker to handle building
5954 of the unwind spaces. */
5955
5956 static void
5957 pa_build_unwind_subspace (struct call_info *call_info)
5958 {
5959 asection *seg, *save_seg;
5960 subsegT save_subseg;
5961 unsigned int unwind;
5962 int reloc;
5963 char *name, *p;
5964 symbolS *symbolP;
5965
5966 if ((bfd_get_section_flags (stdoutput, now_seg)
5967 & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
5968 != (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
5969 return;
5970
5971 if (call_info->start_symbol == NULL)
5972 /* This can happen if there were errors earlier on in the assembly. */
5973 return;
5974
5975 /* Replace the start symbol with a local symbol that will be reduced
5976 to a section offset. This avoids problems with weak functions with
5977 multiple definitions, etc. */
5978 name = concat ("L$\001start_", S_GET_NAME (call_info->start_symbol),
5979 (char *) NULL);
5980
5981 /* If we have a .procend preceded by a .exit, then the symbol will have
5982 already been defined. In that case, we don't want another unwind
5983 entry. */
5984 symbolP = symbol_find (name);
5985 if (symbolP)
5986 {
5987 xfree (name);
5988 return;
5989 }
5990 else
5991 {
5992 symbolP = symbol_new (name, now_seg,
5993 S_GET_VALUE (call_info->start_symbol),
5994 call_info->start_symbol->sy_frag);
5995 gas_assert (symbolP);
5996 S_CLEAR_EXTERNAL (symbolP);
5997 symbol_table_insert (symbolP);
5998 }
5999
6000 reloc = R_PARISC_SEGREL32;
6001 save_seg = now_seg;
6002 save_subseg = now_subseg;
6003 /* Get into the right seg/subseg. This may involve creating
6004 the seg the first time through. Make sure to have the
6005 old seg/subseg so that we can reset things when we are done. */
6006 seg = bfd_get_section_by_name (stdoutput, UNWIND_SECTION_NAME);
6007 if (seg == ASEC_NULL)
6008 {
6009 seg = subseg_new (UNWIND_SECTION_NAME, 0);
6010 bfd_set_section_flags (stdoutput, seg,
6011 SEC_READONLY | SEC_HAS_CONTENTS
6012 | SEC_LOAD | SEC_RELOC | SEC_ALLOC | SEC_DATA);
6013 bfd_set_section_alignment (stdoutput, seg, 2);
6014 }
6015
6016 subseg_set (seg, 0);
6017
6018 /* Get some space to hold relocation information for the unwind
6019 descriptor. */
6020 p = frag_more (16);
6021
6022 /* Relocation info. for start offset of the function. */
6023 md_number_to_chars (p, 0, 4);
6024 fix_new_hppa (frag_now, p - frag_now->fr_literal, 4,
6025 symbolP, (offsetT) 0,
6026 (expressionS *) NULL, 0, reloc,
6027 e_fsel, 32, 0, 0);
6028
6029 /* Relocation info. for end offset of the function.
6030
6031 Because we allow reductions of 32bit relocations for ELF, this will be
6032 reduced to section_sym + offset which avoids putting the temporary
6033 symbol into the symbol table. It (should) end up giving the same
6034 value as call_info->start_symbol + function size once the linker is
6035 finished with its work. */
6036 md_number_to_chars (p + 4, 0, 4);
6037 fix_new_hppa (frag_now, p + 4 - frag_now->fr_literal, 4,
6038 call_info->end_symbol, (offsetT) 0,
6039 (expressionS *) NULL, 0, reloc,
6040 e_fsel, 32, 0, 0);
6041
6042 /* Dump the descriptor. */
6043 unwind = UNWIND_LOW32 (&call_info->ci_unwind.descriptor);
6044 md_number_to_chars (p + 8, unwind, 4);
6045
6046 unwind = UNWIND_HIGH32 (&call_info->ci_unwind.descriptor);
6047 md_number_to_chars (p + 12, unwind, 4);
6048
6049 /* Return back to the original segment/subsegment. */
6050 subseg_set (save_seg, save_subseg);
6051 }
6052 #endif
6053
6054 /* Process a .CALLINFO pseudo-op. This information is used later
6055 to build unwind descriptors and maybe one day to support
6056 .ENTER and .LEAVE. */
6057
6058 static void
6059 pa_callinfo (int unused ATTRIBUTE_UNUSED)
6060 {
6061 char *name, c;
6062 int temp;
6063
6064 #ifdef OBJ_SOM
6065 /* We must have a valid space and subspace. */
6066 pa_check_current_space_and_subspace ();
6067 #endif
6068
6069 /* .CALLINFO must appear within a procedure definition. */
6070 if (!within_procedure)
6071 as_bad (_(".callinfo is not within a procedure definition"));
6072
6073 /* Mark the fact that we found the .CALLINFO for the
6074 current procedure. */
6075 callinfo_found = TRUE;
6076
6077 /* Iterate over the .CALLINFO arguments. */
6078 while (!is_end_of_statement ())
6079 {
6080 c = get_symbol_name (&name);
6081 /* Frame size specification. */
6082 if ((strncasecmp (name, "frame", 5) == 0))
6083 {
6084 (void) restore_line_pointer (c);
6085 input_line_pointer++;
6086 temp = get_absolute_expression ();
6087 if ((temp & 0x3) != 0)
6088 {
6089 as_bad (_("FRAME parameter must be a multiple of 8: %d\n"), temp);
6090 temp = 0;
6091 }
6092
6093 /* callinfo is in bytes and unwind_desc is in 8 byte units. */
6094 last_call_info->ci_unwind.descriptor.frame_size = temp / 8;
6095 }
6096 /* Entry register (GR, GR and SR) specifications. */
6097 else if ((strncasecmp (name, "entry_gr", 8) == 0))
6098 {
6099 (void) restore_line_pointer (c);
6100 input_line_pointer++;
6101 temp = get_absolute_expression ();
6102 /* The HP assembler accepts 19 as the high bound for ENTRY_GR
6103 even though %r19 is caller saved. I think this is a bug in
6104 the HP assembler, and we are not going to emulate it. */
6105 if (temp < 3 || temp > 18)
6106 as_bad (_("Value for ENTRY_GR must be in the range 3..18\n"));
6107 last_call_info->ci_unwind.descriptor.entry_gr = temp - 2;
6108 }
6109 else if ((strncasecmp (name, "entry_fr", 8) == 0))
6110 {
6111 (void) restore_line_pointer (c);
6112 input_line_pointer++;
6113 temp = get_absolute_expression ();
6114 /* Similarly the HP assembler takes 31 as the high bound even
6115 though %fr21 is the last callee saved floating point register. */
6116 if (temp < 12 || temp > 21)
6117 as_bad (_("Value for ENTRY_FR must be in the range 12..21\n"));
6118 last_call_info->ci_unwind.descriptor.entry_fr = temp - 11;
6119 }
6120 else if ((strncasecmp (name, "entry_sr", 8) == 0))
6121 {
6122 (void) restore_line_pointer (c);
6123 input_line_pointer++;
6124 temp = get_absolute_expression ();
6125 if (temp != 3)
6126 as_bad (_("Value for ENTRY_SR must be 3\n"));
6127 }
6128 /* Note whether or not this function performs any calls. */
6129 else if ((strncasecmp (name, "calls", 5) == 0)
6130 || (strncasecmp (name, "caller", 6) == 0))
6131 {
6132 (void) restore_line_pointer (c);
6133 }
6134 else if ((strncasecmp (name, "no_calls", 8) == 0))
6135 {
6136 (void) restore_line_pointer (c);
6137 }
6138 /* Should RP be saved into the stack. */
6139 else if ((strncasecmp (name, "save_rp", 7) == 0))
6140 {
6141 (void) restore_line_pointer (c);
6142 last_call_info->ci_unwind.descriptor.save_rp = 1;
6143 }
6144 /* Likewise for SP. */
6145 else if ((strncasecmp (name, "save_sp", 7) == 0))
6146 {
6147 (void) restore_line_pointer (c);
6148 last_call_info->ci_unwind.descriptor.save_sp = 1;
6149 }
6150 /* Is this an unwindable procedure. If so mark it so
6151 in the unwind descriptor. */
6152 else if ((strncasecmp (name, "no_unwind", 9) == 0))
6153 {
6154 (void) restore_line_pointer (c);
6155 last_call_info->ci_unwind.descriptor.cannot_unwind = 1;
6156 }
6157 /* Is this an interrupt routine. If so mark it in the
6158 unwind descriptor. */
6159 else if ((strncasecmp (name, "hpux_int", 7) == 0))
6160 {
6161 (void) restore_line_pointer (c);
6162 last_call_info->ci_unwind.descriptor.hpux_interrupt_marker = 1;
6163 }
6164 /* Is this a millicode routine. "millicode" isn't in my
6165 assembler manual, but my copy is old. The HP assembler
6166 accepts it, and there's a place in the unwind descriptor
6167 to drop the information, so we'll accept it too. */
6168 else if ((strncasecmp (name, "millicode", 9) == 0))
6169 {
6170 (void) restore_line_pointer (c);
6171 last_call_info->ci_unwind.descriptor.millicode = 1;
6172 }
6173 else
6174 {
6175 as_bad (_("Invalid .CALLINFO argument: %s"), name);
6176 (void) restore_line_pointer (c);
6177 }
6178
6179 if (!is_end_of_statement ())
6180 input_line_pointer++;
6181 }
6182
6183 demand_empty_rest_of_line ();
6184 }
6185
6186 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
6187 /* Switch to the text space. Like s_text, but delete our
6188 label when finished. */
6189
6190 static void
6191 pa_text (int unused ATTRIBUTE_UNUSED)
6192 {
6193 #ifdef OBJ_SOM
6194 current_space = is_defined_space ("$TEXT$");
6195 current_subspace
6196 = pa_subsegment_to_subspace (current_space->sd_seg, 0);
6197 #endif
6198
6199 s_text (0);
6200 pa_undefine_label ();
6201 }
6202
6203 /* Switch to the data space. As usual delete our label. */
6204
6205 static void
6206 pa_data (int unused ATTRIBUTE_UNUSED)
6207 {
6208 #ifdef OBJ_SOM
6209 current_space = is_defined_space ("$PRIVATE$");
6210 current_subspace
6211 = pa_subsegment_to_subspace (current_space->sd_seg, 0);
6212 #endif
6213 s_data (0);
6214 pa_undefine_label ();
6215 }
6216
6217 /* This is different than the standard GAS s_comm(). On HP9000/800 machines,
6218 the .comm pseudo-op has the following syntax:
6219
6220 <label> .comm <length>
6221
6222 where <label> is optional and is a symbol whose address will be the start of
6223 a block of memory <length> bytes long. <length> must be an absolute
6224 expression. <length> bytes will be allocated in the current space
6225 and subspace.
6226
6227 Also note the label may not even be on the same line as the .comm.
6228
6229 This difference in syntax means the colon function will be called
6230 on the symbol before we arrive in pa_comm. colon will set a number
6231 of attributes of the symbol that need to be fixed here. In particular
6232 the value, section pointer, fragment pointer, flags, etc. What
6233 a pain.
6234
6235 This also makes error detection all but impossible. */
6236
6237 static void
6238 pa_comm (int unused ATTRIBUTE_UNUSED)
6239 {
6240 unsigned int size;
6241 symbolS *symbol;
6242 label_symbol_struct *label_symbol = pa_get_label ();
6243
6244 if (label_symbol)
6245 symbol = label_symbol->lss_label;
6246 else
6247 symbol = NULL;
6248
6249 SKIP_WHITESPACE ();
6250 size = get_absolute_expression ();
6251
6252 if (symbol)
6253 {
6254 symbol_get_bfdsym (symbol)->flags |= BSF_OBJECT;
6255 S_SET_VALUE (symbol, size);
6256 S_SET_SEGMENT (symbol, bfd_com_section_ptr);
6257 S_SET_EXTERNAL (symbol);
6258
6259 /* colon() has already set the frag to the current location in the
6260 current subspace; we need to reset the fragment to the zero address
6261 fragment. We also need to reset the segment pointer. */
6262 symbol_set_frag (symbol, &zero_address_frag);
6263 }
6264 demand_empty_rest_of_line ();
6265 }
6266 #endif /* !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))) */
6267
6268 /* Process a .END pseudo-op. */
6269
6270 static void
6271 pa_end (int unused ATTRIBUTE_UNUSED)
6272 {
6273 demand_empty_rest_of_line ();
6274 }
6275
6276 /* Process a .ENTER pseudo-op. This is not supported. */
6277
6278 static void
6279 pa_enter (int unused ATTRIBUTE_UNUSED)
6280 {
6281 #ifdef OBJ_SOM
6282 /* We must have a valid space and subspace. */
6283 pa_check_current_space_and_subspace ();
6284 #endif
6285
6286 as_bad (_("The .ENTER pseudo-op is not supported"));
6287 demand_empty_rest_of_line ();
6288 }
6289
6290 /* Process a .ENTRY pseudo-op. .ENTRY marks the beginning of the
6291 procedure. */
6292
6293 static void
6294 pa_entry (int unused ATTRIBUTE_UNUSED)
6295 {
6296 #ifdef OBJ_SOM
6297 /* We must have a valid space and subspace. */
6298 pa_check_current_space_and_subspace ();
6299 #endif
6300
6301 if (!within_procedure)
6302 as_bad (_("Misplaced .entry. Ignored."));
6303 else
6304 {
6305 if (!callinfo_found)
6306 as_bad (_("Missing .callinfo."));
6307 }
6308 demand_empty_rest_of_line ();
6309 within_entry_exit = TRUE;
6310
6311 #ifdef OBJ_SOM
6312 /* SOM defers building of unwind descriptors until the link phase.
6313 The assembler is responsible for creating an R_ENTRY relocation
6314 to mark the beginning of a region and hold the unwind bits, and
6315 for creating an R_EXIT relocation to mark the end of the region.
6316
6317 FIXME. ELF should be using the same conventions! The problem
6318 is an unwind requires too much relocation space. Hmmm. Maybe
6319 if we split the unwind bits up between the relocations which
6320 denote the entry and exit points. */
6321 if (last_call_info->start_symbol != NULL)
6322 {
6323 char *where;
6324 unsigned int u;
6325
6326 where = frag_more (0);
6327 u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor);
6328 fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
6329 NULL, (offsetT) 0, NULL,
6330 0, R_HPPA_ENTRY, e_fsel, 0, 0, u);
6331 }
6332 #endif
6333 }
6334
6335 /* Silly nonsense for pa_equ. The only half-sensible use for this is
6336 being able to subtract two register symbols that specify a range of
6337 registers, to get the size of the range. */
6338 static int fudge_reg_expressions;
6339
6340 int
6341 hppa_force_reg_syms_absolute (expressionS *resultP,
6342 operatorT op ATTRIBUTE_UNUSED,
6343 expressionS *rightP)
6344 {
6345 if (fudge_reg_expressions
6346 && rightP->X_op == O_register
6347 && resultP->X_op == O_register)
6348 {
6349 rightP->X_op = O_constant;
6350 resultP->X_op = O_constant;
6351 }
6352 return 0; /* Continue normal expr handling. */
6353 }
6354
6355 /* Handle a .EQU pseudo-op. */
6356
6357 static void
6358 pa_equ (int reg)
6359 {
6360 label_symbol_struct *label_symbol = pa_get_label ();
6361 symbolS *symbol;
6362
6363 if (label_symbol)
6364 {
6365 symbol = label_symbol->lss_label;
6366 if (reg)
6367 {
6368 strict = 1;
6369 if (!pa_parse_number (&input_line_pointer, 0))
6370 as_bad (_(".REG expression must be a register"));
6371 S_SET_VALUE (symbol, pa_number);
6372 S_SET_SEGMENT (symbol, reg_section);
6373 }
6374 else
6375 {
6376 expressionS exp;
6377 segT seg;
6378
6379 fudge_reg_expressions = 1;
6380 seg = expression (&exp);
6381 fudge_reg_expressions = 0;
6382 if (exp.X_op != O_constant
6383 && exp.X_op != O_register)
6384 {
6385 if (exp.X_op != O_absent)
6386 as_bad (_("bad or irreducible absolute expression; zero assumed"));
6387 exp.X_add_number = 0;
6388 seg = absolute_section;
6389 }
6390 S_SET_VALUE (symbol, (unsigned int) exp.X_add_number);
6391 S_SET_SEGMENT (symbol, seg);
6392 }
6393 }
6394 else
6395 {
6396 if (reg)
6397 as_bad (_(".REG must use a label"));
6398 else
6399 as_bad (_(".EQU must use a label"));
6400 }
6401
6402 pa_undefine_label ();
6403 demand_empty_rest_of_line ();
6404 }
6405
6406 #ifdef OBJ_ELF
6407 /* Mark the end of a function so that it's possible to compute
6408 the size of the function in elf_hppa_final_processing. */
6409
6410 static void
6411 hppa_elf_mark_end_of_function (void)
6412 {
6413 /* ELF does not have EXIT relocations. All we do is create a
6414 temporary symbol marking the end of the function. */
6415 char *name;
6416 symbolS *symbolP;
6417
6418 if (last_call_info == NULL || last_call_info->start_symbol == NULL)
6419 {
6420 /* We have already warned about a missing label,
6421 or other problems. */
6422 return;
6423 }
6424
6425 name = concat ("L$\001end_", S_GET_NAME (last_call_info->start_symbol),
6426 (char *) NULL);
6427
6428 /* If we have a .exit followed by a .procend, then the
6429 symbol will have already been defined. */
6430 symbolP = symbol_find (name);
6431 if (symbolP)
6432 {
6433 /* The symbol has already been defined! This can
6434 happen if we have a .exit followed by a .procend.
6435
6436 This is *not* an error. All we want to do is free
6437 the memory we just allocated for the name and continue. */
6438 xfree (name);
6439 }
6440 else
6441 {
6442 /* symbol value should be the offset of the
6443 last instruction of the function */
6444 symbolP = symbol_new (name, now_seg, (valueT) (frag_now_fix () - 4),
6445 frag_now);
6446
6447 gas_assert (symbolP);
6448 S_CLEAR_EXTERNAL (symbolP);
6449 symbol_table_insert (symbolP);
6450 }
6451
6452 if (symbolP)
6453 last_call_info->end_symbol = symbolP;
6454 else
6455 as_bad (_("Symbol '%s' could not be created."), name);
6456 }
6457 #endif
6458
6459 /* Helper function. Does processing for the end of a function. This
6460 usually involves creating some relocations or building special
6461 symbols to mark the end of the function. */
6462
6463 static void
6464 process_exit (void)
6465 {
6466 char *where;
6467
6468 where = frag_more (0);
6469
6470 #ifdef OBJ_ELF
6471 /* Mark the end of the function, stuff away the location of the frag
6472 for the end of the function, and finally call pa_build_unwind_subspace
6473 to add an entry in the unwind table. */
6474 (void) where;
6475 hppa_elf_mark_end_of_function ();
6476 pa_build_unwind_subspace (last_call_info);
6477 #else
6478 /* SOM defers building of unwind descriptors until the link phase.
6479 The assembler is responsible for creating an R_ENTRY relocation
6480 to mark the beginning of a region and hold the unwind bits, and
6481 for creating an R_EXIT relocation to mark the end of the region.
6482
6483 FIXME. ELF should be using the same conventions! The problem
6484 is an unwind requires too much relocation space. Hmmm. Maybe
6485 if we split the unwind bits up between the relocations which
6486 denote the entry and exit points. */
6487 fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
6488 NULL, (offsetT) 0,
6489 NULL, 0, R_HPPA_EXIT, e_fsel, 0, 0,
6490 UNWIND_HIGH32 (&last_call_info->ci_unwind.descriptor));
6491 #endif
6492 }
6493
6494 /* Process a .EXIT pseudo-op. */
6495
6496 static void
6497 pa_exit (int unused ATTRIBUTE_UNUSED)
6498 {
6499 #ifdef OBJ_SOM
6500 /* We must have a valid space and subspace. */
6501 pa_check_current_space_and_subspace ();
6502 #endif
6503
6504 if (!within_procedure)
6505 as_bad (_(".EXIT must appear within a procedure"));
6506 else
6507 {
6508 if (!callinfo_found)
6509 as_bad (_("Missing .callinfo"));
6510 else
6511 {
6512 if (!within_entry_exit)
6513 as_bad (_("No .ENTRY for this .EXIT"));
6514 else
6515 {
6516 within_entry_exit = FALSE;
6517 process_exit ();
6518 }
6519 }
6520 }
6521 demand_empty_rest_of_line ();
6522 }
6523
6524 /* Helper function to process arguments to a .EXPORT pseudo-op. */
6525
6526 static void
6527 pa_type_args (symbolS *symbolP, int is_export)
6528 {
6529 char *name, c;
6530 unsigned int temp, arg_reloc;
6531 pa_symbol_type type = SYMBOL_TYPE_UNKNOWN;
6532 asymbol *bfdsym = symbol_get_bfdsym (symbolP);
6533
6534 if (strncasecmp (input_line_pointer, "absolute", 8) == 0)
6535 {
6536 input_line_pointer += 8;
6537 bfdsym->flags &= ~BSF_FUNCTION;
6538 S_SET_SEGMENT (symbolP, bfd_abs_section_ptr);
6539 type = SYMBOL_TYPE_ABSOLUTE;
6540 }
6541 else if (strncasecmp (input_line_pointer, "code", 4) == 0)
6542 {
6543 input_line_pointer += 4;
6544 /* IMPORTing/EXPORTing CODE types for functions is meaningless for SOM,
6545 instead one should be IMPORTing/EXPORTing ENTRY types.
6546
6547 Complain if one tries to EXPORT a CODE type since that's never
6548 done. Both GCC and HP C still try to IMPORT CODE types, so
6549 silently fix them to be ENTRY types. */
6550 if (S_IS_FUNCTION (symbolP))
6551 {
6552 if (is_export)
6553 as_tsktsk (_("Using ENTRY rather than CODE in export directive for %s"),
6554 S_GET_NAME (symbolP));
6555
6556 bfdsym->flags |= BSF_FUNCTION;
6557 type = SYMBOL_TYPE_ENTRY;
6558 }
6559 else
6560 {
6561 bfdsym->flags &= ~BSF_FUNCTION;
6562 type = SYMBOL_TYPE_CODE;
6563 }
6564 }
6565 else if (strncasecmp (input_line_pointer, "data", 4) == 0)
6566 {
6567 input_line_pointer += 4;
6568 bfdsym->flags &= ~BSF_FUNCTION;
6569 bfdsym->flags |= BSF_OBJECT;
6570 type = SYMBOL_TYPE_DATA;
6571 }
6572 else if ((strncasecmp (input_line_pointer, "entry", 5) == 0))
6573 {
6574 input_line_pointer += 5;
6575 bfdsym->flags |= BSF_FUNCTION;
6576 type = SYMBOL_TYPE_ENTRY;
6577 }
6578 else if (strncasecmp (input_line_pointer, "millicode", 9) == 0)
6579 {
6580 input_line_pointer += 9;
6581 bfdsym->flags |= BSF_FUNCTION;
6582 #ifdef OBJ_ELF
6583 {
6584 elf_symbol_type *elfsym = (elf_symbol_type *) bfdsym;
6585 elfsym->internal_elf_sym.st_info =
6586 ELF_ST_INFO (ELF_ST_BIND (elfsym->internal_elf_sym.st_info),
6587 STT_PARISC_MILLI);
6588 }
6589 #endif
6590 type = SYMBOL_TYPE_MILLICODE;
6591 }
6592 else if (strncasecmp (input_line_pointer, "plabel", 6) == 0)
6593 {
6594 input_line_pointer += 6;
6595 bfdsym->flags &= ~BSF_FUNCTION;
6596 type = SYMBOL_TYPE_PLABEL;
6597 }
6598 else if (strncasecmp (input_line_pointer, "pri_prog", 8) == 0)
6599 {
6600 input_line_pointer += 8;
6601 bfdsym->flags |= BSF_FUNCTION;
6602 type = SYMBOL_TYPE_PRI_PROG;
6603 }
6604 else if (strncasecmp (input_line_pointer, "sec_prog", 8) == 0)
6605 {
6606 input_line_pointer += 8;
6607 bfdsym->flags |= BSF_FUNCTION;
6608 type = SYMBOL_TYPE_SEC_PROG;
6609 }
6610
6611 /* SOM requires much more information about symbol types
6612 than BFD understands. This is how we get this information
6613 to the SOM BFD backend. */
6614 #ifdef obj_set_symbol_type
6615 obj_set_symbol_type (bfdsym, (int) type);
6616 #else
6617 (void) type;
6618 #endif
6619
6620 /* Now that the type of the exported symbol has been handled,
6621 handle any argument relocation information. */
6622 while (!is_end_of_statement ())
6623 {
6624 if (*input_line_pointer == ',')
6625 input_line_pointer++;
6626 c = get_symbol_name (&name);
6627 /* Argument sources. */
6628 if ((strncasecmp (name, "argw", 4) == 0))
6629 {
6630 (void) restore_line_pointer (c);
6631 input_line_pointer++;
6632 temp = atoi (name + 4);
6633 c = get_symbol_name (&name);
6634 arg_reloc = pa_align_arg_reloc (temp, pa_build_arg_reloc (name));
6635 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
6636 symbol_arg_reloc_info (symbolP) |= arg_reloc;
6637 #else
6638 (void) arg_reloc;
6639 #endif
6640 (void) restore_line_pointer (c);
6641 }
6642 /* The return value. */
6643 else if ((strncasecmp (name, "rtnval", 6)) == 0)
6644 {
6645 (void) restore_line_pointer (c);
6646 input_line_pointer++;
6647 c = get_symbol_name (&name);
6648 arg_reloc = pa_build_arg_reloc (name);
6649 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
6650 symbol_arg_reloc_info (symbolP) |= arg_reloc;
6651 #else
6652 (void) arg_reloc;
6653 #endif
6654 (void) restore_line_pointer (c);
6655 }
6656 /* Privilege level. */
6657 else if ((strncasecmp (name, "priv_lev", 8)) == 0)
6658 {
6659 char *priv;
6660
6661 (void) restore_line_pointer (c);
6662 input_line_pointer++;
6663 temp = atoi (input_line_pointer);
6664 #ifdef OBJ_SOM
6665 ((obj_symbol_type *) bfdsym)->tc_data.ap.hppa_priv_level = temp;
6666 #endif
6667 c = get_symbol_name (&priv);
6668 (void) restore_line_pointer (c);
6669 }
6670 else
6671 {
6672 as_bad (_("Undefined .EXPORT/.IMPORT argument (ignored): %s"), name);
6673 (void) restore_line_pointer (c);
6674 }
6675
6676 if (!is_end_of_statement ())
6677 input_line_pointer++;
6678 }
6679 }
6680
6681 /* Process a .EXPORT directive. This makes functions external
6682 and provides information such as argument relocation entries
6683 to callers. */
6684
6685 static void
6686 pa_export (int unused ATTRIBUTE_UNUSED)
6687 {
6688 char *name, c;
6689 symbolS *symbol;
6690
6691 c = get_symbol_name (&name);
6692 /* Make sure the given symbol exists. */
6693 if ((symbol = symbol_find_or_make (name)) == NULL)
6694 {
6695 as_bad (_("Cannot define export symbol: %s\n"), name);
6696 restore_line_pointer (c);
6697 input_line_pointer++;
6698 }
6699 else
6700 {
6701 /* OK. Set the external bits and process argument relocations.
6702 For the HP, weak and global are not mutually exclusive.
6703 S_SET_EXTERNAL will not set BSF_GLOBAL if WEAK is set.
6704 Call S_SET_EXTERNAL to get the other processing. Manually
6705 set BSF_GLOBAL when we get back. */
6706 S_SET_EXTERNAL (symbol);
6707 symbol_get_bfdsym (symbol)->flags |= BSF_GLOBAL;
6708 (void) restore_line_pointer (c);
6709 if (!is_end_of_statement ())
6710 {
6711 input_line_pointer++;
6712 pa_type_args (symbol, 1);
6713 }
6714 }
6715
6716 demand_empty_rest_of_line ();
6717 }
6718
6719 /* Handle an .IMPORT pseudo-op. Any symbol referenced in a given
6720 assembly file must either be defined in the assembly file, or
6721 explicitly IMPORTED from another. */
6722
6723 static void
6724 pa_import (int unused ATTRIBUTE_UNUSED)
6725 {
6726 char *name, c;
6727 symbolS *symbol;
6728
6729 c = get_symbol_name (&name);
6730
6731 symbol = symbol_find (name);
6732 /* Ugh. We might be importing a symbol defined earlier in the file,
6733 in which case all the code below will really screw things up
6734 (set the wrong segment, symbol flags & type, etc). */
6735 if (symbol == NULL || !S_IS_DEFINED (symbol))
6736 {
6737 symbol = symbol_find_or_make (name);
6738 (void) restore_line_pointer (c);
6739
6740 if (!is_end_of_statement ())
6741 {
6742 input_line_pointer++;
6743 pa_type_args (symbol, 0);
6744 }
6745 else
6746 {
6747 /* Sigh. To be compatible with the HP assembler and to help
6748 poorly written assembly code, we assign a type based on
6749 the current segment. Note only BSF_FUNCTION really
6750 matters, we do not need to set the full SYMBOL_TYPE_* info. */
6751 if (now_seg == text_section)
6752 symbol_get_bfdsym (symbol)->flags |= BSF_FUNCTION;
6753
6754 /* If the section is undefined, then the symbol is undefined
6755 Since this is an import, leave the section undefined. */
6756 S_SET_SEGMENT (symbol, bfd_und_section_ptr);
6757 }
6758 }
6759 else
6760 {
6761 /* The symbol was already defined. Just eat everything up to
6762 the end of the current statement. */
6763 while (!is_end_of_statement ())
6764 input_line_pointer++;
6765 }
6766
6767 demand_empty_rest_of_line ();
6768 }
6769
6770 /* Handle a .LABEL pseudo-op. */
6771
6772 static void
6773 pa_label (int unused ATTRIBUTE_UNUSED)
6774 {
6775 char *name, c;
6776
6777 c = get_symbol_name (&name);
6778
6779 if (strlen (name) > 0)
6780 {
6781 colon (name);
6782 (void) restore_line_pointer (c);
6783 }
6784 else
6785 {
6786 as_warn (_("Missing label name on .LABEL"));
6787 }
6788
6789 if (!is_end_of_statement ())
6790 {
6791 as_warn (_("extra .LABEL arguments ignored."));
6792 ignore_rest_of_line ();
6793 }
6794 demand_empty_rest_of_line ();
6795 }
6796
6797 /* Handle a .LEAVE pseudo-op. This is not supported yet. */
6798
6799 static void
6800 pa_leave (int unused ATTRIBUTE_UNUSED)
6801 {
6802 #ifdef OBJ_SOM
6803 /* We must have a valid space and subspace. */
6804 pa_check_current_space_and_subspace ();
6805 #endif
6806
6807 as_bad (_("The .LEAVE pseudo-op is not supported"));
6808 demand_empty_rest_of_line ();
6809 }
6810
6811 /* Handle a .LEVEL pseudo-op. */
6812
6813 static void
6814 pa_level (int unused ATTRIBUTE_UNUSED)
6815 {
6816 char *level;
6817
6818 level = input_line_pointer;
6819 if (strncmp (level, "1.0", 3) == 0)
6820 {
6821 input_line_pointer += 3;
6822 if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 10))
6823 as_warn (_("could not set architecture and machine"));
6824 }
6825 else if (strncmp (level, "1.1", 3) == 0)
6826 {
6827 input_line_pointer += 3;
6828 if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 11))
6829 as_warn (_("could not set architecture and machine"));
6830 }
6831 else if (strncmp (level, "2.0w", 4) == 0)
6832 {
6833 input_line_pointer += 4;
6834 if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 25))
6835 as_warn (_("could not set architecture and machine"));
6836 }
6837 else if (strncmp (level, "2.0", 3) == 0)
6838 {
6839 input_line_pointer += 3;
6840 if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 20))
6841 as_warn (_("could not set architecture and machine"));
6842 }
6843 else
6844 {
6845 as_bad (_("Unrecognized .LEVEL argument\n"));
6846 ignore_rest_of_line ();
6847 }
6848 demand_empty_rest_of_line ();
6849 }
6850
6851 /* Handle a .ORIGIN pseudo-op. */
6852
6853 static void
6854 pa_origin (int unused ATTRIBUTE_UNUSED)
6855 {
6856 #ifdef OBJ_SOM
6857 /* We must have a valid space and subspace. */
6858 pa_check_current_space_and_subspace ();
6859 #endif
6860
6861 s_org (0);
6862 pa_undefine_label ();
6863 }
6864
6865 /* Handle a .PARAM pseudo-op. This is much like a .EXPORT, except it
6866 is for static functions. FIXME. Should share more code with .EXPORT. */
6867
6868 static void
6869 pa_param (int unused ATTRIBUTE_UNUSED)
6870 {
6871 char *name, c;
6872 symbolS *symbol;
6873
6874 c = get_symbol_name (&name);
6875
6876 if ((symbol = symbol_find_or_make (name)) == NULL)
6877 {
6878 as_bad (_("Cannot define static symbol: %s\n"), name);
6879 (void) restore_line_pointer (c);
6880 input_line_pointer++;
6881 }
6882 else
6883 {
6884 S_CLEAR_EXTERNAL (symbol);
6885 (void) restore_line_pointer (c);
6886 if (!is_end_of_statement ())
6887 {
6888 input_line_pointer++;
6889 pa_type_args (symbol, 0);
6890 }
6891 }
6892
6893 demand_empty_rest_of_line ();
6894 }
6895
6896 /* Handle a .PROC pseudo-op. It is used to mark the beginning
6897 of a procedure from a syntactical point of view. */
6898
6899 static void
6900 pa_proc (int unused ATTRIBUTE_UNUSED)
6901 {
6902 struct call_info *call_info;
6903
6904 #ifdef OBJ_SOM
6905 /* We must have a valid space and subspace. */
6906 pa_check_current_space_and_subspace ();
6907 #endif
6908
6909 if (within_procedure)
6910 as_fatal (_("Nested procedures"));
6911
6912 /* Reset global variables for new procedure. */
6913 callinfo_found = FALSE;
6914 within_procedure = TRUE;
6915
6916 /* Create another call_info structure. */
6917 call_info = XNEW (struct call_info);
6918
6919 if (!call_info)
6920 as_fatal (_("Cannot allocate unwind descriptor\n"));
6921
6922 memset (call_info, 0, sizeof (struct call_info));
6923
6924 call_info->ci_next = NULL;
6925
6926 if (call_info_root == NULL)
6927 {
6928 call_info_root = call_info;
6929 last_call_info = call_info;
6930 }
6931 else
6932 {
6933 last_call_info->ci_next = call_info;
6934 last_call_info = call_info;
6935 }
6936
6937 /* set up defaults on call_info structure */
6938
6939 call_info->ci_unwind.descriptor.cannot_unwind = 0;
6940 call_info->ci_unwind.descriptor.region_desc = 1;
6941 call_info->ci_unwind.descriptor.hpux_interrupt_marker = 0;
6942
6943 /* If we got a .PROC pseudo-op, we know that the function is defined
6944 locally. Make sure it gets into the symbol table. */
6945 {
6946 label_symbol_struct *label_symbol = pa_get_label ();
6947
6948 if (label_symbol)
6949 {
6950 if (label_symbol->lss_label)
6951 {
6952 last_call_info->start_symbol = label_symbol->lss_label;
6953 symbol_get_bfdsym (label_symbol->lss_label)->flags |= BSF_FUNCTION;
6954 }
6955 else
6956 as_bad (_("Missing function name for .PROC (corrupted label chain)"));
6957 }
6958 else
6959 last_call_info->start_symbol = NULL;
6960 }
6961
6962 demand_empty_rest_of_line ();
6963 }
6964
6965 /* Process the syntactical end of a procedure. Make sure all the
6966 appropriate pseudo-ops were found within the procedure. */
6967
6968 static void
6969 pa_procend (int unused ATTRIBUTE_UNUSED)
6970 {
6971 #ifdef OBJ_SOM
6972 /* We must have a valid space and subspace. */
6973 pa_check_current_space_and_subspace ();
6974 #endif
6975
6976 /* If we are within a procedure definition, make sure we've
6977 defined a label for the procedure; handle case where the
6978 label was defined after the .PROC directive.
6979
6980 Note there's not need to diddle with the segment or fragment
6981 for the label symbol in this case. We have already switched
6982 into the new $CODE$ subspace at this point. */
6983 if (within_procedure && last_call_info->start_symbol == NULL)
6984 {
6985 label_symbol_struct *label_symbol = pa_get_label ();
6986
6987 if (label_symbol)
6988 {
6989 if (label_symbol->lss_label)
6990 {
6991 last_call_info->start_symbol = label_symbol->lss_label;
6992 symbol_get_bfdsym (label_symbol->lss_label)->flags
6993 |= BSF_FUNCTION;
6994 #ifdef OBJ_SOM
6995 /* Also handle allocation of a fixup to hold the unwind
6996 information when the label appears after the proc/procend. */
6997 if (within_entry_exit)
6998 {
6999 char *where;
7000 unsigned int u;
7001
7002 where = frag_more (0);
7003 u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor);
7004 fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
7005 NULL, (offsetT) 0, NULL,
7006 0, R_HPPA_ENTRY, e_fsel, 0, 0, u);
7007 }
7008 #endif
7009 }
7010 else
7011 as_bad (_("Missing function name for .PROC (corrupted label chain)"));
7012 }
7013 else
7014 as_bad (_("Missing function name for .PROC"));
7015 }
7016
7017 if (!within_procedure)
7018 as_bad (_("misplaced .procend"));
7019
7020 if (!callinfo_found)
7021 as_bad (_("Missing .callinfo for this procedure"));
7022
7023 if (within_entry_exit)
7024 as_bad (_("Missing .EXIT for a .ENTRY"));
7025
7026 #ifdef OBJ_ELF
7027 /* ELF needs to mark the end of each function so that it can compute
7028 the size of the function (apparently it's needed in the symbol table). */
7029 hppa_elf_mark_end_of_function ();
7030 #endif
7031
7032 within_procedure = FALSE;
7033 demand_empty_rest_of_line ();
7034 pa_undefine_label ();
7035 }
7036
7037 #ifdef OBJ_SOM
7038 /* If VALUE is an exact power of two between zero and 2^31, then
7039 return log2 (VALUE). Else return -1. */
7040
7041 static int
7042 exact_log2 (int value)
7043 {
7044 int shift = 0;
7045
7046 while ((1 << shift) != value && shift < 32)
7047 shift++;
7048
7049 if (shift >= 32)
7050 return -1;
7051 else
7052 return shift;
7053 }
7054
7055 /* Check to make sure we have a valid space and subspace. */
7056
7057 static void
7058 pa_check_current_space_and_subspace (void)
7059 {
7060 if (current_space == NULL)
7061 as_fatal (_("Not in a space.\n"));
7062
7063 if (current_subspace == NULL)
7064 as_fatal (_("Not in a subspace.\n"));
7065 }
7066
7067 /* Parse the parameters to a .SPACE directive; if CREATE_FLAG is nonzero,
7068 then create a new space entry to hold the information specified
7069 by the parameters to the .SPACE directive. */
7070
7071 static sd_chain_struct *
7072 pa_parse_space_stmt (const char *space_name, int create_flag)
7073 {
7074 char *name, *ptemp, c;
7075 char loadable, defined, private, sort;
7076 int spnum;
7077 asection *seg = NULL;
7078 sd_chain_struct *space;
7079
7080 /* Load default values. */
7081 spnum = 0;
7082 sort = 0;
7083 loadable = TRUE;
7084 defined = TRUE;
7085 private = FALSE;
7086 if (strcmp (space_name, "$TEXT$") == 0)
7087 {
7088 seg = pa_def_spaces[0].segment;
7089 defined = pa_def_spaces[0].defined;
7090 private = pa_def_spaces[0].private;
7091 sort = pa_def_spaces[0].sort;
7092 spnum = pa_def_spaces[0].spnum;
7093 }
7094 else if (strcmp (space_name, "$PRIVATE$") == 0)
7095 {
7096 seg = pa_def_spaces[1].segment;
7097 defined = pa_def_spaces[1].defined;
7098 private = pa_def_spaces[1].private;
7099 sort = pa_def_spaces[1].sort;
7100 spnum = pa_def_spaces[1].spnum;
7101 }
7102
7103 if (!is_end_of_statement ())
7104 {
7105 print_errors = FALSE;
7106 ptemp = input_line_pointer + 1;
7107 /* First see if the space was specified as a number rather than
7108 as a name. According to the PA assembly manual the rest of
7109 the line should be ignored. */
7110 strict = 0;
7111 pa_parse_number (&ptemp, 0);
7112 if (pa_number >= 0)
7113 {
7114 spnum = pa_number;
7115 input_line_pointer = ptemp;
7116 }
7117 else
7118 {
7119 while (!is_end_of_statement ())
7120 {
7121 input_line_pointer++;
7122 c = get_symbol_name (&name);
7123 if ((strncasecmp (name, "spnum", 5) == 0))
7124 {
7125 (void) restore_line_pointer (c);
7126 input_line_pointer++;
7127 spnum = get_absolute_expression ();
7128 }
7129 else if ((strncasecmp (name, "sort", 4) == 0))
7130 {
7131 (void) restore_line_pointer (c);
7132 input_line_pointer++;
7133 sort = get_absolute_expression ();
7134 }
7135 else if ((strncasecmp (name, "unloadable", 10) == 0))
7136 {
7137 (void) restore_line_pointer (c);
7138 loadable = FALSE;
7139 }
7140 else if ((strncasecmp (name, "notdefined", 10) == 0))
7141 {
7142 (void) restore_line_pointer (c);
7143 defined = FALSE;
7144 }
7145 else if ((strncasecmp (name, "private", 7) == 0))
7146 {
7147 (void) restore_line_pointer (c);
7148 private = TRUE;
7149 }
7150 else
7151 {
7152 as_bad (_("Invalid .SPACE argument"));
7153 (void) restore_line_pointer (c);
7154 if (!is_end_of_statement ())
7155 input_line_pointer++;
7156 }
7157 }
7158 }
7159 print_errors = TRUE;
7160 }
7161
7162 if (create_flag && seg == NULL)
7163 seg = subseg_new (space_name, 0);
7164
7165 /* If create_flag is nonzero, then create the new space with
7166 the attributes computed above. Else set the values in
7167 an already existing space -- this can only happen for
7168 the first occurrence of a built-in space. */
7169 if (create_flag)
7170 space = create_new_space (space_name, spnum, loadable, defined,
7171 private, sort, seg, 1);
7172 else
7173 {
7174 space = is_defined_space (space_name);
7175 SPACE_SPNUM (space) = spnum;
7176 SPACE_DEFINED (space) = defined & 1;
7177 SPACE_USER_DEFINED (space) = 1;
7178 }
7179
7180 #ifdef obj_set_section_attributes
7181 obj_set_section_attributes (seg, defined, private, sort, spnum);
7182 #endif
7183
7184 return space;
7185 }
7186
7187 /* Handle a .SPACE pseudo-op; this switches the current space to the
7188 given space, creating the new space if necessary. */
7189
7190 static void
7191 pa_space (int unused ATTRIBUTE_UNUSED)
7192 {
7193 char *name, c, *space_name, *save_s;
7194 sd_chain_struct *sd_chain;
7195
7196 if (within_procedure)
7197 {
7198 as_bad (_("Can\'t change spaces within a procedure definition. Ignored"));
7199 ignore_rest_of_line ();
7200 }
7201 else
7202 {
7203 /* Check for some of the predefined spaces. FIXME: most of the code
7204 below is repeated several times, can we extract the common parts
7205 and place them into a subroutine or something similar? */
7206 /* FIXME Is this (and the next IF stmt) really right?
7207 What if INPUT_LINE_POINTER points to "$TEXT$FOO"? */
7208 if (strncmp (input_line_pointer, "$TEXT$", 6) == 0)
7209 {
7210 input_line_pointer += 6;
7211 sd_chain = is_defined_space ("$TEXT$");
7212 if (sd_chain == NULL)
7213 sd_chain = pa_parse_space_stmt ("$TEXT$", 1);
7214 else if (SPACE_USER_DEFINED (sd_chain) == 0)
7215 sd_chain = pa_parse_space_stmt ("$TEXT$", 0);
7216
7217 current_space = sd_chain;
7218 subseg_set (text_section, sd_chain->sd_last_subseg);
7219 current_subspace
7220 = pa_subsegment_to_subspace (text_section,
7221 sd_chain->sd_last_subseg);
7222 demand_empty_rest_of_line ();
7223 return;
7224 }
7225 if (strncmp (input_line_pointer, "$PRIVATE$", 9) == 0)
7226 {
7227 input_line_pointer += 9;
7228 sd_chain = is_defined_space ("$PRIVATE$");
7229 if (sd_chain == NULL)
7230 sd_chain = pa_parse_space_stmt ("$PRIVATE$", 1);
7231 else if (SPACE_USER_DEFINED (sd_chain) == 0)
7232 sd_chain = pa_parse_space_stmt ("$PRIVATE$", 0);
7233
7234 current_space = sd_chain;
7235 subseg_set (data_section, sd_chain->sd_last_subseg);
7236 current_subspace
7237 = pa_subsegment_to_subspace (data_section,
7238 sd_chain->sd_last_subseg);
7239 demand_empty_rest_of_line ();
7240 return;
7241 }
7242 if (!strncasecmp (input_line_pointer,
7243 GDB_DEBUG_SPACE_NAME,
7244 strlen (GDB_DEBUG_SPACE_NAME)))
7245 {
7246 input_line_pointer += strlen (GDB_DEBUG_SPACE_NAME);
7247 sd_chain = is_defined_space (GDB_DEBUG_SPACE_NAME);
7248 if (sd_chain == NULL)
7249 sd_chain = pa_parse_space_stmt (GDB_DEBUG_SPACE_NAME, 1);
7250 else if (SPACE_USER_DEFINED (sd_chain) == 0)
7251 sd_chain = pa_parse_space_stmt (GDB_DEBUG_SPACE_NAME, 0);
7252
7253 current_space = sd_chain;
7254
7255 {
7256 asection *gdb_section
7257 = bfd_make_section_old_way (stdoutput, GDB_DEBUG_SPACE_NAME);
7258
7259 subseg_set (gdb_section, sd_chain->sd_last_subseg);
7260 current_subspace
7261 = pa_subsegment_to_subspace (gdb_section,
7262 sd_chain->sd_last_subseg);
7263 }
7264 demand_empty_rest_of_line ();
7265 return;
7266 }
7267
7268 /* It could be a space specified by number. */
7269 print_errors = 0;
7270 save_s = input_line_pointer;
7271 strict = 0;
7272 pa_parse_number (&input_line_pointer, 0);
7273 if (pa_number >= 0)
7274 {
7275 if ((sd_chain = pa_find_space_by_number (pa_number)))
7276 {
7277 current_space = sd_chain;
7278
7279 subseg_set (sd_chain->sd_seg, sd_chain->sd_last_subseg);
7280 current_subspace
7281 = pa_subsegment_to_subspace (sd_chain->sd_seg,
7282 sd_chain->sd_last_subseg);
7283 demand_empty_rest_of_line ();
7284 return;
7285 }
7286 }
7287
7288 /* Not a number, attempt to create a new space. */
7289 print_errors = 1;
7290 input_line_pointer = save_s;
7291 c = get_symbol_name (&name);
7292 space_name = xstrdup (name);
7293 (void) restore_line_pointer (c);
7294
7295 sd_chain = pa_parse_space_stmt (space_name, 1);
7296 current_space = sd_chain;
7297
7298 subseg_set (sd_chain->sd_seg, sd_chain->sd_last_subseg);
7299 current_subspace = pa_subsegment_to_subspace (sd_chain->sd_seg,
7300 sd_chain->sd_last_subseg);
7301 demand_empty_rest_of_line ();
7302 }
7303 }
7304
7305 /* Switch to a new space. (I think). FIXME. */
7306
7307 static void
7308 pa_spnum (int unused ATTRIBUTE_UNUSED)
7309 {
7310 char *name;
7311 char c;
7312 char *p;
7313 sd_chain_struct *space;
7314
7315 c = get_symbol_name (&name);
7316 space = is_defined_space (name);
7317 if (space)
7318 {
7319 p = frag_more (4);
7320 md_number_to_chars (p, SPACE_SPNUM (space), 4);
7321 }
7322 else
7323 as_warn (_("Undefined space: '%s' Assuming space number = 0."), name);
7324
7325 (void) restore_line_pointer (c);
7326 demand_empty_rest_of_line ();
7327 }
7328
7329 /* Handle a .SUBSPACE pseudo-op; this switches the current subspace to the
7330 given subspace, creating the new subspace if necessary.
7331
7332 FIXME. Should mirror pa_space more closely, in particular how
7333 they're broken up into subroutines. */
7334
7335 static void
7336 pa_subspace (int create_new)
7337 {
7338 char *name, *ss_name, c;
7339 char loadable, code_only, comdat, common, dup_common, zero, sort;
7340 int i, access_ctr, space_index, alignment, quadrant, applicable, flags;
7341 sd_chain_struct *space;
7342 ssd_chain_struct *ssd;
7343 asection *section;
7344
7345 if (current_space == NULL)
7346 as_fatal (_("Must be in a space before changing or declaring subspaces.\n"));
7347
7348 if (within_procedure)
7349 {
7350 as_bad (_("Can\'t change subspaces within a procedure definition. Ignored"));
7351 ignore_rest_of_line ();
7352 }
7353 else
7354 {
7355 c = get_symbol_name (&name);
7356 ss_name = xstrdup (name);
7357 (void) restore_line_pointer (c);
7358
7359 /* Load default values. */
7360 sort = 0;
7361 access_ctr = 0x7f;
7362 loadable = 1;
7363 comdat = 0;
7364 common = 0;
7365 dup_common = 0;
7366 code_only = 0;
7367 zero = 0;
7368 space_index = ~0;
7369 alignment = 1;
7370 quadrant = 0;
7371
7372 space = current_space;
7373 if (create_new)
7374 ssd = NULL;
7375 else
7376 ssd = is_defined_subspace (ss_name);
7377 /* Allow user to override the builtin attributes of subspaces. But
7378 only allow the attributes to be changed once! */
7379 if (ssd && SUBSPACE_DEFINED (ssd))
7380 {
7381 subseg_set (ssd->ssd_seg, ssd->ssd_subseg);
7382 current_subspace = ssd;
7383 if (!is_end_of_statement ())
7384 as_warn (_("Parameters of an existing subspace can\'t be modified"));
7385 demand_empty_rest_of_line ();
7386 return;
7387 }
7388 else
7389 {
7390 /* A new subspace. Load default values if it matches one of
7391 the builtin subspaces. */
7392 i = 0;
7393 while (pa_def_subspaces[i].name)
7394 {
7395 if (strcasecmp (pa_def_subspaces[i].name, ss_name) == 0)
7396 {
7397 loadable = pa_def_subspaces[i].loadable;
7398 comdat = pa_def_subspaces[i].comdat;
7399 common = pa_def_subspaces[i].common;
7400 dup_common = pa_def_subspaces[i].dup_common;
7401 code_only = pa_def_subspaces[i].code_only;
7402 zero = pa_def_subspaces[i].zero;
7403 space_index = pa_def_subspaces[i].space_index;
7404 alignment = pa_def_subspaces[i].alignment;
7405 quadrant = pa_def_subspaces[i].quadrant;
7406 access_ctr = pa_def_subspaces[i].access;
7407 sort = pa_def_subspaces[i].sort;
7408 break;
7409 }
7410 i++;
7411 }
7412 }
7413
7414 /* We should be working with a new subspace now. Fill in
7415 any information as specified by the user. */
7416 if (!is_end_of_statement ())
7417 {
7418 input_line_pointer++;
7419 while (!is_end_of_statement ())
7420 {
7421 c = get_symbol_name (&name);
7422 if ((strncasecmp (name, "quad", 4) == 0))
7423 {
7424 (void) restore_line_pointer (c);
7425 input_line_pointer++;
7426 quadrant = get_absolute_expression ();
7427 }
7428 else if ((strncasecmp (name, "align", 5) == 0))
7429 {
7430 (void) restore_line_pointer (c);
7431 input_line_pointer++;
7432 alignment = get_absolute_expression ();
7433 if (exact_log2 (alignment) == -1)
7434 {
7435 as_bad (_("Alignment must be a power of 2"));
7436 alignment = 1;
7437 }
7438 }
7439 else if ((strncasecmp (name, "access", 6) == 0))
7440 {
7441 (void) restore_line_pointer (c);
7442 input_line_pointer++;
7443 access_ctr = get_absolute_expression ();
7444 }
7445 else if ((strncasecmp (name, "sort", 4) == 0))
7446 {
7447 (void) restore_line_pointer (c);
7448 input_line_pointer++;
7449 sort = get_absolute_expression ();
7450 }
7451 else if ((strncasecmp (name, "code_only", 9) == 0))
7452 {
7453 (void) restore_line_pointer (c);
7454 code_only = 1;
7455 }
7456 else if ((strncasecmp (name, "unloadable", 10) == 0))
7457 {
7458 (void) restore_line_pointer (c);
7459 loadable = 0;
7460 }
7461 else if ((strncasecmp (name, "comdat", 6) == 0))
7462 {
7463 (void) restore_line_pointer (c);
7464 comdat = 1;
7465 }
7466 else if ((strncasecmp (name, "common", 6) == 0))
7467 {
7468 (void) restore_line_pointer (c);
7469 common = 1;
7470 }
7471 else if ((strncasecmp (name, "dup_comm", 8) == 0))
7472 {
7473 (void) restore_line_pointer (c);
7474 dup_common = 1;
7475 }
7476 else if ((strncasecmp (name, "zero", 4) == 0))
7477 {
7478 (void) restore_line_pointer (c);
7479 zero = 1;
7480 }
7481 else if ((strncasecmp (name, "first", 5) == 0))
7482 as_bad (_("FIRST not supported as a .SUBSPACE argument"));
7483 else
7484 as_bad (_("Invalid .SUBSPACE argument"));
7485
7486 if (!is_end_of_statement ())
7487 input_line_pointer++;
7488 }
7489 }
7490
7491 /* Compute a reasonable set of BFD flags based on the information
7492 in the .subspace directive. */
7493 applicable = bfd_applicable_section_flags (stdoutput);
7494 flags = 0;
7495 if (loadable)
7496 flags |= (SEC_ALLOC | SEC_LOAD);
7497 if (code_only)
7498 flags |= SEC_CODE;
7499
7500 /* These flags are used to implement various flavors of initialized
7501 common. The SOM linker discards duplicate subspaces when they
7502 have the same "key" symbol name. This support is more like
7503 GNU linkonce than BFD common. Further, pc-relative relocations
7504 are converted to section relative relocations in BFD common
7505 sections. This complicates the handling of relocations in
7506 common sections containing text and isn't currently supported
7507 correctly in the SOM BFD backend. */
7508 if (comdat || common || dup_common)
7509 flags |= SEC_LINK_ONCE;
7510
7511 flags |= SEC_RELOC | SEC_HAS_CONTENTS;
7512
7513 /* This is a zero-filled subspace (eg BSS). */
7514 if (zero)
7515 flags &= ~(SEC_LOAD | SEC_HAS_CONTENTS);
7516
7517 applicable &= flags;
7518
7519 /* If this is an existing subspace, then we want to use the
7520 segment already associated with the subspace.
7521
7522 FIXME NOW! ELF BFD doesn't appear to be ready to deal with
7523 lots of sections. It might be a problem in the PA ELF
7524 code, I do not know yet. For now avoid creating anything
7525 but the "standard" sections for ELF. */
7526 if (create_new)
7527 section = subseg_force_new (ss_name, 0);
7528 else if (ssd)
7529 section = ssd->ssd_seg;
7530 else
7531 section = subseg_new (ss_name, 0);
7532
7533 if (zero)
7534 seg_info (section)->bss = 1;
7535
7536 /* Now set the flags. */
7537 bfd_set_section_flags (stdoutput, section, applicable);
7538
7539 /* Record any alignment request for this section. */
7540 record_alignment (section, exact_log2 (alignment));
7541
7542 /* Set the starting offset for this section. */
7543 bfd_set_section_vma (stdoutput, section,
7544 pa_subspace_start (space, quadrant));
7545
7546 /* Now that all the flags are set, update an existing subspace,
7547 or create a new one. */
7548 if (ssd)
7549
7550 current_subspace = update_subspace (space, ss_name, loadable,
7551 code_only, comdat, common,
7552 dup_common, sort, zero, access_ctr,
7553 space_index, alignment, quadrant,
7554 section);
7555 else
7556 current_subspace = create_new_subspace (space, ss_name, loadable,
7557 code_only, comdat, common,
7558 dup_common, zero, sort,
7559 access_ctr, space_index,
7560 alignment, quadrant, section);
7561
7562 demand_empty_rest_of_line ();
7563 current_subspace->ssd_seg = section;
7564 subseg_set (current_subspace->ssd_seg, current_subspace->ssd_subseg);
7565 }
7566 SUBSPACE_DEFINED (current_subspace) = 1;
7567 }
7568
7569 /* Create default space and subspace dictionaries. */
7570
7571 static void
7572 pa_spaces_begin (void)
7573 {
7574 int i;
7575
7576 space_dict_root = NULL;
7577 space_dict_last = NULL;
7578
7579 i = 0;
7580 while (pa_def_spaces[i].name)
7581 {
7582 const char *name;
7583
7584 /* Pick the right name to use for the new section. */
7585 name = pa_def_spaces[i].name;
7586
7587 pa_def_spaces[i].segment = subseg_new (name, 0);
7588 create_new_space (pa_def_spaces[i].name, pa_def_spaces[i].spnum,
7589 pa_def_spaces[i].loadable, pa_def_spaces[i].defined,
7590 pa_def_spaces[i].private, pa_def_spaces[i].sort,
7591 pa_def_spaces[i].segment, 0);
7592 i++;
7593 }
7594
7595 i = 0;
7596 while (pa_def_subspaces[i].name)
7597 {
7598 const char *name;
7599 int applicable, subsegment;
7600 asection *segment = NULL;
7601 sd_chain_struct *space;
7602
7603 /* Pick the right name for the new section and pick the right
7604 subsegment number. */
7605 name = pa_def_subspaces[i].name;
7606 subsegment = 0;
7607
7608 /* Create the new section. */
7609 segment = subseg_new (name, subsegment);
7610
7611 /* For SOM we want to replace the standard .text, .data, and .bss
7612 sections with our own. We also want to set BFD flags for
7613 all the built-in subspaces. */
7614 if (!strcmp (pa_def_subspaces[i].name, "$CODE$"))
7615 {
7616 text_section = segment;
7617 applicable = bfd_applicable_section_flags (stdoutput);
7618 bfd_set_section_flags (stdoutput, segment,
7619 applicable & (SEC_ALLOC | SEC_LOAD
7620 | SEC_RELOC | SEC_CODE
7621 | SEC_READONLY
7622 | SEC_HAS_CONTENTS));
7623 }
7624 else if (!strcmp (pa_def_subspaces[i].name, "$DATA$"))
7625 {
7626 data_section = segment;
7627 applicable = bfd_applicable_section_flags (stdoutput);
7628 bfd_set_section_flags (stdoutput, segment,
7629 applicable & (SEC_ALLOC | SEC_LOAD
7630 | SEC_RELOC
7631 | SEC_HAS_CONTENTS));
7632
7633 }
7634 else if (!strcmp (pa_def_subspaces[i].name, "$BSS$"))
7635 {
7636 bss_section = segment;
7637 applicable = bfd_applicable_section_flags (stdoutput);
7638 bfd_set_section_flags (stdoutput, segment,
7639 applicable & SEC_ALLOC);
7640 }
7641 else if (!strcmp (pa_def_subspaces[i].name, "$LIT$"))
7642 {
7643 applicable = bfd_applicable_section_flags (stdoutput);
7644 bfd_set_section_flags (stdoutput, segment,
7645 applicable & (SEC_ALLOC | SEC_LOAD
7646 | SEC_RELOC
7647 | SEC_READONLY
7648 | SEC_HAS_CONTENTS));
7649 }
7650 else if (!strcmp (pa_def_subspaces[i].name, "$MILLICODE$"))
7651 {
7652 applicable = bfd_applicable_section_flags (stdoutput);
7653 bfd_set_section_flags (stdoutput, segment,
7654 applicable & (SEC_ALLOC | SEC_LOAD
7655 | SEC_RELOC
7656 | SEC_READONLY
7657 | SEC_HAS_CONTENTS));
7658 }
7659 else if (!strcmp (pa_def_subspaces[i].name, "$UNWIND$"))
7660 {
7661 applicable = bfd_applicable_section_flags (stdoutput);
7662 bfd_set_section_flags (stdoutput, segment,
7663 applicable & (SEC_ALLOC | SEC_LOAD
7664 | SEC_RELOC
7665 | SEC_READONLY
7666 | SEC_HAS_CONTENTS));
7667 }
7668
7669 /* Find the space associated with this subspace. */
7670 space = pa_segment_to_space (pa_def_spaces[pa_def_subspaces[i].
7671 def_space_index].segment);
7672 if (space == NULL)
7673 {
7674 as_fatal (_("Internal error: Unable to find containing space for %s."),
7675 pa_def_subspaces[i].name);
7676 }
7677
7678 create_new_subspace (space, name,
7679 pa_def_subspaces[i].loadable,
7680 pa_def_subspaces[i].code_only,
7681 pa_def_subspaces[i].comdat,
7682 pa_def_subspaces[i].common,
7683 pa_def_subspaces[i].dup_common,
7684 pa_def_subspaces[i].zero,
7685 pa_def_subspaces[i].sort,
7686 pa_def_subspaces[i].access,
7687 pa_def_subspaces[i].space_index,
7688 pa_def_subspaces[i].alignment,
7689 pa_def_subspaces[i].quadrant,
7690 segment);
7691 i++;
7692 }
7693 }
7694
7695 /* Create a new space NAME, with the appropriate flags as defined
7696 by the given parameters. */
7697
7698 static sd_chain_struct *
7699 create_new_space (const char *name,
7700 int spnum,
7701 int loadable ATTRIBUTE_UNUSED,
7702 int defined,
7703 int private,
7704 int sort,
7705 asection *seg,
7706 int user_defined)
7707 {
7708 sd_chain_struct *chain_entry;
7709
7710 chain_entry = XNEW (sd_chain_struct);
7711 SPACE_NAME (chain_entry) = xstrdup (name);
7712 SPACE_DEFINED (chain_entry) = defined;
7713 SPACE_USER_DEFINED (chain_entry) = user_defined;
7714 SPACE_SPNUM (chain_entry) = spnum;
7715
7716 chain_entry->sd_seg = seg;
7717 chain_entry->sd_last_subseg = -1;
7718 chain_entry->sd_subspaces = NULL;
7719 chain_entry->sd_next = NULL;
7720
7721 /* Find spot for the new space based on its sort key. */
7722 if (!space_dict_last)
7723 space_dict_last = chain_entry;
7724
7725 if (space_dict_root == NULL)
7726 space_dict_root = chain_entry;
7727 else
7728 {
7729 sd_chain_struct *chain_pointer;
7730 sd_chain_struct *prev_chain_pointer;
7731
7732 chain_pointer = space_dict_root;
7733 prev_chain_pointer = NULL;
7734
7735 while (chain_pointer)
7736 {
7737 prev_chain_pointer = chain_pointer;
7738 chain_pointer = chain_pointer->sd_next;
7739 }
7740
7741 /* At this point we've found the correct place to add the new
7742 entry. So add it and update the linked lists as appropriate. */
7743 if (prev_chain_pointer)
7744 {
7745 chain_entry->sd_next = chain_pointer;
7746 prev_chain_pointer->sd_next = chain_entry;
7747 }
7748 else
7749 {
7750 space_dict_root = chain_entry;
7751 chain_entry->sd_next = chain_pointer;
7752 }
7753
7754 if (chain_entry->sd_next == NULL)
7755 space_dict_last = chain_entry;
7756 }
7757
7758 /* This is here to catch predefined spaces which do not get
7759 modified by the user's input. Another call is found at
7760 the bottom of pa_parse_space_stmt to handle cases where
7761 the user modifies a predefined space. */
7762 #ifdef obj_set_section_attributes
7763 obj_set_section_attributes (seg, defined, private, sort, spnum);
7764 #endif
7765
7766 return chain_entry;
7767 }
7768
7769 /* Create a new subspace NAME, with the appropriate flags as defined
7770 by the given parameters.
7771
7772 Add the new subspace to the subspace dictionary chain in numerical
7773 order as defined by the SORT entries. */
7774
7775 static ssd_chain_struct *
7776 create_new_subspace (sd_chain_struct *space,
7777 const char *name,
7778 int loadable ATTRIBUTE_UNUSED,
7779 int code_only ATTRIBUTE_UNUSED,
7780 int comdat,
7781 int common,
7782 int dup_common,
7783 int is_zero ATTRIBUTE_UNUSED,
7784 int sort,
7785 int access_ctr,
7786 int space_index ATTRIBUTE_UNUSED,
7787 int alignment ATTRIBUTE_UNUSED,
7788 int quadrant,
7789 asection *seg)
7790 {
7791 ssd_chain_struct *chain_entry;
7792
7793 chain_entry = XNEW (ssd_chain_struct);
7794 SUBSPACE_NAME (chain_entry) = xstrdup (name);
7795
7796 /* Initialize subspace_defined. When we hit a .subspace directive
7797 we'll set it to 1 which "locks-in" the subspace attributes. */
7798 SUBSPACE_DEFINED (chain_entry) = 0;
7799
7800 chain_entry->ssd_subseg = 0;
7801 chain_entry->ssd_seg = seg;
7802 chain_entry->ssd_next = NULL;
7803
7804 /* Find spot for the new subspace based on its sort key. */
7805 if (space->sd_subspaces == NULL)
7806 space->sd_subspaces = chain_entry;
7807 else
7808 {
7809 ssd_chain_struct *chain_pointer;
7810 ssd_chain_struct *prev_chain_pointer;
7811
7812 chain_pointer = space->sd_subspaces;
7813 prev_chain_pointer = NULL;
7814
7815 while (chain_pointer)
7816 {
7817 prev_chain_pointer = chain_pointer;
7818 chain_pointer = chain_pointer->ssd_next;
7819 }
7820
7821 /* Now we have somewhere to put the new entry. Insert it and update
7822 the links. */
7823 if (prev_chain_pointer)
7824 {
7825 chain_entry->ssd_next = chain_pointer;
7826 prev_chain_pointer->ssd_next = chain_entry;
7827 }
7828 else
7829 {
7830 space->sd_subspaces = chain_entry;
7831 chain_entry->ssd_next = chain_pointer;
7832 }
7833 }
7834
7835 #ifdef obj_set_subsection_attributes
7836 obj_set_subsection_attributes (seg, space->sd_seg, access_ctr, sort,
7837 quadrant, comdat, common, dup_common);
7838 #endif
7839
7840 return chain_entry;
7841 }
7842
7843 /* Update the information for the given subspace based upon the
7844 various arguments. Return the modified subspace chain entry. */
7845
7846 static ssd_chain_struct *
7847 update_subspace (sd_chain_struct *space,
7848 char *name,
7849 int loadable ATTRIBUTE_UNUSED,
7850 int code_only ATTRIBUTE_UNUSED,
7851 int comdat,
7852 int common,
7853 int dup_common,
7854 int sort,
7855 int zero ATTRIBUTE_UNUSED,
7856 int access_ctr,
7857 int space_index ATTRIBUTE_UNUSED,
7858 int alignment ATTRIBUTE_UNUSED,
7859 int quadrant,
7860 asection *section)
7861 {
7862 ssd_chain_struct *chain_entry;
7863
7864 chain_entry = is_defined_subspace (name);
7865
7866 #ifdef obj_set_subsection_attributes
7867 obj_set_subsection_attributes (section, space->sd_seg, access_ctr, sort,
7868 quadrant, comdat, common, dup_common);
7869 #endif
7870
7871 return chain_entry;
7872 }
7873
7874 /* Return the space chain entry for the space with the name NAME or
7875 NULL if no such space exists. */
7876
7877 static sd_chain_struct *
7878 is_defined_space (const char *name)
7879 {
7880 sd_chain_struct *chain_pointer;
7881
7882 for (chain_pointer = space_dict_root;
7883 chain_pointer;
7884 chain_pointer = chain_pointer->sd_next)
7885 if (strcmp (SPACE_NAME (chain_pointer), name) == 0)
7886 return chain_pointer;
7887
7888 /* No mapping from segment to space was found. Return NULL. */
7889 return NULL;
7890 }
7891
7892 /* Find and return the space associated with the given seg. If no mapping
7893 from the given seg to a space is found, then return NULL.
7894
7895 Unlike subspaces, the number of spaces is not expected to grow much,
7896 so a linear exhaustive search is OK here. */
7897
7898 static sd_chain_struct *
7899 pa_segment_to_space (asection *seg)
7900 {
7901 sd_chain_struct *space_chain;
7902
7903 /* Walk through each space looking for the correct mapping. */
7904 for (space_chain = space_dict_root;
7905 space_chain;
7906 space_chain = space_chain->sd_next)
7907 if (space_chain->sd_seg == seg)
7908 return space_chain;
7909
7910 /* Mapping was not found. Return NULL. */
7911 return NULL;
7912 }
7913
7914 /* Return the first space chain entry for the subspace with the name
7915 NAME or NULL if no such subspace exists.
7916
7917 When there are multiple subspaces with the same name, switching to
7918 the first (i.e., default) subspace is preferable in most situations.
7919 For example, it wouldn't be desirable to merge COMDAT data with non
7920 COMDAT data.
7921
7922 Uses a linear search through all the spaces and subspaces, this may
7923 not be appropriate if we ever being placing each function in its
7924 own subspace. */
7925
7926 static ssd_chain_struct *
7927 is_defined_subspace (const char *name)
7928 {
7929 sd_chain_struct *space_chain;
7930 ssd_chain_struct *subspace_chain;
7931
7932 /* Walk through each space. */
7933 for (space_chain = space_dict_root;
7934 space_chain;
7935 space_chain = space_chain->sd_next)
7936 {
7937 /* Walk through each subspace looking for a name which matches. */
7938 for (subspace_chain = space_chain->sd_subspaces;
7939 subspace_chain;
7940 subspace_chain = subspace_chain->ssd_next)
7941 if (strcmp (SUBSPACE_NAME (subspace_chain), name) == 0)
7942 return subspace_chain;
7943 }
7944
7945 /* Subspace wasn't found. Return NULL. */
7946 return NULL;
7947 }
7948
7949 /* Find and return the subspace associated with the given seg. If no
7950 mapping from the given seg to a subspace is found, then return NULL.
7951
7952 If we ever put each procedure/function within its own subspace
7953 (to make life easier on the compiler and linker), then this will have
7954 to become more efficient. */
7955
7956 static ssd_chain_struct *
7957 pa_subsegment_to_subspace (asection *seg, subsegT subseg)
7958 {
7959 sd_chain_struct *space_chain;
7960 ssd_chain_struct *subspace_chain;
7961
7962 /* Walk through each space. */
7963 for (space_chain = space_dict_root;
7964 space_chain;
7965 space_chain = space_chain->sd_next)
7966 {
7967 if (space_chain->sd_seg == seg)
7968 {
7969 /* Walk through each subspace within each space looking for
7970 the correct mapping. */
7971 for (subspace_chain = space_chain->sd_subspaces;
7972 subspace_chain;
7973 subspace_chain = subspace_chain->ssd_next)
7974 if (subspace_chain->ssd_subseg == (int) subseg)
7975 return subspace_chain;
7976 }
7977 }
7978
7979 /* No mapping from subsegment to subspace found. Return NULL. */
7980 return NULL;
7981 }
7982
7983 /* Given a number, try and find a space with the name number.
7984
7985 Return a pointer to a space dictionary chain entry for the space
7986 that was found or NULL on failure. */
7987
7988 static sd_chain_struct *
7989 pa_find_space_by_number (int number)
7990 {
7991 sd_chain_struct *space_chain;
7992
7993 for (space_chain = space_dict_root;
7994 space_chain;
7995 space_chain = space_chain->sd_next)
7996 {
7997 if (SPACE_SPNUM (space_chain) == (unsigned int) number)
7998 return space_chain;
7999 }
8000
8001 /* No appropriate space found. Return NULL. */
8002 return NULL;
8003 }
8004
8005 /* Return the starting address for the given subspace. If the starting
8006 address is unknown then return zero. */
8007
8008 static unsigned int
8009 pa_subspace_start (sd_chain_struct *space, int quadrant)
8010 {
8011 /* FIXME. Assumes everyone puts read/write data at 0x4000000, this
8012 is not correct for the PA OSF1 port. */
8013 if ((strcmp (SPACE_NAME (space), "$PRIVATE$") == 0) && quadrant == 1)
8014 return 0x40000000;
8015 else if (space->sd_seg == data_section && quadrant == 1)
8016 return 0x40000000;
8017 else
8018 return 0;
8019 return 0;
8020 }
8021 #endif
8022
8023 /* Helper function for pa_stringer. Used to find the end of
8024 a string. */
8025
8026 static unsigned int
8027 pa_stringer_aux (char *s)
8028 {
8029 unsigned int c = *s & CHAR_MASK;
8030
8031 switch (c)
8032 {
8033 case '\"':
8034 c = NOT_A_CHAR;
8035 break;
8036 default:
8037 break;
8038 }
8039 return c;
8040 }
8041
8042 /* Handle a .STRING type pseudo-op. */
8043
8044 static void
8045 pa_stringer (int append_zero)
8046 {
8047 char *s, num_buf[4];
8048 unsigned int c;
8049 int i;
8050
8051 /* Preprocess the string to handle PA-specific escape sequences.
8052 For example, \xDD where DD is a hexadecimal number should be
8053 changed to \OOO where OOO is an octal number. */
8054
8055 #ifdef OBJ_SOM
8056 /* We must have a valid space and subspace. */
8057 pa_check_current_space_and_subspace ();
8058 #endif
8059
8060 /* Skip the opening quote. */
8061 s = input_line_pointer + 1;
8062
8063 while (is_a_char (c = pa_stringer_aux (s++)))
8064 {
8065 if (c == '\\')
8066 {
8067 c = *s;
8068 switch (c)
8069 {
8070 /* Handle \x<num>. */
8071 case 'x':
8072 {
8073 unsigned int number;
8074 int num_digit;
8075 char dg;
8076 char *s_start = s;
8077
8078 /* Get past the 'x'. */
8079 s++;
8080 for (num_digit = 0, number = 0, dg = *s;
8081 num_digit < 2
8082 && (ISDIGIT (dg) || (dg >= 'a' && dg <= 'f')
8083 || (dg >= 'A' && dg <= 'F'));
8084 num_digit++)
8085 {
8086 if (ISDIGIT (dg))
8087 number = number * 16 + dg - '0';
8088 else if (dg >= 'a' && dg <= 'f')
8089 number = number * 16 + dg - 'a' + 10;
8090 else
8091 number = number * 16 + dg - 'A' + 10;
8092
8093 s++;
8094 dg = *s;
8095 }
8096 if (num_digit > 0)
8097 {
8098 switch (num_digit)
8099 {
8100 case 1:
8101 sprintf (num_buf, "%02o", number);
8102 break;
8103 case 2:
8104 sprintf (num_buf, "%03o", number);
8105 break;
8106 }
8107 for (i = 0; i <= num_digit; i++)
8108 s_start[i] = num_buf[i];
8109 }
8110 break;
8111 }
8112 /* This might be a "\"", skip over the escaped char. */
8113 default:
8114 s++;
8115 break;
8116 }
8117 }
8118 }
8119 stringer (8 + append_zero);
8120 pa_undefine_label ();
8121 }
8122
8123 /* Handle a .VERSION pseudo-op. */
8124
8125 static void
8126 pa_version (int unused ATTRIBUTE_UNUSED)
8127 {
8128 obj_version (0);
8129 pa_undefine_label ();
8130 }
8131
8132 #ifdef OBJ_SOM
8133
8134 /* Handle a .COMPILER pseudo-op. */
8135
8136 static void
8137 pa_compiler (int unused ATTRIBUTE_UNUSED)
8138 {
8139 obj_som_compiler (0);
8140 pa_undefine_label ();
8141 }
8142
8143 #endif
8144
8145 /* Handle a .COPYRIGHT pseudo-op. */
8146
8147 static void
8148 pa_copyright (int unused ATTRIBUTE_UNUSED)
8149 {
8150 obj_copyright (0);
8151 pa_undefine_label ();
8152 }
8153
8154 /* Just like a normal cons, but when finished we have to undefine
8155 the latest space label. */
8156
8157 static void
8158 pa_cons (int nbytes)
8159 {
8160 cons (nbytes);
8161 pa_undefine_label ();
8162 }
8163
8164 /* Like float_cons, but we need to undefine our label. */
8165
8166 static void
8167 pa_float_cons (int float_type)
8168 {
8169 float_cons (float_type);
8170 pa_undefine_label ();
8171 }
8172
8173 /* Like s_fill, but delete our label when finished. */
8174
8175 static void
8176 pa_fill (int unused ATTRIBUTE_UNUSED)
8177 {
8178 #ifdef OBJ_SOM
8179 /* We must have a valid space and subspace. */
8180 pa_check_current_space_and_subspace ();
8181 #endif
8182
8183 s_fill (0);
8184 pa_undefine_label ();
8185 }
8186
8187 /* Like lcomm, but delete our label when finished. */
8188
8189 static void
8190 pa_lcomm (int needs_align)
8191 {
8192 #ifdef OBJ_SOM
8193 /* We must have a valid space and subspace. */
8194 pa_check_current_space_and_subspace ();
8195 #endif
8196
8197 s_lcomm (needs_align);
8198 pa_undefine_label ();
8199 }
8200
8201 /* Like lsym, but delete our label when finished. */
8202
8203 static void
8204 pa_lsym (int unused ATTRIBUTE_UNUSED)
8205 {
8206 #ifdef OBJ_SOM
8207 /* We must have a valid space and subspace. */
8208 pa_check_current_space_and_subspace ();
8209 #endif
8210
8211 s_lsym (0);
8212 pa_undefine_label ();
8213 }
8214
8215 /* This function is called once, at assembler startup time. It should
8216 set up all the tables, etc. that the MD part of the assembler will need. */
8217
8218 void
8219 md_begin (void)
8220 {
8221 const char *retval = NULL;
8222 int lose = 0;
8223 unsigned int i = 0;
8224
8225 last_call_info = NULL;
8226 call_info_root = NULL;
8227
8228 /* Set the default machine type. */
8229 if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, DEFAULT_LEVEL))
8230 as_warn (_("could not set architecture and machine"));
8231
8232 /* Folding of text and data segments fails miserably on the PA.
8233 Warn user and disable "-R" option. */
8234 if (flag_readonly_data_in_text)
8235 {
8236 as_warn (_("-R option not supported on this target."));
8237 flag_readonly_data_in_text = 0;
8238 }
8239
8240 #ifdef OBJ_SOM
8241 pa_spaces_begin ();
8242 #endif
8243
8244 op_hash = hash_new ();
8245
8246 while (i < NUMOPCODES)
8247 {
8248 const char *name = pa_opcodes[i].name;
8249
8250 retval = hash_insert (op_hash, name, (struct pa_opcode *) &pa_opcodes[i]);
8251 if (retval != NULL && *retval != '\0')
8252 {
8253 as_fatal (_("Internal error: can't hash `%s': %s\n"), name, retval);
8254 lose = 1;
8255 }
8256
8257 do
8258 {
8259 if ((pa_opcodes[i].match & pa_opcodes[i].mask)
8260 != pa_opcodes[i].match)
8261 {
8262 fprintf (stderr, _("internal error: losing opcode: `%s' \"%s\"\n"),
8263 pa_opcodes[i].name, pa_opcodes[i].args);
8264 lose = 1;
8265 }
8266 ++i;
8267 }
8268 while (i < NUMOPCODES && !strcmp (pa_opcodes[i].name, name));
8269 }
8270
8271 if (lose)
8272 as_fatal (_("Broken assembler. No assembly attempted."));
8273
8274 #ifdef OBJ_SOM
8275 /* SOM will change text_section. To make sure we never put
8276 anything into the old one switch to the new one now. */
8277 subseg_set (text_section, 0);
8278 #endif
8279
8280 #ifdef OBJ_SOM
8281 dummy_symbol = symbol_find_or_make ("L$dummy");
8282 S_SET_SEGMENT (dummy_symbol, text_section);
8283 /* Force the symbol to be converted to a real symbol. */
8284 symbol_get_bfdsym (dummy_symbol)->flags |= BSF_KEEP;
8285 #endif
8286 }
8287
8288 /* On the PA relocations which involve function symbols must not be
8289 adjusted. This so that the linker can know when/how to create argument
8290 relocation stubs for indirect calls and calls to static functions.
8291
8292 "T" field selectors create DLT relative fixups for accessing
8293 globals and statics in PIC code; each DLT relative fixup creates
8294 an entry in the DLT table. The entries contain the address of
8295 the final target (eg accessing "foo" would create a DLT entry
8296 with the address of "foo").
8297
8298 Unfortunately, the HP linker doesn't take into account any addend
8299 when generating the DLT; so accessing $LIT$+8 puts the address of
8300 $LIT$ into the DLT rather than the address of $LIT$+8.
8301
8302 The end result is we can't perform relocation symbol reductions for
8303 any fixup which creates entries in the DLT (eg they use "T" field
8304 selectors).
8305
8306 ??? Reject reductions involving symbols with external scope; such
8307 reductions make life a living hell for object file editors. */
8308
8309 int
8310 hppa_fix_adjustable (fixS *fixp)
8311 {
8312 #ifdef OBJ_ELF
8313 reloc_type code;
8314 #endif
8315 struct hppa_fix_struct *hppa_fix;
8316
8317 hppa_fix = (struct hppa_fix_struct *) fixp->tc_fix_data;
8318
8319 #ifdef OBJ_ELF
8320 /* LR/RR selectors are implicitly used for a number of different relocation
8321 types. We must ensure that none of these types are adjusted (see below)
8322 even if they occur with a different selector. */
8323 code = elf_hppa_reloc_final_type (stdoutput, fixp->fx_r_type,
8324 hppa_fix->fx_r_format,
8325 hppa_fix->fx_r_field);
8326
8327 switch (code)
8328 {
8329 /* Relocation types which use e_lrsel. */
8330 case R_PARISC_DIR21L:
8331 case R_PARISC_DLTREL21L:
8332 case R_PARISC_DPREL21L:
8333 case R_PARISC_PLTOFF21L:
8334
8335 /* Relocation types which use e_rrsel. */
8336 case R_PARISC_DIR14R:
8337 case R_PARISC_DIR14DR:
8338 case R_PARISC_DIR14WR:
8339 case R_PARISC_DIR17R:
8340 case R_PARISC_DLTREL14R:
8341 case R_PARISC_DLTREL14DR:
8342 case R_PARISC_DLTREL14WR:
8343 case R_PARISC_DPREL14R:
8344 case R_PARISC_DPREL14DR:
8345 case R_PARISC_DPREL14WR:
8346 case R_PARISC_PLTOFF14R:
8347 case R_PARISC_PLTOFF14DR:
8348 case R_PARISC_PLTOFF14WR:
8349
8350 /* Other types that we reject for reduction. */
8351 case R_PARISC_GNU_VTENTRY:
8352 case R_PARISC_GNU_VTINHERIT:
8353 return 0;
8354 default:
8355 break;
8356 }
8357 #endif
8358
8359 /* Reject reductions of symbols in sym1-sym2 expressions when
8360 the fixup will occur in a CODE subspace.
8361
8362 XXX FIXME: Long term we probably want to reject all of these;
8363 for example reducing in the debug section would lose if we ever
8364 supported using the optimizing hp linker. */
8365 if (fixp->fx_addsy
8366 && fixp->fx_subsy
8367 && (hppa_fix->segment->flags & SEC_CODE))
8368 return 0;
8369
8370 /* We can't adjust any relocs that use LR% and RR% field selectors.
8371
8372 If a symbol is reduced to a section symbol, the assembler will
8373 adjust the addend unless the symbol happens to reside right at
8374 the start of the section. Additionally, the linker has no choice
8375 but to manipulate the addends when coalescing input sections for
8376 "ld -r". Since an LR% field selector is defined to round the
8377 addend, we can't change the addend without risking that a LR% and
8378 it's corresponding (possible multiple) RR% field will no longer
8379 sum to the right value.
8380
8381 eg. Suppose we have
8382 . ldil LR%foo+0,%r21
8383 . ldw RR%foo+0(%r21),%r26
8384 . ldw RR%foo+4(%r21),%r25
8385
8386 If foo is at address 4092 (decimal) in section `sect', then after
8387 reducing to the section symbol we get
8388 . LR%sect+4092 == (L%sect)+0
8389 . RR%sect+4092 == (R%sect)+4092
8390 . RR%sect+4096 == (R%sect)-4096
8391 and the last address loses because rounding the addend to 8k
8392 multiples takes us up to 8192 with an offset of -4096.
8393
8394 In cases where the LR% expression is identical to the RR% one we
8395 will never have a problem, but is so happens that gcc rounds
8396 addends involved in LR% field selectors to work around a HP
8397 linker bug. ie. We often have addresses like the last case
8398 above where the LR% expression is offset from the RR% one. */
8399
8400 if (hppa_fix->fx_r_field == e_lrsel
8401 || hppa_fix->fx_r_field == e_rrsel
8402 || hppa_fix->fx_r_field == e_nlrsel)
8403 return 0;
8404
8405 /* Reject reductions of symbols in DLT relative relocs,
8406 relocations with plabels. */
8407 if (hppa_fix->fx_r_field == e_tsel
8408 || hppa_fix->fx_r_field == e_ltsel
8409 || hppa_fix->fx_r_field == e_rtsel
8410 || hppa_fix->fx_r_field == e_psel
8411 || hppa_fix->fx_r_field == e_rpsel
8412 || hppa_fix->fx_r_field == e_lpsel)
8413 return 0;
8414
8415 /* Reject absolute calls (jumps). */
8416 if (hppa_fix->fx_r_type == R_HPPA_ABS_CALL)
8417 return 0;
8418
8419 /* Reject reductions of function symbols. */
8420 if (fixp->fx_addsy != 0 && S_IS_FUNCTION (fixp->fx_addsy))
8421 return 0;
8422
8423 return 1;
8424 }
8425
8426 /* Return nonzero if the fixup in FIXP will require a relocation,
8427 even it if appears that the fixup could be completely handled
8428 within GAS. */
8429
8430 int
8431 hppa_force_relocation (struct fix *fixp)
8432 {
8433 struct hppa_fix_struct *hppa_fixp;
8434
8435 hppa_fixp = (struct hppa_fix_struct *) fixp->tc_fix_data;
8436 #ifdef OBJ_SOM
8437 if (fixp->fx_r_type == (int) R_HPPA_ENTRY
8438 || fixp->fx_r_type == (int) R_HPPA_EXIT
8439 || fixp->fx_r_type == (int) R_HPPA_BEGIN_BRTAB
8440 || fixp->fx_r_type == (int) R_HPPA_END_BRTAB
8441 || fixp->fx_r_type == (int) R_HPPA_BEGIN_TRY
8442 || fixp->fx_r_type == (int) R_HPPA_END_TRY
8443 || (fixp->fx_addsy != NULL && fixp->fx_subsy != NULL
8444 && (hppa_fixp->segment->flags & SEC_CODE) != 0))
8445 return 1;
8446 #endif
8447 #ifdef OBJ_ELF
8448 if (fixp->fx_r_type == (int) R_PARISC_GNU_VTINHERIT
8449 || fixp->fx_r_type == (int) R_PARISC_GNU_VTENTRY)
8450 return 1;
8451 #endif
8452
8453 gas_assert (fixp->fx_addsy != NULL);
8454
8455 /* Ensure we emit a relocation for global symbols so that dynamic
8456 linking works. */
8457 if (S_FORCE_RELOC (fixp->fx_addsy, 1))
8458 return 1;
8459
8460 /* It is necessary to force PC-relative calls/jumps to have a relocation
8461 entry if they're going to need either an argument relocation or long
8462 call stub. */
8463 if (fixp->fx_pcrel
8464 && arg_reloc_stub_needed (symbol_arg_reloc_info (fixp->fx_addsy),
8465 hppa_fixp->fx_arg_reloc))
8466 return 1;
8467
8468 /* Now check to see if we're going to need a long-branch stub. */
8469 if (fixp->fx_r_type == (int) R_HPPA_PCREL_CALL)
8470 {
8471 long pc = md_pcrel_from (fixp);
8472 valueT distance, min_stub_distance;
8473
8474 distance = fixp->fx_offset + S_GET_VALUE (fixp->fx_addsy) - pc - 8;
8475
8476 /* Distance to the closest possible stub. This will detect most
8477 but not all circumstances where a stub will not work. */
8478 min_stub_distance = pc + 16;
8479 #ifdef OBJ_SOM
8480 if (last_call_info != NULL)
8481 min_stub_distance -= S_GET_VALUE (last_call_info->start_symbol);
8482 #endif
8483
8484 if ((distance + 8388608 >= 16777216
8485 && min_stub_distance <= 8388608)
8486 || (hppa_fixp->fx_r_format == 17
8487 && distance + 262144 >= 524288
8488 && min_stub_distance <= 262144)
8489 || (hppa_fixp->fx_r_format == 12
8490 && distance + 8192 >= 16384
8491 && min_stub_distance <= 8192)
8492 )
8493 return 1;
8494 }
8495
8496 if (fixp->fx_r_type == (int) R_HPPA_ABS_CALL)
8497 return 1;
8498
8499 /* No need (yet) to force another relocations to be emitted. */
8500 return 0;
8501 }
8502
8503 /* Now for some ELF specific code. FIXME. */
8504 #ifdef OBJ_ELF
8505 /* For ELF, this function serves one purpose: to setup the st_size
8506 field of STT_FUNC symbols. To do this, we need to scan the
8507 call_info structure list, determining st_size in by taking the
8508 difference in the address of the beginning/end marker symbols. */
8509
8510 void
8511 elf_hppa_final_processing (void)
8512 {
8513 struct call_info *call_info_pointer;
8514
8515 for (call_info_pointer = call_info_root;
8516 call_info_pointer;
8517 call_info_pointer = call_info_pointer->ci_next)
8518 {
8519 elf_symbol_type *esym
8520 = ((elf_symbol_type *)
8521 symbol_get_bfdsym (call_info_pointer->start_symbol));
8522 esym->internal_elf_sym.st_size =
8523 S_GET_VALUE (call_info_pointer->end_symbol)
8524 - S_GET_VALUE (call_info_pointer->start_symbol) + 4;
8525 }
8526 }
8527
8528 static void
8529 pa_vtable_entry (int ignore ATTRIBUTE_UNUSED)
8530 {
8531 struct fix *new_fix;
8532
8533 new_fix = obj_elf_get_vtable_entry ();
8534
8535 if (new_fix)
8536 {
8537 struct hppa_fix_struct * hppa_fix = XOBNEW (&notes, struct hppa_fix_struct);
8538
8539 hppa_fix->fx_r_type = R_HPPA;
8540 hppa_fix->fx_r_field = e_fsel;
8541 hppa_fix->fx_r_format = 32;
8542 hppa_fix->fx_arg_reloc = 0;
8543 hppa_fix->segment = now_seg;
8544 new_fix->tc_fix_data = (void *) hppa_fix;
8545 new_fix->fx_r_type = (int) R_PARISC_GNU_VTENTRY;
8546 }
8547 }
8548
8549 static void
8550 pa_vtable_inherit (int ignore ATTRIBUTE_UNUSED)
8551 {
8552 struct fix *new_fix;
8553
8554 new_fix = obj_elf_get_vtable_inherit ();
8555
8556 if (new_fix)
8557 {
8558 struct hppa_fix_struct * hppa_fix = XOBNEW (&notes, struct hppa_fix_struct);
8559
8560 hppa_fix->fx_r_type = R_HPPA;
8561 hppa_fix->fx_r_field = e_fsel;
8562 hppa_fix->fx_r_format = 32;
8563 hppa_fix->fx_arg_reloc = 0;
8564 hppa_fix->segment = now_seg;
8565 new_fix->tc_fix_data = (void *) hppa_fix;
8566 new_fix->fx_r_type = (int) R_PARISC_GNU_VTINHERIT;
8567 }
8568 }
8569 #endif
8570
8571 /* Table of pseudo ops for the PA. FIXME -- how many of these
8572 are now redundant with the overall GAS and the object file
8573 dependent tables? */
8574 const pseudo_typeS md_pseudo_table[] =
8575 {
8576 /* align pseudo-ops on the PA specify the actual alignment requested,
8577 not the log2 of the requested alignment. */
8578 #ifdef OBJ_SOM
8579 {"align", pa_align, 8},
8580 #endif
8581 #ifdef OBJ_ELF
8582 {"align", s_align_bytes, 8},
8583 #endif
8584 {"begin_brtab", pa_brtab, 1},
8585 {"begin_try", pa_try, 1},
8586 {"block", pa_block, 1},
8587 {"blockz", pa_block, 0},
8588 {"byte", pa_cons, 1},
8589 {"call", pa_call, 0},
8590 {"callinfo", pa_callinfo, 0},
8591 #if defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))
8592 {"code", obj_elf_text, 0},
8593 #else
8594 {"code", pa_text, 0},
8595 {"comm", pa_comm, 0},
8596 #endif
8597 #ifdef OBJ_SOM
8598 {"compiler", pa_compiler, 0},
8599 #endif
8600 {"copyright", pa_copyright, 0},
8601 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
8602 {"data", pa_data, 0},
8603 #endif
8604 {"double", pa_float_cons, 'd'},
8605 {"dword", pa_cons, 8},
8606 {"end", pa_end, 0},
8607 {"end_brtab", pa_brtab, 0},
8608 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
8609 {"end_try", pa_try, 0},
8610 #endif
8611 {"enter", pa_enter, 0},
8612 {"entry", pa_entry, 0},
8613 {"equ", pa_equ, 0},
8614 {"exit", pa_exit, 0},
8615 {"export", pa_export, 0},
8616 {"fill", pa_fill, 0},
8617 {"float", pa_float_cons, 'f'},
8618 {"half", pa_cons, 2},
8619 {"import", pa_import, 0},
8620 {"int", pa_cons, 4},
8621 {"label", pa_label, 0},
8622 {"lcomm", pa_lcomm, 0},
8623 {"leave", pa_leave, 0},
8624 {"level", pa_level, 0},
8625 {"long", pa_cons, 4},
8626 {"lsym", pa_lsym, 0},
8627 #ifdef OBJ_SOM
8628 {"nsubspa", pa_subspace, 1},
8629 #endif
8630 {"octa", pa_cons, 16},
8631 {"org", pa_origin, 0},
8632 {"origin", pa_origin, 0},
8633 {"param", pa_param, 0},
8634 {"proc", pa_proc, 0},
8635 {"procend", pa_procend, 0},
8636 {"quad", pa_cons, 8},
8637 {"reg", pa_equ, 1},
8638 {"short", pa_cons, 2},
8639 {"single", pa_float_cons, 'f'},
8640 #ifdef OBJ_SOM
8641 {"space", pa_space, 0},
8642 {"spnum", pa_spnum, 0},
8643 #endif
8644 {"string", pa_stringer, 0},
8645 {"stringz", pa_stringer, 1},
8646 #ifdef OBJ_SOM
8647 {"subspa", pa_subspace, 0},
8648 #endif
8649 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
8650 {"text", pa_text, 0},
8651 #endif
8652 {"version", pa_version, 0},
8653 #ifdef OBJ_ELF
8654 {"vtable_entry", pa_vtable_entry, 0},
8655 {"vtable_inherit", pa_vtable_inherit, 0},
8656 #endif
8657 {"word", pa_cons, 4},
8658 {NULL, 0, 0}
8659 };
8660
8661 #ifdef OBJ_ELF
8662 void
8663 hppa_cfi_frame_initial_instructions (void)
8664 {
8665 cfi_add_CFA_def_cfa (30, 0);
8666 }
8667
8668 int
8669 hppa_regname_to_dw2regnum (char *regname)
8670 {
8671 unsigned int regnum = -1;
8672 unsigned int i;
8673 const char *p;
8674 char *q;
8675 static struct { const char *name; int dw2regnum; } regnames[] =
8676 {
8677 { "sp", 30 }, { "rp", 2 },
8678 };
8679
8680 for (i = 0; i < ARRAY_SIZE (regnames); ++i)
8681 if (strcmp (regnames[i].name, regname) == 0)
8682 return regnames[i].dw2regnum;
8683
8684 if (regname[0] == 'r')
8685 {
8686 p = regname + 1;
8687 regnum = strtoul (p, &q, 10);
8688 if (p == q || *q || regnum >= 32)
8689 return -1;
8690 }
8691 else if (regname[0] == 'f' && regname[1] == 'r')
8692 {
8693 p = regname + 2;
8694 regnum = strtoul (p, &q, 10);
8695 #if TARGET_ARCH_SIZE == 64
8696 if (p == q || *q || regnum <= 4 || regnum >= 32)
8697 return -1;
8698 regnum += 32 - 4;
8699 #else
8700 if (p == q
8701 || (*q && ((*q != 'L' && *q != 'R') || *(q + 1)))
8702 || regnum <= 4 || regnum >= 32)
8703 return -1;
8704 regnum = (regnum - 4) * 2 + 32;
8705 if (*q == 'R')
8706 regnum++;
8707 #endif
8708 }
8709 return regnum;
8710 }
8711 #endif
This page took 0.306075 seconds and 5 git commands to generate.