1 /* tc-hppa.c -- Assemble for the PA
2 Copyright (C) 1989-2015 Free Software Foundation, Inc.
4 This file is part of GAS, the GNU Assembler.
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to the Free
18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 /* HP PA-RISC support was contributed by the Center for Software Science
22 at the University of Utah. */
25 #include "safe-ctype.h"
27 #include "dw2gencfi.h"
29 #include "bfd/libhppa.h"
31 /* Be careful, this file includes data *declarations*. */
32 #include "opcode/hppa.h"
34 #if defined (OBJ_ELF) && defined (OBJ_SOM)
35 error only one of OBJ_ELF
and OBJ_SOM can be defined
38 /* If we are using ELF, then we probably can support dwarf2 debug
39 records. Furthermore, if we are supporting dwarf2 debug records,
40 then we want to use the assembler support for compact line numbers. */
42 #include "dwarf2dbg.h"
44 /* A "convenient" place to put object file dependencies which do
45 not need to be seen outside of tc-hppa.c. */
47 /* Object file formats specify relocation types. */
48 typedef enum elf_hppa_reloc_type reloc_type
;
50 /* Object file formats specify BFD symbol types. */
51 typedef elf_symbol_type obj_symbol_type
;
52 #define symbol_arg_reloc_info(sym)\
53 (((obj_symbol_type *) symbol_get_bfdsym (sym))->tc_data.hppa_arg_reloc)
55 #if TARGET_ARCH_SIZE == 64
56 /* How to generate a relocation. */
57 #define hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
58 #define elf_hppa_reloc_final_type elf64_hppa_reloc_final_type
60 #define hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
61 #define elf_hppa_reloc_final_type elf32_hppa_reloc_final_type
64 /* ELF objects can have versions, but apparently do not have anywhere
65 to store a copyright string. */
66 #define obj_version obj_elf_version
67 #define obj_copyright obj_elf_version
69 #define UNWIND_SECTION_NAME ".PARISC.unwind"
73 /* Names of various debugging spaces/subspaces. */
74 #define GDB_DEBUG_SPACE_NAME "$GDB_DEBUG$"
75 #define GDB_STRINGS_SUBSPACE_NAME "$GDB_STRINGS$"
76 #define GDB_SYMBOLS_SUBSPACE_NAME "$GDB_SYMBOLS$"
77 #define UNWIND_SECTION_NAME "$UNWIND$"
79 /* Object file formats specify relocation types. */
80 typedef int reloc_type
;
82 /* SOM objects can have both a version string and a copyright string. */
83 #define obj_version obj_som_version
84 #define obj_copyright obj_som_copyright
86 /* How to generate a relocation. */
87 #define hppa_gen_reloc_type hppa_som_gen_reloc_type
89 /* Object file formats specify BFD symbol types. */
90 typedef som_symbol_type obj_symbol_type
;
91 #define symbol_arg_reloc_info(sym)\
92 (((obj_symbol_type *) symbol_get_bfdsym (sym))->tc_data.ap.hppa_arg_reloc)
94 /* This apparently isn't in older versions of hpux reloc.h. */
96 #define R_DLT_REL 0x78
108 #if TARGET_ARCH_SIZE == 64
109 #define DEFAULT_LEVEL 25
111 #define DEFAULT_LEVEL 10
114 /* Various structures and types used internally in tc-hppa.c. */
116 /* Unwind table and descriptor. FIXME: Sync this with GDB version. */
120 unsigned int cannot_unwind
:1;
121 unsigned int millicode
:1;
122 unsigned int millicode_save_rest
:1;
123 unsigned int region_desc
:2;
124 unsigned int save_sr
:2;
125 unsigned int entry_fr
:4;
126 unsigned int entry_gr
:5;
127 unsigned int args_stored
:1;
128 unsigned int call_fr
:5;
129 unsigned int call_gr
:5;
130 unsigned int save_sp
:1;
131 unsigned int save_rp
:1;
132 unsigned int save_rp_in_frame
:1;
133 unsigned int extn_ptr_defined
:1;
134 unsigned int cleanup_defined
:1;
136 unsigned int hpe_interrupt_marker
:1;
137 unsigned int hpux_interrupt_marker
:1;
138 unsigned int reserved
:3;
139 unsigned int frame_size
:27;
142 /* We can't rely on compilers placing bitfields in any particular
143 place, so use these macros when dumping unwind descriptors to
145 #define UNWIND_LOW32(U) \
146 (((U)->cannot_unwind << 31) \
147 | ((U)->millicode << 30) \
148 | ((U)->millicode_save_rest << 29) \
149 | ((U)->region_desc << 27) \
150 | ((U)->save_sr << 25) \
151 | ((U)->entry_fr << 21) \
152 | ((U)->entry_gr << 16) \
153 | ((U)->args_stored << 15) \
154 | ((U)->call_fr << 10) \
155 | ((U)->call_gr << 5) \
156 | ((U)->save_sp << 4) \
157 | ((U)->save_rp << 3) \
158 | ((U)->save_rp_in_frame << 2) \
159 | ((U)->extn_ptr_defined << 1) \
160 | ((U)->cleanup_defined << 0))
162 #define UNWIND_HIGH32(U) \
163 (((U)->hpe_interrupt_marker << 31) \
164 | ((U)->hpux_interrupt_marker << 30) \
165 | ((U)->frame_size << 0))
169 /* Starting and ending offsets of the region described by
171 unsigned int start_offset
;
172 unsigned int end_offset
;
173 struct unwind_desc descriptor
;
176 /* This structure is used by the .callinfo, .enter, .leave pseudo-ops to
177 control the entry and exit code they generate. It is also used in
178 creation of the correct stack unwind descriptors.
180 NOTE: GAS does not support .enter and .leave for the generation of
181 prologues and epilogues. FIXME.
183 The fields in structure roughly correspond to the arguments available on the
184 .callinfo pseudo-op. */
188 /* The unwind descriptor being built. */
189 struct unwind_table ci_unwind
;
191 /* Name of this function. */
192 symbolS
*start_symbol
;
194 /* (temporary) symbol used to mark the end of this function. */
197 /* Next entry in the chain. */
198 struct call_info
*ci_next
;
201 /* Operand formats for FP instructions. Note not all FP instructions
202 allow all four formats to be used (for example fmpysub only allows
206 SGL
, DBL
, ILLEGAL_FMT
, QUAD
, W
, UW
, DW
, UDW
, QW
, UQW
210 /* This fully describes the symbol types which may be attached to
211 an EXPORT or IMPORT directive. Only SOM uses this formation
212 (ELF has no need for it). */
216 SYMBOL_TYPE_ABSOLUTE
,
220 SYMBOL_TYPE_MILLICODE
,
222 SYMBOL_TYPE_PRI_PROG
,
223 SYMBOL_TYPE_SEC_PROG
,
227 /* This structure contains information needed to assemble
228 individual instructions. */
231 /* Holds the opcode after parsing by pa_ip. */
232 unsigned long opcode
;
234 /* Holds an expression associated with the current instruction. */
237 /* Does this instruction use PC-relative addressing. */
240 /* Floating point formats for operand1 and operand2. */
241 fp_operand_format fpof1
;
242 fp_operand_format fpof2
;
244 /* Whether or not we saw a truncation request on an fcnv insn. */
247 /* Holds the field selector for this instruction
248 (for example L%, LR%, etc). */
251 /* Holds any argument relocation bits associated with this
252 instruction. (instruction should be some sort of call). */
253 unsigned int arg_reloc
;
255 /* The format specification for this instruction. */
258 /* The relocation (if any) associated with this instruction. */
262 /* PA-89 floating point registers are arranged like this:
264 +--------------+--------------+
265 | 0 or 16L | 16 or 16R |
266 +--------------+--------------+
267 | 1 or 17L | 17 or 17R |
268 +--------------+--------------+
276 +--------------+--------------+
277 | 14 or 30L | 30 or 30R |
278 +--------------+--------------+
279 | 15 or 31L | 31 or 31R |
280 +--------------+--------------+ */
282 /* Additional information needed to build argument relocation stubs. */
285 /* The argument relocation specification. */
286 unsigned int arg_reloc
;
288 /* Number of arguments. */
289 unsigned int arg_count
;
293 /* This structure defines an entry in the subspace dictionary
296 struct subspace_dictionary_chain
298 /* Nonzero if this space has been defined by the user code. */
299 unsigned int ssd_defined
;
301 /* Name of this subspace. */
304 /* GAS segment and subsegment associated with this subspace. */
308 /* Next space in the subspace dictionary chain. */
309 struct subspace_dictionary_chain
*ssd_next
;
312 typedef struct subspace_dictionary_chain ssd_chain_struct
;
314 /* This structure defines an entry in the subspace dictionary
317 struct space_dictionary_chain
319 /* Nonzero if this space has been defined by the user code or
320 as a default space. */
321 unsigned int sd_defined
;
323 /* Nonzero if this spaces has been defined by the user code. */
324 unsigned int sd_user_defined
;
326 /* The space number (or index). */
327 unsigned int sd_spnum
;
329 /* The name of this subspace. */
332 /* GAS segment to which this subspace corresponds. */
335 /* Current subsegment number being used. */
338 /* The chain of subspaces contained within this space. */
339 ssd_chain_struct
*sd_subspaces
;
341 /* The next entry in the space dictionary chain. */
342 struct space_dictionary_chain
*sd_next
;
345 typedef struct space_dictionary_chain sd_chain_struct
;
347 /* This structure defines attributes of the default subspace
348 dictionary entries. */
350 struct default_subspace_dict
352 /* Name of the subspace. */
355 /* FIXME. Is this still needed? */
358 /* Nonzero if this subspace is loadable. */
361 /* Nonzero if this subspace contains only code. */
364 /* Nonzero if this is a comdat subspace. */
367 /* Nonzero if this is a common subspace. */
370 /* Nonzero if this is a common subspace which allows symbols
371 to be multiply defined. */
374 /* Nonzero if this subspace should be zero filled. */
377 /* Sort key for this subspace. */
380 /* Access control bits for this subspace. Can represent RWX access
381 as well as privilege level changes for gateways. */
384 /* Index of containing space. */
387 /* Alignment (in bytes) of this subspace. */
390 /* Quadrant within space where this subspace should be loaded. */
393 /* An index into the default spaces array. */
396 /* Subsegment associated with this subspace. */
400 /* This structure defines attributes of the default space
401 dictionary entries. */
403 struct default_space_dict
405 /* Name of the space. */
408 /* Space number. It is possible to identify spaces within
409 assembly code numerically! */
412 /* Nonzero if this space is loadable. */
415 /* Nonzero if this space is "defined". FIXME is still needed */
418 /* Nonzero if this space can not be shared. */
421 /* Sort key for this space. */
424 /* Segment associated with this space. */
429 /* Structure for previous label tracking. Needed so that alignments,
430 callinfo declarations, etc can be easily attached to a particular
432 typedef struct label_symbol_struct
434 struct symbol
*lss_label
;
436 sd_chain_struct
*lss_space
;
441 struct label_symbol_struct
*lss_next
;
445 /* Extra information needed to perform fixups (relocations) on the PA. */
446 struct hppa_fix_struct
448 /* The field selector. */
449 enum hppa_reloc_field_selector_type_alt fx_r_field
;
454 /* Format of fixup. */
457 /* Argument relocation bits. */
458 unsigned int fx_arg_reloc
;
460 /* The segment this fixup appears in. */
464 /* Structure to hold information about predefined registers. */
472 /* This structure defines the mapping from a FP condition string
473 to a condition number which can be recorded in an instruction. */
480 /* This structure defines a mapping from a field selector
481 string to a field selector type. */
482 struct selector_entry
488 /* Prototypes for functions local to tc-hppa.c. */
491 static void pa_check_current_space_and_subspace (void);
494 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
495 static void pa_text (int);
496 static void pa_data (int);
497 static void pa_comm (int);
500 static int exact_log2 (int);
501 static void pa_compiler (int);
502 static void pa_align (int);
503 static void pa_space (int);
504 static void pa_spnum (int);
505 static void pa_subspace (int);
506 static sd_chain_struct
*create_new_space (char *, int, int,
509 static ssd_chain_struct
*create_new_subspace (sd_chain_struct
*,
514 static ssd_chain_struct
*update_subspace (sd_chain_struct
*,
515 char *, int, int, int,
519 static sd_chain_struct
*is_defined_space (char *);
520 static ssd_chain_struct
*is_defined_subspace (char *);
521 static sd_chain_struct
*pa_segment_to_space (asection
*);
522 static ssd_chain_struct
*pa_subsegment_to_subspace (asection
*,
524 static sd_chain_struct
*pa_find_space_by_number (int);
525 static unsigned int pa_subspace_start (sd_chain_struct
*, int);
526 static sd_chain_struct
*pa_parse_space_stmt (char *, int);
529 /* File and globally scoped variable declarations. */
532 /* Root and final entry in the space chain. */
533 static sd_chain_struct
*space_dict_root
;
534 static sd_chain_struct
*space_dict_last
;
536 /* The current space and subspace. */
537 static sd_chain_struct
*current_space
;
538 static ssd_chain_struct
*current_subspace
;
541 /* Root of the call_info chain. */
542 static struct call_info
*call_info_root
;
544 /* The last call_info (for functions) structure
545 seen so it can be associated with fixups and
547 static struct call_info
*last_call_info
;
549 /* The last call description (for actual calls). */
550 static struct call_desc last_call_desc
;
552 /* handle of the OPCODE hash table */
553 static struct hash_control
*op_hash
= NULL
;
555 /* These characters can be suffixes of opcode names and they may be
556 followed by meaningful whitespace. We don't include `,' and `!'
557 as they never appear followed by meaningful whitespace. */
558 const char hppa_symbol_chars
[] = "*?=<>";
560 /* This array holds the chars that only start a comment at the beginning of
561 a line. If the line seems to have the form '# 123 filename'
562 .line and .file directives will appear in the pre-processed output.
564 Note that input_file.c hand checks for '#' at the beginning of the
565 first line of the input file. This is because the compiler outputs
566 #NO_APP at the beginning of its output.
568 Also note that C style comments will always work. */
569 const char line_comment_chars
[] = "#";
571 /* This array holds the chars that always start a comment. If the
572 pre-processor is disabled, these aren't very useful. */
573 const char comment_chars
[] = ";";
575 /* This array holds the characters which act as line separators. */
576 const char line_separator_chars
[] = "!";
578 /* Chars that can be used to separate mant from exp in floating point nums. */
579 const char EXP_CHARS
[] = "eE";
581 /* Chars that mean this number is a floating point constant.
582 As in 0f12.456 or 0d1.2345e12.
584 Be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
585 changed in read.c. Ideally it shouldn't have to know about it
586 at all, but nothing is ideal around here. */
587 const char FLT_CHARS
[] = "rRsSfFdDxXpP";
589 static struct pa_it the_insn
;
591 /* Points to the end of an expression just parsed by get_expression
592 and friends. FIXME. This shouldn't be handled with a file-global
594 static char *expr_end
;
596 /* Nonzero if a .callinfo appeared within the current procedure. */
597 static int callinfo_found
;
599 /* Nonzero if the assembler is currently within a .entry/.exit pair. */
600 static int within_entry_exit
;
602 /* Nonzero if the assembler is currently within a procedure definition. */
603 static int within_procedure
;
605 /* Handle on structure which keep track of the last symbol
606 seen in each subspace. */
607 static label_symbol_struct
*label_symbols_rootp
= NULL
;
609 /* Nonzero when strict matching is enabled. Zero otherwise.
611 Each opcode in the table has a flag which indicates whether or
612 not strict matching should be enabled for that instruction.
614 Mainly, strict causes errors to be ignored when a match failure
615 occurs. However, it also affects the parsing of register fields
616 by pa_parse_number. */
619 /* pa_parse_number returns values in `pa_number'. Mostly
620 pa_parse_number is used to return a register number, with floating
621 point registers being numbered from FP_REG_BASE upwards.
622 The bit specified with FP_REG_RSEL is set if the floating point
623 register has a `r' suffix. */
624 #define FP_REG_BASE 64
625 #define FP_REG_RSEL 128
626 static int pa_number
;
629 /* A dummy bfd symbol so that all relocations have symbols of some kind. */
630 static symbolS
*dummy_symbol
;
633 /* Nonzero if errors are to be printed. */
634 static int print_errors
= 1;
636 /* List of registers that are pre-defined:
638 Each general register has one predefined name of the form
639 %r<REGNUM> which has the value <REGNUM>.
641 Space and control registers are handled in a similar manner,
642 but use %sr<REGNUM> and %cr<REGNUM> as their predefined names.
644 Likewise for the floating point registers, but of the form
645 %fr<REGNUM>. Floating point registers have additional predefined
646 names with 'L' and 'R' suffixes (e.g. %fr19L, %fr19R) which
647 again have the value <REGNUM>.
649 Many registers also have synonyms:
651 %r26 - %r23 have %arg0 - %arg3 as synonyms
652 %r28 - %r29 have %ret0 - %ret1 as synonyms
653 %fr4 - %fr7 have %farg0 - %farg3 as synonyms
654 %r30 has %sp as a synonym
655 %r27 has %dp as a synonym
656 %r2 has %rp as a synonym
658 Almost every control register has a synonym; they are not listed
661 The table is sorted. Suitable for searching by a binary search. */
663 static const struct pd_reg pre_defined_registers
[] =
697 {"%farg0", 4 + FP_REG_BASE
},
698 {"%farg1", 5 + FP_REG_BASE
},
699 {"%farg2", 6 + FP_REG_BASE
},
700 {"%farg3", 7 + FP_REG_BASE
},
701 {"%fr0", 0 + FP_REG_BASE
},
702 {"%fr0l", 0 + FP_REG_BASE
},
703 {"%fr0r", 0 + FP_REG_BASE
+ FP_REG_RSEL
},
704 {"%fr1", 1 + FP_REG_BASE
},
705 {"%fr10", 10 + FP_REG_BASE
},
706 {"%fr10l", 10 + FP_REG_BASE
},
707 {"%fr10r", 10 + FP_REG_BASE
+ FP_REG_RSEL
},
708 {"%fr11", 11 + FP_REG_BASE
},
709 {"%fr11l", 11 + FP_REG_BASE
},
710 {"%fr11r", 11 + FP_REG_BASE
+ FP_REG_RSEL
},
711 {"%fr12", 12 + FP_REG_BASE
},
712 {"%fr12l", 12 + FP_REG_BASE
},
713 {"%fr12r", 12 + FP_REG_BASE
+ FP_REG_RSEL
},
714 {"%fr13", 13 + FP_REG_BASE
},
715 {"%fr13l", 13 + FP_REG_BASE
},
716 {"%fr13r", 13 + FP_REG_BASE
+ FP_REG_RSEL
},
717 {"%fr14", 14 + FP_REG_BASE
},
718 {"%fr14l", 14 + FP_REG_BASE
},
719 {"%fr14r", 14 + FP_REG_BASE
+ FP_REG_RSEL
},
720 {"%fr15", 15 + FP_REG_BASE
},
721 {"%fr15l", 15 + FP_REG_BASE
},
722 {"%fr15r", 15 + FP_REG_BASE
+ FP_REG_RSEL
},
723 {"%fr16", 16 + FP_REG_BASE
},
724 {"%fr16l", 16 + FP_REG_BASE
},
725 {"%fr16r", 16 + FP_REG_BASE
+ FP_REG_RSEL
},
726 {"%fr17", 17 + FP_REG_BASE
},
727 {"%fr17l", 17 + FP_REG_BASE
},
728 {"%fr17r", 17 + FP_REG_BASE
+ FP_REG_RSEL
},
729 {"%fr18", 18 + FP_REG_BASE
},
730 {"%fr18l", 18 + FP_REG_BASE
},
731 {"%fr18r", 18 + FP_REG_BASE
+ FP_REG_RSEL
},
732 {"%fr19", 19 + FP_REG_BASE
},
733 {"%fr19l", 19 + FP_REG_BASE
},
734 {"%fr19r", 19 + FP_REG_BASE
+ FP_REG_RSEL
},
735 {"%fr1l", 1 + FP_REG_BASE
},
736 {"%fr1r", 1 + FP_REG_BASE
+ FP_REG_RSEL
},
737 {"%fr2", 2 + FP_REG_BASE
},
738 {"%fr20", 20 + FP_REG_BASE
},
739 {"%fr20l", 20 + FP_REG_BASE
},
740 {"%fr20r", 20 + FP_REG_BASE
+ FP_REG_RSEL
},
741 {"%fr21", 21 + FP_REG_BASE
},
742 {"%fr21l", 21 + FP_REG_BASE
},
743 {"%fr21r", 21 + FP_REG_BASE
+ FP_REG_RSEL
},
744 {"%fr22", 22 + FP_REG_BASE
},
745 {"%fr22l", 22 + FP_REG_BASE
},
746 {"%fr22r", 22 + FP_REG_BASE
+ FP_REG_RSEL
},
747 {"%fr23", 23 + FP_REG_BASE
},
748 {"%fr23l", 23 + FP_REG_BASE
},
749 {"%fr23r", 23 + FP_REG_BASE
+ FP_REG_RSEL
},
750 {"%fr24", 24 + FP_REG_BASE
},
751 {"%fr24l", 24 + FP_REG_BASE
},
752 {"%fr24r", 24 + FP_REG_BASE
+ FP_REG_RSEL
},
753 {"%fr25", 25 + FP_REG_BASE
},
754 {"%fr25l", 25 + FP_REG_BASE
},
755 {"%fr25r", 25 + FP_REG_BASE
+ FP_REG_RSEL
},
756 {"%fr26", 26 + FP_REG_BASE
},
757 {"%fr26l", 26 + FP_REG_BASE
},
758 {"%fr26r", 26 + FP_REG_BASE
+ FP_REG_RSEL
},
759 {"%fr27", 27 + FP_REG_BASE
},
760 {"%fr27l", 27 + FP_REG_BASE
},
761 {"%fr27r", 27 + FP_REG_BASE
+ FP_REG_RSEL
},
762 {"%fr28", 28 + FP_REG_BASE
},
763 {"%fr28l", 28 + FP_REG_BASE
},
764 {"%fr28r", 28 + FP_REG_BASE
+ FP_REG_RSEL
},
765 {"%fr29", 29 + FP_REG_BASE
},
766 {"%fr29l", 29 + FP_REG_BASE
},
767 {"%fr29r", 29 + FP_REG_BASE
+ FP_REG_RSEL
},
768 {"%fr2l", 2 + FP_REG_BASE
},
769 {"%fr2r", 2 + FP_REG_BASE
+ FP_REG_RSEL
},
770 {"%fr3", 3 + FP_REG_BASE
},
771 {"%fr30", 30 + FP_REG_BASE
},
772 {"%fr30l", 30 + FP_REG_BASE
},
773 {"%fr30r", 30 + FP_REG_BASE
+ FP_REG_RSEL
},
774 {"%fr31", 31 + FP_REG_BASE
},
775 {"%fr31l", 31 + FP_REG_BASE
},
776 {"%fr31r", 31 + FP_REG_BASE
+ FP_REG_RSEL
},
777 {"%fr3l", 3 + FP_REG_BASE
},
778 {"%fr3r", 3 + FP_REG_BASE
+ FP_REG_RSEL
},
779 {"%fr4", 4 + FP_REG_BASE
},
780 {"%fr4l", 4 + FP_REG_BASE
},
781 {"%fr4r", 4 + FP_REG_BASE
+ FP_REG_RSEL
},
782 {"%fr5", 5 + FP_REG_BASE
},
783 {"%fr5l", 5 + FP_REG_BASE
},
784 {"%fr5r", 5 + FP_REG_BASE
+ FP_REG_RSEL
},
785 {"%fr6", 6 + FP_REG_BASE
},
786 {"%fr6l", 6 + FP_REG_BASE
},
787 {"%fr6r", 6 + FP_REG_BASE
+ FP_REG_RSEL
},
788 {"%fr7", 7 + FP_REG_BASE
},
789 {"%fr7l", 7 + FP_REG_BASE
},
790 {"%fr7r", 7 + FP_REG_BASE
+ FP_REG_RSEL
},
791 {"%fr8", 8 + FP_REG_BASE
},
792 {"%fr8l", 8 + FP_REG_BASE
},
793 {"%fr8r", 8 + FP_REG_BASE
+ FP_REG_RSEL
},
794 {"%fr9", 9 + FP_REG_BASE
},
795 {"%fr9l", 9 + FP_REG_BASE
},
796 {"%fr9r", 9 + FP_REG_BASE
+ FP_REG_RSEL
},
805 #if TARGET_ARCH_SIZE == 64
881 /* This table is sorted by order of the length of the string. This is
882 so we check for <> before we check for <. If we had a <> and checked
883 for < first, we would get a false match. */
884 static const struct fp_cond_map fp_cond_map
[] =
920 static const struct selector_entry selector_table
[] =
945 /* default space and subspace dictionaries */
947 #define GDB_SYMBOLS GDB_SYMBOLS_SUBSPACE_NAME
948 #define GDB_STRINGS GDB_STRINGS_SUBSPACE_NAME
950 /* pre-defined subsegments (subspaces) for the HPPA. */
951 #define SUBSEG_CODE 0
953 #define SUBSEG_MILLI 2
954 #define SUBSEG_DATA 0
956 #define SUBSEG_UNWIND 3
957 #define SUBSEG_GDB_STRINGS 0
958 #define SUBSEG_GDB_SYMBOLS 1
960 static struct default_subspace_dict pa_def_subspaces
[] =
962 {"$CODE$", 1, 1, 1, 0, 0, 0, 0, 24, 0x2c, 0, 8, 0, 0, SUBSEG_CODE
},
963 {"$DATA$", 1, 1, 0, 0, 0, 0, 0, 24, 0x1f, 1, 8, 1, 1, SUBSEG_DATA
},
964 {"$LIT$", 1, 1, 0, 0, 0, 0, 0, 16, 0x2c, 0, 8, 0, 0, SUBSEG_LIT
},
965 {"$MILLICODE$", 1, 1, 0, 0, 0, 0, 0, 8, 0x2c, 0, 8, 0, 0, SUBSEG_MILLI
},
966 {"$BSS$", 1, 1, 0, 0, 0, 0, 1, 80, 0x1f, 1, 8, 1, 1, SUBSEG_BSS
},
967 {NULL
, 0, 1, 0, 0, 0, 0, 0, 255, 0x1f, 0, 4, 0, 0, 0}
970 static struct default_space_dict pa_def_spaces
[] =
972 {"$TEXT$", 0, 1, 1, 0, 8, ASEC_NULL
},
973 {"$PRIVATE$", 1, 1, 1, 1, 16, ASEC_NULL
},
974 {NULL
, 0, 0, 0, 0, 0, ASEC_NULL
}
977 /* Misc local definitions used by the assembler. */
979 /* These macros are used to maintain spaces/subspaces. */
980 #define SPACE_DEFINED(space_chain) (space_chain)->sd_defined
981 #define SPACE_USER_DEFINED(space_chain) (space_chain)->sd_user_defined
982 #define SPACE_SPNUM(space_chain) (space_chain)->sd_spnum
983 #define SPACE_NAME(space_chain) (space_chain)->sd_name
985 #define SUBSPACE_DEFINED(ss_chain) (ss_chain)->ssd_defined
986 #define SUBSPACE_NAME(ss_chain) (ss_chain)->ssd_name
989 /* Return nonzero if the string pointed to by S potentially represents
990 a right or left half of a FP register */
991 #define IS_R_SELECT(S) (*(S) == 'R' || *(S) == 'r')
992 #define IS_L_SELECT(S) (*(S) == 'L' || *(S) == 'l')
994 /* Store immediate values of shift/deposit/extract functions. */
996 #define SAVE_IMMEDIATE(VALUE) \
998 if (immediate_check) \
1002 else if (len == -1) \
1007 /* Insert FIELD into OPCODE starting at bit START. Continue pa_ip
1008 main loop after insertion. */
1010 #define INSERT_FIELD_AND_CONTINUE(OPCODE, FIELD, START) \
1012 ((OPCODE) |= (FIELD) << (START)); \
1016 /* Simple range checking for FIELD against HIGH and LOW bounds.
1017 IGNORE is used to suppress the error message. */
1019 #define CHECK_FIELD(FIELD, HIGH, LOW, IGNORE) \
1021 if ((FIELD) > (HIGH) || (FIELD) < (LOW)) \
1024 as_bad (_("Field out of range [%d..%d] (%d)."), (LOW), (HIGH), \
1030 /* Variant of CHECK_FIELD for use in md_apply_fix and other places where
1031 the current file and line number are not valid. */
1033 #define CHECK_FIELD_WHERE(FIELD, HIGH, LOW, FILENAME, LINE) \
1035 if ((FIELD) > (HIGH) || (FIELD) < (LOW)) \
1037 as_bad_where ((FILENAME), (LINE), \
1038 _("Field out of range [%d..%d] (%d)."), (LOW), (HIGH), \
1044 /* Simple alignment checking for FIELD against ALIGN (a power of two).
1045 IGNORE is used to suppress the error message. */
1047 #define CHECK_ALIGN(FIELD, ALIGN, IGNORE) \
1049 if ((FIELD) & ((ALIGN) - 1)) \
1052 as_bad (_("Field not properly aligned [%d] (%d)."), (ALIGN), \
1058 #define is_DP_relative(exp) \
1059 ((exp).X_op == O_subtract \
1060 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$global$") == 0)
1062 #define is_SB_relative(exp) \
1063 ((exp).X_op == O_subtract \
1064 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$segrel$") == 0)
1066 #define is_PC_relative(exp) \
1067 ((exp).X_op == O_subtract \
1068 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$PIC_pcrel$0") == 0)
1070 #define is_tls_gdidx(exp) \
1071 ((exp).X_op == O_subtract \
1072 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_gdidx$") == 0)
1074 #define is_tls_ldidx(exp) \
1075 ((exp).X_op == O_subtract \
1076 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_ldidx$") == 0)
1078 #define is_tls_dtpoff(exp) \
1079 ((exp).X_op == O_subtract \
1080 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_dtpoff$") == 0)
1082 #define is_tls_ieoff(exp) \
1083 ((exp).X_op == O_subtract \
1084 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_ieoff$") == 0)
1086 #define is_tls_leoff(exp) \
1087 ((exp).X_op == O_subtract \
1088 && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_leoff$") == 0)
1090 /* We need some complex handling for stabs (sym1 - sym2). Luckily, we'll
1091 always be able to reduce the expression to a constant, so we don't
1092 need real complex handling yet. */
1093 #define is_complex(exp) \
1094 ((exp).X_op != O_constant && (exp).X_op != O_symbol)
1096 /* Actual functions to implement the PA specific code for the assembler. */
1098 /* Called before writing the object file. Make sure entry/exit and
1099 proc/procend pairs match. */
1104 if (within_entry_exit
)
1105 as_fatal (_("Missing .exit\n"));
1107 if (within_procedure
)
1108 as_fatal (_("Missing .procend\n"));
1111 /* Returns a pointer to the label_symbol_struct for the current space.
1112 or NULL if no label_symbol_struct exists for the current space. */
1114 static label_symbol_struct
*
1117 label_symbol_struct
*label_chain
;
1119 for (label_chain
= label_symbols_rootp
;
1121 label_chain
= label_chain
->lss_next
)
1124 if (current_space
== label_chain
->lss_space
&& label_chain
->lss_label
)
1128 if (now_seg
== label_chain
->lss_segment
&& label_chain
->lss_label
)
1136 /* Defines a label for the current space. If one is already defined,
1137 this function will replace it with the new label. */
1140 pa_define_label (symbolS
*symbol
)
1142 label_symbol_struct
*label_chain
= pa_get_label ();
1145 label_chain
->lss_label
= symbol
;
1148 /* Create a new label entry and add it to the head of the chain. */
1149 label_chain
= xmalloc (sizeof (label_symbol_struct
));
1150 label_chain
->lss_label
= symbol
;
1152 label_chain
->lss_space
= current_space
;
1155 label_chain
->lss_segment
= now_seg
;
1157 label_chain
->lss_next
= NULL
;
1159 if (label_symbols_rootp
)
1160 label_chain
->lss_next
= label_symbols_rootp
;
1162 label_symbols_rootp
= label_chain
;
1166 dwarf2_emit_label (symbol
);
1170 /* Removes a label definition for the current space.
1171 If there is no label_symbol_struct entry, then no action is taken. */
1174 pa_undefine_label (void)
1176 label_symbol_struct
*label_chain
;
1177 label_symbol_struct
*prev_label_chain
= NULL
;
1179 for (label_chain
= label_symbols_rootp
;
1181 label_chain
= label_chain
->lss_next
)
1185 && current_space
== label_chain
->lss_space
&& label_chain
->lss_label
1188 && now_seg
== label_chain
->lss_segment
&& label_chain
->lss_label
1192 /* Remove the label from the chain and free its memory. */
1193 if (prev_label_chain
)
1194 prev_label_chain
->lss_next
= label_chain
->lss_next
;
1196 label_symbols_rootp
= label_chain
->lss_next
;
1201 prev_label_chain
= label_chain
;
1205 /* An HPPA-specific version of fix_new. This is required because the HPPA
1206 code needs to keep track of some extra stuff. Each call to fix_new_hppa
1207 results in the creation of an instance of an hppa_fix_struct. An
1208 hppa_fix_struct stores the extra information along with a pointer to the
1209 original fixS. This is attached to the original fixup via the
1210 tc_fix_data field. */
1213 fix_new_hppa (fragS
*frag
,
1216 symbolS
*add_symbol
,
1220 bfd_reloc_code_real_type r_type
,
1221 enum hppa_reloc_field_selector_type_alt r_field
,
1223 unsigned int arg_reloc
,
1224 int unwind_bits ATTRIBUTE_UNUSED
)
1227 struct hppa_fix_struct
*hppa_fix
= obstack_alloc (¬es
, sizeof (struct hppa_fix_struct
));
1230 new_fix
= fix_new_exp (frag
, where
, size
, exp
, pcrel
, r_type
);
1232 new_fix
= fix_new (frag
, where
, size
, add_symbol
, offset
, pcrel
, r_type
);
1233 new_fix
->tc_fix_data
= (void *) hppa_fix
;
1234 hppa_fix
->fx_r_type
= r_type
;
1235 hppa_fix
->fx_r_field
= r_field
;
1236 hppa_fix
->fx_r_format
= r_format
;
1237 hppa_fix
->fx_arg_reloc
= arg_reloc
;
1238 hppa_fix
->segment
= now_seg
;
1240 if (r_type
== R_ENTRY
|| r_type
== R_EXIT
)
1241 new_fix
->fx_offset
= unwind_bits
;
1244 /* foo-$global$ is used to access non-automatic storage. $global$
1245 is really just a marker and has served its purpose, so eliminate
1246 it now so as not to confuse write.c. Ditto for $PIC_pcrel$0. */
1247 if (new_fix
->fx_subsy
1248 && (strcmp (S_GET_NAME (new_fix
->fx_subsy
), "$global$") == 0
1249 || strcmp (S_GET_NAME (new_fix
->fx_subsy
), "$segrel$") == 0
1250 || strcmp (S_GET_NAME (new_fix
->fx_subsy
), "$PIC_pcrel$0") == 0
1251 || strcmp (S_GET_NAME (new_fix
->fx_subsy
), "$tls_gdidx$") == 0
1252 || strcmp (S_GET_NAME (new_fix
->fx_subsy
), "$tls_ldidx$") == 0
1253 || strcmp (S_GET_NAME (new_fix
->fx_subsy
), "$tls_dtpoff$") == 0
1254 || strcmp (S_GET_NAME (new_fix
->fx_subsy
), "$tls_ieoff$") == 0
1255 || strcmp (S_GET_NAME (new_fix
->fx_subsy
), "$tls_leoff$") == 0))
1256 new_fix
->fx_subsy
= NULL
;
1259 /* This fix_new is called by cons via TC_CONS_FIX_NEW.
1260 hppa_field_selector is set by the parse_cons_expression_hppa. */
1263 cons_fix_new_hppa (fragS
*frag
, int where
, int size
, expressionS
*exp
,
1264 int hppa_field_selector
)
1266 unsigned int rel_type
;
1268 /* Get a base relocation type. */
1269 if (is_DP_relative (*exp
))
1270 rel_type
= R_HPPA_GOTOFF
;
1271 else if (is_PC_relative (*exp
))
1272 rel_type
= R_HPPA_PCREL_CALL
;
1274 else if (is_SB_relative (*exp
))
1275 rel_type
= R_PARISC_SEGREL32
;
1276 else if (is_tls_gdidx (*exp
))
1277 rel_type
= R_PARISC_TLS_GD21L
;
1278 else if (is_tls_ldidx (*exp
))
1279 rel_type
= R_PARISC_TLS_LDM21L
;
1280 else if (is_tls_dtpoff (*exp
))
1281 rel_type
= R_PARISC_TLS_LDO21L
;
1282 else if (is_tls_ieoff (*exp
))
1283 rel_type
= R_PARISC_TLS_IE21L
;
1284 else if (is_tls_leoff (*exp
))
1285 rel_type
= R_PARISC_TLS_LE21L
;
1287 else if (is_complex (*exp
))
1288 rel_type
= R_HPPA_COMPLEX
;
1292 if (hppa_field_selector
!= e_psel
&& hppa_field_selector
!= e_fsel
)
1294 as_warn (_("Invalid field selector. Assuming F%%."));
1295 hppa_field_selector
= e_fsel
;
1298 fix_new_hppa (frag
, where
, size
,
1299 (symbolS
*) NULL
, (offsetT
) 0, exp
, 0, rel_type
,
1300 hppa_field_selector
, size
* 8, 0, 0);
1303 /* Mark (via expr_end) the end of an expression (I think). FIXME. */
1306 get_expression (char *str
)
1311 save_in
= input_line_pointer
;
1312 input_line_pointer
= str
;
1313 seg
= expression (&the_insn
.exp
);
1314 if (!(seg
== absolute_section
1315 || seg
== undefined_section
1316 || SEG_NORMAL (seg
)))
1318 as_warn (_("Bad segment in expression."));
1319 expr_end
= input_line_pointer
;
1320 input_line_pointer
= save_in
;
1323 expr_end
= input_line_pointer
;
1324 input_line_pointer
= save_in
;
1327 /* Parse a PA nullification completer (,n). Return nonzero if the
1328 completer was found; return zero if no completer was found. */
1331 pa_parse_nullif (char **s
)
1339 if (strncasecmp (*s
, "n", 1) == 0)
1343 as_bad (_("Invalid Nullification: (%c)"), **s
);
1353 md_atof (int type
, char *litP
, int *sizeP
)
1355 return ieee_md_atof (type
, litP
, sizeP
, TRUE
);
1358 /* Write out big-endian. */
1361 md_number_to_chars (char *buf
, valueT val
, int n
)
1363 number_to_chars_bigendian (buf
, val
, n
);
1366 /* Translate internal representation of relocation info to BFD target
1370 tc_gen_reloc (asection
*section
, fixS
*fixp
)
1373 struct hppa_fix_struct
*hppa_fixp
;
1374 static arelent
*no_relocs
= NULL
;
1381 hppa_fixp
= (struct hppa_fix_struct
*) fixp
->tc_fix_data
;
1382 if (fixp
->fx_addsy
== 0)
1385 gas_assert (hppa_fixp
!= 0);
1386 gas_assert (section
!= 0);
1388 reloc
= xmalloc (sizeof (arelent
));
1390 reloc
->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
1391 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1393 /* Allow fixup_segment to recognize hand-written pc-relative relocations.
1394 When we went through cons_fix_new_hppa, we classified them as complex. */
1395 /* ??? It might be better to hide this +8 stuff in tc_cfi_emit_pcrel_expr,
1396 undefine DIFF_EXPR_OK, and let these sorts of complex expressions fail
1397 when R_HPPA_COMPLEX == R_PARISC_UNIMPLEMENTED. */
1398 if (fixp
->fx_r_type
== (bfd_reloc_code_real_type
) R_HPPA_COMPLEX
1401 fixp
->fx_r_type
= R_HPPA_PCREL_CALL
;
1402 fixp
->fx_offset
+= 8;
1405 codes
= hppa_gen_reloc_type (stdoutput
,
1407 hppa_fixp
->fx_r_format
,
1408 hppa_fixp
->fx_r_field
,
1409 fixp
->fx_subsy
!= NULL
,
1410 symbol_get_bfdsym (fixp
->fx_addsy
));
1414 as_bad_where (fixp
->fx_file
, fixp
->fx_line
, _("Cannot handle fixup"));
1418 for (n_relocs
= 0; codes
[n_relocs
]; n_relocs
++)
1421 relocs
= xmalloc (sizeof (arelent
*) * n_relocs
+ 1);
1422 reloc
= xmalloc (sizeof (arelent
) * n_relocs
);
1423 for (i
= 0; i
< n_relocs
; i
++)
1424 relocs
[i
] = &reloc
[i
];
1426 relocs
[n_relocs
] = NULL
;
1429 switch (fixp
->fx_r_type
)
1432 gas_assert (n_relocs
== 1);
1436 /* Now, do any processing that is dependent on the relocation type. */
1439 case R_PARISC_DLTREL21L
:
1440 case R_PARISC_DLTREL14R
:
1441 case R_PARISC_DLTREL14F
:
1442 case R_PARISC_PLABEL32
:
1443 case R_PARISC_PLABEL21L
:
1444 case R_PARISC_PLABEL14R
:
1445 /* For plabel relocations, the addend of the
1446 relocation should be either 0 (no static link) or 2
1447 (static link required). This adjustment is done in
1448 bfd/elf32-hppa.c:elf32_hppa_relocate_section.
1450 We also slam a zero addend into the DLT relative relocs;
1451 it doesn't make a lot of sense to use any addend since
1452 it gets you a different (eg unknown) DLT entry. */
1456 #ifdef ELF_ARG_RELOC
1457 case R_PARISC_PCREL17R
:
1458 case R_PARISC_PCREL17F
:
1459 case R_PARISC_PCREL17C
:
1460 case R_PARISC_DIR17R
:
1461 case R_PARISC_DIR17F
:
1462 case R_PARISC_PCREL21L
:
1463 case R_PARISC_DIR21L
:
1464 reloc
->addend
= HPPA_R_ADDEND (hppa_fixp
->fx_arg_reloc
,
1469 case R_PARISC_DIR32
:
1470 /* Facilitate hand-crafted unwind info. */
1471 if (strcmp (section
->name
, UNWIND_SECTION_NAME
) == 0)
1472 code
= R_PARISC_SEGREL32
;
1476 reloc
->addend
= fixp
->fx_offset
;
1480 reloc
->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
1481 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1482 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
,
1483 (bfd_reloc_code_real_type
) code
);
1484 reloc
->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1486 gas_assert (reloc
->howto
&& (unsigned int) code
== reloc
->howto
->type
);
1491 /* Walk over reach relocation returned by the BFD backend. */
1492 for (i
= 0; i
< n_relocs
; i
++)
1496 relocs
[i
]->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
1497 *relocs
[i
]->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1499 bfd_reloc_type_lookup (stdoutput
,
1500 (bfd_reloc_code_real_type
) code
);
1501 relocs
[i
]->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1506 /* The only time we ever use a R_COMP2 fixup is for the difference
1507 of two symbols. With that in mind we fill in all four
1508 relocs now and break out of the loop. */
1509 gas_assert (i
== 1);
1510 relocs
[0]->sym_ptr_ptr
1511 = (asymbol
**) bfd_abs_section_ptr
->symbol_ptr_ptr
;
1513 = bfd_reloc_type_lookup (stdoutput
,
1514 (bfd_reloc_code_real_type
) *codes
[0]);
1515 relocs
[0]->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1516 relocs
[0]->addend
= 0;
1517 relocs
[1]->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
1518 *relocs
[1]->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_addsy
);
1520 = bfd_reloc_type_lookup (stdoutput
,
1521 (bfd_reloc_code_real_type
) *codes
[1]);
1522 relocs
[1]->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1523 relocs
[1]->addend
= 0;
1524 relocs
[2]->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
1525 *relocs
[2]->sym_ptr_ptr
= symbol_get_bfdsym (fixp
->fx_subsy
);
1527 = bfd_reloc_type_lookup (stdoutput
,
1528 (bfd_reloc_code_real_type
) *codes
[2]);
1529 relocs
[2]->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1530 relocs
[2]->addend
= 0;
1531 relocs
[3]->sym_ptr_ptr
1532 = (asymbol
**) bfd_abs_section_ptr
->symbol_ptr_ptr
;
1534 = bfd_reloc_type_lookup (stdoutput
,
1535 (bfd_reloc_code_real_type
) *codes
[3]);
1536 relocs
[3]->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1537 relocs
[3]->addend
= 0;
1538 relocs
[4]->sym_ptr_ptr
1539 = (asymbol
**) bfd_abs_section_ptr
->symbol_ptr_ptr
;
1541 = bfd_reloc_type_lookup (stdoutput
,
1542 (bfd_reloc_code_real_type
) *codes
[4]);
1543 relocs
[4]->address
= fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
1544 relocs
[4]->addend
= 0;
1548 relocs
[i
]->addend
= HPPA_R_ADDEND (hppa_fixp
->fx_arg_reloc
, 0);
1554 /* For plabel relocations, the addend of the
1555 relocation should be either 0 (no static link) or 2
1556 (static link required).
1558 FIXME: We always assume no static link!
1560 We also slam a zero addend into the DLT relative relocs;
1561 it doesn't make a lot of sense to use any addend since
1562 it gets you a different (eg unknown) DLT entry. */
1563 relocs
[i
]->addend
= 0;
1578 /* There is no symbol or addend associated with these fixups. */
1579 relocs
[i
]->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
1580 *relocs
[i
]->sym_ptr_ptr
= symbol_get_bfdsym (dummy_symbol
);
1581 relocs
[i
]->addend
= 0;
1587 /* There is no symbol associated with these fixups. */
1588 relocs
[i
]->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
1589 *relocs
[i
]->sym_ptr_ptr
= symbol_get_bfdsym (dummy_symbol
);
1590 relocs
[i
]->addend
= fixp
->fx_offset
;
1594 relocs
[i
]->addend
= fixp
->fx_offset
;
1604 /* Process any machine dependent frag types. */
1607 md_convert_frag (bfd
*abfd ATTRIBUTE_UNUSED
,
1608 asection
*sec ATTRIBUTE_UNUSED
,
1611 unsigned int address
;
1613 if (fragP
->fr_type
== rs_machine_dependent
)
1615 switch ((int) fragP
->fr_subtype
)
1618 fragP
->fr_type
= rs_fill
;
1619 know (fragP
->fr_var
== 1);
1620 know (fragP
->fr_next
);
1621 address
= fragP
->fr_address
+ fragP
->fr_fix
;
1622 if (address
% fragP
->fr_offset
)
1625 fragP
->fr_next
->fr_address
1630 fragP
->fr_offset
= 0;
1636 /* Round up a section size to the appropriate boundary. */
1639 md_section_align (asection
*segment
, valueT size
)
1641 int align
= bfd_get_section_alignment (stdoutput
, segment
);
1642 int align2
= (1 << align
) - 1;
1644 return (size
+ align2
) & ~align2
;
1647 /* Return the approximate size of a frag before relaxation has occurred. */
1650 md_estimate_size_before_relax (fragS
*fragP
, asection
*segment ATTRIBUTE_UNUSED
)
1656 while ((fragP
->fr_fix
+ size
) % fragP
->fr_offset
)
1663 # ifdef WARN_COMMENTS
1664 const char *md_shortopts
= "Vc";
1666 const char *md_shortopts
= "V";
1669 # ifdef WARN_COMMENTS
1670 const char *md_shortopts
= "c";
1672 const char *md_shortopts
= "";
1676 struct option md_longopts
[] =
1678 #ifdef WARN_COMMENTS
1679 {"warn-comment", no_argument
, NULL
, 'c'},
1681 {NULL
, no_argument
, NULL
, 0}
1683 size_t md_longopts_size
= sizeof (md_longopts
);
1686 md_parse_option (int c
, char *arg ATTRIBUTE_UNUSED
)
1695 print_version_id ();
1698 #ifdef WARN_COMMENTS
1709 md_show_usage (FILE *stream ATTRIBUTE_UNUSED
)
1712 fprintf (stream
, _("\
1715 #ifdef WARN_COMMENTS
1716 fprintf (stream
, _("\
1717 -c print a warning if a comment is found\n"));
1721 /* We have no need to default values of symbols. */
1724 md_undefined_symbol (char *name ATTRIBUTE_UNUSED
)
1729 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
1730 #define nonzero_dibits(x) \
1731 ((x) | (((x) & 0x55555555) << 1) | (((x) & 0xAAAAAAAA) >> 1))
1732 #define arg_reloc_stub_needed(CALLER, CALLEE) \
1733 (((CALLER) ^ (CALLEE)) & nonzero_dibits (CALLER) & nonzero_dibits (CALLEE))
1735 #define arg_reloc_stub_needed(CALLER, CALLEE) 0
1738 /* Apply a fixup to an instruction. */
1741 md_apply_fix (fixS
*fixP
, valueT
*valP
, segT seg ATTRIBUTE_UNUSED
)
1744 struct hppa_fix_struct
*hppa_fixP
;
1748 /* SOM uses R_HPPA_ENTRY and R_HPPA_EXIT relocations which can
1749 never be "applied" (they are just markers). Likewise for
1750 R_HPPA_BEGIN_BRTAB and R_HPPA_END_BRTAB. */
1752 if (fixP
->fx_r_type
== R_HPPA_ENTRY
1753 || fixP
->fx_r_type
== R_HPPA_EXIT
1754 || fixP
->fx_r_type
== R_HPPA_BEGIN_BRTAB
1755 || fixP
->fx_r_type
== R_HPPA_END_BRTAB
1756 || fixP
->fx_r_type
== R_HPPA_BEGIN_TRY
)
1759 /* Disgusting. We must set fx_offset ourselves -- R_HPPA_END_TRY
1760 fixups are considered not adjustable, which in turn causes
1761 adjust_reloc_syms to not set fx_offset. Ugh. */
1762 if (fixP
->fx_r_type
== R_HPPA_END_TRY
)
1764 fixP
->fx_offset
= * valP
;
1769 if (fixP
->fx_r_type
== (int) R_PARISC_GNU_VTENTRY
1770 || fixP
->fx_r_type
== (int) R_PARISC_GNU_VTINHERIT
)
1774 if (fixP
->fx_addsy
== NULL
&& fixP
->fx_pcrel
== 0)
1777 /* There should be a HPPA specific fixup associated with the GAS fixup. */
1778 hppa_fixP
= (struct hppa_fix_struct
*) fixP
->tc_fix_data
;
1779 if (hppa_fixP
== NULL
)
1781 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1782 _("no hppa_fixup entry for fixup type 0x%x"),
1787 fixpos
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
1789 if (fixP
->fx_size
!= 4 || hppa_fixP
->fx_r_format
== 32)
1791 /* Handle constant output. */
1792 number_to_chars_bigendian (fixpos
, *valP
, fixP
->fx_size
);
1796 insn
= bfd_get_32 (stdoutput
, fixpos
);
1797 fmt
= bfd_hppa_insn2fmt (stdoutput
, insn
);
1799 /* If there is a symbol associated with this fixup, then it's something
1800 which will need a SOM relocation (except for some PC-relative relocs).
1801 In such cases we should treat the "val" or "addend" as zero since it
1802 will be added in as needed from fx_offset in tc_gen_reloc. */
1803 if ((fixP
->fx_addsy
!= NULL
1804 || fixP
->fx_r_type
== (int) R_HPPA_NONE
)
1809 new_val
= ((fmt
== 12 || fmt
== 17 || fmt
== 22) ? 8 : 0);
1811 /* These field selectors imply that we do not want an addend. */
1812 else if (hppa_fixP
->fx_r_field
== e_psel
1813 || hppa_fixP
->fx_r_field
== e_rpsel
1814 || hppa_fixP
->fx_r_field
== e_lpsel
1815 || hppa_fixP
->fx_r_field
== e_tsel
1816 || hppa_fixP
->fx_r_field
== e_rtsel
1817 || hppa_fixP
->fx_r_field
== e_ltsel
)
1818 new_val
= ((fmt
== 12 || fmt
== 17 || fmt
== 22) ? 8 : 0);
1821 new_val
= hppa_field_adjust (* valP
, 0, hppa_fixP
->fx_r_field
);
1823 /* Handle pc-relative exceptions from above. */
1824 if ((fmt
== 12 || fmt
== 17 || fmt
== 22)
1827 && !arg_reloc_stub_needed (symbol_arg_reloc_info (fixP
->fx_addsy
),
1828 hppa_fixP
->fx_arg_reloc
)
1830 && (* valP
- 8 + 8192 < 16384
1831 || (fmt
== 17 && * valP
- 8 + 262144 < 524288)
1832 || (fmt
== 22 && * valP
- 8 + 8388608 < 16777216))
1835 && (* valP
- 8 + 262144 < 524288
1836 || (fmt
== 22 && * valP
- 8 + 8388608 < 16777216))
1838 && !S_IS_EXTERNAL (fixP
->fx_addsy
)
1839 && !S_IS_WEAK (fixP
->fx_addsy
)
1840 && S_GET_SEGMENT (fixP
->fx_addsy
) == hppa_fixP
->segment
1842 && S_GET_SEGMENT (fixP
->fx_subsy
) != hppa_fixP
->segment
))
1844 new_val
= hppa_field_adjust (* valP
, 0, hppa_fixP
->fx_r_field
);
1850 CHECK_FIELD_WHERE (new_val
, 8191, -8192,
1851 fixP
->fx_file
, fixP
->fx_line
);
1854 insn
= (insn
& ~ 0x3ff1) | (((val
& 0x1ff8) << 1)
1855 | ((val
& 0x2000) >> 13));
1858 CHECK_FIELD_WHERE (new_val
, 8191, -8192,
1859 fixP
->fx_file
, fixP
->fx_line
);
1862 insn
= (insn
& ~ 0x3ff9) | (((val
& 0x1ffc) << 1)
1863 | ((val
& 0x2000) >> 13));
1865 /* Handle all opcodes with the 'j' operand type. */
1867 CHECK_FIELD_WHERE (new_val
, 8191, -8192,
1868 fixP
->fx_file
, fixP
->fx_line
);
1871 insn
= ((insn
& ~ 0x3fff) | low_sign_unext (val
, 14));
1874 /* Handle all opcodes with the 'k' operand type. */
1876 CHECK_FIELD_WHERE (new_val
, 1048575, -1048576,
1877 fixP
->fx_file
, fixP
->fx_line
);
1880 insn
= (insn
& ~ 0x1fffff) | re_assemble_21 (val
);
1883 /* Handle all the opcodes with the 'i' operand type. */
1885 CHECK_FIELD_WHERE (new_val
, 1023, -1024,
1886 fixP
->fx_file
, fixP
->fx_line
);
1889 insn
= (insn
& ~ 0x7ff) | low_sign_unext (val
, 11);
1892 /* Handle all the opcodes with the 'w' operand type. */
1894 CHECK_FIELD_WHERE (new_val
- 8, 8191, -8192,
1895 fixP
->fx_file
, fixP
->fx_line
);
1898 insn
= (insn
& ~ 0x1ffd) | re_assemble_12 (val
>> 2);
1901 /* Handle some of the opcodes with the 'W' operand type. */
1904 offsetT distance
= * valP
;
1906 /* If this is an absolute branch (ie no link) with an out of
1907 range target, then we want to complain. */
1908 if (fixP
->fx_r_type
== (int) R_HPPA_PCREL_CALL
1909 && (insn
& 0xffe00000) == 0xe8000000)
1910 CHECK_FIELD_WHERE (distance
- 8, 262143, -262144,
1911 fixP
->fx_file
, fixP
->fx_line
);
1913 CHECK_FIELD_WHERE (new_val
- 8, 262143, -262144,
1914 fixP
->fx_file
, fixP
->fx_line
);
1917 insn
= (insn
& ~ 0x1f1ffd) | re_assemble_17 (val
>> 2);
1923 offsetT distance
= * valP
;
1925 /* If this is an absolute branch (ie no link) with an out of
1926 range target, then we want to complain. */
1927 if (fixP
->fx_r_type
== (int) R_HPPA_PCREL_CALL
1928 && (insn
& 0xffe00000) == 0xe8000000)
1929 CHECK_FIELD_WHERE (distance
- 8, 8388607, -8388608,
1930 fixP
->fx_file
, fixP
->fx_line
);
1932 CHECK_FIELD_WHERE (new_val
- 8, 8388607, -8388608,
1933 fixP
->fx_file
, fixP
->fx_line
);
1936 insn
= (insn
& ~ 0x3ff1ffd) | re_assemble_22 (val
>> 2);
1942 insn
= (insn
& ~ 0xfff1) | re_assemble_16 (val
& -8);
1947 insn
= (insn
& ~ 0xfff9) | re_assemble_16 (val
& -4);
1952 insn
= (insn
& ~ 0xffff) | re_assemble_16 (val
);
1960 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
1961 _("Unknown relocation encountered in md_apply_fix."));
1966 switch (fixP
->fx_r_type
)
1968 case R_PARISC_TLS_GD21L
:
1969 case R_PARISC_TLS_GD14R
:
1970 case R_PARISC_TLS_LDM21L
:
1971 case R_PARISC_TLS_LDM14R
:
1972 case R_PARISC_TLS_LE21L
:
1973 case R_PARISC_TLS_LE14R
:
1974 case R_PARISC_TLS_IE21L
:
1975 case R_PARISC_TLS_IE14R
:
1977 S_SET_THREAD_LOCAL (fixP
->fx_addsy
);
1984 /* Insert the relocation. */
1985 bfd_put_32 (stdoutput
, insn
, fixpos
);
1988 /* Exactly what point is a PC-relative offset relative TO?
1989 On the PA, they're relative to the address of the offset. */
1992 md_pcrel_from (fixS
*fixP
)
1994 return fixP
->fx_where
+ fixP
->fx_frag
->fr_address
;
1997 /* Return nonzero if the input line pointer is at the end of
2001 is_end_of_statement (void)
2003 return ((*input_line_pointer
== '\n')
2004 || (*input_line_pointer
== ';')
2005 || (*input_line_pointer
== '!'));
2008 #define REG_NAME_CNT (sizeof (pre_defined_registers) / sizeof (struct pd_reg))
2010 /* Given NAME, find the register number associated with that name, return
2011 the integer value associated with the given name or -1 on failure. */
2014 reg_name_search (char *name
)
2016 int middle
, low
, high
;
2020 high
= REG_NAME_CNT
- 1;
2024 middle
= (low
+ high
) / 2;
2025 cmp
= strcasecmp (name
, pre_defined_registers
[middle
].name
);
2031 return pre_defined_registers
[middle
].value
;
2033 while (low
<= high
);
2038 /* Read a number from S. The number might come in one of many forms,
2039 the most common will be a hex or decimal constant, but it could be
2040 a pre-defined register (Yuk!), or an absolute symbol.
2042 Return 1 on success or 0 on failure. If STRICT, then a missing
2043 register prefix will cause a failure. The number itself is
2044 returned in `pa_number'.
2046 IS_FLOAT indicates that a PA-89 FP register number should be
2047 parsed; A `l' or `r' suffix is checked for if but 2 of IS_FLOAT is
2050 pa_parse_number can not handle negative constants and will fail
2051 horribly if it is passed such a constant. */
2054 pa_parse_number (char **s
, int is_float
)
2062 bfd_boolean have_prefix
;
2064 /* Skip whitespace before the number. */
2065 while (*p
== ' ' || *p
== '\t')
2071 if (!strict
&& ISDIGIT (*p
))
2073 /* Looks like a number. */
2075 if (*p
== '0' && (*(p
+ 1) == 'x' || *(p
+ 1) == 'X'))
2077 /* The number is specified in hex. */
2079 while (ISDIGIT (*p
) || ((*p
>= 'a') && (*p
<= 'f'))
2080 || ((*p
>= 'A') && (*p
<= 'F')))
2083 num
= num
* 16 + *p
- '0';
2084 else if (*p
>= 'a' && *p
<= 'f')
2085 num
= num
* 16 + *p
- 'a' + 10;
2087 num
= num
* 16 + *p
- 'A' + 10;
2093 /* The number is specified in decimal. */
2094 while (ISDIGIT (*p
))
2096 num
= num
* 10 + *p
- '0';
2103 /* Check for a `l' or `r' suffix. */
2106 pa_number
+= FP_REG_BASE
;
2107 if (! (is_float
& 2))
2109 if (IS_R_SELECT (p
))
2111 pa_number
+= FP_REG_RSEL
;
2114 else if (IS_L_SELECT (p
))
2123 /* The number might be a predefined register. */
2128 /* Tege hack: Special case for general registers as the general
2129 code makes a binary search with case translation, and is VERY
2134 if (*p
== 'e' && *(p
+ 1) == 't'
2135 && (*(p
+ 2) == '0' || *(p
+ 2) == '1'))
2138 num
= *p
- '0' + 28;
2146 else if (!ISDIGIT (*p
))
2149 as_bad (_("Undefined register: '%s'."), name
);
2155 num
= num
* 10 + *p
++ - '0';
2156 while (ISDIGIT (*p
));
2161 /* Do a normal register search. */
2162 while (is_part_of_name (c
))
2168 status
= reg_name_search (name
);
2174 as_bad (_("Undefined register: '%s'."), name
);
2184 /* And finally, it could be a symbol in the absolute section which
2185 is effectively a constant, or a register alias symbol. */
2188 while (is_part_of_name (c
))
2194 if ((sym
= symbol_find (name
)) != NULL
)
2196 if (S_GET_SEGMENT (sym
) == reg_section
)
2198 num
= S_GET_VALUE (sym
);
2199 /* Well, we don't really have one, but we do have a
2203 else if (S_GET_SEGMENT (sym
) == bfd_abs_section_ptr
)
2204 num
= S_GET_VALUE (sym
);
2208 as_bad (_("Non-absolute symbol: '%s'."), name
);
2214 /* There is where we'd come for an undefined symbol
2215 or for an empty string. For an empty string we
2216 will return zero. That's a concession made for
2217 compatibility with the braindamaged HP assemblers. */
2223 as_bad (_("Undefined absolute constant: '%s'."), name
);
2232 if (!strict
|| have_prefix
)
2240 /* Return nonzero if the given INSN and L/R information will require
2241 a new PA-1.1 opcode. */
2244 need_pa11_opcode (void)
2246 if ((pa_number
& FP_REG_RSEL
) != 0
2247 && !(the_insn
.fpof1
== DBL
&& the_insn
.fpof2
== DBL
))
2249 /* If this instruction is specific to a particular architecture,
2250 then set a new architecture. */
2251 if (bfd_get_mach (stdoutput
) < pa11
)
2253 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_hppa
, pa11
))
2254 as_warn (_("could not update architecture and machine"));
2262 /* Parse a condition for a fcmp instruction. Return the numerical
2263 code associated with the condition. */
2266 pa_parse_fp_cmp_cond (char **s
)
2272 for (i
= 0; i
< 32; i
++)
2274 if (strncasecmp (*s
, fp_cond_map
[i
].string
,
2275 strlen (fp_cond_map
[i
].string
)) == 0)
2277 cond
= fp_cond_map
[i
].cond
;
2278 *s
+= strlen (fp_cond_map
[i
].string
);
2279 /* If not a complete match, back up the input string and
2281 if (**s
!= ' ' && **s
!= '\t')
2283 *s
-= strlen (fp_cond_map
[i
].string
);
2286 while (**s
== ' ' || **s
== '\t')
2292 as_bad (_("Invalid FP Compare Condition: %s"), *s
);
2294 /* Advance over the bogus completer. */
2295 while (**s
!= ',' && **s
!= ' ' && **s
!= '\t')
2301 /* Parse a graphics test complete for ftest. */
2304 pa_parse_ftest_gfx_completer (char **s
)
2309 if (strncasecmp (*s
, "acc8", 4) == 0)
2314 else if (strncasecmp (*s
, "acc6", 4) == 0)
2319 else if (strncasecmp (*s
, "acc4", 4) == 0)
2324 else if (strncasecmp (*s
, "acc2", 4) == 0)
2329 else if (strncasecmp (*s
, "acc", 3) == 0)
2334 else if (strncasecmp (*s
, "rej8", 4) == 0)
2339 else if (strncasecmp (*s
, "rej", 3) == 0)
2347 as_bad (_("Invalid FTEST completer: %s"), *s
);
2353 /* Parse an FP operand format completer returning the completer
2356 static fp_operand_format
2357 pa_parse_fp_cnv_format (char **s
)
2365 if (strncasecmp (*s
, "sgl", 3) == 0)
2370 else if (strncasecmp (*s
, "dbl", 3) == 0)
2375 else if (strncasecmp (*s
, "quad", 4) == 0)
2380 else if (strncasecmp (*s
, "w", 1) == 0)
2385 else if (strncasecmp (*s
, "uw", 2) == 0)
2390 else if (strncasecmp (*s
, "dw", 2) == 0)
2395 else if (strncasecmp (*s
, "udw", 3) == 0)
2400 else if (strncasecmp (*s
, "qw", 2) == 0)
2405 else if (strncasecmp (*s
, "uqw", 3) == 0)
2412 format
= ILLEGAL_FMT
;
2413 as_bad (_("Invalid FP Operand Format: %3s"), *s
);
2420 /* Parse an FP operand format completer returning the completer
2423 static fp_operand_format
2424 pa_parse_fp_format (char **s
)
2432 if (strncasecmp (*s
, "sgl", 3) == 0)
2437 else if (strncasecmp (*s
, "dbl", 3) == 0)
2442 else if (strncasecmp (*s
, "quad", 4) == 0)
2449 format
= ILLEGAL_FMT
;
2450 as_bad (_("Invalid FP Operand Format: %3s"), *s
);
2457 /* Convert from a selector string into a selector type. */
2460 pa_chk_field_selector (char **str
)
2462 int middle
, low
, high
;
2466 /* Read past any whitespace. */
2467 /* FIXME: should we read past newlines and formfeeds??? */
2468 while (**str
== ' ' || **str
== '\t' || **str
== '\n' || **str
== '\f')
2471 if ((*str
)[1] == '\'' || (*str
)[1] == '%')
2472 name
[0] = TOLOWER ((*str
)[0]),
2474 else if ((*str
)[2] == '\'' || (*str
)[2] == '%')
2475 name
[0] = TOLOWER ((*str
)[0]),
2476 name
[1] = TOLOWER ((*str
)[1]),
2478 else if ((*str
)[3] == '\'' || (*str
)[3] == '%')
2479 name
[0] = TOLOWER ((*str
)[0]),
2480 name
[1] = TOLOWER ((*str
)[1]),
2481 name
[2] = TOLOWER ((*str
)[2]),
2487 high
= sizeof (selector_table
) / sizeof (struct selector_entry
) - 1;
2491 middle
= (low
+ high
) / 2;
2492 cmp
= strcmp (name
, selector_table
[middle
].prefix
);
2499 *str
+= strlen (name
) + 1;
2501 if (selector_table
[middle
].field_selector
== e_nsel
)
2504 return selector_table
[middle
].field_selector
;
2507 while (low
<= high
);
2512 /* Parse a .byte, .word, .long expression for the HPPA. Called by
2513 cons via the TC_PARSE_CONS_EXPRESSION macro. */
2516 parse_cons_expression_hppa (expressionS
*exp
)
2518 int hppa_field_selector
= pa_chk_field_selector (&input_line_pointer
);
2520 return hppa_field_selector
;
2523 /* Evaluate an absolute expression EXP which may be modified by
2524 the selector FIELD_SELECTOR. Return the value of the expression. */
2526 evaluate_absolute (struct pa_it
*insn
)
2530 int field_selector
= insn
->field_selector
;
2533 value
= exp
.X_add_number
;
2535 return hppa_field_adjust (0, value
, field_selector
);
2538 /* Mark (via expr_end) the end of an absolute expression. FIXME. */
2541 pa_get_absolute_expression (struct pa_it
*insn
, char **strp
)
2545 insn
->field_selector
= pa_chk_field_selector (strp
);
2546 save_in
= input_line_pointer
;
2547 input_line_pointer
= *strp
;
2548 expression (&insn
->exp
);
2549 expr_end
= input_line_pointer
;
2550 input_line_pointer
= save_in
;
2551 if (insn
->exp
.X_op
!= O_constant
)
2553 /* We have a non-match in strict mode. */
2555 as_bad (_("Bad segment (should be absolute)."));
2558 return evaluate_absolute (insn
);
2561 /* Get an absolute number. The input string is terminated at the
2562 first whitespace character. */
2565 pa_get_number (struct pa_it
*insn
, char **strp
)
2571 save_in
= input_line_pointer
;
2572 input_line_pointer
= *strp
;
2574 /* The PA assembly syntax is ambiguous in a variety of ways. Consider
2575 this string "4 %r5" Is that the number 4 followed by the register
2576 r5, or is that 4 MOD r5? This situation occurs for example in the
2577 coprocessor load and store instructions. Previously, calling
2578 pa_get_absolute_expression directly results in r5 being entered
2579 in the symbol table.
2581 So, when looking for an absolute number, we cut off the input string
2582 at the first whitespace character. Thus, expressions should generally
2583 contain no whitespace. */
2586 while (*s
!= ',' && *s
!= ' ' && *s
!= '\t')
2592 result
= pa_get_absolute_expression (insn
, strp
);
2594 input_line_pointer
= save_in
;
2599 /* Given an argument location specification return the associated
2600 argument location number. */
2603 pa_build_arg_reloc (char *type_name
)
2606 if (strncasecmp (type_name
, "no", 2) == 0)
2608 if (strncasecmp (type_name
, "gr", 2) == 0)
2610 else if (strncasecmp (type_name
, "fr", 2) == 0)
2612 else if (strncasecmp (type_name
, "fu", 2) == 0)
2615 as_bad (_("Invalid argument location: %s\n"), type_name
);
2620 /* Encode and return an argument relocation specification for
2621 the given register in the location specified by arg_reloc. */
2624 pa_align_arg_reloc (unsigned int reg
, unsigned int arg_reloc
)
2626 unsigned int new_reloc
;
2628 new_reloc
= arg_reloc
;
2644 as_bad (_("Invalid argument description: %d"), reg
);
2650 /* Parse a non-negated compare/subtract completer returning the
2651 number (for encoding in instructions) of the given completer. */
2654 pa_parse_nonneg_cmpsub_cmpltr (char **s
)
2657 char *name
= *s
+ 1;
2666 while (**s
!= ',' && **s
!= ' ' && **s
!= '\t')
2671 if (strcmp (name
, "=") == 0)
2675 else if (strcmp (name
, "<") == 0)
2679 else if (strcmp (name
, "<=") == 0)
2683 else if (strcmp (name
, "<<") == 0)
2687 else if (strcmp (name
, "<<=") == 0)
2691 else if (strcasecmp (name
, "sv") == 0)
2695 else if (strcasecmp (name
, "od") == 0)
2699 /* If we have something like addb,n then there is no condition
2701 else if (strcasecmp (name
, "n") == 0)
2713 /* Reset pointers if this was really a ,n for a branch instruction. */
2720 /* Parse a negated compare/subtract completer returning the
2721 number (for encoding in instructions) of the given completer. */
2724 pa_parse_neg_cmpsub_cmpltr (char **s
)
2727 char *name
= *s
+ 1;
2736 while (**s
!= ',' && **s
!= ' ' && **s
!= '\t')
2741 if (strcasecmp (name
, "tr") == 0)
2745 else if (strcmp (name
, "<>") == 0)
2749 else if (strcmp (name
, ">=") == 0)
2753 else if (strcmp (name
, ">") == 0)
2757 else if (strcmp (name
, ">>=") == 0)
2761 else if (strcmp (name
, ">>") == 0)
2765 else if (strcasecmp (name
, "nsv") == 0)
2769 else if (strcasecmp (name
, "ev") == 0)
2773 /* If we have something like addb,n then there is no condition
2775 else if (strcasecmp (name
, "n") == 0)
2787 /* Reset pointers if this was really a ,n for a branch instruction. */
2794 /* Parse a 64 bit compare and branch completer returning the number (for
2795 encoding in instructions) of the given completer.
2797 Nonnegated comparisons are returned as 0-7, negated comparisons are
2798 returned as 8-15. */
2801 pa_parse_cmpb_64_cmpltr (char **s
)
2804 char *name
= *s
+ 1;
2811 while (**s
!= ',' && **s
!= ' ' && **s
!= '\t')
2816 if (strcmp (name
, "*") == 0)
2820 else if (strcmp (name
, "*=") == 0)
2824 else if (strcmp (name
, "*<") == 0)
2828 else if (strcmp (name
, "*<=") == 0)
2832 else if (strcmp (name
, "*<<") == 0)
2836 else if (strcmp (name
, "*<<=") == 0)
2840 else if (strcasecmp (name
, "*sv") == 0)
2844 else if (strcasecmp (name
, "*od") == 0)
2848 else if (strcasecmp (name
, "*tr") == 0)
2852 else if (strcmp (name
, "*<>") == 0)
2856 else if (strcmp (name
, "*>=") == 0)
2860 else if (strcmp (name
, "*>") == 0)
2864 else if (strcmp (name
, "*>>=") == 0)
2868 else if (strcmp (name
, "*>>") == 0)
2872 else if (strcasecmp (name
, "*nsv") == 0)
2876 else if (strcasecmp (name
, "*ev") == 0)
2890 /* Parse a 64 bit compare immediate and branch completer returning the number
2891 (for encoding in instructions) of the given completer. */
2894 pa_parse_cmpib_64_cmpltr (char **s
)
2897 char *name
= *s
+ 1;
2904 while (**s
!= ',' && **s
!= ' ' && **s
!= '\t')
2909 if (strcmp (name
, "*<<") == 0)
2913 else if (strcmp (name
, "*=") == 0)
2917 else if (strcmp (name
, "*<") == 0)
2921 else if (strcmp (name
, "*<=") == 0)
2925 else if (strcmp (name
, "*>>=") == 0)
2929 else if (strcmp (name
, "*<>") == 0)
2933 else if (strcasecmp (name
, "*>=") == 0)
2937 else if (strcasecmp (name
, "*>") == 0)
2951 /* Parse a non-negated addition completer returning the number
2952 (for encoding in instructions) of the given completer. */
2955 pa_parse_nonneg_add_cmpltr (char **s
)
2958 char *name
= *s
+ 1;
2967 while (**s
!= ',' && **s
!= ' ' && **s
!= '\t')
2971 if (strcmp (name
, "=") == 0)
2975 else if (strcmp (name
, "<") == 0)
2979 else if (strcmp (name
, "<=") == 0)
2983 else if (strcasecmp (name
, "nuv") == 0)
2987 else if (strcasecmp (name
, "znv") == 0)
2991 else if (strcasecmp (name
, "sv") == 0)
2995 else if (strcasecmp (name
, "od") == 0)
2999 /* If we have something like addb,n then there is no condition
3001 else if (strcasecmp (name
, "n") == 0)
3013 /* Reset pointers if this was really a ,n for a branch instruction. */
3020 /* Parse a negated addition completer returning the number
3021 (for encoding in instructions) of the given completer. */
3024 pa_parse_neg_add_cmpltr (char **s
)
3027 char *name
= *s
+ 1;
3036 while (**s
!= ',' && **s
!= ' ' && **s
!= '\t')
3040 if (strcasecmp (name
, "tr") == 0)
3044 else if (strcmp (name
, "<>") == 0)
3048 else if (strcmp (name
, ">=") == 0)
3052 else if (strcmp (name
, ">") == 0)
3056 else if (strcasecmp (name
, "uv") == 0)
3060 else if (strcasecmp (name
, "vnz") == 0)
3064 else if (strcasecmp (name
, "nsv") == 0)
3068 else if (strcasecmp (name
, "ev") == 0)
3072 /* If we have something like addb,n then there is no condition
3074 else if (strcasecmp (name
, "n") == 0)
3086 /* Reset pointers if this was really a ,n for a branch instruction. */
3093 /* Parse a 64 bit wide mode add and branch completer returning the number (for
3094 encoding in instructions) of the given completer. */
3097 pa_parse_addb_64_cmpltr (char **s
)
3100 char *name
= *s
+ 1;
3109 while (**s
!= ',' && **s
!= ' ' && **s
!= '\t')
3113 if (strcmp (name
, "=") == 0)
3117 else if (strcmp (name
, "<") == 0)
3121 else if (strcmp (name
, "<=") == 0)
3125 else if (strcasecmp (name
, "nuv") == 0)
3129 else if (strcasecmp (name
, "*=") == 0)
3133 else if (strcasecmp (name
, "*<") == 0)
3137 else if (strcasecmp (name
, "*<=") == 0)
3141 else if (strcmp (name
, "tr") == 0)
3145 else if (strcmp (name
, "<>") == 0)
3149 else if (strcmp (name
, ">=") == 0)
3153 else if (strcmp (name
, ">") == 0)
3157 else if (strcasecmp (name
, "uv") == 0)
3161 else if (strcasecmp (name
, "*<>") == 0)
3165 else if (strcasecmp (name
, "*>=") == 0)
3169 else if (strcasecmp (name
, "*>") == 0)
3173 /* If we have something like addb,n then there is no condition
3175 else if (strcasecmp (name
, "n") == 0)
3187 /* Reset pointers if this was really a ,n for a branch instruction. */
3194 /* Do the real work for assembling a single instruction. Store results
3195 into the global "the_insn" variable. */
3200 char *error_message
= "";
3201 char *s
, c
, *argstart
, *name
, *save_s
;
3205 int cmpltr
, nullif
, flag
, cond
, need_cond
, num
;
3206 int immediate_check
= 0, pos
= -1, len
= -1;
3207 unsigned long opcode
;
3208 struct pa_opcode
*insn
;
3211 /* We must have a valid space and subspace. */
3212 pa_check_current_space_and_subspace ();
3215 /* Convert everything up to the first whitespace character into lower
3217 for (s
= str
; *s
!= ' ' && *s
!= '\t' && *s
!= '\n' && *s
!= '\0'; s
++)
3220 /* Skip to something interesting. */
3222 ISUPPER (*s
) || ISLOWER (*s
) || (*s
>= '0' && *s
<= '3');
3242 as_bad (_("Unknown opcode: `%s'"), str
);
3246 /* Look up the opcode in the hash table. */
3247 if ((insn
= (struct pa_opcode
*) hash_find (op_hash
, str
)) == NULL
)
3249 as_bad (_("Unknown opcode: `%s'"), str
);
3256 /* Mark the location where arguments for the instruction start, then
3257 start processing them. */
3261 /* Do some initialization. */
3262 opcode
= insn
->match
;
3263 strict
= (insn
->flags
& FLAG_STRICT
);
3264 memset (&the_insn
, 0, sizeof (the_insn
));
3267 the_insn
.reloc
= R_HPPA_NONE
;
3269 if (insn
->arch
>= pa20
3270 && bfd_get_mach (stdoutput
) < insn
->arch
)
3273 /* Build the opcode, checking as we go to make
3274 sure that the operands match. */
3275 for (args
= insn
->args
;; ++args
)
3277 /* Absorb white space in instruction. */
3278 while (*s
== ' ' || *s
== '\t')
3283 /* End of arguments. */
3299 /* These must match exactly. */
3308 /* Handle a 5 bit register or control register field at 10. */
3311 if (!pa_parse_number (&s
, 0))
3314 CHECK_FIELD (num
, 31, 0, 0);
3315 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 21);
3317 /* Handle %sar or %cr11. No bits get set, we just verify that it
3320 /* Skip whitespace before register. */
3321 while (*s
== ' ' || *s
== '\t')
3324 if (!strncasecmp (s
, "%sar", 4))
3329 else if (!strncasecmp (s
, "%cr11", 5))
3336 /* Handle a 5 bit register field at 15. */
3338 if (!pa_parse_number (&s
, 0))
3341 CHECK_FIELD (num
, 31, 0, 0);
3342 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 16);
3344 /* Handle a 5 bit register field at 31. */
3346 if (!pa_parse_number (&s
, 0))
3349 CHECK_FIELD (num
, 31, 0, 0);
3350 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
3352 /* Handle a 5 bit register field at 10 and 15. */
3354 if (!pa_parse_number (&s
, 0))
3357 CHECK_FIELD (num
, 31, 0, 0);
3358 opcode
|= num
<< 16;
3359 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 21);
3361 /* Handle a 5 bit field length at 31. */
3363 num
= pa_get_absolute_expression (&the_insn
, &s
);
3364 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
3367 CHECK_FIELD (num
, 32, 1, 0);
3368 SAVE_IMMEDIATE(num
);
3369 INSERT_FIELD_AND_CONTINUE (opcode
, 32 - num
, 0);
3371 /* Handle a 5 bit immediate at 15. */
3373 num
= pa_get_absolute_expression (&the_insn
, &s
);
3374 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
3377 /* When in strict mode, we want to just reject this
3378 match instead of giving an out of range error. */
3379 CHECK_FIELD (num
, 15, -16, strict
);
3380 num
= low_sign_unext (num
, 5);
3381 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 16);
3383 /* Handle a 5 bit immediate at 31. */
3385 num
= pa_get_absolute_expression (&the_insn
, &s
);
3386 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
3389 /* When in strict mode, we want to just reject this
3390 match instead of giving an out of range error. */
3391 CHECK_FIELD (num
, 15, -16, strict
);
3392 num
= low_sign_unext (num
, 5);
3393 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
3395 /* Handle an unsigned 5 bit immediate at 31. */
3397 num
= pa_get_absolute_expression (&the_insn
, &s
);
3398 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
3401 CHECK_FIELD (num
, 31, 0, strict
);
3402 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
3404 /* Handle an unsigned 5 bit immediate at 15. */
3406 num
= pa_get_absolute_expression (&the_insn
, &s
);
3407 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
3410 CHECK_FIELD (num
, 31, 0, strict
);
3411 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 16);
3413 /* Handle an unsigned 10 bit immediate at 15. */
3415 num
= pa_get_absolute_expression (&the_insn
, &s
);
3416 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
3419 CHECK_FIELD (num
, 1023, 0, strict
);
3420 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 16);
3422 /* Handle a 2 bit space identifier at 17. */
3424 if (!pa_parse_number (&s
, 0))
3427 CHECK_FIELD (num
, 3, 0, 1);
3428 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 14);
3430 /* Handle a 3 bit space identifier at 18. */
3432 if (!pa_parse_number (&s
, 0))
3435 CHECK_FIELD (num
, 7, 0, 1);
3436 opcode
|= re_assemble_3 (num
);
3439 /* Handle all completers. */
3444 /* Handle a completer for an indexing load or store. */
3451 while (*s
== ',' && i
< 2)
3454 if (strncasecmp (s
, "sm", 2) == 0)
3461 else if (strncasecmp (s
, "m", 1) == 0)
3463 else if ((strncasecmp (s
, "s ", 2) == 0)
3464 || (strncasecmp (s
, "s,", 2) == 0))
3468 /* This is a match failure. */
3473 as_bad (_("Invalid Indexed Load Completer."));
3478 as_bad (_("Invalid Indexed Load Completer Syntax."));
3480 INSERT_FIELD_AND_CONTINUE (opcode
, uu
, 13);
3483 /* Handle a short load/store completer. */
3495 if (strncasecmp (s
, "ma", 2) == 0)
3501 else if (strncasecmp (s
, "mb", 2) == 0)
3508 /* This is a match failure. */
3512 as_bad (_("Invalid Short Load/Store Completer."));
3516 /* If we did not get a ma/mb completer, then we do not
3517 consider this a positive match for 'ce'. */
3518 else if (*args
== 'e')
3521 /* 'J', 'm', 'M' and 'q' are the same, except for where they
3522 encode the before/after field. */
3523 if (*args
== 'm' || *args
== 'M')
3526 INSERT_FIELD_AND_CONTINUE (opcode
, a
, 13);
3528 else if (*args
== 'q')
3531 INSERT_FIELD_AND_CONTINUE (opcode
, a
, 2);
3533 else if (*args
== 'J')
3535 /* M bit is explicit in the major opcode. */
3536 INSERT_FIELD_AND_CONTINUE (opcode
, a
, 2);
3538 else if (*args
== 'e')
3540 /* Stash the ma/mb flag temporarily in the
3541 instruction. We will use (and remove it)
3542 later when handling 'J', 'K', '<' & '>'. */
3548 /* Handle a stbys completer. */
3555 while (*s
== ',' && i
< 2)
3558 if (strncasecmp (s
, "m", 1) == 0)
3560 else if ((strncasecmp (s
, "b ", 2) == 0)
3561 || (strncasecmp (s
, "b,", 2) == 0))
3563 else if (strncasecmp (s
, "e", 1) == 0)
3565 /* In strict mode, this is a match failure. */
3572 as_bad (_("Invalid Store Bytes Short Completer"));
3577 as_bad (_("Invalid Store Bytes Short Completer"));
3579 INSERT_FIELD_AND_CONTINUE (opcode
, a
, 13);
3582 /* Handle load cache hint completer. */
3585 if (!strncmp (s
, ",sl", 3))
3590 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 10);
3592 /* Handle store cache hint completer. */
3595 if (!strncmp (s
, ",sl", 3))
3600 else if (!strncmp (s
, ",bc", 3))
3605 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 10);
3607 /* Handle load and clear cache hint completer. */
3610 if (!strncmp (s
, ",co", 3))
3615 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 10);
3617 /* Handle load ordering completer. */
3619 if (strncmp (s
, ",o", 2) != 0)
3624 /* Handle a branch gate completer. */
3626 if (strncasecmp (s
, ",gate", 5) != 0)
3631 /* Handle a branch link and push completer. */
3633 if (strncasecmp (s
, ",l,push", 7) != 0)
3638 /* Handle a branch link completer. */
3640 if (strncasecmp (s
, ",l", 2) != 0)
3645 /* Handle a branch pop completer. */
3647 if (strncasecmp (s
, ",pop", 4) != 0)
3652 /* Handle a local processor completer. */
3654 if (strncasecmp (s
, ",l", 2) != 0)
3659 /* Handle a PROBE read/write completer. */
3662 if (!strncasecmp (s
, ",w", 2))
3667 else if (!strncasecmp (s
, ",r", 2))
3673 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 6);
3675 /* Handle MFCTL wide completer. */
3677 if (strncasecmp (s
, ",w", 2) != 0)
3682 /* Handle an RFI restore completer. */
3685 if (!strncasecmp (s
, ",r", 2))
3691 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 5);
3693 /* Handle a system control completer. */
3695 if (*s
== ',' && (*(s
+ 1) == 'm' || *(s
+ 1) == 'M'))
3703 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 5);
3705 /* Handle intermediate/final completer for DCOR. */
3708 if (!strncasecmp (s
, ",i", 2))
3714 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 6);
3716 /* Handle zero/sign extension completer. */
3719 if (!strncasecmp (s
, ",z", 2))
3725 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 10);
3727 /* Handle add completer. */
3730 if (!strncasecmp (s
, ",l", 2))
3735 else if (!strncasecmp (s
, ",tsv", 4))
3741 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 10);
3743 /* Handle 64 bit carry for ADD. */
3746 if (!strncasecmp (s
, ",dc,tsv", 7) ||
3747 !strncasecmp (s
, ",tsv,dc", 7))
3752 else if (!strncasecmp (s
, ",dc", 3))
3760 /* Condition is not required with "dc". */
3762 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
3764 /* Handle 32 bit carry for ADD. */
3767 if (!strncasecmp (s
, ",c,tsv", 6) ||
3768 !strncasecmp (s
, ",tsv,c", 6))
3773 else if (!strncasecmp (s
, ",c", 2))
3781 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
3783 /* Handle trap on signed overflow. */
3786 if (!strncasecmp (s
, ",tsv", 4))
3792 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
3794 /* Handle trap on condition and overflow. */
3797 if (!strncasecmp (s
, ",tc,tsv", 7) ||
3798 !strncasecmp (s
, ",tsv,tc", 7))
3803 else if (!strncasecmp (s
, ",tc", 3))
3811 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
3813 /* Handle 64 bit borrow for SUB. */
3816 if (!strncasecmp (s
, ",db,tsv", 7) ||
3817 !strncasecmp (s
, ",tsv,db", 7))
3822 else if (!strncasecmp (s
, ",db", 3))
3830 /* Condition is not required with "db". */
3832 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
3834 /* Handle 32 bit borrow for SUB. */
3837 if (!strncasecmp (s
, ",b,tsv", 6) ||
3838 !strncasecmp (s
, ",tsv,b", 6))
3843 else if (!strncasecmp (s
, ",b", 2))
3851 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
3853 /* Handle trap condition completer for UADDCM. */
3856 if (!strncasecmp (s
, ",tc", 3))
3862 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 6);
3864 /* Handle signed/unsigned at 21. */
3868 if (strncasecmp (s
, ",s", 2) == 0)
3873 else if (strncasecmp (s
, ",u", 2) == 0)
3879 INSERT_FIELD_AND_CONTINUE (opcode
, sign
, 10);
3882 /* Handle left/right combination at 17:18. */
3892 as_bad (_("Invalid left/right combination completer"));
3895 INSERT_FIELD_AND_CONTINUE (opcode
, lr
, 13);
3898 as_bad (_("Invalid left/right combination completer"));
3901 /* Handle saturation at 24:25. */
3905 if (strncasecmp (s
, ",ss", 3) == 0)
3910 else if (strncasecmp (s
, ",us", 3) == 0)
3916 INSERT_FIELD_AND_CONTINUE (opcode
, sat
, 6);
3919 /* Handle permutation completer. */
3947 as_bad (_("Invalid permutation completer"));
3949 opcode
|= perm
<< permloc
[i
];
3954 as_bad (_("Invalid permutation completer"));
3962 /* Handle all conditions. */
3968 /* Handle FP compare conditions. */
3970 cond
= pa_parse_fp_cmp_cond (&s
);
3971 INSERT_FIELD_AND_CONTINUE (opcode
, cond
, 0);
3973 /* Handle an add condition. */
3982 /* 64 bit conditions. */
3994 while (*s
!= ',' && *s
!= ' ' && *s
!= '\t')
3998 if (strcmp (name
, "=") == 0)
4000 else if (strcmp (name
, "<") == 0)
4002 else if (strcmp (name
, "<=") == 0)
4004 else if (strcasecmp (name
, "nuv") == 0)
4006 else if (strcasecmp (name
, "znv") == 0)
4008 else if (strcasecmp (name
, "sv") == 0)
4010 else if (strcasecmp (name
, "od") == 0)
4012 else if (strcasecmp (name
, "tr") == 0)
4017 else if (strcmp (name
, "<>") == 0)
4022 else if (strcmp (name
, ">=") == 0)
4027 else if (strcmp (name
, ">") == 0)
4032 else if (strcasecmp (name
, "uv") == 0)
4037 else if (strcasecmp (name
, "vnz") == 0)
4042 else if (strcasecmp (name
, "nsv") == 0)
4047 else if (strcasecmp (name
, "ev") == 0)
4052 /* ",*" is a valid condition. */
4053 else if (*args
== 'a' || *name
)
4054 as_bad (_("Invalid Add Condition: %s"), name
);
4057 /* Except with "dc", we have a match failure with
4058 'A' if we don't have a doubleword condition. */
4059 else if (*args
== 'A' && need_cond
)
4062 opcode
|= cmpltr
<< 13;
4063 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 12);
4065 /* Handle non-negated add and branch condition. */
4067 cmpltr
= pa_parse_nonneg_add_cmpltr (&s
);
4070 as_bad (_("Invalid Add and Branch Condition"));
4073 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 13);
4075 /* Handle 64 bit wide-mode add and branch condition. */
4077 cmpltr
= pa_parse_addb_64_cmpltr (&s
);
4080 as_bad (_("Invalid Add and Branch Condition"));
4085 /* Negated condition requires an opcode change. */
4086 opcode
|= (cmpltr
& 8) << 24;
4088 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
& 7, 13);
4090 /* Handle a negated or non-negated add and branch
4094 cmpltr
= pa_parse_nonneg_add_cmpltr (&s
);
4098 cmpltr
= pa_parse_neg_add_cmpltr (&s
);
4101 as_bad (_("Invalid Compare/Subtract Condition"));
4106 /* Negated condition requires an opcode change. */
4110 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 13);
4112 /* Handle branch on bit conditions. */
4130 if (strncmp (s
, "<", 1) == 0)
4135 else if (strncmp (s
, ">=", 2) == 0)
4141 as_bad (_("Invalid Branch On Bit Condition: %c"), *s
);
4144 as_bad (_("Missing Branch On Bit Condition"));
4146 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 15);
4148 /* Handle a compare/subtract condition. */
4157 /* 64 bit conditions. */
4169 while (*s
!= ',' && *s
!= ' ' && *s
!= '\t')
4173 if (strcmp (name
, "=") == 0)
4175 else if (strcmp (name
, "<") == 0)
4177 else if (strcmp (name
, "<=") == 0)
4179 else if (strcasecmp (name
, "<<") == 0)
4181 else if (strcasecmp (name
, "<<=") == 0)
4183 else if (strcasecmp (name
, "sv") == 0)
4185 else if (strcasecmp (name
, "od") == 0)
4187 else if (strcasecmp (name
, "tr") == 0)
4192 else if (strcmp (name
, "<>") == 0)
4197 else if (strcmp (name
, ">=") == 0)
4202 else if (strcmp (name
, ">") == 0)
4207 else if (strcasecmp (name
, ">>=") == 0)
4212 else if (strcasecmp (name
, ">>") == 0)
4217 else if (strcasecmp (name
, "nsv") == 0)
4222 else if (strcasecmp (name
, "ev") == 0)
4227 /* ",*" is a valid condition. */
4228 else if (*args
!= 'S' || *name
)
4229 as_bad (_("Invalid Compare/Subtract Condition: %s"),
4233 /* Except with "db", we have a match failure with
4234 'S' if we don't have a doubleword condition. */
4235 else if (*args
== 'S' && need_cond
)
4238 opcode
|= cmpltr
<< 13;
4239 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 12);
4241 /* Handle a non-negated compare condition. */
4243 cmpltr
= pa_parse_nonneg_cmpsub_cmpltr (&s
);
4246 as_bad (_("Invalid Compare/Subtract Condition"));
4249 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 13);
4251 /* Handle a 32 bit compare and branch condition. */
4254 cmpltr
= pa_parse_nonneg_cmpsub_cmpltr (&s
);
4258 cmpltr
= pa_parse_neg_cmpsub_cmpltr (&s
);
4261 as_bad (_("Invalid Compare and Branch Condition"));
4266 /* Negated condition requires an opcode change. */
4271 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 13);
4273 /* Handle a 64 bit compare and branch condition. */
4275 cmpltr
= pa_parse_cmpb_64_cmpltr (&s
);
4278 /* Negated condition requires an opcode change. */
4279 opcode
|= (cmpltr
& 8) << 26;
4282 /* Not a 64 bit cond. Give 32 bit a chance. */
4285 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
& 7, 13);
4287 /* Handle a 64 bit cmpib condition. */
4289 cmpltr
= pa_parse_cmpib_64_cmpltr (&s
);
4291 /* Not a 64 bit cond. Give 32 bit a chance. */
4294 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 13);
4296 /* Handle a logical instruction condition. */
4305 /* 64 bit conditions. */
4317 while (*s
!= ',' && *s
!= ' ' && *s
!= '\t')
4322 if (strcmp (name
, "=") == 0)
4324 else if (strcmp (name
, "<") == 0)
4326 else if (strcmp (name
, "<=") == 0)
4328 else if (strcasecmp (name
, "od") == 0)
4330 else if (strcasecmp (name
, "tr") == 0)
4335 else if (strcmp (name
, "<>") == 0)
4340 else if (strcmp (name
, ">=") == 0)
4345 else if (strcmp (name
, ">") == 0)
4350 else if (strcasecmp (name
, "ev") == 0)
4355 /* ",*" is a valid condition. */
4356 else if (*args
!= 'L' || *name
)
4357 as_bad (_("Invalid Logical Instruction Condition."));
4360 /* 32-bit is default for no condition. */
4361 else if (*args
== 'L')
4364 opcode
|= cmpltr
<< 13;
4365 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 12);
4367 /* Handle a shift/extract/deposit condition. */
4372 /* Check immediate values in shift/extract/deposit
4373 * instructions if they will give undefined behaviour. */
4374 immediate_check
= 1;
4379 /* 64 bit conditions. */
4391 while (*s
!= ',' && *s
!= ' ' && *s
!= '\t')
4395 if (strcmp (name
, "=") == 0)
4397 else if (strcmp (name
, "<") == 0)
4399 else if (strcasecmp (name
, "od") == 0)
4401 else if (strcasecmp (name
, "tr") == 0)
4403 else if (strcmp (name
, "<>") == 0)
4405 else if (strcmp (name
, ">=") == 0)
4407 else if (strcasecmp (name
, "ev") == 0)
4409 /* Handle movb,n. Put things back the way they were.
4410 This includes moving s back to where it started. */
4411 else if (strcasecmp (name
, "n") == 0 && *args
== 'y')
4417 /* ",*" is a valid condition. */
4418 else if (*args
!= 'X' || *name
)
4419 as_bad (_("Invalid Shift/Extract/Deposit Condition."));
4423 INSERT_FIELD_AND_CONTINUE (opcode
, cmpltr
, 13);
4425 /* Handle a unit instruction condition. */
4435 /* 64 bit conditions. */
4446 /* The uxor instruction only supports unit conditions
4447 not involving carries. */
4448 uxor
= (opcode
& 0xfc000fc0) == 0x08000380;
4449 if (strncasecmp (s
, "sbz", 3) == 0)
4454 else if (strncasecmp (s
, "shz", 3) == 0)
4459 else if (!uxor
&& strncasecmp (s
, "sdc", 3) == 0)
4464 else if (!uxor
&& strncasecmp (s
, "sbc", 3) == 0)
4469 else if (!uxor
&& strncasecmp (s
, "shc", 3) == 0)
4474 else if (strncasecmp (s
, "tr", 2) == 0)
4480 else if (strncasecmp (s
, "nbz", 3) == 0)
4486 else if (strncasecmp (s
, "nhz", 3) == 0)
4492 else if (!uxor
&& strncasecmp (s
, "ndc", 3) == 0)
4498 else if (!uxor
&& strncasecmp (s
, "nbc", 3) == 0)
4504 else if (!uxor
&& strncasecmp (s
, "nhc", 3) == 0)
4510 else if (strncasecmp (s
, "swz", 3) == 0)
4516 else if (!uxor
&& strncasecmp (s
, "swc", 3) == 0)
4522 else if (strncasecmp (s
, "nwz", 3) == 0)
4528 else if (!uxor
&& strncasecmp (s
, "nwc", 3) == 0)
4534 /* ",*" is a valid condition. */
4535 else if (*args
!= 'U' || (*s
!= ' ' && *s
!= '\t'))
4536 as_bad (_("Invalid Unit Instruction Condition."));
4538 /* 32-bit is default for no condition. */
4539 else if (*args
== 'U')
4542 opcode
|= cmpltr
<< 13;
4543 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 12);
4551 /* Handle a nullification completer for branch instructions. */
4553 nullif
= pa_parse_nullif (&s
);
4554 INSERT_FIELD_AND_CONTINUE (opcode
, nullif
, 1);
4556 /* Handle a nullification completer for copr and spop insns. */
4558 nullif
= pa_parse_nullif (&s
);
4559 INSERT_FIELD_AND_CONTINUE (opcode
, nullif
, 5);
4561 /* Handle ,%r2 completer for new syntax branches. */
4563 if (*s
== ',' && strncasecmp (s
+ 1, "%r2", 3) == 0)
4565 else if (*s
== ',' && strncasecmp (s
+ 1, "%rp", 3) == 0)
4571 /* Handle 3 bit entry into the fp compare array. Valid values
4572 are 0..6 inclusive. */
4576 if (the_insn
.exp
.X_op
== O_constant
)
4578 num
= evaluate_absolute (&the_insn
);
4579 CHECK_FIELD (num
, 6, 0, 0);
4581 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 13);
4586 /* Handle 3 bit entry into the fp compare array. Valid values
4587 are 0..6 inclusive. */
4590 if (the_insn
.exp
.X_op
== O_constant
)
4593 num
= evaluate_absolute (&the_insn
);
4594 CHECK_FIELD (num
, 6, 0, 0);
4595 num
= (num
+ 1) ^ 1;
4596 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 13);
4601 /* Handle graphics test completers for ftest */
4604 num
= pa_parse_ftest_gfx_completer (&s
);
4605 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
4608 /* Handle a 11 bit immediate at 31. */
4610 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4613 if (the_insn
.exp
.X_op
== O_constant
)
4615 num
= evaluate_absolute (&the_insn
);
4616 CHECK_FIELD (num
, 1023, -1024, 0);
4617 num
= low_sign_unext (num
, 11);
4618 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
4622 if (is_DP_relative (the_insn
.exp
))
4623 the_insn
.reloc
= R_HPPA_GOTOFF
;
4624 else if (is_PC_relative (the_insn
.exp
))
4625 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
4627 else if (is_tls_gdidx (the_insn
.exp
))
4628 the_insn
.reloc
= R_PARISC_TLS_GD21L
;
4629 else if (is_tls_ldidx (the_insn
.exp
))
4630 the_insn
.reloc
= R_PARISC_TLS_LDM21L
;
4631 else if (is_tls_dtpoff (the_insn
.exp
))
4632 the_insn
.reloc
= R_PARISC_TLS_LDO21L
;
4633 else if (is_tls_ieoff (the_insn
.exp
))
4634 the_insn
.reloc
= R_PARISC_TLS_IE21L
;
4635 else if (is_tls_leoff (the_insn
.exp
))
4636 the_insn
.reloc
= R_PARISC_TLS_LE21L
;
4639 the_insn
.reloc
= R_HPPA
;
4640 the_insn
.format
= 11;
4644 /* Handle a 14 bit immediate at 31. */
4646 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4649 if (the_insn
.exp
.X_op
== O_constant
)
4653 /* XXX the completer stored away tidbits of information
4654 for us to extract. We need a cleaner way to do this.
4655 Now that we have lots of letters again, it would be
4656 good to rethink this. */
4659 num
= evaluate_absolute (&the_insn
);
4660 if (mb
!= (num
< 0))
4662 CHECK_FIELD (num
, 8191, -8192, 0);
4663 num
= low_sign_unext (num
, 14);
4664 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
4668 /* Handle a 14 bit immediate at 31. */
4670 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4673 if (the_insn
.exp
.X_op
== O_constant
)
4679 num
= evaluate_absolute (&the_insn
);
4680 if (mb
== (num
< 0))
4684 CHECK_FIELD (num
, 8191, -8192, 0);
4685 num
= low_sign_unext (num
, 14);
4686 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
4690 /* Handle a 16 bit immediate at 31. */
4692 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4695 if (the_insn
.exp
.X_op
== O_constant
)
4701 num
= evaluate_absolute (&the_insn
);
4702 if (mb
!= (num
< 0))
4704 CHECK_FIELD (num
, 32767, -32768, 0);
4705 num
= re_assemble_16 (num
);
4706 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
4710 /* Handle a 16 bit immediate at 31. */
4712 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4715 if (the_insn
.exp
.X_op
== O_constant
)
4721 num
= evaluate_absolute (&the_insn
);
4722 if (mb
== (num
< 0))
4726 CHECK_FIELD (num
, 32767, -32768, 0);
4727 num
= re_assemble_16 (num
);
4728 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
4732 /* Handle 14 bit immediate, shifted left three times. */
4734 if (bfd_get_mach (stdoutput
) != pa20
)
4736 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4739 if (the_insn
.exp
.X_op
== O_constant
)
4741 num
= evaluate_absolute (&the_insn
);
4744 CHECK_FIELD (num
, 8191, -8192, 0);
4749 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 4);
4753 if (is_DP_relative (the_insn
.exp
))
4754 the_insn
.reloc
= R_HPPA_GOTOFF
;
4755 else if (is_PC_relative (the_insn
.exp
))
4756 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
4758 else if (is_tls_gdidx (the_insn
.exp
))
4759 the_insn
.reloc
= R_PARISC_TLS_GD21L
;
4760 else if (is_tls_ldidx (the_insn
.exp
))
4761 the_insn
.reloc
= R_PARISC_TLS_LDM21L
;
4762 else if (is_tls_dtpoff (the_insn
.exp
))
4763 the_insn
.reloc
= R_PARISC_TLS_LDO21L
;
4764 else if (is_tls_ieoff (the_insn
.exp
))
4765 the_insn
.reloc
= R_PARISC_TLS_IE21L
;
4766 else if (is_tls_leoff (the_insn
.exp
))
4767 the_insn
.reloc
= R_PARISC_TLS_LE21L
;
4770 the_insn
.reloc
= R_HPPA
;
4771 the_insn
.format
= 14;
4776 /* Handle 14 bit immediate, shifted left twice. */
4778 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4781 if (the_insn
.exp
.X_op
== O_constant
)
4783 num
= evaluate_absolute (&the_insn
);
4786 CHECK_FIELD (num
, 8191, -8192, 0);
4791 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 3);
4795 if (is_DP_relative (the_insn
.exp
))
4796 the_insn
.reloc
= R_HPPA_GOTOFF
;
4797 else if (is_PC_relative (the_insn
.exp
))
4798 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
4800 else if (is_tls_gdidx (the_insn
.exp
))
4801 the_insn
.reloc
= R_PARISC_TLS_GD21L
;
4802 else if (is_tls_ldidx (the_insn
.exp
))
4803 the_insn
.reloc
= R_PARISC_TLS_LDM21L
;
4804 else if (is_tls_dtpoff (the_insn
.exp
))
4805 the_insn
.reloc
= R_PARISC_TLS_LDO21L
;
4806 else if (is_tls_ieoff (the_insn
.exp
))
4807 the_insn
.reloc
= R_PARISC_TLS_IE21L
;
4808 else if (is_tls_leoff (the_insn
.exp
))
4809 the_insn
.reloc
= R_PARISC_TLS_LE21L
;
4812 the_insn
.reloc
= R_HPPA
;
4813 the_insn
.format
= 14;
4817 /* Handle a 14 bit immediate at 31. */
4819 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4822 if (the_insn
.exp
.X_op
== O_constant
)
4824 num
= evaluate_absolute (&the_insn
);
4825 CHECK_FIELD (num
, 8191, -8192, 0);
4826 num
= low_sign_unext (num
, 14);
4827 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
4831 if (is_DP_relative (the_insn
.exp
))
4832 the_insn
.reloc
= R_HPPA_GOTOFF
;
4833 else if (is_PC_relative (the_insn
.exp
))
4834 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
4836 else if (is_tls_gdidx (the_insn
.exp
))
4837 the_insn
.reloc
= R_PARISC_TLS_GD21L
;
4838 else if (is_tls_ldidx (the_insn
.exp
))
4839 the_insn
.reloc
= R_PARISC_TLS_LDM21L
;
4840 else if (is_tls_dtpoff (the_insn
.exp
))
4841 the_insn
.reloc
= R_PARISC_TLS_LDO21L
;
4842 else if (is_tls_ieoff (the_insn
.exp
))
4843 the_insn
.reloc
= R_PARISC_TLS_IE21L
;
4844 else if (is_tls_leoff (the_insn
.exp
))
4845 the_insn
.reloc
= R_PARISC_TLS_LE21L
;
4848 the_insn
.reloc
= R_HPPA
;
4849 the_insn
.format
= 14;
4853 /* Handle a 21 bit immediate at 31. */
4855 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4858 if (the_insn
.exp
.X_op
== O_constant
)
4860 num
= evaluate_absolute (&the_insn
);
4861 CHECK_FIELD (num
>> 11, 1048575, -1048576, 0);
4862 opcode
|= re_assemble_21 (num
);
4867 if (is_DP_relative (the_insn
.exp
))
4868 the_insn
.reloc
= R_HPPA_GOTOFF
;
4869 else if (is_PC_relative (the_insn
.exp
))
4870 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
4872 else if (is_tls_gdidx (the_insn
.exp
))
4873 the_insn
.reloc
= R_PARISC_TLS_GD21L
;
4874 else if (is_tls_ldidx (the_insn
.exp
))
4875 the_insn
.reloc
= R_PARISC_TLS_LDM21L
;
4876 else if (is_tls_dtpoff (the_insn
.exp
))
4877 the_insn
.reloc
= R_PARISC_TLS_LDO21L
;
4878 else if (is_tls_ieoff (the_insn
.exp
))
4879 the_insn
.reloc
= R_PARISC_TLS_IE21L
;
4880 else if (is_tls_leoff (the_insn
.exp
))
4881 the_insn
.reloc
= R_PARISC_TLS_LE21L
;
4884 the_insn
.reloc
= R_HPPA
;
4885 the_insn
.format
= 21;
4889 /* Handle a 16 bit immediate at 31 (PA 2.0 wide mode only). */
4891 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4894 if (the_insn
.exp
.X_op
== O_constant
)
4896 num
= evaluate_absolute (&the_insn
);
4897 CHECK_FIELD (num
, 32767, -32768, 0);
4898 opcode
|= re_assemble_16 (num
);
4903 /* ??? Is this valid for wide mode? */
4904 if (is_DP_relative (the_insn
.exp
))
4905 the_insn
.reloc
= R_HPPA_GOTOFF
;
4906 else if (is_PC_relative (the_insn
.exp
))
4907 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
4909 else if (is_tls_gdidx (the_insn
.exp
))
4910 the_insn
.reloc
= R_PARISC_TLS_GD21L
;
4911 else if (is_tls_ldidx (the_insn
.exp
))
4912 the_insn
.reloc
= R_PARISC_TLS_LDM21L
;
4913 else if (is_tls_dtpoff (the_insn
.exp
))
4914 the_insn
.reloc
= R_PARISC_TLS_LDO21L
;
4915 else if (is_tls_ieoff (the_insn
.exp
))
4916 the_insn
.reloc
= R_PARISC_TLS_IE21L
;
4917 else if (is_tls_leoff (the_insn
.exp
))
4918 the_insn
.reloc
= R_PARISC_TLS_LE21L
;
4921 the_insn
.reloc
= R_HPPA
;
4922 the_insn
.format
= 14;
4926 /* Handle a word-aligned 16-bit imm. at 31 (PA2.0 wide). */
4928 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4931 if (the_insn
.exp
.X_op
== O_constant
)
4933 num
= evaluate_absolute (&the_insn
);
4934 CHECK_FIELD (num
, 32767, -32768, 0);
4935 CHECK_ALIGN (num
, 4, 0);
4936 opcode
|= re_assemble_16 (num
);
4941 /* ??? Is this valid for wide mode? */
4942 if (is_DP_relative (the_insn
.exp
))
4943 the_insn
.reloc
= R_HPPA_GOTOFF
;
4944 else if (is_PC_relative (the_insn
.exp
))
4945 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
4947 else if (is_tls_gdidx (the_insn
.exp
))
4948 the_insn
.reloc
= R_PARISC_TLS_GD21L
;
4949 else if (is_tls_ldidx (the_insn
.exp
))
4950 the_insn
.reloc
= R_PARISC_TLS_LDM21L
;
4951 else if (is_tls_dtpoff (the_insn
.exp
))
4952 the_insn
.reloc
= R_PARISC_TLS_LDO21L
;
4953 else if (is_tls_ieoff (the_insn
.exp
))
4954 the_insn
.reloc
= R_PARISC_TLS_IE21L
;
4955 else if (is_tls_leoff (the_insn
.exp
))
4956 the_insn
.reloc
= R_PARISC_TLS_LE21L
;
4959 the_insn
.reloc
= R_HPPA
;
4960 the_insn
.format
= 14;
4964 /* Handle a dword-aligned 16-bit imm. at 31 (PA2.0 wide). */
4966 the_insn
.field_selector
= pa_chk_field_selector (&s
);
4969 if (the_insn
.exp
.X_op
== O_constant
)
4971 num
= evaluate_absolute (&the_insn
);
4972 CHECK_FIELD (num
, 32767, -32768, 0);
4973 CHECK_ALIGN (num
, 8, 0);
4974 opcode
|= re_assemble_16 (num
);
4979 /* ??? Is this valid for wide mode? */
4980 if (is_DP_relative (the_insn
.exp
))
4981 the_insn
.reloc
= R_HPPA_GOTOFF
;
4982 else if (is_PC_relative (the_insn
.exp
))
4983 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
4985 else if (is_tls_gdidx (the_insn
.exp
))
4986 the_insn
.reloc
= R_PARISC_TLS_GD21L
;
4987 else if (is_tls_ldidx (the_insn
.exp
))
4988 the_insn
.reloc
= R_PARISC_TLS_LDM21L
;
4989 else if (is_tls_dtpoff (the_insn
.exp
))
4990 the_insn
.reloc
= R_PARISC_TLS_LDO21L
;
4991 else if (is_tls_ieoff (the_insn
.exp
))
4992 the_insn
.reloc
= R_PARISC_TLS_IE21L
;
4993 else if (is_tls_leoff (the_insn
.exp
))
4994 the_insn
.reloc
= R_PARISC_TLS_LE21L
;
4997 the_insn
.reloc
= R_HPPA
;
4998 the_insn
.format
= 14;
5002 /* Handle a 12 bit branch displacement. */
5004 the_insn
.field_selector
= pa_chk_field_selector (&s
);
5008 if (!the_insn
.exp
.X_add_symbol
5009 || !strcmp (S_GET_NAME (the_insn
.exp
.X_add_symbol
),
5012 num
= evaluate_absolute (&the_insn
);
5015 as_bad (_("Branch to unaligned address"));
5018 if (the_insn
.exp
.X_add_symbol
)
5020 CHECK_FIELD (num
, 8191, -8192, 0);
5021 opcode
|= re_assemble_12 (num
>> 2);
5026 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
5027 the_insn
.format
= 12;
5028 the_insn
.arg_reloc
= last_call_desc
.arg_reloc
;
5029 memset (&last_call_desc
, 0, sizeof (struct call_desc
));
5034 /* Handle a 17 bit branch displacement. */
5036 the_insn
.field_selector
= pa_chk_field_selector (&s
);
5040 if (!the_insn
.exp
.X_add_symbol
5041 || !strcmp (S_GET_NAME (the_insn
.exp
.X_add_symbol
),
5044 num
= evaluate_absolute (&the_insn
);
5047 as_bad (_("Branch to unaligned address"));
5050 if (the_insn
.exp
.X_add_symbol
)
5052 CHECK_FIELD (num
, 262143, -262144, 0);
5053 opcode
|= re_assemble_17 (num
>> 2);
5058 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
5059 the_insn
.format
= 17;
5060 the_insn
.arg_reloc
= last_call_desc
.arg_reloc
;
5061 memset (&last_call_desc
, 0, sizeof (struct call_desc
));
5065 /* Handle a 22 bit branch displacement. */
5067 the_insn
.field_selector
= pa_chk_field_selector (&s
);
5071 if (!the_insn
.exp
.X_add_symbol
5072 || !strcmp (S_GET_NAME (the_insn
.exp
.X_add_symbol
),
5075 num
= evaluate_absolute (&the_insn
);
5078 as_bad (_("Branch to unaligned address"));
5081 if (the_insn
.exp
.X_add_symbol
)
5083 CHECK_FIELD (num
, 8388607, -8388608, 0);
5084 opcode
|= re_assemble_22 (num
>> 2);
5088 the_insn
.reloc
= R_HPPA_PCREL_CALL
;
5089 the_insn
.format
= 22;
5090 the_insn
.arg_reloc
= last_call_desc
.arg_reloc
;
5091 memset (&last_call_desc
, 0, sizeof (struct call_desc
));
5095 /* Handle an absolute 17 bit branch target. */
5097 the_insn
.field_selector
= pa_chk_field_selector (&s
);
5101 if (!the_insn
.exp
.X_add_symbol
5102 || !strcmp (S_GET_NAME (the_insn
.exp
.X_add_symbol
),
5105 num
= evaluate_absolute (&the_insn
);
5108 as_bad (_("Branch to unaligned address"));
5111 if (the_insn
.exp
.X_add_symbol
)
5113 CHECK_FIELD (num
, 262143, -262144, 0);
5114 opcode
|= re_assemble_17 (num
>> 2);
5119 the_insn
.reloc
= R_HPPA_ABS_CALL
;
5120 the_insn
.format
= 17;
5121 the_insn
.arg_reloc
= last_call_desc
.arg_reloc
;
5122 memset (&last_call_desc
, 0, sizeof (struct call_desc
));
5126 /* Handle '%r1' implicit operand of addil instruction. */
5128 if (*s
== ',' && *(s
+ 1) == '%' && *(s
+ 3) == '1'
5129 && (*(s
+ 2) == 'r' || *(s
+ 2) == 'R'))
5137 /* Handle '%sr0,%r31' implicit operand of be,l instruction. */
5139 if (strncasecmp (s
, "%sr0,%r31", 9) != 0)
5144 /* Handle immediate value of 0 for ordered load/store instructions. */
5151 /* Handle a 2 bit shift count at 25. */
5153 num
= pa_get_absolute_expression (&the_insn
, &s
);
5154 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5157 CHECK_FIELD (num
, 3, 1, strict
);
5158 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 6);
5160 /* Handle a 4 bit shift count at 25. */
5162 num
= pa_get_absolute_expression (&the_insn
, &s
);
5163 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5166 CHECK_FIELD (num
, 15, 0, strict
);
5167 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 6);
5169 /* Handle a 5 bit shift count at 26. */
5171 num
= pa_get_absolute_expression (&the_insn
, &s
);
5172 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5175 CHECK_FIELD (num
, 31, 0, strict
);
5176 SAVE_IMMEDIATE(num
);
5177 INSERT_FIELD_AND_CONTINUE (opcode
, 31 - num
, 5);
5179 /* Handle a 6 bit shift count at 20,22:26. */
5181 num
= pa_get_absolute_expression (&the_insn
, &s
);
5182 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5185 CHECK_FIELD (num
, 63, 0, strict
);
5186 SAVE_IMMEDIATE(num
);
5188 opcode
|= (num
& 0x20) << 6;
5189 INSERT_FIELD_AND_CONTINUE (opcode
, num
& 0x1f, 5);
5191 /* Handle a 6 bit field length at 23,27:31. */
5194 num
= pa_get_absolute_expression (&the_insn
, &s
);
5195 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5198 CHECK_FIELD (num
, 64, 1, strict
);
5199 SAVE_IMMEDIATE(num
);
5201 opcode
|= (num
& 0x20) << 3;
5202 num
= 31 - (num
& 0x1f);
5203 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5205 /* Handle a 6 bit field length at 19,27:31. */
5207 num
= pa_get_absolute_expression (&the_insn
, &s
);
5208 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5211 CHECK_FIELD (num
, 64, 1, strict
);
5212 SAVE_IMMEDIATE(num
);
5214 opcode
|= (num
& 0x20) << 7;
5215 num
= 31 - (num
& 0x1f);
5216 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5218 /* Handle a 5 bit bit position at 26. */
5220 num
= pa_get_absolute_expression (&the_insn
, &s
);
5221 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5224 CHECK_FIELD (num
, 31, 0, strict
);
5225 SAVE_IMMEDIATE(num
);
5226 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 5);
5228 /* Handle a 6 bit bit position at 20,22:26. */
5230 num
= pa_get_absolute_expression (&the_insn
, &s
);
5231 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5234 CHECK_FIELD (num
, 63, 0, strict
);
5235 SAVE_IMMEDIATE(num
);
5236 opcode
|= (num
& 0x20) << 6;
5237 INSERT_FIELD_AND_CONTINUE (opcode
, num
& 0x1f, 5);
5239 /* Handle a 5 bit immediate at 10 with 'd' as the complement
5240 of the high bit of the immediate. */
5242 num
= pa_get_absolute_expression (&the_insn
, &s
);
5243 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5246 CHECK_FIELD (num
, 63, 0, strict
);
5250 opcode
|= (1 << 13);
5251 INSERT_FIELD_AND_CONTINUE (opcode
, num
& 0x1f, 21);
5253 /* Handle a 5 bit immediate at 10. */
5255 num
= pa_get_absolute_expression (&the_insn
, &s
);
5256 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5259 CHECK_FIELD (num
, 31, 0, strict
);
5260 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 21);
5262 /* Handle a 9 bit immediate at 28. */
5264 num
= pa_get_absolute_expression (&the_insn
, &s
);
5265 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5268 CHECK_FIELD (num
, 511, 1, strict
);
5269 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 3);
5271 /* Handle a 13 bit immediate at 18. */
5273 num
= pa_get_absolute_expression (&the_insn
, &s
);
5274 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5277 CHECK_FIELD (num
, 8191, 0, strict
);
5278 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 13);
5280 /* Handle a 26 bit immediate at 31. */
5282 num
= pa_get_absolute_expression (&the_insn
, &s
);
5283 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5286 CHECK_FIELD (num
, 67108863, 0, strict
);
5287 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5289 /* Handle a 3 bit SFU identifier at 25. */
5292 as_bad (_("Invalid SFU identifier"));
5293 num
= pa_get_number (&the_insn
, &s
);
5294 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5297 CHECK_FIELD (num
, 7, 0, strict
);
5298 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 6);
5300 /* Handle a 20 bit SOP field for spop0. */
5302 num
= pa_get_number (&the_insn
, &s
);
5303 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5306 CHECK_FIELD (num
, 1048575, 0, strict
);
5307 num
= (num
& 0x1f) | ((num
& 0x000fffe0) << 6);
5308 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5310 /* Handle a 15bit SOP field for spop1. */
5312 num
= pa_get_number (&the_insn
, &s
);
5313 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5316 CHECK_FIELD (num
, 32767, 0, strict
);
5317 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 11);
5319 /* Handle a 10bit SOP field for spop3. */
5321 num
= pa_get_number (&the_insn
, &s
);
5322 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5325 CHECK_FIELD (num
, 1023, 0, strict
);
5326 num
= (num
& 0x1f) | ((num
& 0x000003e0) << 6);
5327 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5329 /* Handle a 15 bit SOP field for spop2. */
5331 num
= pa_get_number (&the_insn
, &s
);
5332 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5335 CHECK_FIELD (num
, 32767, 0, strict
);
5336 num
= (num
& 0x1f) | ((num
& 0x00007fe0) << 6);
5337 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5339 /* Handle a 3-bit co-processor ID field. */
5342 as_bad (_("Invalid COPR identifier"));
5343 num
= pa_get_number (&the_insn
, &s
);
5344 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5347 CHECK_FIELD (num
, 7, 0, strict
);
5348 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 6);
5350 /* Handle a 22bit SOP field for copr. */
5352 num
= pa_get_number (&the_insn
, &s
);
5353 if (strict
&& the_insn
.exp
.X_op
!= O_constant
)
5356 CHECK_FIELD (num
, 4194303, 0, strict
);
5357 num
= (num
& 0x1f) | ((num
& 0x003fffe0) << 4);
5358 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5360 /* Handle a source FP operand format completer. */
5362 if (*s
== ',' && *(s
+1) == 't')
5369 flag
= pa_parse_fp_cnv_format (&s
);
5370 the_insn
.fpof1
= flag
;
5371 if (flag
== W
|| flag
== UW
)
5373 if (flag
== DW
|| flag
== UDW
)
5375 if (flag
== QW
|| flag
== UQW
)
5377 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
5379 /* Handle a destination FP operand format completer. */
5381 /* pa_parse_format needs the ',' prefix. */
5383 flag
= pa_parse_fp_cnv_format (&s
);
5384 the_insn
.fpof2
= flag
;
5385 if (flag
== W
|| flag
== UW
)
5387 if (flag
== DW
|| flag
== UDW
)
5389 if (flag
== QW
|| flag
== UQW
)
5391 opcode
|= flag
<< 13;
5392 if (the_insn
.fpof1
== SGL
5393 || the_insn
.fpof1
== DBL
5394 || the_insn
.fpof1
== QUAD
)
5396 if (the_insn
.fpof2
== SGL
5397 || the_insn
.fpof2
== DBL
5398 || the_insn
.fpof2
== QUAD
)
5400 else if (the_insn
.fpof2
== W
5401 || the_insn
.fpof2
== DW
5402 || the_insn
.fpof2
== QW
)
5404 else if (the_insn
.fpof2
== UW
5405 || the_insn
.fpof2
== UDW
5406 || the_insn
.fpof2
== UQW
)
5411 else if (the_insn
.fpof1
== W
5412 || the_insn
.fpof1
== DW
5413 || the_insn
.fpof1
== QW
)
5415 if (the_insn
.fpof2
== SGL
5416 || the_insn
.fpof2
== DBL
5417 || the_insn
.fpof2
== QUAD
)
5422 else if (the_insn
.fpof1
== UW
5423 || the_insn
.fpof1
== UDW
5424 || the_insn
.fpof1
== UQW
)
5426 if (the_insn
.fpof2
== SGL
5427 || the_insn
.fpof2
== DBL
5428 || the_insn
.fpof2
== QUAD
)
5433 flag
|= the_insn
.trunc
;
5434 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 15);
5436 /* Handle a source FP operand format completer. */
5438 flag
= pa_parse_fp_format (&s
);
5439 the_insn
.fpof1
= flag
;
5440 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
5442 /* Handle a destination FP operand format completer. */
5444 /* pa_parse_format needs the ',' prefix. */
5446 flag
= pa_parse_fp_format (&s
);
5447 the_insn
.fpof2
= flag
;
5448 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 13);
5450 /* Handle a source FP operand format completer at 20. */
5452 flag
= pa_parse_fp_format (&s
);
5453 the_insn
.fpof1
= flag
;
5454 INSERT_FIELD_AND_CONTINUE (opcode
, flag
, 11);
5456 /* Handle a floating point operand format at 26.
5457 Only allows single and double precision. */
5459 flag
= pa_parse_fp_format (&s
);
5465 the_insn
.fpof1
= flag
;
5471 as_bad (_("Invalid Floating Point Operand Format."));
5475 /* Handle all floating point registers. */
5479 /* Float target register. */
5481 if (!pa_parse_number (&s
, 3))
5483 /* RSEL should not be set. */
5484 if (pa_number
& FP_REG_RSEL
)
5486 num
= pa_number
- FP_REG_BASE
;
5487 CHECK_FIELD (num
, 31, 0, 0);
5488 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5490 /* Float target register with L/R selection. */
5493 if (!pa_parse_number (&s
, 1))
5495 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5496 CHECK_FIELD (num
, 31, 0, 0);
5499 /* 0x30 opcodes are FP arithmetic operation opcodes
5500 and need to be turned into 0x38 opcodes. This
5501 is not necessary for loads/stores. */
5502 if (need_pa11_opcode ()
5503 && ((opcode
& 0xfc000000) == 0x30000000))
5506 opcode
|= (pa_number
& FP_REG_RSEL
? 1 << 6 : 0);
5510 /* Float operand 1. */
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
<< 21;
5518 if (need_pa11_opcode ())
5520 opcode
|= (pa_number
& FP_REG_RSEL
? 1 << 7 : 0);
5526 /* Float operand 1 with L/R selection. */
5530 if (!pa_parse_number (&s
, 1))
5532 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5533 CHECK_FIELD (num
, 31, 0, 0);
5534 opcode
|= num
<< 21;
5535 opcode
|= (pa_number
& FP_REG_RSEL
? 1 << 7 : 0);
5539 /* Float operand 2. */
5542 if (!pa_parse_number (&s
, 1))
5544 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5545 CHECK_FIELD (num
, 31, 0, 0);
5546 opcode
|= num
<< 16;
5547 if (need_pa11_opcode ())
5549 opcode
|= (pa_number
& FP_REG_RSEL
? 1 << 12 : 0);
5555 /* Float operand 2 with L/R selection. */
5558 if (!pa_parse_number (&s
, 1))
5560 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5561 CHECK_FIELD (num
, 31, 0, 0);
5562 opcode
|= num
<< 16;
5563 opcode
|= (pa_number
& FP_REG_RSEL
? 1 << 12 : 0);
5567 /* Float operand 3 for fmpyfadd, fmpynfadd. */
5570 if (!pa_parse_number (&s
, 1))
5572 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5573 CHECK_FIELD (num
, 31, 0, 0);
5574 opcode
|= (num
& 0x1c) << 11;
5575 opcode
|= (num
& 0x03) << 9;
5576 opcode
|= (pa_number
& FP_REG_RSEL
? 1 << 8 : 0);
5580 /* Float mult operand 1 for fmpyadd, fmpysub */
5583 if (!pa_parse_number (&s
, 1))
5585 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5586 CHECK_FIELD (num
, 31, 0, 0);
5587 if (the_insn
.fpof1
== SGL
)
5591 as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5595 num
|= (pa_number
& FP_REG_RSEL
? 1 << 4 : 0);
5597 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 21);
5600 /* Float mult operand 2 for fmpyadd, fmpysub */
5603 if (!pa_parse_number (&s
, 1))
5605 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5606 CHECK_FIELD (num
, 31, 0, 0);
5607 if (the_insn
.fpof1
== SGL
)
5611 as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5615 num
|= (pa_number
& FP_REG_RSEL
? 1 << 4 : 0);
5617 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 16);
5620 /* Float mult target for fmpyadd, fmpysub */
5623 if (!pa_parse_number (&s
, 1))
5625 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5626 CHECK_FIELD (num
, 31, 0, 0);
5627 if (the_insn
.fpof1
== SGL
)
5631 as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5635 num
|= (pa_number
& FP_REG_RSEL
? 1 << 4 : 0);
5637 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 0);
5640 /* Float add operand 1 for fmpyadd, fmpysub */
5643 if (!pa_parse_number (&s
, 1))
5645 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5646 CHECK_FIELD (num
, 31, 0, 0);
5647 if (the_insn
.fpof1
== SGL
)
5651 as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5655 num
|= (pa_number
& FP_REG_RSEL
? 1 << 4 : 0);
5657 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 6);
5660 /* Float add target for fmpyadd, fmpysub */
5663 if (!pa_parse_number (&s
, 1))
5665 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5666 CHECK_FIELD (num
, 31, 0, 0);
5667 if (the_insn
.fpof1
== SGL
)
5671 as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5675 num
|= (pa_number
& FP_REG_RSEL
? 1 << 4 : 0);
5677 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 11);
5680 /* Handle L/R register halves like 'x'. */
5684 if (!pa_parse_number (&s
, 1))
5686 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5687 CHECK_FIELD (num
, 31, 0, 0);
5688 opcode
|= num
<< 16;
5689 if (need_pa11_opcode ())
5691 opcode
|= (pa_number
& FP_REG_RSEL
? 1 << 1 : 0);
5696 /* Float target register (PA 2.0 wide). */
5698 if (!pa_parse_number (&s
, 3))
5700 num
= (pa_number
& ~FP_REG_RSEL
) - FP_REG_BASE
;
5701 CHECK_FIELD (num
, 31, 0, 0);
5702 INSERT_FIELD_AND_CONTINUE (opcode
, num
, 16);
5715 /* If this instruction is specific to a particular architecture,
5716 then set a new architecture. This automatic promotion crud is
5717 for compatibility with HP's old assemblers only. */
5719 && bfd_get_mach (stdoutput
) < insn
->arch
5720 && !bfd_set_arch_mach (stdoutput
, bfd_arch_hppa
, insn
->arch
))
5722 as_warn (_("could not update architecture and machine"));
5727 /* Check if the args matched. */
5730 if (&insn
[1] - pa_opcodes
< (int) NUMOPCODES
5731 && !strcmp (insn
->name
, insn
[1].name
))
5739 as_bad (_("Invalid operands %s"), error_message
);
5746 if (immediate_check
)
5748 if (pos
!= -1 && len
!= -1 && pos
< len
- 1)
5749 as_warn (_("Immediates %d and %d will give undefined behavior."),
5753 the_insn
.opcode
= opcode
;
5756 /* Assemble a single instruction storing it into a frag. */
5759 md_assemble (char *str
)
5763 /* The had better be something to assemble. */
5766 /* If we are within a procedure definition, make sure we've
5767 defined a label for the procedure; handle case where the
5768 label was defined after the .PROC directive.
5770 Note there's not need to diddle with the segment or fragment
5771 for the label symbol in this case. We have already switched
5772 into the new $CODE$ subspace at this point. */
5773 if (within_procedure
&& last_call_info
->start_symbol
== NULL
)
5775 label_symbol_struct
*label_symbol
= pa_get_label ();
5779 if (label_symbol
->lss_label
)
5781 last_call_info
->start_symbol
= label_symbol
->lss_label
;
5782 symbol_get_bfdsym (label_symbol
->lss_label
)->flags
5785 /* Also handle allocation of a fixup to hold the unwind
5786 information when the label appears after the proc/procend. */
5787 if (within_entry_exit
)
5792 where
= frag_more (0);
5793 u
= UNWIND_LOW32 (&last_call_info
->ci_unwind
.descriptor
);
5794 fix_new_hppa (frag_now
, where
- frag_now
->fr_literal
, 0,
5795 NULL
, (offsetT
) 0, NULL
,
5796 0, R_HPPA_ENTRY
, e_fsel
, 0, 0, u
);
5801 as_bad (_("Missing function name for .PROC (corrupted label chain)"));
5804 as_bad (_("Missing function name for .PROC"));
5807 /* Assemble the instruction. Results are saved into "the_insn". */
5810 /* Get somewhere to put the assembled instruction. */
5813 /* Output the opcode. */
5814 md_number_to_chars (to
, the_insn
.opcode
, 4);
5816 /* If necessary output more stuff. */
5817 if (the_insn
.reloc
!= R_HPPA_NONE
)
5818 fix_new_hppa (frag_now
, (to
- frag_now
->fr_literal
), 4, NULL
,
5819 (offsetT
) 0, &the_insn
.exp
, the_insn
.pcrel
,
5820 the_insn
.reloc
, the_insn
.field_selector
,
5821 the_insn
.format
, the_insn
.arg_reloc
, 0);
5824 dwarf2_emit_insn (4);
5829 /* Handle an alignment directive. Special so that we can update the
5830 alignment of the subspace if necessary. */
5832 pa_align (int bytes
)
5834 /* We must have a valid space and subspace. */
5835 pa_check_current_space_and_subspace ();
5837 /* Let the generic gas code do most of the work. */
5838 s_align_bytes (bytes
);
5840 /* If bytes is a power of 2, then update the current subspace's
5841 alignment if necessary. */
5842 if (exact_log2 (bytes
) != -1)
5843 record_alignment (current_subspace
->ssd_seg
, exact_log2 (bytes
));
5847 /* Handle a .BLOCK type pseudo-op. */
5850 pa_block (int z ATTRIBUTE_UNUSED
)
5852 unsigned int temp_size
;
5855 /* We must have a valid space and subspace. */
5856 pa_check_current_space_and_subspace ();
5859 temp_size
= get_absolute_expression ();
5861 if (temp_size
> 0x3FFFFFFF)
5863 as_bad (_("Argument to .BLOCK/.BLOCKZ must be between 0 and 0x3fffffff"));
5868 /* Always fill with zeros, that's what the HP assembler does. */
5869 char *p
= frag_var (rs_fill
, 1, 1, 0, NULL
, temp_size
, NULL
);
5873 pa_undefine_label ();
5874 demand_empty_rest_of_line ();
5877 /* Handle a .begin_brtab and .end_brtab pseudo-op. */
5880 pa_brtab (int begin ATTRIBUTE_UNUSED
)
5884 /* The BRTAB relocations are only available in SOM (to denote
5885 the beginning and end of branch tables). */
5886 char *where
= frag_more (0);
5888 fix_new_hppa (frag_now
, where
- frag_now
->fr_literal
, 0,
5889 NULL
, (offsetT
) 0, NULL
,
5890 0, begin
? R_HPPA_BEGIN_BRTAB
: R_HPPA_END_BRTAB
,
5894 demand_empty_rest_of_line ();
5897 /* Handle a .begin_try and .end_try pseudo-op. */
5900 pa_try (int begin ATTRIBUTE_UNUSED
)
5904 char *where
= frag_more (0);
5909 /* The TRY relocations are only available in SOM (to denote
5910 the beginning and end of exception handling regions). */
5912 fix_new_hppa (frag_now
, where
- frag_now
->fr_literal
, 0,
5913 NULL
, (offsetT
) 0, begin
? NULL
: &exp
,
5914 0, begin
? R_HPPA_BEGIN_TRY
: R_HPPA_END_TRY
,
5918 demand_empty_rest_of_line ();
5921 /* Do the dirty work of building a call descriptor which describes
5922 where the caller placed arguments to a function call. */
5925 pa_call_args (struct call_desc
*call_desc
)
5928 unsigned int temp
, arg_reloc
;
5930 while (!is_end_of_statement ())
5932 name
= input_line_pointer
;
5933 c
= get_symbol_end ();
5934 /* Process a source argument. */
5935 if ((strncasecmp (name
, "argw", 4) == 0))
5937 temp
= atoi (name
+ 4);
5938 p
= input_line_pointer
;
5940 input_line_pointer
++;
5941 name
= input_line_pointer
;
5942 c
= get_symbol_end ();
5943 arg_reloc
= pa_build_arg_reloc (name
);
5944 call_desc
->arg_reloc
|= pa_align_arg_reloc (temp
, arg_reloc
);
5946 /* Process a return value. */
5947 else if ((strncasecmp (name
, "rtnval", 6) == 0))
5949 p
= input_line_pointer
;
5951 input_line_pointer
++;
5952 name
= input_line_pointer
;
5953 c
= get_symbol_end ();
5954 arg_reloc
= pa_build_arg_reloc (name
);
5955 call_desc
->arg_reloc
|= (arg_reloc
& 0x3);
5959 as_bad (_("Invalid .CALL argument: %s"), name
);
5961 p
= input_line_pointer
;
5963 if (!is_end_of_statement ())
5964 input_line_pointer
++;
5968 /* Handle a .CALL pseudo-op. This involves storing away information
5969 about where arguments are to be found so the linker can detect
5970 (and correct) argument location mismatches between caller and callee. */
5973 pa_call (int unused ATTRIBUTE_UNUSED
)
5976 /* We must have a valid space and subspace. */
5977 pa_check_current_space_and_subspace ();
5980 pa_call_args (&last_call_desc
);
5981 demand_empty_rest_of_line ();
5985 /* Build an entry in the UNWIND subspace from the given function
5986 attributes in CALL_INFO. This is not needed for SOM as using
5987 R_ENTRY and R_EXIT relocations allow the linker to handle building
5988 of the unwind spaces. */
5991 pa_build_unwind_subspace (struct call_info
*call_info
)
5993 asection
*seg
, *save_seg
;
5994 subsegT save_subseg
;
5995 unsigned int unwind
;
6000 if ((bfd_get_section_flags (stdoutput
, now_seg
)
6001 & (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
))
6002 != (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
))
6005 if (call_info
->start_symbol
== NULL
)
6006 /* This can happen if there were errors earlier on in the assembly. */
6009 /* Replace the start symbol with a local symbol that will be reduced
6010 to a section offset. This avoids problems with weak functions with
6011 multiple definitions, etc. */
6012 name
= xmalloc (strlen ("L$\001start_")
6013 + strlen (S_GET_NAME (call_info
->start_symbol
))
6015 strcpy (name
, "L$\001start_");
6016 strcat (name
, S_GET_NAME (call_info
->start_symbol
));
6018 /* If we have a .procend preceded by a .exit, then the symbol will have
6019 already been defined. In that case, we don't want another unwind
6021 symbolP
= symbol_find (name
);
6029 symbolP
= symbol_new (name
, now_seg
,
6030 S_GET_VALUE (call_info
->start_symbol
), frag_now
);
6031 gas_assert (symbolP
);
6032 S_CLEAR_EXTERNAL (symbolP
);
6033 symbol_table_insert (symbolP
);
6036 reloc
= R_PARISC_SEGREL32
;
6038 save_subseg
= now_subseg
;
6039 /* Get into the right seg/subseg. This may involve creating
6040 the seg the first time through. Make sure to have the
6041 old seg/subseg so that we can reset things when we are done. */
6042 seg
= bfd_get_section_by_name (stdoutput
, UNWIND_SECTION_NAME
);
6043 if (seg
== ASEC_NULL
)
6045 seg
= subseg_new (UNWIND_SECTION_NAME
, 0);
6046 bfd_set_section_flags (stdoutput
, seg
,
6047 SEC_READONLY
| SEC_HAS_CONTENTS
6048 | SEC_LOAD
| SEC_RELOC
| SEC_ALLOC
| SEC_DATA
);
6049 bfd_set_section_alignment (stdoutput
, seg
, 2);
6052 subseg_set (seg
, 0);
6054 /* Get some space to hold relocation information for the unwind
6058 /* Relocation info. for start offset of the function. */
6059 md_number_to_chars (p
, 0, 4);
6060 fix_new_hppa (frag_now
, p
- frag_now
->fr_literal
, 4,
6061 symbolP
, (offsetT
) 0,
6062 (expressionS
*) NULL
, 0, reloc
,
6065 /* Relocation info. for end offset of the function.
6067 Because we allow reductions of 32bit relocations for ELF, this will be
6068 reduced to section_sym + offset which avoids putting the temporary
6069 symbol into the symbol table. It (should) end up giving the same
6070 value as call_info->start_symbol + function size once the linker is
6071 finished with its work. */
6072 md_number_to_chars (p
+ 4, 0, 4);
6073 fix_new_hppa (frag_now
, p
+ 4 - frag_now
->fr_literal
, 4,
6074 call_info
->end_symbol
, (offsetT
) 0,
6075 (expressionS
*) NULL
, 0, reloc
,
6078 /* Dump the descriptor. */
6079 unwind
= UNWIND_LOW32 (&call_info
->ci_unwind
.descriptor
);
6080 md_number_to_chars (p
+ 8, unwind
, 4);
6082 unwind
= UNWIND_HIGH32 (&call_info
->ci_unwind
.descriptor
);
6083 md_number_to_chars (p
+ 12, unwind
, 4);
6085 /* Return back to the original segment/subsegment. */
6086 subseg_set (save_seg
, save_subseg
);
6090 /* Process a .CALLINFO pseudo-op. This information is used later
6091 to build unwind descriptors and maybe one day to support
6092 .ENTER and .LEAVE. */
6095 pa_callinfo (int unused ATTRIBUTE_UNUSED
)
6101 /* We must have a valid space and subspace. */
6102 pa_check_current_space_and_subspace ();
6105 /* .CALLINFO must appear within a procedure definition. */
6106 if (!within_procedure
)
6107 as_bad (_(".callinfo is not within a procedure definition"));
6109 /* Mark the fact that we found the .CALLINFO for the
6110 current procedure. */
6111 callinfo_found
= TRUE
;
6113 /* Iterate over the .CALLINFO arguments. */
6114 while (!is_end_of_statement ())
6116 name
= input_line_pointer
;
6117 c
= get_symbol_end ();
6118 /* Frame size specification. */
6119 if ((strncasecmp (name
, "frame", 5) == 0))
6121 p
= input_line_pointer
;
6123 input_line_pointer
++;
6124 temp
= get_absolute_expression ();
6125 if ((temp
& 0x3) != 0)
6127 as_bad (_("FRAME parameter must be a multiple of 8: %d\n"), temp
);
6131 /* callinfo is in bytes and unwind_desc is in 8 byte units. */
6132 last_call_info
->ci_unwind
.descriptor
.frame_size
= temp
/ 8;
6135 /* Entry register (GR, GR and SR) specifications. */
6136 else if ((strncasecmp (name
, "entry_gr", 8) == 0))
6138 p
= input_line_pointer
;
6140 input_line_pointer
++;
6141 temp
= get_absolute_expression ();
6142 /* The HP assembler accepts 19 as the high bound for ENTRY_GR
6143 even though %r19 is caller saved. I think this is a bug in
6144 the HP assembler, and we are not going to emulate it. */
6145 if (temp
< 3 || temp
> 18)
6146 as_bad (_("Value for ENTRY_GR must be in the range 3..18\n"));
6147 last_call_info
->ci_unwind
.descriptor
.entry_gr
= temp
- 2;
6149 else if ((strncasecmp (name
, "entry_fr", 8) == 0))
6151 p
= input_line_pointer
;
6153 input_line_pointer
++;
6154 temp
= get_absolute_expression ();
6155 /* Similarly the HP assembler takes 31 as the high bound even
6156 though %fr21 is the last callee saved floating point register. */
6157 if (temp
< 12 || temp
> 21)
6158 as_bad (_("Value for ENTRY_FR must be in the range 12..21\n"));
6159 last_call_info
->ci_unwind
.descriptor
.entry_fr
= temp
- 11;
6161 else if ((strncasecmp (name
, "entry_sr", 8) == 0))
6163 p
= input_line_pointer
;
6165 input_line_pointer
++;
6166 temp
= get_absolute_expression ();
6168 as_bad (_("Value for ENTRY_SR must be 3\n"));
6170 /* Note whether or not this function performs any calls. */
6171 else if ((strncasecmp (name
, "calls", 5) == 0) ||
6172 (strncasecmp (name
, "caller", 6) == 0))
6174 p
= input_line_pointer
;
6177 else if ((strncasecmp (name
, "no_calls", 8) == 0))
6179 p
= input_line_pointer
;
6182 /* Should RP be saved into the stack. */
6183 else if ((strncasecmp (name
, "save_rp", 7) == 0))
6185 p
= input_line_pointer
;
6187 last_call_info
->ci_unwind
.descriptor
.save_rp
= 1;
6189 /* Likewise for SP. */
6190 else if ((strncasecmp (name
, "save_sp", 7) == 0))
6192 p
= input_line_pointer
;
6194 last_call_info
->ci_unwind
.descriptor
.save_sp
= 1;
6196 /* Is this an unwindable procedure. If so mark it so
6197 in the unwind descriptor. */
6198 else if ((strncasecmp (name
, "no_unwind", 9) == 0))
6200 p
= input_line_pointer
;
6202 last_call_info
->ci_unwind
.descriptor
.cannot_unwind
= 1;
6204 /* Is this an interrupt routine. If so mark it in the
6205 unwind descriptor. */
6206 else if ((strncasecmp (name
, "hpux_int", 7) == 0))
6208 p
= input_line_pointer
;
6210 last_call_info
->ci_unwind
.descriptor
.hpux_interrupt_marker
= 1;
6212 /* Is this a millicode routine. "millicode" isn't in my
6213 assembler manual, but my copy is old. The HP assembler
6214 accepts it, and there's a place in the unwind descriptor
6215 to drop the information, so we'll accept it too. */
6216 else if ((strncasecmp (name
, "millicode", 9) == 0))
6218 p
= input_line_pointer
;
6220 last_call_info
->ci_unwind
.descriptor
.millicode
= 1;
6224 as_bad (_("Invalid .CALLINFO argument: %s"), name
);
6225 *input_line_pointer
= c
;
6227 if (!is_end_of_statement ())
6228 input_line_pointer
++;
6231 demand_empty_rest_of_line ();
6234 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
6235 /* Switch to the text space. Like s_text, but delete our
6236 label when finished. */
6239 pa_text (int unused ATTRIBUTE_UNUSED
)
6242 current_space
= is_defined_space ("$TEXT$");
6244 = pa_subsegment_to_subspace (current_space
->sd_seg
, 0);
6248 pa_undefine_label ();
6251 /* Switch to the data space. As usual delete our label. */
6254 pa_data (int unused ATTRIBUTE_UNUSED
)
6257 current_space
= is_defined_space ("$PRIVATE$");
6259 = pa_subsegment_to_subspace (current_space
->sd_seg
, 0);
6262 pa_undefine_label ();
6265 /* This is different than the standard GAS s_comm(). On HP9000/800 machines,
6266 the .comm pseudo-op has the following syntax:
6268 <label> .comm <length>
6270 where <label> is optional and is a symbol whose address will be the start of
6271 a block of memory <length> bytes long. <length> must be an absolute
6272 expression. <length> bytes will be allocated in the current space
6275 Also note the label may not even be on the same line as the .comm.
6277 This difference in syntax means the colon function will be called
6278 on the symbol before we arrive in pa_comm. colon will set a number
6279 of attributes of the symbol that need to be fixed here. In particular
6280 the value, section pointer, fragment pointer, flags, etc. What
6283 This also makes error detection all but impossible. */
6286 pa_comm (int unused ATTRIBUTE_UNUSED
)
6290 label_symbol_struct
*label_symbol
= pa_get_label ();
6293 symbol
= label_symbol
->lss_label
;
6298 size
= get_absolute_expression ();
6302 symbol_get_bfdsym (symbol
)->flags
|= BSF_OBJECT
;
6303 S_SET_VALUE (symbol
, size
);
6304 S_SET_SEGMENT (symbol
, bfd_com_section_ptr
);
6305 S_SET_EXTERNAL (symbol
);
6307 /* colon() has already set the frag to the current location in the
6308 current subspace; we need to reset the fragment to the zero address
6309 fragment. We also need to reset the segment pointer. */
6310 symbol_set_frag (symbol
, &zero_address_frag
);
6312 demand_empty_rest_of_line ();
6314 #endif /* !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))) */
6316 /* Process a .END pseudo-op. */
6319 pa_end (int unused ATTRIBUTE_UNUSED
)
6321 demand_empty_rest_of_line ();
6324 /* Process a .ENTER pseudo-op. This is not supported. */
6327 pa_enter (int unused ATTRIBUTE_UNUSED
)
6330 /* We must have a valid space and subspace. */
6331 pa_check_current_space_and_subspace ();
6334 as_bad (_("The .ENTER pseudo-op is not supported"));
6335 demand_empty_rest_of_line ();
6338 /* Process a .ENTRY pseudo-op. .ENTRY marks the beginning of the
6342 pa_entry (int unused ATTRIBUTE_UNUSED
)
6345 /* We must have a valid space and subspace. */
6346 pa_check_current_space_and_subspace ();
6349 if (!within_procedure
)
6350 as_bad (_("Misplaced .entry. Ignored."));
6353 if (!callinfo_found
)
6354 as_bad (_("Missing .callinfo."));
6356 demand_empty_rest_of_line ();
6357 within_entry_exit
= TRUE
;
6360 /* SOM defers building of unwind descriptors until the link phase.
6361 The assembler is responsible for creating an R_ENTRY relocation
6362 to mark the beginning of a region and hold the unwind bits, and
6363 for creating an R_EXIT relocation to mark the end of the region.
6365 FIXME. ELF should be using the same conventions! The problem
6366 is an unwind requires too much relocation space. Hmmm. Maybe
6367 if we split the unwind bits up between the relocations which
6368 denote the entry and exit points. */
6369 if (last_call_info
->start_symbol
!= NULL
)
6374 where
= frag_more (0);
6375 u
= UNWIND_LOW32 (&last_call_info
->ci_unwind
.descriptor
);
6376 fix_new_hppa (frag_now
, where
- frag_now
->fr_literal
, 0,
6377 NULL
, (offsetT
) 0, NULL
,
6378 0, R_HPPA_ENTRY
, e_fsel
, 0, 0, u
);
6383 /* Silly nonsense for pa_equ. The only half-sensible use for this is
6384 being able to subtract two register symbols that specify a range of
6385 registers, to get the size of the range. */
6386 static int fudge_reg_expressions
;
6389 hppa_force_reg_syms_absolute (expressionS
*resultP
,
6390 operatorT op ATTRIBUTE_UNUSED
,
6391 expressionS
*rightP
)
6393 if (fudge_reg_expressions
6394 && rightP
->X_op
== O_register
6395 && resultP
->X_op
== O_register
)
6397 rightP
->X_op
= O_constant
;
6398 resultP
->X_op
= O_constant
;
6400 return 0; /* Continue normal expr handling. */
6403 /* Handle a .EQU pseudo-op. */
6408 label_symbol_struct
*label_symbol
= pa_get_label ();
6413 symbol
= label_symbol
->lss_label
;
6417 if (!pa_parse_number (&input_line_pointer
, 0))
6418 as_bad (_(".REG expression must be a register"));
6419 S_SET_VALUE (symbol
, pa_number
);
6420 S_SET_SEGMENT (symbol
, reg_section
);
6427 fudge_reg_expressions
= 1;
6428 seg
= expression (&exp
);
6429 fudge_reg_expressions
= 0;
6430 if (exp
.X_op
!= O_constant
6431 && exp
.X_op
!= O_register
)
6433 if (exp
.X_op
!= O_absent
)
6434 as_bad (_("bad or irreducible absolute expression; zero assumed"));
6435 exp
.X_add_number
= 0;
6436 seg
= absolute_section
;
6438 S_SET_VALUE (symbol
, (unsigned int) exp
.X_add_number
);
6439 S_SET_SEGMENT (symbol
, seg
);
6445 as_bad (_(".REG must use a label"));
6447 as_bad (_(".EQU must use a label"));
6450 pa_undefine_label ();
6451 demand_empty_rest_of_line ();
6455 /* Mark the end of a function so that it's possible to compute
6456 the size of the function in elf_hppa_final_processing. */
6459 hppa_elf_mark_end_of_function (void)
6461 /* ELF does not have EXIT relocations. All we do is create a
6462 temporary symbol marking the end of the function. */
6465 if (last_call_info
== NULL
|| last_call_info
->start_symbol
== NULL
)
6467 /* We have already warned about a missing label,
6468 or other problems. */
6472 name
= xmalloc (strlen ("L$\001end_")
6473 + strlen (S_GET_NAME (last_call_info
->start_symbol
))
6479 strcpy (name
, "L$\001end_");
6480 strcat (name
, S_GET_NAME (last_call_info
->start_symbol
));
6482 /* If we have a .exit followed by a .procend, then the
6483 symbol will have already been defined. */
6484 symbolP
= symbol_find (name
);
6487 /* The symbol has already been defined! This can
6488 happen if we have a .exit followed by a .procend.
6490 This is *not* an error. All we want to do is free
6491 the memory we just allocated for the name and continue. */
6496 /* symbol value should be the offset of the
6497 last instruction of the function */
6498 symbolP
= symbol_new (name
, now_seg
, (valueT
) (frag_now_fix () - 4),
6501 gas_assert (symbolP
);
6502 S_CLEAR_EXTERNAL (symbolP
);
6503 symbol_table_insert (symbolP
);
6507 last_call_info
->end_symbol
= symbolP
;
6509 as_bad (_("Symbol '%s' could not be created."), name
);
6513 as_bad (_("No memory for symbol name."));
6517 /* Helper function. Does processing for the end of a function. This
6518 usually involves creating some relocations or building special
6519 symbols to mark the end of the function. */
6526 where
= frag_more (0);
6529 /* Mark the end of the function, stuff away the location of the frag
6530 for the end of the function, and finally call pa_build_unwind_subspace
6531 to add an entry in the unwind table. */
6533 hppa_elf_mark_end_of_function ();
6534 pa_build_unwind_subspace (last_call_info
);
6536 /* SOM defers building of unwind descriptors until the link phase.
6537 The assembler is responsible for creating an R_ENTRY relocation
6538 to mark the beginning of a region and hold the unwind bits, and
6539 for creating an R_EXIT relocation to mark the end of the region.
6541 FIXME. ELF should be using the same conventions! The problem
6542 is an unwind requires too much relocation space. Hmmm. Maybe
6543 if we split the unwind bits up between the relocations which
6544 denote the entry and exit points. */
6545 fix_new_hppa (frag_now
, where
- frag_now
->fr_literal
, 0,
6547 NULL
, 0, R_HPPA_EXIT
, e_fsel
, 0, 0,
6548 UNWIND_HIGH32 (&last_call_info
->ci_unwind
.descriptor
));
6552 /* Process a .EXIT pseudo-op. */
6555 pa_exit (int unused ATTRIBUTE_UNUSED
)
6558 /* We must have a valid space and subspace. */
6559 pa_check_current_space_and_subspace ();
6562 if (!within_procedure
)
6563 as_bad (_(".EXIT must appear within a procedure"));
6566 if (!callinfo_found
)
6567 as_bad (_("Missing .callinfo"));
6570 if (!within_entry_exit
)
6571 as_bad (_("No .ENTRY for this .EXIT"));
6574 within_entry_exit
= FALSE
;
6579 demand_empty_rest_of_line ();
6582 /* Helper function to process arguments to a .EXPORT pseudo-op. */
6585 pa_type_args (symbolS
*symbolP
, int is_export
)
6588 unsigned int temp
, arg_reloc
;
6589 pa_symbol_type type
= SYMBOL_TYPE_UNKNOWN
;
6590 asymbol
*bfdsym
= symbol_get_bfdsym (symbolP
);
6592 if (strncasecmp (input_line_pointer
, "absolute", 8) == 0)
6594 input_line_pointer
+= 8;
6595 bfdsym
->flags
&= ~BSF_FUNCTION
;
6596 S_SET_SEGMENT (symbolP
, bfd_abs_section_ptr
);
6597 type
= SYMBOL_TYPE_ABSOLUTE
;
6599 else if (strncasecmp (input_line_pointer
, "code", 4) == 0)
6601 input_line_pointer
+= 4;
6602 /* IMPORTing/EXPORTing CODE types for functions is meaningless for SOM,
6603 instead one should be IMPORTing/EXPORTing ENTRY types.
6605 Complain if one tries to EXPORT a CODE type since that's never
6606 done. Both GCC and HP C still try to IMPORT CODE types, so
6607 silently fix them to be ENTRY types. */
6608 if (S_IS_FUNCTION (symbolP
))
6611 as_tsktsk (_("Using ENTRY rather than CODE in export directive for %s"),
6612 S_GET_NAME (symbolP
));
6614 bfdsym
->flags
|= BSF_FUNCTION
;
6615 type
= SYMBOL_TYPE_ENTRY
;
6619 bfdsym
->flags
&= ~BSF_FUNCTION
;
6620 type
= SYMBOL_TYPE_CODE
;
6623 else if (strncasecmp (input_line_pointer
, "data", 4) == 0)
6625 input_line_pointer
+= 4;
6626 bfdsym
->flags
&= ~BSF_FUNCTION
;
6627 bfdsym
->flags
|= BSF_OBJECT
;
6628 type
= SYMBOL_TYPE_DATA
;
6630 else if ((strncasecmp (input_line_pointer
, "entry", 5) == 0))
6632 input_line_pointer
+= 5;
6633 bfdsym
->flags
|= BSF_FUNCTION
;
6634 type
= SYMBOL_TYPE_ENTRY
;
6636 else if (strncasecmp (input_line_pointer
, "millicode", 9) == 0)
6638 input_line_pointer
+= 9;
6639 bfdsym
->flags
|= BSF_FUNCTION
;
6642 elf_symbol_type
*elfsym
= (elf_symbol_type
*) bfdsym
;
6643 elfsym
->internal_elf_sym
.st_info
=
6644 ELF_ST_INFO (ELF_ST_BIND (elfsym
->internal_elf_sym
.st_info
),
6648 type
= SYMBOL_TYPE_MILLICODE
;
6650 else if (strncasecmp (input_line_pointer
, "plabel", 6) == 0)
6652 input_line_pointer
+= 6;
6653 bfdsym
->flags
&= ~BSF_FUNCTION
;
6654 type
= SYMBOL_TYPE_PLABEL
;
6656 else if (strncasecmp (input_line_pointer
, "pri_prog", 8) == 0)
6658 input_line_pointer
+= 8;
6659 bfdsym
->flags
|= BSF_FUNCTION
;
6660 type
= SYMBOL_TYPE_PRI_PROG
;
6662 else if (strncasecmp (input_line_pointer
, "sec_prog", 8) == 0)
6664 input_line_pointer
+= 8;
6665 bfdsym
->flags
|= BSF_FUNCTION
;
6666 type
= SYMBOL_TYPE_SEC_PROG
;
6669 /* SOM requires much more information about symbol types
6670 than BFD understands. This is how we get this information
6671 to the SOM BFD backend. */
6672 #ifdef obj_set_symbol_type
6673 obj_set_symbol_type (bfdsym
, (int) type
);
6678 /* Now that the type of the exported symbol has been handled,
6679 handle any argument relocation information. */
6680 while (!is_end_of_statement ())
6682 if (*input_line_pointer
== ',')
6683 input_line_pointer
++;
6684 name
= input_line_pointer
;
6685 c
= get_symbol_end ();
6686 /* Argument sources. */
6687 if ((strncasecmp (name
, "argw", 4) == 0))
6689 p
= input_line_pointer
;
6691 input_line_pointer
++;
6692 temp
= atoi (name
+ 4);
6693 name
= input_line_pointer
;
6694 c
= get_symbol_end ();
6695 arg_reloc
= pa_align_arg_reloc (temp
, pa_build_arg_reloc (name
));
6696 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
6697 symbol_arg_reloc_info (symbolP
) |= arg_reloc
;
6701 *input_line_pointer
= c
;
6703 /* The return value. */
6704 else if ((strncasecmp (name
, "rtnval", 6)) == 0)
6706 p
= input_line_pointer
;
6708 input_line_pointer
++;
6709 name
= input_line_pointer
;
6710 c
= get_symbol_end ();
6711 arg_reloc
= pa_build_arg_reloc (name
);
6712 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
6713 symbol_arg_reloc_info (symbolP
) |= arg_reloc
;
6717 *input_line_pointer
= c
;
6719 /* Privilege level. */
6720 else if ((strncasecmp (name
, "priv_lev", 8)) == 0)
6722 p
= input_line_pointer
;
6724 input_line_pointer
++;
6725 temp
= atoi (input_line_pointer
);
6727 ((obj_symbol_type
*) bfdsym
)->tc_data
.ap
.hppa_priv_level
= temp
;
6729 c
= get_symbol_end ();
6730 *input_line_pointer
= c
;
6734 as_bad (_("Undefined .EXPORT/.IMPORT argument (ignored): %s"), name
);
6735 p
= input_line_pointer
;
6738 if (!is_end_of_statement ())
6739 input_line_pointer
++;
6743 /* Process a .EXPORT directive. This makes functions external
6744 and provides information such as argument relocation entries
6748 pa_export (int unused ATTRIBUTE_UNUSED
)
6753 name
= input_line_pointer
;
6754 c
= get_symbol_end ();
6755 /* Make sure the given symbol exists. */
6756 if ((symbol
= symbol_find_or_make (name
)) == NULL
)
6758 as_bad (_("Cannot define export symbol: %s\n"), name
);
6759 p
= input_line_pointer
;
6761 input_line_pointer
++;
6765 /* OK. Set the external bits and process argument relocations.
6766 For the HP, weak and global are not mutually exclusive.
6767 S_SET_EXTERNAL will not set BSF_GLOBAL if WEAK is set.
6768 Call S_SET_EXTERNAL to get the other processing. Manually
6769 set BSF_GLOBAL when we get back. */
6770 S_SET_EXTERNAL (symbol
);
6771 symbol_get_bfdsym (symbol
)->flags
|= BSF_GLOBAL
;
6772 p
= input_line_pointer
;
6774 if (!is_end_of_statement ())
6776 input_line_pointer
++;
6777 pa_type_args (symbol
, 1);
6781 demand_empty_rest_of_line ();
6784 /* Handle an .IMPORT pseudo-op. Any symbol referenced in a given
6785 assembly file must either be defined in the assembly file, or
6786 explicitly IMPORTED from another. */
6789 pa_import (int unused ATTRIBUTE_UNUSED
)
6794 name
= input_line_pointer
;
6795 c
= get_symbol_end ();
6797 symbol
= symbol_find (name
);
6798 /* Ugh. We might be importing a symbol defined earlier in the file,
6799 in which case all the code below will really screw things up
6800 (set the wrong segment, symbol flags & type, etc). */
6801 if (symbol
== NULL
|| !S_IS_DEFINED (symbol
))
6803 symbol
= symbol_find_or_make (name
);
6804 p
= input_line_pointer
;
6807 if (!is_end_of_statement ())
6809 input_line_pointer
++;
6810 pa_type_args (symbol
, 0);
6814 /* Sigh. To be compatible with the HP assembler and to help
6815 poorly written assembly code, we assign a type based on
6816 the current segment. Note only BSF_FUNCTION really
6817 matters, we do not need to set the full SYMBOL_TYPE_* info. */
6818 if (now_seg
== text_section
)
6819 symbol_get_bfdsym (symbol
)->flags
|= BSF_FUNCTION
;
6821 /* If the section is undefined, then the symbol is undefined
6822 Since this is an import, leave the section undefined. */
6823 S_SET_SEGMENT (symbol
, bfd_und_section_ptr
);
6828 /* The symbol was already defined. Just eat everything up to
6829 the end of the current statement. */
6830 while (!is_end_of_statement ())
6831 input_line_pointer
++;
6834 demand_empty_rest_of_line ();
6837 /* Handle a .LABEL pseudo-op. */
6840 pa_label (int unused ATTRIBUTE_UNUSED
)
6844 name
= input_line_pointer
;
6845 c
= get_symbol_end ();
6847 if (strlen (name
) > 0)
6850 p
= input_line_pointer
;
6855 as_warn (_("Missing label name on .LABEL"));
6858 if (!is_end_of_statement ())
6860 as_warn (_("extra .LABEL arguments ignored."));
6861 ignore_rest_of_line ();
6863 demand_empty_rest_of_line ();
6866 /* Handle a .LEAVE pseudo-op. This is not supported yet. */
6869 pa_leave (int unused ATTRIBUTE_UNUSED
)
6872 /* We must have a valid space and subspace. */
6873 pa_check_current_space_and_subspace ();
6876 as_bad (_("The .LEAVE pseudo-op is not supported"));
6877 demand_empty_rest_of_line ();
6880 /* Handle a .LEVEL pseudo-op. */
6883 pa_level (int unused ATTRIBUTE_UNUSED
)
6887 level
= input_line_pointer
;
6888 if (strncmp (level
, "1.0", 3) == 0)
6890 input_line_pointer
+= 3;
6891 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_hppa
, 10))
6892 as_warn (_("could not set architecture and machine"));
6894 else if (strncmp (level
, "1.1", 3) == 0)
6896 input_line_pointer
+= 3;
6897 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_hppa
, 11))
6898 as_warn (_("could not set architecture and machine"));
6900 else if (strncmp (level
, "2.0w", 4) == 0)
6902 input_line_pointer
+= 4;
6903 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_hppa
, 25))
6904 as_warn (_("could not set architecture and machine"));
6906 else if (strncmp (level
, "2.0", 3) == 0)
6908 input_line_pointer
+= 3;
6909 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_hppa
, 20))
6910 as_warn (_("could not set architecture and machine"));
6914 as_bad (_("Unrecognized .LEVEL argument\n"));
6915 ignore_rest_of_line ();
6917 demand_empty_rest_of_line ();
6920 /* Handle a .ORIGIN pseudo-op. */
6923 pa_origin (int unused ATTRIBUTE_UNUSED
)
6926 /* We must have a valid space and subspace. */
6927 pa_check_current_space_and_subspace ();
6931 pa_undefine_label ();
6934 /* Handle a .PARAM pseudo-op. This is much like a .EXPORT, except it
6935 is for static functions. FIXME. Should share more code with .EXPORT. */
6938 pa_param (int unused ATTRIBUTE_UNUSED
)
6943 name
= input_line_pointer
;
6944 c
= get_symbol_end ();
6946 if ((symbol
= symbol_find_or_make (name
)) == NULL
)
6948 as_bad (_("Cannot define static symbol: %s\n"), name
);
6949 p
= input_line_pointer
;
6951 input_line_pointer
++;
6955 S_CLEAR_EXTERNAL (symbol
);
6956 p
= input_line_pointer
;
6958 if (!is_end_of_statement ())
6960 input_line_pointer
++;
6961 pa_type_args (symbol
, 0);
6965 demand_empty_rest_of_line ();
6968 /* Handle a .PROC pseudo-op. It is used to mark the beginning
6969 of a procedure from a syntactical point of view. */
6972 pa_proc (int unused ATTRIBUTE_UNUSED
)
6974 struct call_info
*call_info
;
6977 /* We must have a valid space and subspace. */
6978 pa_check_current_space_and_subspace ();
6981 if (within_procedure
)
6982 as_fatal (_("Nested procedures"));
6984 /* Reset global variables for new procedure. */
6985 callinfo_found
= FALSE
;
6986 within_procedure
= TRUE
;
6988 /* Create another call_info structure. */
6989 call_info
= xmalloc (sizeof (struct call_info
));
6992 as_fatal (_("Cannot allocate unwind descriptor\n"));
6994 memset (call_info
, 0, sizeof (struct call_info
));
6996 call_info
->ci_next
= NULL
;
6998 if (call_info_root
== NULL
)
7000 call_info_root
= call_info
;
7001 last_call_info
= call_info
;
7005 last_call_info
->ci_next
= call_info
;
7006 last_call_info
= call_info
;
7009 /* set up defaults on call_info structure */
7011 call_info
->ci_unwind
.descriptor
.cannot_unwind
= 0;
7012 call_info
->ci_unwind
.descriptor
.region_desc
= 1;
7013 call_info
->ci_unwind
.descriptor
.hpux_interrupt_marker
= 0;
7015 /* If we got a .PROC pseudo-op, we know that the function is defined
7016 locally. Make sure it gets into the symbol table. */
7018 label_symbol_struct
*label_symbol
= pa_get_label ();
7022 if (label_symbol
->lss_label
)
7024 last_call_info
->start_symbol
= label_symbol
->lss_label
;
7025 symbol_get_bfdsym (label_symbol
->lss_label
)->flags
|= BSF_FUNCTION
;
7028 as_bad (_("Missing function name for .PROC (corrupted label chain)"));
7031 last_call_info
->start_symbol
= NULL
;
7034 demand_empty_rest_of_line ();
7037 /* Process the syntactical end of a procedure. Make sure all the
7038 appropriate pseudo-ops were found within the procedure. */
7041 pa_procend (int unused ATTRIBUTE_UNUSED
)
7044 /* We must have a valid space and subspace. */
7045 pa_check_current_space_and_subspace ();
7048 /* If we are within a procedure definition, make sure we've
7049 defined a label for the procedure; handle case where the
7050 label was defined after the .PROC directive.
7052 Note there's not need to diddle with the segment or fragment
7053 for the label symbol in this case. We have already switched
7054 into the new $CODE$ subspace at this point. */
7055 if (within_procedure
&& last_call_info
->start_symbol
== NULL
)
7057 label_symbol_struct
*label_symbol
= pa_get_label ();
7061 if (label_symbol
->lss_label
)
7063 last_call_info
->start_symbol
= label_symbol
->lss_label
;
7064 symbol_get_bfdsym (label_symbol
->lss_label
)->flags
7067 /* Also handle allocation of a fixup to hold the unwind
7068 information when the label appears after the proc/procend. */
7069 if (within_entry_exit
)
7074 where
= frag_more (0);
7075 u
= UNWIND_LOW32 (&last_call_info
->ci_unwind
.descriptor
);
7076 fix_new_hppa (frag_now
, where
- frag_now
->fr_literal
, 0,
7077 NULL
, (offsetT
) 0, NULL
,
7078 0, R_HPPA_ENTRY
, e_fsel
, 0, 0, u
);
7083 as_bad (_("Missing function name for .PROC (corrupted label chain)"));
7086 as_bad (_("Missing function name for .PROC"));
7089 if (!within_procedure
)
7090 as_bad (_("misplaced .procend"));
7092 if (!callinfo_found
)
7093 as_bad (_("Missing .callinfo for this procedure"));
7095 if (within_entry_exit
)
7096 as_bad (_("Missing .EXIT for a .ENTRY"));
7099 /* ELF needs to mark the end of each function so that it can compute
7100 the size of the function (apparently its needed in the symbol table). */
7101 hppa_elf_mark_end_of_function ();
7104 within_procedure
= FALSE
;
7105 demand_empty_rest_of_line ();
7106 pa_undefine_label ();
7110 /* If VALUE is an exact power of two between zero and 2^31, then
7111 return log2 (VALUE). Else return -1. */
7114 exact_log2 (int value
)
7118 while ((1 << shift
) != value
&& shift
< 32)
7127 /* Check to make sure we have a valid space and subspace. */
7130 pa_check_current_space_and_subspace (void)
7132 if (current_space
== NULL
)
7133 as_fatal (_("Not in a space.\n"));
7135 if (current_subspace
== NULL
)
7136 as_fatal (_("Not in a subspace.\n"));
7139 /* Parse the parameters to a .SPACE directive; if CREATE_FLAG is nonzero,
7140 then create a new space entry to hold the information specified
7141 by the parameters to the .SPACE directive. */
7143 static sd_chain_struct
*
7144 pa_parse_space_stmt (char *space_name
, int create_flag
)
7146 char *name
, *ptemp
, c
;
7147 char loadable
, defined
, private, sort
;
7149 asection
*seg
= NULL
;
7150 sd_chain_struct
*space
;
7152 /* Load default values. */
7158 if (strcmp (space_name
, "$TEXT$") == 0)
7160 seg
= pa_def_spaces
[0].segment
;
7161 defined
= pa_def_spaces
[0].defined
;
7162 private = pa_def_spaces
[0].private;
7163 sort
= pa_def_spaces
[0].sort
;
7164 spnum
= pa_def_spaces
[0].spnum
;
7166 else if (strcmp (space_name
, "$PRIVATE$") == 0)
7168 seg
= pa_def_spaces
[1].segment
;
7169 defined
= pa_def_spaces
[1].defined
;
7170 private = pa_def_spaces
[1].private;
7171 sort
= pa_def_spaces
[1].sort
;
7172 spnum
= pa_def_spaces
[1].spnum
;
7175 if (!is_end_of_statement ())
7177 print_errors
= FALSE
;
7178 ptemp
= input_line_pointer
+ 1;
7179 /* First see if the space was specified as a number rather than
7180 as a name. According to the PA assembly manual the rest of
7181 the line should be ignored. */
7183 pa_parse_number (&ptemp
, 0);
7187 input_line_pointer
= ptemp
;
7191 while (!is_end_of_statement ())
7193 input_line_pointer
++;
7194 name
= input_line_pointer
;
7195 c
= get_symbol_end ();
7196 if ((strncasecmp (name
, "spnum", 5) == 0))
7198 *input_line_pointer
= c
;
7199 input_line_pointer
++;
7200 spnum
= get_absolute_expression ();
7202 else if ((strncasecmp (name
, "sort", 4) == 0))
7204 *input_line_pointer
= c
;
7205 input_line_pointer
++;
7206 sort
= get_absolute_expression ();
7208 else if ((strncasecmp (name
, "unloadable", 10) == 0))
7210 *input_line_pointer
= c
;
7213 else if ((strncasecmp (name
, "notdefined", 10) == 0))
7215 *input_line_pointer
= c
;
7218 else if ((strncasecmp (name
, "private", 7) == 0))
7220 *input_line_pointer
= c
;
7225 as_bad (_("Invalid .SPACE argument"));
7226 *input_line_pointer
= c
;
7227 if (!is_end_of_statement ())
7228 input_line_pointer
++;
7232 print_errors
= TRUE
;
7235 if (create_flag
&& seg
== NULL
)
7236 seg
= subseg_new (space_name
, 0);
7238 /* If create_flag is nonzero, then create the new space with
7239 the attributes computed above. Else set the values in
7240 an already existing space -- this can only happen for
7241 the first occurrence of a built-in space. */
7243 space
= create_new_space (space_name
, spnum
, loadable
, defined
,
7244 private, sort
, seg
, 1);
7247 space
= is_defined_space (space_name
);
7248 SPACE_SPNUM (space
) = spnum
;
7249 SPACE_DEFINED (space
) = defined
& 1;
7250 SPACE_USER_DEFINED (space
) = 1;
7253 #ifdef obj_set_section_attributes
7254 obj_set_section_attributes (seg
, defined
, private, sort
, spnum
);
7260 /* Handle a .SPACE pseudo-op; this switches the current space to the
7261 given space, creating the new space if necessary. */
7264 pa_space (int unused ATTRIBUTE_UNUSED
)
7266 char *name
, c
, *space_name
, *save_s
;
7267 sd_chain_struct
*sd_chain
;
7269 if (within_procedure
)
7271 as_bad (_("Can\'t change spaces within a procedure definition. Ignored"));
7272 ignore_rest_of_line ();
7276 /* Check for some of the predefined spaces. FIXME: most of the code
7277 below is repeated several times, can we extract the common parts
7278 and place them into a subroutine or something similar? */
7279 /* FIXME Is this (and the next IF stmt) really right?
7280 What if INPUT_LINE_POINTER points to "$TEXT$FOO"? */
7281 if (strncmp (input_line_pointer
, "$TEXT$", 6) == 0)
7283 input_line_pointer
+= 6;
7284 sd_chain
= is_defined_space ("$TEXT$");
7285 if (sd_chain
== NULL
)
7286 sd_chain
= pa_parse_space_stmt ("$TEXT$", 1);
7287 else if (SPACE_USER_DEFINED (sd_chain
) == 0)
7288 sd_chain
= pa_parse_space_stmt ("$TEXT$", 0);
7290 current_space
= sd_chain
;
7291 subseg_set (text_section
, sd_chain
->sd_last_subseg
);
7293 = pa_subsegment_to_subspace (text_section
,
7294 sd_chain
->sd_last_subseg
);
7295 demand_empty_rest_of_line ();
7298 if (strncmp (input_line_pointer
, "$PRIVATE$", 9) == 0)
7300 input_line_pointer
+= 9;
7301 sd_chain
= is_defined_space ("$PRIVATE$");
7302 if (sd_chain
== NULL
)
7303 sd_chain
= pa_parse_space_stmt ("$PRIVATE$", 1);
7304 else if (SPACE_USER_DEFINED (sd_chain
) == 0)
7305 sd_chain
= pa_parse_space_stmt ("$PRIVATE$", 0);
7307 current_space
= sd_chain
;
7308 subseg_set (data_section
, sd_chain
->sd_last_subseg
);
7310 = pa_subsegment_to_subspace (data_section
,
7311 sd_chain
->sd_last_subseg
);
7312 demand_empty_rest_of_line ();
7315 if (!strncasecmp (input_line_pointer
,
7316 GDB_DEBUG_SPACE_NAME
,
7317 strlen (GDB_DEBUG_SPACE_NAME
)))
7319 input_line_pointer
+= strlen (GDB_DEBUG_SPACE_NAME
);
7320 sd_chain
= is_defined_space (GDB_DEBUG_SPACE_NAME
);
7321 if (sd_chain
== NULL
)
7322 sd_chain
= pa_parse_space_stmt (GDB_DEBUG_SPACE_NAME
, 1);
7323 else if (SPACE_USER_DEFINED (sd_chain
) == 0)
7324 sd_chain
= pa_parse_space_stmt (GDB_DEBUG_SPACE_NAME
, 0);
7326 current_space
= sd_chain
;
7329 asection
*gdb_section
7330 = bfd_make_section_old_way (stdoutput
, GDB_DEBUG_SPACE_NAME
);
7332 subseg_set (gdb_section
, sd_chain
->sd_last_subseg
);
7334 = pa_subsegment_to_subspace (gdb_section
,
7335 sd_chain
->sd_last_subseg
);
7337 demand_empty_rest_of_line ();
7341 /* It could be a space specified by number. */
7343 save_s
= input_line_pointer
;
7345 pa_parse_number (&input_line_pointer
, 0);
7348 if ((sd_chain
= pa_find_space_by_number (pa_number
)))
7350 current_space
= sd_chain
;
7352 subseg_set (sd_chain
->sd_seg
, sd_chain
->sd_last_subseg
);
7354 = pa_subsegment_to_subspace (sd_chain
->sd_seg
,
7355 sd_chain
->sd_last_subseg
);
7356 demand_empty_rest_of_line ();
7361 /* Not a number, attempt to create a new space. */
7363 input_line_pointer
= save_s
;
7364 name
= input_line_pointer
;
7365 c
= get_symbol_end ();
7366 space_name
= xmalloc (strlen (name
) + 1);
7367 strcpy (space_name
, name
);
7368 *input_line_pointer
= c
;
7370 sd_chain
= pa_parse_space_stmt (space_name
, 1);
7371 current_space
= sd_chain
;
7373 subseg_set (sd_chain
->sd_seg
, sd_chain
->sd_last_subseg
);
7374 current_subspace
= pa_subsegment_to_subspace (sd_chain
->sd_seg
,
7375 sd_chain
->sd_last_subseg
);
7376 demand_empty_rest_of_line ();
7380 /* Switch to a new space. (I think). FIXME. */
7383 pa_spnum (int unused ATTRIBUTE_UNUSED
)
7388 sd_chain_struct
*space
;
7390 name
= input_line_pointer
;
7391 c
= get_symbol_end ();
7392 space
= is_defined_space (name
);
7396 md_number_to_chars (p
, SPACE_SPNUM (space
), 4);
7399 as_warn (_("Undefined space: '%s' Assuming space number = 0."), name
);
7401 *input_line_pointer
= c
;
7402 demand_empty_rest_of_line ();
7405 /* Handle a .SUBSPACE pseudo-op; this switches the current subspace to the
7406 given subspace, creating the new subspace if necessary.
7408 FIXME. Should mirror pa_space more closely, in particular how
7409 they're broken up into subroutines. */
7412 pa_subspace (int create_new
)
7414 char *name
, *ss_name
, c
;
7415 char loadable
, code_only
, comdat
, common
, dup_common
, zero
, sort
;
7416 int i
, access_ctr
, space_index
, alignment
, quadrant
, applicable
, flags
;
7417 sd_chain_struct
*space
;
7418 ssd_chain_struct
*ssd
;
7421 if (current_space
== NULL
)
7422 as_fatal (_("Must be in a space before changing or declaring subspaces.\n"));
7424 if (within_procedure
)
7426 as_bad (_("Can\'t change subspaces within a procedure definition. Ignored"));
7427 ignore_rest_of_line ();
7431 name
= input_line_pointer
;
7432 c
= get_symbol_end ();
7433 ss_name
= xmalloc (strlen (name
) + 1);
7434 strcpy (ss_name
, name
);
7435 *input_line_pointer
= c
;
7437 /* Load default values. */
7450 space
= current_space
;
7454 ssd
= is_defined_subspace (ss_name
);
7455 /* Allow user to override the builtin attributes of subspaces. But
7456 only allow the attributes to be changed once! */
7457 if (ssd
&& SUBSPACE_DEFINED (ssd
))
7459 subseg_set (ssd
->ssd_seg
, ssd
->ssd_subseg
);
7460 current_subspace
= ssd
;
7461 if (!is_end_of_statement ())
7462 as_warn (_("Parameters of an existing subspace can\'t be modified"));
7463 demand_empty_rest_of_line ();
7468 /* A new subspace. Load default values if it matches one of
7469 the builtin subspaces. */
7471 while (pa_def_subspaces
[i
].name
)
7473 if (strcasecmp (pa_def_subspaces
[i
].name
, ss_name
) == 0)
7475 loadable
= pa_def_subspaces
[i
].loadable
;
7476 comdat
= pa_def_subspaces
[i
].comdat
;
7477 common
= pa_def_subspaces
[i
].common
;
7478 dup_common
= pa_def_subspaces
[i
].dup_common
;
7479 code_only
= pa_def_subspaces
[i
].code_only
;
7480 zero
= pa_def_subspaces
[i
].zero
;
7481 space_index
= pa_def_subspaces
[i
].space_index
;
7482 alignment
= pa_def_subspaces
[i
].alignment
;
7483 quadrant
= pa_def_subspaces
[i
].quadrant
;
7484 access_ctr
= pa_def_subspaces
[i
].access
;
7485 sort
= pa_def_subspaces
[i
].sort
;
7492 /* We should be working with a new subspace now. Fill in
7493 any information as specified by the user. */
7494 if (!is_end_of_statement ())
7496 input_line_pointer
++;
7497 while (!is_end_of_statement ())
7499 name
= input_line_pointer
;
7500 c
= get_symbol_end ();
7501 if ((strncasecmp (name
, "quad", 4) == 0))
7503 *input_line_pointer
= c
;
7504 input_line_pointer
++;
7505 quadrant
= get_absolute_expression ();
7507 else if ((strncasecmp (name
, "align", 5) == 0))
7509 *input_line_pointer
= c
;
7510 input_line_pointer
++;
7511 alignment
= get_absolute_expression ();
7512 if (exact_log2 (alignment
) == -1)
7514 as_bad (_("Alignment must be a power of 2"));
7518 else if ((strncasecmp (name
, "access", 6) == 0))
7520 *input_line_pointer
= c
;
7521 input_line_pointer
++;
7522 access_ctr
= get_absolute_expression ();
7524 else if ((strncasecmp (name
, "sort", 4) == 0))
7526 *input_line_pointer
= c
;
7527 input_line_pointer
++;
7528 sort
= get_absolute_expression ();
7530 else if ((strncasecmp (name
, "code_only", 9) == 0))
7532 *input_line_pointer
= c
;
7535 else if ((strncasecmp (name
, "unloadable", 10) == 0))
7537 *input_line_pointer
= c
;
7540 else if ((strncasecmp (name
, "comdat", 6) == 0))
7542 *input_line_pointer
= c
;
7545 else if ((strncasecmp (name
, "common", 6) == 0))
7547 *input_line_pointer
= c
;
7550 else if ((strncasecmp (name
, "dup_comm", 8) == 0))
7552 *input_line_pointer
= c
;
7555 else if ((strncasecmp (name
, "zero", 4) == 0))
7557 *input_line_pointer
= c
;
7560 else if ((strncasecmp (name
, "first", 5) == 0))
7561 as_bad (_("FIRST not supported as a .SUBSPACE argument"));
7563 as_bad (_("Invalid .SUBSPACE argument"));
7564 if (!is_end_of_statement ())
7565 input_line_pointer
++;
7569 /* Compute a reasonable set of BFD flags based on the information
7570 in the .subspace directive. */
7571 applicable
= bfd_applicable_section_flags (stdoutput
);
7574 flags
|= (SEC_ALLOC
| SEC_LOAD
);
7578 /* These flags are used to implement various flavors of initialized
7579 common. The SOM linker discards duplicate subspaces when they
7580 have the same "key" symbol name. This support is more like
7581 GNU linkonce than BFD common. Further, pc-relative relocations
7582 are converted to section relative relocations in BFD common
7583 sections. This complicates the handling of relocations in
7584 common sections containing text and isn't currently supported
7585 correctly in the SOM BFD backend. */
7586 if (comdat
|| common
|| dup_common
)
7587 flags
|= SEC_LINK_ONCE
;
7589 flags
|= SEC_RELOC
| SEC_HAS_CONTENTS
;
7591 /* This is a zero-filled subspace (eg BSS). */
7593 flags
&= ~(SEC_LOAD
| SEC_HAS_CONTENTS
);
7595 applicable
&= flags
;
7597 /* If this is an existing subspace, then we want to use the
7598 segment already associated with the subspace.
7600 FIXME NOW! ELF BFD doesn't appear to be ready to deal with
7601 lots of sections. It might be a problem in the PA ELF
7602 code, I do not know yet. For now avoid creating anything
7603 but the "standard" sections for ELF. */
7605 section
= subseg_force_new (ss_name
, 0);
7607 section
= ssd
->ssd_seg
;
7609 section
= subseg_new (ss_name
, 0);
7612 seg_info (section
)->bss
= 1;
7614 /* Now set the flags. */
7615 bfd_set_section_flags (stdoutput
, section
, applicable
);
7617 /* Record any alignment request for this section. */
7618 record_alignment (section
, exact_log2 (alignment
));
7620 /* Set the starting offset for this section. */
7621 bfd_set_section_vma (stdoutput
, section
,
7622 pa_subspace_start (space
, quadrant
));
7624 /* Now that all the flags are set, update an existing subspace,
7625 or create a new one. */
7628 current_subspace
= update_subspace (space
, ss_name
, loadable
,
7629 code_only
, comdat
, common
,
7630 dup_common
, sort
, zero
, access_ctr
,
7631 space_index
, alignment
, quadrant
,
7634 current_subspace
= create_new_subspace (space
, ss_name
, loadable
,
7635 code_only
, comdat
, common
,
7636 dup_common
, zero
, sort
,
7637 access_ctr
, space_index
,
7638 alignment
, quadrant
, section
);
7640 demand_empty_rest_of_line ();
7641 current_subspace
->ssd_seg
= section
;
7642 subseg_set (current_subspace
->ssd_seg
, current_subspace
->ssd_subseg
);
7644 SUBSPACE_DEFINED (current_subspace
) = 1;
7647 /* Create default space and subspace dictionaries. */
7650 pa_spaces_begin (void)
7654 space_dict_root
= NULL
;
7655 space_dict_last
= NULL
;
7658 while (pa_def_spaces
[i
].name
)
7662 /* Pick the right name to use for the new section. */
7663 name
= pa_def_spaces
[i
].name
;
7665 pa_def_spaces
[i
].segment
= subseg_new (name
, 0);
7666 create_new_space (pa_def_spaces
[i
].name
, pa_def_spaces
[i
].spnum
,
7667 pa_def_spaces
[i
].loadable
, pa_def_spaces
[i
].defined
,
7668 pa_def_spaces
[i
].private, pa_def_spaces
[i
].sort
,
7669 pa_def_spaces
[i
].segment
, 0);
7674 while (pa_def_subspaces
[i
].name
)
7677 int applicable
, subsegment
;
7678 asection
*segment
= NULL
;
7679 sd_chain_struct
*space
;
7681 /* Pick the right name for the new section and pick the right
7682 subsegment number. */
7683 name
= pa_def_subspaces
[i
].name
;
7686 /* Create the new section. */
7687 segment
= subseg_new (name
, subsegment
);
7689 /* For SOM we want to replace the standard .text, .data, and .bss
7690 sections with our own. We also want to set BFD flags for
7691 all the built-in subspaces. */
7692 if (!strcmp (pa_def_subspaces
[i
].name
, "$CODE$"))
7694 text_section
= segment
;
7695 applicable
= bfd_applicable_section_flags (stdoutput
);
7696 bfd_set_section_flags (stdoutput
, segment
,
7697 applicable
& (SEC_ALLOC
| SEC_LOAD
7698 | SEC_RELOC
| SEC_CODE
7700 | SEC_HAS_CONTENTS
));
7702 else if (!strcmp (pa_def_subspaces
[i
].name
, "$DATA$"))
7704 data_section
= segment
;
7705 applicable
= bfd_applicable_section_flags (stdoutput
);
7706 bfd_set_section_flags (stdoutput
, segment
,
7707 applicable
& (SEC_ALLOC
| SEC_LOAD
7709 | SEC_HAS_CONTENTS
));
7712 else if (!strcmp (pa_def_subspaces
[i
].name
, "$BSS$"))
7714 bss_section
= segment
;
7715 applicable
= bfd_applicable_section_flags (stdoutput
);
7716 bfd_set_section_flags (stdoutput
, segment
,
7717 applicable
& SEC_ALLOC
);
7719 else if (!strcmp (pa_def_subspaces
[i
].name
, "$LIT$"))
7721 applicable
= bfd_applicable_section_flags (stdoutput
);
7722 bfd_set_section_flags (stdoutput
, segment
,
7723 applicable
& (SEC_ALLOC
| SEC_LOAD
7726 | SEC_HAS_CONTENTS
));
7728 else if (!strcmp (pa_def_subspaces
[i
].name
, "$MILLICODE$"))
7730 applicable
= bfd_applicable_section_flags (stdoutput
);
7731 bfd_set_section_flags (stdoutput
, segment
,
7732 applicable
& (SEC_ALLOC
| SEC_LOAD
7735 | SEC_HAS_CONTENTS
));
7737 else if (!strcmp (pa_def_subspaces
[i
].name
, "$UNWIND$"))
7739 applicable
= bfd_applicable_section_flags (stdoutput
);
7740 bfd_set_section_flags (stdoutput
, segment
,
7741 applicable
& (SEC_ALLOC
| SEC_LOAD
7744 | SEC_HAS_CONTENTS
));
7747 /* Find the space associated with this subspace. */
7748 space
= pa_segment_to_space (pa_def_spaces
[pa_def_subspaces
[i
].
7749 def_space_index
].segment
);
7752 as_fatal (_("Internal error: Unable to find containing space for %s."),
7753 pa_def_subspaces
[i
].name
);
7756 create_new_subspace (space
, name
,
7757 pa_def_subspaces
[i
].loadable
,
7758 pa_def_subspaces
[i
].code_only
,
7759 pa_def_subspaces
[i
].comdat
,
7760 pa_def_subspaces
[i
].common
,
7761 pa_def_subspaces
[i
].dup_common
,
7762 pa_def_subspaces
[i
].zero
,
7763 pa_def_subspaces
[i
].sort
,
7764 pa_def_subspaces
[i
].access
,
7765 pa_def_subspaces
[i
].space_index
,
7766 pa_def_subspaces
[i
].alignment
,
7767 pa_def_subspaces
[i
].quadrant
,
7773 /* Create a new space NAME, with the appropriate flags as defined
7774 by the given parameters. */
7776 static sd_chain_struct
*
7777 create_new_space (char *name
,
7779 int loadable ATTRIBUTE_UNUSED
,
7786 sd_chain_struct
*chain_entry
;
7788 chain_entry
= xmalloc (sizeof (sd_chain_struct
));
7790 as_fatal (_("Out of memory: could not allocate new space chain entry: %s\n"),
7793 SPACE_NAME (chain_entry
) = xmalloc (strlen (name
) + 1);
7794 strcpy (SPACE_NAME (chain_entry
), name
);
7795 SPACE_DEFINED (chain_entry
) = defined
;
7796 SPACE_USER_DEFINED (chain_entry
) = user_defined
;
7797 SPACE_SPNUM (chain_entry
) = spnum
;
7799 chain_entry
->sd_seg
= seg
;
7800 chain_entry
->sd_last_subseg
= -1;
7801 chain_entry
->sd_subspaces
= NULL
;
7802 chain_entry
->sd_next
= NULL
;
7804 /* Find spot for the new space based on its sort key. */
7805 if (!space_dict_last
)
7806 space_dict_last
= chain_entry
;
7808 if (space_dict_root
== NULL
)
7809 space_dict_root
= chain_entry
;
7812 sd_chain_struct
*chain_pointer
;
7813 sd_chain_struct
*prev_chain_pointer
;
7815 chain_pointer
= space_dict_root
;
7816 prev_chain_pointer
= NULL
;
7818 while (chain_pointer
)
7820 prev_chain_pointer
= chain_pointer
;
7821 chain_pointer
= chain_pointer
->sd_next
;
7824 /* At this point we've found the correct place to add the new
7825 entry. So add it and update the linked lists as appropriate. */
7826 if (prev_chain_pointer
)
7828 chain_entry
->sd_next
= chain_pointer
;
7829 prev_chain_pointer
->sd_next
= chain_entry
;
7833 space_dict_root
= chain_entry
;
7834 chain_entry
->sd_next
= chain_pointer
;
7837 if (chain_entry
->sd_next
== NULL
)
7838 space_dict_last
= chain_entry
;
7841 /* This is here to catch predefined spaces which do not get
7842 modified by the user's input. Another call is found at
7843 the bottom of pa_parse_space_stmt to handle cases where
7844 the user modifies a predefined space. */
7845 #ifdef obj_set_section_attributes
7846 obj_set_section_attributes (seg
, defined
, private, sort
, spnum
);
7852 /* Create a new subspace NAME, with the appropriate flags as defined
7853 by the given parameters.
7855 Add the new subspace to the subspace dictionary chain in numerical
7856 order as defined by the SORT entries. */
7858 static ssd_chain_struct
*
7859 create_new_subspace (sd_chain_struct
*space
,
7861 int loadable ATTRIBUTE_UNUSED
,
7862 int code_only ATTRIBUTE_UNUSED
,
7866 int is_zero ATTRIBUTE_UNUSED
,
7869 int space_index ATTRIBUTE_UNUSED
,
7870 int alignment ATTRIBUTE_UNUSED
,
7874 ssd_chain_struct
*chain_entry
;
7876 chain_entry
= xmalloc (sizeof (ssd_chain_struct
));
7878 as_fatal (_("Out of memory: could not allocate new subspace chain entry: %s\n"), name
);
7880 SUBSPACE_NAME (chain_entry
) = xmalloc (strlen (name
) + 1);
7881 strcpy (SUBSPACE_NAME (chain_entry
), name
);
7883 /* Initialize subspace_defined. When we hit a .subspace directive
7884 we'll set it to 1 which "locks-in" the subspace attributes. */
7885 SUBSPACE_DEFINED (chain_entry
) = 0;
7887 chain_entry
->ssd_subseg
= 0;
7888 chain_entry
->ssd_seg
= seg
;
7889 chain_entry
->ssd_next
= NULL
;
7891 /* Find spot for the new subspace based on its sort key. */
7892 if (space
->sd_subspaces
== NULL
)
7893 space
->sd_subspaces
= chain_entry
;
7896 ssd_chain_struct
*chain_pointer
;
7897 ssd_chain_struct
*prev_chain_pointer
;
7899 chain_pointer
= space
->sd_subspaces
;
7900 prev_chain_pointer
= NULL
;
7902 while (chain_pointer
)
7904 prev_chain_pointer
= chain_pointer
;
7905 chain_pointer
= chain_pointer
->ssd_next
;
7908 /* Now we have somewhere to put the new entry. Insert it and update
7910 if (prev_chain_pointer
)
7912 chain_entry
->ssd_next
= chain_pointer
;
7913 prev_chain_pointer
->ssd_next
= chain_entry
;
7917 space
->sd_subspaces
= chain_entry
;
7918 chain_entry
->ssd_next
= chain_pointer
;
7922 #ifdef obj_set_subsection_attributes
7923 obj_set_subsection_attributes (seg
, space
->sd_seg
, access_ctr
, sort
,
7924 quadrant
, comdat
, common
, dup_common
);
7930 /* Update the information for the given subspace based upon the
7931 various arguments. Return the modified subspace chain entry. */
7933 static ssd_chain_struct
*
7934 update_subspace (sd_chain_struct
*space
,
7936 int loadable ATTRIBUTE_UNUSED
,
7937 int code_only ATTRIBUTE_UNUSED
,
7942 int zero ATTRIBUTE_UNUSED
,
7944 int space_index ATTRIBUTE_UNUSED
,
7945 int alignment ATTRIBUTE_UNUSED
,
7949 ssd_chain_struct
*chain_entry
;
7951 chain_entry
= is_defined_subspace (name
);
7953 #ifdef obj_set_subsection_attributes
7954 obj_set_subsection_attributes (section
, space
->sd_seg
, access_ctr
, sort
,
7955 quadrant
, comdat
, common
, dup_common
);
7961 /* Return the space chain entry for the space with the name NAME or
7962 NULL if no such space exists. */
7964 static sd_chain_struct
*
7965 is_defined_space (char *name
)
7967 sd_chain_struct
*chain_pointer
;
7969 for (chain_pointer
= space_dict_root
;
7971 chain_pointer
= chain_pointer
->sd_next
)
7972 if (strcmp (SPACE_NAME (chain_pointer
), name
) == 0)
7973 return chain_pointer
;
7975 /* No mapping from segment to space was found. Return NULL. */
7979 /* Find and return the space associated with the given seg. If no mapping
7980 from the given seg to a space is found, then return NULL.
7982 Unlike subspaces, the number of spaces is not expected to grow much,
7983 so a linear exhaustive search is OK here. */
7985 static sd_chain_struct
*
7986 pa_segment_to_space (asection
*seg
)
7988 sd_chain_struct
*space_chain
;
7990 /* Walk through each space looking for the correct mapping. */
7991 for (space_chain
= space_dict_root
;
7993 space_chain
= space_chain
->sd_next
)
7994 if (space_chain
->sd_seg
== seg
)
7997 /* Mapping was not found. Return NULL. */
8001 /* Return the first space chain entry for the subspace with the name
8002 NAME or NULL if no such subspace exists.
8004 When there are multiple subspaces with the same name, switching to
8005 the first (i.e., default) subspace is preferable in most situations.
8006 For example, it wouldn't be desirable to merge COMDAT data with non
8009 Uses a linear search through all the spaces and subspaces, this may
8010 not be appropriate if we ever being placing each function in its
8013 static ssd_chain_struct
*
8014 is_defined_subspace (char *name
)
8016 sd_chain_struct
*space_chain
;
8017 ssd_chain_struct
*subspace_chain
;
8019 /* Walk through each space. */
8020 for (space_chain
= space_dict_root
;
8022 space_chain
= space_chain
->sd_next
)
8024 /* Walk through each subspace looking for a name which matches. */
8025 for (subspace_chain
= space_chain
->sd_subspaces
;
8027 subspace_chain
= subspace_chain
->ssd_next
)
8028 if (strcmp (SUBSPACE_NAME (subspace_chain
), name
) == 0)
8029 return subspace_chain
;
8032 /* Subspace wasn't found. Return NULL. */
8036 /* Find and return the subspace associated with the given seg. If no
8037 mapping from the given seg to a subspace is found, then return NULL.
8039 If we ever put each procedure/function within its own subspace
8040 (to make life easier on the compiler and linker), then this will have
8041 to become more efficient. */
8043 static ssd_chain_struct
*
8044 pa_subsegment_to_subspace (asection
*seg
, subsegT subseg
)
8046 sd_chain_struct
*space_chain
;
8047 ssd_chain_struct
*subspace_chain
;
8049 /* Walk through each space. */
8050 for (space_chain
= space_dict_root
;
8052 space_chain
= space_chain
->sd_next
)
8054 if (space_chain
->sd_seg
== seg
)
8056 /* Walk through each subspace within each space looking for
8057 the correct mapping. */
8058 for (subspace_chain
= space_chain
->sd_subspaces
;
8060 subspace_chain
= subspace_chain
->ssd_next
)
8061 if (subspace_chain
->ssd_subseg
== (int) subseg
)
8062 return subspace_chain
;
8066 /* No mapping from subsegment to subspace found. Return NULL. */
8070 /* Given a number, try and find a space with the name number.
8072 Return a pointer to a space dictionary chain entry for the space
8073 that was found or NULL on failure. */
8075 static sd_chain_struct
*
8076 pa_find_space_by_number (int number
)
8078 sd_chain_struct
*space_chain
;
8080 for (space_chain
= space_dict_root
;
8082 space_chain
= space_chain
->sd_next
)
8084 if (SPACE_SPNUM (space_chain
) == (unsigned int) number
)
8088 /* No appropriate space found. Return NULL. */
8092 /* Return the starting address for the given subspace. If the starting
8093 address is unknown then return zero. */
8096 pa_subspace_start (sd_chain_struct
*space
, int quadrant
)
8098 /* FIXME. Assumes everyone puts read/write data at 0x4000000, this
8099 is not correct for the PA OSF1 port. */
8100 if ((strcmp (SPACE_NAME (space
), "$PRIVATE$") == 0) && quadrant
== 1)
8102 else if (space
->sd_seg
== data_section
&& quadrant
== 1)
8110 /* Helper function for pa_stringer. Used to find the end of
8114 pa_stringer_aux (char *s
)
8116 unsigned int c
= *s
& CHAR_MASK
;
8129 /* Handle a .STRING type pseudo-op. */
8132 pa_stringer (int append_zero
)
8134 char *s
, num_buf
[4];
8138 /* Preprocess the string to handle PA-specific escape sequences.
8139 For example, \xDD where DD is a hexadecimal number should be
8140 changed to \OOO where OOO is an octal number. */
8143 /* We must have a valid space and subspace. */
8144 pa_check_current_space_and_subspace ();
8147 /* Skip the opening quote. */
8148 s
= input_line_pointer
+ 1;
8150 while (is_a_char (c
= pa_stringer_aux (s
++)))
8157 /* Handle \x<num>. */
8160 unsigned int number
;
8165 /* Get past the 'x'. */
8167 for (num_digit
= 0, number
= 0, dg
= *s
;
8169 && (ISDIGIT (dg
) || (dg
>= 'a' && dg
<= 'f')
8170 || (dg
>= 'A' && dg
<= 'F'));
8174 number
= number
* 16 + dg
- '0';
8175 else if (dg
>= 'a' && dg
<= 'f')
8176 number
= number
* 16 + dg
- 'a' + 10;
8178 number
= number
* 16 + dg
- 'A' + 10;
8188 sprintf (num_buf
, "%02o", number
);
8191 sprintf (num_buf
, "%03o", number
);
8194 for (i
= 0; i
<= num_digit
; i
++)
8195 s_start
[i
] = num_buf
[i
];
8199 /* This might be a "\"", skip over the escaped char. */
8206 stringer (8 + append_zero
);
8207 pa_undefine_label ();
8210 /* Handle a .VERSION pseudo-op. */
8213 pa_version (int unused ATTRIBUTE_UNUSED
)
8216 pa_undefine_label ();
8221 /* Handle a .COMPILER pseudo-op. */
8224 pa_compiler (int unused ATTRIBUTE_UNUSED
)
8226 obj_som_compiler (0);
8227 pa_undefine_label ();
8232 /* Handle a .COPYRIGHT pseudo-op. */
8235 pa_copyright (int unused ATTRIBUTE_UNUSED
)
8238 pa_undefine_label ();
8241 /* Just like a normal cons, but when finished we have to undefine
8242 the latest space label. */
8245 pa_cons (int nbytes
)
8248 pa_undefine_label ();
8251 /* Like float_cons, but we need to undefine our label. */
8254 pa_float_cons (int float_type
)
8256 float_cons (float_type
);
8257 pa_undefine_label ();
8260 /* Like s_fill, but delete our label when finished. */
8263 pa_fill (int unused ATTRIBUTE_UNUSED
)
8266 /* We must have a valid space and subspace. */
8267 pa_check_current_space_and_subspace ();
8271 pa_undefine_label ();
8274 /* Like lcomm, but delete our label when finished. */
8277 pa_lcomm (int needs_align
)
8280 /* We must have a valid space and subspace. */
8281 pa_check_current_space_and_subspace ();
8284 s_lcomm (needs_align
);
8285 pa_undefine_label ();
8288 /* Like lsym, but delete our label when finished. */
8291 pa_lsym (int unused ATTRIBUTE_UNUSED
)
8294 /* We must have a valid space and subspace. */
8295 pa_check_current_space_and_subspace ();
8299 pa_undefine_label ();
8302 /* This function is called once, at assembler startup time. It should
8303 set up all the tables, etc. that the MD part of the assembler will need. */
8308 const char *retval
= NULL
;
8312 last_call_info
= NULL
;
8313 call_info_root
= NULL
;
8315 /* Set the default machine type. */
8316 if (!bfd_set_arch_mach (stdoutput
, bfd_arch_hppa
, DEFAULT_LEVEL
))
8317 as_warn (_("could not set architecture and machine"));
8319 /* Folding of text and data segments fails miserably on the PA.
8320 Warn user and disable "-R" option. */
8321 if (flag_readonly_data_in_text
)
8323 as_warn (_("-R option not supported on this target."));
8324 flag_readonly_data_in_text
= 0;
8331 op_hash
= hash_new ();
8333 while (i
< NUMOPCODES
)
8335 const char *name
= pa_opcodes
[i
].name
;
8337 retval
= hash_insert (op_hash
, name
, (struct pa_opcode
*) &pa_opcodes
[i
]);
8338 if (retval
!= NULL
&& *retval
!= '\0')
8340 as_fatal (_("Internal error: can't hash `%s': %s\n"), name
, retval
);
8346 if ((pa_opcodes
[i
].match
& pa_opcodes
[i
].mask
)
8347 != pa_opcodes
[i
].match
)
8349 fprintf (stderr
, _("internal error: losing opcode: `%s' \"%s\"\n"),
8350 pa_opcodes
[i
].name
, pa_opcodes
[i
].args
);
8355 while (i
< NUMOPCODES
&& !strcmp (pa_opcodes
[i
].name
, name
));
8359 as_fatal (_("Broken assembler. No assembly attempted."));
8362 /* SOM will change text_section. To make sure we never put
8363 anything into the old one switch to the new one now. */
8364 subseg_set (text_section
, 0);
8368 dummy_symbol
= symbol_find_or_make ("L$dummy");
8369 S_SET_SEGMENT (dummy_symbol
, text_section
);
8370 /* Force the symbol to be converted to a real symbol. */
8371 symbol_get_bfdsym (dummy_symbol
)->flags
|= BSF_KEEP
;
8375 /* On the PA relocations which involve function symbols must not be
8376 adjusted. This so that the linker can know when/how to create argument
8377 relocation stubs for indirect calls and calls to static functions.
8379 "T" field selectors create DLT relative fixups for accessing
8380 globals and statics in PIC code; each DLT relative fixup creates
8381 an entry in the DLT table. The entries contain the address of
8382 the final target (eg accessing "foo" would create a DLT entry
8383 with the address of "foo").
8385 Unfortunately, the HP linker doesn't take into account any addend
8386 when generating the DLT; so accessing $LIT$+8 puts the address of
8387 $LIT$ into the DLT rather than the address of $LIT$+8.
8389 The end result is we can't perform relocation symbol reductions for
8390 any fixup which creates entries in the DLT (eg they use "T" field
8393 ??? Reject reductions involving symbols with external scope; such
8394 reductions make life a living hell for object file editors. */
8397 hppa_fix_adjustable (fixS
*fixp
)
8402 struct hppa_fix_struct
*hppa_fix
;
8404 hppa_fix
= (struct hppa_fix_struct
*) fixp
->tc_fix_data
;
8407 /* LR/RR selectors are implicitly used for a number of different relocation
8408 types. We must ensure that none of these types are adjusted (see below)
8409 even if they occur with a different selector. */
8410 code
= elf_hppa_reloc_final_type (stdoutput
, fixp
->fx_r_type
,
8411 hppa_fix
->fx_r_format
,
8412 hppa_fix
->fx_r_field
);
8416 /* Relocation types which use e_lrsel. */
8417 case R_PARISC_DIR21L
:
8418 case R_PARISC_DLTREL21L
:
8419 case R_PARISC_DPREL21L
:
8420 case R_PARISC_PLTOFF21L
:
8422 /* Relocation types which use e_rrsel. */
8423 case R_PARISC_DIR14R
:
8424 case R_PARISC_DIR14DR
:
8425 case R_PARISC_DIR14WR
:
8426 case R_PARISC_DIR17R
:
8427 case R_PARISC_DLTREL14R
:
8428 case R_PARISC_DLTREL14DR
:
8429 case R_PARISC_DLTREL14WR
:
8430 case R_PARISC_DPREL14R
:
8431 case R_PARISC_DPREL14DR
:
8432 case R_PARISC_DPREL14WR
:
8433 case R_PARISC_PLTOFF14R
:
8434 case R_PARISC_PLTOFF14DR
:
8435 case R_PARISC_PLTOFF14WR
:
8437 /* Other types that we reject for reduction. */
8438 case R_PARISC_GNU_VTENTRY
:
8439 case R_PARISC_GNU_VTINHERIT
:
8446 /* Reject reductions of symbols in sym1-sym2 expressions when
8447 the fixup will occur in a CODE subspace.
8449 XXX FIXME: Long term we probably want to reject all of these;
8450 for example reducing in the debug section would lose if we ever
8451 supported using the optimizing hp linker. */
8454 && (hppa_fix
->segment
->flags
& SEC_CODE
))
8457 /* We can't adjust any relocs that use LR% and RR% field selectors.
8459 If a symbol is reduced to a section symbol, the assembler will
8460 adjust the addend unless the symbol happens to reside right at
8461 the start of the section. Additionally, the linker has no choice
8462 but to manipulate the addends when coalescing input sections for
8463 "ld -r". Since an LR% field selector is defined to round the
8464 addend, we can't change the addend without risking that a LR% and
8465 it's corresponding (possible multiple) RR% field will no longer
8466 sum to the right value.
8469 . ldil LR%foo+0,%r21
8470 . ldw RR%foo+0(%r21),%r26
8471 . ldw RR%foo+4(%r21),%r25
8473 If foo is at address 4092 (decimal) in section `sect', then after
8474 reducing to the section symbol we get
8475 . LR%sect+4092 == (L%sect)+0
8476 . RR%sect+4092 == (R%sect)+4092
8477 . RR%sect+4096 == (R%sect)-4096
8478 and the last address loses because rounding the addend to 8k
8479 multiples takes us up to 8192 with an offset of -4096.
8481 In cases where the LR% expression is identical to the RR% one we
8482 will never have a problem, but is so happens that gcc rounds
8483 addends involved in LR% field selectors to work around a HP
8484 linker bug. ie. We often have addresses like the last case
8485 above where the LR% expression is offset from the RR% one. */
8487 if (hppa_fix
->fx_r_field
== e_lrsel
8488 || hppa_fix
->fx_r_field
== e_rrsel
8489 || hppa_fix
->fx_r_field
== e_nlrsel
)
8492 /* Reject reductions of symbols in DLT relative relocs,
8493 relocations with plabels. */
8494 if (hppa_fix
->fx_r_field
== e_tsel
8495 || hppa_fix
->fx_r_field
== e_ltsel
8496 || hppa_fix
->fx_r_field
== e_rtsel
8497 || hppa_fix
->fx_r_field
== e_psel
8498 || hppa_fix
->fx_r_field
== e_rpsel
8499 || hppa_fix
->fx_r_field
== e_lpsel
)
8502 /* Reject absolute calls (jumps). */
8503 if (hppa_fix
->fx_r_type
== R_HPPA_ABS_CALL
)
8506 /* Reject reductions of function symbols. */
8507 if (fixp
->fx_addsy
!= 0 && S_IS_FUNCTION (fixp
->fx_addsy
))
8513 /* Return nonzero if the fixup in FIXP will require a relocation,
8514 even it if appears that the fixup could be completely handled
8518 hppa_force_relocation (struct fix
*fixp
)
8520 struct hppa_fix_struct
*hppa_fixp
;
8522 hppa_fixp
= (struct hppa_fix_struct
*) fixp
->tc_fix_data
;
8524 if (fixp
->fx_r_type
== (int) R_HPPA_ENTRY
8525 || fixp
->fx_r_type
== (int) R_HPPA_EXIT
8526 || fixp
->fx_r_type
== (int) R_HPPA_BEGIN_BRTAB
8527 || fixp
->fx_r_type
== (int) R_HPPA_END_BRTAB
8528 || fixp
->fx_r_type
== (int) R_HPPA_BEGIN_TRY
8529 || fixp
->fx_r_type
== (int) R_HPPA_END_TRY
8530 || (fixp
->fx_addsy
!= NULL
&& fixp
->fx_subsy
!= NULL
8531 && (hppa_fixp
->segment
->flags
& SEC_CODE
) != 0))
8535 if (fixp
->fx_r_type
== (int) R_PARISC_GNU_VTINHERIT
8536 || fixp
->fx_r_type
== (int) R_PARISC_GNU_VTENTRY
)
8540 gas_assert (fixp
->fx_addsy
!= NULL
);
8542 /* Ensure we emit a relocation for global symbols so that dynamic
8544 if (S_FORCE_RELOC (fixp
->fx_addsy
, 1))
8547 /* It is necessary to force PC-relative calls/jumps to have a relocation
8548 entry if they're going to need either an argument relocation or long
8551 && arg_reloc_stub_needed (symbol_arg_reloc_info (fixp
->fx_addsy
),
8552 hppa_fixp
->fx_arg_reloc
))
8555 /* Now check to see if we're going to need a long-branch stub. */
8556 if (fixp
->fx_r_type
== (int) R_HPPA_PCREL_CALL
)
8558 long pc
= md_pcrel_from (fixp
);
8559 valueT distance
, min_stub_distance
;
8561 distance
= fixp
->fx_offset
+ S_GET_VALUE (fixp
->fx_addsy
) - pc
- 8;
8563 /* Distance to the closest possible stub. This will detect most
8564 but not all circumstances where a stub will not work. */
8565 min_stub_distance
= pc
+ 16;
8567 if (last_call_info
!= NULL
)
8568 min_stub_distance
-= S_GET_VALUE (last_call_info
->start_symbol
);
8571 if ((distance
+ 8388608 >= 16777216
8572 && min_stub_distance
<= 8388608)
8573 || (hppa_fixp
->fx_r_format
== 17
8574 && distance
+ 262144 >= 524288
8575 && min_stub_distance
<= 262144)
8576 || (hppa_fixp
->fx_r_format
== 12
8577 && distance
+ 8192 >= 16384
8578 && min_stub_distance
<= 8192)
8583 if (fixp
->fx_r_type
== (int) R_HPPA_ABS_CALL
)
8586 /* No need (yet) to force another relocations to be emitted. */
8590 /* Now for some ELF specific code. FIXME. */
8592 /* For ELF, this function serves one purpose: to setup the st_size
8593 field of STT_FUNC symbols. To do this, we need to scan the
8594 call_info structure list, determining st_size in by taking the
8595 difference in the address of the beginning/end marker symbols. */
8598 elf_hppa_final_processing (void)
8600 struct call_info
*call_info_pointer
;
8602 for (call_info_pointer
= call_info_root
;
8604 call_info_pointer
= call_info_pointer
->ci_next
)
8606 elf_symbol_type
*esym
8607 = ((elf_symbol_type
*)
8608 symbol_get_bfdsym (call_info_pointer
->start_symbol
));
8609 esym
->internal_elf_sym
.st_size
=
8610 S_GET_VALUE (call_info_pointer
->end_symbol
)
8611 - S_GET_VALUE (call_info_pointer
->start_symbol
) + 4;
8616 pa_vtable_entry (int ignore ATTRIBUTE_UNUSED
)
8618 struct fix
*new_fix
;
8620 new_fix
= obj_elf_vtable_entry (0);
8624 struct hppa_fix_struct
* hppa_fix
= obstack_alloc (¬es
, sizeof (struct hppa_fix_struct
));
8626 hppa_fix
->fx_r_type
= R_HPPA
;
8627 hppa_fix
->fx_r_field
= e_fsel
;
8628 hppa_fix
->fx_r_format
= 32;
8629 hppa_fix
->fx_arg_reloc
= 0;
8630 hppa_fix
->segment
= now_seg
;
8631 new_fix
->tc_fix_data
= (void *) hppa_fix
;
8632 new_fix
->fx_r_type
= (int) R_PARISC_GNU_VTENTRY
;
8637 pa_vtable_inherit (int ignore ATTRIBUTE_UNUSED
)
8639 struct fix
*new_fix
;
8641 new_fix
= obj_elf_vtable_inherit (0);
8645 struct hppa_fix_struct
* hppa_fix
= obstack_alloc (¬es
, sizeof (struct hppa_fix_struct
));
8647 hppa_fix
->fx_r_type
= R_HPPA
;
8648 hppa_fix
->fx_r_field
= e_fsel
;
8649 hppa_fix
->fx_r_format
= 32;
8650 hppa_fix
->fx_arg_reloc
= 0;
8651 hppa_fix
->segment
= now_seg
;
8652 new_fix
->tc_fix_data
= (void *) hppa_fix
;
8653 new_fix
->fx_r_type
= (int) R_PARISC_GNU_VTINHERIT
;
8658 /* Table of pseudo ops for the PA. FIXME -- how many of these
8659 are now redundant with the overall GAS and the object file
8660 dependent tables? */
8661 const pseudo_typeS md_pseudo_table
[] =
8663 /* align pseudo-ops on the PA specify the actual alignment requested,
8664 not the log2 of the requested alignment. */
8666 {"align", pa_align
, 8},
8669 {"align", s_align_bytes
, 8},
8671 {"begin_brtab", pa_brtab
, 1},
8672 {"begin_try", pa_try
, 1},
8673 {"block", pa_block
, 1},
8674 {"blockz", pa_block
, 0},
8675 {"byte", pa_cons
, 1},
8676 {"call", pa_call
, 0},
8677 {"callinfo", pa_callinfo
, 0},
8678 #if defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))
8679 {"code", obj_elf_text
, 0},
8681 {"code", pa_text
, 0},
8682 {"comm", pa_comm
, 0},
8685 {"compiler", pa_compiler
, 0},
8687 {"copyright", pa_copyright
, 0},
8688 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
8689 {"data", pa_data
, 0},
8691 {"double", pa_float_cons
, 'd'},
8692 {"dword", pa_cons
, 8},
8694 {"end_brtab", pa_brtab
, 0},
8695 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
8696 {"end_try", pa_try
, 0},
8698 {"enter", pa_enter
, 0},
8699 {"entry", pa_entry
, 0},
8701 {"exit", pa_exit
, 0},
8702 {"export", pa_export
, 0},
8703 {"fill", pa_fill
, 0},
8704 {"float", pa_float_cons
, 'f'},
8705 {"half", pa_cons
, 2},
8706 {"import", pa_import
, 0},
8707 {"int", pa_cons
, 4},
8708 {"label", pa_label
, 0},
8709 {"lcomm", pa_lcomm
, 0},
8710 {"leave", pa_leave
, 0},
8711 {"level", pa_level
, 0},
8712 {"long", pa_cons
, 4},
8713 {"lsym", pa_lsym
, 0},
8715 {"nsubspa", pa_subspace
, 1},
8717 {"octa", pa_cons
, 16},
8718 {"org", pa_origin
, 0},
8719 {"origin", pa_origin
, 0},
8720 {"param", pa_param
, 0},
8721 {"proc", pa_proc
, 0},
8722 {"procend", pa_procend
, 0},
8723 {"quad", pa_cons
, 8},
8725 {"short", pa_cons
, 2},
8726 {"single", pa_float_cons
, 'f'},
8728 {"space", pa_space
, 0},
8729 {"spnum", pa_spnum
, 0},
8731 {"string", pa_stringer
, 0},
8732 {"stringz", pa_stringer
, 1},
8734 {"subspa", pa_subspace
, 0},
8736 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
8737 {"text", pa_text
, 0},
8739 {"version", pa_version
, 0},
8741 {"vtable_entry", pa_vtable_entry
, 0},
8742 {"vtable_inherit", pa_vtable_inherit
, 0},
8744 {"word", pa_cons
, 4},
8750 hppa_cfi_frame_initial_instructions (void)
8752 cfi_add_CFA_def_cfa (30, 0);
8756 hppa_regname_to_dw2regnum (char *regname
)
8758 unsigned int regnum
= -1;
8762 static struct { char *name
; int dw2regnum
; } regnames
[] =
8764 { "sp", 30 }, { "rp", 2 },
8767 for (i
= 0; i
< ARRAY_SIZE (regnames
); ++i
)
8768 if (strcmp (regnames
[i
].name
, regname
) == 0)
8769 return regnames
[i
].dw2regnum
;
8771 if (regname
[0] == 'r')
8774 regnum
= strtoul (p
, &q
, 10);
8775 if (p
== q
|| *q
|| regnum
>= 32)
8778 else if (regname
[0] == 'f' && regname
[1] == 'r')
8781 regnum
= strtoul (p
, &q
, 10);
8782 #if TARGET_ARCH_SIZE == 64
8783 if (p
== q
|| *q
|| regnum
<= 4 || regnum
>= 32)
8788 || (*q
&& ((*q
!= 'L' && *q
!= 'R') || *(q
+ 1)))
8789 || regnum
<= 4 || regnum
>= 32)
8791 regnum
= (regnum
- 4) * 2 + 32;