1
/* tc-hppa.c -- Assemble for the PA
2
Copyright 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
3
2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012
4
Free Software Foundation, Inc.
6
This file is part of GAS, the GNU Assembler.
8
GAS is free software; you can redistribute it and/or modify
9
it under the terms of the GNU General Public License as published by
10
the Free Software Foundation; either version 3, or (at your option)
13
GAS is distributed in the hope that it will be useful,
14
but WITHOUT ANY WARRANTY; without even the implied warranty of
15
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
GNU General Public License for more details.
18
You should have received a copy of the GNU General Public License
19
along with GAS; see the file COPYING. If not, write to the Free
20
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
23
/* HP PA-RISC support was contributed by the Center for Software Science
24
at the University of Utah. */
27
#include "safe-ctype.h"
29
#include "dw2gencfi.h"
31
#include "bfd/libhppa.h"
33
/* Be careful, this file includes data *declarations*. */
34
#include "opcode/hppa.h"
36
#if defined (OBJ_ELF) && defined (OBJ_SOM)
37
error only one of OBJ_ELF and OBJ_SOM can be defined
40
/* If we are using ELF, then we probably can support dwarf2 debug
41
records. Furthermore, if we are supporting dwarf2 debug records,
42
then we want to use the assembler support for compact line numbers. */
44
#include "dwarf2dbg.h"
46
/* A "convenient" place to put object file dependencies which do
47
not need to be seen outside of tc-hppa.c. */
49
/* Object file formats specify relocation types. */
50
typedef enum elf_hppa_reloc_type reloc_type;
52
/* Object file formats specify BFD symbol types. */
53
typedef elf_symbol_type obj_symbol_type;
54
#define symbol_arg_reloc_info(sym)\
55
(((obj_symbol_type *) symbol_get_bfdsym (sym))->tc_data.hppa_arg_reloc)
57
#if TARGET_ARCH_SIZE == 64
58
/* How to generate a relocation. */
59
#define hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
60
#define elf_hppa_reloc_final_type elf64_hppa_reloc_final_type
62
#define hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
63
#define elf_hppa_reloc_final_type elf32_hppa_reloc_final_type
66
/* ELF objects can have versions, but apparently do not have anywhere
67
to store a copyright string. */
68
#define obj_version obj_elf_version
69
#define obj_copyright obj_elf_version
71
#define UNWIND_SECTION_NAME ".PARISC.unwind"
75
/* Names of various debugging spaces/subspaces. */
76
#define GDB_DEBUG_SPACE_NAME "$GDB_DEBUG$"
77
#define GDB_STRINGS_SUBSPACE_NAME "$GDB_STRINGS$"
78
#define GDB_SYMBOLS_SUBSPACE_NAME "$GDB_SYMBOLS$"
79
#define UNWIND_SECTION_NAME "$UNWIND$"
81
/* Object file formats specify relocation types. */
82
typedef int reloc_type;
84
/* SOM objects can have both a version string and a copyright string. */
85
#define obj_version obj_som_version
86
#define obj_copyright obj_som_copyright
88
/* How to generate a relocation. */
89
#define hppa_gen_reloc_type hppa_som_gen_reloc_type
91
/* Object file formats specify BFD symbol types. */
92
typedef som_symbol_type obj_symbol_type;
93
#define symbol_arg_reloc_info(sym)\
94
(((obj_symbol_type *) symbol_get_bfdsym (sym))->tc_data.ap.hppa_arg_reloc)
96
/* This apparently isn't in older versions of hpux reloc.h. */
98
#define R_DLT_REL 0x78
110
#if TARGET_ARCH_SIZE == 64
111
#define DEFAULT_LEVEL 25
113
#define DEFAULT_LEVEL 10
116
/* Various structures and types used internally in tc-hppa.c. */
118
/* Unwind table and descriptor. FIXME: Sync this with GDB version. */
122
unsigned int cannot_unwind:1;
123
unsigned int millicode:1;
124
unsigned int millicode_save_rest:1;
125
unsigned int region_desc:2;
126
unsigned int save_sr:2;
127
unsigned int entry_fr:4;
128
unsigned int entry_gr:5;
129
unsigned int args_stored:1;
130
unsigned int call_fr:5;
131
unsigned int call_gr:5;
132
unsigned int save_sp:1;
133
unsigned int save_rp:1;
134
unsigned int save_rp_in_frame:1;
135
unsigned int extn_ptr_defined:1;
136
unsigned int cleanup_defined:1;
138
unsigned int hpe_interrupt_marker:1;
139
unsigned int hpux_interrupt_marker:1;
140
unsigned int reserved:3;
141
unsigned int frame_size:27;
144
/* We can't rely on compilers placing bitfields in any particular
145
place, so use these macros when dumping unwind descriptors to
147
#define UNWIND_LOW32(U) \
148
(((U)->cannot_unwind << 31) \
149
| ((U)->millicode << 30) \
150
| ((U)->millicode_save_rest << 29) \
151
| ((U)->region_desc << 27) \
152
| ((U)->save_sr << 25) \
153
| ((U)->entry_fr << 21) \
154
| ((U)->entry_gr << 16) \
155
| ((U)->args_stored << 15) \
156
| ((U)->call_fr << 10) \
157
| ((U)->call_gr << 5) \
158
| ((U)->save_sp << 4) \
159
| ((U)->save_rp << 3) \
160
| ((U)->save_rp_in_frame << 2) \
161
| ((U)->extn_ptr_defined << 1) \
162
| ((U)->cleanup_defined << 0))
164
#define UNWIND_HIGH32(U) \
165
(((U)->hpe_interrupt_marker << 31) \
166
| ((U)->hpux_interrupt_marker << 30) \
167
| ((U)->frame_size << 0))
171
/* Starting and ending offsets of the region described by
173
unsigned int start_offset;
174
unsigned int end_offset;
175
struct unwind_desc descriptor;
178
/* This structure is used by the .callinfo, .enter, .leave pseudo-ops to
179
control the entry and exit code they generate. It is also used in
180
creation of the correct stack unwind descriptors.
182
NOTE: GAS does not support .enter and .leave for the generation of
183
prologues and epilogues. FIXME.
185
The fields in structure roughly correspond to the arguments available on the
186
.callinfo pseudo-op. */
190
/* The unwind descriptor being built. */
191
struct unwind_table ci_unwind;
193
/* Name of this function. */
194
symbolS *start_symbol;
196
/* (temporary) symbol used to mark the end of this function. */
199
/* Next entry in the chain. */
200
struct call_info *ci_next;
203
/* Operand formats for FP instructions. Note not all FP instructions
204
allow all four formats to be used (for example fmpysub only allows
208
SGL, DBL, ILLEGAL_FMT, QUAD, W, UW, DW, UDW, QW, UQW
212
/* This fully describes the symbol types which may be attached to
213
an EXPORT or IMPORT directive. Only SOM uses this formation
214
(ELF has no need for it). */
218
SYMBOL_TYPE_ABSOLUTE,
222
SYMBOL_TYPE_MILLICODE,
224
SYMBOL_TYPE_PRI_PROG,
225
SYMBOL_TYPE_SEC_PROG,
229
/* This structure contains information needed to assemble
230
individual instructions. */
233
/* Holds the opcode after parsing by pa_ip. */
234
unsigned long opcode;
236
/* Holds an expression associated with the current instruction. */
239
/* Does this instruction use PC-relative addressing. */
242
/* Floating point formats for operand1 and operand2. */
243
fp_operand_format fpof1;
244
fp_operand_format fpof2;
246
/* Whether or not we saw a truncation request on an fcnv insn. */
249
/* Holds the field selector for this instruction
250
(for example L%, LR%, etc). */
253
/* Holds any argument relocation bits associated with this
254
instruction. (instruction should be some sort of call). */
255
unsigned int arg_reloc;
257
/* The format specification for this instruction. */
260
/* The relocation (if any) associated with this instruction. */
264
/* PA-89 floating point registers are arranged like this:
266
+--------------+--------------+
267
| 0 or 16L | 16 or 16R |
268
+--------------+--------------+
269
| 1 or 17L | 17 or 17R |
270
+--------------+--------------+
278
+--------------+--------------+
279
| 14 or 30L | 30 or 30R |
280
+--------------+--------------+
281
| 15 or 31L | 31 or 31R |
282
+--------------+--------------+ */
284
/* Additional information needed to build argument relocation stubs. */
287
/* The argument relocation specification. */
288
unsigned int arg_reloc;
290
/* Number of arguments. */
291
unsigned int arg_count;
295
/* This structure defines an entry in the subspace dictionary
298
struct subspace_dictionary_chain
300
/* Nonzero if this space has been defined by the user code. */
301
unsigned int ssd_defined;
303
/* Name of this subspace. */
306
/* GAS segment and subsegment associated with this subspace. */
310
/* Next space in the subspace dictionary chain. */
311
struct subspace_dictionary_chain *ssd_next;
314
typedef struct subspace_dictionary_chain ssd_chain_struct;
316
/* This structure defines an entry in the subspace dictionary
319
struct space_dictionary_chain
321
/* Nonzero if this space has been defined by the user code or
322
as a default space. */
323
unsigned int sd_defined;
325
/* Nonzero if this spaces has been defined by the user code. */
326
unsigned int sd_user_defined;
328
/* The space number (or index). */
329
unsigned int sd_spnum;
331
/* The name of this subspace. */
334
/* GAS segment to which this subspace corresponds. */
337
/* Current subsegment number being used. */
340
/* The chain of subspaces contained within this space. */
341
ssd_chain_struct *sd_subspaces;
343
/* The next entry in the space dictionary chain. */
344
struct space_dictionary_chain *sd_next;
347
typedef struct space_dictionary_chain sd_chain_struct;
349
/* This structure defines attributes of the default subspace
350
dictionary entries. */
352
struct default_subspace_dict
354
/* Name of the subspace. */
357
/* FIXME. Is this still needed? */
360
/* Nonzero if this subspace is loadable. */
363
/* Nonzero if this subspace contains only code. */
366
/* Nonzero if this is a comdat subspace. */
369
/* Nonzero if this is a common subspace. */
372
/* Nonzero if this is a common subspace which allows symbols
373
to be multiply defined. */
376
/* Nonzero if this subspace should be zero filled. */
379
/* Sort key for this subspace. */
382
/* Access control bits for this subspace. Can represent RWX access
383
as well as privilege level changes for gateways. */
386
/* Index of containing space. */
389
/* Alignment (in bytes) of this subspace. */
392
/* Quadrant within space where this subspace should be loaded. */
395
/* An index into the default spaces array. */
398
/* Subsegment associated with this subspace. */
402
/* This structure defines attributes of the default space
403
dictionary entries. */
405
struct default_space_dict
407
/* Name of the space. */
410
/* Space number. It is possible to identify spaces within
411
assembly code numerically! */
414
/* Nonzero if this space is loadable. */
417
/* Nonzero if this space is "defined". FIXME is still needed */
420
/* Nonzero if this space can not be shared. */
423
/* Sort key for this space. */
426
/* Segment associated with this space. */
431
/* Structure for previous label tracking. Needed so that alignments,
432
callinfo declarations, etc can be easily attached to a particular
434
typedef struct label_symbol_struct
436
struct symbol *lss_label;
438
sd_chain_struct *lss_space;
443
struct label_symbol_struct *lss_next;
447
/* Extra information needed to perform fixups (relocations) on the PA. */
448
struct hppa_fix_struct
450
/* The field selector. */
451
enum hppa_reloc_field_selector_type_alt fx_r_field;
456
/* Format of fixup. */
459
/* Argument relocation bits. */
460
unsigned int fx_arg_reloc;
462
/* The segment this fixup appears in. */
466
/* Structure to hold information about predefined registers. */
474
/* This structure defines the mapping from a FP condition string
475
to a condition number which can be recorded in an instruction. */
482
/* This structure defines a mapping from a field selector
483
string to a field selector type. */
484
struct selector_entry
490
/* Prototypes for functions local to tc-hppa.c. */
493
static void pa_check_current_space_and_subspace (void);
496
#if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
497
static void pa_text (int);
498
static void pa_data (int);
499
static void pa_comm (int);
502
static int exact_log2 (int);
503
static void pa_compiler (int);
504
static void pa_align (int);
505
static void pa_space (int);
506
static void pa_spnum (int);
507
static void pa_subspace (int);
508
static sd_chain_struct *create_new_space (char *, int, int,
511
static ssd_chain_struct *create_new_subspace (sd_chain_struct *,
516
static ssd_chain_struct *update_subspace (sd_chain_struct *,
517
char *, int, int, int,
521
static sd_chain_struct *is_defined_space (char *);
522
static ssd_chain_struct *is_defined_subspace (char *);
523
static sd_chain_struct *pa_segment_to_space (asection *);
524
static ssd_chain_struct *pa_subsegment_to_subspace (asection *,
526
static sd_chain_struct *pa_find_space_by_number (int);
527
static unsigned int pa_subspace_start (sd_chain_struct *, int);
528
static sd_chain_struct *pa_parse_space_stmt (char *, int);
531
/* File and globally scoped variable declarations. */
534
/* Root and final entry in the space chain. */
535
static sd_chain_struct *space_dict_root;
536
static sd_chain_struct *space_dict_last;
538
/* The current space and subspace. */
539
static sd_chain_struct *current_space;
540
static ssd_chain_struct *current_subspace;
543
/* Root of the call_info chain. */
544
static struct call_info *call_info_root;
546
/* The last call_info (for functions) structure
547
seen so it can be associated with fixups and
549
static struct call_info *last_call_info;
551
/* The last call description (for actual calls). */
552
static struct call_desc last_call_desc;
554
/* handle of the OPCODE hash table */
555
static struct hash_control *op_hash = NULL;
557
/* These characters can be suffixes of opcode names and they may be
558
followed by meaningful whitespace. We don't include `,' and `!'
559
as they never appear followed by meaningful whitespace. */
560
const char hppa_symbol_chars[] = "*?=<>";
562
/* This array holds the chars that only start a comment at the beginning of
563
a line. If the line seems to have the form '# 123 filename'
564
.line and .file directives will appear in the pre-processed output.
566
Note that input_file.c hand checks for '#' at the beginning of the
567
first line of the input file. This is because the compiler outputs
568
#NO_APP at the beginning of its output.
570
Also note that C style comments will always work. */
571
const char line_comment_chars[] = "#";
573
/* This array holds the chars that always start a comment. If the
574
pre-processor is disabled, these aren't very useful. */
575
const char comment_chars[] = ";";
577
/* This array holds the characters which act as line separators. */
578
const char line_separator_chars[] = "!";
580
/* Chars that can be used to separate mant from exp in floating point nums. */
581
const char EXP_CHARS[] = "eE";
583
/* Chars that mean this number is a floating point constant.
584
As in 0f12.456 or 0d1.2345e12.
586
Be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
587
changed in read.c. Ideally it shouldn't have to know about it
588
at all, but nothing is ideal around here. */
589
const char FLT_CHARS[] = "rRsSfFdDxXpP";
591
static struct pa_it the_insn;
593
/* Points to the end of an expression just parsed by get_expression
594
and friends. FIXME. This shouldn't be handled with a file-global
596
static char *expr_end;
598
/* Nonzero if a .callinfo appeared within the current procedure. */
599
static int callinfo_found;
601
/* Nonzero if the assembler is currently within a .entry/.exit pair. */
602
static int within_entry_exit;
604
/* Nonzero if the assembler is currently within a procedure definition. */
605
static int within_procedure;
607
/* Handle on structure which keep track of the last symbol
608
seen in each subspace. */
609
static label_symbol_struct *label_symbols_rootp = NULL;
611
/* Holds the last field selector. */
612
static int hppa_field_selector;
614
/* Nonzero when strict matching is enabled. Zero otherwise.
616
Each opcode in the table has a flag which indicates whether or
617
not strict matching should be enabled for that instruction.
619
Mainly, strict causes errors to be ignored when a match failure
620
occurs. However, it also affects the parsing of register fields
621
by pa_parse_number. */
624
/* pa_parse_number returns values in `pa_number'. Mostly
625
pa_parse_number is used to return a register number, with floating
626
point registers being numbered from FP_REG_BASE upwards.
627
The bit specified with FP_REG_RSEL is set if the floating point
628
register has a `r' suffix. */
629
#define FP_REG_BASE 64
630
#define FP_REG_RSEL 128
631
static int pa_number;
634
/* A dummy bfd symbol so that all relocations have symbols of some kind. */
635
static symbolS *dummy_symbol;
638
/* Nonzero if errors are to be printed. */
639
static int print_errors = 1;
641
/* List of registers that are pre-defined:
643
Each general register has one predefined name of the form
644
%r<REGNUM> which has the value <REGNUM>.
646
Space and control registers are handled in a similar manner,
647
but use %sr<REGNUM> and %cr<REGNUM> as their predefined names.
649
Likewise for the floating point registers, but of the form
650
%fr<REGNUM>. Floating point registers have additional predefined
651
names with 'L' and 'R' suffixes (e.g. %fr19L, %fr19R) which
652
again have the value <REGNUM>.
654
Many registers also have synonyms:
656
%r26 - %r23 have %arg0 - %arg3 as synonyms
657
%r28 - %r29 have %ret0 - %ret1 as synonyms
658
%fr4 - %fr7 have %farg0 - %farg3 as synonyms
659
%r30 has %sp as a synonym
660
%r27 has %dp as a synonym
661
%r2 has %rp as a synonym
663
Almost every control register has a synonym; they are not listed
666
The table is sorted. Suitable for searching by a binary search. */
668
static const struct pd_reg pre_defined_registers[] =
702
{"%farg0", 4 + FP_REG_BASE},
703
{"%farg1", 5 + FP_REG_BASE},
704
{"%farg2", 6 + FP_REG_BASE},
705
{"%farg3", 7 + FP_REG_BASE},
706
{"%fr0", 0 + FP_REG_BASE},
707
{"%fr0l", 0 + FP_REG_BASE},
708
{"%fr0r", 0 + FP_REG_BASE + FP_REG_RSEL},
709
{"%fr1", 1 + FP_REG_BASE},
710
{"%fr10", 10 + FP_REG_BASE},
711
{"%fr10l", 10 + FP_REG_BASE},
712
{"%fr10r", 10 + FP_REG_BASE + FP_REG_RSEL},
713
{"%fr11", 11 + FP_REG_BASE},
714
{"%fr11l", 11 + FP_REG_BASE},
715
{"%fr11r", 11 + FP_REG_BASE + FP_REG_RSEL},
716
{"%fr12", 12 + FP_REG_BASE},
717
{"%fr12l", 12 + FP_REG_BASE},
718
{"%fr12r", 12 + FP_REG_BASE + FP_REG_RSEL},
719
{"%fr13", 13 + FP_REG_BASE},
720
{"%fr13l", 13 + FP_REG_BASE},
721
{"%fr13r", 13 + FP_REG_BASE + FP_REG_RSEL},
722
{"%fr14", 14 + FP_REG_BASE},
723
{"%fr14l", 14 + FP_REG_BASE},
724
{"%fr14r", 14 + FP_REG_BASE + FP_REG_RSEL},
725
{"%fr15", 15 + FP_REG_BASE},
726
{"%fr15l", 15 + FP_REG_BASE},
727
{"%fr15r", 15 + FP_REG_BASE + FP_REG_RSEL},
728
{"%fr16", 16 + FP_REG_BASE},
729
{"%fr16l", 16 + FP_REG_BASE},
730
{"%fr16r", 16 + FP_REG_BASE + FP_REG_RSEL},
731
{"%fr17", 17 + FP_REG_BASE},
732
{"%fr17l", 17 + FP_REG_BASE},
733
{"%fr17r", 17 + FP_REG_BASE + FP_REG_RSEL},
734
{"%fr18", 18 + FP_REG_BASE},
735
{"%fr18l", 18 + FP_REG_BASE},
736
{"%fr18r", 18 + FP_REG_BASE + FP_REG_RSEL},
737
{"%fr19", 19 + FP_REG_BASE},
738
{"%fr19l", 19 + FP_REG_BASE},
739
{"%fr19r", 19 + FP_REG_BASE + FP_REG_RSEL},
740
{"%fr1l", 1 + FP_REG_BASE},
741
{"%fr1r", 1 + FP_REG_BASE + FP_REG_RSEL},
742
{"%fr2", 2 + FP_REG_BASE},
743
{"%fr20", 20 + FP_REG_BASE},
744
{"%fr20l", 20 + FP_REG_BASE},
745
{"%fr20r", 20 + FP_REG_BASE + FP_REG_RSEL},
746
{"%fr21", 21 + FP_REG_BASE},
747
{"%fr21l", 21 + FP_REG_BASE},
748
{"%fr21r", 21 + FP_REG_BASE + FP_REG_RSEL},
749
{"%fr22", 22 + FP_REG_BASE},
750
{"%fr22l", 22 + FP_REG_BASE},
751
{"%fr22r", 22 + FP_REG_BASE + FP_REG_RSEL},
752
{"%fr23", 23 + FP_REG_BASE},
753
{"%fr23l", 23 + FP_REG_BASE},
754
{"%fr23r", 23 + FP_REG_BASE + FP_REG_RSEL},
755
{"%fr24", 24 + FP_REG_BASE},
756
{"%fr24l", 24 + FP_REG_BASE},
757
{"%fr24r", 24 + FP_REG_BASE + FP_REG_RSEL},
758
{"%fr25", 25 + FP_REG_BASE},
759
{"%fr25l", 25 + FP_REG_BASE},
760
{"%fr25r", 25 + FP_REG_BASE + FP_REG_RSEL},
761
{"%fr26", 26 + FP_REG_BASE},
762
{"%fr26l", 26 + FP_REG_BASE},
763
{"%fr26r", 26 + FP_REG_BASE + FP_REG_RSEL},
764
{"%fr27", 27 + FP_REG_BASE},
765
{"%fr27l", 27 + FP_REG_BASE},
766
{"%fr27r", 27 + FP_REG_BASE + FP_REG_RSEL},
767
{"%fr28", 28 + FP_REG_BASE},
768
{"%fr28l", 28 + FP_REG_BASE},
769
{"%fr28r", 28 + FP_REG_BASE + FP_REG_RSEL},
770
{"%fr29", 29 + FP_REG_BASE},
771
{"%fr29l", 29 + FP_REG_BASE},
772
{"%fr29r", 29 + FP_REG_BASE + FP_REG_RSEL},
773
{"%fr2l", 2 + FP_REG_BASE},
774
{"%fr2r", 2 + FP_REG_BASE + FP_REG_RSEL},
775
{"%fr3", 3 + FP_REG_BASE},
776
{"%fr30", 30 + FP_REG_BASE},
777
{"%fr30l", 30 + FP_REG_BASE},
778
{"%fr30r", 30 + FP_REG_BASE + FP_REG_RSEL},
779
{"%fr31", 31 + FP_REG_BASE},
780
{"%fr31l", 31 + FP_REG_BASE},
781
{"%fr31r", 31 + FP_REG_BASE + FP_REG_RSEL},
782
{"%fr3l", 3 + FP_REG_BASE},
783
{"%fr3r", 3 + FP_REG_BASE + FP_REG_RSEL},
784
{"%fr4", 4 + FP_REG_BASE},
785
{"%fr4l", 4 + FP_REG_BASE},
786
{"%fr4r", 4 + FP_REG_BASE + FP_REG_RSEL},
787
{"%fr5", 5 + FP_REG_BASE},
788
{"%fr5l", 5 + FP_REG_BASE},
789
{"%fr5r", 5 + FP_REG_BASE + FP_REG_RSEL},
790
{"%fr6", 6 + FP_REG_BASE},
791
{"%fr6l", 6 + FP_REG_BASE},
792
{"%fr6r", 6 + FP_REG_BASE + FP_REG_RSEL},
793
{"%fr7", 7 + FP_REG_BASE},
794
{"%fr7l", 7 + FP_REG_BASE},
795
{"%fr7r", 7 + FP_REG_BASE + FP_REG_RSEL},
796
{"%fr8", 8 + FP_REG_BASE},
797
{"%fr8l", 8 + FP_REG_BASE},
798
{"%fr8r", 8 + FP_REG_BASE + FP_REG_RSEL},
799
{"%fr9", 9 + FP_REG_BASE},
800
{"%fr9l", 9 + FP_REG_BASE},
801
{"%fr9r", 9 + FP_REG_BASE + FP_REG_RSEL},
810
#if TARGET_ARCH_SIZE == 64
886
/* This table is sorted by order of the length of the string. This is
887
so we check for <> before we check for <. If we had a <> and checked
888
for < first, we would get a false match. */
889
static const struct fp_cond_map fp_cond_map[] =
925
static const struct selector_entry selector_table[] =
950
/* default space and subspace dictionaries */
952
#define GDB_SYMBOLS GDB_SYMBOLS_SUBSPACE_NAME
953
#define GDB_STRINGS GDB_STRINGS_SUBSPACE_NAME
955
/* pre-defined subsegments (subspaces) for the HPPA. */
956
#define SUBSEG_CODE 0
958
#define SUBSEG_MILLI 2
959
#define SUBSEG_DATA 0
961
#define SUBSEG_UNWIND 3
962
#define SUBSEG_GDB_STRINGS 0
963
#define SUBSEG_GDB_SYMBOLS 1
965
static struct default_subspace_dict pa_def_subspaces[] =
967
{"$CODE$", 1, 1, 1, 0, 0, 0, 0, 24, 0x2c, 0, 8, 0, 0, SUBSEG_CODE},
968
{"$DATA$", 1, 1, 0, 0, 0, 0, 0, 24, 0x1f, 1, 8, 1, 1, SUBSEG_DATA},
969
{"$LIT$", 1, 1, 0, 0, 0, 0, 0, 16, 0x2c, 0, 8, 0, 0, SUBSEG_LIT},
970
{"$MILLICODE$", 1, 1, 0, 0, 0, 0, 0, 8, 0x2c, 0, 8, 0, 0, SUBSEG_MILLI},
971
{"$BSS$", 1, 1, 0, 0, 0, 0, 1, 80, 0x1f, 1, 8, 1, 1, SUBSEG_BSS},
972
{NULL, 0, 1, 0, 0, 0, 0, 0, 255, 0x1f, 0, 4, 0, 0, 0}
975
static struct default_space_dict pa_def_spaces[] =
977
{"$TEXT$", 0, 1, 1, 0, 8, ASEC_NULL},
978
{"$PRIVATE$", 1, 1, 1, 1, 16, ASEC_NULL},
979
{NULL, 0, 0, 0, 0, 0, ASEC_NULL}
982
/* Misc local definitions used by the assembler. */
984
/* These macros are used to maintain spaces/subspaces. */
985
#define SPACE_DEFINED(space_chain) (space_chain)->sd_defined
986
#define SPACE_USER_DEFINED(space_chain) (space_chain)->sd_user_defined
987
#define SPACE_SPNUM(space_chain) (space_chain)->sd_spnum
988
#define SPACE_NAME(space_chain) (space_chain)->sd_name
990
#define SUBSPACE_DEFINED(ss_chain) (ss_chain)->ssd_defined
991
#define SUBSPACE_NAME(ss_chain) (ss_chain)->ssd_name
994
/* Return nonzero if the string pointed to by S potentially represents
995
a right or left half of a FP register */
996
#define IS_R_SELECT(S) (*(S) == 'R' || *(S) == 'r')
997
#define IS_L_SELECT(S) (*(S) == 'L' || *(S) == 'l')
999
/* Store immediate values of shift/deposit/extract functions. */
1001
#define SAVE_IMMEDIATE(VALUE) \
1003
if (immediate_check) \
1007
else if (len == -1) \
1012
/* Insert FIELD into OPCODE starting at bit START. Continue pa_ip
1013
main loop after insertion. */
1015
#define INSERT_FIELD_AND_CONTINUE(OPCODE, FIELD, START) \
1017
((OPCODE) |= (FIELD) << (START)); \
1021
/* Simple range checking for FIELD against HIGH and LOW bounds.
1022
IGNORE is used to suppress the error message. */
1024
#define CHECK_FIELD(FIELD, HIGH, LOW, IGNORE) \
1026
if ((FIELD) > (HIGH) || (FIELD) < (LOW)) \
1029
as_bad (_("Field out of range [%d..%d] (%d)."), (LOW), (HIGH), \
1035
/* Variant of CHECK_FIELD for use in md_apply_fix and other places where
1036
the current file and line number are not valid. */
1038
#define CHECK_FIELD_WHERE(FIELD, HIGH, LOW, FILENAME, LINE) \
1040
if ((FIELD) > (HIGH) || (FIELD) < (LOW)) \
1042
as_bad_where ((FILENAME), (LINE), \
1043
_("Field out of range [%d..%d] (%d)."), (LOW), (HIGH), \
1049
/* Simple alignment checking for FIELD against ALIGN (a power of two).
1050
IGNORE is used to suppress the error message. */
1052
#define CHECK_ALIGN(FIELD, ALIGN, IGNORE) \
1054
if ((FIELD) & ((ALIGN) - 1)) \
1057
as_bad (_("Field not properly aligned [%d] (%d)."), (ALIGN), \
1063
#define is_DP_relative(exp) \
1064
((exp).X_op == O_subtract \
1065
&& strcmp (S_GET_NAME ((exp).X_op_symbol), "$global$") == 0)
1067
#define is_SB_relative(exp) \
1068
((exp).X_op == O_subtract \
1069
&& strcmp (S_GET_NAME ((exp).X_op_symbol), "$segrel$") == 0)
1071
#define is_PC_relative(exp) \
1072
((exp).X_op == O_subtract \
1073
&& strcmp (S_GET_NAME ((exp).X_op_symbol), "$PIC_pcrel$0") == 0)
1075
#define is_tls_gdidx(exp) \
1076
((exp).X_op == O_subtract \
1077
&& strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_gdidx$") == 0)
1079
#define is_tls_ldidx(exp) \
1080
((exp).X_op == O_subtract \
1081
&& strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_ldidx$") == 0)
1083
#define is_tls_dtpoff(exp) \
1084
((exp).X_op == O_subtract \
1085
&& strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_dtpoff$") == 0)
1087
#define is_tls_ieoff(exp) \
1088
((exp).X_op == O_subtract \
1089
&& strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_ieoff$") == 0)
1091
#define is_tls_leoff(exp) \
1092
((exp).X_op == O_subtract \
1093
&& strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_leoff$") == 0)
1095
/* We need some complex handling for stabs (sym1 - sym2). Luckily, we'll
1096
always be able to reduce the expression to a constant, so we don't
1097
need real complex handling yet. */
1098
#define is_complex(exp) \
1099
((exp).X_op != O_constant && (exp).X_op != O_symbol)
1101
/* Actual functions to implement the PA specific code for the assembler. */
1103
/* Called before writing the object file. Make sure entry/exit and
1104
proc/procend pairs match. */
1109
if (within_entry_exit)
1110
as_fatal (_("Missing .exit\n"));
1112
if (within_procedure)
1113
as_fatal (_("Missing .procend\n"));
1116
/* Returns a pointer to the label_symbol_struct for the current space.
1117
or NULL if no label_symbol_struct exists for the current space. */
1119
static label_symbol_struct *
1122
label_symbol_struct *label_chain;
1124
for (label_chain = label_symbols_rootp;
1126
label_chain = label_chain->lss_next)
1129
if (current_space == label_chain->lss_space && label_chain->lss_label)
1133
if (now_seg == label_chain->lss_segment && label_chain->lss_label)
1141
/* Defines a label for the current space. If one is already defined,
1142
this function will replace it with the new label. */
1145
pa_define_label (symbolS *symbol)
1147
label_symbol_struct *label_chain = pa_get_label ();
1150
label_chain->lss_label = symbol;
1153
/* Create a new label entry and add it to the head of the chain. */
1154
label_chain = xmalloc (sizeof (label_symbol_struct));
1155
label_chain->lss_label = symbol;
1157
label_chain->lss_space = current_space;
1160
label_chain->lss_segment = now_seg;
1162
label_chain->lss_next = NULL;
1164
if (label_symbols_rootp)
1165
label_chain->lss_next = label_symbols_rootp;
1167
label_symbols_rootp = label_chain;
1171
dwarf2_emit_label (symbol);
1175
/* Removes a label definition for the current space.
1176
If there is no label_symbol_struct entry, then no action is taken. */
1179
pa_undefine_label (void)
1181
label_symbol_struct *label_chain;
1182
label_symbol_struct *prev_label_chain = NULL;
1184
for (label_chain = label_symbols_rootp;
1186
label_chain = label_chain->lss_next)
1190
&& current_space == label_chain->lss_space && label_chain->lss_label
1193
&& now_seg == label_chain->lss_segment && label_chain->lss_label
1197
/* Remove the label from the chain and free its memory. */
1198
if (prev_label_chain)
1199
prev_label_chain->lss_next = label_chain->lss_next;
1201
label_symbols_rootp = label_chain->lss_next;
1206
prev_label_chain = label_chain;
1210
/* An HPPA-specific version of fix_new. This is required because the HPPA
1211
code needs to keep track of some extra stuff. Each call to fix_new_hppa
1212
results in the creation of an instance of an hppa_fix_struct. An
1213
hppa_fix_struct stores the extra information along with a pointer to the
1214
original fixS. This is attached to the original fixup via the
1215
tc_fix_data field. */
1218
fix_new_hppa (fragS *frag,
1221
symbolS *add_symbol,
1225
bfd_reloc_code_real_type r_type,
1226
enum hppa_reloc_field_selector_type_alt r_field,
1228
unsigned int arg_reloc,
1229
int unwind_bits ATTRIBUTE_UNUSED)
1232
struct hppa_fix_struct *hppa_fix = obstack_alloc (¬es, sizeof (struct hppa_fix_struct));
1235
new_fix = fix_new_exp (frag, where, size, exp, pcrel, r_type);
1237
new_fix = fix_new (frag, where, size, add_symbol, offset, pcrel, r_type);
1238
new_fix->tc_fix_data = (void *) hppa_fix;
1239
hppa_fix->fx_r_type = r_type;
1240
hppa_fix->fx_r_field = r_field;
1241
hppa_fix->fx_r_format = r_format;
1242
hppa_fix->fx_arg_reloc = arg_reloc;
1243
hppa_fix->segment = now_seg;
1245
if (r_type == R_ENTRY || r_type == R_EXIT)
1246
new_fix->fx_offset = unwind_bits;
1249
/* foo-$global$ is used to access non-automatic storage. $global$
1250
is really just a marker and has served its purpose, so eliminate
1251
it now so as not to confuse write.c. Ditto for $PIC_pcrel$0. */
1252
if (new_fix->fx_subsy
1253
&& (strcmp (S_GET_NAME (new_fix->fx_subsy), "$global$") == 0
1254
|| strcmp (S_GET_NAME (new_fix->fx_subsy), "$segrel$") == 0
1255
|| strcmp (S_GET_NAME (new_fix->fx_subsy), "$PIC_pcrel$0") == 0
1256
|| strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_gdidx$") == 0
1257
|| strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_ldidx$") == 0
1258
|| strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_dtpoff$") == 0
1259
|| strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_ieoff$") == 0
1260
|| strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_leoff$") == 0))
1261
new_fix->fx_subsy = NULL;
1264
/* This fix_new is called by cons via TC_CONS_FIX_NEW.
1265
hppa_field_selector is set by the parse_cons_expression_hppa. */
1268
cons_fix_new_hppa (fragS *frag, int where, int size, expressionS *exp)
1270
unsigned int rel_type;
1272
/* Get a base relocation type. */
1273
if (is_DP_relative (*exp))
1274
rel_type = R_HPPA_GOTOFF;
1275
else if (is_PC_relative (*exp))
1276
rel_type = R_HPPA_PCREL_CALL;
1278
else if (is_SB_relative (*exp))
1279
rel_type = R_PARISC_SEGREL32;
1280
else if (is_tls_gdidx (*exp))
1281
rel_type = R_PARISC_TLS_GD21L;
1282
else if (is_tls_ldidx (*exp))
1283
rel_type = R_PARISC_TLS_LDM21L;
1284
else if (is_tls_dtpoff (*exp))
1285
rel_type = R_PARISC_TLS_LDO21L;
1286
else if (is_tls_ieoff (*exp))
1287
rel_type = R_PARISC_TLS_IE21L;
1288
else if (is_tls_leoff (*exp))
1289
rel_type = R_PARISC_TLS_LE21L;
1291
else if (is_complex (*exp))
1292
rel_type = R_HPPA_COMPLEX;
1296
if (hppa_field_selector != e_psel && hppa_field_selector != e_fsel)
1298
as_warn (_("Invalid field selector. Assuming F%%."));
1299
hppa_field_selector = e_fsel;
1302
fix_new_hppa (frag, where, size,
1303
(symbolS *) NULL, (offsetT) 0, exp, 0, rel_type,
1304
hppa_field_selector, size * 8, 0, 0);
1306
/* Reset field selector to its default state. */
1307
hppa_field_selector = 0;
1310
/* Mark (via expr_end) the end of an expression (I think). FIXME. */
1313
get_expression (char *str)
1318
save_in = input_line_pointer;
1319
input_line_pointer = str;
1320
seg = expression (&the_insn.exp);
1321
if (!(seg == absolute_section
1322
|| seg == undefined_section
1323
|| SEG_NORMAL (seg)))
1325
as_warn (_("Bad segment in expression."));
1326
expr_end = input_line_pointer;
1327
input_line_pointer = save_in;
1330
expr_end = input_line_pointer;
1331
input_line_pointer = save_in;
1334
/* Parse a PA nullification completer (,n). Return nonzero if the
1335
completer was found; return zero if no completer was found. */
1338
pa_parse_nullif (char **s)
1346
if (strncasecmp (*s, "n", 1) == 0)
1350
as_bad (_("Invalid Nullification: (%c)"), **s);
1360
md_atof (int type, char *litP, int *sizeP)
1362
return ieee_md_atof (type, litP, sizeP, TRUE);
1365
/* Write out big-endian. */
1368
md_number_to_chars (char *buf, valueT val, int n)
1370
number_to_chars_bigendian (buf, val, n);
1373
/* Translate internal representation of relocation info to BFD target
1377
tc_gen_reloc (asection *section, fixS *fixp)
1380
struct hppa_fix_struct *hppa_fixp;
1381
static arelent *no_relocs = NULL;
1388
hppa_fixp = (struct hppa_fix_struct *) fixp->tc_fix_data;
1389
if (fixp->fx_addsy == 0)
1392
gas_assert (hppa_fixp != 0);
1393
gas_assert (section != 0);
1395
reloc = xmalloc (sizeof (arelent));
1397
reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
1398
*reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1400
/* Allow fixup_segment to recognize hand-written pc-relative relocations.
1401
When we went through cons_fix_new_hppa, we classified them as complex. */
1402
/* ??? It might be better to hide this +8 stuff in tc_cfi_emit_pcrel_expr,
1403
undefine DIFF_EXPR_OK, and let these sorts of complex expressions fail
1404
when R_HPPA_COMPLEX == R_PARISC_UNIMPLEMENTED. */
1405
if (fixp->fx_r_type == (bfd_reloc_code_real_type) R_HPPA_COMPLEX
1408
fixp->fx_r_type = R_HPPA_PCREL_CALL;
1409
fixp->fx_offset += 8;
1412
codes = hppa_gen_reloc_type (stdoutput,
1414
hppa_fixp->fx_r_format,
1415
hppa_fixp->fx_r_field,
1416
fixp->fx_subsy != NULL,
1417
symbol_get_bfdsym (fixp->fx_addsy));
1421
as_bad_where (fixp->fx_file, fixp->fx_line, _("Cannot handle fixup"));
1425
for (n_relocs = 0; codes[n_relocs]; n_relocs++)
1428
relocs = xmalloc (sizeof (arelent *) * n_relocs + 1);
1429
reloc = xmalloc (sizeof (arelent) * n_relocs);
1430
for (i = 0; i < n_relocs; i++)
1431
relocs[i] = &reloc[i];
1433
relocs[n_relocs] = NULL;
1436
switch (fixp->fx_r_type)
1439
gas_assert (n_relocs == 1);
1443
/* Now, do any processing that is dependent on the relocation type. */
1446
case R_PARISC_DLTREL21L:
1447
case R_PARISC_DLTREL14R:
1448
case R_PARISC_DLTREL14F:
1449
case R_PARISC_PLABEL32:
1450
case R_PARISC_PLABEL21L:
1451
case R_PARISC_PLABEL14R:
1452
/* For plabel relocations, the addend of the
1453
relocation should be either 0 (no static link) or 2
1454
(static link required). This adjustment is done in
1455
bfd/elf32-hppa.c:elf32_hppa_relocate_section.
1457
We also slam a zero addend into the DLT relative relocs;
1458
it doesn't make a lot of sense to use any addend since
1459
it gets you a different (eg unknown) DLT entry. */
1463
#ifdef ELF_ARG_RELOC
1464
case R_PARISC_PCREL17R:
1465
case R_PARISC_PCREL17F:
1466
case R_PARISC_PCREL17C:
1467
case R_PARISC_DIR17R:
1468
case R_PARISC_DIR17F:
1469
case R_PARISC_PCREL21L:
1470
case R_PARISC_DIR21L:
1471
reloc->addend = HPPA_R_ADDEND (hppa_fixp->fx_arg_reloc,
1476
case R_PARISC_DIR32:
1477
/* Facilitate hand-crafted unwind info. */
1478
if (strcmp (section->name, UNWIND_SECTION_NAME) == 0)
1479
code = R_PARISC_SEGREL32;
1483
reloc->addend = fixp->fx_offset;
1487
reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
1488
*reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1489
reloc->howto = bfd_reloc_type_lookup (stdoutput,
1490
(bfd_reloc_code_real_type) code);
1491
reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1493
gas_assert (reloc->howto && (unsigned int) code == reloc->howto->type);
1498
/* Walk over reach relocation returned by the BFD backend. */
1499
for (i = 0; i < n_relocs; i++)
1503
relocs[i]->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
1504
*relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1506
bfd_reloc_type_lookup (stdoutput,
1507
(bfd_reloc_code_real_type) code);
1508
relocs[i]->address = fixp->fx_frag->fr_address + fixp->fx_where;
1513
/* The only time we ever use a R_COMP2 fixup is for the difference
1514
of two symbols. With that in mind we fill in all four
1515
relocs now and break out of the loop. */
1516
gas_assert (i == 1);
1517
relocs[0]->sym_ptr_ptr
1518
= (asymbol **) bfd_abs_section_ptr->symbol_ptr_ptr;
1520
= bfd_reloc_type_lookup (stdoutput,
1521
(bfd_reloc_code_real_type) *codes[0]);
1522
relocs[0]->address = fixp->fx_frag->fr_address + fixp->fx_where;
1523
relocs[0]->addend = 0;
1524
relocs[1]->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
1525
*relocs[1]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1527
= bfd_reloc_type_lookup (stdoutput,
1528
(bfd_reloc_code_real_type) *codes[1]);
1529
relocs[1]->address = fixp->fx_frag->fr_address + fixp->fx_where;
1530
relocs[1]->addend = 0;
1531
relocs[2]->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
1532
*relocs[2]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_subsy);
1534
= bfd_reloc_type_lookup (stdoutput,
1535
(bfd_reloc_code_real_type) *codes[2]);
1536
relocs[2]->address = fixp->fx_frag->fr_address + fixp->fx_where;
1537
relocs[2]->addend = 0;
1538
relocs[3]->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[3]);
1543
relocs[3]->address = fixp->fx_frag->fr_address + fixp->fx_where;
1544
relocs[3]->addend = 0;
1545
relocs[4]->sym_ptr_ptr
1546
= (asymbol **) bfd_abs_section_ptr->symbol_ptr_ptr;
1548
= bfd_reloc_type_lookup (stdoutput,
1549
(bfd_reloc_code_real_type) *codes[4]);
1550
relocs[4]->address = fixp->fx_frag->fr_address + fixp->fx_where;
1551
relocs[4]->addend = 0;
1555
relocs[i]->addend = HPPA_R_ADDEND (hppa_fixp->fx_arg_reloc, 0);
1561
/* For plabel relocations, the addend of the
1562
relocation should be either 0 (no static link) or 2
1563
(static link required).
1565
FIXME: We always assume no static link!
1567
We also slam a zero addend into the DLT relative relocs;
1568
it doesn't make a lot of sense to use any addend since
1569
it gets you a different (eg unknown) DLT entry. */
1570
relocs[i]->addend = 0;
1585
/* There is no symbol or addend associated with these fixups. */
1586
relocs[i]->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
1587
*relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
1588
relocs[i]->addend = 0;
1594
/* There is no symbol associated with these fixups. */
1595
relocs[i]->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
1596
*relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
1597
relocs[i]->addend = fixp->fx_offset;
1601
relocs[i]->addend = fixp->fx_offset;
1611
/* Process any machine dependent frag types. */
1614
md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
1615
asection *sec ATTRIBUTE_UNUSED,
1618
unsigned int address;
1620
if (fragP->fr_type == rs_machine_dependent)
1622
switch ((int) fragP->fr_subtype)
1625
fragP->fr_type = rs_fill;
1626
know (fragP->fr_var == 1);
1627
know (fragP->fr_next);
1628
address = fragP->fr_address + fragP->fr_fix;
1629
if (address % fragP->fr_offset)
1632
fragP->fr_next->fr_address
1637
fragP->fr_offset = 0;
1643
/* Round up a section size to the appropriate boundary. */
1646
md_section_align (asection *segment, valueT size)
1648
int align = bfd_get_section_alignment (stdoutput, segment);
1649
int align2 = (1 << align) - 1;
1651
return (size + align2) & ~align2;
1654
/* Return the approximate size of a frag before relaxation has occurred. */
1657
md_estimate_size_before_relax (fragS *fragP, asection *segment ATTRIBUTE_UNUSED)
1663
while ((fragP->fr_fix + size) % fragP->fr_offset)
1670
# ifdef WARN_COMMENTS
1671
const char *md_shortopts = "Vc";
1673
const char *md_shortopts = "V";
1676
# ifdef WARN_COMMENTS
1677
const char *md_shortopts = "c";
1679
const char *md_shortopts = "";
1683
struct option md_longopts[] =
1685
#ifdef WARN_COMMENTS
1686
{"warn-comment", no_argument, NULL, 'c'},
1688
{NULL, no_argument, NULL, 0}
1690
size_t md_longopts_size = sizeof (md_longopts);
1693
md_parse_option (int c, char *arg ATTRIBUTE_UNUSED)
1702
print_version_id ();
1705
#ifdef WARN_COMMENTS
1716
md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
1719
fprintf (stream, _("\
1722
#ifdef WARN_COMMENTS
1723
fprintf (stream, _("\
1724
-c print a warning if a comment is found\n"));
1728
/* We have no need to default values of symbols. */
1731
md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
1736
#if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
1737
#define nonzero_dibits(x) \
1738
((x) | (((x) & 0x55555555) << 1) | (((x) & 0xAAAAAAAA) >> 1))
1739
#define arg_reloc_stub_needed(CALLER, CALLEE) \
1740
(((CALLER) ^ (CALLEE)) & nonzero_dibits (CALLER) & nonzero_dibits (CALLEE))
1742
#define arg_reloc_stub_needed(CALLER, CALLEE) 0
1745
/* Apply a fixup to an instruction. */
1748
md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
1751
struct hppa_fix_struct *hppa_fixP;
1755
/* SOM uses R_HPPA_ENTRY and R_HPPA_EXIT relocations which can
1756
never be "applied" (they are just markers). Likewise for
1757
R_HPPA_BEGIN_BRTAB and R_HPPA_END_BRTAB. */
1759
if (fixP->fx_r_type == R_HPPA_ENTRY
1760
|| fixP->fx_r_type == R_HPPA_EXIT
1761
|| fixP->fx_r_type == R_HPPA_BEGIN_BRTAB
1762
|| fixP->fx_r_type == R_HPPA_END_BRTAB
1763
|| fixP->fx_r_type == R_HPPA_BEGIN_TRY)
1766
/* Disgusting. We must set fx_offset ourselves -- R_HPPA_END_TRY
1767
fixups are considered not adjustable, which in turn causes
1768
adjust_reloc_syms to not set fx_offset. Ugh. */
1769
if (fixP->fx_r_type == R_HPPA_END_TRY)
1771
fixP->fx_offset = * valP;
1776
if (fixP->fx_r_type == (int) R_PARISC_GNU_VTENTRY
1777
|| fixP->fx_r_type == (int) R_PARISC_GNU_VTINHERIT)
1781
if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
1784
/* There should be a HPPA specific fixup associated with the GAS fixup. */
1785
hppa_fixP = (struct hppa_fix_struct *) fixP->tc_fix_data;
1786
if (hppa_fixP == NULL)
1788
as_bad_where (fixP->fx_file, fixP->fx_line,
1789
_("no hppa_fixup entry for fixup type 0x%x"),
1794
fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
1796
if (fixP->fx_size != 4 || hppa_fixP->fx_r_format == 32)
1798
/* Handle constant output. */
1799
number_to_chars_bigendian (fixpos, *valP, fixP->fx_size);
1803
insn = bfd_get_32 (stdoutput, fixpos);
1804
fmt = bfd_hppa_insn2fmt (stdoutput, insn);
1806
/* If there is a symbol associated with this fixup, then it's something
1807
which will need a SOM relocation (except for some PC-relative relocs).
1808
In such cases we should treat the "val" or "addend" as zero since it
1809
will be added in as needed from fx_offset in tc_gen_reloc. */
1810
if ((fixP->fx_addsy != NULL
1811
|| fixP->fx_r_type == (int) R_HPPA_NONE)
1816
new_val = ((fmt == 12 || fmt == 17 || fmt == 22) ? 8 : 0);
1818
/* These field selectors imply that we do not want an addend. */
1819
else if (hppa_fixP->fx_r_field == e_psel
1820
|| hppa_fixP->fx_r_field == e_rpsel
1821
|| hppa_fixP->fx_r_field == e_lpsel
1822
|| hppa_fixP->fx_r_field == e_tsel
1823
|| hppa_fixP->fx_r_field == e_rtsel
1824
|| hppa_fixP->fx_r_field == e_ltsel)
1825
new_val = ((fmt == 12 || fmt == 17 || fmt == 22) ? 8 : 0);
1828
new_val = hppa_field_adjust (* valP, 0, hppa_fixP->fx_r_field);
1830
/* Handle pc-relative exceptions from above. */
1831
if ((fmt == 12 || fmt == 17 || fmt == 22)
1834
&& !arg_reloc_stub_needed (symbol_arg_reloc_info (fixP->fx_addsy),
1835
hppa_fixP->fx_arg_reloc)
1837
&& (* valP - 8 + 8192 < 16384
1838
|| (fmt == 17 && * valP - 8 + 262144 < 524288)
1839
|| (fmt == 22 && * valP - 8 + 8388608 < 16777216))
1842
&& (* valP - 8 + 262144 < 524288
1843
|| (fmt == 22 && * valP - 8 + 8388608 < 16777216))
1845
&& !S_IS_EXTERNAL (fixP->fx_addsy)
1846
&& !S_IS_WEAK (fixP->fx_addsy)
1847
&& S_GET_SEGMENT (fixP->fx_addsy) == hppa_fixP->segment
1849
&& S_GET_SEGMENT (fixP->fx_subsy) != hppa_fixP->segment))
1851
new_val = hppa_field_adjust (* valP, 0, hppa_fixP->fx_r_field);
1857
CHECK_FIELD_WHERE (new_val, 8191, -8192,
1858
fixP->fx_file, fixP->fx_line);
1861
insn = (insn & ~ 0x3ff1) | (((val & 0x1ff8) << 1)
1862
| ((val & 0x2000) >> 13));
1865
CHECK_FIELD_WHERE (new_val, 8191, -8192,
1866
fixP->fx_file, fixP->fx_line);
1869
insn = (insn & ~ 0x3ff9) | (((val & 0x1ffc) << 1)
1870
| ((val & 0x2000) >> 13));
1872
/* Handle all opcodes with the 'j' operand type. */
1874
CHECK_FIELD_WHERE (new_val, 8191, -8192,
1875
fixP->fx_file, fixP->fx_line);
1878
insn = ((insn & ~ 0x3fff) | low_sign_unext (val, 14));
1881
/* Handle all opcodes with the 'k' operand type. */
1883
CHECK_FIELD_WHERE (new_val, 1048575, -1048576,
1884
fixP->fx_file, fixP->fx_line);
1887
insn = (insn & ~ 0x1fffff) | re_assemble_21 (val);
1890
/* Handle all the opcodes with the 'i' operand type. */
1892
CHECK_FIELD_WHERE (new_val, 1023, -1024,
1893
fixP->fx_file, fixP->fx_line);
1896
insn = (insn & ~ 0x7ff) | low_sign_unext (val, 11);
1899
/* Handle all the opcodes with the 'w' operand type. */
1901
CHECK_FIELD_WHERE (new_val - 8, 8191, -8192,
1902
fixP->fx_file, fixP->fx_line);
1905
insn = (insn & ~ 0x1ffd) | re_assemble_12 (val >> 2);
1908
/* Handle some of the opcodes with the 'W' operand type. */
1911
offsetT distance = * valP;
1913
/* If this is an absolute branch (ie no link) with an out of
1914
range target, then we want to complain. */
1915
if (fixP->fx_r_type == (int) R_HPPA_PCREL_CALL
1916
&& (insn & 0xffe00000) == 0xe8000000)
1917
CHECK_FIELD_WHERE (distance - 8, 262143, -262144,
1918
fixP->fx_file, fixP->fx_line);
1920
CHECK_FIELD_WHERE (new_val - 8, 262143, -262144,
1921
fixP->fx_file, fixP->fx_line);
1924
insn = (insn & ~ 0x1f1ffd) | re_assemble_17 (val >> 2);
1930
offsetT distance = * valP;
1932
/* If this is an absolute branch (ie no link) with an out of
1933
range target, then we want to complain. */
1934
if (fixP->fx_r_type == (int) R_HPPA_PCREL_CALL
1935
&& (insn & 0xffe00000) == 0xe8000000)
1936
CHECK_FIELD_WHERE (distance - 8, 8388607, -8388608,
1937
fixP->fx_file, fixP->fx_line);
1939
CHECK_FIELD_WHERE (new_val - 8, 8388607, -8388608,
1940
fixP->fx_file, fixP->fx_line);
1943
insn = (insn & ~ 0x3ff1ffd) | re_assemble_22 (val >> 2);
1949
insn = (insn & ~ 0xfff1) | re_assemble_16 (val & -8);
1954
insn = (insn & ~ 0xfff9) | re_assemble_16 (val & -4);
1959
insn = (insn & ~ 0xffff) | re_assemble_16 (val);
1967
as_bad_where (fixP->fx_file, fixP->fx_line,
1968
_("Unknown relocation encountered in md_apply_fix."));
1973
switch (fixP->fx_r_type)
1975
case R_PARISC_TLS_GD21L:
1976
case R_PARISC_TLS_GD14R:
1977
case R_PARISC_TLS_LDM21L:
1978
case R_PARISC_TLS_LDM14R:
1979
case R_PARISC_TLS_LE21L:
1980
case R_PARISC_TLS_LE14R:
1981
case R_PARISC_TLS_IE21L:
1982
case R_PARISC_TLS_IE14R:
1984
S_SET_THREAD_LOCAL (fixP->fx_addsy);
1991
/* Insert the relocation. */
1992
bfd_put_32 (stdoutput, insn, fixpos);
1995
/* Exactly what point is a PC-relative offset relative TO?
1996
On the PA, they're relative to the address of the offset. */
1999
md_pcrel_from (fixS *fixP)
2001
return fixP->fx_where + fixP->fx_frag->fr_address;
2004
/* Return nonzero if the input line pointer is at the end of
2008
is_end_of_statement (void)
2010
return ((*input_line_pointer == '\n')
2011
|| (*input_line_pointer == ';')
2012
|| (*input_line_pointer == '!'));
2015
#define REG_NAME_CNT (sizeof (pre_defined_registers) / sizeof (struct pd_reg))
2017
/* Given NAME, find the register number associated with that name, return
2018
the integer value associated with the given name or -1 on failure. */
2021
reg_name_search (char *name)
2023
int middle, low, high;
2027
high = REG_NAME_CNT - 1;
2031
middle = (low + high) / 2;
2032
cmp = strcasecmp (name, pre_defined_registers[middle].name);
2038
return pre_defined_registers[middle].value;
2040
while (low <= high);
2045
/* Read a number from S. The number might come in one of many forms,
2046
the most common will be a hex or decimal constant, but it could be
2047
a pre-defined register (Yuk!), or an absolute symbol.
2049
Return 1 on success or 0 on failure. If STRICT, then a missing
2050
register prefix will cause a failure. The number itself is
2051
returned in `pa_number'.
2053
IS_FLOAT indicates that a PA-89 FP register number should be
2054
parsed; A `l' or `r' suffix is checked for if but 2 of IS_FLOAT is
2057
pa_parse_number can not handle negative constants and will fail
2058
horribly if it is passed such a constant. */
2061
pa_parse_number (char **s, int is_float)
2069
bfd_boolean have_prefix;
2071
/* Skip whitespace before the number. */
2072
while (*p == ' ' || *p == '\t')
2078
if (!strict && ISDIGIT (*p))
2080
/* Looks like a number. */
2082
if (*p == '0' && (*(p + 1) == 'x' || *(p + 1) == 'X'))
2084
/* The number is specified in hex. */
2086
while (ISDIGIT (*p) || ((*p >= 'a') && (*p <= 'f'))
2087
|| ((*p >= 'A') && (*p <= 'F')))
2090
num = num * 16 + *p - '0';
2091
else if (*p >= 'a' && *p <= 'f')
2092
num = num * 16 + *p - 'a' + 10;
2094
num = num * 16 + *p - 'A' + 10;
2100
/* The number is specified in decimal. */
2101
while (ISDIGIT (*p))
2103
num = num * 10 + *p - '0';
2110
/* Check for a `l' or `r' suffix. */
2113
pa_number += FP_REG_BASE;
2114
if (! (is_float & 2))
2116
if (IS_R_SELECT (p))
2118
pa_number += FP_REG_RSEL;
2121
else if (IS_L_SELECT (p))
2130
/* The number might be a predefined register. */
2135
/* Tege hack: Special case for general registers as the general
2136
code makes a binary search with case translation, and is VERY
2141
if (*p == 'e' && *(p + 1) == 't'
2142
&& (*(p + 2) == '0' || *(p + 2) == '1'))
2145
num = *p - '0' + 28;
2153
else if (!ISDIGIT (*p))
2156
as_bad (_("Undefined register: '%s'."), name);
2162
num = num * 10 + *p++ - '0';
2163
while (ISDIGIT (*p));
2168
/* Do a normal register search. */
2169
while (is_part_of_name (c))
2175
status = reg_name_search (name);
2181
as_bad (_("Undefined register: '%s'."), name);
2191
/* And finally, it could be a symbol in the absolute section which
2192
is effectively a constant, or a register alias symbol. */
2195
while (is_part_of_name (c))
2201
if ((sym = symbol_find (name)) != NULL)
2203
if (S_GET_SEGMENT (sym) == reg_section)
2205
num = S_GET_VALUE (sym);
2206
/* Well, we don't really have one, but we do have a
2210
else if (S_GET_SEGMENT (sym) == bfd_abs_section_ptr)
2211
num = S_GET_VALUE (sym);
2215
as_bad (_("Non-absolute symbol: '%s'."), name);
2221
/* There is where we'd come for an undefined symbol
2222
or for an empty string. For an empty string we
2223
will return zero. That's a concession made for
2224
compatibility with the braindamaged HP assemblers. */
2230
as_bad (_("Undefined absolute constant: '%s'."), name);
2239
if (!strict || have_prefix)
2247
/* Return nonzero if the given INSN and L/R information will require
2248
a new PA-1.1 opcode. */
2251
need_pa11_opcode (void)
2253
if ((pa_number & FP_REG_RSEL) != 0
2254
&& !(the_insn.fpof1 == DBL && the_insn.fpof2 == DBL))
2256
/* If this instruction is specific to a particular architecture,
2257
then set a new architecture. */
2258
if (bfd_get_mach (stdoutput) < pa11)
2260
if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, pa11))
2261
as_warn (_("could not update architecture and machine"));
2269
/* Parse a condition for a fcmp instruction. Return the numerical
2270
code associated with the condition. */
2273
pa_parse_fp_cmp_cond (char **s)
2279
for (i = 0; i < 32; i++)
2281
if (strncasecmp (*s, fp_cond_map[i].string,
2282
strlen (fp_cond_map[i].string)) == 0)
2284
cond = fp_cond_map[i].cond;
2285
*s += strlen (fp_cond_map[i].string);
2286
/* If not a complete match, back up the input string and
2288
if (**s != ' ' && **s != '\t')
2290
*s -= strlen (fp_cond_map[i].string);
2293
while (**s == ' ' || **s == '\t')
2299
as_bad (_("Invalid FP Compare Condition: %s"), *s);
2301
/* Advance over the bogus completer. */
2302
while (**s != ',' && **s != ' ' && **s != '\t')
2308
/* Parse a graphics test complete for ftest. */
2311
pa_parse_ftest_gfx_completer (char **s)
2316
if (strncasecmp (*s, "acc8", 4) == 0)
2321
else if (strncasecmp (*s, "acc6", 4) == 0)
2326
else if (strncasecmp (*s, "acc4", 4) == 0)
2331
else if (strncasecmp (*s, "acc2", 4) == 0)
2336
else if (strncasecmp (*s, "acc", 3) == 0)
2341
else if (strncasecmp (*s, "rej8", 4) == 0)
2346
else if (strncasecmp (*s, "rej", 3) == 0)
2354
as_bad (_("Invalid FTEST completer: %s"), *s);
2360
/* Parse an FP operand format completer returning the completer
2363
static fp_operand_format
2364
pa_parse_fp_cnv_format (char **s)
2372
if (strncasecmp (*s, "sgl", 3) == 0)
2377
else if (strncasecmp (*s, "dbl", 3) == 0)
2382
else if (strncasecmp (*s, "quad", 4) == 0)
2387
else if (strncasecmp (*s, "w", 1) == 0)
2392
else if (strncasecmp (*s, "uw", 2) == 0)
2397
else if (strncasecmp (*s, "dw", 2) == 0)
2402
else if (strncasecmp (*s, "udw", 3) == 0)
2407
else if (strncasecmp (*s, "qw", 2) == 0)
2412
else if (strncasecmp (*s, "uqw", 3) == 0)
2419
format = ILLEGAL_FMT;
2420
as_bad (_("Invalid FP Operand Format: %3s"), *s);
2427
/* Parse an FP operand format completer returning the completer
2430
static fp_operand_format
2431
pa_parse_fp_format (char **s)
2439
if (strncasecmp (*s, "sgl", 3) == 0)
2444
else if (strncasecmp (*s, "dbl", 3) == 0)
2449
else if (strncasecmp (*s, "quad", 4) == 0)
2456
format = ILLEGAL_FMT;
2457
as_bad (_("Invalid FP Operand Format: %3s"), *s);
2464
/* Convert from a selector string into a selector type. */
2467
pa_chk_field_selector (char **str)
2469
int middle, low, high;
2473
/* Read past any whitespace. */
2474
/* FIXME: should we read past newlines and formfeeds??? */
2475
while (**str == ' ' || **str == '\t' || **str == '\n' || **str == '\f')
2478
if ((*str)[1] == '\'' || (*str)[1] == '%')
2479
name[0] = TOLOWER ((*str)[0]),
2481
else if ((*str)[2] == '\'' || (*str)[2] == '%')
2482
name[0] = TOLOWER ((*str)[0]),
2483
name[1] = TOLOWER ((*str)[1]),
2485
else if ((*str)[3] == '\'' || (*str)[3] == '%')
2486
name[0] = TOLOWER ((*str)[0]),
2487
name[1] = TOLOWER ((*str)[1]),
2488
name[2] = TOLOWER ((*str)[2]),
2494
high = sizeof (selector_table) / sizeof (struct selector_entry) - 1;
2498
middle = (low + high) / 2;
2499
cmp = strcmp (name, selector_table[middle].prefix);
2506
*str += strlen (name) + 1;
2508
if (selector_table[middle].field_selector == e_nsel)
2511
return selector_table[middle].field_selector;
2514
while (low <= high);
2519
/* Parse a .byte, .word, .long expression for the HPPA. Called by
2520
cons via the TC_PARSE_CONS_EXPRESSION macro. */
2523
parse_cons_expression_hppa (expressionS *exp)
2525
hppa_field_selector = pa_chk_field_selector (&input_line_pointer);
2529
/* Evaluate an absolute expression EXP which may be modified by
2530
the selector FIELD_SELECTOR. Return the value of the expression. */
2532
evaluate_absolute (struct pa_it *insn)
2536
int field_selector = insn->field_selector;
2539
value = exp.X_add_number;
2541
return hppa_field_adjust (0, value, field_selector);
2544
/* Mark (via expr_end) the end of an absolute expression. FIXME. */
2547
pa_get_absolute_expression (struct pa_it *insn, char **strp)
2551
insn->field_selector = pa_chk_field_selector (strp);
2552
save_in = input_line_pointer;
2553
input_line_pointer = *strp;
2554
expression (&insn->exp);
2555
expr_end = input_line_pointer;
2556
input_line_pointer = save_in;
2557
if (insn->exp.X_op != O_constant)
2559
/* We have a non-match in strict mode. */
2561
as_bad (_("Bad segment (should be absolute)."));
2564
return evaluate_absolute (insn);
2567
/* Get an absolute number. The input string is terminated at the
2568
first whitespace character. */
2571
pa_get_number (struct pa_it *insn, char **strp)
2577
save_in = input_line_pointer;
2578
input_line_pointer = *strp;
2580
/* The PA assembly syntax is ambiguous in a variety of ways. Consider
2581
this string "4 %r5" Is that the number 4 followed by the register
2582
r5, or is that 4 MOD r5? This situation occurs for example in the
2583
coprocessor load and store instructions. Previously, calling
2584
pa_get_absolute_expression directly results in r5 being entered
2585
in the symbol table.
2587
So, when looking for an absolute number, we cut off the input string
2588
at the first whitespace character. Thus, expressions should generally
2589
contain no whitespace. */
2592
while (*s != ',' && *s != ' ' && *s != '\t')
2598
result = pa_get_absolute_expression (insn, strp);
2600
input_line_pointer = save_in;
2605
/* Given an argument location specification return the associated
2606
argument location number. */
2609
pa_build_arg_reloc (char *type_name)
2612
if (strncasecmp (type_name, "no", 2) == 0)
2614
if (strncasecmp (type_name, "gr", 2) == 0)
2616
else if (strncasecmp (type_name, "fr", 2) == 0)
2618
else if (strncasecmp (type_name, "fu", 2) == 0)
2621
as_bad (_("Invalid argument location: %s\n"), type_name);
2626
/* Encode and return an argument relocation specification for
2627
the given register in the location specified by arg_reloc. */
2630
pa_align_arg_reloc (unsigned int reg, unsigned int arg_reloc)
2632
unsigned int new_reloc;
2634
new_reloc = arg_reloc;
2650
as_bad (_("Invalid argument description: %d"), reg);
2656
/* Parse a non-negated compare/subtract completer returning the
2657
number (for encoding in instructions) of the given completer. */
2660
pa_parse_nonneg_cmpsub_cmpltr (char **s)
2663
char *name = *s + 1;
2672
while (**s != ',' && **s != ' ' && **s != '\t')
2677
if (strcmp (name, "=") == 0)
2681
else if (strcmp (name, "<") == 0)
2685
else if (strcmp (name, "<=") == 0)
2689
else if (strcmp (name, "<<") == 0)
2693
else if (strcmp (name, "<<=") == 0)
2697
else if (strcasecmp (name, "sv") == 0)
2701
else if (strcasecmp (name, "od") == 0)
2705
/* If we have something like addb,n then there is no condition
2707
else if (strcasecmp (name, "n") == 0)
2719
/* Reset pointers if this was really a ,n for a branch instruction. */
2726
/* Parse a negated compare/subtract completer returning the
2727
number (for encoding in instructions) of the given completer. */
2730
pa_parse_neg_cmpsub_cmpltr (char **s)
2733
char *name = *s + 1;
2742
while (**s != ',' && **s != ' ' && **s != '\t')
2747
if (strcasecmp (name, "tr") == 0)
2751
else if (strcmp (name, "<>") == 0)
2755
else if (strcmp (name, ">=") == 0)
2759
else if (strcmp (name, ">") == 0)
2763
else if (strcmp (name, ">>=") == 0)
2767
else if (strcmp (name, ">>") == 0)
2771
else if (strcasecmp (name, "nsv") == 0)
2775
else if (strcasecmp (name, "ev") == 0)
2779
/* If we have something like addb,n then there is no condition
2781
else if (strcasecmp (name, "n") == 0)
2793
/* Reset pointers if this was really a ,n for a branch instruction. */
2800
/* Parse a 64 bit compare and branch completer returning the number (for
2801
encoding in instructions) of the given completer.
2803
Nonnegated comparisons are returned as 0-7, negated comparisons are
2804
returned as 8-15. */
2807
pa_parse_cmpb_64_cmpltr (char **s)
2810
char *name = *s + 1;
2817
while (**s != ',' && **s != ' ' && **s != '\t')
2822
if (strcmp (name, "*") == 0)
2826
else if (strcmp (name, "*=") == 0)
2830
else if (strcmp (name, "*<") == 0)
2834
else if (strcmp (name, "*<=") == 0)
2838
else if (strcmp (name, "*<<") == 0)
2842
else if (strcmp (name, "*<<=") == 0)
2846
else if (strcasecmp (name, "*sv") == 0)
2850
else if (strcasecmp (name, "*od") == 0)
2854
else if (strcasecmp (name, "*tr") == 0)
2858
else if (strcmp (name, "*<>") == 0)
2862
else if (strcmp (name, "*>=") == 0)
2866
else if (strcmp (name, "*>") == 0)
2870
else if (strcmp (name, "*>>=") == 0)
2874
else if (strcmp (name, "*>>") == 0)
2878
else if (strcasecmp (name, "*nsv") == 0)
2882
else if (strcasecmp (name, "*ev") == 0)
2896
/* Parse a 64 bit compare immediate and branch completer returning the number
2897
(for encoding in instructions) of the given completer. */
2900
pa_parse_cmpib_64_cmpltr (char **s)
2903
char *name = *s + 1;
2910
while (**s != ',' && **s != ' ' && **s != '\t')
2915
if (strcmp (name, "*<<") == 0)
2919
else if (strcmp (name, "*=") == 0)
2923
else if (strcmp (name, "*<") == 0)
2927
else if (strcmp (name, "*<=") == 0)
2931
else if (strcmp (name, "*>>=") == 0)
2935
else if (strcmp (name, "*<>") == 0)
2939
else if (strcasecmp (name, "*>=") == 0)
2943
else if (strcasecmp (name, "*>") == 0)
2957
/* Parse a non-negated addition completer returning the number
2958
(for encoding in instructions) of the given completer. */
2961
pa_parse_nonneg_add_cmpltr (char **s)
2964
char *name = *s + 1;
2973
while (**s != ',' && **s != ' ' && **s != '\t')
2977
if (strcmp (name, "=") == 0)
2981
else if (strcmp (name, "<") == 0)
2985
else if (strcmp (name, "<=") == 0)
2989
else if (strcasecmp (name, "nuv") == 0)
2993
else if (strcasecmp (name, "znv") == 0)
2997
else if (strcasecmp (name, "sv") == 0)
3001
else if (strcasecmp (name, "od") == 0)
3005
/* If we have something like addb,n then there is no condition
3007
else if (strcasecmp (name, "n") == 0)
3019
/* Reset pointers if this was really a ,n for a branch instruction. */
3026
/* Parse a negated addition completer returning the number
3027
(for encoding in instructions) of the given completer. */
3030
pa_parse_neg_add_cmpltr (char **s)
3033
char *name = *s + 1;
3042
while (**s != ',' && **s != ' ' && **s != '\t')
3046
if (strcasecmp (name, "tr") == 0)
3050
else if (strcmp (name, "<>") == 0)
3054
else if (strcmp (name, ">=") == 0)
3058
else if (strcmp (name, ">") == 0)
3062
else if (strcasecmp (name, "uv") == 0)
3066
else if (strcasecmp (name, "vnz") == 0)
3070
else if (strcasecmp (name, "nsv") == 0)
3074
else if (strcasecmp (name, "ev") == 0)
3078
/* If we have something like addb,n then there is no condition
3080
else if (strcasecmp (name, "n") == 0)
3092
/* Reset pointers if this was really a ,n for a branch instruction. */
3099
/* Parse a 64 bit wide mode add and branch completer returning the number (for
3100
encoding in instructions) of the given completer. */
3103
pa_parse_addb_64_cmpltr (char **s)
3106
char *name = *s + 1;
3115
while (**s != ',' && **s != ' ' && **s != '\t')
3119
if (strcmp (name, "=") == 0)
3123
else if (strcmp (name, "<") == 0)
3127
else if (strcmp (name, "<=") == 0)
3131
else if (strcasecmp (name, "nuv") == 0)
3135
else if (strcasecmp (name, "*=") == 0)
3139
else if (strcasecmp (name, "*<") == 0)
3143
else if (strcasecmp (name, "*<=") == 0)
3147
else if (strcmp (name, "tr") == 0)
3151
else if (strcmp (name, "<>") == 0)
3155
else if (strcmp (name, ">=") == 0)
3159
else if (strcmp (name, ">") == 0)
3163
else if (strcasecmp (name, "uv") == 0)
3167
else if (strcasecmp (name, "*<>") == 0)
3171
else if (strcasecmp (name, "*>=") == 0)
3175
else if (strcasecmp (name, "*>") == 0)
3179
/* If we have something like addb,n then there is no condition
3181
else if (strcasecmp (name, "n") == 0)
3193
/* Reset pointers if this was really a ,n for a branch instruction. */
3200
/* Do the real work for assembling a single instruction. Store results
3201
into the global "the_insn" variable. */
3206
char *error_message = "";
3207
char *s, c, *argstart, *name, *save_s;
3211
int cmpltr, nullif, flag, cond, need_cond, num;
3212
int immediate_check = 0, pos = -1, len = -1;
3213
unsigned long opcode;
3214
struct pa_opcode *insn;
3217
/* We must have a valid space and subspace. */
3218
pa_check_current_space_and_subspace ();
3221
/* Convert everything up to the first whitespace character into lower
3223
for (s = str; *s != ' ' && *s != '\t' && *s != '\n' && *s != '\0'; s++)
3226
/* Skip to something interesting. */
3228
ISUPPER (*s) || ISLOWER (*s) || (*s >= '0' && *s <= '3');
3248
as_bad (_("Unknown opcode: `%s'"), str);
3252
/* Look up the opcode in the hash table. */
3253
if ((insn = (struct pa_opcode *) hash_find (op_hash, str)) == NULL)
3255
as_bad (_("Unknown opcode: `%s'"), str);
3262
/* Mark the location where arguments for the instruction start, then
3263
start processing them. */
3267
/* Do some initialization. */
3268
opcode = insn->match;
3269
strict = (insn->flags & FLAG_STRICT);
3270
memset (&the_insn, 0, sizeof (the_insn));
3273
the_insn.reloc = R_HPPA_NONE;
3275
if (insn->arch >= pa20
3276
&& bfd_get_mach (stdoutput) < insn->arch)
3279
/* Build the opcode, checking as we go to make
3280
sure that the operands match. */
3281
for (args = insn->args;; ++args)
3283
/* Absorb white space in instruction. */
3284
while (*s == ' ' || *s == '\t')
3289
/* End of arguments. */
3305
/* These must match exactly. */
3314
/* Handle a 5 bit register or control register field at 10. */
3317
if (!pa_parse_number (&s, 0))
3320
CHECK_FIELD (num, 31, 0, 0);
3321
INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
3323
/* Handle %sar or %cr11. No bits get set, we just verify that it
3326
/* Skip whitespace before register. */
3327
while (*s == ' ' || *s == '\t')
3330
if (!strncasecmp (s, "%sar", 4))
3335
else if (!strncasecmp (s, "%cr11", 5))
3342
/* Handle a 5 bit register field at 15. */
3344
if (!pa_parse_number (&s, 0))
3347
CHECK_FIELD (num, 31, 0, 0);
3348
INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
3350
/* Handle a 5 bit register field at 31. */
3352
if (!pa_parse_number (&s, 0))
3355
CHECK_FIELD (num, 31, 0, 0);
3356
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
3358
/* Handle a 5 bit register field at 10 and 15. */
3360
if (!pa_parse_number (&s, 0))
3363
CHECK_FIELD (num, 31, 0, 0);
3364
opcode |= num << 16;
3365
INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
3367
/* Handle a 5 bit field length at 31. */
3369
num = pa_get_absolute_expression (&the_insn, &s);
3370
if (strict && the_insn.exp.X_op != O_constant)
3373
CHECK_FIELD (num, 32, 1, 0);
3374
SAVE_IMMEDIATE(num);
3375
INSERT_FIELD_AND_CONTINUE (opcode, 32 - num, 0);
3377
/* Handle a 5 bit immediate at 15. */
3379
num = pa_get_absolute_expression (&the_insn, &s);
3380
if (strict && the_insn.exp.X_op != O_constant)
3383
/* When in strict mode, we want to just reject this
3384
match instead of giving an out of range error. */
3385
CHECK_FIELD (num, 15, -16, strict);
3386
num = low_sign_unext (num, 5);
3387
INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
3389
/* Handle a 5 bit immediate at 31. */
3391
num = pa_get_absolute_expression (&the_insn, &s);
3392
if (strict && the_insn.exp.X_op != O_constant)
3395
/* When in strict mode, we want to just reject this
3396
match instead of giving an out of range error. */
3397
CHECK_FIELD (num, 15, -16, strict);
3398
num = low_sign_unext (num, 5);
3399
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
3401
/* Handle an unsigned 5 bit immediate at 31. */
3403
num = pa_get_absolute_expression (&the_insn, &s);
3404
if (strict && the_insn.exp.X_op != O_constant)
3407
CHECK_FIELD (num, 31, 0, strict);
3408
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
3410
/* Handle an unsigned 5 bit immediate at 15. */
3412
num = pa_get_absolute_expression (&the_insn, &s);
3413
if (strict && the_insn.exp.X_op != O_constant)
3416
CHECK_FIELD (num, 31, 0, strict);
3417
INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
3419
/* Handle an unsigned 10 bit immediate at 15. */
3421
num = pa_get_absolute_expression (&the_insn, &s);
3422
if (strict && the_insn.exp.X_op != O_constant)
3425
CHECK_FIELD (num, 1023, 0, strict);
3426
INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
3428
/* Handle a 2 bit space identifier at 17. */
3430
if (!pa_parse_number (&s, 0))
3433
CHECK_FIELD (num, 3, 0, 1);
3434
INSERT_FIELD_AND_CONTINUE (opcode, num, 14);
3436
/* Handle a 3 bit space identifier at 18. */
3438
if (!pa_parse_number (&s, 0))
3441
CHECK_FIELD (num, 7, 0, 1);
3442
opcode |= re_assemble_3 (num);
3445
/* Handle all completers. */
3450
/* Handle a completer for an indexing load or store. */
3457
while (*s == ',' && i < 2)
3460
if (strncasecmp (s, "sm", 2) == 0)
3467
else if (strncasecmp (s, "m", 1) == 0)
3469
else if ((strncasecmp (s, "s ", 2) == 0)
3470
|| (strncasecmp (s, "s,", 2) == 0))
3474
/* This is a match failure. */
3479
as_bad (_("Invalid Indexed Load Completer."));
3484
as_bad (_("Invalid Indexed Load Completer Syntax."));
3486
INSERT_FIELD_AND_CONTINUE (opcode, uu, 13);
3489
/* Handle a short load/store completer. */
3501
if (strncasecmp (s, "ma", 2) == 0)
3507
else if (strncasecmp (s, "mb", 2) == 0)
3514
/* This is a match failure. */
3518
as_bad (_("Invalid Short Load/Store Completer."));
3522
/* If we did not get a ma/mb completer, then we do not
3523
consider this a positive match for 'ce'. */
3524
else if (*args == 'e')
3527
/* 'J', 'm', 'M' and 'q' are the same, except for where they
3528
encode the before/after field. */
3529
if (*args == 'm' || *args == 'M')
3532
INSERT_FIELD_AND_CONTINUE (opcode, a, 13);
3534
else if (*args == 'q')
3537
INSERT_FIELD_AND_CONTINUE (opcode, a, 2);
3539
else if (*args == 'J')
3541
/* M bit is explicit in the major opcode. */
3542
INSERT_FIELD_AND_CONTINUE (opcode, a, 2);
3544
else if (*args == 'e')
3546
/* Stash the ma/mb flag temporarily in the
3547
instruction. We will use (and remove it)
3548
later when handling 'J', 'K', '<' & '>'. */
3554
/* Handle a stbys completer. */
3561
while (*s == ',' && i < 2)
3564
if (strncasecmp (s, "m", 1) == 0)
3566
else if ((strncasecmp (s, "b ", 2) == 0)
3567
|| (strncasecmp (s, "b,", 2) == 0))
3569
else if (strncasecmp (s, "e", 1) == 0)
3571
/* In strict mode, this is a match failure. */
3578
as_bad (_("Invalid Store Bytes Short Completer"));
3583
as_bad (_("Invalid Store Bytes Short Completer"));
3585
INSERT_FIELD_AND_CONTINUE (opcode, a, 13);
3588
/* Handle load cache hint completer. */
3591
if (!strncmp (s, ",sl", 3))
3596
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10);
3598
/* Handle store cache hint completer. */
3601
if (!strncmp (s, ",sl", 3))
3606
else if (!strncmp (s, ",bc", 3))
3611
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10);
3613
/* Handle load and clear cache hint completer. */
3616
if (!strncmp (s, ",co", 3))
3621
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10);
3623
/* Handle load ordering completer. */
3625
if (strncmp (s, ",o", 2) != 0)
3630
/* Handle a branch gate completer. */
3632
if (strncasecmp (s, ",gate", 5) != 0)
3637
/* Handle a branch link and push completer. */
3639
if (strncasecmp (s, ",l,push", 7) != 0)
3644
/* Handle a branch link completer. */
3646
if (strncasecmp (s, ",l", 2) != 0)
3651
/* Handle a branch pop completer. */
3653
if (strncasecmp (s, ",pop", 4) != 0)
3658
/* Handle a local processor completer. */
3660
if (strncasecmp (s, ",l", 2) != 0)
3665
/* Handle a PROBE read/write completer. */
3668
if (!strncasecmp (s, ",w", 2))
3673
else if (!strncasecmp (s, ",r", 2))
3679
INSERT_FIELD_AND_CONTINUE (opcode, flag, 6);
3681
/* Handle MFCTL wide completer. */
3683
if (strncasecmp (s, ",w", 2) != 0)
3688
/* Handle an RFI restore completer. */
3691
if (!strncasecmp (s, ",r", 2))
3697
INSERT_FIELD_AND_CONTINUE (opcode, flag, 5);
3699
/* Handle a system control completer. */
3701
if (*s == ',' && (*(s + 1) == 'm' || *(s + 1) == 'M'))
3709
INSERT_FIELD_AND_CONTINUE (opcode, flag, 5);
3711
/* Handle intermediate/final completer for DCOR. */
3714
if (!strncasecmp (s, ",i", 2))
3720
INSERT_FIELD_AND_CONTINUE (opcode, flag, 6);
3722
/* Handle zero/sign extension completer. */
3725
if (!strncasecmp (s, ",z", 2))
3731
INSERT_FIELD_AND_CONTINUE (opcode, flag, 10);
3733
/* Handle add completer. */
3736
if (!strncasecmp (s, ",l", 2))
3741
else if (!strncasecmp (s, ",tsv", 4))
3747
INSERT_FIELD_AND_CONTINUE (opcode, flag, 10);
3749
/* Handle 64 bit carry for ADD. */
3752
if (!strncasecmp (s, ",dc,tsv", 7) ||
3753
!strncasecmp (s, ",tsv,dc", 7))
3758
else if (!strncasecmp (s, ",dc", 3))
3766
/* Condition is not required with "dc". */
3768
INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
3770
/* Handle 32 bit carry for ADD. */
3773
if (!strncasecmp (s, ",c,tsv", 6) ||
3774
!strncasecmp (s, ",tsv,c", 6))
3779
else if (!strncasecmp (s, ",c", 2))
3787
INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
3789
/* Handle trap on signed overflow. */
3792
if (!strncasecmp (s, ",tsv", 4))
3798
INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
3800
/* Handle trap on condition and overflow. */
3803
if (!strncasecmp (s, ",tc,tsv", 7) ||
3804
!strncasecmp (s, ",tsv,tc", 7))
3809
else if (!strncasecmp (s, ",tc", 3))
3817
INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
3819
/* Handle 64 bit borrow for SUB. */
3822
if (!strncasecmp (s, ",db,tsv", 7) ||
3823
!strncasecmp (s, ",tsv,db", 7))
3828
else if (!strncasecmp (s, ",db", 3))
3836
/* Condition is not required with "db". */
3838
INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
3840
/* Handle 32 bit borrow for SUB. */
3843
if (!strncasecmp (s, ",b,tsv", 6) ||
3844
!strncasecmp (s, ",tsv,b", 6))
3849
else if (!strncasecmp (s, ",b", 2))
3857
INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
3859
/* Handle trap condition completer for UADDCM. */
3862
if (!strncasecmp (s, ",tc", 3))
3868
INSERT_FIELD_AND_CONTINUE (opcode, flag, 6);
3870
/* Handle signed/unsigned at 21. */
3874
if (strncasecmp (s, ",s", 2) == 0)
3879
else if (strncasecmp (s, ",u", 2) == 0)
3885
INSERT_FIELD_AND_CONTINUE (opcode, sign, 10);
3888
/* Handle left/right combination at 17:18. */
3898
as_bad (_("Invalid left/right combination completer"));
3901
INSERT_FIELD_AND_CONTINUE (opcode, lr, 13);
3904
as_bad (_("Invalid left/right combination completer"));
3907
/* Handle saturation at 24:25. */
3911
if (strncasecmp (s, ",ss", 3) == 0)
3916
else if (strncasecmp (s, ",us", 3) == 0)
3922
INSERT_FIELD_AND_CONTINUE (opcode, sat, 6);
3925
/* Handle permutation completer. */
3953
as_bad (_("Invalid permutation completer"));
3955
opcode |= perm << permloc[i];
3960
as_bad (_("Invalid permutation completer"));
3968
/* Handle all conditions. */
3974
/* Handle FP compare conditions. */
3976
cond = pa_parse_fp_cmp_cond (&s);
3977
INSERT_FIELD_AND_CONTINUE (opcode, cond, 0);
3979
/* Handle an add condition. */
3988
/* 64 bit conditions. */
4000
while (*s != ',' && *s != ' ' && *s != '\t')
4004
if (strcmp (name, "=") == 0)
4006
else if (strcmp (name, "<") == 0)
4008
else if (strcmp (name, "<=") == 0)
4010
else if (strcasecmp (name, "nuv") == 0)
4012
else if (strcasecmp (name, "znv") == 0)
4014
else if (strcasecmp (name, "sv") == 0)
4016
else if (strcasecmp (name, "od") == 0)
4018
else if (strcasecmp (name, "tr") == 0)
4023
else if (strcmp (name, "<>") == 0)
4028
else if (strcmp (name, ">=") == 0)
4033
else if (strcmp (name, ">") == 0)
4038
else if (strcasecmp (name, "uv") == 0)
4043
else if (strcasecmp (name, "vnz") == 0)
4048
else if (strcasecmp (name, "nsv") == 0)
4053
else if (strcasecmp (name, "ev") == 0)
4058
/* ",*" is a valid condition. */
4059
else if (*args == 'a' || *name)
4060
as_bad (_("Invalid Add Condition: %s"), name);
4063
/* Except with "dc", we have a match failure with
4064
'A' if we don't have a doubleword condition. */
4065
else if (*args == 'A' && need_cond)
4068
opcode |= cmpltr << 13;
4069
INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
4071
/* Handle non-negated add and branch condition. */
4073
cmpltr = pa_parse_nonneg_add_cmpltr (&s);
4076
as_bad (_("Invalid Add and Branch Condition"));
4079
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
4081
/* Handle 64 bit wide-mode add and branch condition. */
4083
cmpltr = pa_parse_addb_64_cmpltr (&s);
4086
as_bad (_("Invalid Add and Branch Condition"));
4091
/* Negated condition requires an opcode change. */
4092
opcode |= (cmpltr & 8) << 24;
4094
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr & 7, 13);
4096
/* Handle a negated or non-negated add and branch
4100
cmpltr = pa_parse_nonneg_add_cmpltr (&s);
4104
cmpltr = pa_parse_neg_add_cmpltr (&s);
4107
as_bad (_("Invalid Compare/Subtract Condition"));
4112
/* Negated condition requires an opcode change. */
4116
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
4118
/* Handle branch on bit conditions. */
4136
if (strncmp (s, "<", 1) == 0)
4141
else if (strncmp (s, ">=", 2) == 0)
4147
as_bad (_("Invalid Branch On Bit Condition: %c"), *s);
4150
as_bad (_("Missing Branch On Bit Condition"));
4152
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 15);
4154
/* Handle a compare/subtract condition. */
4163
/* 64 bit conditions. */
4175
while (*s != ',' && *s != ' ' && *s != '\t')
4179
if (strcmp (name, "=") == 0)
4181
else if (strcmp (name, "<") == 0)
4183
else if (strcmp (name, "<=") == 0)
4185
else if (strcasecmp (name, "<<") == 0)
4187
else if (strcasecmp (name, "<<=") == 0)
4189
else if (strcasecmp (name, "sv") == 0)
4191
else if (strcasecmp (name, "od") == 0)
4193
else if (strcasecmp (name, "tr") == 0)
4198
else if (strcmp (name, "<>") == 0)
4203
else if (strcmp (name, ">=") == 0)
4208
else if (strcmp (name, ">") == 0)
4213
else if (strcasecmp (name, ">>=") == 0)
4218
else if (strcasecmp (name, ">>") == 0)
4223
else if (strcasecmp (name, "nsv") == 0)
4228
else if (strcasecmp (name, "ev") == 0)
4233
/* ",*" is a valid condition. */
4234
else if (*args != 'S' || *name)
4235
as_bad (_("Invalid Compare/Subtract Condition: %s"),
4239
/* Except with "db", we have a match failure with
4240
'S' if we don't have a doubleword condition. */
4241
else if (*args == 'S' && need_cond)
4244
opcode |= cmpltr << 13;
4245
INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
4247
/* Handle a non-negated compare condition. */
4249
cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s);
4252
as_bad (_("Invalid Compare/Subtract Condition"));
4255
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
4257
/* Handle a 32 bit compare and branch condition. */
4260
cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s);
4264
cmpltr = pa_parse_neg_cmpsub_cmpltr (&s);
4267
as_bad (_("Invalid Compare and Branch Condition"));
4272
/* Negated condition requires an opcode change. */
4277
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
4279
/* Handle a 64 bit compare and branch condition. */
4281
cmpltr = pa_parse_cmpb_64_cmpltr (&s);
4284
/* Negated condition requires an opcode change. */
4285
opcode |= (cmpltr & 8) << 26;
4288
/* Not a 64 bit cond. Give 32 bit a chance. */
4291
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr & 7, 13);
4293
/* Handle a 64 bit cmpib condition. */
4295
cmpltr = pa_parse_cmpib_64_cmpltr (&s);
4297
/* Not a 64 bit cond. Give 32 bit a chance. */
4300
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
4302
/* Handle a logical instruction condition. */
4311
/* 64 bit conditions. */
4323
while (*s != ',' && *s != ' ' && *s != '\t')
4328
if (strcmp (name, "=") == 0)
4330
else if (strcmp (name, "<") == 0)
4332
else if (strcmp (name, "<=") == 0)
4334
else if (strcasecmp (name, "od") == 0)
4336
else if (strcasecmp (name, "tr") == 0)
4341
else if (strcmp (name, "<>") == 0)
4346
else if (strcmp (name, ">=") == 0)
4351
else if (strcmp (name, ">") == 0)
4356
else if (strcasecmp (name, "ev") == 0)
4361
/* ",*" is a valid condition. */
4362
else if (*args != 'L' || *name)
4363
as_bad (_("Invalid Logical Instruction Condition."));
4366
/* 32-bit is default for no condition. */
4367
else if (*args == 'L')
4370
opcode |= cmpltr << 13;
4371
INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
4373
/* Handle a shift/extract/deposit condition. */
4378
/* Check immediate values in shift/extract/deposit
4379
* instructions if they will give undefined behaviour. */
4380
immediate_check = 1;
4385
/* 64 bit conditions. */
4397
while (*s != ',' && *s != ' ' && *s != '\t')
4401
if (strcmp (name, "=") == 0)
4403
else if (strcmp (name, "<") == 0)
4405
else if (strcasecmp (name, "od") == 0)
4407
else if (strcasecmp (name, "tr") == 0)
4409
else if (strcmp (name, "<>") == 0)
4411
else if (strcmp (name, ">=") == 0)
4413
else if (strcasecmp (name, "ev") == 0)
4415
/* Handle movb,n. Put things back the way they were.
4416
This includes moving s back to where it started. */
4417
else if (strcasecmp (name, "n") == 0 && *args == 'y')
4423
/* ",*" is a valid condition. */
4424
else if (*args != 'X' || *name)
4425
as_bad (_("Invalid Shift/Extract/Deposit Condition."));
4429
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
4431
/* Handle a unit instruction condition. */
4441
/* 64 bit conditions. */
4452
/* The uxor instruction only supports unit conditions
4453
not involving carries. */
4454
uxor = (opcode & 0xfc000fc0) == 0x08000380;
4455
if (strncasecmp (s, "sbz", 3) == 0)
4460
else if (strncasecmp (s, "shz", 3) == 0)
4465
else if (!uxor && strncasecmp (s, "sdc", 3) == 0)
4470
else if (!uxor && strncasecmp (s, "sbc", 3) == 0)
4475
else if (!uxor && strncasecmp (s, "shc", 3) == 0)
4480
else if (strncasecmp (s, "tr", 2) == 0)
4486
else if (strncasecmp (s, "nbz", 3) == 0)
4492
else if (strncasecmp (s, "nhz", 3) == 0)
4498
else if (!uxor && strncasecmp (s, "ndc", 3) == 0)
4504
else if (!uxor && strncasecmp (s, "nbc", 3) == 0)
4510
else if (!uxor && strncasecmp (s, "nhc", 3) == 0)
4516
else if (strncasecmp (s, "swz", 3) == 0)
4522
else if (!uxor && strncasecmp (s, "swc", 3) == 0)
4528
else if (strncasecmp (s, "nwz", 3) == 0)
4534
else if (!uxor && strncasecmp (s, "nwc", 3) == 0)
4540
/* ",*" is a valid condition. */
4541
else if (*args != 'U' || (*s != ' ' && *s != '\t'))
4542
as_bad (_("Invalid Unit Instruction Condition."));
4544
/* 32-bit is default for no condition. */
4545
else if (*args == 'U')
4548
opcode |= cmpltr << 13;
4549
INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
4557
/* Handle a nullification completer for branch instructions. */
4559
nullif = pa_parse_nullif (&s);
4560
INSERT_FIELD_AND_CONTINUE (opcode, nullif, 1);
4562
/* Handle a nullification completer for copr and spop insns. */
4564
nullif = pa_parse_nullif (&s);
4565
INSERT_FIELD_AND_CONTINUE (opcode, nullif, 5);
4567
/* Handle ,%r2 completer for new syntax branches. */
4569
if (*s == ',' && strncasecmp (s + 1, "%r2", 3) == 0)
4571
else if (*s == ',' && strncasecmp (s + 1, "%rp", 3) == 0)
4577
/* Handle 3 bit entry into the fp compare array. Valid values
4578
are 0..6 inclusive. */
4582
if (the_insn.exp.X_op == O_constant)
4584
num = evaluate_absolute (&the_insn);
4585
CHECK_FIELD (num, 6, 0, 0);
4587
INSERT_FIELD_AND_CONTINUE (opcode, num, 13);
4592
/* Handle 3 bit entry into the fp compare array. Valid values
4593
are 0..6 inclusive. */
4596
if (the_insn.exp.X_op == O_constant)
4599
num = evaluate_absolute (&the_insn);
4600
CHECK_FIELD (num, 6, 0, 0);
4601
num = (num + 1) ^ 1;
4602
INSERT_FIELD_AND_CONTINUE (opcode, num, 13);
4607
/* Handle graphics test completers for ftest */
4610
num = pa_parse_ftest_gfx_completer (&s);
4611
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
4614
/* Handle a 11 bit immediate at 31. */
4616
the_insn.field_selector = pa_chk_field_selector (&s);
4619
if (the_insn.exp.X_op == O_constant)
4621
num = evaluate_absolute (&the_insn);
4622
CHECK_FIELD (num, 1023, -1024, 0);
4623
num = low_sign_unext (num, 11);
4624
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
4628
if (is_DP_relative (the_insn.exp))
4629
the_insn.reloc = R_HPPA_GOTOFF;
4630
else if (is_PC_relative (the_insn.exp))
4631
the_insn.reloc = R_HPPA_PCREL_CALL;
4633
else if (is_tls_gdidx (the_insn.exp))
4634
the_insn.reloc = R_PARISC_TLS_GD21L;
4635
else if (is_tls_ldidx (the_insn.exp))
4636
the_insn.reloc = R_PARISC_TLS_LDM21L;
4637
else if (is_tls_dtpoff (the_insn.exp))
4638
the_insn.reloc = R_PARISC_TLS_LDO21L;
4639
else if (is_tls_ieoff (the_insn.exp))
4640
the_insn.reloc = R_PARISC_TLS_IE21L;
4641
else if (is_tls_leoff (the_insn.exp))
4642
the_insn.reloc = R_PARISC_TLS_LE21L;
4645
the_insn.reloc = R_HPPA;
4646
the_insn.format = 11;
4650
/* Handle a 14 bit immediate at 31. */
4652
the_insn.field_selector = pa_chk_field_selector (&s);
4655
if (the_insn.exp.X_op == O_constant)
4659
/* XXX the completer stored away tidbits of information
4660
for us to extract. We need a cleaner way to do this.
4661
Now that we have lots of letters again, it would be
4662
good to rethink this. */
4665
num = evaluate_absolute (&the_insn);
4666
if (mb != (num < 0))
4668
CHECK_FIELD (num, 8191, -8192, 0);
4669
num = low_sign_unext (num, 14);
4670
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
4674
/* Handle a 14 bit immediate at 31. */
4676
the_insn.field_selector = pa_chk_field_selector (&s);
4679
if (the_insn.exp.X_op == O_constant)
4685
num = evaluate_absolute (&the_insn);
4686
if (mb == (num < 0))
4690
CHECK_FIELD (num, 8191, -8192, 0);
4691
num = low_sign_unext (num, 14);
4692
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
4696
/* Handle a 16 bit immediate at 31. */
4698
the_insn.field_selector = pa_chk_field_selector (&s);
4701
if (the_insn.exp.X_op == O_constant)
4707
num = evaluate_absolute (&the_insn);
4708
if (mb != (num < 0))
4710
CHECK_FIELD (num, 32767, -32768, 0);
4711
num = re_assemble_16 (num);
4712
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
4716
/* Handle a 16 bit immediate at 31. */
4718
the_insn.field_selector = pa_chk_field_selector (&s);
4721
if (the_insn.exp.X_op == O_constant)
4727
num = evaluate_absolute (&the_insn);
4728
if (mb == (num < 0))
4732
CHECK_FIELD (num, 32767, -32768, 0);
4733
num = re_assemble_16 (num);
4734
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
4738
/* Handle 14 bit immediate, shifted left three times. */
4740
if (bfd_get_mach (stdoutput) != pa20)
4742
the_insn.field_selector = pa_chk_field_selector (&s);
4745
if (the_insn.exp.X_op == O_constant)
4747
num = evaluate_absolute (&the_insn);
4750
CHECK_FIELD (num, 8191, -8192, 0);
4755
INSERT_FIELD_AND_CONTINUE (opcode, num, 4);
4759
if (is_DP_relative (the_insn.exp))
4760
the_insn.reloc = R_HPPA_GOTOFF;
4761
else if (is_PC_relative (the_insn.exp))
4762
the_insn.reloc = R_HPPA_PCREL_CALL;
4764
else if (is_tls_gdidx (the_insn.exp))
4765
the_insn.reloc = R_PARISC_TLS_GD21L;
4766
else if (is_tls_ldidx (the_insn.exp))
4767
the_insn.reloc = R_PARISC_TLS_LDM21L;
4768
else if (is_tls_dtpoff (the_insn.exp))
4769
the_insn.reloc = R_PARISC_TLS_LDO21L;
4770
else if (is_tls_ieoff (the_insn.exp))
4771
the_insn.reloc = R_PARISC_TLS_IE21L;
4772
else if (is_tls_leoff (the_insn.exp))
4773
the_insn.reloc = R_PARISC_TLS_LE21L;
4776
the_insn.reloc = R_HPPA;
4777
the_insn.format = 14;
4782
/* Handle 14 bit immediate, shifted left twice. */
4784
the_insn.field_selector = pa_chk_field_selector (&s);
4787
if (the_insn.exp.X_op == O_constant)
4789
num = evaluate_absolute (&the_insn);
4792
CHECK_FIELD (num, 8191, -8192, 0);
4797
INSERT_FIELD_AND_CONTINUE (opcode, num, 3);
4801
if (is_DP_relative (the_insn.exp))
4802
the_insn.reloc = R_HPPA_GOTOFF;
4803
else if (is_PC_relative (the_insn.exp))
4804
the_insn.reloc = R_HPPA_PCREL_CALL;
4806
else if (is_tls_gdidx (the_insn.exp))
4807
the_insn.reloc = R_PARISC_TLS_GD21L;
4808
else if (is_tls_ldidx (the_insn.exp))
4809
the_insn.reloc = R_PARISC_TLS_LDM21L;
4810
else if (is_tls_dtpoff (the_insn.exp))
4811
the_insn.reloc = R_PARISC_TLS_LDO21L;
4812
else if (is_tls_ieoff (the_insn.exp))
4813
the_insn.reloc = R_PARISC_TLS_IE21L;
4814
else if (is_tls_leoff (the_insn.exp))
4815
the_insn.reloc = R_PARISC_TLS_LE21L;
4818
the_insn.reloc = R_HPPA;
4819
the_insn.format = 14;
4823
/* Handle a 14 bit immediate at 31. */
4825
the_insn.field_selector = pa_chk_field_selector (&s);
4828
if (the_insn.exp.X_op == O_constant)
4830
num = evaluate_absolute (&the_insn);
4831
CHECK_FIELD (num, 8191, -8192, 0);
4832
num = low_sign_unext (num, 14);
4833
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
4837
if (is_DP_relative (the_insn.exp))
4838
the_insn.reloc = R_HPPA_GOTOFF;
4839
else if (is_PC_relative (the_insn.exp))
4840
the_insn.reloc = R_HPPA_PCREL_CALL;
4842
else if (is_tls_gdidx (the_insn.exp))
4843
the_insn.reloc = R_PARISC_TLS_GD21L;
4844
else if (is_tls_ldidx (the_insn.exp))
4845
the_insn.reloc = R_PARISC_TLS_LDM21L;
4846
else if (is_tls_dtpoff (the_insn.exp))
4847
the_insn.reloc = R_PARISC_TLS_LDO21L;
4848
else if (is_tls_ieoff (the_insn.exp))
4849
the_insn.reloc = R_PARISC_TLS_IE21L;
4850
else if (is_tls_leoff (the_insn.exp))
4851
the_insn.reloc = R_PARISC_TLS_LE21L;
4854
the_insn.reloc = R_HPPA;
4855
the_insn.format = 14;
4859
/* Handle a 21 bit immediate at 31. */
4861
the_insn.field_selector = pa_chk_field_selector (&s);
4864
if (the_insn.exp.X_op == O_constant)
4866
num = evaluate_absolute (&the_insn);
4867
CHECK_FIELD (num >> 11, 1048575, -1048576, 0);
4868
opcode |= re_assemble_21 (num);
4873
if (is_DP_relative (the_insn.exp))
4874
the_insn.reloc = R_HPPA_GOTOFF;
4875
else if (is_PC_relative (the_insn.exp))
4876
the_insn.reloc = R_HPPA_PCREL_CALL;
4878
else if (is_tls_gdidx (the_insn.exp))
4879
the_insn.reloc = R_PARISC_TLS_GD21L;
4880
else if (is_tls_ldidx (the_insn.exp))
4881
the_insn.reloc = R_PARISC_TLS_LDM21L;
4882
else if (is_tls_dtpoff (the_insn.exp))
4883
the_insn.reloc = R_PARISC_TLS_LDO21L;
4884
else if (is_tls_ieoff (the_insn.exp))
4885
the_insn.reloc = R_PARISC_TLS_IE21L;
4886
else if (is_tls_leoff (the_insn.exp))
4887
the_insn.reloc = R_PARISC_TLS_LE21L;
4890
the_insn.reloc = R_HPPA;
4891
the_insn.format = 21;
4895
/* Handle a 16 bit immediate at 31 (PA 2.0 wide mode only). */
4897
the_insn.field_selector = pa_chk_field_selector (&s);
4900
if (the_insn.exp.X_op == O_constant)
4902
num = evaluate_absolute (&the_insn);
4903
CHECK_FIELD (num, 32767, -32768, 0);
4904
opcode |= re_assemble_16 (num);
4909
/* ??? Is this valid for wide mode? */
4910
if (is_DP_relative (the_insn.exp))
4911
the_insn.reloc = R_HPPA_GOTOFF;
4912
else if (is_PC_relative (the_insn.exp))
4913
the_insn.reloc = R_HPPA_PCREL_CALL;
4915
else if (is_tls_gdidx (the_insn.exp))
4916
the_insn.reloc = R_PARISC_TLS_GD21L;
4917
else if (is_tls_ldidx (the_insn.exp))
4918
the_insn.reloc = R_PARISC_TLS_LDM21L;
4919
else if (is_tls_dtpoff (the_insn.exp))
4920
the_insn.reloc = R_PARISC_TLS_LDO21L;
4921
else if (is_tls_ieoff (the_insn.exp))
4922
the_insn.reloc = R_PARISC_TLS_IE21L;
4923
else if (is_tls_leoff (the_insn.exp))
4924
the_insn.reloc = R_PARISC_TLS_LE21L;
4927
the_insn.reloc = R_HPPA;
4928
the_insn.format = 14;
4932
/* Handle a word-aligned 16-bit imm. at 31 (PA2.0 wide). */
4934
the_insn.field_selector = pa_chk_field_selector (&s);
4937
if (the_insn.exp.X_op == O_constant)
4939
num = evaluate_absolute (&the_insn);
4940
CHECK_FIELD (num, 32767, -32768, 0);
4941
CHECK_ALIGN (num, 4, 0);
4942
opcode |= re_assemble_16 (num);
4947
/* ??? Is this valid for wide mode? */
4948
if (is_DP_relative (the_insn.exp))
4949
the_insn.reloc = R_HPPA_GOTOFF;
4950
else if (is_PC_relative (the_insn.exp))
4951
the_insn.reloc = R_HPPA_PCREL_CALL;
4953
else if (is_tls_gdidx (the_insn.exp))
4954
the_insn.reloc = R_PARISC_TLS_GD21L;
4955
else if (is_tls_ldidx (the_insn.exp))
4956
the_insn.reloc = R_PARISC_TLS_LDM21L;
4957
else if (is_tls_dtpoff (the_insn.exp))
4958
the_insn.reloc = R_PARISC_TLS_LDO21L;
4959
else if (is_tls_ieoff (the_insn.exp))
4960
the_insn.reloc = R_PARISC_TLS_IE21L;
4961
else if (is_tls_leoff (the_insn.exp))
4962
the_insn.reloc = R_PARISC_TLS_LE21L;
4965
the_insn.reloc = R_HPPA;
4966
the_insn.format = 14;
4970
/* Handle a dword-aligned 16-bit imm. at 31 (PA2.0 wide). */
4972
the_insn.field_selector = pa_chk_field_selector (&s);
4975
if (the_insn.exp.X_op == O_constant)
4977
num = evaluate_absolute (&the_insn);
4978
CHECK_FIELD (num, 32767, -32768, 0);
4979
CHECK_ALIGN (num, 8, 0);
4980
opcode |= re_assemble_16 (num);
4985
/* ??? Is this valid for wide mode? */
4986
if (is_DP_relative (the_insn.exp))
4987
the_insn.reloc = R_HPPA_GOTOFF;
4988
else if (is_PC_relative (the_insn.exp))
4989
the_insn.reloc = R_HPPA_PCREL_CALL;
4991
else if (is_tls_gdidx (the_insn.exp))
4992
the_insn.reloc = R_PARISC_TLS_GD21L;
4993
else if (is_tls_ldidx (the_insn.exp))
4994
the_insn.reloc = R_PARISC_TLS_LDM21L;
4995
else if (is_tls_dtpoff (the_insn.exp))
4996
the_insn.reloc = R_PARISC_TLS_LDO21L;
4997
else if (is_tls_ieoff (the_insn.exp))
4998
the_insn.reloc = R_PARISC_TLS_IE21L;
4999
else if (is_tls_leoff (the_insn.exp))
5000
the_insn.reloc = R_PARISC_TLS_LE21L;
5003
the_insn.reloc = R_HPPA;
5004
the_insn.format = 14;
5008
/* Handle a 12 bit branch displacement. */
5010
the_insn.field_selector = pa_chk_field_selector (&s);
5014
if (!the_insn.exp.X_add_symbol
5015
|| !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
5018
num = evaluate_absolute (&the_insn);
5021
as_bad (_("Branch to unaligned address"));
5024
if (the_insn.exp.X_add_symbol)
5026
CHECK_FIELD (num, 8191, -8192, 0);
5027
opcode |= re_assemble_12 (num >> 2);
5032
the_insn.reloc = R_HPPA_PCREL_CALL;
5033
the_insn.format = 12;
5034
the_insn.arg_reloc = last_call_desc.arg_reloc;
5035
memset (&last_call_desc, 0, sizeof (struct call_desc));
5040
/* Handle a 17 bit branch displacement. */
5042
the_insn.field_selector = pa_chk_field_selector (&s);
5046
if (!the_insn.exp.X_add_symbol
5047
|| !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
5050
num = evaluate_absolute (&the_insn);
5053
as_bad (_("Branch to unaligned address"));
5056
if (the_insn.exp.X_add_symbol)
5058
CHECK_FIELD (num, 262143, -262144, 0);
5059
opcode |= re_assemble_17 (num >> 2);
5064
the_insn.reloc = R_HPPA_PCREL_CALL;
5065
the_insn.format = 17;
5066
the_insn.arg_reloc = last_call_desc.arg_reloc;
5067
memset (&last_call_desc, 0, sizeof (struct call_desc));
5071
/* Handle a 22 bit branch displacement. */
5073
the_insn.field_selector = pa_chk_field_selector (&s);
5077
if (!the_insn.exp.X_add_symbol
5078
|| !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
5081
num = evaluate_absolute (&the_insn);
5084
as_bad (_("Branch to unaligned address"));
5087
if (the_insn.exp.X_add_symbol)
5089
CHECK_FIELD (num, 8388607, -8388608, 0);
5090
opcode |= re_assemble_22 (num >> 2);
5094
the_insn.reloc = R_HPPA_PCREL_CALL;
5095
the_insn.format = 22;
5096
the_insn.arg_reloc = last_call_desc.arg_reloc;
5097
memset (&last_call_desc, 0, sizeof (struct call_desc));
5101
/* Handle an absolute 17 bit branch target. */
5103
the_insn.field_selector = pa_chk_field_selector (&s);
5107
if (!the_insn.exp.X_add_symbol
5108
|| !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
5111
num = evaluate_absolute (&the_insn);
5114
as_bad (_("Branch to unaligned address"));
5117
if (the_insn.exp.X_add_symbol)
5119
CHECK_FIELD (num, 262143, -262144, 0);
5120
opcode |= re_assemble_17 (num >> 2);
5125
the_insn.reloc = R_HPPA_ABS_CALL;
5126
the_insn.format = 17;
5127
the_insn.arg_reloc = last_call_desc.arg_reloc;
5128
memset (&last_call_desc, 0, sizeof (struct call_desc));
5132
/* Handle '%r1' implicit operand of addil instruction. */
5134
if (*s == ',' && *(s + 1) == '%' && *(s + 3) == '1'
5135
&& (*(s + 2) == 'r' || *(s + 2) == 'R'))
5143
/* Handle '%sr0,%r31' implicit operand of be,l instruction. */
5145
if (strncasecmp (s, "%sr0,%r31", 9) != 0)
5150
/* Handle immediate value of 0 for ordered load/store instructions. */
5157
/* Handle a 2 bit shift count at 25. */
5159
num = pa_get_absolute_expression (&the_insn, &s);
5160
if (strict && the_insn.exp.X_op != O_constant)
5163
CHECK_FIELD (num, 3, 1, strict);
5164
INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
5166
/* Handle a 4 bit shift count at 25. */
5168
num = pa_get_absolute_expression (&the_insn, &s);
5169
if (strict && the_insn.exp.X_op != O_constant)
5172
CHECK_FIELD (num, 15, 0, strict);
5173
INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
5175
/* Handle a 5 bit shift count at 26. */
5177
num = pa_get_absolute_expression (&the_insn, &s);
5178
if (strict && the_insn.exp.X_op != O_constant)
5181
CHECK_FIELD (num, 31, 0, strict);
5182
SAVE_IMMEDIATE(num);
5183
INSERT_FIELD_AND_CONTINUE (opcode, 31 - num, 5);
5185
/* Handle a 6 bit shift count at 20,22:26. */
5187
num = pa_get_absolute_expression (&the_insn, &s);
5188
if (strict && the_insn.exp.X_op != O_constant)
5191
CHECK_FIELD (num, 63, 0, strict);
5192
SAVE_IMMEDIATE(num);
5194
opcode |= (num & 0x20) << 6;
5195
INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 5);
5197
/* Handle a 6 bit field length at 23,27:31. */
5200
num = pa_get_absolute_expression (&the_insn, &s);
5201
if (strict && the_insn.exp.X_op != O_constant)
5204
CHECK_FIELD (num, 64, 1, strict);
5205
SAVE_IMMEDIATE(num);
5207
opcode |= (num & 0x20) << 3;
5208
num = 31 - (num & 0x1f);
5209
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5211
/* Handle a 6 bit field length at 19,27:31. */
5213
num = pa_get_absolute_expression (&the_insn, &s);
5214
if (strict && the_insn.exp.X_op != O_constant)
5217
CHECK_FIELD (num, 64, 1, strict);
5218
SAVE_IMMEDIATE(num);
5220
opcode |= (num & 0x20) << 7;
5221
num = 31 - (num & 0x1f);
5222
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5224
/* Handle a 5 bit bit position at 26. */
5226
num = pa_get_absolute_expression (&the_insn, &s);
5227
if (strict && the_insn.exp.X_op != O_constant)
5230
CHECK_FIELD (num, 31, 0, strict);
5231
SAVE_IMMEDIATE(num);
5232
INSERT_FIELD_AND_CONTINUE (opcode, num, 5);
5234
/* Handle a 6 bit bit position at 20,22:26. */
5236
num = pa_get_absolute_expression (&the_insn, &s);
5237
if (strict && the_insn.exp.X_op != O_constant)
5240
CHECK_FIELD (num, 63, 0, strict);
5241
SAVE_IMMEDIATE(num);
5242
opcode |= (num & 0x20) << 6;
5243
INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 5);
5245
/* Handle a 5 bit immediate at 10 with 'd' as the complement
5246
of the high bit of the immediate. */
5248
num = pa_get_absolute_expression (&the_insn, &s);
5249
if (strict && the_insn.exp.X_op != O_constant)
5252
CHECK_FIELD (num, 63, 0, strict);
5256
opcode |= (1 << 13);
5257
INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 21);
5259
/* Handle a 5 bit immediate at 10. */
5261
num = pa_get_absolute_expression (&the_insn, &s);
5262
if (strict && the_insn.exp.X_op != O_constant)
5265
CHECK_FIELD (num, 31, 0, strict);
5266
INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
5268
/* Handle a 9 bit immediate at 28. */
5270
num = pa_get_absolute_expression (&the_insn, &s);
5271
if (strict && the_insn.exp.X_op != O_constant)
5274
CHECK_FIELD (num, 511, 1, strict);
5275
INSERT_FIELD_AND_CONTINUE (opcode, num, 3);
5277
/* Handle a 13 bit immediate at 18. */
5279
num = pa_get_absolute_expression (&the_insn, &s);
5280
if (strict && the_insn.exp.X_op != O_constant)
5283
CHECK_FIELD (num, 8191, 0, strict);
5284
INSERT_FIELD_AND_CONTINUE (opcode, num, 13);
5286
/* Handle a 26 bit immediate at 31. */
5288
num = pa_get_absolute_expression (&the_insn, &s);
5289
if (strict && the_insn.exp.X_op != O_constant)
5292
CHECK_FIELD (num, 67108863, 0, strict);
5293
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5295
/* Handle a 3 bit SFU identifier at 25. */
5298
as_bad (_("Invalid SFU identifier"));
5299
num = pa_get_number (&the_insn, &s);
5300
if (strict && the_insn.exp.X_op != O_constant)
5303
CHECK_FIELD (num, 7, 0, strict);
5304
INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
5306
/* Handle a 20 bit SOP field for spop0. */
5308
num = pa_get_number (&the_insn, &s);
5309
if (strict && the_insn.exp.X_op != O_constant)
5312
CHECK_FIELD (num, 1048575, 0, strict);
5313
num = (num & 0x1f) | ((num & 0x000fffe0) << 6);
5314
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5316
/* Handle a 15bit SOP field for spop1. */
5318
num = pa_get_number (&the_insn, &s);
5319
if (strict && the_insn.exp.X_op != O_constant)
5322
CHECK_FIELD (num, 32767, 0, strict);
5323
INSERT_FIELD_AND_CONTINUE (opcode, num, 11);
5325
/* Handle a 10bit SOP field for spop3. */
5327
num = pa_get_number (&the_insn, &s);
5328
if (strict && the_insn.exp.X_op != O_constant)
5331
CHECK_FIELD (num, 1023, 0, strict);
5332
num = (num & 0x1f) | ((num & 0x000003e0) << 6);
5333
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5335
/* Handle a 15 bit SOP field for spop2. */
5337
num = pa_get_number (&the_insn, &s);
5338
if (strict && the_insn.exp.X_op != O_constant)
5341
CHECK_FIELD (num, 32767, 0, strict);
5342
num = (num & 0x1f) | ((num & 0x00007fe0) << 6);
5343
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5345
/* Handle a 3-bit co-processor ID field. */
5348
as_bad (_("Invalid COPR identifier"));
5349
num = pa_get_number (&the_insn, &s);
5350
if (strict && the_insn.exp.X_op != O_constant)
5353
CHECK_FIELD (num, 7, 0, strict);
5354
INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
5356
/* Handle a 22bit SOP field for copr. */
5358
num = pa_get_number (&the_insn, &s);
5359
if (strict && the_insn.exp.X_op != O_constant)
5362
CHECK_FIELD (num, 4194303, 0, strict);
5363
num = (num & 0x1f) | ((num & 0x003fffe0) << 4);
5364
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5366
/* Handle a source FP operand format completer. */
5368
if (*s == ',' && *(s+1) == 't')
5375
flag = pa_parse_fp_cnv_format (&s);
5376
the_insn.fpof1 = flag;
5377
if (flag == W || flag == UW)
5379
if (flag == DW || flag == UDW)
5381
if (flag == QW || flag == UQW)
5383
INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
5385
/* Handle a destination FP operand format completer. */
5387
/* pa_parse_format needs the ',' prefix. */
5389
flag = pa_parse_fp_cnv_format (&s);
5390
the_insn.fpof2 = flag;
5391
if (flag == W || flag == UW)
5393
if (flag == DW || flag == UDW)
5395
if (flag == QW || flag == UQW)
5397
opcode |= flag << 13;
5398
if (the_insn.fpof1 == SGL
5399
|| the_insn.fpof1 == DBL
5400
|| the_insn.fpof1 == QUAD)
5402
if (the_insn.fpof2 == SGL
5403
|| the_insn.fpof2 == DBL
5404
|| the_insn.fpof2 == QUAD)
5406
else if (the_insn.fpof2 == W
5407
|| the_insn.fpof2 == DW
5408
|| the_insn.fpof2 == QW)
5410
else if (the_insn.fpof2 == UW
5411
|| the_insn.fpof2 == UDW
5412
|| the_insn.fpof2 == UQW)
5417
else if (the_insn.fpof1 == W
5418
|| the_insn.fpof1 == DW
5419
|| the_insn.fpof1 == QW)
5421
if (the_insn.fpof2 == SGL
5422
|| the_insn.fpof2 == DBL
5423
|| the_insn.fpof2 == QUAD)
5428
else if (the_insn.fpof1 == UW
5429
|| the_insn.fpof1 == UDW
5430
|| the_insn.fpof1 == UQW)
5432
if (the_insn.fpof2 == SGL
5433
|| the_insn.fpof2 == DBL
5434
|| the_insn.fpof2 == QUAD)
5439
flag |= the_insn.trunc;
5440
INSERT_FIELD_AND_CONTINUE (opcode, flag, 15);
5442
/* Handle a source FP operand format completer. */
5444
flag = pa_parse_fp_format (&s);
5445
the_insn.fpof1 = flag;
5446
INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
5448
/* Handle a destination FP operand format completer. */
5450
/* pa_parse_format needs the ',' prefix. */
5452
flag = pa_parse_fp_format (&s);
5453
the_insn.fpof2 = flag;
5454
INSERT_FIELD_AND_CONTINUE (opcode, flag, 13);
5456
/* Handle a source FP operand format completer at 20. */
5458
flag = pa_parse_fp_format (&s);
5459
the_insn.fpof1 = flag;
5460
INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
5462
/* Handle a floating point operand format at 26.
5463
Only allows single and double precision. */
5465
flag = pa_parse_fp_format (&s);
5471
the_insn.fpof1 = flag;
5477
as_bad (_("Invalid Floating Point Operand Format."));
5481
/* Handle all floating point registers. */
5485
/* Float target register. */
5487
if (!pa_parse_number (&s, 3))
5489
/* RSEL should not be set. */
5490
if (pa_number & FP_REG_RSEL)
5492
num = pa_number - FP_REG_BASE;
5493
CHECK_FIELD (num, 31, 0, 0);
5494
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5496
/* Float target register with L/R selection. */
5499
if (!pa_parse_number (&s, 1))
5501
num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5502
CHECK_FIELD (num, 31, 0, 0);
5505
/* 0x30 opcodes are FP arithmetic operation opcodes
5506
and need to be turned into 0x38 opcodes. This
5507
is not necessary for loads/stores. */
5508
if (need_pa11_opcode ()
5509
&& ((opcode & 0xfc000000) == 0x30000000))
5512
opcode |= (pa_number & FP_REG_RSEL ? 1 << 6 : 0);
5516
/* Float operand 1. */
5519
if (!pa_parse_number (&s, 1))
5521
num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5522
CHECK_FIELD (num, 31, 0, 0);
5523
opcode |= num << 21;
5524
if (need_pa11_opcode ())
5526
opcode |= (pa_number & FP_REG_RSEL ? 1 << 7 : 0);
5532
/* Float operand 1 with L/R selection. */
5536
if (!pa_parse_number (&s, 1))
5538
num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5539
CHECK_FIELD (num, 31, 0, 0);
5540
opcode |= num << 21;
5541
opcode |= (pa_number & FP_REG_RSEL ? 1 << 7 : 0);
5545
/* Float operand 2. */
5548
if (!pa_parse_number (&s, 1))
5550
num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5551
CHECK_FIELD (num, 31, 0, 0);
5552
opcode |= num << 16;
5553
if (need_pa11_opcode ())
5555
opcode |= (pa_number & FP_REG_RSEL ? 1 << 12 : 0);
5561
/* Float operand 2 with L/R selection. */
5564
if (!pa_parse_number (&s, 1))
5566
num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5567
CHECK_FIELD (num, 31, 0, 0);
5568
opcode |= num << 16;
5569
opcode |= (pa_number & FP_REG_RSEL ? 1 << 12 : 0);
5573
/* Float operand 3 for fmpyfadd, fmpynfadd. */
5576
if (!pa_parse_number (&s, 1))
5578
num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5579
CHECK_FIELD (num, 31, 0, 0);
5580
opcode |= (num & 0x1c) << 11;
5581
opcode |= (num & 0x03) << 9;
5582
opcode |= (pa_number & FP_REG_RSEL ? 1 << 8 : 0);
5586
/* Float mult operand 1 for fmpyadd, fmpysub */
5589
if (!pa_parse_number (&s, 1))
5591
num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5592
CHECK_FIELD (num, 31, 0, 0);
5593
if (the_insn.fpof1 == SGL)
5597
as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5601
num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
5603
INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
5606
/* Float mult operand 2 for fmpyadd, fmpysub */
5609
if (!pa_parse_number (&s, 1))
5611
num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5612
CHECK_FIELD (num, 31, 0, 0);
5613
if (the_insn.fpof1 == SGL)
5617
as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5621
num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
5623
INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
5626
/* Float mult target for fmpyadd, fmpysub */
5629
if (!pa_parse_number (&s, 1))
5631
num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5632
CHECK_FIELD (num, 31, 0, 0);
5633
if (the_insn.fpof1 == SGL)
5637
as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5641
num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
5643
INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5646
/* Float add operand 1 for fmpyadd, fmpysub */
5649
if (!pa_parse_number (&s, 1))
5651
num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5652
CHECK_FIELD (num, 31, 0, 0);
5653
if (the_insn.fpof1 == SGL)
5657
as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5661
num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
5663
INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
5666
/* Float add target for fmpyadd, fmpysub */
5669
if (!pa_parse_number (&s, 1))
5671
num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5672
CHECK_FIELD (num, 31, 0, 0);
5673
if (the_insn.fpof1 == SGL)
5677
as_bad (_("Invalid register for single precision fmpyadd or fmpysub"));
5681
num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
5683
INSERT_FIELD_AND_CONTINUE (opcode, num, 11);
5686
/* Handle L/R register halves like 'x'. */
5690
if (!pa_parse_number (&s, 1))
5692
num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5693
CHECK_FIELD (num, 31, 0, 0);
5694
opcode |= num << 16;
5695
if (need_pa11_opcode ())
5697
opcode |= (pa_number & FP_REG_RSEL ? 1 << 1 : 0);
5702
/* Float target register (PA 2.0 wide). */
5704
if (!pa_parse_number (&s, 3))
5706
num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5707
CHECK_FIELD (num, 31, 0, 0);
5708
INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
5721
/* If this instruction is specific to a particular architecture,
5722
then set a new architecture. This automatic promotion crud is
5723
for compatibility with HP's old assemblers only. */
5725
&& bfd_get_mach (stdoutput) < insn->arch
5726
&& !bfd_set_arch_mach (stdoutput, bfd_arch_hppa, insn->arch))
5728
as_warn (_("could not update architecture and machine"));
5733
/* Check if the args matched. */
5736
if (&insn[1] - pa_opcodes < (int) NUMOPCODES
5737
&& !strcmp (insn->name, insn[1].name))
5745
as_bad (_("Invalid operands %s"), error_message);
5752
if (immediate_check)
5754
if (pos != -1 && len != -1 && pos < len - 1)
5755
as_warn (_("Immediates %d and %d will give undefined behavior."),
5759
the_insn.opcode = opcode;
5762
/* Assemble a single instruction storing it into a frag. */
5765
md_assemble (char *str)
5769
/* The had better be something to assemble. */
5772
/* If we are within a procedure definition, make sure we've
5773
defined a label for the procedure; handle case where the
5774
label was defined after the .PROC directive.
5776
Note there's not need to diddle with the segment or fragment
5777
for the label symbol in this case. We have already switched
5778
into the new $CODE$ subspace at this point. */
5779
if (within_procedure && last_call_info->start_symbol == NULL)
5781
label_symbol_struct *label_symbol = pa_get_label ();
5785
if (label_symbol->lss_label)
5787
last_call_info->start_symbol = label_symbol->lss_label;
5788
symbol_get_bfdsym (label_symbol->lss_label)->flags
5791
/* Also handle allocation of a fixup to hold the unwind
5792
information when the label appears after the proc/procend. */
5793
if (within_entry_exit)
5798
where = frag_more (0);
5799
u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor);
5800
fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
5801
NULL, (offsetT) 0, NULL,
5802
0, R_HPPA_ENTRY, e_fsel, 0, 0, u);
5807
as_bad (_("Missing function name for .PROC (corrupted label chain)"));
5810
as_bad (_("Missing function name for .PROC"));
5813
/* Assemble the instruction. Results are saved into "the_insn". */
5816
/* Get somewhere to put the assembled instruction. */
5819
/* Output the opcode. */
5820
md_number_to_chars (to, the_insn.opcode, 4);
5822
/* If necessary output more stuff. */
5823
if (the_insn.reloc != R_HPPA_NONE)
5824
fix_new_hppa (frag_now, (to - frag_now->fr_literal), 4, NULL,
5825
(offsetT) 0, &the_insn.exp, the_insn.pcrel,
5826
the_insn.reloc, the_insn.field_selector,
5827
the_insn.format, the_insn.arg_reloc, 0);
5830
dwarf2_emit_insn (4);
5835
/* Handle an alignment directive. Special so that we can update the
5836
alignment of the subspace if necessary. */
5838
pa_align (int bytes)
5840
/* We must have a valid space and subspace. */
5841
pa_check_current_space_and_subspace ();
5843
/* Let the generic gas code do most of the work. */
5844
s_align_bytes (bytes);
5846
/* If bytes is a power of 2, then update the current subspace's
5847
alignment if necessary. */
5848
if (exact_log2 (bytes) != -1)
5849
record_alignment (current_subspace->ssd_seg, exact_log2 (bytes));
5853
/* Handle a .BLOCK type pseudo-op. */
5856
pa_block (int z ATTRIBUTE_UNUSED)
5858
unsigned int temp_size;
5861
/* We must have a valid space and subspace. */
5862
pa_check_current_space_and_subspace ();
5865
temp_size = get_absolute_expression ();
5867
if (temp_size > 0x3FFFFFFF)
5869
as_bad (_("Argument to .BLOCK/.BLOCKZ must be between 0 and 0x3fffffff"));
5874
/* Always fill with zeros, that's what the HP assembler does. */
5875
char *p = frag_var (rs_fill, 1, 1, 0, NULL, temp_size, NULL);
5879
pa_undefine_label ();
5880
demand_empty_rest_of_line ();
5883
/* Handle a .begin_brtab and .end_brtab pseudo-op. */
5886
pa_brtab (int begin ATTRIBUTE_UNUSED)
5890
/* The BRTAB relocations are only available in SOM (to denote
5891
the beginning and end of branch tables). */
5892
char *where = frag_more (0);
5894
fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
5895
NULL, (offsetT) 0, NULL,
5896
0, begin ? R_HPPA_BEGIN_BRTAB : R_HPPA_END_BRTAB,
5900
demand_empty_rest_of_line ();
5903
/* Handle a .begin_try and .end_try pseudo-op. */
5906
pa_try (int begin ATTRIBUTE_UNUSED)
5910
char *where = frag_more (0);
5915
/* The TRY relocations are only available in SOM (to denote
5916
the beginning and end of exception handling regions). */
5918
fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
5919
NULL, (offsetT) 0, begin ? NULL : &exp,
5920
0, begin ? R_HPPA_BEGIN_TRY : R_HPPA_END_TRY,
5924
demand_empty_rest_of_line ();
5927
/* Do the dirty work of building a call descriptor which describes
5928
where the caller placed arguments to a function call. */
5931
pa_call_args (struct call_desc *call_desc)
5934
unsigned int temp, arg_reloc;
5936
while (!is_end_of_statement ())
5938
name = input_line_pointer;
5939
c = get_symbol_end ();
5940
/* Process a source argument. */
5941
if ((strncasecmp (name, "argw", 4) == 0))
5943
temp = atoi (name + 4);
5944
p = input_line_pointer;
5946
input_line_pointer++;
5947
name = input_line_pointer;
5948
c = get_symbol_end ();
5949
arg_reloc = pa_build_arg_reloc (name);
5950
call_desc->arg_reloc |= pa_align_arg_reloc (temp, arg_reloc);
5952
/* Process a return value. */
5953
else if ((strncasecmp (name, "rtnval", 6) == 0))
5955
p = input_line_pointer;
5957
input_line_pointer++;
5958
name = input_line_pointer;
5959
c = get_symbol_end ();
5960
arg_reloc = pa_build_arg_reloc (name);
5961
call_desc->arg_reloc |= (arg_reloc & 0x3);
5965
as_bad (_("Invalid .CALL argument: %s"), name);
5967
p = input_line_pointer;
5969
if (!is_end_of_statement ())
5970
input_line_pointer++;
5974
/* Handle a .CALL pseudo-op. This involves storing away information
5975
about where arguments are to be found so the linker can detect
5976
(and correct) argument location mismatches between caller and callee. */
5979
pa_call (int unused ATTRIBUTE_UNUSED)
5982
/* We must have a valid space and subspace. */
5983
pa_check_current_space_and_subspace ();
5986
pa_call_args (&last_call_desc);
5987
demand_empty_rest_of_line ();
5991
/* Build an entry in the UNWIND subspace from the given function
5992
attributes in CALL_INFO. This is not needed for SOM as using
5993
R_ENTRY and R_EXIT relocations allow the linker to handle building
5994
of the unwind spaces. */
5997
pa_build_unwind_subspace (struct call_info *call_info)
5999
asection *seg, *save_seg;
6000
subsegT save_subseg;
6001
unsigned int unwind;
6006
if ((bfd_get_section_flags (stdoutput, now_seg)
6007
& (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
6008
!= (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
6011
if (call_info->start_symbol == NULL)
6012
/* This can happen if there were errors earlier on in the assembly. */
6015
/* Replace the start symbol with a local symbol that will be reduced
6016
to a section offset. This avoids problems with weak functions with
6017
multiple definitions, etc. */
6018
name = xmalloc (strlen ("L$\001start_")
6019
+ strlen (S_GET_NAME (call_info->start_symbol))
6021
strcpy (name, "L$\001start_");
6022
strcat (name, S_GET_NAME (call_info->start_symbol));
6024
/* If we have a .procend preceded by a .exit, then the symbol will have
6025
already been defined. In that case, we don't want another unwind
6027
symbolP = symbol_find (name);
6035
symbolP = symbol_new (name, now_seg,
6036
S_GET_VALUE (call_info->start_symbol), frag_now);
6037
gas_assert (symbolP);
6038
S_CLEAR_EXTERNAL (symbolP);
6039
symbol_table_insert (symbolP);
6042
reloc = R_PARISC_SEGREL32;
6044
save_subseg = now_subseg;
6045
/* Get into the right seg/subseg. This may involve creating
6046
the seg the first time through. Make sure to have the
6047
old seg/subseg so that we can reset things when we are done. */
6048
seg = bfd_get_section_by_name (stdoutput, UNWIND_SECTION_NAME);
6049
if (seg == ASEC_NULL)
6051
seg = subseg_new (UNWIND_SECTION_NAME, 0);
6052
bfd_set_section_flags (stdoutput, seg,
6053
SEC_READONLY | SEC_HAS_CONTENTS
6054
| SEC_LOAD | SEC_RELOC | SEC_ALLOC | SEC_DATA);
6055
bfd_set_section_alignment (stdoutput, seg, 2);
6058
subseg_set (seg, 0);
6060
/* Get some space to hold relocation information for the unwind
6064
/* Relocation info. for start offset of the function. */
6065
md_number_to_chars (p, 0, 4);
6066
fix_new_hppa (frag_now, p - frag_now->fr_literal, 4,
6067
symbolP, (offsetT) 0,
6068
(expressionS *) NULL, 0, reloc,
6071
/* Relocation info. for end offset of the function.
6073
Because we allow reductions of 32bit relocations for ELF, this will be
6074
reduced to section_sym + offset which avoids putting the temporary
6075
symbol into the symbol table. It (should) end up giving the same
6076
value as call_info->start_symbol + function size once the linker is
6077
finished with its work. */
6078
md_number_to_chars (p + 4, 0, 4);
6079
fix_new_hppa (frag_now, p + 4 - frag_now->fr_literal, 4,
6080
call_info->end_symbol, (offsetT) 0,
6081
(expressionS *) NULL, 0, reloc,
6084
/* Dump the descriptor. */
6085
unwind = UNWIND_LOW32 (&call_info->ci_unwind.descriptor);
6086
md_number_to_chars (p + 8, unwind, 4);
6088
unwind = UNWIND_HIGH32 (&call_info->ci_unwind.descriptor);
6089
md_number_to_chars (p + 12, unwind, 4);
6091
/* Return back to the original segment/subsegment. */
6092
subseg_set (save_seg, save_subseg);
6096
/* Process a .CALLINFO pseudo-op. This information is used later
6097
to build unwind descriptors and maybe one day to support
6098
.ENTER and .LEAVE. */
6101
pa_callinfo (int unused ATTRIBUTE_UNUSED)
6107
/* We must have a valid space and subspace. */
6108
pa_check_current_space_and_subspace ();
6111
/* .CALLINFO must appear within a procedure definition. */
6112
if (!within_procedure)
6113
as_bad (_(".callinfo is not within a procedure definition"));
6115
/* Mark the fact that we found the .CALLINFO for the
6116
current procedure. */
6117
callinfo_found = TRUE;
6119
/* Iterate over the .CALLINFO arguments. */
6120
while (!is_end_of_statement ())
6122
name = input_line_pointer;
6123
c = get_symbol_end ();
6124
/* Frame size specification. */
6125
if ((strncasecmp (name, "frame", 5) == 0))
6127
p = input_line_pointer;
6129
input_line_pointer++;
6130
temp = get_absolute_expression ();
6131
if ((temp & 0x3) != 0)
6133
as_bad (_("FRAME parameter must be a multiple of 8: %d\n"), temp);
6137
/* callinfo is in bytes and unwind_desc is in 8 byte units. */
6138
last_call_info->ci_unwind.descriptor.frame_size = temp / 8;
6141
/* Entry register (GR, GR and SR) specifications. */
6142
else if ((strncasecmp (name, "entry_gr", 8) == 0))
6144
p = input_line_pointer;
6146
input_line_pointer++;
6147
temp = get_absolute_expression ();
6148
/* The HP assembler accepts 19 as the high bound for ENTRY_GR
6149
even though %r19 is caller saved. I think this is a bug in
6150
the HP assembler, and we are not going to emulate it. */
6151
if (temp < 3 || temp > 18)
6152
as_bad (_("Value for ENTRY_GR must be in the range 3..18\n"));
6153
last_call_info->ci_unwind.descriptor.entry_gr = temp - 2;
6155
else if ((strncasecmp (name, "entry_fr", 8) == 0))
6157
p = input_line_pointer;
6159
input_line_pointer++;
6160
temp = get_absolute_expression ();
6161
/* Similarly the HP assembler takes 31 as the high bound even
6162
though %fr21 is the last callee saved floating point register. */
6163
if (temp < 12 || temp > 21)
6164
as_bad (_("Value for ENTRY_FR must be in the range 12..21\n"));
6165
last_call_info->ci_unwind.descriptor.entry_fr = temp - 11;
6167
else if ((strncasecmp (name, "entry_sr", 8) == 0))
6169
p = input_line_pointer;
6171
input_line_pointer++;
6172
temp = get_absolute_expression ();
6174
as_bad (_("Value for ENTRY_SR must be 3\n"));
6176
/* Note whether or not this function performs any calls. */
6177
else if ((strncasecmp (name, "calls", 5) == 0) ||
6178
(strncasecmp (name, "caller", 6) == 0))
6180
p = input_line_pointer;
6183
else if ((strncasecmp (name, "no_calls", 8) == 0))
6185
p = input_line_pointer;
6188
/* Should RP be saved into the stack. */
6189
else if ((strncasecmp (name, "save_rp", 7) == 0))
6191
p = input_line_pointer;
6193
last_call_info->ci_unwind.descriptor.save_rp = 1;
6195
/* Likewise for SP. */
6196
else if ((strncasecmp (name, "save_sp", 7) == 0))
6198
p = input_line_pointer;
6200
last_call_info->ci_unwind.descriptor.save_sp = 1;
6202
/* Is this an unwindable procedure. If so mark it so
6203
in the unwind descriptor. */
6204
else if ((strncasecmp (name, "no_unwind", 9) == 0))
6206
p = input_line_pointer;
6208
last_call_info->ci_unwind.descriptor.cannot_unwind = 1;
6210
/* Is this an interrupt routine. If so mark it in the
6211
unwind descriptor. */
6212
else if ((strncasecmp (name, "hpux_int", 7) == 0))
6214
p = input_line_pointer;
6216
last_call_info->ci_unwind.descriptor.hpux_interrupt_marker = 1;
6218
/* Is this a millicode routine. "millicode" isn't in my
6219
assembler manual, but my copy is old. The HP assembler
6220
accepts it, and there's a place in the unwind descriptor
6221
to drop the information, so we'll accept it too. */
6222
else if ((strncasecmp (name, "millicode", 9) == 0))
6224
p = input_line_pointer;
6226
last_call_info->ci_unwind.descriptor.millicode = 1;
6230
as_bad (_("Invalid .CALLINFO argument: %s"), name);
6231
*input_line_pointer = c;
6233
if (!is_end_of_statement ())
6234
input_line_pointer++;
6237
demand_empty_rest_of_line ();
6240
#if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
6241
/* Switch to the text space. Like s_text, but delete our
6242
label when finished. */
6245
pa_text (int unused ATTRIBUTE_UNUSED)
6248
current_space = is_defined_space ("$TEXT$");
6250
= pa_subsegment_to_subspace (current_space->sd_seg, 0);
6254
pa_undefine_label ();
6257
/* Switch to the data space. As usual delete our label. */
6260
pa_data (int unused ATTRIBUTE_UNUSED)
6263
current_space = is_defined_space ("$PRIVATE$");
6265
= pa_subsegment_to_subspace (current_space->sd_seg, 0);
6268
pa_undefine_label ();
6271
/* This is different than the standard GAS s_comm(). On HP9000/800 machines,
6272
the .comm pseudo-op has the following syntax:
6274
<label> .comm <length>
6276
where <label> is optional and is a symbol whose address will be the start of
6277
a block of memory <length> bytes long. <length> must be an absolute
6278
expression. <length> bytes will be allocated in the current space
6281
Also note the label may not even be on the same line as the .comm.
6283
This difference in syntax means the colon function will be called
6284
on the symbol before we arrive in pa_comm. colon will set a number
6285
of attributes of the symbol that need to be fixed here. In particular
6286
the value, section pointer, fragment pointer, flags, etc. What
6289
This also makes error detection all but impossible. */
6292
pa_comm (int unused ATTRIBUTE_UNUSED)
6296
label_symbol_struct *label_symbol = pa_get_label ();
6299
symbol = label_symbol->lss_label;
6304
size = get_absolute_expression ();
6308
symbol_get_bfdsym (symbol)->flags |= BSF_OBJECT;
6309
S_SET_VALUE (symbol, size);
6310
S_SET_SEGMENT (symbol, bfd_com_section_ptr);
6311
S_SET_EXTERNAL (symbol);
6313
/* colon() has already set the frag to the current location in the
6314
current subspace; we need to reset the fragment to the zero address
6315
fragment. We also need to reset the segment pointer. */
6316
symbol_set_frag (symbol, &zero_address_frag);
6318
demand_empty_rest_of_line ();
6320
#endif /* !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))) */
6322
/* Process a .END pseudo-op. */
6325
pa_end (int unused ATTRIBUTE_UNUSED)
6327
demand_empty_rest_of_line ();
6330
/* Process a .ENTER pseudo-op. This is not supported. */
6333
pa_enter (int unused ATTRIBUTE_UNUSED)
6336
/* We must have a valid space and subspace. */
6337
pa_check_current_space_and_subspace ();
6340
as_bad (_("The .ENTER pseudo-op is not supported"));
6341
demand_empty_rest_of_line ();
6344
/* Process a .ENTRY pseudo-op. .ENTRY marks the beginning of the
6348
pa_entry (int unused ATTRIBUTE_UNUSED)
6351
/* We must have a valid space and subspace. */
6352
pa_check_current_space_and_subspace ();
6355
if (!within_procedure)
6356
as_bad (_("Misplaced .entry. Ignored."));
6359
if (!callinfo_found)
6360
as_bad (_("Missing .callinfo."));
6362
demand_empty_rest_of_line ();
6363
within_entry_exit = TRUE;
6366
/* SOM defers building of unwind descriptors until the link phase.
6367
The assembler is responsible for creating an R_ENTRY relocation
6368
to mark the beginning of a region and hold the unwind bits, and
6369
for creating an R_EXIT relocation to mark the end of the region.
6371
FIXME. ELF should be using the same conventions! The problem
6372
is an unwind requires too much relocation space. Hmmm. Maybe
6373
if we split the unwind bits up between the relocations which
6374
denote the entry and exit points. */
6375
if (last_call_info->start_symbol != NULL)
6380
where = frag_more (0);
6381
u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor);
6382
fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
6383
NULL, (offsetT) 0, NULL,
6384
0, R_HPPA_ENTRY, e_fsel, 0, 0, u);
6389
/* Silly nonsense for pa_equ. The only half-sensible use for this is
6390
being able to subtract two register symbols that specify a range of
6391
registers, to get the size of the range. */
6392
static int fudge_reg_expressions;
6395
hppa_force_reg_syms_absolute (expressionS *resultP,
6396
operatorT op ATTRIBUTE_UNUSED,
6397
expressionS *rightP)
6399
if (fudge_reg_expressions
6400
&& rightP->X_op == O_register
6401
&& resultP->X_op == O_register)
6403
rightP->X_op = O_constant;
6404
resultP->X_op = O_constant;
6406
return 0; /* Continue normal expr handling. */
6409
/* Handle a .EQU pseudo-op. */
6414
label_symbol_struct *label_symbol = pa_get_label ();
6419
symbol = label_symbol->lss_label;
6423
if (!pa_parse_number (&input_line_pointer, 0))
6424
as_bad (_(".REG expression must be a register"));
6425
S_SET_VALUE (symbol, pa_number);
6426
S_SET_SEGMENT (symbol, reg_section);
6433
fudge_reg_expressions = 1;
6434
seg = expression (&exp);
6435
fudge_reg_expressions = 0;
6436
if (exp.X_op != O_constant
6437
&& exp.X_op != O_register)
6439
if (exp.X_op != O_absent)
6440
as_bad (_("bad or irreducible absolute expression; zero assumed"));
6441
exp.X_add_number = 0;
6442
seg = absolute_section;
6444
S_SET_VALUE (symbol, (unsigned int) exp.X_add_number);
6445
S_SET_SEGMENT (symbol, seg);
6451
as_bad (_(".REG must use a label"));
6453
as_bad (_(".EQU must use a label"));
6456
pa_undefine_label ();
6457
demand_empty_rest_of_line ();
6461
/* Mark the end of a function so that it's possible to compute
6462
the size of the function in elf_hppa_final_processing. */
6465
hppa_elf_mark_end_of_function (void)
6467
/* ELF does not have EXIT relocations. All we do is create a
6468
temporary symbol marking the end of the function. */
6471
if (last_call_info == NULL || last_call_info->start_symbol == NULL)
6473
/* We have already warned about a missing label,
6474
or other problems. */
6478
name = xmalloc (strlen ("L$\001end_")
6479
+ strlen (S_GET_NAME (last_call_info->start_symbol))
6485
strcpy (name, "L$\001end_");
6486
strcat (name, S_GET_NAME (last_call_info->start_symbol));
6488
/* If we have a .exit followed by a .procend, then the
6489
symbol will have already been defined. */
6490
symbolP = symbol_find (name);
6493
/* The symbol has already been defined! This can
6494
happen if we have a .exit followed by a .procend.
6496
This is *not* an error. All we want to do is free
6497
the memory we just allocated for the name and continue. */
6502
/* symbol value should be the offset of the
6503
last instruction of the function */
6504
symbolP = symbol_new (name, now_seg, (valueT) (frag_now_fix () - 4),
6507
gas_assert (symbolP);
6508
S_CLEAR_EXTERNAL (symbolP);
6509
symbol_table_insert (symbolP);
6513
last_call_info->end_symbol = symbolP;
6515
as_bad (_("Symbol '%s' could not be created."), name);
6519
as_bad (_("No memory for symbol name."));
6523
/* Helper function. Does processing for the end of a function. This
6524
usually involves creating some relocations or building special
6525
symbols to mark the end of the function. */
6532
where = frag_more (0);
6535
/* Mark the end of the function, stuff away the location of the frag
6536
for the end of the function, and finally call pa_build_unwind_subspace
6537
to add an entry in the unwind table. */
6539
hppa_elf_mark_end_of_function ();
6540
pa_build_unwind_subspace (last_call_info);
6542
/* SOM defers building of unwind descriptors until the link phase.
6543
The assembler is responsible for creating an R_ENTRY relocation
6544
to mark the beginning of a region and hold the unwind bits, and
6545
for creating an R_EXIT relocation to mark the end of the region.
6547
FIXME. ELF should be using the same conventions! The problem
6548
is an unwind requires too much relocation space. Hmmm. Maybe
6549
if we split the unwind bits up between the relocations which
6550
denote the entry and exit points. */
6551
fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
6553
NULL, 0, R_HPPA_EXIT, e_fsel, 0, 0,
6554
UNWIND_HIGH32 (&last_call_info->ci_unwind.descriptor));
6558
/* Process a .EXIT pseudo-op. */
6561
pa_exit (int unused ATTRIBUTE_UNUSED)
6564
/* We must have a valid space and subspace. */
6565
pa_check_current_space_and_subspace ();
6568
if (!within_procedure)
6569
as_bad (_(".EXIT must appear within a procedure"));
6572
if (!callinfo_found)
6573
as_bad (_("Missing .callinfo"));
6576
if (!within_entry_exit)
6577
as_bad (_("No .ENTRY for this .EXIT"));
6580
within_entry_exit = FALSE;
6585
demand_empty_rest_of_line ();
6588
/* Helper function to process arguments to a .EXPORT pseudo-op. */
6591
pa_type_args (symbolS *symbolP, int is_export)
6594
unsigned int temp, arg_reloc;
6595
pa_symbol_type type = SYMBOL_TYPE_UNKNOWN;
6596
asymbol *bfdsym = symbol_get_bfdsym (symbolP);
6598
if (strncasecmp (input_line_pointer, "absolute", 8) == 0)
6600
input_line_pointer += 8;
6601
bfdsym->flags &= ~BSF_FUNCTION;
6602
S_SET_SEGMENT (symbolP, bfd_abs_section_ptr);
6603
type = SYMBOL_TYPE_ABSOLUTE;
6605
else if (strncasecmp (input_line_pointer, "code", 4) == 0)
6607
input_line_pointer += 4;
6608
/* IMPORTing/EXPORTing CODE types for functions is meaningless for SOM,
6609
instead one should be IMPORTing/EXPORTing ENTRY types.
6611
Complain if one tries to EXPORT a CODE type since that's never
6612
done. Both GCC and HP C still try to IMPORT CODE types, so
6613
silently fix them to be ENTRY types. */
6614
if (S_IS_FUNCTION (symbolP))
6617
as_tsktsk (_("Using ENTRY rather than CODE in export directive for %s"),
6618
S_GET_NAME (symbolP));
6620
bfdsym->flags |= BSF_FUNCTION;
6621
type = SYMBOL_TYPE_ENTRY;
6625
bfdsym->flags &= ~BSF_FUNCTION;
6626
type = SYMBOL_TYPE_CODE;
6629
else if (strncasecmp (input_line_pointer, "data", 4) == 0)
6631
input_line_pointer += 4;
6632
bfdsym->flags &= ~BSF_FUNCTION;
6633
bfdsym->flags |= BSF_OBJECT;
6634
type = SYMBOL_TYPE_DATA;
6636
else if ((strncasecmp (input_line_pointer, "entry", 5) == 0))
6638
input_line_pointer += 5;
6639
bfdsym->flags |= BSF_FUNCTION;
6640
type = SYMBOL_TYPE_ENTRY;
6642
else if (strncasecmp (input_line_pointer, "millicode", 9) == 0)
6644
input_line_pointer += 9;
6645
bfdsym->flags |= BSF_FUNCTION;
6648
elf_symbol_type *elfsym = (elf_symbol_type *) bfdsym;
6649
elfsym->internal_elf_sym.st_info =
6650
ELF_ST_INFO (ELF_ST_BIND (elfsym->internal_elf_sym.st_info),
6654
type = SYMBOL_TYPE_MILLICODE;
6656
else if (strncasecmp (input_line_pointer, "plabel", 6) == 0)
6658
input_line_pointer += 6;
6659
bfdsym->flags &= ~BSF_FUNCTION;
6660
type = SYMBOL_TYPE_PLABEL;
6662
else if (strncasecmp (input_line_pointer, "pri_prog", 8) == 0)
6664
input_line_pointer += 8;
6665
bfdsym->flags |= BSF_FUNCTION;
6666
type = SYMBOL_TYPE_PRI_PROG;
6668
else if (strncasecmp (input_line_pointer, "sec_prog", 8) == 0)
6670
input_line_pointer += 8;
6671
bfdsym->flags |= BSF_FUNCTION;
6672
type = SYMBOL_TYPE_SEC_PROG;
6675
/* SOM requires much more information about symbol types
6676
than BFD understands. This is how we get this information
6677
to the SOM BFD backend. */
6678
#ifdef obj_set_symbol_type
6679
obj_set_symbol_type (bfdsym, (int) type);
6684
/* Now that the type of the exported symbol has been handled,
6685
handle any argument relocation information. */
6686
while (!is_end_of_statement ())
6688
if (*input_line_pointer == ',')
6689
input_line_pointer++;
6690
name = input_line_pointer;
6691
c = get_symbol_end ();
6692
/* Argument sources. */
6693
if ((strncasecmp (name, "argw", 4) == 0))
6695
p = input_line_pointer;
6697
input_line_pointer++;
6698
temp = atoi (name + 4);
6699
name = input_line_pointer;
6700
c = get_symbol_end ();
6701
arg_reloc = pa_align_arg_reloc (temp, pa_build_arg_reloc (name));
6702
#if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
6703
symbol_arg_reloc_info (symbolP) |= arg_reloc;
6707
*input_line_pointer = c;
6709
/* The return value. */
6710
else if ((strncasecmp (name, "rtnval", 6)) == 0)
6712
p = input_line_pointer;
6714
input_line_pointer++;
6715
name = input_line_pointer;
6716
c = get_symbol_end ();
6717
arg_reloc = pa_build_arg_reloc (name);
6718
#if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
6719
symbol_arg_reloc_info (symbolP) |= arg_reloc;
6723
*input_line_pointer = c;
6725
/* Privilege level. */
6726
else if ((strncasecmp (name, "priv_lev", 8)) == 0)
6728
p = input_line_pointer;
6730
input_line_pointer++;
6731
temp = atoi (input_line_pointer);
6733
((obj_symbol_type *) bfdsym)->tc_data.ap.hppa_priv_level = temp;
6735
c = get_symbol_end ();
6736
*input_line_pointer = c;
6740
as_bad (_("Undefined .EXPORT/.IMPORT argument (ignored): %s"), name);
6741
p = input_line_pointer;
6744
if (!is_end_of_statement ())
6745
input_line_pointer++;
6749
/* Process a .EXPORT directive. This makes functions external
6750
and provides information such as argument relocation entries
6754
pa_export (int unused ATTRIBUTE_UNUSED)
6759
name = input_line_pointer;
6760
c = get_symbol_end ();
6761
/* Make sure the given symbol exists. */
6762
if ((symbol = symbol_find_or_make (name)) == NULL)
6764
as_bad (_("Cannot define export symbol: %s\n"), name);
6765
p = input_line_pointer;
6767
input_line_pointer++;
6771
/* OK. Set the external bits and process argument relocations.
6772
For the HP, weak and global are not mutually exclusive.
6773
S_SET_EXTERNAL will not set BSF_GLOBAL if WEAK is set.
6774
Call S_SET_EXTERNAL to get the other processing. Manually
6775
set BSF_GLOBAL when we get back. */
6776
S_SET_EXTERNAL (symbol);
6777
symbol_get_bfdsym (symbol)->flags |= BSF_GLOBAL;
6778
p = input_line_pointer;
6780
if (!is_end_of_statement ())
6782
input_line_pointer++;
6783
pa_type_args (symbol, 1);
6787
demand_empty_rest_of_line ();
6790
/* Handle an .IMPORT pseudo-op. Any symbol referenced in a given
6791
assembly file must either be defined in the assembly file, or
6792
explicitly IMPORTED from another. */
6795
pa_import (int unused ATTRIBUTE_UNUSED)
6800
name = input_line_pointer;
6801
c = get_symbol_end ();
6803
symbol = symbol_find (name);
6804
/* Ugh. We might be importing a symbol defined earlier in the file,
6805
in which case all the code below will really screw things up
6806
(set the wrong segment, symbol flags & type, etc). */
6807
if (symbol == NULL || !S_IS_DEFINED (symbol))
6809
symbol = symbol_find_or_make (name);
6810
p = input_line_pointer;
6813
if (!is_end_of_statement ())
6815
input_line_pointer++;
6816
pa_type_args (symbol, 0);
6820
/* Sigh. To be compatible with the HP assembler and to help
6821
poorly written assembly code, we assign a type based on
6822
the current segment. Note only BSF_FUNCTION really
6823
matters, we do not need to set the full SYMBOL_TYPE_* info. */
6824
if (now_seg == text_section)
6825
symbol_get_bfdsym (symbol)->flags |= BSF_FUNCTION;
6827
/* If the section is undefined, then the symbol is undefined
6828
Since this is an import, leave the section undefined. */
6829
S_SET_SEGMENT (symbol, bfd_und_section_ptr);
6834
/* The symbol was already defined. Just eat everything up to
6835
the end of the current statement. */
6836
while (!is_end_of_statement ())
6837
input_line_pointer++;
6840
demand_empty_rest_of_line ();
6843
/* Handle a .LABEL pseudo-op. */
6846
pa_label (int unused ATTRIBUTE_UNUSED)
6850
name = input_line_pointer;
6851
c = get_symbol_end ();
6853
if (strlen (name) > 0)
6856
p = input_line_pointer;
6861
as_warn (_("Missing label name on .LABEL"));
6864
if (!is_end_of_statement ())
6866
as_warn (_("extra .LABEL arguments ignored."));
6867
ignore_rest_of_line ();
6869
demand_empty_rest_of_line ();
6872
/* Handle a .LEAVE pseudo-op. This is not supported yet. */
6875
pa_leave (int unused ATTRIBUTE_UNUSED)
6878
/* We must have a valid space and subspace. */
6879
pa_check_current_space_and_subspace ();
6882
as_bad (_("The .LEAVE pseudo-op is not supported"));
6883
demand_empty_rest_of_line ();
6886
/* Handle a .LEVEL pseudo-op. */
6889
pa_level (int unused ATTRIBUTE_UNUSED)
6893
level = input_line_pointer;
6894
if (strncmp (level, "1.0", 3) == 0)
6896
input_line_pointer += 3;
6897
if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 10))
6898
as_warn (_("could not set architecture and machine"));
6900
else if (strncmp (level, "1.1", 3) == 0)
6902
input_line_pointer += 3;
6903
if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 11))
6904
as_warn (_("could not set architecture and machine"));
6906
else if (strncmp (level, "2.0w", 4) == 0)
6908
input_line_pointer += 4;
6909
if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 25))
6910
as_warn (_("could not set architecture and machine"));
6912
else if (strncmp (level, "2.0", 3) == 0)
6914
input_line_pointer += 3;
6915
if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 20))
6916
as_warn (_("could not set architecture and machine"));
6920
as_bad (_("Unrecognized .LEVEL argument\n"));
6921
ignore_rest_of_line ();
6923
demand_empty_rest_of_line ();
6926
/* Handle a .ORIGIN pseudo-op. */
6929
pa_origin (int unused ATTRIBUTE_UNUSED)
6932
/* We must have a valid space and subspace. */
6933
pa_check_current_space_and_subspace ();
6937
pa_undefine_label ();
6940
/* Handle a .PARAM pseudo-op. This is much like a .EXPORT, except it
6941
is for static functions. FIXME. Should share more code with .EXPORT. */
6944
pa_param (int unused ATTRIBUTE_UNUSED)
6949
name = input_line_pointer;
6950
c = get_symbol_end ();
6952
if ((symbol = symbol_find_or_make (name)) == NULL)
6954
as_bad (_("Cannot define static symbol: %s\n"), name);
6955
p = input_line_pointer;
6957
input_line_pointer++;
6961
S_CLEAR_EXTERNAL (symbol);
6962
p = input_line_pointer;
6964
if (!is_end_of_statement ())
6966
input_line_pointer++;
6967
pa_type_args (symbol, 0);
6971
demand_empty_rest_of_line ();
6974
/* Handle a .PROC pseudo-op. It is used to mark the beginning
6975
of a procedure from a syntactical point of view. */
6978
pa_proc (int unused ATTRIBUTE_UNUSED)
6980
struct call_info *call_info;
6983
/* We must have a valid space and subspace. */
6984
pa_check_current_space_and_subspace ();
6987
if (within_procedure)
6988
as_fatal (_("Nested procedures"));
6990
/* Reset global variables for new procedure. */
6991
callinfo_found = FALSE;
6992
within_procedure = TRUE;
6994
/* Create another call_info structure. */
6995
call_info = xmalloc (sizeof (struct call_info));
6998
as_fatal (_("Cannot allocate unwind descriptor\n"));
7000
memset (call_info, 0, sizeof (struct call_info));
7002
call_info->ci_next = NULL;
7004
if (call_info_root == NULL)
7006
call_info_root = call_info;
7007
last_call_info = call_info;
7011
last_call_info->ci_next = call_info;
7012
last_call_info = call_info;
7015
/* set up defaults on call_info structure */
7017
call_info->ci_unwind.descriptor.cannot_unwind = 0;
7018
call_info->ci_unwind.descriptor.region_desc = 1;
7019
call_info->ci_unwind.descriptor.hpux_interrupt_marker = 0;
7021
/* If we got a .PROC pseudo-op, we know that the function is defined
7022
locally. Make sure it gets into the symbol table. */
7024
label_symbol_struct *label_symbol = pa_get_label ();
7028
if (label_symbol->lss_label)
7030
last_call_info->start_symbol = label_symbol->lss_label;
7031
symbol_get_bfdsym (label_symbol->lss_label)->flags |= BSF_FUNCTION;
7034
as_bad (_("Missing function name for .PROC (corrupted label chain)"));
7037
last_call_info->start_symbol = NULL;
7040
demand_empty_rest_of_line ();
7043
/* Process the syntactical end of a procedure. Make sure all the
7044
appropriate pseudo-ops were found within the procedure. */
7047
pa_procend (int unused ATTRIBUTE_UNUSED)
7050
/* We must have a valid space and subspace. */
7051
pa_check_current_space_and_subspace ();
7054
/* If we are within a procedure definition, make sure we've
7055
defined a label for the procedure; handle case where the
7056
label was defined after the .PROC directive.
7058
Note there's not need to diddle with the segment or fragment
7059
for the label symbol in this case. We have already switched
7060
into the new $CODE$ subspace at this point. */
7061
if (within_procedure && last_call_info->start_symbol == NULL)
7063
label_symbol_struct *label_symbol = pa_get_label ();
7067
if (label_symbol->lss_label)
7069
last_call_info->start_symbol = label_symbol->lss_label;
7070
symbol_get_bfdsym (label_symbol->lss_label)->flags
7073
/* Also handle allocation of a fixup to hold the unwind
7074
information when the label appears after the proc/procend. */
7075
if (within_entry_exit)
7080
where = frag_more (0);
7081
u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor);
7082
fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
7083
NULL, (offsetT) 0, NULL,
7084
0, R_HPPA_ENTRY, e_fsel, 0, 0, u);
7089
as_bad (_("Missing function name for .PROC (corrupted label chain)"));
7092
as_bad (_("Missing function name for .PROC"));
7095
if (!within_procedure)
7096
as_bad (_("misplaced .procend"));
7098
if (!callinfo_found)
7099
as_bad (_("Missing .callinfo for this procedure"));
7101
if (within_entry_exit)
7102
as_bad (_("Missing .EXIT for a .ENTRY"));
7105
/* ELF needs to mark the end of each function so that it can compute
7106
the size of the function (apparently its needed in the symbol table). */
7107
hppa_elf_mark_end_of_function ();
7110
within_procedure = FALSE;
7111
demand_empty_rest_of_line ();
7112
pa_undefine_label ();
7116
/* If VALUE is an exact power of two between zero and 2^31, then
7117
return log2 (VALUE). Else return -1. */
7120
exact_log2 (int value)
7124
while ((1 << shift) != value && shift < 32)
7133
/* Check to make sure we have a valid space and subspace. */
7136
pa_check_current_space_and_subspace (void)
7138
if (current_space == NULL)
7139
as_fatal (_("Not in a space.\n"));
7141
if (current_subspace == NULL)
7142
as_fatal (_("Not in a subspace.\n"));
7145
/* Parse the parameters to a .SPACE directive; if CREATE_FLAG is nonzero,
7146
then create a new space entry to hold the information specified
7147
by the parameters to the .SPACE directive. */
7149
static sd_chain_struct *
7150
pa_parse_space_stmt (char *space_name, int create_flag)
7152
char *name, *ptemp, c;
7153
char loadable, defined, private, sort;
7155
asection *seg = NULL;
7156
sd_chain_struct *space;
7158
/* Load default values. */
7164
if (strcmp (space_name, "$TEXT$") == 0)
7166
seg = pa_def_spaces[0].segment;
7167
defined = pa_def_spaces[0].defined;
7168
private = pa_def_spaces[0].private;
7169
sort = pa_def_spaces[0].sort;
7170
spnum = pa_def_spaces[0].spnum;
7172
else if (strcmp (space_name, "$PRIVATE$") == 0)
7174
seg = pa_def_spaces[1].segment;
7175
defined = pa_def_spaces[1].defined;
7176
private = pa_def_spaces[1].private;
7177
sort = pa_def_spaces[1].sort;
7178
spnum = pa_def_spaces[1].spnum;
7181
if (!is_end_of_statement ())
7183
print_errors = FALSE;
7184
ptemp = input_line_pointer + 1;
7185
/* First see if the space was specified as a number rather than
7186
as a name. According to the PA assembly manual the rest of
7187
the line should be ignored. */
7189
pa_parse_number (&ptemp, 0);
7193
input_line_pointer = ptemp;
7197
while (!is_end_of_statement ())
7199
input_line_pointer++;
7200
name = input_line_pointer;
7201
c = get_symbol_end ();
7202
if ((strncasecmp (name, "spnum", 5) == 0))
7204
*input_line_pointer = c;
7205
input_line_pointer++;
7206
spnum = get_absolute_expression ();
7208
else if ((strncasecmp (name, "sort", 4) == 0))
7210
*input_line_pointer = c;
7211
input_line_pointer++;
7212
sort = get_absolute_expression ();
7214
else if ((strncasecmp (name, "unloadable", 10) == 0))
7216
*input_line_pointer = c;
7219
else if ((strncasecmp (name, "notdefined", 10) == 0))
7221
*input_line_pointer = c;
7224
else if ((strncasecmp (name, "private", 7) == 0))
7226
*input_line_pointer = c;
7231
as_bad (_("Invalid .SPACE argument"));
7232
*input_line_pointer = c;
7233
if (!is_end_of_statement ())
7234
input_line_pointer++;
7238
print_errors = TRUE;
7241
if (create_flag && seg == NULL)
7242
seg = subseg_new (space_name, 0);
7244
/* If create_flag is nonzero, then create the new space with
7245
the attributes computed above. Else set the values in
7246
an already existing space -- this can only happen for
7247
the first occurrence of a built-in space. */
7249
space = create_new_space (space_name, spnum, loadable, defined,
7250
private, sort, seg, 1);
7253
space = is_defined_space (space_name);
7254
SPACE_SPNUM (space) = spnum;
7255
SPACE_DEFINED (space) = defined & 1;
7256
SPACE_USER_DEFINED (space) = 1;
7259
#ifdef obj_set_section_attributes
7260
obj_set_section_attributes (seg, defined, private, sort, spnum);
7266
/* Handle a .SPACE pseudo-op; this switches the current space to the
7267
given space, creating the new space if necessary. */
7270
pa_space (int unused ATTRIBUTE_UNUSED)
7272
char *name, c, *space_name, *save_s;
7273
sd_chain_struct *sd_chain;
7275
if (within_procedure)
7277
as_bad (_("Can\'t change spaces within a procedure definition. Ignored"));
7278
ignore_rest_of_line ();
7282
/* Check for some of the predefined spaces. FIXME: most of the code
7283
below is repeated several times, can we extract the common parts
7284
and place them into a subroutine or something similar? */
7285
/* FIXME Is this (and the next IF stmt) really right?
7286
What if INPUT_LINE_POINTER points to "$TEXT$FOO"? */
7287
if (strncmp (input_line_pointer, "$TEXT$", 6) == 0)
7289
input_line_pointer += 6;
7290
sd_chain = is_defined_space ("$TEXT$");
7291
if (sd_chain == NULL)
7292
sd_chain = pa_parse_space_stmt ("$TEXT$", 1);
7293
else if (SPACE_USER_DEFINED (sd_chain) == 0)
7294
sd_chain = pa_parse_space_stmt ("$TEXT$", 0);
7296
current_space = sd_chain;
7297
subseg_set (text_section, sd_chain->sd_last_subseg);
7299
= pa_subsegment_to_subspace (text_section,
7300
sd_chain->sd_last_subseg);
7301
demand_empty_rest_of_line ();
7304
if (strncmp (input_line_pointer, "$PRIVATE$", 9) == 0)
7306
input_line_pointer += 9;
7307
sd_chain = is_defined_space ("$PRIVATE$");
7308
if (sd_chain == NULL)
7309
sd_chain = pa_parse_space_stmt ("$PRIVATE$", 1);
7310
else if (SPACE_USER_DEFINED (sd_chain) == 0)
7311
sd_chain = pa_parse_space_stmt ("$PRIVATE$", 0);
7313
current_space = sd_chain;
7314
subseg_set (data_section, sd_chain->sd_last_subseg);
7316
= pa_subsegment_to_subspace (data_section,
7317
sd_chain->sd_last_subseg);
7318
demand_empty_rest_of_line ();
7321
if (!strncasecmp (input_line_pointer,
7322
GDB_DEBUG_SPACE_NAME,
7323
strlen (GDB_DEBUG_SPACE_NAME)))
7325
input_line_pointer += strlen (GDB_DEBUG_SPACE_NAME);
7326
sd_chain = is_defined_space (GDB_DEBUG_SPACE_NAME);
7327
if (sd_chain == NULL)
7328
sd_chain = pa_parse_space_stmt (GDB_DEBUG_SPACE_NAME, 1);
7329
else if (SPACE_USER_DEFINED (sd_chain) == 0)
7330
sd_chain = pa_parse_space_stmt (GDB_DEBUG_SPACE_NAME, 0);
7332
current_space = sd_chain;
7335
asection *gdb_section
7336
= bfd_make_section_old_way (stdoutput, GDB_DEBUG_SPACE_NAME);
7338
subseg_set (gdb_section, sd_chain->sd_last_subseg);
7340
= pa_subsegment_to_subspace (gdb_section,
7341
sd_chain->sd_last_subseg);
7343
demand_empty_rest_of_line ();
7347
/* It could be a space specified by number. */
7349
save_s = input_line_pointer;
7351
pa_parse_number (&input_line_pointer, 0);
7354
if ((sd_chain = pa_find_space_by_number (pa_number)))
7356
current_space = sd_chain;
7358
subseg_set (sd_chain->sd_seg, sd_chain->sd_last_subseg);
7360
= pa_subsegment_to_subspace (sd_chain->sd_seg,
7361
sd_chain->sd_last_subseg);
7362
demand_empty_rest_of_line ();
7367
/* Not a number, attempt to create a new space. */
7369
input_line_pointer = save_s;
7370
name = input_line_pointer;
7371
c = get_symbol_end ();
7372
space_name = xmalloc (strlen (name) + 1);
7373
strcpy (space_name, name);
7374
*input_line_pointer = c;
7376
sd_chain = pa_parse_space_stmt (space_name, 1);
7377
current_space = sd_chain;
7379
subseg_set (sd_chain->sd_seg, sd_chain->sd_last_subseg);
7380
current_subspace = pa_subsegment_to_subspace (sd_chain->sd_seg,
7381
sd_chain->sd_last_subseg);
7382
demand_empty_rest_of_line ();
7386
/* Switch to a new space. (I think). FIXME. */
7389
pa_spnum (int unused ATTRIBUTE_UNUSED)
7394
sd_chain_struct *space;
7396
name = input_line_pointer;
7397
c = get_symbol_end ();
7398
space = is_defined_space (name);
7402
md_number_to_chars (p, SPACE_SPNUM (space), 4);
7405
as_warn (_("Undefined space: '%s' Assuming space number = 0."), name);
7407
*input_line_pointer = c;
7408
demand_empty_rest_of_line ();
7411
/* Handle a .SUBSPACE pseudo-op; this switches the current subspace to the
7412
given subspace, creating the new subspace if necessary.
7414
FIXME. Should mirror pa_space more closely, in particular how
7415
they're broken up into subroutines. */
7418
pa_subspace (int create_new)
7420
char *name, *ss_name, c;
7421
char loadable, code_only, comdat, common, dup_common, zero, sort;
7422
int i, access_ctr, space_index, alignment, quadrant, applicable, flags;
7423
sd_chain_struct *space;
7424
ssd_chain_struct *ssd;
7427
if (current_space == NULL)
7428
as_fatal (_("Must be in a space before changing or declaring subspaces.\n"));
7430
if (within_procedure)
7432
as_bad (_("Can\'t change subspaces within a procedure definition. Ignored"));
7433
ignore_rest_of_line ();
7437
name = input_line_pointer;
7438
c = get_symbol_end ();
7439
ss_name = xmalloc (strlen (name) + 1);
7440
strcpy (ss_name, name);
7441
*input_line_pointer = c;
7443
/* Load default values. */
7456
space = current_space;
7460
ssd = is_defined_subspace (ss_name);
7461
/* Allow user to override the builtin attributes of subspaces. But
7462
only allow the attributes to be changed once! */
7463
if (ssd && SUBSPACE_DEFINED (ssd))
7465
subseg_set (ssd->ssd_seg, ssd->ssd_subseg);
7466
current_subspace = ssd;
7467
if (!is_end_of_statement ())
7468
as_warn (_("Parameters of an existing subspace can\'t be modified"));
7469
demand_empty_rest_of_line ();
7474
/* A new subspace. Load default values if it matches one of
7475
the builtin subspaces. */
7477
while (pa_def_subspaces[i].name)
7479
if (strcasecmp (pa_def_subspaces[i].name, ss_name) == 0)
7481
loadable = pa_def_subspaces[i].loadable;
7482
comdat = pa_def_subspaces[i].comdat;
7483
common = pa_def_subspaces[i].common;
7484
dup_common = pa_def_subspaces[i].dup_common;
7485
code_only = pa_def_subspaces[i].code_only;
7486
zero = pa_def_subspaces[i].zero;
7487
space_index = pa_def_subspaces[i].space_index;
7488
alignment = pa_def_subspaces[i].alignment;
7489
quadrant = pa_def_subspaces[i].quadrant;
7490
access_ctr = pa_def_subspaces[i].access;
7491
sort = pa_def_subspaces[i].sort;
7498
/* We should be working with a new subspace now. Fill in
7499
any information as specified by the user. */
7500
if (!is_end_of_statement ())
7502
input_line_pointer++;
7503
while (!is_end_of_statement ())
7505
name = input_line_pointer;
7506
c = get_symbol_end ();
7507
if ((strncasecmp (name, "quad", 4) == 0))
7509
*input_line_pointer = c;
7510
input_line_pointer++;
7511
quadrant = get_absolute_expression ();
7513
else if ((strncasecmp (name, "align", 5) == 0))
7515
*input_line_pointer = c;
7516
input_line_pointer++;
7517
alignment = get_absolute_expression ();
7518
if (exact_log2 (alignment) == -1)
7520
as_bad (_("Alignment must be a power of 2"));
7524
else if ((strncasecmp (name, "access", 6) == 0))
7526
*input_line_pointer = c;
7527
input_line_pointer++;
7528
access_ctr = get_absolute_expression ();
7530
else if ((strncasecmp (name, "sort", 4) == 0))
7532
*input_line_pointer = c;
7533
input_line_pointer++;
7534
sort = get_absolute_expression ();
7536
else if ((strncasecmp (name, "code_only", 9) == 0))
7538
*input_line_pointer = c;
7541
else if ((strncasecmp (name, "unloadable", 10) == 0))
7543
*input_line_pointer = c;
7546
else if ((strncasecmp (name, "comdat", 6) == 0))
7548
*input_line_pointer = c;
7551
else if ((strncasecmp (name, "common", 6) == 0))
7553
*input_line_pointer = c;
7556
else if ((strncasecmp (name, "dup_comm", 8) == 0))
7558
*input_line_pointer = c;
7561
else if ((strncasecmp (name, "zero", 4) == 0))
7563
*input_line_pointer = c;
7566
else if ((strncasecmp (name, "first", 5) == 0))
7567
as_bad (_("FIRST not supported as a .SUBSPACE argument"));
7569
as_bad (_("Invalid .SUBSPACE argument"));
7570
if (!is_end_of_statement ())
7571
input_line_pointer++;
7575
/* Compute a reasonable set of BFD flags based on the information
7576
in the .subspace directive. */
7577
applicable = bfd_applicable_section_flags (stdoutput);
7580
flags |= (SEC_ALLOC | SEC_LOAD);
7584
/* These flags are used to implement various flavors of initialized
7585
common. The SOM linker discards duplicate subspaces when they
7586
have the same "key" symbol name. This support is more like
7587
GNU linkonce than BFD common. Further, pc-relative relocations
7588
are converted to section relative relocations in BFD common
7589
sections. This complicates the handling of relocations in
7590
common sections containing text and isn't currently supported
7591
correctly in the SOM BFD backend. */
7592
if (comdat || common || dup_common)
7593
flags |= SEC_LINK_ONCE;
7595
flags |= SEC_RELOC | SEC_HAS_CONTENTS;
7597
/* This is a zero-filled subspace (eg BSS). */
7599
flags &= ~(SEC_LOAD | SEC_HAS_CONTENTS);
7601
applicable &= flags;
7603
/* If this is an existing subspace, then we want to use the
7604
segment already associated with the subspace.
7606
FIXME NOW! ELF BFD doesn't appear to be ready to deal with
7607
lots of sections. It might be a problem in the PA ELF
7608
code, I do not know yet. For now avoid creating anything
7609
but the "standard" sections for ELF. */
7611
section = subseg_force_new (ss_name, 0);
7613
section = ssd->ssd_seg;
7615
section = subseg_new (ss_name, 0);
7618
seg_info (section)->bss = 1;
7620
/* Now set the flags. */
7621
bfd_set_section_flags (stdoutput, section, applicable);
7623
/* Record any alignment request for this section. */
7624
record_alignment (section, exact_log2 (alignment));
7626
/* Set the starting offset for this section. */
7627
bfd_set_section_vma (stdoutput, section,
7628
pa_subspace_start (space, quadrant));
7630
/* Now that all the flags are set, update an existing subspace,
7631
or create a new one. */
7634
current_subspace = update_subspace (space, ss_name, loadable,
7635
code_only, comdat, common,
7636
dup_common, sort, zero, access_ctr,
7637
space_index, alignment, quadrant,
7640
current_subspace = create_new_subspace (space, ss_name, loadable,
7641
code_only, comdat, common,
7642
dup_common, zero, sort,
7643
access_ctr, space_index,
7644
alignment, quadrant, section);
7646
demand_empty_rest_of_line ();
7647
current_subspace->ssd_seg = section;
7648
subseg_set (current_subspace->ssd_seg, current_subspace->ssd_subseg);
7650
SUBSPACE_DEFINED (current_subspace) = 1;
7653
/* Create default space and subspace dictionaries. */
7656
pa_spaces_begin (void)
7660
space_dict_root = NULL;
7661
space_dict_last = NULL;
7664
while (pa_def_spaces[i].name)
7668
/* Pick the right name to use for the new section. */
7669
name = pa_def_spaces[i].name;
7671
pa_def_spaces[i].segment = subseg_new (name, 0);
7672
create_new_space (pa_def_spaces[i].name, pa_def_spaces[i].spnum,
7673
pa_def_spaces[i].loadable, pa_def_spaces[i].defined,
7674
pa_def_spaces[i].private, pa_def_spaces[i].sort,
7675
pa_def_spaces[i].segment, 0);
7680
while (pa_def_subspaces[i].name)
7683
int applicable, subsegment;
7684
asection *segment = NULL;
7685
sd_chain_struct *space;
7687
/* Pick the right name for the new section and pick the right
7688
subsegment number. */
7689
name = pa_def_subspaces[i].name;
7692
/* Create the new section. */
7693
segment = subseg_new (name, subsegment);
7695
/* For SOM we want to replace the standard .text, .data, and .bss
7696
sections with our own. We also want to set BFD flags for
7697
all the built-in subspaces. */
7698
if (!strcmp (pa_def_subspaces[i].name, "$CODE$"))
7700
text_section = segment;
7701
applicable = bfd_applicable_section_flags (stdoutput);
7702
bfd_set_section_flags (stdoutput, segment,
7703
applicable & (SEC_ALLOC | SEC_LOAD
7704
| SEC_RELOC | SEC_CODE
7706
| SEC_HAS_CONTENTS));
7708
else if (!strcmp (pa_def_subspaces[i].name, "$DATA$"))
7710
data_section = segment;
7711
applicable = bfd_applicable_section_flags (stdoutput);
7712
bfd_set_section_flags (stdoutput, segment,
7713
applicable & (SEC_ALLOC | SEC_LOAD
7715
| SEC_HAS_CONTENTS));
7718
else if (!strcmp (pa_def_subspaces[i].name, "$BSS$"))
7720
bss_section = segment;
7721
applicable = bfd_applicable_section_flags (stdoutput);
7722
bfd_set_section_flags (stdoutput, segment,
7723
applicable & SEC_ALLOC);
7725
else if (!strcmp (pa_def_subspaces[i].name, "$LIT$"))
7727
applicable = bfd_applicable_section_flags (stdoutput);
7728
bfd_set_section_flags (stdoutput, segment,
7729
applicable & (SEC_ALLOC | SEC_LOAD
7732
| SEC_HAS_CONTENTS));
7734
else if (!strcmp (pa_def_subspaces[i].name, "$MILLICODE$"))
7736
applicable = bfd_applicable_section_flags (stdoutput);
7737
bfd_set_section_flags (stdoutput, segment,
7738
applicable & (SEC_ALLOC | SEC_LOAD
7741
| SEC_HAS_CONTENTS));
7743
else if (!strcmp (pa_def_subspaces[i].name, "$UNWIND$"))
7745
applicable = bfd_applicable_section_flags (stdoutput);
7746
bfd_set_section_flags (stdoutput, segment,
7747
applicable & (SEC_ALLOC | SEC_LOAD
7750
| SEC_HAS_CONTENTS));
7753
/* Find the space associated with this subspace. */
7754
space = pa_segment_to_space (pa_def_spaces[pa_def_subspaces[i].
7755
def_space_index].segment);
7758
as_fatal (_("Internal error: Unable to find containing space for %s."),
7759
pa_def_subspaces[i].name);
7762
create_new_subspace (space, name,
7763
pa_def_subspaces[i].loadable,
7764
pa_def_subspaces[i].code_only,
7765
pa_def_subspaces[i].comdat,
7766
pa_def_subspaces[i].common,
7767
pa_def_subspaces[i].dup_common,
7768
pa_def_subspaces[i].zero,
7769
pa_def_subspaces[i].sort,
7770
pa_def_subspaces[i].access,
7771
pa_def_subspaces[i].space_index,
7772
pa_def_subspaces[i].alignment,
7773
pa_def_subspaces[i].quadrant,
7779
/* Create a new space NAME, with the appropriate flags as defined
7780
by the given parameters. */
7782
static sd_chain_struct *
7783
create_new_space (char *name,
7785
int loadable ATTRIBUTE_UNUSED,
7792
sd_chain_struct *chain_entry;
7794
chain_entry = xmalloc (sizeof (sd_chain_struct));
7796
as_fatal (_("Out of memory: could not allocate new space chain entry: %s\n"),
7799
SPACE_NAME (chain_entry) = xmalloc (strlen (name) + 1);
7800
strcpy (SPACE_NAME (chain_entry), name);
7801
SPACE_DEFINED (chain_entry) = defined;
7802
SPACE_USER_DEFINED (chain_entry) = user_defined;
7803
SPACE_SPNUM (chain_entry) = spnum;
7805
chain_entry->sd_seg = seg;
7806
chain_entry->sd_last_subseg = -1;
7807
chain_entry->sd_subspaces = NULL;
7808
chain_entry->sd_next = NULL;
7810
/* Find spot for the new space based on its sort key. */
7811
if (!space_dict_last)
7812
space_dict_last = chain_entry;
7814
if (space_dict_root == NULL)
7815
space_dict_root = chain_entry;
7818
sd_chain_struct *chain_pointer;
7819
sd_chain_struct *prev_chain_pointer;
7821
chain_pointer = space_dict_root;
7822
prev_chain_pointer = NULL;
7824
while (chain_pointer)
7826
prev_chain_pointer = chain_pointer;
7827
chain_pointer = chain_pointer->sd_next;
7830
/* At this point we've found the correct place to add the new
7831
entry. So add it and update the linked lists as appropriate. */
7832
if (prev_chain_pointer)
7834
chain_entry->sd_next = chain_pointer;
7835
prev_chain_pointer->sd_next = chain_entry;
7839
space_dict_root = chain_entry;
7840
chain_entry->sd_next = chain_pointer;
7843
if (chain_entry->sd_next == NULL)
7844
space_dict_last = chain_entry;
7847
/* This is here to catch predefined spaces which do not get
7848
modified by the user's input. Another call is found at
7849
the bottom of pa_parse_space_stmt to handle cases where
7850
the user modifies a predefined space. */
7851
#ifdef obj_set_section_attributes
7852
obj_set_section_attributes (seg, defined, private, sort, spnum);
7858
/* Create a new subspace NAME, with the appropriate flags as defined
7859
by the given parameters.
7861
Add the new subspace to the subspace dictionary chain in numerical
7862
order as defined by the SORT entries. */
7864
static ssd_chain_struct *
7865
create_new_subspace (sd_chain_struct *space,
7867
int loadable ATTRIBUTE_UNUSED,
7868
int code_only ATTRIBUTE_UNUSED,
7872
int is_zero ATTRIBUTE_UNUSED,
7875
int space_index ATTRIBUTE_UNUSED,
7876
int alignment ATTRIBUTE_UNUSED,
7880
ssd_chain_struct *chain_entry;
7882
chain_entry = xmalloc (sizeof (ssd_chain_struct));
7884
as_fatal (_("Out of memory: could not allocate new subspace chain entry: %s\n"), name);
7886
SUBSPACE_NAME (chain_entry) = xmalloc (strlen (name) + 1);
7887
strcpy (SUBSPACE_NAME (chain_entry), name);
7889
/* Initialize subspace_defined. When we hit a .subspace directive
7890
we'll set it to 1 which "locks-in" the subspace attributes. */
7891
SUBSPACE_DEFINED (chain_entry) = 0;
7893
chain_entry->ssd_subseg = 0;
7894
chain_entry->ssd_seg = seg;
7895
chain_entry->ssd_next = NULL;
7897
/* Find spot for the new subspace based on its sort key. */
7898
if (space->sd_subspaces == NULL)
7899
space->sd_subspaces = chain_entry;
7902
ssd_chain_struct *chain_pointer;
7903
ssd_chain_struct *prev_chain_pointer;
7905
chain_pointer = space->sd_subspaces;
7906
prev_chain_pointer = NULL;
7908
while (chain_pointer)
7910
prev_chain_pointer = chain_pointer;
7911
chain_pointer = chain_pointer->ssd_next;
7914
/* Now we have somewhere to put the new entry. Insert it and update
7916
if (prev_chain_pointer)
7918
chain_entry->ssd_next = chain_pointer;
7919
prev_chain_pointer->ssd_next = chain_entry;
7923
space->sd_subspaces = chain_entry;
7924
chain_entry->ssd_next = chain_pointer;
7928
#ifdef obj_set_subsection_attributes
7929
obj_set_subsection_attributes (seg, space->sd_seg, access_ctr, sort,
7930
quadrant, comdat, common, dup_common);
7936
/* Update the information for the given subspace based upon the
7937
various arguments. Return the modified subspace chain entry. */
7939
static ssd_chain_struct *
7940
update_subspace (sd_chain_struct *space,
7942
int loadable ATTRIBUTE_UNUSED,
7943
int code_only ATTRIBUTE_UNUSED,
7948
int zero ATTRIBUTE_UNUSED,
7950
int space_index ATTRIBUTE_UNUSED,
7951
int alignment ATTRIBUTE_UNUSED,
7955
ssd_chain_struct *chain_entry;
7957
chain_entry = is_defined_subspace (name);
7959
#ifdef obj_set_subsection_attributes
7960
obj_set_subsection_attributes (section, space->sd_seg, access_ctr, sort,
7961
quadrant, comdat, common, dup_common);
7967
/* Return the space chain entry for the space with the name NAME or
7968
NULL if no such space exists. */
7970
static sd_chain_struct *
7971
is_defined_space (char *name)
7973
sd_chain_struct *chain_pointer;
7975
for (chain_pointer = space_dict_root;
7977
chain_pointer = chain_pointer->sd_next)
7978
if (strcmp (SPACE_NAME (chain_pointer), name) == 0)
7979
return chain_pointer;
7981
/* No mapping from segment to space was found. Return NULL. */
7985
/* Find and return the space associated with the given seg. If no mapping
7986
from the given seg to a space is found, then return NULL.
7988
Unlike subspaces, the number of spaces is not expected to grow much,
7989
so a linear exhaustive search is OK here. */
7991
static sd_chain_struct *
7992
pa_segment_to_space (asection *seg)
7994
sd_chain_struct *space_chain;
7996
/* Walk through each space looking for the correct mapping. */
7997
for (space_chain = space_dict_root;
7999
space_chain = space_chain->sd_next)
8000
if (space_chain->sd_seg == seg)
8003
/* Mapping was not found. Return NULL. */
8007
/* Return the first space chain entry for the subspace with the name
8008
NAME or NULL if no such subspace exists.
8010
When there are multiple subspaces with the same name, switching to
8011
the first (i.e., default) subspace is preferable in most situations.
8012
For example, it wouldn't be desirable to merge COMDAT data with non
8015
Uses a linear search through all the spaces and subspaces, this may
8016
not be appropriate if we ever being placing each function in its
8019
static ssd_chain_struct *
8020
is_defined_subspace (char *name)
8022
sd_chain_struct *space_chain;
8023
ssd_chain_struct *subspace_chain;
8025
/* Walk through each space. */
8026
for (space_chain = space_dict_root;
8028
space_chain = space_chain->sd_next)
8030
/* Walk through each subspace looking for a name which matches. */
8031
for (subspace_chain = space_chain->sd_subspaces;
8033
subspace_chain = subspace_chain->ssd_next)
8034
if (strcmp (SUBSPACE_NAME (subspace_chain), name) == 0)
8035
return subspace_chain;
8038
/* Subspace wasn't found. Return NULL. */
8042
/* Find and return the subspace associated with the given seg. If no
8043
mapping from the given seg to a subspace is found, then return NULL.
8045
If we ever put each procedure/function within its own subspace
8046
(to make life easier on the compiler and linker), then this will have
8047
to become more efficient. */
8049
static ssd_chain_struct *
8050
pa_subsegment_to_subspace (asection *seg, subsegT subseg)
8052
sd_chain_struct *space_chain;
8053
ssd_chain_struct *subspace_chain;
8055
/* Walk through each space. */
8056
for (space_chain = space_dict_root;
8058
space_chain = space_chain->sd_next)
8060
if (space_chain->sd_seg == seg)
8062
/* Walk through each subspace within each space looking for
8063
the correct mapping. */
8064
for (subspace_chain = space_chain->sd_subspaces;
8066
subspace_chain = subspace_chain->ssd_next)
8067
if (subspace_chain->ssd_subseg == (int) subseg)
8068
return subspace_chain;
8072
/* No mapping from subsegment to subspace found. Return NULL. */
8076
/* Given a number, try and find a space with the name number.
8078
Return a pointer to a space dictionary chain entry for the space
8079
that was found or NULL on failure. */
8081
static sd_chain_struct *
8082
pa_find_space_by_number (int number)
8084
sd_chain_struct *space_chain;
8086
for (space_chain = space_dict_root;
8088
space_chain = space_chain->sd_next)
8090
if (SPACE_SPNUM (space_chain) == (unsigned int) number)
8094
/* No appropriate space found. Return NULL. */
8098
/* Return the starting address for the given subspace. If the starting
8099
address is unknown then return zero. */
8102
pa_subspace_start (sd_chain_struct *space, int quadrant)
8104
/* FIXME. Assumes everyone puts read/write data at 0x4000000, this
8105
is not correct for the PA OSF1 port. */
8106
if ((strcmp (SPACE_NAME (space), "$PRIVATE$") == 0) && quadrant == 1)
8108
else if (space->sd_seg == data_section && quadrant == 1)
8116
/* Helper function for pa_stringer. Used to find the end of
8120
pa_stringer_aux (char *s)
8122
unsigned int c = *s & CHAR_MASK;
8135
/* Handle a .STRING type pseudo-op. */
8138
pa_stringer (int append_zero)
8140
char *s, num_buf[4];
8144
/* Preprocess the string to handle PA-specific escape sequences.
8145
For example, \xDD where DD is a hexadecimal number should be
8146
changed to \OOO where OOO is an octal number. */
8149
/* We must have a valid space and subspace. */
8150
pa_check_current_space_and_subspace ();
8153
/* Skip the opening quote. */
8154
s = input_line_pointer + 1;
8156
while (is_a_char (c = pa_stringer_aux (s++)))
8163
/* Handle \x<num>. */
8166
unsigned int number;
8171
/* Get past the 'x'. */
8173
for (num_digit = 0, number = 0, dg = *s;
8175
&& (ISDIGIT (dg) || (dg >= 'a' && dg <= 'f')
8176
|| (dg >= 'A' && dg <= 'F'));
8180
number = number * 16 + dg - '0';
8181
else if (dg >= 'a' && dg <= 'f')
8182
number = number * 16 + dg - 'a' + 10;
8184
number = number * 16 + dg - 'A' + 10;
8194
sprintf (num_buf, "%02o", number);
8197
sprintf (num_buf, "%03o", number);
8200
for (i = 0; i <= num_digit; i++)
8201
s_start[i] = num_buf[i];
8205
/* This might be a "\"", skip over the escaped char. */
8212
stringer (8 + append_zero);
8213
pa_undefine_label ();
8216
/* Handle a .VERSION pseudo-op. */
8219
pa_version (int unused ATTRIBUTE_UNUSED)
8222
pa_undefine_label ();
8227
/* Handle a .COMPILER pseudo-op. */
8230
pa_compiler (int unused ATTRIBUTE_UNUSED)
8232
obj_som_compiler (0);
8233
pa_undefine_label ();
8238
/* Handle a .COPYRIGHT pseudo-op. */
8241
pa_copyright (int unused ATTRIBUTE_UNUSED)
8244
pa_undefine_label ();
8247
/* Just like a normal cons, but when finished we have to undefine
8248
the latest space label. */
8251
pa_cons (int nbytes)
8254
pa_undefine_label ();
8257
/* Like float_cons, but we need to undefine our label. */
8260
pa_float_cons (int float_type)
8262
float_cons (float_type);
8263
pa_undefine_label ();
8266
/* Like s_fill, but delete our label when finished. */
8269
pa_fill (int unused ATTRIBUTE_UNUSED)
8272
/* We must have a valid space and subspace. */
8273
pa_check_current_space_and_subspace ();
8277
pa_undefine_label ();
8280
/* Like lcomm, but delete our label when finished. */
8283
pa_lcomm (int needs_align)
8286
/* We must have a valid space and subspace. */
8287
pa_check_current_space_and_subspace ();
8290
s_lcomm (needs_align);
8291
pa_undefine_label ();
8294
/* Like lsym, but delete our label when finished. */
8297
pa_lsym (int unused ATTRIBUTE_UNUSED)
8300
/* We must have a valid space and subspace. */
8301
pa_check_current_space_and_subspace ();
8305
pa_undefine_label ();
8308
/* This function is called once, at assembler startup time. It should
8309
set up all the tables, etc. that the MD part of the assembler will need. */
8314
const char *retval = NULL;
8318
last_call_info = NULL;
8319
call_info_root = NULL;
8321
/* Set the default machine type. */
8322
if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, DEFAULT_LEVEL))
8323
as_warn (_("could not set architecture and machine"));
8325
/* Folding of text and data segments fails miserably on the PA.
8326
Warn user and disable "-R" option. */
8327
if (flag_readonly_data_in_text)
8329
as_warn (_("-R option not supported on this target."));
8330
flag_readonly_data_in_text = 0;
8337
op_hash = hash_new ();
8339
while (i < NUMOPCODES)
8341
const char *name = pa_opcodes[i].name;
8343
retval = hash_insert (op_hash, name, (struct pa_opcode *) &pa_opcodes[i]);
8344
if (retval != NULL && *retval != '\0')
8346
as_fatal (_("Internal error: can't hash `%s': %s\n"), name, retval);
8352
if ((pa_opcodes[i].match & pa_opcodes[i].mask)
8353
!= pa_opcodes[i].match)
8355
fprintf (stderr, _("internal error: losing opcode: `%s' \"%s\"\n"),
8356
pa_opcodes[i].name, pa_opcodes[i].args);
8361
while (i < NUMOPCODES && !strcmp (pa_opcodes[i].name, name));
8365
as_fatal (_("Broken assembler. No assembly attempted."));
8368
/* SOM will change text_section. To make sure we never put
8369
anything into the old one switch to the new one now. */
8370
subseg_set (text_section, 0);
8374
dummy_symbol = symbol_find_or_make ("L$dummy");
8375
S_SET_SEGMENT (dummy_symbol, text_section);
8376
/* Force the symbol to be converted to a real symbol. */
8377
symbol_get_bfdsym (dummy_symbol)->flags |= BSF_KEEP;
8381
/* On the PA relocations which involve function symbols must not be
8382
adjusted. This so that the linker can know when/how to create argument
8383
relocation stubs for indirect calls and calls to static functions.
8385
"T" field selectors create DLT relative fixups for accessing
8386
globals and statics in PIC code; each DLT relative fixup creates
8387
an entry in the DLT table. The entries contain the address of
8388
the final target (eg accessing "foo" would create a DLT entry
8389
with the address of "foo").
8391
Unfortunately, the HP linker doesn't take into account any addend
8392
when generating the DLT; so accessing $LIT$+8 puts the address of
8393
$LIT$ into the DLT rather than the address of $LIT$+8.
8395
The end result is we can't perform relocation symbol reductions for
8396
any fixup which creates entries in the DLT (eg they use "T" field
8399
??? Reject reductions involving symbols with external scope; such
8400
reductions make life a living hell for object file editors. */
8403
hppa_fix_adjustable (fixS *fixp)
8408
struct hppa_fix_struct *hppa_fix;
8410
hppa_fix = (struct hppa_fix_struct *) fixp->tc_fix_data;
8413
/* LR/RR selectors are implicitly used for a number of different relocation
8414
types. We must ensure that none of these types are adjusted (see below)
8415
even if they occur with a different selector. */
8416
code = elf_hppa_reloc_final_type (stdoutput, fixp->fx_r_type,
8417
hppa_fix->fx_r_format,
8418
hppa_fix->fx_r_field);
8422
/* Relocation types which use e_lrsel. */
8423
case R_PARISC_DIR21L:
8424
case R_PARISC_DLTREL21L:
8425
case R_PARISC_DPREL21L:
8426
case R_PARISC_PLTOFF21L:
8428
/* Relocation types which use e_rrsel. */
8429
case R_PARISC_DIR14R:
8430
case R_PARISC_DIR14DR:
8431
case R_PARISC_DIR14WR:
8432
case R_PARISC_DIR17R:
8433
case R_PARISC_DLTREL14R:
8434
case R_PARISC_DLTREL14DR:
8435
case R_PARISC_DLTREL14WR:
8436
case R_PARISC_DPREL14R:
8437
case R_PARISC_DPREL14DR:
8438
case R_PARISC_DPREL14WR:
8439
case R_PARISC_PLTOFF14R:
8440
case R_PARISC_PLTOFF14DR:
8441
case R_PARISC_PLTOFF14WR:
8443
/* Other types that we reject for reduction. */
8444
case R_PARISC_GNU_VTENTRY:
8445
case R_PARISC_GNU_VTINHERIT:
8452
/* Reject reductions of symbols in sym1-sym2 expressions when
8453
the fixup will occur in a CODE subspace.
8455
XXX FIXME: Long term we probably want to reject all of these;
8456
for example reducing in the debug section would lose if we ever
8457
supported using the optimizing hp linker. */
8460
&& (hppa_fix->segment->flags & SEC_CODE))
8463
/* We can't adjust any relocs that use LR% and RR% field selectors.
8465
If a symbol is reduced to a section symbol, the assembler will
8466
adjust the addend unless the symbol happens to reside right at
8467
the start of the section. Additionally, the linker has no choice
8468
but to manipulate the addends when coalescing input sections for
8469
"ld -r". Since an LR% field selector is defined to round the
8470
addend, we can't change the addend without risking that a LR% and
8471
it's corresponding (possible multiple) RR% field will no longer
8472
sum to the right value.
8475
. ldil LR%foo+0,%r21
8476
. ldw RR%foo+0(%r21),%r26
8477
. ldw RR%foo+4(%r21),%r25
8479
If foo is at address 4092 (decimal) in section `sect', then after
8480
reducing to the section symbol we get
8481
. LR%sect+4092 == (L%sect)+0
8482
. RR%sect+4092 == (R%sect)+4092
8483
. RR%sect+4096 == (R%sect)-4096
8484
and the last address loses because rounding the addend to 8k
8485
multiples takes us up to 8192 with an offset of -4096.
8487
In cases where the LR% expression is identical to the RR% one we
8488
will never have a problem, but is so happens that gcc rounds
8489
addends involved in LR% field selectors to work around a HP
8490
linker bug. ie. We often have addresses like the last case
8491
above where the LR% expression is offset from the RR% one. */
8493
if (hppa_fix->fx_r_field == e_lrsel
8494
|| hppa_fix->fx_r_field == e_rrsel
8495
|| hppa_fix->fx_r_field == e_nlrsel)
8498
/* Reject reductions of symbols in DLT relative relocs,
8499
relocations with plabels. */
8500
if (hppa_fix->fx_r_field == e_tsel
8501
|| hppa_fix->fx_r_field == e_ltsel
8502
|| hppa_fix->fx_r_field == e_rtsel
8503
|| hppa_fix->fx_r_field == e_psel
8504
|| hppa_fix->fx_r_field == e_rpsel
8505
|| hppa_fix->fx_r_field == e_lpsel)
8508
/* Reject absolute calls (jumps). */
8509
if (hppa_fix->fx_r_type == R_HPPA_ABS_CALL)
8512
/* Reject reductions of function symbols. */
8513
if (fixp->fx_addsy != 0 && S_IS_FUNCTION (fixp->fx_addsy))
8519
/* Return nonzero if the fixup in FIXP will require a relocation,
8520
even it if appears that the fixup could be completely handled
8524
hppa_force_relocation (struct fix *fixp)
8526
struct hppa_fix_struct *hppa_fixp;
8528
hppa_fixp = (struct hppa_fix_struct *) fixp->tc_fix_data;
8530
if (fixp->fx_r_type == (int) R_HPPA_ENTRY
8531
|| fixp->fx_r_type == (int) R_HPPA_EXIT
8532
|| fixp->fx_r_type == (int) R_HPPA_BEGIN_BRTAB
8533
|| fixp->fx_r_type == (int) R_HPPA_END_BRTAB
8534
|| fixp->fx_r_type == (int) R_HPPA_BEGIN_TRY
8535
|| fixp->fx_r_type == (int) R_HPPA_END_TRY
8536
|| (fixp->fx_addsy != NULL && fixp->fx_subsy != NULL
8537
&& (hppa_fixp->segment->flags & SEC_CODE) != 0))
8541
if (fixp->fx_r_type == (int) R_PARISC_GNU_VTINHERIT
8542
|| fixp->fx_r_type == (int) R_PARISC_GNU_VTENTRY)
8546
gas_assert (fixp->fx_addsy != NULL);
8548
/* Ensure we emit a relocation for global symbols so that dynamic
8550
if (S_FORCE_RELOC (fixp->fx_addsy, 1))
8553
/* It is necessary to force PC-relative calls/jumps to have a relocation
8554
entry if they're going to need either an argument relocation or long
8557
&& arg_reloc_stub_needed (symbol_arg_reloc_info (fixp->fx_addsy),
8558
hppa_fixp->fx_arg_reloc))
8561
/* Now check to see if we're going to need a long-branch stub. */
8562
if (fixp->fx_r_type == (int) R_HPPA_PCREL_CALL)
8564
long pc = md_pcrel_from (fixp);
8565
valueT distance, min_stub_distance;
8567
distance = fixp->fx_offset + S_GET_VALUE (fixp->fx_addsy) - pc - 8;
8569
/* Distance to the closest possible stub. This will detect most
8570
but not all circumstances where a stub will not work. */
8571
min_stub_distance = pc + 16;
8573
if (last_call_info != NULL)
8574
min_stub_distance -= S_GET_VALUE (last_call_info->start_symbol);
8577
if ((distance + 8388608 >= 16777216
8578
&& min_stub_distance <= 8388608)
8579
|| (hppa_fixp->fx_r_format == 17
8580
&& distance + 262144 >= 524288
8581
&& min_stub_distance <= 262144)
8582
|| (hppa_fixp->fx_r_format == 12
8583
&& distance + 8192 >= 16384
8584
&& min_stub_distance <= 8192)
8589
if (fixp->fx_r_type == (int) R_HPPA_ABS_CALL)
8592
/* No need (yet) to force another relocations to be emitted. */
8596
/* Now for some ELF specific code. FIXME. */
8598
/* For ELF, this function serves one purpose: to setup the st_size
8599
field of STT_FUNC symbols. To do this, we need to scan the
8600
call_info structure list, determining st_size in by taking the
8601
difference in the address of the beginning/end marker symbols. */
8604
elf_hppa_final_processing (void)
8606
struct call_info *call_info_pointer;
8608
for (call_info_pointer = call_info_root;
8610
call_info_pointer = call_info_pointer->ci_next)
8612
elf_symbol_type *esym
8613
= ((elf_symbol_type *)
8614
symbol_get_bfdsym (call_info_pointer->start_symbol));
8615
esym->internal_elf_sym.st_size =
8616
S_GET_VALUE (call_info_pointer->end_symbol)
8617
- S_GET_VALUE (call_info_pointer->start_symbol) + 4;
8622
pa_vtable_entry (int ignore ATTRIBUTE_UNUSED)
8624
struct fix *new_fix;
8626
new_fix = obj_elf_vtable_entry (0);
8630
struct hppa_fix_struct * hppa_fix = obstack_alloc (¬es, sizeof (struct hppa_fix_struct));
8632
hppa_fix->fx_r_type = R_HPPA;
8633
hppa_fix->fx_r_field = e_fsel;
8634
hppa_fix->fx_r_format = 32;
8635
hppa_fix->fx_arg_reloc = 0;
8636
hppa_fix->segment = now_seg;
8637
new_fix->tc_fix_data = (void *) hppa_fix;
8638
new_fix->fx_r_type = (int) R_PARISC_GNU_VTENTRY;
8643
pa_vtable_inherit (int ignore ATTRIBUTE_UNUSED)
8645
struct fix *new_fix;
8647
new_fix = obj_elf_vtable_inherit (0);
8651
struct hppa_fix_struct * hppa_fix = obstack_alloc (¬es, sizeof (struct hppa_fix_struct));
8653
hppa_fix->fx_r_type = R_HPPA;
8654
hppa_fix->fx_r_field = e_fsel;
8655
hppa_fix->fx_r_format = 32;
8656
hppa_fix->fx_arg_reloc = 0;
8657
hppa_fix->segment = now_seg;
8658
new_fix->tc_fix_data = (void *) hppa_fix;
8659
new_fix->fx_r_type = (int) R_PARISC_GNU_VTINHERIT;
8664
/* Table of pseudo ops for the PA. FIXME -- how many of these
8665
are now redundant with the overall GAS and the object file
8666
dependent tables? */
8667
const pseudo_typeS md_pseudo_table[] =
8669
/* align pseudo-ops on the PA specify the actual alignment requested,
8670
not the log2 of the requested alignment. */
8672
{"align", pa_align, 8},
8675
{"align", s_align_bytes, 8},
8677
{"begin_brtab", pa_brtab, 1},
8678
{"begin_try", pa_try, 1},
8679
{"block", pa_block, 1},
8680
{"blockz", pa_block, 0},
8681
{"byte", pa_cons, 1},
8682
{"call", pa_call, 0},
8683
{"callinfo", pa_callinfo, 0},
8684
#if defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))
8685
{"code", obj_elf_text, 0},
8687
{"code", pa_text, 0},
8688
{"comm", pa_comm, 0},
8691
{"compiler", pa_compiler, 0},
8693
{"copyright", pa_copyright, 0},
8694
#if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
8695
{"data", pa_data, 0},
8697
{"double", pa_float_cons, 'd'},
8698
{"dword", pa_cons, 8},
8700
{"end_brtab", pa_brtab, 0},
8701
#if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
8702
{"end_try", pa_try, 0},
8704
{"enter", pa_enter, 0},
8705
{"entry", pa_entry, 0},
8707
{"exit", pa_exit, 0},
8708
{"export", pa_export, 0},
8709
{"fill", pa_fill, 0},
8710
{"float", pa_float_cons, 'f'},
8711
{"half", pa_cons, 2},
8712
{"import", pa_import, 0},
8713
{"int", pa_cons, 4},
8714
{"label", pa_label, 0},
8715
{"lcomm", pa_lcomm, 0},
8716
{"leave", pa_leave, 0},
8717
{"level", pa_level, 0},
8718
{"long", pa_cons, 4},
8719
{"lsym", pa_lsym, 0},
8721
{"nsubspa", pa_subspace, 1},
8723
{"octa", pa_cons, 16},
8724
{"org", pa_origin, 0},
8725
{"origin", pa_origin, 0},
8726
{"param", pa_param, 0},
8727
{"proc", pa_proc, 0},
8728
{"procend", pa_procend, 0},
8729
{"quad", pa_cons, 8},
8731
{"short", pa_cons, 2},
8732
{"single", pa_float_cons, 'f'},
8734
{"space", pa_space, 0},
8735
{"spnum", pa_spnum, 0},
8737
{"string", pa_stringer, 0},
8738
{"stringz", pa_stringer, 1},
8740
{"subspa", pa_subspace, 0},
8742
#if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
8743
{"text", pa_text, 0},
8745
{"version", pa_version, 0},
8747
{"vtable_entry", pa_vtable_entry, 0},
8748
{"vtable_inherit", pa_vtable_inherit, 0},
8750
{"word", pa_cons, 4},
8756
hppa_cfi_frame_initial_instructions (void)
8758
cfi_add_CFA_def_cfa (30, 0);
8762
hppa_regname_to_dw2regnum (char *regname)
8764
unsigned int regnum = -1;
8768
static struct { char *name; int dw2regnum; } regnames[] =
8770
{ "sp", 30 }, { "rp", 2 },
8773
for (i = 0; i < ARRAY_SIZE (regnames); ++i)
8774
if (strcmp (regnames[i].name, regname) == 0)
8775
return regnames[i].dw2regnum;
8777
if (regname[0] == 'r')
8780
regnum = strtoul (p, &q, 10);
8781
if (p == q || *q || regnum >= 32)
8784
else if (regname[0] == 'f' && regname[1] == 'r')
8787
regnum = strtoul (p, &q, 10);
8788
#if TARGET_ARCH_SIZE == 64
8789
if (p == q || *q || regnum <= 4 || regnum >= 32)
8794
|| (*q && ((*q != 'L' && *q != 'R') || *(q + 1)))
8795
|| regnum <= 4 || regnum >= 32)
8797
regnum = (regnum - 4) * 2 + 32;