OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [binutils-2.18.50/] [gas/] [config/] [tc-hppa.c] - Blame information for rev 38

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.