~ubuntu-branches/ubuntu/utopic/binutils-arm64-cross/utopic

« back to all changes in this revision

Viewing changes to binutils-2.23.52.20130611/gas/config/tc-hppa.c

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2013-06-20 17:38:09 UTC
  • Revision ID: package-import@ubuntu.com-20130620173809-app8lzgvymy5fg6c
Tags: 0.7
Build-depend on binutils-source (>= 2.23.52.20130620-1~).

Show diffs side-by-side

added added

removed removed

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