1 /* tc-hppa.c -- Assemble for the PA
2 Copyright 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
3 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
22 /* HP PA-RISC support was contributed by the Center for Software Science
23 at the University of Utah. */
26 #include "safe-ctype.h"
28 #include "dw2gencfi.h"
30 #include "bfd/libhppa.h"
32 /* Be careful, this file includes data *declarations*. */
33 #include "opcode/hppa.h"
35 #if defined (OBJ_ELF) && defined (OBJ_SOM)
36 error only one of OBJ_ELF
and OBJ_SOM can be defined
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. */
43 #include "dwarf2dbg.h"
45 /* A "convenient" place to put object file dependencies which do
46 not need to be seen outside of tc-hppa.c. */
48 /* Object file formats specify relocation types. */
49 typedef enum elf_hppa_reloc_type reloc_type
;
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)
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
61 #define hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
62 #define elf_hppa_reloc_final_type elf32_hppa_reloc_final_type
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
70 #define UNWIND_SECTION_NAME ".PARISC.unwind"
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$"
80 /* Object file formats specify relocation types. */
81 typedef int reloc_type
;
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
87 /* How to generate a relocation. */
88 #define hppa_gen_reloc_type hppa_som_gen_reloc_type
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)
95 /* This apparently isn't in older versions of hpux reloc.h. */
97 #define R_DLT_REL 0x78
109 #if TARGET_ARCH_SIZE == 64
110 #define DEFAULT_LEVEL 25
112 #define DEFAULT_LEVEL 10
115 /* Various structures and types used internally in tc-hppa.c. */
117 /* Unwind table and descriptor. FIXME: Sync this with GDB version. */
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;
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;
143 /* We can't rely on compilers placing bitfields in any particular
144 place, so use these macros when dumping unwind descriptors to
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))
163 #define UNWIND_HIGH32(U) \
164 (((U)->hpe_interrupt_marker << 31) \
165 | ((U)->hpux_interrupt_marker << 30) \
166 | ((U)->frame_size << 0))
170 /* Starting and ending offsets of the region described by
172 unsigned int start_offset
;
173 unsigned int end_offset
;
174 struct unwind_desc descriptor
;
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.
181 NOTE: GAS does not support .enter and .leave for the generation of
182 prologues and epilogues. FIXME.
184 The fields in structure roughly correspond to the arguments available on the
185 .callinfo pseudo-op. */
189 /* The unwind descriptor being built. */
190 struct unwind_table ci_unwind
;
192 /* Name of this function. */
193 symbolS
*start_symbol
;
195 /* (temporary) symbol used to mark the end of this function. */
198 /* Next entry in the chain. */
199 struct call_info
*ci_next
;
202 /* Operand formats for FP instructions. Note not all FP instructions
203 allow all four formats to be used (for example fmpysub only allows
207 SGL
, DBL
, ILLEGAL_FMT
, QUAD
, W
, UW
, DW
, UDW
, QW
, UQW
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). */
217 SYMBOL_TYPE_ABSOLUTE
,
221 SYMBOL_TYPE_MILLICODE
,
223 SYMBOL_TYPE_PRI_PROG
,
224 SYMBOL_TYPE_SEC_PROG
,
228 /* This structure contains information needed to assemble
229 individual instructions. */
232 /* Holds the opcode after parsing by pa_ip. */
233 unsigned long opcode
;
235 /* Holds an expression associated with the current instruction. */
238 /* Does this instruction use PC-relative addressing. */
241 /* Floating point formats for operand1 and operand2. */
242 fp_operand_format fpof1
;
243 fp_operand_format fpof2
;
245 /* Whether or not we saw a truncation request on an fcnv insn. */
248 /* Holds the field selector for this instruction
249 (for example L%, LR%, etc). */
252 /* Holds any argument relocation bits associated with this
253 instruction. (instruction should be some sort of call). */
254 unsigned int arg_reloc
;
256 /* The format specification for this instruction. */
259 /* The relocation (if any) associated with this instruction. */
263 /* PA-89 floating point registers are arranged like this:
265 +--------------+--------------+
266 | 0 or 16L | 16 or 16R |
267 +--------------+--------------+
268 | 1 or 17L | 17 or 17R |
269 +--------------+--------------+
277 +--------------+--------------+
278 | 14 or 30L | 30 or 30R |
279 +--------------+--------------+
280 | 15 or 31L | 31 or 31R |
281 +--------------+--------------+ */
283 /* Additional information needed to build argument relocation stubs. */
286 /* The argument relocation specification. */
287 unsigned int arg_reloc
;
289 /* Number of arguments. */
290 unsigned int arg_count
;
294 /* This structure defines an entry in the subspace dictionary
297 struct subspace_dictionary_chain
299 /* Nonzero if this space has been defined by the user code. */
300 unsigned int ssd_defined
;
302 /* Name of this subspace. */
305 /* GAS segment and subsegment associated with this subspace. */
309 /* Next space in the subspace dictionary chain. */
310 struct subspace_dictionary_chain
*ssd_next
;
313 typedef struct subspace_dictionary_chain ssd_chain_struct
;
315 /* This structure defines an entry in the subspace dictionary
318 struct space_dictionary_chain
320 /* Nonzero if this space has been defined by the user code or
321 as a default space. */
322 unsigned int sd_defined
;
324 /* Nonzero if this spaces has been defined by the user code. */
325 unsigned int sd_user_defined
;
327 /* The space number (or index). */
328 unsigned int sd_spnum
;
330 /* The name of this subspace. */
333 /* GAS segment to which this subspace corresponds. */
336 /* Current subsegment number being used. */
339 /* The chain of subspaces contained within this space. */
340 ssd_chain_struct
*sd_subspaces
;
342 /* The next entry in the space dictionary chain. */
343 struct space_dictionary_chain
*sd_next
;
346 typedef struct space_dictionary_chain sd_chain_struct
;
348 /* This structure defines attributes of the default subspace
349 dictionary entries. */
351 struct default_subspace_dict
353 /* Name of the subspace. */
356 /* FIXME. Is this still needed? */
359 /* Nonzero if this subspace is loadable. */
362 /* Nonzero if this subspace contains only code. */
365 /* Nonzero if this is a comdat subspace. */
368 /* Nonzero if this is a common subspace. */
371 /* Nonzero if this is a common subspace which allows symbols
372 to be multiply defined. */
375 /* Nonzero if this subspace should be zero filled. */
378 /* Sort key for this subspace. */
381 /* Access control bits for this subspace. Can represent RWX access
382 as well as privilege level changes for gateways. */
385 /* Index of containing space. */
388 /* Alignment (in bytes) of this subspace. */
391 /* Quadrant within space where this subspace should be loaded. */
394 /* An index into the default spaces array. */
397 /* Subsegment associated with this subspace. */
401 /* This structure defines attributes of the default space
402 dictionary entries. */
404 struct default_space_dict
406 /* Name of the space. */
409 /* Space number. It is possible to identify spaces within
410 assembly code numerically! */
413 /* Nonzero if this space is loadable. */
416 /* Nonzero if this space is "defined". FIXME is still needed */
419 /* Nonzero if this space can not be shared. */
422 /* Sort key for this space. */
425 /* Segment associated with this space. */
430 /* Structure for previous label tracking. Needed so that alignments,
431 callinfo declarations, etc can be easily attached to a particular
433 typedef struct label_symbol_struct
435 struct symbol
*lss_label
;
437 sd_chain_struct
*lss_space
;
442 struct label_symbol_struct
*lss_next
;
446 /* Extra information needed to perform fixups (relocations) on the PA. */
447 struct hppa_fix_struct
449 /* The field selector. */
450 enum hppa_reloc_field_selector_type_alt fx_r_field
;
455 /* Format of fixup. */
458 /* Argument relocation bits. */
459 unsigned int fx_arg_reloc
;
461 /* The segment this fixup appears in. */
465 /* Structure to hold information about predefined registers. */
473 /* This structure defines the mapping from a FP condition string
474 to a condition number which can be recorded in an instruction. */
481 /* This structure defines a mapping from a field selector
482 string to a field selector type. */
483 struct selector_entry
489 /* Prototypes for functions local to tc-hppa.c. */
492 static void pa_check_current_space_and_subspace (void);
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);
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 (char *, int, int,
510 static ssd_chain_struct
*create_new_subspace (sd_chain_struct
*,
515 static ssd_chain_struct
*update_subspace (sd_chain_struct
*,
516 char *, int, int, int,
520 static sd_chain_struct
*is_defined_space (char *);
521 static ssd_chain_struct
*is_defined_subspace (char *);
522 static sd_chain_struct
*pa_segment_to_space (asection
*);
523 static ssd_chain_struct
*pa_subsegment_to_subspace (asection
*,
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 (char *, int);
530 /* File and globally scoped variable declarations. */
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
;
537 /* The current space and subspace. */
538 static sd_chain_struct
*current_space
;
539 static ssd_chain_struct
*current_subspace
;
542 /* Root of the call_info chain. */
543 static struct call_info
*call_info_root
;
545 /* The last call_info (for functions) structure
546 seen so it can be associated with fixups and
548 static struct call_info
*last_call_info
;
550 /* The last call description (for actual calls). */
551 static struct call_desc last_call_desc
;
553 /* handle of the OPCODE hash table */
554 static struct hash_control
*op_hash
= NULL
;
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
[] = "*?=<>";
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.
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.
569 Also note that C style comments will always work. */
570 const char line_comment_chars
[] = "#";
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
[] = ";";
576 /* This array holds the characters which act as line separators. */
577 const char line_separator_chars
[] = "!";
579 /* Chars that can be used to separate mant from exp in floating point nums. */
580 const char EXP_CHARS
[] = "eE";
582 /* Chars that mean this number is a floating point constant.
583 As in 0f12.456 or 0d1.2345e12.
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";
590 static struct pa_it the_insn
;
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
595 static char *expr_end
;
597 /* Nonzero if a .callinfo appeared within the current procedure. */
598 static int callinfo_found
;
600 /* Nonzero if the assembler is currently within a .entry/.exit pair. */
601 static int within_entry_exit
;
603 /* Nonzero if the assembler is currently within a procedure definition. */
604 static int within_procedure
;
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
;
610 /* Holds the last field selector. */
611 static int hppa_field_selector
;
613 /* Nonzero when strict matching is enabled. Zero otherwise.
615 Each opcode in the table has a flag which indicates whether or
616 not strict matching should be enabled for that instruction.
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. */
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
;
633 /* A dummy bfd symbol so that all relocations have symbols of some kind. */
634 static symbolS
*dummy_symbol
;
637 /* Nonzero if errors are to be printed. */
638 static int print_errors
= 1;
640 /* List of registers that are pre-defined:
642 Each general register has one predefined name of the form
643 %r<REGNUM> which has the value <REGNUM>.
645 Space and control registers are handled in a similar manner,
646 but use %sr<REGNUM> and %cr<REGNUM> as their predefined names.
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>.
653 Many registers also have synonyms:
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
662 Almost every control register has a synonym; they are not listed
665 The table is sorted. Suitable for searching by a binary search. */
667 static const struct pd_reg pre_defined_registers
[] =
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
},
809 #if TARGET_ARCH_SIZE == 64
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
[] =
924 static const struct selector_entry selector_table
[] =
949 /* default space and subspace dictionaries */
951 #define GDB_SYMBOLS GDB_SYMBOLS_SUBSPACE_NAME
952 #define GDB_STRINGS GDB_STRINGS_SUBSPACE_NAME
954 /* pre-defined subsegments (subspaces) for the HPPA. */
955 #define SUBSEG_CODE 0
957 #define SUBSEG_MILLI 2
958 #define SUBSEG_DATA 0
960 #define SUBSEG_UNWIND 3
961 #define SUBSEG_GDB_STRINGS 0
962 #define SUBSEG_GDB_SYMBOLS 1
964 static struct default_subspace_dict pa_def_subspaces
[] =
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}
974 static struct default_space_dict pa_def_spaces
[] =
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
}
981 /* Misc local definitions used by the assembler. */
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
989 #define SUBSPACE_DEFINED(ss_chain) (ss_chain)->ssd_defined
990 #define SUBSPACE_NAME(ss_chain) (ss_chain)->ssd_name
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')
998 /* Insert FIELD into OPCODE starting at bit START. Continue pa_ip
999 main loop after insertion. */
1001 #define INSERT_FIELD_AND_CONTINUE(OPCODE, FIELD, START) \
1003 ((OPCODE) |= (FIELD) << (START)); \
1007 /* Simple range checking for FIELD against HIGH and LOW bounds.
1008 IGNORE is used to suppress the error message. */
1010 #define CHECK_FIELD(FIELD, HIGH, LOW, IGNORE) \
1012 if ((FIELD) > (HIGH) || (FIELD) < (LOW)) \
1015 as_bad (_("Field out of range [%d..%d] (%d)."), (LOW), (HIGH), \
1021 /* Variant of CHECK_FIELD for use in md_apply_fix and other places where
1022 the current file and line number are not valid. */
1024 #define CHECK_FIELD_WHERE(FIELD, HIGH, LOW, FILENAME, LINE) \
1026 if ((FIELD) > (HIGH) || (FIELD) < (LOW)) \
1028 as_bad_where ((FILENAME), (LINE), \
1029 _("Field out of range [%d..%d] (%d)."), (LOW), (HIGH), \
1035 /* Simple alignment checking for FIELD against ALIGN (a power of two).
1036 IGNORE is used to suppress the error message. */
1038 #define CHECK_ALIGN(FIELD, ALIGN, IGNORE) \
1040 if ((FIELD) & ((ALIGN) - 1)) \
1043 as_bad (_("Field not properly aligned [%d] (%d)."), (ALIGN), \
1049 #define is_DP_relative(exp) \
1050 ((exp).X_op == O_subtract \
1051 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$global$") == 0)
1053 #define is_SB_relative(exp) \
1054 ((exp).X_op == O_subtract \
1055 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$segrel$") == 0)
1057 #define is_PC_relative(exp) \
1058 ((exp).X_op == O_subtract \
1059 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$PIC_pcrel$0") == 0)
1061 #define is_tls_gdidx(exp) \
1062 ((exp).X_op == O_subtract \
1063 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_gdidx$") == 0)
1065 #define is_tls_ldidx(exp) \
1066 ((exp).X_op == O_subtract \
1067 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_ldidx$") == 0)
1069 #define is_tls_dtpoff(exp) \
1070 ((exp).X_op == O_subtract \
1071 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_dtpoff$") == 0)
1073 #define is_tls_ieoff(exp) \
1074 ((exp).X_op == O_subtract \
1075 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_ieoff$") == 0)
1077 #define is_tls_leoff(exp) \
1078 ((exp).X_op == O_subtract \
1079 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_leoff$") == 0)
1081 /* We need some complex handling for stabs (sym1 - sym2). Luckily, we'll
1082 always be able to reduce the expression to a constant, so we don't
1083 need real complex handling yet. */
1084 #define is_complex(exp) \
1085 ((exp).X_op != O_constant && (exp).X_op != O_symbol)
1087 /* Actual functions to implement the PA specific code for the assembler. */
1089 /* Called before writing the object file. Make sure entry/exit and
1090 proc/procend pairs match. */
1095 if (within_entry_exit
)
1096 as_fatal (_("Missing .exit\n"));
1098 if (within_procedure
)
1099 as_fatal (_("Missing .procend\n"));
1102 /* Returns a pointer to the label_symbol_struct for the current space.
1103 or NULL if no label_symbol_struct exists for the current space. */
1105 static label_symbol_struct
*
1108 label_symbol_struct
*label_chain
;
1110 for (label_chain
= label_symbols_rootp
;
1112 label_chain
= label_chain
->lss_next
)
1115 if (current_space
== label_chain
->lss_space
&& label_chain
->lss_label
)
1119 if (now_seg
== label_chain
->lss_segment
&& label_chain
->lss_label
)
1127 /* Defines a label for the current space. If one is already defined,
1128 this function will replace it with the new label. */
1131 pa_define_label (symbolS
*symbol
)
1133 label_symbol_struct
*label_chain
= pa_get_label ();
1136 label_chain
->lss_label
= symbol
;
1139 /* Create a new label entry and add it to the head of the chain. */
1140 label_chain
= xmalloc (sizeof (label_symbol_struct
));
1141 label_chain
->lss_label
= symbol
;
1143 label_chain
->lss_space
= current_space
;
1146 label_chain
->lss_segment
= now_seg
;
1148 label_chain
->lss_next
= NULL
;
1150 if (label_symbols_rootp
)
1151 label_chain
->lss_next
= label_symbols_rootp
;
1153 label_symbols_rootp
= label_chain
;
1157 dwarf2_emit_label (symbol
);
1161 /* Removes a label definition for the current space.
1162 If there is no label_symbol_struct entry, then no action is taken. */
1165 pa_undefine_label (void)
1167 label_symbol_struct
*label_chain
;
1168 label_symbol_struct
*prev_label_chain
= NULL
;
1170 for (label_chain
= label_symbols_rootp
;
1172 label_chain
= label_chain
->lss_next
)
1176 && current_space
== label_chain
->lss_space
&& label_chain
->lss_label
1179 && now_seg
== label_chain
->lss_segment
&& label_chain
->lss_label
1183 /* Remove the label from the chain and free its memory. */
1184 if (prev_label_chain
)
1185 prev_label_chain
->lss_next
= label_chain
->lss_next
;
1187 label_symbols_rootp
= label_chain
->lss_next
;
1192 prev_label_chain
= label_chain
;
1196 /* An HPPA-specific version of fix_new. This is required because the HPPA
1197 code needs to keep track of some extra stuff. Each call to fix_new_hppa
1198 results in the creation of an instance of an hppa_fix_struct. An
1199 hppa_fix_struct stores the extra information along with a pointer to the
1200 original fixS. This is attached to the original fixup via the
1201 tc_fix_data field. */
1204 fix_new_hppa (fragS
*frag
,
1207 symbolS
*add_symbol
,
1211 bfd_reloc_code_real_type r_type
,
1212 enum hppa_reloc_field_selector_type_alt r_field
,
1214 unsigned int arg_reloc
,
1215 int unwind_bits ATTRIBUTE_UNUSED
)
1218 struct hppa_fix_struct
*hppa_fix
= obstack_alloc (¬es
, sizeof (struct hppa_fix_struct
));
1221 new_fix
= fix_new_exp (frag
, where
, size
, exp
, pcrel
, r_type
);
1223 new_fix
= fix_new (frag
, where
, size
, add_symbol
, offset
, pcrel
, r_type
);
1224 new_fix
->tc_fix_data
= (void *) hppa_fix
;
1225 hppa_fix
->fx_r_type
= r_type
;
1226 hppa_fix
->fx_r_field
= r_field
;
1227 hppa_fix
->fx_r_format
= r_format
;
1228 hppa_fix
->fx_arg_reloc
= arg_reloc
;
1229 hppa_fix
->segment
= now_seg
;
1231 if (r_type
== R_ENTRY
|| r_type
== R_EXIT
)
1232 new_fix
->fx_offset
= unwind_bits
;
1235 /* foo-$global$ is used to access non-automatic storage. $global$
1236 is really just a marker and has served its purpose, so eliminate
1237 it now so as not to confuse write.c. Ditto for $PIC_pcrel$0. */
1238 if (new_fix
->fx_subsy
1239 && (strcmp (S_GET_NAME (new_fix
->fx_subsy
), "$global$") == 0
1240 || strcmp (S_GET_NAME (new_fix
->fx_subsy
), "$segrel$") == 0
1241 || strcmp (S_GET_NAME (new_fix
->fx_subsy
), "$PIC_pcrel$0") == 0
1242 || strcmp (S_GET_NAME (new_fix
->fx_subsy
), "$tls_gdidx$") == 0
1243 || strcmp (S_GET_NAME (new_fix
->fx_subsy
), "$tls_ldidx$") == 0
1244 || strcmp (S_GET_NAME (new_fix
->fx_subsy
), "$tls_dtpoff$") == 0
1245 || strcmp (S_GET_NAME (new_fix
->fx_subsy
), "$tls_ieoff$") == 0
1246 || strcmp (S_GET_NAME (new_fix
->fx_subsy
), "$tls_leoff$") == 0))
1247 new_fix
->fx_subsy
= NULL
;
1250 /* This fix_new is called by cons via TC_CONS_FIX_NEW.
1251 hppa_field_selector is set by the parse_cons_expression_hppa. */
1254 cons_fix_new_hppa (fragS
*frag
, int where
, int size
, expressionS
*exp
)
1256 unsigned int rel_type
;
1258 /* Get a base relocation type. */
1259 if (is_DP_relative (*exp
))
1260 rel_type
= R_HPPA_GOTOFF
;
1261 else if (is_PC_relative (*exp
))
1262 rel_type
= R_HPPA_PCREL_CALL
;
1264 else if (is_SB_relative (*exp
))
1265 rel_type
= R_PARISC_SEGREL32
;
1266 else if (is_tls_gdidx (*exp
))
1267 rel_type
= R_PARISC_TLS_GD21L
;
1268 else if (is_tls_ldidx (*exp
))
1269 rel_type
= R_PARISC_TLS_LDM21L
;
1270 else if (is_tls_dtpoff (*exp
))
1271 rel_type
= R_PARISC_TLS_LDO21L
;
1272 else if (is_tls_ieoff (*exp
))
1273 rel_type
= R_PARISC_TLS_IE21L
;
1274 else if (is_tls_leoff (*exp
))
1275 rel_type
= R_PARISC_TLS_LE21L
;
1277 else if (is_complex (*exp
))
1278 rel_type
= R_HPPA_COMPLEX
;
1282 if (hppa_field_selector
!= e_psel
&& hppa_field_selector
!= e_fsel
)
1284 as_warn (_("Invalid field selector. Assuming F%%."));
1285 hppa_field_selector
= e_fsel
;
1288 fix_new_hppa (frag
, where
, size
,
1289 (symbolS
*) NULL
, (offsetT
) 0, exp
, 0, rel_type
,
1290 hppa_field_selector
, size
* 8, 0, 0);
1292 /* Reset field selector to its default state. */
1293 hppa_field_selector
= 0;
1296 /* Mark (via expr_end) the end of an expression (I think). FIXME. */
1299 get_expression (char *str
)
1304 save_in
= input_line_pointer
;
1305 input_line_pointer
= str
;
1306 seg
= expression (&the_insn
.exp
);
1307 if (!(seg
== absolute_section
1308 || seg
== undefined_section
1309 || SEG_NORMAL (seg
)))
1311 as_warn (_("Bad segment in expression."));
1312 expr_end
= input_line_pointer
;
1313 input_line_pointer
= save_in
;
1316 expr_end
= input_line_pointer
;
1317 input_line_pointer
= save_in
;
1320 /* Parse a PA nullification completer (,n). Return nonzero if the
1321 completer was found; return zero if no completer was found. */
1324 pa_parse_nullif (char **s
)
1332 if (strncasecmp (*s
, "n", 1) == 0)
1336 as_bad (_("Invalid Nullification: (%c)"), **s
);
1346 md_atof (int type
, char *litP
, int *sizeP
)
1348 return ieee_md_atof (type
, litP
, sizeP
, TRUE
);
1351 /* Write out big-endian. */
1354 md_number_to_chars (char *buf
, valueT val
, int n
)
1356 number_to_chars_bigendian (buf
, val
, n
);
1359 /* Translate internal representation of relocation info to BFD target
1363 tc_gen_reloc (asection
*section
, fixS
*fixp
)
1366 struct hppa_fix_struct
*hppa_fixp
;
1367 static arelent
*no_relocs
= NULL
;
1374 hppa_fixp
= (struct hppa_fix_struct
*) fixp
->tc_fix_data
;
1375 if (fixp
->fx_addsy
== 0)
1378 assert (hppa_fixp
!= 0);
1379 assert (section
!= 0);
1381 reloc
= xmalloc (sizeof (arelent
));
1383 reloc
->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
1384 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1386 /* Allow fixup_segment to recognize hand-written pc-relative relocations.
1387 When we went through cons_fix_new_hppa, we classified them as complex. */
1388 /* ??? It might be better to hide this +8 stuff in tc_cfi_emit_pcrel_expr,
1389 undefine DIFF_EXPR_OK, and let these sorts of complex expressions fail
1390 when R_HPPA_COMPLEX == R_PARISC_UNIMPLEMENTED. */
1391 if (fixp
->fx_r_type
== R_HPPA_COMPLEX
&& fixp
->fx_pcrel
)
1393 fixp
->fx_r_type
= R_HPPA_PCREL_CALL
;
1394 fixp
->fx_offset
+= 8;
1397 codes
= hppa_gen_reloc_type (stdoutput
,
1399 hppa_fixp
->fx_r_format
,
1400 hppa_fixp
->fx_r_field
,
1401 fixp
->fx_subsy
!= NULL
,
1402 symbol_get_bfdsym (fixp
->fx_addsy
));
1406 as_bad_where (fixp
->fx_file
, fixp
->fx_line
, _("Cannot handle fixup"));
1410 for (n_relocs
= 0; codes
[n_relocs
]; n_relocs
++)
1413 relocs
= xmalloc (sizeof (arelent
*) * n_relocs
+ 1);
1414 reloc
= xmalloc (sizeof (arelent
) * n_relocs
);
1415 for (i
= 0; i
< n_relocs
; i
++)
1416 relocs
[i
] = &reloc
[i
];
1418 relocs
[n_relocs
] = NULL
;
1421 switch (fixp
->fx_r_type
)
1424 assert (n_relocs
== 1);
1428 /* Now, do any processing that is dependent on the relocation type. */
1431 case R_PARISC_DLTREL21L
:
1432 case R_PARISC_DLTREL14R
:
1433 case R_PARISC_DLTREL14F
:
1434 case R_PARISC_PLABEL32
:
1435 case R_PARISC_PLABEL21L
:
1436 case R_PARISC_PLABEL14R
:
1437 /* For plabel relocations, the addend of the
1438 relocation should be either 0 (no static link) or 2
1439 (static link required). This adjustment is done in
1440 bfd/elf32-hppa.c:elf32_hppa_relocate_section.
1442 We also slam a zero addend into the DLT relative relocs;
1443 it doesn't make a lot of sense to use any addend since
1444 it gets you a different (eg unknown) DLT entry. */
1448 #ifdef ELF_ARG_RELOC
1449 case R_PARISC_PCREL17R
:
1450 case R_PARISC_PCREL17F
:
1451 case R_PARISC_PCREL17C
:
1452 case R_PARISC_DIR17R
:
1453 case R_PARISC_DIR17F
:
1454 case R_PARISC_PCREL21L
:
1455 case R_PARISC_DIR21L
:
1456 reloc
->addend
= HPPA_R_ADDEND (hppa_fixp
->fx_arg_reloc
,
1461 case R_PARISC_DIR32
:
1462 /* Facilitate hand-crafted unwind info. */
1463 if (strcmp (section
->name
, UNWIND_SECTION_NAME
) == 0)
1464 code
= R_PARISC_SEGREL32
;
1468 reloc
->addend
= fixp
->fx_offset
;
1472 reloc
->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
1473 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1474 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
,
1475 (bfd_reloc_code_real_type
) code
);
1476 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1478 assert (reloc
->howto
&& (unsigned int) code
== reloc
->howto
->type
);
1483 /* Walk over reach relocation returned by the BFD backend. */
1484 for (i
= 0; i
< n_relocs
; i
++)
1488 relocs
[i
]->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
1489 *relocs
[i
]->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1491 bfd_reloc_type_lookup (stdoutput
,
1492 (bfd_reloc_code_real_type
) code
);
1493 relocs
[i
]->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1498 /* The only time we ever use a R_COMP2 fixup is for the difference
1499 of two symbols. With that in mind we fill in all four
1500 relocs now and break out of the loop. */
1502 relocs
[0]->sym_ptr_ptr
1503 = (asymbol
**) bfd_abs_section_ptr
->symbol_ptr_ptr
;
1505 = bfd_reloc_type_lookup (stdoutput
,
1506 (bfd_reloc_code_real_type
) *codes
[0]);
1507 relocs
[0]->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1508 relocs
[0]->addend
= 0;
1509 relocs
[1]->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
1510 *relocs
[1]->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1512 = bfd_reloc_type_lookup (stdoutput
,
1513 (bfd_reloc_code_real_type
) *codes
[1]);
1514 relocs
[1]->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1515 relocs
[1]->addend
= 0;
1516 relocs
[2]->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
1517 *relocs
[2]->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_subsy
);
1519 = bfd_reloc_type_lookup (stdoutput
,
1520 (bfd_reloc_code_real_type
) *codes
[2]);
1521 relocs
[2]->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1522 relocs
[2]->addend
= 0;
1523 relocs
[3]->sym_ptr_ptr
1524 = (asymbol
**) bfd_abs_section_ptr
->symbol_ptr_ptr
;
1526 = bfd_reloc_type_lookup (stdoutput
,
1527 (bfd_reloc_code_real_type
) *codes
[3]);
1528 relocs
[3]->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1529 relocs
[3]->addend
= 0;
1530 relocs
[4]->sym_ptr_ptr
1531 = (asymbol
**) bfd_abs_section_ptr
->symbol_ptr_ptr
;
1533 = bfd_reloc_type_lookup (stdoutput
,
1534 (bfd_reloc_code_real_type
) *codes
[4]);
1535 relocs
[4]->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1536 relocs
[4]->addend
= 0;
1540 relocs
[i
]->addend
= HPPA_R_ADDEND (hppa_fixp
->fx_arg_reloc
, 0);
1546 /* For plabel relocations, the addend of the
1547 relocation should be either 0 (no static link) or 2
1548 (static link required).
1550 FIXME: We always assume no static link!
1552 We also slam a zero addend into the DLT relative relocs;
1553 it doesn't make a lot of sense to use any addend since
1554 it gets you a different (eg unknown) DLT entry. */
1555 relocs
[i
]->addend
= 0;
1570 /* There is no symbol or addend associated with these fixups. */
1571 relocs
[i
]->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
1572 *relocs
[i
]->sym_ptr_ptr
= symbol_get_bfdsym (dummy_symbol
);
1573 relocs
[i
]->addend
= 0;
1579 /* There is no symbol associated with these fixups. */
1580 relocs
[i
]->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
1581 *relocs
[i
]->sym_ptr_ptr
= symbol_get_bfdsym (dummy_symbol
);
1582 relocs
[i
]->addend
= fixp
->fx_offset
;
1586 relocs
[i
]->addend
= fixp
->fx_offset
;
1596 /* Process any machine dependent frag types. */
1599 md_convert_frag (bfd
*abfd ATTRIBUTE_UNUSED
,
1600 asection
*sec ATTRIBUTE_UNUSED
,
1603 unsigned int address
;
1605 if (fragP
->fr_type
== rs_machine_dependent
)
1607 switch ((int) fragP
->fr_subtype
)
1610 fragP
->fr_type
= rs_fill
;
1611 know (fragP
->fr_var
== 1);
1612 know (fragP
->fr_next
);
1613 address
= fragP
->fr_address
+ fragP
->fr_fix
;
1614 if (address
% fragP
->fr_offset
)
1617 fragP
->fr_next
->fr_address
1622 fragP
->fr_offset
= 0;
1628 /* Round up a section size to the appropriate boundary. */
1631 md_section_align (asection
*segment
, valueT size
)
1633 int align
= bfd_get_section_alignment (stdoutput
, segment
);
1634 int align2
= (1 << align
) - 1;
1636 return (size
+ align2
) & ~align2
;
1639 /* Return the approximate size of a frag before relaxation has occurred. */
1642 md_estimate_size_before_relax (fragS
*fragP
, asection
*segment ATTRIBUTE_UNUSED
)
1648 while ((fragP
->fr_fix
+ size
) % fragP
->fr_offset
)
1655 # ifdef WARN_COMMENTS
1656 const char *md_shortopts
= "Vc";
1658 const char *md_shortopts
= "V";
1661 # ifdef WARN_COMMENTS
1662 const char *md_shortopts
= "c";
1664 const char *md_shortopts
= "";
1668 struct option md_longopts
[] =
1670 #ifdef WARN_COMMENTS
1671 {"warn-comment", no_argument
, NULL
, 'c'},
1673 {NULL
, no_argument
, NULL
, 0}
1675 size_t md_longopts_size
= sizeof (md_longopts
);
1678 md_parse_option (int c
, char *arg ATTRIBUTE_UNUSED
)
1687 print_version_id ();
1690 #ifdef WARN_COMMENTS
1701 md_show_usage (FILE *stream ATTRIBUTE_UNUSED
)
1704 fprintf (stream
, _("\
1707 #ifdef WARN_COMMENTS
1708 fprintf (stream
, _("\
1709 -c print a warning if a comment is found\n"));
1713 /* We have no need to default values of symbols. */
1716 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
1721 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
1722 #define nonzero_dibits(x) \
1723 ((x) | (((x) & 0x55555555) << 1) | (((x) & 0xAAAAAAAA) >> 1))
1724 #define arg_reloc_stub_needed(CALLER, CALLEE) \
1725 (((CALLER) ^ (CALLEE)) & nonzero_dibits (CALLER) & nonzero_dibits (CALLEE))
1727 #define arg_reloc_stub_needed(CALLER, CALLEE) 0
1730 /* Apply a fixup to an instruction. */
1733 md_apply_fix (fixS
*fixP
, valueT
*valP
, segT seg ATTRIBUTE_UNUSED
)
1736 struct hppa_fix_struct
*hppa_fixP
;
1740 /* SOM uses R_HPPA_ENTRY and R_HPPA_EXIT relocations which can
1741 never be "applied" (they are just markers). Likewise for
1742 R_HPPA_BEGIN_BRTAB and R_HPPA_END_BRTAB. */
1744 if (fixP
->fx_r_type
== R_HPPA_ENTRY
1745 || fixP
->fx_r_type
== R_HPPA_EXIT
1746 || fixP
->fx_r_type
== R_HPPA_BEGIN_BRTAB
1747 || fixP
->fx_r_type
== R_HPPA_END_BRTAB
1748 || fixP
->fx_r_type
== R_HPPA_BEGIN_TRY
)
1751 /* Disgusting. We must set fx_offset ourselves -- R_HPPA_END_TRY
1752 fixups are considered not adjustable, which in turn causes
1753 adjust_reloc_syms to not set fx_offset. Ugh. */
1754 if (fixP
->fx_r_type
== R_HPPA_END_TRY
)
1756 fixP
->fx_offset
= * valP
;
1761 if (fixP
->fx_r_type
== (int) R_PARISC_GNU_VTENTRY
1762 || fixP
->fx_r_type
== (int) R_PARISC_GNU_VTINHERIT
)
1766 if (fixP
->fx_addsy
== NULL
&& fixP
->fx_pcrel
== 0)
1769 /* There should be a HPPA specific fixup associated with the GAS fixup. */
1770 hppa_fixP
= (struct hppa_fix_struct
*) fixP
->tc_fix_data
;
1771 if (hppa_fixP
== NULL
)
1773 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1774 _("no hppa_fixup entry for fixup type 0x%x"),
1779 fixpos
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
1781 if (fixP
->fx_size
!= 4 || hppa_fixP
->fx_r_format
== 32)
1783 /* Handle constant output. */
1784 number_to_chars_bigendian (fixpos
, *valP
, fixP
->fx_size
);
1788 insn
= bfd_get_32 (stdoutput
, fixpos
);
1789 fmt
= bfd_hppa_insn2fmt (stdoutput
, insn
);
1791 /* If there is a symbol associated with this fixup, then it's something
1792 which will need a SOM relocation (except for some PC-relative relocs).
1793 In such cases we should treat the "val" or "addend" as zero since it
1794 will be added in as needed from fx_offset in tc_gen_reloc. */
1795 if ((fixP
->fx_addsy
!= NULL
1796 || fixP
->fx_r_type
== (int) R_HPPA_NONE
)
1801 new_val
= ((fmt
== 12 || fmt
== 17 || fmt
== 22) ? 8 : 0);
1803 /* These field selectors imply that we do not want an addend. */
1804 else if (hppa_fixP
->fx_r_field
== e_psel
1805 || hppa_fixP
->fx_r_field
== e_rpsel
1806 || hppa_fixP
->fx_r_field
== e_lpsel
1807 || hppa_fixP
->fx_r_field
== e_tsel
1808 || hppa_fixP
->fx_r_field
== e_rtsel
1809 || hppa_fixP
->fx_r_field
== e_ltsel
)
1810 new_val
= ((fmt
== 12 || fmt
== 17 || fmt
== 22) ? 8 : 0);
1813 new_val
= hppa_field_adjust (* valP
, 0, hppa_fixP
->fx_r_field
);
1815 /* Handle pc-relative exceptions from above. */
1816 if ((fmt
== 12 || fmt
== 17 || fmt
== 22)
1819 && !arg_reloc_stub_needed (symbol_arg_reloc_info (fixP
->fx_addsy
),
1820 hppa_fixP
->fx_arg_reloc
)
1822 && (* valP
- 8 + 8192 < 16384
1823 || (fmt
== 17 && * valP
- 8 + 262144 < 524288)
1824 || (fmt
== 22 && * valP
- 8 + 8388608 < 16777216))
1827 && (* valP
- 8 + 262144 < 524288
1828 || (fmt
== 22 && * valP
- 8 + 8388608 < 16777216))
1830 && !S_IS_EXTERNAL (fixP
->fx_addsy
)
1831 && !S_IS_WEAK (fixP
->fx_addsy
)
1832 && S_GET_SEGMENT (fixP
->fx_addsy
) == hppa_fixP
->segment
1834 && S_GET_SEGMENT (fixP
->fx_subsy
) != hppa_fixP
->segment
))
1836 new_val
= hppa_field_adjust (* valP
, 0, hppa_fixP
->fx_r_field
);
1842 CHECK_FIELD_WHERE (new_val
, 8191, -8192,
1843 fixP
->fx_file
, fixP
->fx_line
);
1846 insn
= (insn
& ~ 0x3ff1) | (((val
& 0x1ff8) << 1)
1847 | ((val
& 0x2000) >> 13));
1850 CHECK_FIELD_WHERE (new_val
, 8191, -8192,
1851 fixP
->fx_file
, fixP
->fx_line
);
1854 insn
= (insn
& ~ 0x3ff9) | (((val
& 0x1ffc) << 1)
1855 | ((val
& 0x2000) >> 13));
1857 /* Handle all opcodes with the 'j' operand type. */
1859 CHECK_FIELD_WHERE (new_val
, 8191, -8192,
1860 fixP
->fx_file
, fixP
->fx_line
);
1863 insn
= ((insn
& ~ 0x3fff) | low_sign_unext (val
, 14));
1866 /* Handle all opcodes with the 'k' operand type. */
1868 CHECK_FIELD_WHERE (new_val
, 1048575, -1048576,
1869 fixP
->fx_file
, fixP
->fx_line
);
1872 insn
= (insn
& ~ 0x1fffff) | re_assemble_21 (val
);
1875 /* Handle all the opcodes with the 'i' operand type. */
1877 CHECK_FIELD_WHERE (new_val
, 1023, -1024,
1878 fixP
->fx_file
, fixP
->fx_line
);
1881 insn
= (insn
& ~ 0x7ff) | low_sign_unext (val
, 11);
1884 /* Handle all the opcodes with the 'w' operand type. */
1886 CHECK_FIELD_WHERE (new_val
- 8, 8191, -8192,
1887 fixP
->fx_file
, fixP
->fx_line
);
1890 insn
= (insn
& ~ 0x1ffd) | re_assemble_12 (val
>> 2);
1893 /* Handle some of the opcodes with the 'W' operand type. */
1896 offsetT distance
= * valP
;
1898 /* If this is an absolute branch (ie no link) with an out of
1899 range target, then we want to complain. */
1900 if (fixP
->fx_r_type
== (int) R_HPPA_PCREL_CALL
1901 && (insn
& 0xffe00000) == 0xe8000000)
1902 CHECK_FIELD_WHERE (distance
- 8, 262143, -262144,
1903 fixP
->fx_file
, fixP
->fx_line
);
1905 CHECK_FIELD_WHERE (new_val
- 8, 262143, -262144,
1906 fixP
->fx_file
, fixP
->fx_line
);
1909 insn
= (insn
& ~ 0x1f1ffd) | re_assemble_17 (val
>> 2);
1915 offsetT distance
= * valP
;
1917 /* If this is an absolute branch (ie no link) with an out of
1918 range target, then we want to complain. */
1919 if (fixP
->fx_r_type
== (int) R_HPPA_PCREL_CALL
1920 && (insn
& 0xffe00000) == 0xe8000000)
1921 CHECK_FIELD_WHERE (distance
- 8, 8388607, -8388608,
1922 fixP
->fx_file
, fixP
->fx_line
);
1924 CHECK_FIELD_WHERE (new_val
- 8, 8388607, -8388608,
1925 fixP
->fx_file
, fixP
->fx_line
);
1928 insn
= (insn
& ~ 0x3ff1ffd) | re_assemble_22 (val
>> 2);
1934 insn
= (insn
& ~ 0xfff1) | re_assemble_16 (val
& -8);
1939 insn
= (insn
& ~ 0xfff9) | re_assemble_16 (val
& -4);
1944 insn
= (insn
& ~ 0xffff) | re_assemble_16 (val
);
1952 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1953 _("Unknown relocation encountered in md_apply_fix."));
1958 switch (fixP
->fx_r_type
)
1960 case R_PARISC_TLS_GD21L
:
1961 case R_PARISC_TLS_GD14R
:
1962 case R_PARISC_TLS_LDM21L
:
1963 case R_PARISC_TLS_LDM14R
:
1964 case R_PARISC_TLS_LE21L
:
1965 case R_PARISC_TLS_LE14R
:
1966 case R_PARISC_TLS_IE21L
:
1967 case R_PARISC_TLS_IE14R
:
1969 S_SET_THREAD_LOCAL (fixP
->fx_addsy
);
1976 /* Insert the relocation. */
1977 bfd_put_32 (stdoutput
, insn
, fixpos
);
1980 /* Exactly what point is a PC-relative offset relative TO?
1981 On the PA, they're relative to the address of the offset. */
1984 md_pcrel_from (fixS
*fixP
)
1986 return fixP
->fx_where
+ fixP
->fx_frag
->fr_address
;
1989 /* Return nonzero if the input line pointer is at the end of
1993 is_end_of_statement (void)
1995 return ((*input_line_pointer
== '\n')
1996 || (*input_line_pointer
== ';')
1997 || (*input_line_pointer
== '!'));
2000 #define REG_NAME_CNT (sizeof (pre_defined_registers) / sizeof (struct pd_reg))
2002 /* Given NAME, find the register number associated with that name, return
2003 the integer value associated with the given name or -1 on failure. */
2006 reg_name_search (char *name
)
2008 int middle
, low
, high
;
2012 high
= REG_NAME_CNT
- 1;
2016 middle
= (low
+ high
) / 2;
2017 cmp
= strcasecmp (name
, pre_defined_registers
[middle
].name
);
2023 return pre_defined_registers
[middle
].value
;
2025 while (low
<= high
);
2030 /* Read a number from S. The number might come in one of many forms,
2031 the most common will be a hex or decimal constant, but it could be
2032 a pre-defined register (Yuk!), or an absolute symbol.
2034 Return 1 on success or 0 on failure. If STRICT, then a missing
2035 register prefix will cause a failure. The number itself is
2036 returned in `pa_number'.
2038 IS_FLOAT indicates that a PA-89 FP register number should be
2039 parsed; A `l' or `r' suffix is checked for if but 2 of IS_FLOAT is
2042 pa_parse_number can not handle negative constants and will fail
2043 horribly if it is passed such a constant. */
2046 pa_parse_number (char **s
, int is_float
)
2054 bfd_boolean have_prefix
;
2056 /* Skip whitespace before the number. */
2057 while (*p
== ' ' || *p
== '\t')
2063 if (!strict
&& ISDIGIT (*p
))
2065 /* Looks like a number. */
2067 if (*p
== '0' && (*(p
+ 1) == 'x' || *(p
+ 1) == 'X'))
2069 /* The number is specified in hex. */
2071 while (ISDIGIT (*p
) || ((*p
>= 'a') && (*p
<= 'f'))
2072 || ((*p
>= 'A') && (*p
<= 'F')))
2075 num
= num
* 16 + *p
- '0';
2076 else if (*p
>= 'a' && *p
<= 'f')
2077 num
= num
* 16 + *p
- 'a' + 10;
2079 num
= num
* 16 + *p
- 'A' + 10;
2085 /* The number is specified in decimal. */
2086 while (ISDIGIT (*p
))
2088 num
= num
* 10 + *p
- '0';
2095 /* Check for a `l' or `r' suffix. */
2098 pa_number
+= FP_REG_BASE
;
2099 if (! (is_float
& 2))
2101 if (IS_R_SELECT (p
))
2103 pa_number
+= FP_REG_RSEL
;
2106 else if (IS_L_SELECT (p
))
2115 /* The number might be a predefined register. */
2120 /* Tege hack: Special case for general registers as the general
2121 code makes a binary search with case translation, and is VERY
2126 if (*p
== 'e' && *(p
+ 1) == 't'
2127 && (*(p
+ 2) == '0' || *(p
+ 2) == '1'))
2130 num
= *p
- '0' + 28;
2138 else if (!ISDIGIT (*p
))
2141 as_bad (_("Undefined register: '%s'."), name
);
2147 num
= num
* 10 + *p
++ - '0';
2148 while (ISDIGIT (*p
));
2153 /* Do a normal register search. */
2154 while (is_part_of_name (c
))
2160 status
= reg_name_search (name
);
2166 as_bad (_("Undefined register: '%s'."), name
);
2176 /* And finally, it could be a symbol in the absolute section which
2177 is effectively a constant, or a register alias symbol. */
2180 while (is_part_of_name (c
))
2186 if ((sym
= symbol_find (name
)) != NULL
)
2188 if (S_GET_SEGMENT (sym
) == reg_section
)
2190 num
= S_GET_VALUE (sym
);
2191 /* Well, we don't really have one, but we do have a
2195 else if (S_GET_SEGMENT (sym
) == &bfd_abs_section
)
2196 num
= S_GET_VALUE (sym
);
2200 as_bad (_("Non-absolute symbol: '%s'."), name
);
2206 /* There is where we'd come for an undefined symbol
2207 or for an empty string. For an empty string we
2208 will return zero. That's a concession made for
2209 compatibility with the braindamaged HP assemblers. */
2215 as_bad (_("Undefined absolute constant: '%s'."), name
);
2224 if (!strict
|| have_prefix
)
2232 /* Return nonzero if the given INSN and L/R information will require
2233 a new PA-1.1 opcode. */
2236 need_pa11_opcode (void)
2238 if ((pa_number
& FP_REG_RSEL
) != 0
2239 && !(the_insn
.fpof1
== DBL
&& the_insn
.fpof2
== DBL
))
2241 /* If this instruction is specific to a particular architecture,
2242 then set a new architecture. */
2243 if (bfd_get_mach (stdoutput
) < pa11
)
2245 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_hppa
, pa11
))
2246 as_warn (_("could not update architecture and machine"));
2254 /* Parse a condition for a fcmp instruction. Return the numerical
2255 code associated with the condition. */
2258 pa_parse_fp_cmp_cond (char **s
)
2264 for (i
= 0; i
< 32; i
++)
2266 if (strncasecmp (*s
, fp_cond_map
[i
].string
,
2267 strlen (fp_cond_map
[i
].string
)) == 0)
2269 cond
= fp_cond_map
[i
].cond
;
2270 *s
+= strlen (fp_cond_map
[i
].string
);
2271 /* If not a complete match, back up the input string and
2273 if (**s
!= ' ' && **s
!= '\t')
2275 *s
-= strlen (fp_cond_map
[i
].string
);
2278 while (**s
== ' ' || **s
== '\t')
2284 as_bad (_("Invalid FP Compare Condition: %s"), *s
);
2286 /* Advance over the bogus completer. */
2287 while (**s
!= ',' && **s
!= ' ' && **s
!= '\t')
2293 /* Parse a graphics test complete for ftest. */
2296 pa_parse_ftest_gfx_completer (char **s
)
2301 if (strncasecmp (*s
, "acc8", 4) == 0)
2306 else if (strncasecmp (*s
, "acc6", 4) == 0)
2311 else if (strncasecmp (*s
, "acc4", 4) == 0)
2316 else if (strncasecmp (*s
, "acc2", 4) == 0)
2321 else if (strncasecmp (*s
, "acc", 3) == 0)
2326 else if (strncasecmp (*s
, "rej8", 4) == 0)
2331 else if (strncasecmp (*s
, "rej", 3) == 0)
2339 as_bad (_("Invalid FTEST completer: %s"), *s
);
2345 /* Parse an FP operand format completer returning the completer
2348 static fp_operand_format
2349 pa_parse_fp_cnv_format (char **s
)
2357 if (strncasecmp (*s
, "sgl", 3) == 0)
2362 else if (strncasecmp (*s
, "dbl", 3) == 0)
2367 else if (strncasecmp (*s
, "quad", 4) == 0)
2372 else if (strncasecmp (*s
, "w", 1) == 0)
2377 else if (strncasecmp (*s
, "uw", 2) == 0)
2382 else if (strncasecmp (*s
, "dw", 2) == 0)
2387 else if (strncasecmp (*s
, "udw", 3) == 0)
2392 else if (strncasecmp (*s
, "qw", 2) == 0)
2397 else if (strncasecmp (*s
, "uqw", 3) == 0)
2404 format
= ILLEGAL_FMT
;
2405 as_bad (_("Invalid FP Operand Format: %3s"), *s
);
2412 /* Parse an FP operand format completer returning the completer
2415 static fp_operand_format
2416 pa_parse_fp_format (char **s
)
2424 if (strncasecmp (*s
, "sgl", 3) == 0)
2429 else if (strncasecmp (*s
, "dbl", 3) == 0)
2434 else if (strncasecmp (*s
, "quad", 4) == 0)
2441 format
= ILLEGAL_FMT
;
2442 as_bad (_("Invalid FP Operand Format: %3s"), *s
);
2449 /* Convert from a selector string into a selector type. */
2452 pa_chk_field_selector (char **str
)
2454 int middle
, low
, high
;
2458 /* Read past any whitespace. */
2459 /* FIXME: should we read past newlines and formfeeds??? */
2460 while (**str
== ' ' || **str
== '\t' || **str
== '\n' || **str
== '\f')
2463 if ((*str
)[1] == '\'' || (*str
)[1] == '%')
2464 name
[0] = TOLOWER ((*str
)[0]),
2466 else if ((*str
)[2] == '\'' || (*str
)[2] == '%')
2467 name
[0] = TOLOWER ((*str
)[0]),
2468 name
[1] = TOLOWER ((*str
)[1]),
2470 else if ((*str
)[3] == '\'' || (*str
)[3] == '%')
2471 name
[0] = TOLOWER ((*str
)[0]),
2472 name
[1] = TOLOWER ((*str
)[1]),
2473 name
[2] = TOLOWER ((*str
)[2]),
2479 high
= sizeof (selector_table
) / sizeof (struct selector_entry
) - 1;
2483 middle
= (low
+ high
) / 2;
2484 cmp
= strcmp (name
, selector_table
[middle
].prefix
);
2491 *str
+= strlen (name
) + 1;
2493 if (selector_table
[middle
].field_selector
== e_nsel
)
2496 return selector_table
[middle
].field_selector
;
2499 while (low
<= high
);
2504 /* Parse a .byte, .word, .long expression for the HPPA. Called by
2505 cons via the TC_PARSE_CONS_EXPRESSION macro. */
2508 parse_cons_expression_hppa (expressionS
*exp
)
2510 hppa_field_selector
= pa_chk_field_selector (&input_line_pointer
);
2514 /* Evaluate an absolute expression EXP which may be modified by
2515 the selector FIELD_SELECTOR. Return the value of the expression. */
2517 evaluate_absolute (struct pa_it
*insn
)
2521 int field_selector
= insn
->field_selector
;
2524 value
= exp
.X_add_number
;
2526 return hppa_field_adjust (0, value
, field_selector
);
2529 /* Mark (via expr_end) the end of an absolute expression. FIXME. */
2532 pa_get_absolute_expression (struct pa_it
*insn
, char **strp
)
2536 insn
->field_selector
= pa_chk_field_selector (strp
);
2537 save_in
= input_line_pointer
;
2538 input_line_pointer
= *strp
;
2539 expression (&insn
->exp
);
2540 /* This is not perfect, but is a huge improvement over doing nothing.
2542 The PA assembly syntax is ambiguous in a variety of ways. Consider
2543 this string "4 %r5" Is that the number 4 followed by the register
2544 r5, or is that 4 MOD r5?
2546 If we get a modulo expression when looking for an absolute, we try
2547 again cutting off the input string at the first whitespace character. */
2548 if (insn
->exp
.X_op
== O_modulus
)
2553 input_line_pointer
= *strp
;
2555 while (*s
!= ',' && *s
!= ' ' && *s
!= '\t')
2561 retval
= pa_get_absolute_expression (insn
, strp
);
2563 input_line_pointer
= save_in
;
2565 return evaluate_absolute (insn
);
2567 /* When in strict mode we have a non-match, fix up the pointers
2568 and return to our caller. */
2569 if (insn
->exp
.X_op
!= O_constant
&& strict
)
2571 expr_end
= input_line_pointer
;
2572 input_line_pointer
= save_in
;
2575 if (insn
->exp
.X_op
!= O_constant
)
2577 as_bad (_("Bad segment (should be absolute)."));
2578 expr_end
= input_line_pointer
;
2579 input_line_pointer
= save_in
;
2582 expr_end
= input_line_pointer
;
2583 input_line_pointer
= save_in
;
2584 return evaluate_absolute (insn
);
2587 /* Given an argument location specification return the associated
2588 argument location number. */
2591 pa_build_arg_reloc (char *type_name
)
2594 if (strncasecmp (type_name
, "no", 2) == 0)
2596 if (strncasecmp (type_name
, "gr", 2) == 0)
2598 else if (strncasecmp (type_name
, "fr", 2) == 0)
2600 else if (strncasecmp (type_name
, "fu", 2) == 0)
2603 as_bad (_("Invalid argument location: %s\n"), type_name
);
2608 /* Encode and return an argument relocation specification for
2609 the given register in the location specified by arg_reloc. */
2612 pa_align_arg_reloc (unsigned int reg
, unsigned int arg_reloc
)
2614 unsigned int new_reloc
;
2616 new_reloc
= arg_reloc
;
2632 as_bad (_("Invalid argument description: %d"), reg
);
2638 /* Parse a non-negated compare/subtract completer returning the
2639 number (for encoding in instructions) of the given completer. */
2642 pa_parse_nonneg_cmpsub_cmpltr (char **s
)
2645 char *name
= *s
+ 1;
2654 while (**s
!= ',' && **s
!= ' ' && **s
!= '\t')
2659 if (strcmp (name
, "=") == 0)
2663 else if (strcmp (name
, "<") == 0)
2667 else if (strcmp (name
, "<=") == 0)
2671 else if (strcmp (name
, "<<") == 0)
2675 else if (strcmp (name
, "<<=") == 0)
2679 else if (strcasecmp (name
, "sv") == 0)
2683 else if (strcasecmp (name
, "od") == 0)
2687 /* If we have something like addb,n then there is no condition
2689 else if (strcasecmp (name
, "n") == 0)
2701 /* Reset pointers if this was really a ,n for a branch instruction. */
2708 /* Parse a negated compare/subtract completer returning the
2709 number (for encoding in instructions) of the given completer. */
2712 pa_parse_neg_cmpsub_cmpltr (char **s
)
2715 char *name
= *s
+ 1;
2724 while (**s
!= ',' && **s
!= ' ' && **s
!= '\t')
2729 if (strcasecmp (name
, "tr") == 0)
2733 else if (strcmp (name
, "<>") == 0)
2737 else if (strcmp (name
, ">=") == 0)
2741 else if (strcmp (name
, ">") == 0)
2745 else if (strcmp (name
, ">>=") == 0)
2749 else if (strcmp (name
, ">>") == 0)
2753 else if (strcasecmp (name
, "nsv") == 0)
2757 else if (strcasecmp (name
, "ev") == 0)
2761 /* If we have something like addb,n then there is no condition
2763 else if (strcasecmp (name
, "n") == 0)
2775 /* Reset pointers if this was really a ,n for a branch instruction. */
2782 /* Parse a 64 bit compare and branch completer returning the number (for
2783 encoding in instructions) of the given completer.
2785 Nonnegated comparisons are returned as 0-7, negated comparisons are
2786 returned as 8-15. */
2789 pa_parse_cmpb_64_cmpltr (char **s
)
2792 char *name
= *s
+ 1;
2799 while (**s
!= ',' && **s
!= ' ' && **s
!= '\t')
2804 if (strcmp (name
, "*") == 0)
2808 else if (strcmp (name
, "*=") == 0)
2812 else if (strcmp (name
, "*<") == 0)
2816 else if (strcmp (name
, "*<=") == 0)
2820 else if (strcmp (name
, "*<<") == 0)
2824 else if (strcmp (name
, "*<<=") == 0)
2828 else if (strcasecmp (name
, "*sv") == 0)
2832 else if (strcasecmp (name
, "*od") == 0)
2836 else if (strcasecmp (name
, "*tr") == 0)
2840 else if (strcmp (name
, "*<>") == 0)
2844 else if (strcmp (name
, "*>=") == 0)
2848 else if (strcmp (name
, "*>") == 0)
2852 else if (strcmp (name
, "*>>=") == 0)
2856 else if (strcmp (name
, "*>>") == 0)
2860 else if (strcasecmp (name
, "*nsv") == 0)
2864 else if (strcasecmp (name
, "*ev") == 0)
2878 /* Parse a 64 bit compare immediate and branch completer returning the number
2879 (for encoding in instructions) of the given completer. */
2882 pa_parse_cmpib_64_cmpltr (char **s
)
2885 char *name
= *s
+ 1;
2892 while (**s
!= ',' && **s
!= ' ' && **s
!= '\t')
2897 if (strcmp (name
, "*<<") == 0)
2901 else if (strcmp (name
, "*=") == 0)
2905 else if (strcmp (name
, "*<") == 0)
2909 else if (strcmp (name
, "*<=") == 0)
2913 else if (strcmp (name
, "*>>=") == 0)
2917 else if (strcmp (name
, "*<>") == 0)
2921 else if (strcasecmp (name
, "*>=") == 0)
2925 else if (strcasecmp (name
, "*>") == 0)
2939 /* Parse a non-negated addition completer returning the number
2940 (for encoding in instructions) of the given completer. */
2943 pa_parse_nonneg_add_cmpltr (char **s
)
2946 char *name
= *s
+ 1;
2955 while (**s
!= ',' && **s
!= ' ' && **s
!= '\t')
2959 if (strcmp (name
, "=") == 0)
2963 else if (strcmp (name
, "<") == 0)
2967 else if (strcmp (name
, "<=") == 0)
2971 else if (strcasecmp (name
, "nuv") == 0)
2975 else if (strcasecmp (name
, "znv") == 0)
2979 else if (strcasecmp (name
, "sv") == 0)
2983 else if (strcasecmp (name
, "od") == 0)
2987 /* If we have something like addb,n then there is no condition
2989 else if (strcasecmp (name
, "n") == 0)
3001 /* Reset pointers if this was really a ,n for a branch instruction. */
3008 /* Parse a negated addition completer returning the number
3009 (for encoding in instructions) of the given completer. */
3012 pa_parse_neg_add_cmpltr (char **s
)
3015 char *name
= *s
+ 1;
3024 while (**s
!= ',' && **s
!= ' ' && **s
!= '\t')
3028 if (strcasecmp (name
, "tr") == 0)
3032 else if (strcmp (name
, "<>") == 0)
3036 else if (strcmp (name
, ">=") == 0)
3040 else if (strcmp (name
, ">") == 0)
3044 else if (strcasecmp (name
, "uv") == 0)
3048 else if (strcasecmp (name
, "vnz") == 0)
3052 else if (strcasecmp (name
, "nsv") == 0)
3056 else if (strcasecmp (name
, "ev") == 0)
3060 /* If we have something like addb,n then there is no condition
3062 else if (strcasecmp (name
, "n") == 0)
3074 /* Reset pointers if this was really a ,n for a branch instruction. */
3081 /* Parse a 64 bit wide mode add and branch completer returning the number (for
3082 encoding in instructions) of the given completer. */
3085 pa_parse_addb_64_cmpltr (char **s
)
3088 char *name
= *s
+ 1;
3097 while (**s
!= ',' && **s
!= ' ' && **s
!= '\t')
3101 if (strcmp (name
, "=") == 0)
3105 else if (strcmp (name
, "<") == 0)
3109 else if (strcmp (name
, "<=") == 0)
3113 else if (strcasecmp (name
, "nuv") == 0)
3117 else if (strcasecmp (name
, "*=") == 0)
3121 else if (strcasecmp (name
, "*<") == 0)
3125 else if (strcasecmp (name
, "*<=") == 0)
3129 else if (strcmp (name
, "tr") == 0)
3133 else if (strcmp (name
, "<>") == 0)
3137 else if (strcmp (name
, ">=") == 0)
3141 else if (strcmp (name
, ">") == 0)
3145 else if (strcasecmp (name
, "uv") == 0)
3149 else if (strcasecmp (name
, "*<>") == 0)
3153 else if (strcasecmp (name
, "*>=") == 0)
3157 else if (strcasecmp (name
, "*>") == 0)
3161 /* If we have something like addb,n then there is no condition
3163 else if (strcasecmp (name
, "n") == 0)
3175 /* Reset pointers if this was really a ,n for a branch instruction. */
3182 /* Do the real work for assembling a single instruction. Store results
3183 into the global "the_insn" variable. */
3188 char *error_message
= "";
3189 char *s
, c
, *argstart
, *name
, *save_s
;
3193 int cmpltr
, nullif
, flag
, cond
, num
;
3194 unsigned long opcode
;
3195 struct pa_opcode
*insn
;
3198 /* We must have a valid space and subspace. */
3199 pa_check_current_space_and_subspace ();
3202 /* Convert everything up to the first whitespace character into lower
3204 for (s
= str
; *s
!= ' ' && *s
!= '\t' && *s
!= '\n' && *s
!= '\0'; s
++)
3207 /* Skip to something interesting. */
3209 ISUPPER (*s
) || ISLOWER (*s
) || (*s
>= '0' && *s
<= '3');
3229 as_bad (_("Unknown opcode: `%s'"), str
);
3233 /* Look up the opcode in the hash table. */
3234 if ((insn
= (struct pa_opcode
*) hash_find (op_hash
, str
)) == NULL
)
3236 as_bad ("Unknown opcode: `%s'", str
);
3243 /* Mark the location where arguments for the instruction start, then
3244 start processing them. */
3248 /* Do some initialization. */
3249 opcode
= insn
->match
;
3250 strict
= (insn
->flags
& FLAG_STRICT
);
3251 memset (&the_insn
, 0, sizeof (the_insn
));
3253 the_insn
.reloc
= R_HPPA_NONE
;
3255 if (insn
->arch
>= pa20
3256 && bfd_get_mach (stdoutput
) < insn
->arch
)
3259 /* Build the opcode, checking as we go to make
3260 sure that the operands match. */
3261 for (args
= insn
->args
;; ++args
)
3263 /* Absorb white space in instruction. */
3264 while (*s
== ' ' || *s
== '\t')
3269 /* End of arguments. */
3285 /* These must match exactly. */
3294 /* Handle a 5 bit register or control register field at 10. */
3297 if (!pa_parse_number (&s
, 0))
3300 CHECK_FIELD (num
, 31, 0, 0);
3301 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 21);
3303 /* Handle %sar or %cr11. No bits get set, we just verify that it
3306 /* Skip whitespace before register. */
3307 while (*s
== ' ' || *s
== '\t')
3310 if (!strncasecmp (s
, "%sar", 4))
3315 else if (!strncasecmp (s
, "%cr11", 5))
3322 /* Handle a 5 bit register field at 15. */
3324 if (!pa_parse_number (&s
, 0))
3327 CHECK_FIELD (num
, 31, 0, 0);
3328 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 16);
3330 /* Handle a 5 bit register field at 31. */
3332 if (!pa_parse_number (&s
, 0))
3335 CHECK_FIELD (num
, 31, 0, 0);
3336 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
3338 /* Handle a 5 bit register field at 10 and 15. */
3340 if (!pa_parse_number (&s
, 0))
3343 CHECK_FIELD (num
, 31, 0, 0);
3344 opcode
|= num
<< 16;
3345 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 21);
3347 /* Handle a 5 bit field length at 31. */
3349 num
= pa_get_absolute_expression (&the_insn
, &s
);
3350 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
3353 CHECK_FIELD (num
, 32, 1, 0);
3354 INSERT_FIELD_AND_CONTINUE (opcode
, 32 - num
, 0);
3356 /* Handle a 5 bit immediate at 15. */
3358 num
= pa_get_absolute_expression (&the_insn
, &s
);
3359 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
3362 /* When in strict mode, we want to just reject this
3363 match instead of giving an out of range error. */
3364 CHECK_FIELD (num
, 15, -16, strict
);
3365 num
= low_sign_unext (num
, 5);
3366 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 16);
3368 /* Handle a 5 bit immediate at 31. */
3370 num
= pa_get_absolute_expression (&the_insn
, &s
);
3371 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
3374 /* When in strict mode, we want to just reject this
3375 match instead of giving an out of range error. */
3376 CHECK_FIELD (num
, 15, -16, strict
);
3377 num
= low_sign_unext (num
, 5);
3378 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
3380 /* Handle an unsigned 5 bit immediate at 31. */
3382 num
= pa_get_absolute_expression (&the_insn
, &s
);
3383 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
3386 CHECK_FIELD (num
, 31, 0, strict
);
3387 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
3389 /* Handle an unsigned 5 bit immediate at 15. */
3391 num
= pa_get_absolute_expression (&the_insn
, &s
);
3392 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
3395 CHECK_FIELD (num
, 31, 0, strict
);
3396 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 16);
3398 /* Handle an unsigned 10 bit immediate at 15. */
3400 num
= pa_get_absolute_expression (&the_insn
, &s
);
3401 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
3404 CHECK_FIELD (num
, 1023, 0, strict
);
3405 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 16);
3407 /* Handle a 2 bit space identifier at 17. */
3409 if (!pa_parse_number (&s
, 0))
3412 CHECK_FIELD (num
, 3, 0, 1);
3413 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 14);
3415 /* Handle a 3 bit space identifier at 18. */
3417 if (!pa_parse_number (&s
, 0))
3420 CHECK_FIELD (num
, 7, 0, 1);
3421 opcode
|= re_assemble_3 (num
);
3424 /* Handle all completers. */
3429 /* Handle a completer for an indexing load or store. */
3436 while (*s
== ',' && i
< 2)
3439 if (strncasecmp (s
, "sm", 2) == 0)
3446 else if (strncasecmp (s
, "m", 1) == 0)
3448 else if ((strncasecmp (s
, "s ", 2) == 0)
3449 || (strncasecmp (s
, "s,", 2) == 0))
3453 /* This is a match failure. */
3458 as_bad (_("Invalid Indexed Load Completer."));
3463 as_bad (_("Invalid Indexed Load Completer Syntax."));
3465 INSERT_FIELD_AND_CONTINUE (opcode
, uu
, 13);
3468 /* Handle a short load/store completer. */
3480 if (strncasecmp (s
, "ma", 2) == 0)
3486 else if (strncasecmp (s
, "mb", 2) == 0)
3493 /* This is a match failure. */
3497 as_bad (_("Invalid Short Load/Store Completer."));
3501 /* If we did not get a ma/mb completer, then we do not
3502 consider this a positive match for 'ce'. */
3503 else if (*args
== 'e')
3506 /* 'J', 'm', 'M' and 'q' are the same, except for where they
3507 encode the before/after field. */
3508 if (*args
== 'm' || *args
== 'M')
3511 INSERT_FIELD_AND_CONTINUE (opcode
, a
, 13);
3513 else if (*args
== 'q')
3516 INSERT_FIELD_AND_CONTINUE (opcode
, a
, 2);
3518 else if (*args
== 'J')
3520 /* M bit is explicit in the major opcode. */
3521 INSERT_FIELD_AND_CONTINUE (opcode
, a
, 2);
3523 else if (*args
== 'e')
3525 /* Stash the ma/mb flag temporarily in the
3526 instruction. We will use (and remove it)
3527 later when handling 'J', 'K', '<' & '>'. */
3533 /* Handle a stbys completer. */
3540 while (*s
== ',' && i
< 2)
3543 if (strncasecmp (s
, "m", 1) == 0)
3545 else if ((strncasecmp (s
, "b ", 2) == 0)
3546 || (strncasecmp (s
, "b,", 2) == 0))
3548 else if (strncasecmp (s
, "e", 1) == 0)
3550 /* In strict mode, this is a match failure. */
3557 as_bad (_("Invalid Store Bytes Short Completer"));
3562 as_bad (_("Invalid Store Bytes Short Completer"));
3564 INSERT_FIELD_AND_CONTINUE (opcode
, a
, 13);
3567 /* Handle load cache hint completer. */
3570 if (!strncmp (s
, ",sl", 3))
3575 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 10);
3577 /* Handle store cache hint completer. */
3580 if (!strncmp (s
, ",sl", 3))
3585 else if (!strncmp (s
, ",bc", 3))
3590 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 10);
3592 /* Handle load and clear cache hint completer. */
3595 if (!strncmp (s
, ",co", 3))
3600 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 10);
3602 /* Handle load ordering completer. */
3604 if (strncmp (s
, ",o", 2) != 0)
3609 /* Handle a branch gate completer. */
3611 if (strncasecmp (s
, ",gate", 5) != 0)
3616 /* Handle a branch link and push completer. */
3618 if (strncasecmp (s
, ",l,push", 7) != 0)
3623 /* Handle a branch link completer. */
3625 if (strncasecmp (s
, ",l", 2) != 0)
3630 /* Handle a branch pop completer. */
3632 if (strncasecmp (s
, ",pop", 4) != 0)
3637 /* Handle a local processor completer. */
3639 if (strncasecmp (s
, ",l", 2) != 0)
3644 /* Handle a PROBE read/write completer. */
3647 if (!strncasecmp (s
, ",w", 2))
3652 else if (!strncasecmp (s
, ",r", 2))
3658 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 6);
3660 /* Handle MFCTL wide completer. */
3662 if (strncasecmp (s
, ",w", 2) != 0)
3667 /* Handle an RFI restore completer. */
3670 if (!strncasecmp (s
, ",r", 2))
3676 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 5);
3678 /* Handle a system control completer. */
3680 if (*s
== ',' && (*(s
+ 1) == 'm' || *(s
+ 1) == 'M'))
3688 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 5);
3690 /* Handle intermediate/final completer for DCOR. */
3693 if (!strncasecmp (s
, ",i", 2))
3699 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 6);
3701 /* Handle zero/sign extension completer. */
3704 if (!strncasecmp (s
, ",z", 2))
3710 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 10);
3712 /* Handle add completer. */
3715 if (!strncasecmp (s
, ",l", 2))
3720 else if (!strncasecmp (s
, ",tsv", 4))
3726 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 10);
3728 /* Handle 64 bit carry for ADD. */
3731 if (!strncasecmp (s
, ",dc,tsv", 7) ||
3732 !strncasecmp (s
, ",tsv,dc", 7))
3737 else if (!strncasecmp (s
, ",dc", 3))
3745 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
3747 /* Handle 32 bit carry for ADD. */
3750 if (!strncasecmp (s
, ",c,tsv", 6) ||
3751 !strncasecmp (s
, ",tsv,c", 6))
3756 else if (!strncasecmp (s
, ",c", 2))
3764 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
3766 /* Handle trap on signed overflow. */
3769 if (!strncasecmp (s
, ",tsv", 4))
3775 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
3777 /* Handle trap on condition and overflow. */
3780 if (!strncasecmp (s
, ",tc,tsv", 7) ||
3781 !strncasecmp (s
, ",tsv,tc", 7))
3786 else if (!strncasecmp (s
, ",tc", 3))
3794 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
3796 /* Handle 64 bit borrow for SUB. */
3799 if (!strncasecmp (s
, ",db,tsv", 7) ||
3800 !strncasecmp (s
, ",tsv,db", 7))
3805 else if (!strncasecmp (s
, ",db", 3))
3813 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
3815 /* Handle 32 bit borrow for SUB. */
3818 if (!strncasecmp (s
, ",b,tsv", 6) ||
3819 !strncasecmp (s
, ",tsv,b", 6))
3824 else if (!strncasecmp (s
, ",b", 2))
3832 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
3834 /* Handle trap condition completer for UADDCM. */
3837 if (!strncasecmp (s
, ",tc", 3))
3843 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 6);
3845 /* Handle signed/unsigned at 21. */
3849 if (strncasecmp (s
, ",s", 2) == 0)
3854 else if (strncasecmp (s
, ",u", 2) == 0)
3860 INSERT_FIELD_AND_CONTINUE (opcode
, sign
, 10);
3863 /* Handle left/right combination at 17:18. */
3873 as_bad (_("Invalid left/right combination completer"));
3876 INSERT_FIELD_AND_CONTINUE (opcode
, lr
, 13);
3879 as_bad (_("Invalid left/right combination completer"));
3882 /* Handle saturation at 24:25. */
3886 if (strncasecmp (s
, ",ss", 3) == 0)
3891 else if (strncasecmp (s
, ",us", 3) == 0)
3897 INSERT_FIELD_AND_CONTINUE (opcode
, sat
, 6);
3900 /* Handle permutation completer. */
3928 as_bad (_("Invalid permutation completer"));
3930 opcode
|= perm
<< permloc
[i
];
3935 as_bad (_("Invalid permutation completer"));
3943 /* Handle all conditions. */
3949 /* Handle FP compare conditions. */
3951 cond
= pa_parse_fp_cmp_cond (&s
);
3952 INSERT_FIELD_AND_CONTINUE (opcode
, cond
, 0);
3954 /* Handle an add condition. */
3963 /* 64 bit conditions. */
3975 while (*s
!= ',' && *s
!= ' ' && *s
!= '\t')
3979 if (strcmp (name
, "=") == 0)
3981 else if (strcmp (name
, "<") == 0)
3983 else if (strcmp (name
, "<=") == 0)
3985 else if (strcasecmp (name
, "nuv") == 0)
3987 else if (strcasecmp (name
, "znv") == 0)
3989 else if (strcasecmp (name
, "sv") == 0)
3991 else if (strcasecmp (name
, "od") == 0)
3993 else if (strcasecmp (name
, "tr") == 0)
3998 else if (strcmp (name
, "<>") == 0)
4003 else if (strcmp (name
, ">=") == 0)
4008 else if (strcmp (name
, ">") == 0)
4013 else if (strcasecmp (name
, "uv") == 0)
4018 else if (strcasecmp (name
, "vnz") == 0)
4023 else if (strcasecmp (name
, "nsv") == 0)
4028 else if (strcasecmp (name
, "ev") == 0)
4033 /* ",*" is a valid condition. */
4034 else if (*args
== 'a' || *name
)
4035 as_bad (_("Invalid Add Condition: %s"), name
);
4038 opcode
|= cmpltr
<< 13;
4039 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 12);
4041 /* Handle non-negated add and branch condition. */
4043 cmpltr
= pa_parse_nonneg_add_cmpltr (&s
);
4046 as_bad (_("Invalid Add and Branch Condition"));
4049 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 13);
4051 /* Handle 64 bit wide-mode add and branch condition. */
4053 cmpltr
= pa_parse_addb_64_cmpltr (&s
);
4056 as_bad (_("Invalid Add and Branch Condition"));
4061 /* Negated condition requires an opcode change. */
4062 opcode
|= (cmpltr
& 8) << 24;
4064 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
& 7, 13);
4066 /* Handle a negated or non-negated add and branch
4070 cmpltr
= pa_parse_nonneg_add_cmpltr (&s
);
4074 cmpltr
= pa_parse_neg_add_cmpltr (&s
);
4077 as_bad (_("Invalid Compare/Subtract Condition"));
4082 /* Negated condition requires an opcode change. */
4086 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 13);
4088 /* Handle branch on bit conditions. */
4106 if (strncmp (s
, "<", 1) == 0)
4111 else if (strncmp (s
, ">=", 2) == 0)
4117 as_bad (_("Invalid Bit Branch Condition: %c"), *s
);
4119 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 15);
4121 /* Handle a compare/subtract condition. */
4130 /* 64 bit conditions. */
4142 while (*s
!= ',' && *s
!= ' ' && *s
!= '\t')
4146 if (strcmp (name
, "=") == 0)
4148 else if (strcmp (name
, "<") == 0)
4150 else if (strcmp (name
, "<=") == 0)
4152 else if (strcasecmp (name
, "<<") == 0)
4154 else if (strcasecmp (name
, "<<=") == 0)
4156 else if (strcasecmp (name
, "sv") == 0)
4158 else if (strcasecmp (name
, "od") == 0)
4160 else if (strcasecmp (name
, "tr") == 0)
4165 else if (strcmp (name
, "<>") == 0)
4170 else if (strcmp (name
, ">=") == 0)
4175 else if (strcmp (name
, ">") == 0)
4180 else if (strcasecmp (name
, ">>=") == 0)
4185 else if (strcasecmp (name
, ">>") == 0)
4190 else if (strcasecmp (name
, "nsv") == 0)
4195 else if (strcasecmp (name
, "ev") == 0)
4200 /* ",*" is a valid condition. */
4201 else if (*args
!= 'S' || *name
)
4202 as_bad (_("Invalid Compare/Subtract Condition: %s"),
4206 opcode
|= cmpltr
<< 13;
4207 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 12);
4209 /* Handle a non-negated compare condition. */
4211 cmpltr
= pa_parse_nonneg_cmpsub_cmpltr (&s
);
4214 as_bad (_("Invalid Compare/Subtract Condition"));
4217 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 13);
4219 /* Handle a 32 bit compare and branch condition. */
4222 cmpltr
= pa_parse_nonneg_cmpsub_cmpltr (&s
);
4226 cmpltr
= pa_parse_neg_cmpsub_cmpltr (&s
);
4229 as_bad (_("Invalid Compare and Branch Condition"));
4234 /* Negated condition requires an opcode change. */
4239 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 13);
4241 /* Handle a 64 bit compare and branch condition. */
4243 cmpltr
= pa_parse_cmpb_64_cmpltr (&s
);
4246 /* Negated condition requires an opcode change. */
4247 opcode
|= (cmpltr
& 8) << 26;
4250 /* Not a 64 bit cond. Give 32 bit a chance. */
4253 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
& 7, 13);
4255 /* Handle a 64 bit cmpib condition. */
4257 cmpltr
= pa_parse_cmpib_64_cmpltr (&s
);
4259 /* Not a 64 bit cond. Give 32 bit a chance. */
4262 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 13);
4264 /* Handle a logical instruction condition. */
4273 /* 64 bit conditions. */
4285 while (*s
!= ',' && *s
!= ' ' && *s
!= '\t')
4290 if (strcmp (name
, "=") == 0)
4292 else if (strcmp (name
, "<") == 0)
4294 else if (strcmp (name
, "<=") == 0)
4296 else if (strcasecmp (name
, "od") == 0)
4298 else if (strcasecmp (name
, "tr") == 0)
4303 else if (strcmp (name
, "<>") == 0)
4308 else if (strcmp (name
, ">=") == 0)
4313 else if (strcmp (name
, ">") == 0)
4318 else if (strcasecmp (name
, "ev") == 0)
4323 /* ",*" is a valid condition. */
4324 else if (*args
!= 'L' || *name
)
4325 as_bad (_("Invalid Logical Instruction Condition."));
4328 opcode
|= cmpltr
<< 13;
4329 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 12);
4331 /* Handle a shift/extract/deposit condition. */
4340 /* 64 bit conditions. */
4352 while (*s
!= ',' && *s
!= ' ' && *s
!= '\t')
4356 if (strcmp (name
, "=") == 0)
4358 else if (strcmp (name
, "<") == 0)
4360 else if (strcasecmp (name
, "od") == 0)
4362 else if (strcasecmp (name
, "tr") == 0)
4364 else if (strcmp (name
, "<>") == 0)
4366 else if (strcmp (name
, ">=") == 0)
4368 else if (strcasecmp (name
, "ev") == 0)
4370 /* Handle movb,n. Put things back the way they were.
4371 This includes moving s back to where it started. */
4372 else if (strcasecmp (name
, "n") == 0 && *args
== 'y')
4378 /* ",*" is a valid condition. */
4379 else if (*args
!= 'X' || *name
)
4380 as_bad (_("Invalid Shift/Extract/Deposit Condition."));
4383 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 13);
4385 /* Handle a unit instruction condition. */
4394 /* 64 bit conditions. */
4405 if (strncasecmp (s
, "sbz", 3) == 0)
4410 else if (strncasecmp (s
, "shz", 3) == 0)
4415 else if (strncasecmp (s
, "sdc", 3) == 0)
4420 else if (strncasecmp (s
, "sbc", 3) == 0)
4425 else if (strncasecmp (s
, "shc", 3) == 0)
4430 else if (strncasecmp (s
, "tr", 2) == 0)
4436 else if (strncasecmp (s
, "nbz", 3) == 0)
4442 else if (strncasecmp (s
, "nhz", 3) == 0)
4448 else if (strncasecmp (s
, "ndc", 3) == 0)
4454 else if (strncasecmp (s
, "nbc", 3) == 0)
4460 else if (strncasecmp (s
, "nhc", 3) == 0)
4466 else if (strncasecmp (s
, "swz", 3) == 0)
4472 else if (strncasecmp (s
, "swc", 3) == 0)
4478 else if (strncasecmp (s
, "nwz", 3) == 0)
4484 else if (strncasecmp (s
, "nwc", 3) == 0)
4490 /* ",*" is a valid condition. */
4491 else if (*args
!= 'U' || (*s
!= ' ' && *s
!= '\t'))
4492 as_bad (_("Invalid Unit Instruction Condition."));
4494 opcode
|= cmpltr
<< 13;
4495 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 12);
4503 /* Handle a nullification completer for branch instructions. */
4505 nullif
= pa_parse_nullif (&s
);
4506 INSERT_FIELD_AND_CONTINUE (opcode
, nullif
, 1);
4508 /* Handle a nullification completer for copr and spop insns. */
4510 nullif
= pa_parse_nullif (&s
);
4511 INSERT_FIELD_AND_CONTINUE (opcode
, nullif
, 5);
4513 /* Handle ,%r2 completer for new syntax branches. */
4515 if (*s
== ',' && strncasecmp (s
+ 1, "%r2", 3) == 0)
4517 else if (*s
== ',' && strncasecmp (s
+ 1, "%rp", 3) == 0)
4523 /* Handle 3 bit entry into the fp compare array. Valid values
4524 are 0..6 inclusive. */
4528 if (the_insn
.exp
.X_op
== O_constant
)
4530 num
= evaluate_absolute (&the_insn
);
4531 CHECK_FIELD (num
, 6, 0, 0);
4533 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 13);
4538 /* Handle 3 bit entry into the fp compare array. Valid values
4539 are 0..6 inclusive. */
4542 if (the_insn
.exp
.X_op
== O_constant
)
4545 num
= evaluate_absolute (&the_insn
);
4546 CHECK_FIELD (num
, 6, 0, 0);
4547 num
= (num
+ 1) ^ 1;
4548 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 13);
4553 /* Handle graphics test completers for ftest */
4556 num
= pa_parse_ftest_gfx_completer (&s
);
4557 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
4560 /* Handle a 11 bit immediate at 31. */
4562 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4565 if (the_insn
.exp
.X_op
== O_constant
)
4567 num
= evaluate_absolute (&the_insn
);
4568 CHECK_FIELD (num
, 1023, -1024, 0);
4569 num
= low_sign_unext (num
, 11);
4570 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
4574 if (is_DP_relative (the_insn
.exp
))
4575 the_insn
.reloc
= R_HPPA_GOTOFF
;
4576 else if (is_PC_relative (the_insn
.exp
))
4577 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
4579 else if (is_tls_gdidx (the_insn
.exp
))
4580 the_insn
.reloc
= R_PARISC_TLS_GD21L
;
4581 else if (is_tls_ldidx (the_insn
.exp
))
4582 the_insn
.reloc
= R_PARISC_TLS_LDM21L
;
4583 else if (is_tls_dtpoff (the_insn
.exp
))
4584 the_insn
.reloc
= R_PARISC_TLS_LDO21L
;
4585 else if (is_tls_ieoff (the_insn
.exp
))
4586 the_insn
.reloc
= R_PARISC_TLS_IE21L
;
4587 else if (is_tls_leoff (the_insn
.exp
))
4588 the_insn
.reloc
= R_PARISC_TLS_LE21L
;
4591 the_insn
.reloc
= R_HPPA
;
4592 the_insn
.format
= 11;
4596 /* Handle a 14 bit immediate at 31. */
4598 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4601 if (the_insn
.exp
.X_op
== O_constant
)
4605 /* XXX the completer stored away tidbits of information
4606 for us to extract. We need a cleaner way to do this.
4607 Now that we have lots of letters again, it would be
4608 good to rethink this. */
4611 num
= evaluate_absolute (&the_insn
);
4612 if (mb
!= (num
< 0))
4614 CHECK_FIELD (num
, 8191, -8192, 0);
4615 num
= low_sign_unext (num
, 14);
4616 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
4620 /* Handle a 14 bit immediate at 31. */
4622 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4625 if (the_insn
.exp
.X_op
== O_constant
)
4631 num
= evaluate_absolute (&the_insn
);
4632 if (mb
== (num
< 0))
4636 CHECK_FIELD (num
, 8191, -8192, 0);
4637 num
= low_sign_unext (num
, 14);
4638 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
4642 /* Handle a 16 bit immediate at 31. */
4644 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4647 if (the_insn
.exp
.X_op
== O_constant
)
4653 num
= evaluate_absolute (&the_insn
);
4654 if (mb
!= (num
< 0))
4656 CHECK_FIELD (num
, 32767, -32768, 0);
4657 num
= re_assemble_16 (num
);
4658 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
4662 /* Handle a 16 bit immediate at 31. */
4664 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4667 if (the_insn
.exp
.X_op
== O_constant
)
4673 num
= evaluate_absolute (&the_insn
);
4674 if (mb
== (num
< 0))
4678 CHECK_FIELD (num
, 32767, -32768, 0);
4679 num
= re_assemble_16 (num
);
4680 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
4684 /* Handle 14 bit immediate, shifted left three times. */
4686 if (bfd_get_mach (stdoutput
) != pa20
)
4688 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4691 if (the_insn
.exp
.X_op
== O_constant
)
4693 num
= evaluate_absolute (&the_insn
);
4696 CHECK_FIELD (num
, 8191, -8192, 0);
4701 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 4);
4705 if (is_DP_relative (the_insn
.exp
))
4706 the_insn
.reloc
= R_HPPA_GOTOFF
;
4707 else if (is_PC_relative (the_insn
.exp
))
4708 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
4710 else if (is_tls_gdidx (the_insn
.exp
))
4711 the_insn
.reloc
= R_PARISC_TLS_GD21L
;
4712 else if (is_tls_ldidx (the_insn
.exp
))
4713 the_insn
.reloc
= R_PARISC_TLS_LDM21L
;
4714 else if (is_tls_dtpoff (the_insn
.exp
))
4715 the_insn
.reloc
= R_PARISC_TLS_LDO21L
;
4716 else if (is_tls_ieoff (the_insn
.exp
))
4717 the_insn
.reloc
= R_PARISC_TLS_IE21L
;
4718 else if (is_tls_leoff (the_insn
.exp
))
4719 the_insn
.reloc
= R_PARISC_TLS_LE21L
;
4722 the_insn
.reloc
= R_HPPA
;
4723 the_insn
.format
= 14;
4728 /* Handle 14 bit immediate, shifted left twice. */
4730 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4733 if (the_insn
.exp
.X_op
== O_constant
)
4735 num
= evaluate_absolute (&the_insn
);
4738 CHECK_FIELD (num
, 8191, -8192, 0);
4743 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 3);
4747 if (is_DP_relative (the_insn
.exp
))
4748 the_insn
.reloc
= R_HPPA_GOTOFF
;
4749 else if (is_PC_relative (the_insn
.exp
))
4750 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
4752 else if (is_tls_gdidx (the_insn
.exp
))
4753 the_insn
.reloc
= R_PARISC_TLS_GD21L
;
4754 else if (is_tls_ldidx (the_insn
.exp
))
4755 the_insn
.reloc
= R_PARISC_TLS_LDM21L
;
4756 else if (is_tls_dtpoff (the_insn
.exp
))
4757 the_insn
.reloc
= R_PARISC_TLS_LDO21L
;
4758 else if (is_tls_ieoff (the_insn
.exp
))
4759 the_insn
.reloc
= R_PARISC_TLS_IE21L
;
4760 else if (is_tls_leoff (the_insn
.exp
))
4761 the_insn
.reloc
= R_PARISC_TLS_LE21L
;
4764 the_insn
.reloc
= R_HPPA
;
4765 the_insn
.format
= 14;
4769 /* Handle a 14 bit immediate at 31. */
4771 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4774 if (the_insn
.exp
.X_op
== O_constant
)
4776 num
= evaluate_absolute (&the_insn
);
4777 CHECK_FIELD (num
, 8191, -8192, 0);
4778 num
= low_sign_unext (num
, 14);
4779 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
4783 if (is_DP_relative (the_insn
.exp
))
4784 the_insn
.reloc
= R_HPPA_GOTOFF
;
4785 else if (is_PC_relative (the_insn
.exp
))
4786 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
4788 else if (is_tls_gdidx (the_insn
.exp
))
4789 the_insn
.reloc
= R_PARISC_TLS_GD21L
;
4790 else if (is_tls_ldidx (the_insn
.exp
))
4791 the_insn
.reloc
= R_PARISC_TLS_LDM21L
;
4792 else if (is_tls_dtpoff (the_insn
.exp
))
4793 the_insn
.reloc
= R_PARISC_TLS_LDO21L
;
4794 else if (is_tls_ieoff (the_insn
.exp
))
4795 the_insn
.reloc
= R_PARISC_TLS_IE21L
;
4796 else if (is_tls_leoff (the_insn
.exp
))
4797 the_insn
.reloc
= R_PARISC_TLS_LE21L
;
4800 the_insn
.reloc
= R_HPPA
;
4801 the_insn
.format
= 14;
4805 /* Handle a 21 bit immediate at 31. */
4807 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4810 if (the_insn
.exp
.X_op
== O_constant
)
4812 num
= evaluate_absolute (&the_insn
);
4813 CHECK_FIELD (num
>> 11, 1048575, -1048576, 0);
4814 opcode
|= re_assemble_21 (num
);
4819 if (is_DP_relative (the_insn
.exp
))
4820 the_insn
.reloc
= R_HPPA_GOTOFF
;
4821 else if (is_PC_relative (the_insn
.exp
))
4822 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
4824 else if (is_tls_gdidx (the_insn
.exp
))
4825 the_insn
.reloc
= R_PARISC_TLS_GD21L
;
4826 else if (is_tls_ldidx (the_insn
.exp
))
4827 the_insn
.reloc
= R_PARISC_TLS_LDM21L
;
4828 else if (is_tls_dtpoff (the_insn
.exp
))
4829 the_insn
.reloc
= R_PARISC_TLS_LDO21L
;
4830 else if (is_tls_ieoff (the_insn
.exp
))
4831 the_insn
.reloc
= R_PARISC_TLS_IE21L
;
4832 else if (is_tls_leoff (the_insn
.exp
))
4833 the_insn
.reloc
= R_PARISC_TLS_LE21L
;
4836 the_insn
.reloc
= R_HPPA
;
4837 the_insn
.format
= 21;
4841 /* Handle a 16 bit immediate at 31 (PA 2.0 wide mode only). */
4843 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4846 if (the_insn
.exp
.X_op
== O_constant
)
4848 num
= evaluate_absolute (&the_insn
);
4849 CHECK_FIELD (num
, 32767, -32768, 0);
4850 opcode
|= re_assemble_16 (num
);
4855 /* ??? Is this valid for wide mode? */
4856 if (is_DP_relative (the_insn
.exp
))
4857 the_insn
.reloc
= R_HPPA_GOTOFF
;
4858 else if (is_PC_relative (the_insn
.exp
))
4859 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
4861 else if (is_tls_gdidx (the_insn
.exp
))
4862 the_insn
.reloc
= R_PARISC_TLS_GD21L
;
4863 else if (is_tls_ldidx (the_insn
.exp
))
4864 the_insn
.reloc
= R_PARISC_TLS_LDM21L
;
4865 else if (is_tls_dtpoff (the_insn
.exp
))
4866 the_insn
.reloc
= R_PARISC_TLS_LDO21L
;
4867 else if (is_tls_ieoff (the_insn
.exp
))
4868 the_insn
.reloc
= R_PARISC_TLS_IE21L
;
4869 else if (is_tls_leoff (the_insn
.exp
))
4870 the_insn
.reloc
= R_PARISC_TLS_LE21L
;
4873 the_insn
.reloc
= R_HPPA
;
4874 the_insn
.format
= 14;
4878 /* Handle a word-aligned 16-bit imm. at 31 (PA2.0 wide). */
4880 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4883 if (the_insn
.exp
.X_op
== O_constant
)
4885 num
= evaluate_absolute (&the_insn
);
4886 CHECK_FIELD (num
, 32767, -32768, 0);
4887 CHECK_ALIGN (num
, 4, 0);
4888 opcode
|= re_assemble_16 (num
);
4893 /* ??? Is this valid for wide mode? */
4894 if (is_DP_relative (the_insn
.exp
))
4895 the_insn
.reloc
= R_HPPA_GOTOFF
;
4896 else if (is_PC_relative (the_insn
.exp
))
4897 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
4899 else if (is_tls_gdidx (the_insn
.exp
))
4900 the_insn
.reloc
= R_PARISC_TLS_GD21L
;
4901 else if (is_tls_ldidx (the_insn
.exp
))
4902 the_insn
.reloc
= R_PARISC_TLS_LDM21L
;
4903 else if (is_tls_dtpoff (the_insn
.exp
))
4904 the_insn
.reloc
= R_PARISC_TLS_LDO21L
;
4905 else if (is_tls_ieoff (the_insn
.exp
))
4906 the_insn
.reloc
= R_PARISC_TLS_IE21L
;
4907 else if (is_tls_leoff (the_insn
.exp
))
4908 the_insn
.reloc
= R_PARISC_TLS_LE21L
;
4911 the_insn
.reloc
= R_HPPA
;
4912 the_insn
.format
= 14;
4916 /* Handle a dword-aligned 16-bit imm. at 31 (PA2.0 wide). */
4918 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4921 if (the_insn
.exp
.X_op
== O_constant
)
4923 num
= evaluate_absolute (&the_insn
);
4924 CHECK_FIELD (num
, 32767, -32768, 0);
4925 CHECK_ALIGN (num
, 8, 0);
4926 opcode
|= re_assemble_16 (num
);
4931 /* ??? Is this valid for wide mode? */
4932 if (is_DP_relative (the_insn
.exp
))
4933 the_insn
.reloc
= R_HPPA_GOTOFF
;
4934 else if (is_PC_relative (the_insn
.exp
))
4935 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
4937 else if (is_tls_gdidx (the_insn
.exp
))
4938 the_insn
.reloc
= R_PARISC_TLS_GD21L
;
4939 else if (is_tls_ldidx (the_insn
.exp
))
4940 the_insn
.reloc
= R_PARISC_TLS_LDM21L
;
4941 else if (is_tls_dtpoff (the_insn
.exp
))
4942 the_insn
.reloc
= R_PARISC_TLS_LDO21L
;
4943 else if (is_tls_ieoff (the_insn
.exp
))
4944 the_insn
.reloc
= R_PARISC_TLS_IE21L
;
4945 else if (is_tls_leoff (the_insn
.exp
))
4946 the_insn
.reloc
= R_PARISC_TLS_LE21L
;
4949 the_insn
.reloc
= R_HPPA
;
4950 the_insn
.format
= 14;
4954 /* Handle a 12 bit branch displacement. */
4956 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4960 if (!the_insn
.exp
.X_add_symbol
4961 || !strcmp (S_GET_NAME (the_insn
.exp
.X_add_symbol
),
4964 num
= evaluate_absolute (&the_insn
);
4967 as_bad (_("Branch to unaligned address"));
4970 if (the_insn
.exp
.X_add_symbol
)
4972 CHECK_FIELD (num
, 8191, -8192, 0);
4973 opcode
|= re_assemble_12 (num
>> 2);
4978 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
4979 the_insn
.format
= 12;
4980 the_insn
.arg_reloc
= last_call_desc
.arg_reloc
;
4981 memset (&last_call_desc
, 0, sizeof (struct call_desc
));
4986 /* Handle a 17 bit branch displacement. */
4988 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4992 if (!the_insn
.exp
.X_add_symbol
4993 || !strcmp (S_GET_NAME (the_insn
.exp
.X_add_symbol
),
4996 num
= evaluate_absolute (&the_insn
);
4999 as_bad (_("Branch to unaligned address"));
5002 if (the_insn
.exp
.X_add_symbol
)
5004 CHECK_FIELD (num
, 262143, -262144, 0);
5005 opcode
|= re_assemble_17 (num
>> 2);
5010 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
5011 the_insn
.format
= 17;
5012 the_insn
.arg_reloc
= last_call_desc
.arg_reloc
;
5013 memset (&last_call_desc
, 0, sizeof (struct call_desc
));
5017 /* Handle a 22 bit branch displacement. */
5019 the_insn
.field_selector
= pa_chk_field_selector (&s
);
5023 if (!the_insn
.exp
.X_add_symbol
5024 || !strcmp (S_GET_NAME (the_insn
.exp
.X_add_symbol
),
5027 num
= evaluate_absolute (&the_insn
);
5030 as_bad (_("Branch to unaligned address"));
5033 if (the_insn
.exp
.X_add_symbol
)
5035 CHECK_FIELD (num
, 8388607, -8388608, 0);
5036 opcode
|= re_assemble_22 (num
>> 2);
5040 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
5041 the_insn
.format
= 22;
5042 the_insn
.arg_reloc
= last_call_desc
.arg_reloc
;
5043 memset (&last_call_desc
, 0, sizeof (struct call_desc
));
5047 /* Handle an absolute 17 bit branch target. */
5049 the_insn
.field_selector
= pa_chk_field_selector (&s
);
5053 if (!the_insn
.exp
.X_add_symbol
5054 || !strcmp (S_GET_NAME (the_insn
.exp
.X_add_symbol
),
5057 num
= evaluate_absolute (&the_insn
);
5060 as_bad (_("Branch to unaligned address"));
5063 if (the_insn
.exp
.X_add_symbol
)
5065 CHECK_FIELD (num
, 262143, -262144, 0);
5066 opcode
|= re_assemble_17 (num
>> 2);
5071 the_insn
.reloc
= R_HPPA_ABS_CALL
;
5072 the_insn
.format
= 17;
5073 the_insn
.arg_reloc
= last_call_desc
.arg_reloc
;
5074 memset (&last_call_desc
, 0, sizeof (struct call_desc
));
5078 /* Handle '%r1' implicit operand of addil instruction. */
5080 if (*s
== ',' && *(s
+ 1) == '%' && *(s
+ 3) == '1'
5081 && (*(s
+ 2) == 'r' || *(s
+ 2) == 'R'))
5089 /* Handle '%sr0,%r31' implicit operand of be,l instruction. */
5091 if (strncasecmp (s
, "%sr0,%r31", 9) != 0)
5096 /* Handle immediate value of 0 for ordered load/store instructions. */
5103 /* Handle a 2 bit shift count at 25. */
5105 num
= pa_get_absolute_expression (&the_insn
, &s
);
5106 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5109 CHECK_FIELD (num
, 3, 1, strict
);
5110 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 6);
5112 /* Handle a 4 bit shift count at 25. */
5114 num
= pa_get_absolute_expression (&the_insn
, &s
);
5115 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5118 CHECK_FIELD (num
, 15, 0, strict
);
5119 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 6);
5121 /* Handle a 5 bit shift count at 26. */
5123 num
= pa_get_absolute_expression (&the_insn
, &s
);
5124 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5127 CHECK_FIELD (num
, 31, 0, strict
);
5128 INSERT_FIELD_AND_CONTINUE (opcode
, 31 - num
, 5);
5130 /* Handle a 6 bit shift count at 20,22:26. */
5132 num
= pa_get_absolute_expression (&the_insn
, &s
);
5133 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5136 CHECK_FIELD (num
, 63, 0, strict
);
5138 opcode
|= (num
& 0x20) << 6;
5139 INSERT_FIELD_AND_CONTINUE (opcode
, num
& 0x1f, 5);
5141 /* Handle a 6 bit field length at 23,27:31. */
5144 num
= pa_get_absolute_expression (&the_insn
, &s
);
5145 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5148 CHECK_FIELD (num
, 64, 1, strict
);
5150 opcode
|= (num
& 0x20) << 3;
5151 num
= 31 - (num
& 0x1f);
5152 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5154 /* Handle a 6 bit field length at 19,27:31. */
5156 num
= pa_get_absolute_expression (&the_insn
, &s
);
5157 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5160 CHECK_FIELD (num
, 64, 1, strict
);
5162 opcode
|= (num
& 0x20) << 7;
5163 num
= 31 - (num
& 0x1f);
5164 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5166 /* Handle a 5 bit bit position at 26. */
5168 num
= pa_get_absolute_expression (&the_insn
, &s
);
5169 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5172 CHECK_FIELD (num
, 31, 0, strict
);
5173 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 5);
5175 /* Handle a 6 bit bit position at 20,22:26. */
5177 num
= pa_get_absolute_expression (&the_insn
, &s
);
5178 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5181 CHECK_FIELD (num
, 63, 0, strict
);
5182 opcode
|= (num
& 0x20) << 6;
5183 INSERT_FIELD_AND_CONTINUE (opcode
, num
& 0x1f, 5);
5185 /* Handle a 5 bit immediate at 10 with 'd' as the complement
5186 of the high bit of the immediate. */
5188 num
= pa_get_absolute_expression (&the_insn
, &s
);
5189 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5192 CHECK_FIELD (num
, 63, 0, strict
);
5196 opcode
|= (1 << 13);
5197 INSERT_FIELD_AND_CONTINUE (opcode
, num
& 0x1f, 21);
5199 /* Handle a 5 bit immediate at 10. */
5201 num
= pa_get_absolute_expression (&the_insn
, &s
);
5202 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5205 CHECK_FIELD (num
, 31, 0, strict
);
5206 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 21);
5208 /* Handle a 9 bit immediate at 28. */
5210 num
= pa_get_absolute_expression (&the_insn
, &s
);
5211 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5214 CHECK_FIELD (num
, 511, 1, strict
);
5215 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 3);
5217 /* Handle a 13 bit immediate at 18. */
5219 num
= pa_get_absolute_expression (&the_insn
, &s
);
5220 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5223 CHECK_FIELD (num
, 8191, 0, strict
);
5224 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 13);
5226 /* Handle a 26 bit immediate at 31. */
5228 num
= pa_get_absolute_expression (&the_insn
, &s
);
5229 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5232 CHECK_FIELD (num
, 67108863, 0, strict
);
5233 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5235 /* Handle a 3 bit SFU identifier at 25. */
5238 as_bad (_("Invalid SFU identifier"));
5239 num
= pa_get_absolute_expression (&the_insn
, &s
);
5240 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5243 CHECK_FIELD (num
, 7, 0, strict
);
5244 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 6);
5246 /* Handle a 20 bit SOP field for spop0. */
5248 num
= pa_get_absolute_expression (&the_insn
, &s
);
5249 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5252 CHECK_FIELD (num
, 1048575, 0, strict
);
5253 num
= (num
& 0x1f) | ((num
& 0x000fffe0) << 6);
5254 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5256 /* Handle a 15bit SOP field for spop1. */
5258 num
= pa_get_absolute_expression (&the_insn
, &s
);
5259 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5262 CHECK_FIELD (num
, 32767, 0, strict
);
5263 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 11);
5265 /* Handle a 10bit SOP field for spop3. */
5267 num
= pa_get_absolute_expression (&the_insn
, &s
);
5268 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5271 CHECK_FIELD (num
, 1023, 0, strict
);
5272 num
= (num
& 0x1f) | ((num
& 0x000003e0) << 6);
5273 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5275 /* Handle a 15 bit SOP field for spop2. */
5277 num
= pa_get_absolute_expression (&the_insn
, &s
);
5278 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5281 CHECK_FIELD (num
, 32767, 0, strict
);
5282 num
= (num
& 0x1f) | ((num
& 0x00007fe0) << 6);
5283 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5285 /* Handle a 3-bit co-processor ID field. */
5288 as_bad (_("Invalid COPR identifier"));
5289 num
= pa_get_absolute_expression (&the_insn
, &s
);
5290 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5293 CHECK_FIELD (num
, 7, 0, strict
);
5294 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 6);
5296 /* Handle a 22bit SOP field for copr. */
5298 num
= pa_get_absolute_expression (&the_insn
, &s
);
5299 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5302 CHECK_FIELD (num
, 4194303, 0, strict
);
5303 num
= (num
& 0x1f) | ((num
& 0x003fffe0) << 4);
5304 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5306 /* Handle a source FP operand format completer. */
5308 if (*s
== ',' && *(s
+1) == 't')
5315 flag
= pa_parse_fp_cnv_format (&s
);
5316 the_insn
.fpof1
= flag
;
5317 if (flag
== W
|| flag
== UW
)
5319 if (flag
== DW
|| flag
== UDW
)
5321 if (flag
== QW
|| flag
== UQW
)
5323 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
5325 /* Handle a destination FP operand format completer. */
5327 /* pa_parse_format needs the ',' prefix. */
5329 flag
= pa_parse_fp_cnv_format (&s
);
5330 the_insn
.fpof2
= flag
;
5331 if (flag
== W
|| flag
== UW
)
5333 if (flag
== DW
|| flag
== UDW
)
5335 if (flag
== QW
|| flag
== UQW
)
5337 opcode
|= flag
<< 13;
5338 if (the_insn
.fpof1
== SGL
5339 || the_insn
.fpof1
== DBL
5340 || the_insn
.fpof1
== QUAD
)
5342 if (the_insn
.fpof2
== SGL
5343 || the_insn
.fpof2
== DBL
5344 || the_insn
.fpof2
== QUAD
)
5346 else if (the_insn
.fpof2
== W
5347 || the_insn
.fpof2
== DW
5348 || the_insn
.fpof2
== QW
)
5350 else if (the_insn
.fpof2
== UW
5351 || the_insn
.fpof2
== UDW
5352 || the_insn
.fpof2
== UQW
)
5357 else if (the_insn
.fpof1
== W
5358 || the_insn
.fpof1
== DW
5359 || the_insn
.fpof1
== QW
)
5361 if (the_insn
.fpof2
== SGL
5362 || the_insn
.fpof2
== DBL
5363 || the_insn
.fpof2
== QUAD
)
5368 else if (the_insn
.fpof1
== UW
5369 || the_insn
.fpof1
== UDW
5370 || the_insn
.fpof1
== UQW
)
5372 if (the_insn
.fpof2
== SGL
5373 || the_insn
.fpof2
== DBL
5374 || the_insn
.fpof2
== QUAD
)
5379 flag
|= the_insn
.trunc
;
5380 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 15);
5382 /* Handle a source FP operand format completer. */
5384 flag
= pa_parse_fp_format (&s
);
5385 the_insn
.fpof1
= flag
;
5386 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
5388 /* Handle a destination FP operand format completer. */
5390 /* pa_parse_format needs the ',' prefix. */
5392 flag
= pa_parse_fp_format (&s
);
5393 the_insn
.fpof2
= flag
;
5394 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 13);
5396 /* Handle a source FP operand format completer at 20. */
5398 flag
= pa_parse_fp_format (&s
);
5399 the_insn
.fpof1
= flag
;
5400 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
5402 /* Handle a floating point operand format at 26.
5403 Only allows single and double precision. */
5405 flag
= pa_parse_fp_format (&s
);
5411 the_insn
.fpof1
= flag
;
5417 as_bad (_("Invalid Floating Point Operand Format."));
5421 /* Handle all floating point registers. */
5425 /* Float target register. */
5427 if (!pa_parse_number (&s
, 3))
5429 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5430 CHECK_FIELD (num
, 31, 0, 0);
5431 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5433 /* Float target register with L/R selection. */
5436 if (!pa_parse_number (&s
, 1))
5438 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5439 CHECK_FIELD (num
, 31, 0, 0);
5442 /* 0x30 opcodes are FP arithmetic operation opcodes
5443 and need to be turned into 0x38 opcodes. This
5444 is not necessary for loads/stores. */
5445 if (need_pa11_opcode ()
5446 && ((opcode
& 0xfc000000) == 0x30000000))
5449 opcode
|= (pa_number
& FP_REG_RSEL
? 1 << 6 : 0);
5453 /* Float operand 1. */
5456 if (!pa_parse_number (&s
, 1))
5458 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5459 CHECK_FIELD (num
, 31, 0, 0);
5460 opcode
|= num
<< 21;
5461 if (need_pa11_opcode ())
5463 opcode
|= (pa_number
& FP_REG_RSEL
? 1 << 7 : 0);
5469 /* Float operand 1 with L/R selection. */
5473 if (!pa_parse_number (&s
, 1))
5475 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5476 CHECK_FIELD (num
, 31, 0, 0);
5477 opcode
|= num
<< 21;
5478 opcode
|= (pa_number
& FP_REG_RSEL
? 1 << 7 : 0);
5482 /* Float operand 2. */
5485 if (!pa_parse_number (&s
, 1))
5487 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5488 CHECK_FIELD (num
, 31, 0, 0);
5489 opcode
|= num
<< 16;
5490 if (need_pa11_opcode ())
5492 opcode
|= (pa_number
& FP_REG_RSEL
? 1 << 12 : 0);
5498 /* Float operand 2 with L/R selection. */
5501 if (!pa_parse_number (&s
, 1))
5503 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5504 CHECK_FIELD (num
, 31, 0, 0);
5505 opcode
|= num
<< 16;
5506 opcode
|= (pa_number
& FP_REG_RSEL
? 1 << 12 : 0);
5510 /* Float operand 3 for fmpyfadd, fmpynfadd. */
5513 if (!pa_parse_number (&s
, 1))
5515 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5516 CHECK_FIELD (num
, 31, 0, 0);
5517 opcode
|= (num
& 0x1c) << 11;
5518 opcode
|= (num
& 0x03) << 9;
5519 opcode
|= (pa_number
& FP_REG_RSEL
? 1 << 8 : 0);
5523 /* Float mult operand 1 for fmpyadd, fmpysub */
5526 if (!pa_parse_number (&s
, 1))
5528 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5529 CHECK_FIELD (num
, 31, 0, 0);
5530 if (the_insn
.fpof1
== SGL
)
5534 as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5538 num
|= (pa_number
& FP_REG_RSEL
? 1 << 4 : 0);
5540 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 21);
5543 /* Float mult operand 2 for fmpyadd, fmpysub */
5546 if (!pa_parse_number (&s
, 1))
5548 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5549 CHECK_FIELD (num
, 31, 0, 0);
5550 if (the_insn
.fpof1
== SGL
)
5554 as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5558 num
|= (pa_number
& FP_REG_RSEL
? 1 << 4 : 0);
5560 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 16);
5563 /* Float mult target for fmpyadd, fmpysub */
5566 if (!pa_parse_number (&s
, 1))
5568 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5569 CHECK_FIELD (num
, 31, 0, 0);
5570 if (the_insn
.fpof1
== SGL
)
5574 as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5578 num
|= (pa_number
& FP_REG_RSEL
? 1 << 4 : 0);
5580 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5583 /* Float add operand 1 for fmpyadd, fmpysub */
5586 if (!pa_parse_number (&s
, 1))
5588 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5589 CHECK_FIELD (num
, 31, 0, 0);
5590 if (the_insn
.fpof1
== SGL
)
5594 as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5598 num
|= (pa_number
& FP_REG_RSEL
? 1 << 4 : 0);
5600 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 6);
5603 /* Float add target for fmpyadd, fmpysub */
5606 if (!pa_parse_number (&s
, 1))
5608 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5609 CHECK_FIELD (num
, 31, 0, 0);
5610 if (the_insn
.fpof1
== SGL
)
5614 as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5618 num
|= (pa_number
& FP_REG_RSEL
? 1 << 4 : 0);
5620 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 11);
5623 /* Handle L/R register halves like 'x'. */
5627 if (!pa_parse_number (&s
, 1))
5629 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5630 CHECK_FIELD (num
, 31, 0, 0);
5631 opcode
|= num
<< 16;
5632 if (need_pa11_opcode ())
5634 opcode
|= (pa_number
& FP_REG_RSEL
? 1 << 1 : 0);
5639 /* Float target register (PA 2.0 wide). */
5641 if (!pa_parse_number (&s
, 3))
5643 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5644 CHECK_FIELD (num
, 31, 0, 0);
5645 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 16);
5658 /* If this instruction is specific to a particular architecture,
5659 then set a new architecture. This automatic promotion crud is
5660 for compatibility with HP's old assemblers only. */
5662 && bfd_get_mach (stdoutput
) < insn
->arch
5663 && !bfd_set_arch_mach (stdoutput
, bfd_arch_hppa
, insn
->arch
))
5665 as_warn (_("could not update architecture and machine"));
5670 /* Check if the args matched. */
5673 if (&insn
[1] - pa_opcodes
< (int) NUMOPCODES
5674 && !strcmp (insn
->name
, insn
[1].name
))
5682 as_bad (_("Invalid operands %s"), error_message
);
5689 the_insn
.opcode
= opcode
;
5692 /* Assemble a single instruction storing it into a frag. */
5695 md_assemble (char *str
)
5699 /* The had better be something to assemble. */
5702 /* If we are within a procedure definition, make sure we've
5703 defined a label for the procedure; handle case where the
5704 label was defined after the .PROC directive.
5706 Note there's not need to diddle with the segment or fragment
5707 for the label symbol in this case. We have already switched
5708 into the new $CODE$ subspace at this point. */
5709 if (within_procedure
&& last_call_info
->start_symbol
== NULL
)
5711 label_symbol_struct
*label_symbol
= pa_get_label ();
5715 if (label_symbol
->lss_label
)
5717 last_call_info
->start_symbol
= label_symbol
->lss_label
;
5718 symbol_get_bfdsym (label_symbol
->lss_label
)->flags
5721 /* Also handle allocation of a fixup to hold the unwind
5722 information when the label appears after the proc/procend. */
5723 if (within_entry_exit
)
5728 where
= frag_more (0);
5729 u
= UNWIND_LOW32 (&last_call_info
->ci_unwind
.descriptor
);
5730 fix_new_hppa (frag_now
, where
- frag_now
->fr_literal
, 0,
5731 NULL
, (offsetT
) 0, NULL
,
5732 0, R_HPPA_ENTRY
, e_fsel
, 0, 0, u
);
5737 as_bad (_("Missing function name for .PROC (corrupted label chain)"));
5740 as_bad (_("Missing function name for .PROC"));
5743 /* Assemble the instruction. Results are saved into "the_insn". */
5746 /* Get somewhere to put the assembled instruction. */
5749 /* Output the opcode. */
5750 md_number_to_chars (to
, the_insn
.opcode
, 4);
5752 /* If necessary output more stuff. */
5753 if (the_insn
.reloc
!= R_HPPA_NONE
)
5754 fix_new_hppa (frag_now
, (to
- frag_now
->fr_literal
), 4, NULL
,
5755 (offsetT
) 0, &the_insn
.exp
, the_insn
.pcrel
,
5756 the_insn
.reloc
, the_insn
.field_selector
,
5757 the_insn
.format
, the_insn
.arg_reloc
, 0);
5760 dwarf2_emit_insn (4);
5765 /* Handle an alignment directive. Special so that we can update the
5766 alignment of the subspace if necessary. */
5768 pa_align (int bytes
)
5770 /* We must have a valid space and subspace. */
5771 pa_check_current_space_and_subspace ();
5773 /* Let the generic gas code do most of the work. */
5774 s_align_bytes (bytes
);
5776 /* If bytes is a power of 2, then update the current subspace's
5777 alignment if necessary. */
5778 if (exact_log2 (bytes
) != -1)
5779 record_alignment (current_subspace
->ssd_seg
, exact_log2 (bytes
));
5783 /* Handle a .BLOCK type pseudo-op. */
5786 pa_block (int z ATTRIBUTE_UNUSED
)
5788 unsigned int temp_size
;
5791 /* We must have a valid space and subspace. */
5792 pa_check_current_space_and_subspace ();
5795 temp_size
= get_absolute_expression ();
5797 if (temp_size
> 0x3FFFFFFF)
5799 as_bad (_("Argument to .BLOCK/.BLOCKZ must be between 0 and 0x3fffffff"));
5804 /* Always fill with zeros, that's what the HP assembler does. */
5805 char *p
= frag_var (rs_fill
, 1, 1, 0, NULL
, temp_size
, NULL
);
5809 pa_undefine_label ();
5810 demand_empty_rest_of_line ();
5813 /* Handle a .begin_brtab and .end_brtab pseudo-op. */
5816 pa_brtab (int begin ATTRIBUTE_UNUSED
)
5820 /* The BRTAB relocations are only available in SOM (to denote
5821 the beginning and end of branch tables). */
5822 char *where
= frag_more (0);
5824 fix_new_hppa (frag_now
, where
- frag_now
->fr_literal
, 0,
5825 NULL
, (offsetT
) 0, NULL
,
5826 0, begin
? R_HPPA_BEGIN_BRTAB
: R_HPPA_END_BRTAB
,
5830 demand_empty_rest_of_line ();
5833 /* Handle a .begin_try and .end_try pseudo-op. */
5836 pa_try (int begin ATTRIBUTE_UNUSED
)
5840 char *where
= frag_more (0);
5845 /* The TRY relocations are only available in SOM (to denote
5846 the beginning and end of exception handling regions). */
5848 fix_new_hppa (frag_now
, where
- frag_now
->fr_literal
, 0,
5849 NULL
, (offsetT
) 0, begin
? NULL
: &exp
,
5850 0, begin
? R_HPPA_BEGIN_TRY
: R_HPPA_END_TRY
,
5854 demand_empty_rest_of_line ();
5857 /* Do the dirty work of building a call descriptor which describes
5858 where the caller placed arguments to a function call. */
5861 pa_call_args (struct call_desc
*call_desc
)
5864 unsigned int temp
, arg_reloc
;
5866 while (!is_end_of_statement ())
5868 name
= input_line_pointer
;
5869 c
= get_symbol_end ();
5870 /* Process a source argument. */
5871 if ((strncasecmp (name
, "argw", 4) == 0))
5873 temp
= atoi (name
+ 4);
5874 p
= input_line_pointer
;
5876 input_line_pointer
++;
5877 name
= input_line_pointer
;
5878 c
= get_symbol_end ();
5879 arg_reloc
= pa_build_arg_reloc (name
);
5880 call_desc
->arg_reloc
|= pa_align_arg_reloc (temp
, arg_reloc
);
5882 /* Process a return value. */
5883 else if ((strncasecmp (name
, "rtnval", 6) == 0))
5885 p
= input_line_pointer
;
5887 input_line_pointer
++;
5888 name
= input_line_pointer
;
5889 c
= get_symbol_end ();
5890 arg_reloc
= pa_build_arg_reloc (name
);
5891 call_desc
->arg_reloc
|= (arg_reloc
& 0x3);
5895 as_bad (_("Invalid .CALL argument: %s"), name
);
5897 p
= input_line_pointer
;
5899 if (!is_end_of_statement ())
5900 input_line_pointer
++;
5904 /* Handle a .CALL pseudo-op. This involves storing away information
5905 about where arguments are to be found so the linker can detect
5906 (and correct) argument location mismatches between caller and callee. */
5909 pa_call (int unused ATTRIBUTE_UNUSED
)
5912 /* We must have a valid space and subspace. */
5913 pa_check_current_space_and_subspace ();
5916 pa_call_args (&last_call_desc
);
5917 demand_empty_rest_of_line ();
5921 /* Build an entry in the UNWIND subspace from the given function
5922 attributes in CALL_INFO. This is not needed for SOM as using
5923 R_ENTRY and R_EXIT relocations allow the linker to handle building
5924 of the unwind spaces. */
5927 pa_build_unwind_subspace (struct call_info
*call_info
)
5929 asection
*seg
, *save_seg
;
5930 subsegT save_subseg
;
5931 unsigned int unwind
;
5935 if ((bfd_get_section_flags (stdoutput
, now_seg
)
5936 & (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
))
5937 != (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
))
5940 reloc
= R_PARISC_SEGREL32
;
5942 save_subseg
= now_subseg
;
5943 /* Get into the right seg/subseg. This may involve creating
5944 the seg the first time through. Make sure to have the
5945 old seg/subseg so that we can reset things when we are done. */
5946 seg
= bfd_get_section_by_name (stdoutput
, UNWIND_SECTION_NAME
);
5947 if (seg
== ASEC_NULL
)
5949 seg
= subseg_new (UNWIND_SECTION_NAME
, 0);
5950 bfd_set_section_flags (stdoutput
, seg
,
5951 SEC_READONLY
| SEC_HAS_CONTENTS
5952 | SEC_LOAD
| SEC_RELOC
| SEC_ALLOC
| SEC_DATA
);
5953 bfd_set_section_alignment (stdoutput
, seg
, 2);
5956 subseg_set (seg
, 0);
5958 /* Get some space to hold relocation information for the unwind
5962 /* Relocation info. for start offset of the function. */
5963 md_number_to_chars (p
, 0, 4);
5964 fix_new_hppa (frag_now
, p
- frag_now
->fr_literal
, 4,
5965 call_info
->start_symbol
, (offsetT
) 0,
5966 (expressionS
*) NULL
, 0, reloc
,
5969 /* Relocation info. for end offset of the function.
5971 Because we allow reductions of 32bit relocations for ELF, this will be
5972 reduced to section_sym + offset which avoids putting the temporary
5973 symbol into the symbol table. It (should) end up giving the same
5974 value as call_info->start_symbol + function size once the linker is
5975 finished with its work. */
5976 md_number_to_chars (p
+ 4, 0, 4);
5977 fix_new_hppa (frag_now
, p
+ 4 - frag_now
->fr_literal
, 4,
5978 call_info
->end_symbol
, (offsetT
) 0,
5979 (expressionS
*) NULL
, 0, reloc
,
5982 /* Dump the descriptor. */
5983 unwind
= UNWIND_LOW32 (&call_info
->ci_unwind
.descriptor
);
5984 md_number_to_chars (p
+ 8, unwind
, 4);
5986 unwind
= UNWIND_HIGH32 (&call_info
->ci_unwind
.descriptor
);
5987 md_number_to_chars (p
+ 12, unwind
, 4);
5989 /* Return back to the original segment/subsegment. */
5990 subseg_set (save_seg
, save_subseg
);
5994 /* Process a .CALLINFO pseudo-op. This information is used later
5995 to build unwind descriptors and maybe one day to support
5996 .ENTER and .LEAVE. */
5999 pa_callinfo (int unused ATTRIBUTE_UNUSED
)
6005 /* We must have a valid space and subspace. */
6006 pa_check_current_space_and_subspace ();
6009 /* .CALLINFO must appear within a procedure definition. */
6010 if (!within_procedure
)
6011 as_bad (_(".callinfo is not within a procedure definition"));
6013 /* Mark the fact that we found the .CALLINFO for the
6014 current procedure. */
6015 callinfo_found
= TRUE
;
6017 /* Iterate over the .CALLINFO arguments. */
6018 while (!is_end_of_statement ())
6020 name
= input_line_pointer
;
6021 c
= get_symbol_end ();
6022 /* Frame size specification. */
6023 if ((strncasecmp (name
, "frame", 5) == 0))
6025 p
= input_line_pointer
;
6027 input_line_pointer
++;
6028 temp
= get_absolute_expression ();
6029 if ((temp
& 0x3) != 0)
6031 as_bad (_("FRAME parameter must be a multiple of 8: %d\n"), temp
);
6035 /* callinfo is in bytes and unwind_desc is in 8 byte units. */
6036 last_call_info
->ci_unwind
.descriptor
.frame_size
= temp
/ 8;
6039 /* Entry register (GR, GR and SR) specifications. */
6040 else if ((strncasecmp (name
, "entry_gr", 8) == 0))
6042 p
= input_line_pointer
;
6044 input_line_pointer
++;
6045 temp
= get_absolute_expression ();
6046 /* The HP assembler accepts 19 as the high bound for ENTRY_GR
6047 even though %r19 is caller saved. I think this is a bug in
6048 the HP assembler, and we are not going to emulate it. */
6049 if (temp
< 3 || temp
> 18)
6050 as_bad (_("Value for ENTRY_GR must be in the range 3..18\n"));
6051 last_call_info
->ci_unwind
.descriptor
.entry_gr
= temp
- 2;
6053 else if ((strncasecmp (name
, "entry_fr", 8) == 0))
6055 p
= input_line_pointer
;
6057 input_line_pointer
++;
6058 temp
= get_absolute_expression ();
6059 /* Similarly the HP assembler takes 31 as the high bound even
6060 though %fr21 is the last callee saved floating point register. */
6061 if (temp
< 12 || temp
> 21)
6062 as_bad (_("Value for ENTRY_FR must be in the range 12..21\n"));
6063 last_call_info
->ci_unwind
.descriptor
.entry_fr
= temp
- 11;
6065 else if ((strncasecmp (name
, "entry_sr", 8) == 0))
6067 p
= input_line_pointer
;
6069 input_line_pointer
++;
6070 temp
= get_absolute_expression ();
6072 as_bad (_("Value for ENTRY_SR must be 3\n"));
6074 /* Note whether or not this function performs any calls. */
6075 else if ((strncasecmp (name
, "calls", 5) == 0) ||
6076 (strncasecmp (name
, "caller", 6) == 0))
6078 p
= input_line_pointer
;
6081 else if ((strncasecmp (name
, "no_calls", 8) == 0))
6083 p
= input_line_pointer
;
6086 /* Should RP be saved into the stack. */
6087 else if ((strncasecmp (name
, "save_rp", 7) == 0))
6089 p
= input_line_pointer
;
6091 last_call_info
->ci_unwind
.descriptor
.save_rp
= 1;
6093 /* Likewise for SP. */
6094 else if ((strncasecmp (name
, "save_sp", 7) == 0))
6096 p
= input_line_pointer
;
6098 last_call_info
->ci_unwind
.descriptor
.save_sp
= 1;
6100 /* Is this an unwindable procedure. If so mark it so
6101 in the unwind descriptor. */
6102 else if ((strncasecmp (name
, "no_unwind", 9) == 0))
6104 p
= input_line_pointer
;
6106 last_call_info
->ci_unwind
.descriptor
.cannot_unwind
= 1;
6108 /* Is this an interrupt routine. If so mark it in the
6109 unwind descriptor. */
6110 else if ((strncasecmp (name
, "hpux_int", 7) == 0))
6112 p
= input_line_pointer
;
6114 last_call_info
->ci_unwind
.descriptor
.hpux_interrupt_marker
= 1;
6116 /* Is this a millicode routine. "millicode" isn't in my
6117 assembler manual, but my copy is old. The HP assembler
6118 accepts it, and there's a place in the unwind descriptor
6119 to drop the information, so we'll accept it too. */
6120 else if ((strncasecmp (name
, "millicode", 9) == 0))
6122 p
= input_line_pointer
;
6124 last_call_info
->ci_unwind
.descriptor
.millicode
= 1;
6128 as_bad (_("Invalid .CALLINFO argument: %s"), name
);
6129 *input_line_pointer
= c
;
6131 if (!is_end_of_statement ())
6132 input_line_pointer
++;
6135 demand_empty_rest_of_line ();
6138 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
6139 /* Switch to the text space. Like s_text, but delete our
6140 label when finished. */
6143 pa_text (int unused ATTRIBUTE_UNUSED
)
6146 current_space
= is_defined_space ("$TEXT$");
6148 = pa_subsegment_to_subspace (current_space
->sd_seg
, 0);
6152 pa_undefine_label ();
6155 /* Switch to the data space. As usual delete our label. */
6158 pa_data (int unused ATTRIBUTE_UNUSED
)
6161 current_space
= is_defined_space ("$PRIVATE$");
6163 = pa_subsegment_to_subspace (current_space
->sd_seg
, 0);
6166 pa_undefine_label ();
6169 /* This is different than the standard GAS s_comm(). On HP9000/800 machines,
6170 the .comm pseudo-op has the following syntax:
6172 <label> .comm <length>
6174 where <label> is optional and is a symbol whose address will be the start of
6175 a block of memory <length> bytes long. <length> must be an absolute
6176 expression. <length> bytes will be allocated in the current space
6179 Also note the label may not even be on the same line as the .comm.
6181 This difference in syntax means the colon function will be called
6182 on the symbol before we arrive in pa_comm. colon will set a number
6183 of attributes of the symbol that need to be fixed here. In particular
6184 the value, section pointer, fragment pointer, flags, etc. What
6187 This also makes error detection all but impossible. */
6190 pa_comm (int unused ATTRIBUTE_UNUSED
)
6194 label_symbol_struct
*label_symbol
= pa_get_label ();
6197 symbol
= label_symbol
->lss_label
;
6202 size
= get_absolute_expression ();
6206 symbol_get_bfdsym (symbol
)->flags
|= BSF_OBJECT
;
6207 S_SET_VALUE (symbol
, size
);
6208 S_SET_SEGMENT (symbol
, bfd_com_section_ptr
);
6209 S_SET_EXTERNAL (symbol
);
6211 /* colon() has already set the frag to the current location in the
6212 current subspace; we need to reset the fragment to the zero address
6213 fragment. We also need to reset the segment pointer. */
6214 symbol_set_frag (symbol
, &zero_address_frag
);
6216 demand_empty_rest_of_line ();
6218 #endif /* !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))) */
6220 /* Process a .END pseudo-op. */
6223 pa_end (int unused ATTRIBUTE_UNUSED
)
6225 demand_empty_rest_of_line ();
6228 /* Process a .ENTER pseudo-op. This is not supported. */
6231 pa_enter (int unused ATTRIBUTE_UNUSED
)
6234 /* We must have a valid space and subspace. */
6235 pa_check_current_space_and_subspace ();
6238 as_bad (_("The .ENTER pseudo-op is not supported"));
6239 demand_empty_rest_of_line ();
6242 /* Process a .ENTRY pseudo-op. .ENTRY marks the beginning of the
6246 pa_entry (int unused ATTRIBUTE_UNUSED
)
6249 /* We must have a valid space and subspace. */
6250 pa_check_current_space_and_subspace ();
6253 if (!within_procedure
)
6254 as_bad (_("Misplaced .entry. Ignored."));
6257 if (!callinfo_found
)
6258 as_bad (_("Missing .callinfo."));
6260 demand_empty_rest_of_line ();
6261 within_entry_exit
= TRUE
;
6264 /* SOM defers building of unwind descriptors until the link phase.
6265 The assembler is responsible for creating an R_ENTRY relocation
6266 to mark the beginning of a region and hold the unwind bits, and
6267 for creating an R_EXIT relocation to mark the end of the region.
6269 FIXME. ELF should be using the same conventions! The problem
6270 is an unwind requires too much relocation space. Hmmm. Maybe
6271 if we split the unwind bits up between the relocations which
6272 denote the entry and exit points. */
6273 if (last_call_info
->start_symbol
!= NULL
)
6278 where
= frag_more (0);
6279 u
= UNWIND_LOW32 (&last_call_info
->ci_unwind
.descriptor
);
6280 fix_new_hppa (frag_now
, where
- frag_now
->fr_literal
, 0,
6281 NULL
, (offsetT
) 0, NULL
,
6282 0, R_HPPA_ENTRY
, e_fsel
, 0, 0, u
);
6287 /* Silly nonsense for pa_equ. The only half-sensible use for this is
6288 being able to subtract two register symbols that specify a range of
6289 registers, to get the size of the range. */
6290 static int fudge_reg_expressions
;
6293 hppa_force_reg_syms_absolute (expressionS
*resultP
,
6294 operatorT op ATTRIBUTE_UNUSED
,
6295 expressionS
*rightP
)
6297 if (fudge_reg_expressions
6298 && rightP
->X_op
== O_register
6299 && resultP
->X_op
== O_register
)
6301 rightP
->X_op
= O_constant
;
6302 resultP
->X_op
= O_constant
;
6304 return 0; /* Continue normal expr handling. */
6307 /* Handle a .EQU pseudo-op. */
6312 label_symbol_struct
*label_symbol
= pa_get_label ();
6317 symbol
= label_symbol
->lss_label
;
6321 if (!pa_parse_number (&input_line_pointer
, 0))
6322 as_bad (_(".REG expression must be a register"));
6323 S_SET_VALUE (symbol
, pa_number
);
6324 S_SET_SEGMENT (symbol
, reg_section
);
6331 fudge_reg_expressions
= 1;
6332 seg
= expression (&exp
);
6333 fudge_reg_expressions
= 0;
6334 if (exp
.X_op
!= O_constant
6335 && exp
.X_op
!= O_register
)
6337 if (exp
.X_op
!= O_absent
)
6338 as_bad (_("bad or irreducible absolute expression; zero assumed"));
6339 exp
.X_add_number
= 0;
6340 seg
= absolute_section
;
6342 S_SET_VALUE (symbol
, (unsigned int) exp
.X_add_number
);
6343 S_SET_SEGMENT (symbol
, seg
);
6349 as_bad (_(".REG must use a label"));
6351 as_bad (_(".EQU must use a label"));
6354 pa_undefine_label ();
6355 demand_empty_rest_of_line ();
6359 /* Mark the end of a function so that it's possible to compute
6360 the size of the function in elf_hppa_final_processing. */
6363 hppa_elf_mark_end_of_function (void)
6365 /* ELF does not have EXIT relocations. All we do is create a
6366 temporary symbol marking the end of the function. */
6369 if (last_call_info
== NULL
|| last_call_info
->start_symbol
== NULL
)
6371 /* We have already warned about a missing label,
6372 or other problems. */
6376 name
= xmalloc (strlen ("L$\001end_")
6377 + strlen (S_GET_NAME (last_call_info
->start_symbol
))
6383 strcpy (name
, "L$\001end_");
6384 strcat (name
, S_GET_NAME (last_call_info
->start_symbol
));
6386 /* If we have a .exit followed by a .procend, then the
6387 symbol will have already been defined. */
6388 symbolP
= symbol_find (name
);
6391 /* The symbol has already been defined! This can
6392 happen if we have a .exit followed by a .procend.
6394 This is *not* an error. All we want to do is free
6395 the memory we just allocated for the name and continue. */
6400 /* symbol value should be the offset of the
6401 last instruction of the function */
6402 symbolP
= symbol_new (name
, now_seg
, (valueT
) (frag_now_fix () - 4),
6406 S_CLEAR_EXTERNAL (symbolP
);
6407 symbol_table_insert (symbolP
);
6411 last_call_info
->end_symbol
= symbolP
;
6413 as_bad (_("Symbol '%s' could not be created."), name
);
6417 as_bad (_("No memory for symbol name."));
6421 /* Helper function. Does processing for the end of a function. This
6422 usually involves creating some relocations or building special
6423 symbols to mark the end of the function. */
6430 where
= frag_more (0);
6433 /* Mark the end of the function, stuff away the location of the frag
6434 for the end of the function, and finally call pa_build_unwind_subspace
6435 to add an entry in the unwind table. */
6436 hppa_elf_mark_end_of_function ();
6437 pa_build_unwind_subspace (last_call_info
);
6439 /* SOM defers building of unwind descriptors until the link phase.
6440 The assembler is responsible for creating an R_ENTRY relocation
6441 to mark the beginning of a region and hold the unwind bits, and
6442 for creating an R_EXIT relocation to mark the end of the region.
6444 FIXME. ELF should be using the same conventions! The problem
6445 is an unwind requires too much relocation space. Hmmm. Maybe
6446 if we split the unwind bits up between the relocations which
6447 denote the entry and exit points. */
6448 fix_new_hppa (frag_now
, where
- frag_now
->fr_literal
, 0,
6450 NULL
, 0, R_HPPA_EXIT
, e_fsel
, 0, 0,
6451 UNWIND_HIGH32 (&last_call_info
->ci_unwind
.descriptor
));
6455 /* Process a .EXIT pseudo-op. */
6458 pa_exit (int unused ATTRIBUTE_UNUSED
)
6461 /* We must have a valid space and subspace. */
6462 pa_check_current_space_and_subspace ();
6465 if (!within_procedure
)
6466 as_bad (_(".EXIT must appear within a procedure"));
6469 if (!callinfo_found
)
6470 as_bad (_("Missing .callinfo"));
6473 if (!within_entry_exit
)
6474 as_bad (_("No .ENTRY for this .EXIT"));
6477 within_entry_exit
= FALSE
;
6482 demand_empty_rest_of_line ();
6485 /* Helper function to process arguments to a .EXPORT pseudo-op. */
6488 pa_type_args (symbolS
*symbolP
, int is_export
)
6491 unsigned int temp
, arg_reloc
;
6492 pa_symbol_type type
= SYMBOL_TYPE_UNKNOWN
;
6493 asymbol
*bfdsym
= symbol_get_bfdsym (symbolP
);
6495 if (strncasecmp (input_line_pointer
, "absolute", 8) == 0)
6497 input_line_pointer
+= 8;
6498 bfdsym
->flags
&= ~BSF_FUNCTION
;
6499 S_SET_SEGMENT (symbolP
, bfd_abs_section_ptr
);
6500 type
= SYMBOL_TYPE_ABSOLUTE
;
6502 else if (strncasecmp (input_line_pointer
, "code", 4) == 0)
6504 input_line_pointer
+= 4;
6505 /* IMPORTing/EXPORTing CODE types for functions is meaningless for SOM,
6506 instead one should be IMPORTing/EXPORTing ENTRY types.
6508 Complain if one tries to EXPORT a CODE type since that's never
6509 done. Both GCC and HP C still try to IMPORT CODE types, so
6510 silently fix them to be ENTRY types. */
6511 if (S_IS_FUNCTION (symbolP
))
6514 as_tsktsk (_("Using ENTRY rather than CODE in export directive for %s"),
6515 S_GET_NAME (symbolP
));
6517 bfdsym
->flags
|= BSF_FUNCTION
;
6518 type
= SYMBOL_TYPE_ENTRY
;
6522 bfdsym
->flags
&= ~BSF_FUNCTION
;
6523 type
= SYMBOL_TYPE_CODE
;
6526 else if (strncasecmp (input_line_pointer
, "data", 4) == 0)
6528 input_line_pointer
+= 4;
6529 bfdsym
->flags
&= ~BSF_FUNCTION
;
6530 bfdsym
->flags
|= BSF_OBJECT
;
6531 type
= SYMBOL_TYPE_DATA
;
6533 else if ((strncasecmp (input_line_pointer
, "entry", 5) == 0))
6535 input_line_pointer
+= 5;
6536 bfdsym
->flags
|= BSF_FUNCTION
;
6537 type
= SYMBOL_TYPE_ENTRY
;
6539 else if (strncasecmp (input_line_pointer
, "millicode", 9) == 0)
6541 input_line_pointer
+= 9;
6542 bfdsym
->flags
|= BSF_FUNCTION
;
6545 elf_symbol_type
*elfsym
= (elf_symbol_type
*) bfdsym
;
6546 elfsym
->internal_elf_sym
.st_info
=
6547 ELF_ST_INFO (ELF_ST_BIND (elfsym
->internal_elf_sym
.st_info
),
6551 type
= SYMBOL_TYPE_MILLICODE
;
6553 else if (strncasecmp (input_line_pointer
, "plabel", 6) == 0)
6555 input_line_pointer
+= 6;
6556 bfdsym
->flags
&= ~BSF_FUNCTION
;
6557 type
= SYMBOL_TYPE_PLABEL
;
6559 else if (strncasecmp (input_line_pointer
, "pri_prog", 8) == 0)
6561 input_line_pointer
+= 8;
6562 bfdsym
->flags
|= BSF_FUNCTION
;
6563 type
= SYMBOL_TYPE_PRI_PROG
;
6565 else if (strncasecmp (input_line_pointer
, "sec_prog", 8) == 0)
6567 input_line_pointer
+= 8;
6568 bfdsym
->flags
|= BSF_FUNCTION
;
6569 type
= SYMBOL_TYPE_SEC_PROG
;
6572 /* SOM requires much more information about symbol types
6573 than BFD understands. This is how we get this information
6574 to the SOM BFD backend. */
6575 #ifdef obj_set_symbol_type
6576 obj_set_symbol_type (bfdsym
, (int) type
);
6579 /* Now that the type of the exported symbol has been handled,
6580 handle any argument relocation information. */
6581 while (!is_end_of_statement ())
6583 if (*input_line_pointer
== ',')
6584 input_line_pointer
++;
6585 name
= input_line_pointer
;
6586 c
= get_symbol_end ();
6587 /* Argument sources. */
6588 if ((strncasecmp (name
, "argw", 4) == 0))
6590 p
= input_line_pointer
;
6592 input_line_pointer
++;
6593 temp
= atoi (name
+ 4);
6594 name
= input_line_pointer
;
6595 c
= get_symbol_end ();
6596 arg_reloc
= pa_align_arg_reloc (temp
, pa_build_arg_reloc (name
));
6597 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
6598 symbol_arg_reloc_info (symbolP
) |= arg_reloc
;
6600 *input_line_pointer
= c
;
6602 /* The return value. */
6603 else if ((strncasecmp (name
, "rtnval", 6)) == 0)
6605 p
= input_line_pointer
;
6607 input_line_pointer
++;
6608 name
= input_line_pointer
;
6609 c
= get_symbol_end ();
6610 arg_reloc
= pa_build_arg_reloc (name
);
6611 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
6612 symbol_arg_reloc_info (symbolP
) |= arg_reloc
;
6614 *input_line_pointer
= c
;
6616 /* Privilege level. */
6617 else if ((strncasecmp (name
, "priv_lev", 8)) == 0)
6619 p
= input_line_pointer
;
6621 input_line_pointer
++;
6622 temp
= atoi (input_line_pointer
);
6624 ((obj_symbol_type
*) bfdsym
)->tc_data
.ap
.hppa_priv_level
= temp
;
6626 c
= get_symbol_end ();
6627 *input_line_pointer
= c
;
6631 as_bad (_("Undefined .EXPORT/.IMPORT argument (ignored): %s"), name
);
6632 p
= input_line_pointer
;
6635 if (!is_end_of_statement ())
6636 input_line_pointer
++;
6640 /* Process a .EXPORT directive. This makes functions external
6641 and provides information such as argument relocation entries
6645 pa_export (int unused ATTRIBUTE_UNUSED
)
6650 name
= input_line_pointer
;
6651 c
= get_symbol_end ();
6652 /* Make sure the given symbol exists. */
6653 if ((symbol
= symbol_find_or_make (name
)) == NULL
)
6655 as_bad (_("Cannot define export symbol: %s\n"), name
);
6656 p
= input_line_pointer
;
6658 input_line_pointer
++;
6662 /* OK. Set the external bits and process argument relocations.
6663 For the HP, weak and global are not mutually exclusive.
6664 S_SET_EXTERNAL will not set BSF_GLOBAL if WEAK is set.
6665 Call S_SET_EXTERNAL to get the other processing. Manually
6666 set BSF_GLOBAL when we get back. */
6667 S_SET_EXTERNAL (symbol
);
6668 symbol_get_bfdsym (symbol
)->flags
|= BSF_GLOBAL
;
6669 p
= input_line_pointer
;
6671 if (!is_end_of_statement ())
6673 input_line_pointer
++;
6674 pa_type_args (symbol
, 1);
6678 demand_empty_rest_of_line ();
6681 /* Handle an .IMPORT pseudo-op. Any symbol referenced in a given
6682 assembly file must either be defined in the assembly file, or
6683 explicitly IMPORTED from another. */
6686 pa_import (int unused ATTRIBUTE_UNUSED
)
6691 name
= input_line_pointer
;
6692 c
= get_symbol_end ();
6694 symbol
= symbol_find (name
);
6695 /* Ugh. We might be importing a symbol defined earlier in the file,
6696 in which case all the code below will really screw things up
6697 (set the wrong segment, symbol flags & type, etc). */
6698 if (symbol
== NULL
|| !S_IS_DEFINED (symbol
))
6700 symbol
= symbol_find_or_make (name
);
6701 p
= input_line_pointer
;
6704 if (!is_end_of_statement ())
6706 input_line_pointer
++;
6707 pa_type_args (symbol
, 0);
6711 /* Sigh. To be compatible with the HP assembler and to help
6712 poorly written assembly code, we assign a type based on
6713 the current segment. Note only BSF_FUNCTION really
6714 matters, we do not need to set the full SYMBOL_TYPE_* info. */
6715 if (now_seg
== text_section
)
6716 symbol_get_bfdsym (symbol
)->flags
|= BSF_FUNCTION
;
6718 /* If the section is undefined, then the symbol is undefined
6719 Since this is an import, leave the section undefined. */
6720 S_SET_SEGMENT (symbol
, bfd_und_section_ptr
);
6725 /* The symbol was already defined. Just eat everything up to
6726 the end of the current statement. */
6727 while (!is_end_of_statement ())
6728 input_line_pointer
++;
6731 demand_empty_rest_of_line ();
6734 /* Handle a .LABEL pseudo-op. */
6737 pa_label (int unused ATTRIBUTE_UNUSED
)
6741 name
= input_line_pointer
;
6742 c
= get_symbol_end ();
6744 if (strlen (name
) > 0)
6747 p
= input_line_pointer
;
6752 as_warn (_("Missing label name on .LABEL"));
6755 if (!is_end_of_statement ())
6757 as_warn (_("extra .LABEL arguments ignored."));
6758 ignore_rest_of_line ();
6760 demand_empty_rest_of_line ();
6763 /* Handle a .LEAVE pseudo-op. This is not supported yet. */
6766 pa_leave (int unused ATTRIBUTE_UNUSED
)
6769 /* We must have a valid space and subspace. */
6770 pa_check_current_space_and_subspace ();
6773 as_bad (_("The .LEAVE pseudo-op is not supported"));
6774 demand_empty_rest_of_line ();
6777 /* Handle a .LEVEL pseudo-op. */
6780 pa_level (int unused ATTRIBUTE_UNUSED
)
6784 level
= input_line_pointer
;
6785 if (strncmp (level
, "1.0", 3) == 0)
6787 input_line_pointer
+= 3;
6788 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_hppa
, 10))
6789 as_warn (_("could not set architecture and machine"));
6791 else if (strncmp (level
, "1.1", 3) == 0)
6793 input_line_pointer
+= 3;
6794 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_hppa
, 11))
6795 as_warn (_("could not set architecture and machine"));
6797 else if (strncmp (level
, "2.0w", 4) == 0)
6799 input_line_pointer
+= 4;
6800 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_hppa
, 25))
6801 as_warn (_("could not set architecture and machine"));
6803 else if (strncmp (level
, "2.0", 3) == 0)
6805 input_line_pointer
+= 3;
6806 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_hppa
, 20))
6807 as_warn (_("could not set architecture and machine"));
6811 as_bad (_("Unrecognized .LEVEL argument\n"));
6812 ignore_rest_of_line ();
6814 demand_empty_rest_of_line ();
6817 /* Handle a .ORIGIN pseudo-op. */
6820 pa_origin (int unused ATTRIBUTE_UNUSED
)
6823 /* We must have a valid space and subspace. */
6824 pa_check_current_space_and_subspace ();
6828 pa_undefine_label ();
6831 /* Handle a .PARAM pseudo-op. This is much like a .EXPORT, except it
6832 is for static functions. FIXME. Should share more code with .EXPORT. */
6835 pa_param (int unused ATTRIBUTE_UNUSED
)
6840 name
= input_line_pointer
;
6841 c
= get_symbol_end ();
6843 if ((symbol
= symbol_find_or_make (name
)) == NULL
)
6845 as_bad (_("Cannot define static symbol: %s\n"), name
);
6846 p
= input_line_pointer
;
6848 input_line_pointer
++;
6852 S_CLEAR_EXTERNAL (symbol
);
6853 p
= input_line_pointer
;
6855 if (!is_end_of_statement ())
6857 input_line_pointer
++;
6858 pa_type_args (symbol
, 0);
6862 demand_empty_rest_of_line ();
6865 /* Handle a .PROC pseudo-op. It is used to mark the beginning
6866 of a procedure from a syntactical point of view. */
6869 pa_proc (int unused ATTRIBUTE_UNUSED
)
6871 struct call_info
*call_info
;
6874 /* We must have a valid space and subspace. */
6875 pa_check_current_space_and_subspace ();
6878 if (within_procedure
)
6879 as_fatal (_("Nested procedures"));
6881 /* Reset global variables for new procedure. */
6882 callinfo_found
= FALSE
;
6883 within_procedure
= TRUE
;
6885 /* Create another call_info structure. */
6886 call_info
= xmalloc (sizeof (struct call_info
));
6889 as_fatal (_("Cannot allocate unwind descriptor\n"));
6891 memset (call_info
, 0, sizeof (struct call_info
));
6893 call_info
->ci_next
= NULL
;
6895 if (call_info_root
== NULL
)
6897 call_info_root
= call_info
;
6898 last_call_info
= call_info
;
6902 last_call_info
->ci_next
= call_info
;
6903 last_call_info
= call_info
;
6906 /* set up defaults on call_info structure */
6908 call_info
->ci_unwind
.descriptor
.cannot_unwind
= 0;
6909 call_info
->ci_unwind
.descriptor
.region_desc
= 1;
6910 call_info
->ci_unwind
.descriptor
.hpux_interrupt_marker
= 0;
6912 /* If we got a .PROC pseudo-op, we know that the function is defined
6913 locally. Make sure it gets into the symbol table. */
6915 label_symbol_struct
*label_symbol
= pa_get_label ();
6919 if (label_symbol
->lss_label
)
6921 last_call_info
->start_symbol
= label_symbol
->lss_label
;
6922 symbol_get_bfdsym (label_symbol
->lss_label
)->flags
|= BSF_FUNCTION
;
6925 as_bad (_("Missing function name for .PROC (corrupted label chain)"));
6928 last_call_info
->start_symbol
= NULL
;
6931 demand_empty_rest_of_line ();
6934 /* Process the syntactical end of a procedure. Make sure all the
6935 appropriate pseudo-ops were found within the procedure. */
6938 pa_procend (int unused ATTRIBUTE_UNUSED
)
6941 /* We must have a valid space and subspace. */
6942 pa_check_current_space_and_subspace ();
6945 /* If we are within a procedure definition, make sure we've
6946 defined a label for the procedure; handle case where the
6947 label was defined after the .PROC directive.
6949 Note there's not need to diddle with the segment or fragment
6950 for the label symbol in this case. We have already switched
6951 into the new $CODE$ subspace at this point. */
6952 if (within_procedure
&& last_call_info
->start_symbol
== NULL
)
6954 label_symbol_struct
*label_symbol
= pa_get_label ();
6958 if (label_symbol
->lss_label
)
6960 last_call_info
->start_symbol
= label_symbol
->lss_label
;
6961 symbol_get_bfdsym (label_symbol
->lss_label
)->flags
6964 /* Also handle allocation of a fixup to hold the unwind
6965 information when the label appears after the proc/procend. */
6966 if (within_entry_exit
)
6971 where
= frag_more (0);
6972 u
= UNWIND_LOW32 (&last_call_info
->ci_unwind
.descriptor
);
6973 fix_new_hppa (frag_now
, where
- frag_now
->fr_literal
, 0,
6974 NULL
, (offsetT
) 0, NULL
,
6975 0, R_HPPA_ENTRY
, e_fsel
, 0, 0, u
);
6980 as_bad (_("Missing function name for .PROC (corrupted label chain)"));
6983 as_bad (_("Missing function name for .PROC"));
6986 if (!within_procedure
)
6987 as_bad (_("misplaced .procend"));
6989 if (!callinfo_found
)
6990 as_bad (_("Missing .callinfo for this procedure"));
6992 if (within_entry_exit
)
6993 as_bad (_("Missing .EXIT for a .ENTRY"));
6996 /* ELF needs to mark the end of each function so that it can compute
6997 the size of the function (apparently its needed in the symbol table). */
6998 hppa_elf_mark_end_of_function ();
7001 within_procedure
= FALSE
;
7002 demand_empty_rest_of_line ();
7003 pa_undefine_label ();
7007 /* If VALUE is an exact power of two between zero and 2^31, then
7008 return log2 (VALUE). Else return -1. */
7011 exact_log2 (int value
)
7015 while ((1 << shift
) != value
&& shift
< 32)
7024 /* Check to make sure we have a valid space and subspace. */
7027 pa_check_current_space_and_subspace (void)
7029 if (current_space
== NULL
)
7030 as_fatal (_("Not in a space.\n"));
7032 if (current_subspace
== NULL
)
7033 as_fatal (_("Not in a subspace.\n"));
7036 /* Parse the parameters to a .SPACE directive; if CREATE_FLAG is nonzero,
7037 then create a new space entry to hold the information specified
7038 by the parameters to the .SPACE directive. */
7040 static sd_chain_struct
*
7041 pa_parse_space_stmt (char *space_name
, int create_flag
)
7043 char *name
, *ptemp
, c
;
7044 char loadable
, defined
, private, sort
;
7046 asection
*seg
= NULL
;
7047 sd_chain_struct
*space
;
7049 /* Load default values. */
7055 if (strcmp (space_name
, "$TEXT$") == 0)
7057 seg
= pa_def_spaces
[0].segment
;
7058 defined
= pa_def_spaces
[0].defined
;
7059 private = pa_def_spaces
[0].private;
7060 sort
= pa_def_spaces
[0].sort
;
7061 spnum
= pa_def_spaces
[0].spnum
;
7063 else if (strcmp (space_name
, "$PRIVATE$") == 0)
7065 seg
= pa_def_spaces
[1].segment
;
7066 defined
= pa_def_spaces
[1].defined
;
7067 private = pa_def_spaces
[1].private;
7068 sort
= pa_def_spaces
[1].sort
;
7069 spnum
= pa_def_spaces
[1].spnum
;
7072 if (!is_end_of_statement ())
7074 print_errors
= FALSE
;
7075 ptemp
= input_line_pointer
+ 1;
7076 /* First see if the space was specified as a number rather than
7077 as a name. According to the PA assembly manual the rest of
7078 the line should be ignored. */
7080 pa_parse_number (&ptemp
, 0);
7084 input_line_pointer
= ptemp
;
7088 while (!is_end_of_statement ())
7090 input_line_pointer
++;
7091 name
= input_line_pointer
;
7092 c
= get_symbol_end ();
7093 if ((strncasecmp (name
, "spnum", 5) == 0))
7095 *input_line_pointer
= c
;
7096 input_line_pointer
++;
7097 spnum
= get_absolute_expression ();
7099 else if ((strncasecmp (name
, "sort", 4) == 0))
7101 *input_line_pointer
= c
;
7102 input_line_pointer
++;
7103 sort
= get_absolute_expression ();
7105 else if ((strncasecmp (name
, "unloadable", 10) == 0))
7107 *input_line_pointer
= c
;
7110 else if ((strncasecmp (name
, "notdefined", 10) == 0))
7112 *input_line_pointer
= c
;
7115 else if ((strncasecmp (name
, "private", 7) == 0))
7117 *input_line_pointer
= c
;
7122 as_bad (_("Invalid .SPACE argument"));
7123 *input_line_pointer
= c
;
7124 if (!is_end_of_statement ())
7125 input_line_pointer
++;
7129 print_errors
= TRUE
;
7132 if (create_flag
&& seg
== NULL
)
7133 seg
= subseg_new (space_name
, 0);
7135 /* If create_flag is nonzero, then create the new space with
7136 the attributes computed above. Else set the values in
7137 an already existing space -- this can only happen for
7138 the first occurrence of a built-in space. */
7140 space
= create_new_space (space_name
, spnum
, loadable
, defined
,
7141 private, sort
, seg
, 1);
7144 space
= is_defined_space (space_name
);
7145 SPACE_SPNUM (space
) = spnum
;
7146 SPACE_DEFINED (space
) = defined
& 1;
7147 SPACE_USER_DEFINED (space
) = 1;
7150 #ifdef obj_set_section_attributes
7151 obj_set_section_attributes (seg
, defined
, private, sort
, spnum
);
7157 /* Handle a .SPACE pseudo-op; this switches the current space to the
7158 given space, creating the new space if necessary. */
7161 pa_space (int unused ATTRIBUTE_UNUSED
)
7163 char *name
, c
, *space_name
, *save_s
;
7164 sd_chain_struct
*sd_chain
;
7166 if (within_procedure
)
7168 as_bad (_("Can\'t change spaces within a procedure definition. Ignored"));
7169 ignore_rest_of_line ();
7173 /* Check for some of the predefined spaces. FIXME: most of the code
7174 below is repeated several times, can we extract the common parts
7175 and place them into a subroutine or something similar? */
7176 /* FIXME Is this (and the next IF stmt) really right?
7177 What if INPUT_LINE_POINTER points to "$TEXT$FOO"? */
7178 if (strncmp (input_line_pointer
, "$TEXT$", 6) == 0)
7180 input_line_pointer
+= 6;
7181 sd_chain
= is_defined_space ("$TEXT$");
7182 if (sd_chain
== NULL
)
7183 sd_chain
= pa_parse_space_stmt ("$TEXT$", 1);
7184 else if (SPACE_USER_DEFINED (sd_chain
) == 0)
7185 sd_chain
= pa_parse_space_stmt ("$TEXT$", 0);
7187 current_space
= sd_chain
;
7188 subseg_set (text_section
, sd_chain
->sd_last_subseg
);
7190 = pa_subsegment_to_subspace (text_section
,
7191 sd_chain
->sd_last_subseg
);
7192 demand_empty_rest_of_line ();
7195 if (strncmp (input_line_pointer
, "$PRIVATE$", 9) == 0)
7197 input_line_pointer
+= 9;
7198 sd_chain
= is_defined_space ("$PRIVATE$");
7199 if (sd_chain
== NULL
)
7200 sd_chain
= pa_parse_space_stmt ("$PRIVATE$", 1);
7201 else if (SPACE_USER_DEFINED (sd_chain
) == 0)
7202 sd_chain
= pa_parse_space_stmt ("$PRIVATE$", 0);
7204 current_space
= sd_chain
;
7205 subseg_set (data_section
, sd_chain
->sd_last_subseg
);
7207 = pa_subsegment_to_subspace (data_section
,
7208 sd_chain
->sd_last_subseg
);
7209 demand_empty_rest_of_line ();
7212 if (!strncasecmp (input_line_pointer
,
7213 GDB_DEBUG_SPACE_NAME
,
7214 strlen (GDB_DEBUG_SPACE_NAME
)))
7216 input_line_pointer
+= strlen (GDB_DEBUG_SPACE_NAME
);
7217 sd_chain
= is_defined_space (GDB_DEBUG_SPACE_NAME
);
7218 if (sd_chain
== NULL
)
7219 sd_chain
= pa_parse_space_stmt (GDB_DEBUG_SPACE_NAME
, 1);
7220 else if (SPACE_USER_DEFINED (sd_chain
) == 0)
7221 sd_chain
= pa_parse_space_stmt (GDB_DEBUG_SPACE_NAME
, 0);
7223 current_space
= sd_chain
;
7226 asection
*gdb_section
7227 = bfd_make_section_old_way (stdoutput
, GDB_DEBUG_SPACE_NAME
);
7229 subseg_set (gdb_section
, sd_chain
->sd_last_subseg
);
7231 = pa_subsegment_to_subspace (gdb_section
,
7232 sd_chain
->sd_last_subseg
);
7234 demand_empty_rest_of_line ();
7238 /* It could be a space specified by number. */
7240 save_s
= input_line_pointer
;
7242 pa_parse_number (&input_line_pointer
, 0);
7245 if ((sd_chain
= pa_find_space_by_number (pa_number
)))
7247 current_space
= sd_chain
;
7249 subseg_set (sd_chain
->sd_seg
, sd_chain
->sd_last_subseg
);
7251 = pa_subsegment_to_subspace (sd_chain
->sd_seg
,
7252 sd_chain
->sd_last_subseg
);
7253 demand_empty_rest_of_line ();
7258 /* Not a number, attempt to create a new space. */
7260 input_line_pointer
= save_s
;
7261 name
= input_line_pointer
;
7262 c
= get_symbol_end ();
7263 space_name
= xmalloc (strlen (name
) + 1);
7264 strcpy (space_name
, name
);
7265 *input_line_pointer
= c
;
7267 sd_chain
= pa_parse_space_stmt (space_name
, 1);
7268 current_space
= sd_chain
;
7270 subseg_set (sd_chain
->sd_seg
, sd_chain
->sd_last_subseg
);
7271 current_subspace
= pa_subsegment_to_subspace (sd_chain
->sd_seg
,
7272 sd_chain
->sd_last_subseg
);
7273 demand_empty_rest_of_line ();
7277 /* Switch to a new space. (I think). FIXME. */
7280 pa_spnum (int unused ATTRIBUTE_UNUSED
)
7285 sd_chain_struct
*space
;
7287 name
= input_line_pointer
;
7288 c
= get_symbol_end ();
7289 space
= is_defined_space (name
);
7293 md_number_to_chars (p
, SPACE_SPNUM (space
), 4);
7296 as_warn (_("Undefined space: '%s' Assuming space number = 0."), name
);
7298 *input_line_pointer
= c
;
7299 demand_empty_rest_of_line ();
7302 /* Handle a .SUBSPACE pseudo-op; this switches the current subspace to the
7303 given subspace, creating the new subspace if necessary.
7305 FIXME. Should mirror pa_space more closely, in particular how
7306 they're broken up into subroutines. */
7309 pa_subspace (int create_new
)
7311 char *name
, *ss_name
, c
;
7312 char loadable
, code_only
, comdat
, common
, dup_common
, zero
, sort
;
7313 int i
, access
, space_index
, alignment
, quadrant
, applicable
, flags
;
7314 sd_chain_struct
*space
;
7315 ssd_chain_struct
*ssd
;
7318 if (current_space
== NULL
)
7319 as_fatal (_("Must be in a space before changing or declaring subspaces.\n"));
7321 if (within_procedure
)
7323 as_bad (_("Can\'t change subspaces within a procedure definition. Ignored"));
7324 ignore_rest_of_line ();
7328 name
= input_line_pointer
;
7329 c
= get_symbol_end ();
7330 ss_name
= xmalloc (strlen (name
) + 1);
7331 strcpy (ss_name
, name
);
7332 *input_line_pointer
= c
;
7334 /* Load default values. */
7347 space
= current_space
;
7351 ssd
= is_defined_subspace (ss_name
);
7352 /* Allow user to override the builtin attributes of subspaces. But
7353 only allow the attributes to be changed once! */
7354 if (ssd
&& SUBSPACE_DEFINED (ssd
))
7356 subseg_set (ssd
->ssd_seg
, ssd
->ssd_subseg
);
7357 current_subspace
= ssd
;
7358 if (!is_end_of_statement ())
7359 as_warn (_("Parameters of an existing subspace can\'t be modified"));
7360 demand_empty_rest_of_line ();
7365 /* A new subspace. Load default values if it matches one of
7366 the builtin subspaces. */
7368 while (pa_def_subspaces
[i
].name
)
7370 if (strcasecmp (pa_def_subspaces
[i
].name
, ss_name
) == 0)
7372 loadable
= pa_def_subspaces
[i
].loadable
;
7373 comdat
= pa_def_subspaces
[i
].comdat
;
7374 common
= pa_def_subspaces
[i
].common
;
7375 dup_common
= pa_def_subspaces
[i
].dup_common
;
7376 code_only
= pa_def_subspaces
[i
].code_only
;
7377 zero
= pa_def_subspaces
[i
].zero
;
7378 space_index
= pa_def_subspaces
[i
].space_index
;
7379 alignment
= pa_def_subspaces
[i
].alignment
;
7380 quadrant
= pa_def_subspaces
[i
].quadrant
;
7381 access
= pa_def_subspaces
[i
].access
;
7382 sort
= pa_def_subspaces
[i
].sort
;
7389 /* We should be working with a new subspace now. Fill in
7390 any information as specified by the user. */
7391 if (!is_end_of_statement ())
7393 input_line_pointer
++;
7394 while (!is_end_of_statement ())
7396 name
= input_line_pointer
;
7397 c
= get_symbol_end ();
7398 if ((strncasecmp (name
, "quad", 4) == 0))
7400 *input_line_pointer
= c
;
7401 input_line_pointer
++;
7402 quadrant
= get_absolute_expression ();
7404 else if ((strncasecmp (name
, "align", 5) == 0))
7406 *input_line_pointer
= c
;
7407 input_line_pointer
++;
7408 alignment
= get_absolute_expression ();
7409 if (exact_log2 (alignment
) == -1)
7411 as_bad (_("Alignment must be a power of 2"));
7415 else if ((strncasecmp (name
, "access", 6) == 0))
7417 *input_line_pointer
= c
;
7418 input_line_pointer
++;
7419 access
= get_absolute_expression ();
7421 else if ((strncasecmp (name
, "sort", 4) == 0))
7423 *input_line_pointer
= c
;
7424 input_line_pointer
++;
7425 sort
= get_absolute_expression ();
7427 else if ((strncasecmp (name
, "code_only", 9) == 0))
7429 *input_line_pointer
= c
;
7432 else if ((strncasecmp (name
, "unloadable", 10) == 0))
7434 *input_line_pointer
= c
;
7437 else if ((strncasecmp (name
, "comdat", 6) == 0))
7439 *input_line_pointer
= c
;
7442 else if ((strncasecmp (name
, "common", 6) == 0))
7444 *input_line_pointer
= c
;
7447 else if ((strncasecmp (name
, "dup_comm", 8) == 0))
7449 *input_line_pointer
= c
;
7452 else if ((strncasecmp (name
, "zero", 4) == 0))
7454 *input_line_pointer
= c
;
7457 else if ((strncasecmp (name
, "first", 5) == 0))
7458 as_bad (_("FIRST not supported as a .SUBSPACE argument"));
7460 as_bad (_("Invalid .SUBSPACE argument"));
7461 if (!is_end_of_statement ())
7462 input_line_pointer
++;
7466 /* Compute a reasonable set of BFD flags based on the information
7467 in the .subspace directive. */
7468 applicable
= bfd_applicable_section_flags (stdoutput
);
7471 flags
|= (SEC_ALLOC
| SEC_LOAD
);
7475 /* These flags are used to implement various flavors of initialized
7476 common. The SOM linker discards duplicate subspaces when they
7477 have the same "key" symbol name. This support is more like
7478 GNU linkonce than BFD common. Further, pc-relative relocations
7479 are converted to section relative relocations in BFD common
7480 sections. This complicates the handling of relocations in
7481 common sections containing text and isn't currently supported
7482 correctly in the SOM BFD backend. */
7483 if (comdat
|| common
|| dup_common
)
7484 flags
|= SEC_LINK_ONCE
;
7486 flags
|= SEC_RELOC
| SEC_HAS_CONTENTS
;
7488 /* This is a zero-filled subspace (eg BSS). */
7490 flags
&= ~(SEC_LOAD
| SEC_HAS_CONTENTS
);
7492 applicable
&= flags
;
7494 /* If this is an existing subspace, then we want to use the
7495 segment already associated with the subspace.
7497 FIXME NOW! ELF BFD doesn't appear to be ready to deal with
7498 lots of sections. It might be a problem in the PA ELF
7499 code, I do not know yet. For now avoid creating anything
7500 but the "standard" sections for ELF. */
7502 section
= subseg_force_new (ss_name
, 0);
7504 section
= ssd
->ssd_seg
;
7506 section
= subseg_new (ss_name
, 0);
7509 seg_info (section
)->bss
= 1;
7511 /* Now set the flags. */
7512 bfd_set_section_flags (stdoutput
, section
, applicable
);
7514 /* Record any alignment request for this section. */
7515 record_alignment (section
, exact_log2 (alignment
));
7517 /* Set the starting offset for this section. */
7518 bfd_set_section_vma (stdoutput
, section
,
7519 pa_subspace_start (space
, quadrant
));
7521 /* Now that all the flags are set, update an existing subspace,
7522 or create a new one. */
7525 current_subspace
= update_subspace (space
, ss_name
, loadable
,
7526 code_only
, comdat
, common
,
7527 dup_common
, sort
, zero
, access
,
7528 space_index
, alignment
, quadrant
,
7531 current_subspace
= create_new_subspace (space
, ss_name
, loadable
,
7532 code_only
, comdat
, common
,
7533 dup_common
, zero
, sort
,
7534 access
, space_index
,
7535 alignment
, quadrant
, section
);
7537 demand_empty_rest_of_line ();
7538 current_subspace
->ssd_seg
= section
;
7539 subseg_set (current_subspace
->ssd_seg
, current_subspace
->ssd_subseg
);
7541 SUBSPACE_DEFINED (current_subspace
) = 1;
7544 /* Create default space and subspace dictionaries. */
7547 pa_spaces_begin (void)
7551 space_dict_root
= NULL
;
7552 space_dict_last
= NULL
;
7555 while (pa_def_spaces
[i
].name
)
7559 /* Pick the right name to use for the new section. */
7560 name
= pa_def_spaces
[i
].name
;
7562 pa_def_spaces
[i
].segment
= subseg_new (name
, 0);
7563 create_new_space (pa_def_spaces
[i
].name
, pa_def_spaces
[i
].spnum
,
7564 pa_def_spaces
[i
].loadable
, pa_def_spaces
[i
].defined
,
7565 pa_def_spaces
[i
].private, pa_def_spaces
[i
].sort
,
7566 pa_def_spaces
[i
].segment
, 0);
7571 while (pa_def_subspaces
[i
].name
)
7574 int applicable
, subsegment
;
7575 asection
*segment
= NULL
;
7576 sd_chain_struct
*space
;
7578 /* Pick the right name for the new section and pick the right
7579 subsegment number. */
7580 name
= pa_def_subspaces
[i
].name
;
7583 /* Create the new section. */
7584 segment
= subseg_new (name
, subsegment
);
7586 /* For SOM we want to replace the standard .text, .data, and .bss
7587 sections with our own. We also want to set BFD flags for
7588 all the built-in subspaces. */
7589 if (!strcmp (pa_def_subspaces
[i
].name
, "$CODE$"))
7591 text_section
= segment
;
7592 applicable
= bfd_applicable_section_flags (stdoutput
);
7593 bfd_set_section_flags (stdoutput
, segment
,
7594 applicable
& (SEC_ALLOC
| SEC_LOAD
7595 | SEC_RELOC
| SEC_CODE
7597 | SEC_HAS_CONTENTS
));
7599 else if (!strcmp (pa_def_subspaces
[i
].name
, "$DATA$"))
7601 data_section
= segment
;
7602 applicable
= bfd_applicable_section_flags (stdoutput
);
7603 bfd_set_section_flags (stdoutput
, segment
,
7604 applicable
& (SEC_ALLOC
| SEC_LOAD
7606 | SEC_HAS_CONTENTS
));
7609 else if (!strcmp (pa_def_subspaces
[i
].name
, "$BSS$"))
7611 bss_section
= segment
;
7612 applicable
= bfd_applicable_section_flags (stdoutput
);
7613 bfd_set_section_flags (stdoutput
, segment
,
7614 applicable
& SEC_ALLOC
);
7616 else if (!strcmp (pa_def_subspaces
[i
].name
, "$LIT$"))
7618 applicable
= bfd_applicable_section_flags (stdoutput
);
7619 bfd_set_section_flags (stdoutput
, segment
,
7620 applicable
& (SEC_ALLOC
| SEC_LOAD
7623 | SEC_HAS_CONTENTS
));
7625 else if (!strcmp (pa_def_subspaces
[i
].name
, "$MILLICODE$"))
7627 applicable
= bfd_applicable_section_flags (stdoutput
);
7628 bfd_set_section_flags (stdoutput
, segment
,
7629 applicable
& (SEC_ALLOC
| SEC_LOAD
7632 | SEC_HAS_CONTENTS
));
7634 else if (!strcmp (pa_def_subspaces
[i
].name
, "$UNWIND$"))
7636 applicable
= bfd_applicable_section_flags (stdoutput
);
7637 bfd_set_section_flags (stdoutput
, segment
,
7638 applicable
& (SEC_ALLOC
| SEC_LOAD
7641 | SEC_HAS_CONTENTS
));
7644 /* Find the space associated with this subspace. */
7645 space
= pa_segment_to_space (pa_def_spaces
[pa_def_subspaces
[i
].
7646 def_space_index
].segment
);
7649 as_fatal (_("Internal error: Unable to find containing space for %s."),
7650 pa_def_subspaces
[i
].name
);
7653 create_new_subspace (space
, name
,
7654 pa_def_subspaces
[i
].loadable
,
7655 pa_def_subspaces
[i
].code_only
,
7656 pa_def_subspaces
[i
].comdat
,
7657 pa_def_subspaces
[i
].common
,
7658 pa_def_subspaces
[i
].dup_common
,
7659 pa_def_subspaces
[i
].zero
,
7660 pa_def_subspaces
[i
].sort
,
7661 pa_def_subspaces
[i
].access
,
7662 pa_def_subspaces
[i
].space_index
,
7663 pa_def_subspaces
[i
].alignment
,
7664 pa_def_subspaces
[i
].quadrant
,
7670 /* Create a new space NAME, with the appropriate flags as defined
7671 by the given parameters. */
7673 static sd_chain_struct
*
7674 create_new_space (char *name
,
7676 int loadable ATTRIBUTE_UNUSED
,
7683 sd_chain_struct
*chain_entry
;
7685 chain_entry
= xmalloc (sizeof (sd_chain_struct
));
7687 as_fatal (_("Out of memory: could not allocate new space chain entry: %s\n"),
7690 SPACE_NAME (chain_entry
) = xmalloc (strlen (name
) + 1);
7691 strcpy (SPACE_NAME (chain_entry
), name
);
7692 SPACE_DEFINED (chain_entry
) = defined
;
7693 SPACE_USER_DEFINED (chain_entry
) = user_defined
;
7694 SPACE_SPNUM (chain_entry
) = spnum
;
7696 chain_entry
->sd_seg
= seg
;
7697 chain_entry
->sd_last_subseg
= -1;
7698 chain_entry
->sd_subspaces
= NULL
;
7699 chain_entry
->sd_next
= NULL
;
7701 /* Find spot for the new space based on its sort key. */
7702 if (!space_dict_last
)
7703 space_dict_last
= chain_entry
;
7705 if (space_dict_root
== NULL
)
7706 space_dict_root
= chain_entry
;
7709 sd_chain_struct
*chain_pointer
;
7710 sd_chain_struct
*prev_chain_pointer
;
7712 chain_pointer
= space_dict_root
;
7713 prev_chain_pointer
= NULL
;
7715 while (chain_pointer
)
7717 prev_chain_pointer
= chain_pointer
;
7718 chain_pointer
= chain_pointer
->sd_next
;
7721 /* At this point we've found the correct place to add the new
7722 entry. So add it and update the linked lists as appropriate. */
7723 if (prev_chain_pointer
)
7725 chain_entry
->sd_next
= chain_pointer
;
7726 prev_chain_pointer
->sd_next
= chain_entry
;
7730 space_dict_root
= chain_entry
;
7731 chain_entry
->sd_next
= chain_pointer
;
7734 if (chain_entry
->sd_next
== NULL
)
7735 space_dict_last
= chain_entry
;
7738 /* This is here to catch predefined spaces which do not get
7739 modified by the user's input. Another call is found at
7740 the bottom of pa_parse_space_stmt to handle cases where
7741 the user modifies a predefined space. */
7742 #ifdef obj_set_section_attributes
7743 obj_set_section_attributes (seg
, defined
, private, sort
, spnum
);
7749 /* Create a new subspace NAME, with the appropriate flags as defined
7750 by the given parameters.
7752 Add the new subspace to the subspace dictionary chain in numerical
7753 order as defined by the SORT entries. */
7755 static ssd_chain_struct
*
7756 create_new_subspace (sd_chain_struct
*space
,
7758 int loadable ATTRIBUTE_UNUSED
,
7759 int code_only ATTRIBUTE_UNUSED
,
7763 int is_zero ATTRIBUTE_UNUSED
,
7766 int space_index ATTRIBUTE_UNUSED
,
7767 int alignment ATTRIBUTE_UNUSED
,
7771 ssd_chain_struct
*chain_entry
;
7773 chain_entry
= xmalloc (sizeof (ssd_chain_struct
));
7775 as_fatal (_("Out of memory: could not allocate new subspace chain entry: %s\n"), name
);
7777 SUBSPACE_NAME (chain_entry
) = xmalloc (strlen (name
) + 1);
7778 strcpy (SUBSPACE_NAME (chain_entry
), name
);
7780 /* Initialize subspace_defined. When we hit a .subspace directive
7781 we'll set it to 1 which "locks-in" the subspace attributes. */
7782 SUBSPACE_DEFINED (chain_entry
) = 0;
7784 chain_entry
->ssd_subseg
= 0;
7785 chain_entry
->ssd_seg
= seg
;
7786 chain_entry
->ssd_next
= NULL
;
7788 /* Find spot for the new subspace based on its sort key. */
7789 if (space
->sd_subspaces
== NULL
)
7790 space
->sd_subspaces
= chain_entry
;
7793 ssd_chain_struct
*chain_pointer
;
7794 ssd_chain_struct
*prev_chain_pointer
;
7796 chain_pointer
= space
->sd_subspaces
;
7797 prev_chain_pointer
= NULL
;
7799 while (chain_pointer
)
7801 prev_chain_pointer
= chain_pointer
;
7802 chain_pointer
= chain_pointer
->ssd_next
;
7805 /* Now we have somewhere to put the new entry. Insert it and update
7807 if (prev_chain_pointer
)
7809 chain_entry
->ssd_next
= chain_pointer
;
7810 prev_chain_pointer
->ssd_next
= chain_entry
;
7814 space
->sd_subspaces
= chain_entry
;
7815 chain_entry
->ssd_next
= chain_pointer
;
7819 #ifdef obj_set_subsection_attributes
7820 obj_set_subsection_attributes (seg
, space
->sd_seg
, access
, sort
,
7821 quadrant
, comdat
, common
, dup_common
);
7827 /* Update the information for the given subspace based upon the
7828 various arguments. Return the modified subspace chain entry. */
7830 static ssd_chain_struct
*
7831 update_subspace (sd_chain_struct
*space
,
7833 int loadable ATTRIBUTE_UNUSED
,
7834 int code_only ATTRIBUTE_UNUSED
,
7839 int zero ATTRIBUTE_UNUSED
,
7841 int space_index ATTRIBUTE_UNUSED
,
7842 int alignment ATTRIBUTE_UNUSED
,
7846 ssd_chain_struct
*chain_entry
;
7848 chain_entry
= is_defined_subspace (name
);
7850 #ifdef obj_set_subsection_attributes
7851 obj_set_subsection_attributes (section
, space
->sd_seg
, access
, sort
,
7852 quadrant
, comdat
, common
, dup_common
);
7858 /* Return the space chain entry for the space with the name NAME or
7859 NULL if no such space exists. */
7861 static sd_chain_struct
*
7862 is_defined_space (char *name
)
7864 sd_chain_struct
*chain_pointer
;
7866 for (chain_pointer
= space_dict_root
;
7868 chain_pointer
= chain_pointer
->sd_next
)
7869 if (strcmp (SPACE_NAME (chain_pointer
), name
) == 0)
7870 return chain_pointer
;
7872 /* No mapping from segment to space was found. Return NULL. */
7876 /* Find and return the space associated with the given seg. If no mapping
7877 from the given seg to a space is found, then return NULL.
7879 Unlike subspaces, the number of spaces is not expected to grow much,
7880 so a linear exhaustive search is OK here. */
7882 static sd_chain_struct
*
7883 pa_segment_to_space (asection
*seg
)
7885 sd_chain_struct
*space_chain
;
7887 /* Walk through each space looking for the correct mapping. */
7888 for (space_chain
= space_dict_root
;
7890 space_chain
= space_chain
->sd_next
)
7891 if (space_chain
->sd_seg
== seg
)
7894 /* Mapping was not found. Return NULL. */
7898 /* Return the first space chain entry for the subspace with the name
7899 NAME or NULL if no such subspace exists.
7901 When there are multiple subspaces with the same name, switching to
7902 the first (i.e., default) subspace is preferable in most situations.
7903 For example, it wouldn't be desirable to merge COMDAT data with non
7906 Uses a linear search through all the spaces and subspaces, this may
7907 not be appropriate if we ever being placing each function in its
7910 static ssd_chain_struct
*
7911 is_defined_subspace (char *name
)
7913 sd_chain_struct
*space_chain
;
7914 ssd_chain_struct
*subspace_chain
;
7916 /* Walk through each space. */
7917 for (space_chain
= space_dict_root
;
7919 space_chain
= space_chain
->sd_next
)
7921 /* Walk through each subspace looking for a name which matches. */
7922 for (subspace_chain
= space_chain
->sd_subspaces
;
7924 subspace_chain
= subspace_chain
->ssd_next
)
7925 if (strcmp (SUBSPACE_NAME (subspace_chain
), name
) == 0)
7926 return subspace_chain
;
7929 /* Subspace wasn't found. Return NULL. */
7933 /* Find and return the subspace associated with the given seg. If no
7934 mapping from the given seg to a subspace is found, then return NULL.
7936 If we ever put each procedure/function within its own subspace
7937 (to make life easier on the compiler and linker), then this will have
7938 to become more efficient. */
7940 static ssd_chain_struct
*
7941 pa_subsegment_to_subspace (asection
*seg
, subsegT subseg
)
7943 sd_chain_struct
*space_chain
;
7944 ssd_chain_struct
*subspace_chain
;
7946 /* Walk through each space. */
7947 for (space_chain
= space_dict_root
;
7949 space_chain
= space_chain
->sd_next
)
7951 if (space_chain
->sd_seg
== seg
)
7953 /* Walk through each subspace within each space looking for
7954 the correct mapping. */
7955 for (subspace_chain
= space_chain
->sd_subspaces
;
7957 subspace_chain
= subspace_chain
->ssd_next
)
7958 if (subspace_chain
->ssd_subseg
== (int) subseg
)
7959 return subspace_chain
;
7963 /* No mapping from subsegment to subspace found. Return NULL. */
7967 /* Given a number, try and find a space with the name number.
7969 Return a pointer to a space dictionary chain entry for the space
7970 that was found or NULL on failure. */
7972 static sd_chain_struct
*
7973 pa_find_space_by_number (int number
)
7975 sd_chain_struct
*space_chain
;
7977 for (space_chain
= space_dict_root
;
7979 space_chain
= space_chain
->sd_next
)
7981 if (SPACE_SPNUM (space_chain
) == (unsigned int) number
)
7985 /* No appropriate space found. Return NULL. */
7989 /* Return the starting address for the given subspace. If the starting
7990 address is unknown then return zero. */
7993 pa_subspace_start (sd_chain_struct
*space
, int quadrant
)
7995 /* FIXME. Assumes everyone puts read/write data at 0x4000000, this
7996 is not correct for the PA OSF1 port. */
7997 if ((strcmp (SPACE_NAME (space
), "$PRIVATE$") == 0) && quadrant
== 1)
7999 else if (space
->sd_seg
== data_section
&& quadrant
== 1)
8007 /* Helper function for pa_stringer. Used to find the end of
8011 pa_stringer_aux (char *s
)
8013 unsigned int c
= *s
& CHAR_MASK
;
8026 /* Handle a .STRING type pseudo-op. */
8029 pa_stringer (int append_zero
)
8031 char *s
, num_buf
[4];
8035 /* Preprocess the string to handle PA-specific escape sequences.
8036 For example, \xDD where DD is a hexadecimal number should be
8037 changed to \OOO where OOO is an octal number. */
8040 /* We must have a valid space and subspace. */
8041 pa_check_current_space_and_subspace ();
8044 /* Skip the opening quote. */
8045 s
= input_line_pointer
+ 1;
8047 while (is_a_char (c
= pa_stringer_aux (s
++)))
8054 /* Handle \x<num>. */
8057 unsigned int number
;
8062 /* Get past the 'x'. */
8064 for (num_digit
= 0, number
= 0, dg
= *s
;
8066 && (ISDIGIT (dg
) || (dg
>= 'a' && dg
<= 'f')
8067 || (dg
>= 'A' && dg
<= 'F'));
8071 number
= number
* 16 + dg
- '0';
8072 else if (dg
>= 'a' && dg
<= 'f')
8073 number
= number
* 16 + dg
- 'a' + 10;
8075 number
= number
* 16 + dg
- 'A' + 10;
8085 sprintf (num_buf
, "%02o", number
);
8088 sprintf (num_buf
, "%03o", number
);
8091 for (i
= 0; i
<= num_digit
; i
++)
8092 s_start
[i
] = num_buf
[i
];
8096 /* This might be a "\"", skip over the escaped char. */
8103 stringer (8 + append_zero
);
8104 pa_undefine_label ();
8107 /* Handle a .VERSION pseudo-op. */
8110 pa_version (int unused ATTRIBUTE_UNUSED
)
8113 pa_undefine_label ();
8118 /* Handle a .COMPILER pseudo-op. */
8121 pa_compiler (int unused ATTRIBUTE_UNUSED
)
8123 obj_som_compiler (0);
8124 pa_undefine_label ();
8129 /* Handle a .COPYRIGHT pseudo-op. */
8132 pa_copyright (int unused ATTRIBUTE_UNUSED
)
8135 pa_undefine_label ();
8138 /* Just like a normal cons, but when finished we have to undefine
8139 the latest space label. */
8142 pa_cons (int nbytes
)
8145 pa_undefine_label ();
8148 /* Like float_cons, but we need to undefine our label. */
8151 pa_float_cons (int float_type
)
8153 float_cons (float_type
);
8154 pa_undefine_label ();
8157 /* Like s_fill, but delete our label when finished. */
8160 pa_fill (int unused ATTRIBUTE_UNUSED
)
8163 /* We must have a valid space and subspace. */
8164 pa_check_current_space_and_subspace ();
8168 pa_undefine_label ();
8171 /* Like lcomm, but delete our label when finished. */
8174 pa_lcomm (int needs_align
)
8177 /* We must have a valid space and subspace. */
8178 pa_check_current_space_and_subspace ();
8181 s_lcomm (needs_align
);
8182 pa_undefine_label ();
8185 /* Like lsym, but delete our label when finished. */
8188 pa_lsym (int unused ATTRIBUTE_UNUSED
)
8191 /* We must have a valid space and subspace. */
8192 pa_check_current_space_and_subspace ();
8196 pa_undefine_label ();
8199 /* This function is called once, at assembler startup time. It should
8200 set up all the tables, etc. that the MD part of the assembler will need. */
8205 const char *retval
= NULL
;
8209 last_call_info
= NULL
;
8210 call_info_root
= NULL
;
8212 /* Set the default machine type. */
8213 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_hppa
, DEFAULT_LEVEL
))
8214 as_warn (_("could not set architecture and machine"));
8216 /* Folding of text and data segments fails miserably on the PA.
8217 Warn user and disable "-R" option. */
8218 if (flag_readonly_data_in_text
)
8220 as_warn (_("-R option not supported on this target."));
8221 flag_readonly_data_in_text
= 0;
8228 op_hash
= hash_new ();
8230 while (i
< NUMOPCODES
)
8232 const char *name
= pa_opcodes
[i
].name
;
8234 retval
= hash_insert (op_hash
, name
, (struct pa_opcode
*) &pa_opcodes
[i
]);
8235 if (retval
!= NULL
&& *retval
!= '\0')
8237 as_fatal (_("Internal error: can't hash `%s': %s\n"), name
, retval
);
8243 if ((pa_opcodes
[i
].match
& pa_opcodes
[i
].mask
)
8244 != pa_opcodes
[i
].match
)
8246 fprintf (stderr
, _("internal error: losing opcode: `%s' \"%s\"\n"),
8247 pa_opcodes
[i
].name
, pa_opcodes
[i
].args
);
8252 while (i
< NUMOPCODES
&& !strcmp (pa_opcodes
[i
].name
, name
));
8256 as_fatal (_("Broken assembler. No assembly attempted."));
8259 /* SOM will change text_section. To make sure we never put
8260 anything into the old one switch to the new one now. */
8261 subseg_set (text_section
, 0);
8265 dummy_symbol
= symbol_find_or_make ("L$dummy");
8266 S_SET_SEGMENT (dummy_symbol
, text_section
);
8267 /* Force the symbol to be converted to a real symbol. */
8268 symbol_get_bfdsym (dummy_symbol
)->flags
|= BSF_KEEP
;
8272 /* On the PA relocations which involve function symbols must not be
8273 adjusted. This so that the linker can know when/how to create argument
8274 relocation stubs for indirect calls and calls to static functions.
8276 "T" field selectors create DLT relative fixups for accessing
8277 globals and statics in PIC code; each DLT relative fixup creates
8278 an entry in the DLT table. The entries contain the address of
8279 the final target (eg accessing "foo" would create a DLT entry
8280 with the address of "foo").
8282 Unfortunately, the HP linker doesn't take into account any addend
8283 when generating the DLT; so accessing $LIT$+8 puts the address of
8284 $LIT$ into the DLT rather than the address of $LIT$+8.
8286 The end result is we can't perform relocation symbol reductions for
8287 any fixup which creates entries in the DLT (eg they use "T" field
8290 ??? Reject reductions involving symbols with external scope; such
8291 reductions make life a living hell for object file editors. */
8294 hppa_fix_adjustable (fixS
*fixp
)
8299 struct hppa_fix_struct
*hppa_fix
;
8301 hppa_fix
= (struct hppa_fix_struct
*) fixp
->tc_fix_data
;
8304 /* LR/RR selectors are implicitly used for a number of different relocation
8305 types. We must ensure that none of these types are adjusted (see below)
8306 even if they occur with a different selector. */
8307 code
= elf_hppa_reloc_final_type (stdoutput
, fixp
->fx_r_type
,
8308 hppa_fix
->fx_r_format
,
8309 hppa_fix
->fx_r_field
);
8313 /* Relocation types which use e_lrsel. */
8314 case R_PARISC_DIR21L
:
8315 case R_PARISC_DLTREL21L
:
8316 case R_PARISC_DPREL21L
:
8317 case R_PARISC_PLTOFF21L
:
8319 /* Relocation types which use e_rrsel. */
8320 case R_PARISC_DIR14R
:
8321 case R_PARISC_DIR14DR
:
8322 case R_PARISC_DIR14WR
:
8323 case R_PARISC_DIR17R
:
8324 case R_PARISC_DLTREL14R
:
8325 case R_PARISC_DLTREL14DR
:
8326 case R_PARISC_DLTREL14WR
:
8327 case R_PARISC_DPREL14R
:
8328 case R_PARISC_DPREL14DR
:
8329 case R_PARISC_DPREL14WR
:
8330 case R_PARISC_PLTOFF14R
:
8331 case R_PARISC_PLTOFF14DR
:
8332 case R_PARISC_PLTOFF14WR
:
8334 /* Other types that we reject for reduction. */
8335 case R_PARISC_GNU_VTENTRY
:
8336 case R_PARISC_GNU_VTINHERIT
:
8343 /* Reject reductions of symbols in sym1-sym2 expressions when
8344 the fixup will occur in a CODE subspace.
8346 XXX FIXME: Long term we probably want to reject all of these;
8347 for example reducing in the debug section would lose if we ever
8348 supported using the optimizing hp linker. */
8351 && (hppa_fix
->segment
->flags
& SEC_CODE
))
8354 /* We can't adjust any relocs that use LR% and RR% field selectors.
8356 If a symbol is reduced to a section symbol, the assembler will
8357 adjust the addend unless the symbol happens to reside right at
8358 the start of the section. Additionally, the linker has no choice
8359 but to manipulate the addends when coalescing input sections for
8360 "ld -r". Since an LR% field selector is defined to round the
8361 addend, we can't change the addend without risking that a LR% and
8362 it's corresponding (possible multiple) RR% field will no longer
8363 sum to the right value.
8366 . ldil LR%foo+0,%r21
8367 . ldw RR%foo+0(%r21),%r26
8368 . ldw RR%foo+4(%r21),%r25
8370 If foo is at address 4092 (decimal) in section `sect', then after
8371 reducing to the section symbol we get
8372 . LR%sect+4092 == (L%sect)+0
8373 . RR%sect+4092 == (R%sect)+4092
8374 . RR%sect+4096 == (R%sect)-4096
8375 and the last address loses because rounding the addend to 8k
8376 multiples takes us up to 8192 with an offset of -4096.
8378 In cases where the LR% expression is identical to the RR% one we
8379 will never have a problem, but is so happens that gcc rounds
8380 addends involved in LR% field selectors to work around a HP
8381 linker bug. ie. We often have addresses like the last case
8382 above where the LR% expression is offset from the RR% one. */
8384 if (hppa_fix
->fx_r_field
== e_lrsel
8385 || hppa_fix
->fx_r_field
== e_rrsel
8386 || hppa_fix
->fx_r_field
== e_nlrsel
)
8389 /* Reject reductions of symbols in DLT relative relocs,
8390 relocations with plabels. */
8391 if (hppa_fix
->fx_r_field
== e_tsel
8392 || hppa_fix
->fx_r_field
== e_ltsel
8393 || hppa_fix
->fx_r_field
== e_rtsel
8394 || hppa_fix
->fx_r_field
== e_psel
8395 || hppa_fix
->fx_r_field
== e_rpsel
8396 || hppa_fix
->fx_r_field
== e_lpsel
)
8399 /* Reject absolute calls (jumps). */
8400 if (hppa_fix
->fx_r_type
== R_HPPA_ABS_CALL
)
8403 /* Reject reductions of function symbols. */
8404 if (fixp
->fx_addsy
!= 0 && S_IS_FUNCTION (fixp
->fx_addsy
))
8410 /* Return nonzero if the fixup in FIXP will require a relocation,
8411 even it if appears that the fixup could be completely handled
8415 hppa_force_relocation (struct fix
*fixp
)
8417 struct hppa_fix_struct
*hppa_fixp
;
8419 hppa_fixp
= (struct hppa_fix_struct
*) fixp
->tc_fix_data
;
8421 if (fixp
->fx_r_type
== (int) R_HPPA_ENTRY
8422 || fixp
->fx_r_type
== (int) R_HPPA_EXIT
8423 || fixp
->fx_r_type
== (int) R_HPPA_BEGIN_BRTAB
8424 || fixp
->fx_r_type
== (int) R_HPPA_END_BRTAB
8425 || fixp
->fx_r_type
== (int) R_HPPA_BEGIN_TRY
8426 || fixp
->fx_r_type
== (int) R_HPPA_END_TRY
8427 || (fixp
->fx_addsy
!= NULL
&& fixp
->fx_subsy
!= NULL
8428 && (hppa_fixp
->segment
->flags
& SEC_CODE
) != 0))
8432 if (fixp
->fx_r_type
== (int) R_PARISC_GNU_VTINHERIT
8433 || fixp
->fx_r_type
== (int) R_PARISC_GNU_VTENTRY
)
8437 assert (fixp
->fx_addsy
!= NULL
);
8439 /* Ensure we emit a relocation for global symbols so that dynamic
8441 if (S_FORCE_RELOC (fixp
->fx_addsy
, 1))
8444 /* It is necessary to force PC-relative calls/jumps to have a relocation
8445 entry if they're going to need either an argument relocation or long
8448 && arg_reloc_stub_needed (symbol_arg_reloc_info (fixp
->fx_addsy
),
8449 hppa_fixp
->fx_arg_reloc
))
8452 /* Now check to see if we're going to need a long-branch stub. */
8453 if (fixp
->fx_r_type
== (int) R_HPPA_PCREL_CALL
)
8455 long pc
= md_pcrel_from (fixp
);
8456 valueT distance
, min_stub_distance
;
8458 distance
= fixp
->fx_offset
+ S_GET_VALUE (fixp
->fx_addsy
) - pc
- 8;
8460 /* Distance to the closest possible stub. This will detect most
8461 but not all circumstances where a stub will not work. */
8462 min_stub_distance
= pc
+ 16;
8464 if (last_call_info
!= NULL
)
8465 min_stub_distance
-= S_GET_VALUE (last_call_info
->start_symbol
);
8468 if ((distance
+ 8388608 >= 16777216
8469 && min_stub_distance
<= 8388608)
8470 || (hppa_fixp
->fx_r_format
== 17
8471 && distance
+ 262144 >= 524288
8472 && min_stub_distance
<= 262144)
8473 || (hppa_fixp
->fx_r_format
== 12
8474 && distance
+ 8192 >= 16384
8475 && min_stub_distance
<= 8192)
8480 if (fixp
->fx_r_type
== (int) R_HPPA_ABS_CALL
)
8483 /* No need (yet) to force another relocations to be emitted. */
8487 /* Now for some ELF specific code. FIXME. */
8489 /* For ELF, this function serves one purpose: to setup the st_size
8490 field of STT_FUNC symbols. To do this, we need to scan the
8491 call_info structure list, determining st_size in by taking the
8492 difference in the address of the beginning/end marker symbols. */
8495 elf_hppa_final_processing (void)
8497 struct call_info
*call_info_pointer
;
8499 for (call_info_pointer
= call_info_root
;
8501 call_info_pointer
= call_info_pointer
->ci_next
)
8503 elf_symbol_type
*esym
8504 = ((elf_symbol_type
*)
8505 symbol_get_bfdsym (call_info_pointer
->start_symbol
));
8506 esym
->internal_elf_sym
.st_size
=
8507 S_GET_VALUE (call_info_pointer
->end_symbol
)
8508 - S_GET_VALUE (call_info_pointer
->start_symbol
) + 4;
8513 pa_vtable_entry (int ignore ATTRIBUTE_UNUSED
)
8515 struct fix
*new_fix
;
8517 new_fix
= obj_elf_vtable_entry (0);
8521 struct hppa_fix_struct
* hppa_fix
= obstack_alloc (¬es
, sizeof (struct hppa_fix_struct
));
8523 hppa_fix
->fx_r_type
= R_HPPA
;
8524 hppa_fix
->fx_r_field
= e_fsel
;
8525 hppa_fix
->fx_r_format
= 32;
8526 hppa_fix
->fx_arg_reloc
= 0;
8527 hppa_fix
->segment
= now_seg
;
8528 new_fix
->tc_fix_data
= (void *) hppa_fix
;
8529 new_fix
->fx_r_type
= (int) R_PARISC_GNU_VTENTRY
;
8534 pa_vtable_inherit (int ignore ATTRIBUTE_UNUSED
)
8536 struct fix
*new_fix
;
8538 new_fix
= obj_elf_vtable_inherit (0);
8542 struct hppa_fix_struct
* hppa_fix
= obstack_alloc (¬es
, sizeof (struct hppa_fix_struct
));
8544 hppa_fix
->fx_r_type
= R_HPPA
;
8545 hppa_fix
->fx_r_field
= e_fsel
;
8546 hppa_fix
->fx_r_format
= 32;
8547 hppa_fix
->fx_arg_reloc
= 0;
8548 hppa_fix
->segment
= now_seg
;
8549 new_fix
->tc_fix_data
= (void *) hppa_fix
;
8550 new_fix
->fx_r_type
= (int) R_PARISC_GNU_VTINHERIT
;
8555 /* Table of pseudo ops for the PA. FIXME -- how many of these
8556 are now redundant with the overall GAS and the object file
8557 dependent tables? */
8558 const pseudo_typeS md_pseudo_table
[] =
8560 /* align pseudo-ops on the PA specify the actual alignment requested,
8561 not the log2 of the requested alignment. */
8563 {"align", pa_align
, 8},
8566 {"align", s_align_bytes
, 8},
8568 {"begin_brtab", pa_brtab
, 1},
8569 {"begin_try", pa_try
, 1},
8570 {"block", pa_block
, 1},
8571 {"blockz", pa_block
, 0},
8572 {"byte", pa_cons
, 1},
8573 {"call", pa_call
, 0},
8574 {"callinfo", pa_callinfo
, 0},
8575 #if defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))
8576 {"code", obj_elf_text
, 0},
8578 {"code", pa_text
, 0},
8579 {"comm", pa_comm
, 0},
8582 {"compiler", pa_compiler
, 0},
8584 {"copyright", pa_copyright
, 0},
8585 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
8586 {"data", pa_data
, 0},
8588 {"double", pa_float_cons
, 'd'},
8589 {"dword", pa_cons
, 8},
8591 {"end_brtab", pa_brtab
, 0},
8592 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
8593 {"end_try", pa_try
, 0},
8595 {"enter", pa_enter
, 0},
8596 {"entry", pa_entry
, 0},
8598 {"exit", pa_exit
, 0},
8599 {"export", pa_export
, 0},
8600 {"fill", pa_fill
, 0},
8601 {"float", pa_float_cons
, 'f'},
8602 {"half", pa_cons
, 2},
8603 {"import", pa_import
, 0},
8604 {"int", pa_cons
, 4},
8605 {"label", pa_label
, 0},
8606 {"lcomm", pa_lcomm
, 0},
8607 {"leave", pa_leave
, 0},
8608 {"level", pa_level
, 0},
8609 {"long", pa_cons
, 4},
8610 {"lsym", pa_lsym
, 0},
8612 {"nsubspa", pa_subspace
, 1},
8614 {"octa", pa_cons
, 16},
8615 {"org", pa_origin
, 0},
8616 {"origin", pa_origin
, 0},
8617 {"param", pa_param
, 0},
8618 {"proc", pa_proc
, 0},
8619 {"procend", pa_procend
, 0},
8620 {"quad", pa_cons
, 8},
8622 {"short", pa_cons
, 2},
8623 {"single", pa_float_cons
, 'f'},
8625 {"space", pa_space
, 0},
8626 {"spnum", pa_spnum
, 0},
8628 {"string", pa_stringer
, 0},
8629 {"stringz", pa_stringer
, 1},
8631 {"subspa", pa_subspace
, 0},
8633 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
8634 {"text", pa_text
, 0},
8636 {"version", pa_version
, 0},
8638 {"vtable_entry", pa_vtable_entry
, 0},
8639 {"vtable_inherit", pa_vtable_inherit
, 0},
8641 {"word", pa_cons
, 4},
8647 hppa_cfi_frame_initial_instructions (void)
8649 cfi_add_CFA_def_cfa (30, 0);
8653 hppa_regname_to_dw2regnum (char *regname
)
8655 unsigned int regnum
= -1;
8659 static struct { char *name
; int dw2regnum
; } regnames
[] =
8661 { "sp", 30 }, { "rp", 2 },
8664 for (i
= 0; i
< ARRAY_SIZE (regnames
); ++i
)
8665 if (strcmp (regnames
[i
].name
, regname
) == 0)
8666 return regnames
[i
].dw2regnum
;
8668 if (regname
[0] == 'r')
8671 regnum
= strtoul (p
, &q
, 10);
8672 if (p
== q
|| *q
|| regnum
>= 32)
8675 else if (regname
[0] == 'f' && regname
[1] == 'r')
8678 regnum
= strtoul (p
, &q
, 10);
8679 if (p
== q
|| *q
|| regnum
<= 4 || regnum
>= 32)