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