* stack.c (print_frame_info): When checking PC_IN_CALL_DUMMY,
[deliverable/binutils-gdb.git] / gas / config / tc-hppa.h
CommitLineData
5868b1fe
ILT
1/* tc-hppa.h -- Header file for the PA */
2
3/* Copyright (C) 1989 Free Software Foundation, Inc.
4
5This file is part of GAS, the GNU Assembler.
6
7GAS is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 1, or (at your option)
10any later version.
11
12GAS is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GAS; see the file COPYING. If not, write to
19the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
20
21
22/*
23 HP PA-RISC support was contributed by the Center for Software Science
24 at the University of Utah.
25 */
26
27#ifndef _TC_HPPA_H
28#define _TC_HPPA_H
29
30#ifndef TC_HPPA
31#define TC_HPPA 1
32#endif
33
34#define TARGET_ARCH bfd_arch_hppa
35#define TARGET_FORMAT "elf32-hppa"
36
37#define ASEC_NULL (asection *)0
38
39/* We can do sym1 - sym2 as long as sym2 is $global$ */
40
41#define SEG_DIFF_ALLOWED
42
43typedef enum FPOF
44 {
45 SGL, DBL, ILLEGAL_FMT, QUAD
46 } FP_Operand_Format;
47
48extern char *expr_end;
49
50extern void s_globl (), s_long (), s_short (), s_space (), cons ();
51extern void stringer ();
52extern unsigned int next_char_of_string ();
53
54extern void pa_big_cons ();
55extern void pa_cons ();
56extern void pa_data ();
57extern void pa_desc ();
58extern void pa_float_cons ();
59extern void pa_fill ();
60extern void pa_lcomm ();
61extern void pa_lsym ();
62extern void pa_stringer ();
63extern void pa_text ();
64extern void pa_version ();
65
66int pa_parse_number ();
67
68int pa_parse_fp_cmp_cond ();
69
70FP_Operand_Format pa_parse_fp_format ();
71
72#ifdef __STDC__
73int getExpression (char *str);
74#else
75int getExpression ();
76#endif
77
78int getAbsoluteExpression ();
79
80int evaluateAbsolute ();
81
82int pa_build_arg_reloc ();
83
84unsigned int pa_align_arg_reloc ();
85
86void pa_skip ();
87
88int pa_parse_nullif ();
89
90int pa_parse_nonneg_cmpsub_cmpltr ();
91
92int pa_parse_neg_cmpsub_cmpltr ();
93
94int pa_parse_nonneg_add_cmpltr ();
95
96int pa_parse_neg_add_cmpltr ();
97
98int pa_build_arg_reloc ();
99
100void s_seg (), s_proc (), s_data1 ();
101
102void pa_block (), pa_call (), pa_call_args (), pa_callinfo ();
103void pa_code (), pa_comm (), pa_copyright (), pa_end ();
104void pa_enter ();
105void pa_entry (), pa_equ (), pa_exit (), pa_export ();
106void pa_export_args (), pa_import (), pa_label (), pa_leave ();
107void pa_origin (), pa_proc (), pa_procend (), pa_space ();
108void pa_spnum (), pa_subspace (), pa_version ();
109
110extern const pseudo_typeS md_pseudo_table[];
111
112/*
113 PA-89 floating point registers are arranged like this:
114
115
116 +--------------+--------------+
117 | 0 or 16L | 16 or 16R |
118 +--------------+--------------+
119 | 1 or 17L | 17 or 17R |
120 +--------------+--------------+
121 | | |
122
123 . . .
124 . . .
125 . . .
126
127 | | |
128 +--------------+--------------+
129 | 14 or 30L | 30 or 30R |
130 +--------------+--------------+
131 | 15 or 31L | 31 or 31R |
132 +--------------+--------------+
133
134
135 The following is a version of pa_parse_number that
136 handles the L/R notation and returns the correct
137 value to put into the instruction register field.
138 The correct value to put into the instruction is
139 encoded in the structure 'pa_89_fp_reg_struct'.
140
141 */
142
143struct pa_89_fp_reg_struct
144 {
145 char number_part;
146 char L_R_select;
147 };
148
149int need_89_opcode ();
150int pa_89_parse_number ();
151
152
153/* pa-ctrl-func.h -- Control Structures and Functions for the PA */
154
155extern unsigned int assemble_3 ( /* unsigned int x; */ );
156
157extern void dis_assemble_3 ( /* unsigned int x, *r; */ );
158
159extern unsigned int assemble_12 ( /* unsigned int x,y; */ );
160
161extern void dis_assemble_12 ( /* unsigned int as12, *x,*y */ );
162
163extern unsigned long assemble_17 ( /* unsigned int x,y,z */ );
164
165extern void dis_assemble_17 ( /* unsigned int as17, *x,*y,*z */ );
166
167extern unsigned long assemble_21 ( /* unsigned int x; */ );
168
169extern void dis_assemble_21 ( /* unsigned int as21,*x; */ );
170
171extern void sign_unext ( /* unsigned int x,len; unsigned int *result */ );
172
173extern void low_sign_unext ( /* unsigned int x,len; unsigned int *result */ );
174
175struct call_desc
176 {
177 unsigned int arg_reloc;
178 unsigned int arg_count;
179 };
180
181typedef struct call_desc call_descS;
182
183extern call_descS last_call_desc;
184
185/* GDB debug support */
186
187#if defined(OBJ_SOME)
188#define GDB_DEBUG_SPACE_NAME "$GDB_DEBUG$"
189#define GDB_STRINGS_SUBSPACE_NAME "$GDB_STRINGS$"
190#define GDB_SYMBOLS_SUBSPACE_NAME "$GDB_SYMBOLS$"
191#else
192#define GDB_DEBUG_SPACE_NAME ".stab"
193#define GDB_STRINGS_SUBSPACE_NAME ".stabstr"
194#define GDB_SYMBOLS_SUBSPACE_NAME ".stab"
195#endif
196/* pre-defined subsegments (subspaces) for the HP 9000 Series 800 */
197
198#define SUBSEG_CODE 0
199#define SUBSEG_DATA 0
200#define SUBSEG_LIT 1
201#define SUBSEG_BSS 2
202#define SUBSEG_UNWIND 3
203#define SUBSEG_GDB_STRINGS 0
204#define SUBSEG_GDB_SYMBOLS 1
205
206#define UNWIND_SECTION_NAME ".hppa_unwind"
207/* subspace dictionary chain entry structure */
208
209struct subspace_dictionary_chain
210 {
211#if defined(OBJ_OSFROSE) | defined(OBJ_ELF)
212#ifdef OBJ_OSFROSE
213 region_command_t *ssd_entry;/* XXX: not sure this is what we need here */
214#else
215 Elf_Internal_Shdr *ssd_entry;
216 unsigned long ssd_vm_addr;
217#endif
218 char *ssd_name; /* used until time of writing object file */
219 /* then we use ssd_entry->regc_region_name */
220 unsigned char ssd_quadrant;
221 unsigned char ssd_sort_key;
222 unsigned char ssd_common;
223 unsigned char ssd_dup_common;
224 unsigned char ssd_loadable;
225 unsigned char ssd_code_only;
226#else
227 subspace_dictS *ssd_entry; /* this dictionary */
228#endif
229 int ssd_defined; /* this subspace has been used */
230 int ssd_space_number; /* space # this subspace is in */
231 asection *ssd_seg; /* this subspace = this seg */
232 int ssd_subseg; /* and subseg */
233 int ssd_zero;
234 int object_file_index; /* index of this entry within
235 the subspace dictionary of
236 the object file (not used until
237 the object file is written */
238 int ssd_last_align; /* the size of the last alignment
239 request for this subspace */
240 symbolS *ssd_start_sym; /* a symbol whose value is the
241 start of this subspace */
242 struct subspace_dictionary_chain *ssd_next; /* next subspace dict. entry */
243 };
244
245typedef struct subspace_dictionary_chain subspace_dict_chainS;
246
247/* space dictionary chain entry structure */
248
249struct space_dictionary_chain
250 {
251#ifdef OBJ_OSFROSE
252 region_command_t *sd_entry; /* XXX: not sure this is what we need here */
253 char *sd_name; /* used until time of writing object file */
254 /* then we use sd_entry->regc_region_name */
255 unsigned int sd_loadable;
256 unsigned int sd_private;
257 unsigned int sd_spnum;
258 unsigned char sd_sort_key;
259#else
260#ifdef OBJ_ELF
261 Elf_Internal_Shdr *sd_entry;
262 char *sd_name; /* used until time of writing object file */
263 /* then we use sd_entry->sh_name */
264 unsigned int sd_loadable;
265 unsigned int sd_private;
266 unsigned int sd_spnum;
267 unsigned char sd_sort_key;
268#else
269 space_dictS *sd_entry; /* this dictionary */
270#endif
271#endif
272 int sd_defined; /* this space has been used */
273 asection *sd_seg; /* GAS segment to which this space corresponds */
274 int sd_last_subseg; /* current subsegment number we are using */
275 subspace_dict_chainS *sd_subspaces; /* all subspaces in this space */
276 struct space_dictionary_chain *sd_next; /* the next space dict. entry */
277 };
278
279typedef struct space_dictionary_chain space_dict_chainS;
280
281/*
282 Macros to maintain spaces and subspaces
283 */
284
285#ifdef OBJ_OSFROSE
286#define SPACE_DEFINED(space_chain) (space_chain)->sd_defined
287#define SPACE_PRIVATE(space_chain) (space_chain)->sd_private
288#define SPACE_LOADABLE(space_chain) (space_chain)->sd_loadable
289#define SPACE_SPNUM(space_chain) (space_chain)->sd_spnum
290#define SPACE_SORT(space_chain) (space_chain)->sd_sort_key
291#define SPACE_NAME(space_chain) (space_chain)->sd_name
292
293#define SUBSPACE_QUADRANT(ss_chain) (ss_chain)->ssd_quadrant
294#define SUBSPACE_ALIGN(ss_chain) (ss_chain)->ssd_entry->regc_addralign
295#define SUBSPACE_ACCESS(ss_chain) (ss_chain)->ssd_entry->regc_initprot
296#define SUBSPACE_SORT(ss_chain) (ss_chain)->ssd_sort_key
297#define SUBSPACE_COMMON(ss_chain) (ss_chain)->ssd_common
298#define SUBSPACE_ZERO(ss_chain) (ss_chain)->ssd_zero
299#define SUBSPACE_DUP_COMM(ss_chain) (ss_chain)->ssd_dup_common
300#define SUBSPACE_CODE_ONLY(ssch) ((ssch)->ssd_entry->regc_flags & REG_TEXT_T)
301#define SET_SUBSPACE_CODE_ONLY(ssch,val) (ssch)->ssd_entry->regc_flags |= ((val) ? REG_TEXT_T : 0)
302#define SUBSPACE_LOADABLE(ss_chain) (ss_chain)->ssd_loadable
303#define SUBSPACE_SUBSPACE_START(ss_chain) (ss_chain)->ssd_entry->regc_addr.vm_addr
304#define SUBSPACE_SUBSPACE_LENGTH(ss_chain) (ss_chain)->ssd_entry->regc_vm_size
305#define SUBSPACE_REGION_NAME(ss_chain) (ss_chain)->ssd_entry->regc_region_name
306#define SUBSPACE_NAME(ss_chain) (ss_chain)->ssd_name
307#endif
308
309#ifdef OBJ_ELF
310#define RELOC_EXPANSION_POSSIBLE
311#define MAX_RELOC_EXPANSION 5
312
313#define SPACE_DEFINED(space_chain) (space_chain)->sd_defined
314#define SPACE_PRIVATE(space_chain) (space_chain)->sd_private
315#define SPACE_LOADABLE(space_chain) (space_chain)->sd_loadable
316#define SPACE_SPNUM(space_chain) (space_chain)->sd_spnum
317#define SPACE_SORT(space_chain) (space_chain)->sd_sort_key
318#define SPACE_NAME(space_chain) (space_chain)->sd_name
319
320#define SUBSPACE_QUADRANT(ss_chain) (ss_chain)->ssd_quadrant
321#define SUBSPACE_ALIGN(ss_chain) (ss_chain)->ssd_entry->sh_addralign
322#define SUBSPACE_ACCESS(ss_chain) (ss_chain)->ssd_entry->sh_flags
323#define SUBSPACE_SORT(ss_chain) (ss_chain)->ssd_sort_key
324#define SUBSPACE_COMMON(ss_chain) (ss_chain)->ssd_common
325#define SUBSPACE_ZERO(ss_chain) (ss_chain)->ssd_zero
326#define SUBSPACE_DUP_COMM(ss_chain) (ss_chain)->ssd_dup_common
327#define SUBSPACE_CODE_ONLY(ssch) \
328 (((ssch)->ssd_entry->sh_flags & (SHF_ALLOC | SHF_EXECINSTR | SHF_WRITE)) \
329 == (SHF_ALLOC | SHF_EXECINSTR))
330#define SET_SUBSPACE_CODE_ONLY(ssch,val) \
331 (ssch)->ssd_entry->sh_flags &= ((val) ? ~SHF_WRITE : 0xffffffff)
332#define SUBSPACE_LOADABLE(ss_chain) (ss_chain)->ssd_loadable
333#define SUBSPACE_SUBSPACE_START(ss_chain) (ss_chain)->ssd_vm_addr
334#define SUBSPACE_SUBSPACE_LENGTH(ss_chain) (ss_chain)->ssd_entry->sh_size
335#define SUBSPACE_NAME(ss_chain) (ss_chain)->ssd_name
336
337#define STAB_FIXUP(frag,toptr,symP,stab_type) \
338 if ( (stab_type == 's' || stab_type == 'n') \
339 && symP->sy_value.X_seg == undefined_section) \
340 { \
341 int i = S_GET_TYPE(symP) & N_TYPE; \
342 fix_new_hppa(frag, \
343 toptr-frag->fr_literal, /* where */ \
344 4, /* size */ \
345 symP->sy_value.X_add_symbol, /* addr of sym for this stab */ \
346 (asymbol *)NULL, \
347 0, \
348 i == N_UNDF || i == N_ABS, /* 1 if internal reloc */ \
349 R_HPPA, /* type */ \
350 e_fsel, /* fixup fld = F% */ \
351 32, \
352 0, /* arg_reloc */ \
353 (char *)0 \
354 ); \
355 } \
356 else if ( stab_type == 'd' ) \
357 { \
358 fix_new_hppa (frag, \
359 toptr-frag->fr_literal, /* where */ \
360 4, /* size */ \
361 symP, /* addr of sym for this stab */ \
362 (asymbol *)NULL, \
363 0, \
364 0, \
365 R_HPPA, /* type */ \
366 e_fsel, /* fixup fld = F% */ \
367 32, \
368 0, /* arg_reloc */ \
369 (char *)0 \
370 ); \
371 }
372
373#endif
374
375#ifdef OBJ_SOM
376#define SPACE_DEFINED(space_chain) (space_chain)->sd_entry->is_defined
377#define SPACE_PRIVATE(space_chain) (space_chain)->sd_entry->is_private
378#define SPACE_LOADABLE(space_chain) (space_chain)->sd_entry->is_loadable
379#define SPACE_SPNUM(space_chain) (space_chain)->sd_entry->space_number
380#define SPACE_SORT(space_chain) (space_chain)->sd_entry->sort_key
381#define SPACE_NAME(space_chain) (space_chain)->sd_entry->name
382
383#define SUBSPACE_QUADRANT(ss_chain) (ss_chain)->ssd_entry->quadrant
384#define SUBSPACE_ALIGN(ss_chain) (ss_chain)->ssd_entry->alignment
385#define SUBSPACE_ACCESS(ss_chain) (ss_chain)->ssd_entry->access_control_bits
386#define SUBSPACE_SORT(ss_chain) (ss_chain)->ssd_entry->sort_key
387#define SUBSPACE_COMMON(ss_chain) (ss_chain)->ssd_entry->is_common
388#define SUBSPACE_ZERO(ss_chain) (ss_chain)->ssd_zero
389#define SUBSPACE_DUP_COMM(ss_chain) (ss_chain)->ssd_entry->dup_common
390#define SUBSPACE_CODE_ONLY(ss_chain) (ss_chain)->ssd_entry->code_only
391#define SUBSPACE_LOADABLE(ss_chain) (ss_chain)->ssd_entry->is_loadable
392#define SUBSPACE_SUBSPACE_START(ss_chain) (ss_chain)->ssd_entry->subspace_start
393#define SUBSPACE_SUBSPACE_LENGTH(ss_chain) (ss_chain)->ssd_entry->subspace_length
394#define SUBSPACE_NAME(ss_chain) (ss_chain)->ssd_entry->name
395#endif
396
397extern space_dict_chainS *space_dict_root;
398extern space_dict_chainS *space_dict_last;
399
400extern space_dict_chainS *current_space;
401extern subspace_dict_chainS *current_subspace;
402
403extern space_dict_chainS *create_new_space ();
404
405extern subspace_dict_chainS *create_new_subspace ();
406
407extern subspace_dict_chainS *update_subspace ();
408
409extern space_dict_chainS *is_defined_space ();
410
411extern space_dict_chainS *pa_segment_to_space ();
412
413extern subspace_dict_chainS *is_defined_subspace ();
414
415extern subspace_dict_chainS *pa_subsegment_to_subspace ();
416
417extern space_dict_chainS *pa_find_space_by_number ();
418
419extern unsigned int pa_subspace_start ();
420
421extern int is_last_defined_subspace ();
422
423/* symbol support */
424
425extern symbolS *pa_get_start_symbol ();
426
427extern symbolS *pa_set_start_symbol ();
428
429/* default space and subspace dictionaries */
430
431struct default_subspace_dict
432 {
433 char *name;
434 char defined;
435 char loadable, code_only, common, dup_common, zero, sort;
436 int access, space_index, alignment, quadrant;
437#ifdef OBJ_SOM
438 segT segment;
439#else
440 int def_space_index; /* this is an index in the default spaces array */
441 char *alias; /* an alias for this section (or NULL if there isn't one) */
442#endif
443 subsegT subsegment;
444 };
445
446extern struct default_subspace_dict pa_def_subspaces[];
447
448struct default_space_dict
449 {
450 char *name;
451 int spnum;
452 char loadable;
453 char defined;
454 char private;
455 char sort;
456#ifdef OBJ_SOM
457 segT segment;
458#else
459 asection *segment;
460 char *alias; /* an alias for this section (or NULL if there isn't one) */
461#endif
462 };
463
464extern struct default_space_dict pa_def_spaces[];
465
466/*
467 Support for keeping track of the most recent label in each
468 space.
469 */
470
471typedef struct label_symbol_struct
472 {
473 symbolS *lss_label; /* the label symbol */
474 space_dict_chainS *lss_space; /* the space to which it applies*/
475 struct label_symbol_struct *lss_next; /* the next label symbol */
476 } label_symbolS;
477
478extern label_symbolS *label_symbols_rootP;
479
480label_symbolS *pa_get_label ();
481int pa_label_is_defined ();
482void pa_define_label ();
483void pa_undefine_label ();
484int pa_pseudo_op_moves_pc ();
485
486/* end of label symbol support. */
487
488#define is_DP_relative(exp) ( (exp).X_subtract_symbol \
489 && strcmp((exp).X_subtract_symbol->bsym->name, \
490 "$global$") == 0 )
491
492#define is_PC_relative(exp) ( (exp).X_subtract_symbol \
493 && strcmp((exp).X_subtract_symbol->bsym->name, \
494 "$PIC_pcrel$0") == 0 )
495
496#define is_complex(exp) ((exp).X_seg && (exp).X_seg == diff_section)
497
498#define tc_crawl_symbol_chain(headers) {;} /* Not used. */
499
500#define tc_headers_hook(headers) {;} /* Not used. */
501
502#define elf_tc_symbol elf_hppa_tc_symbol
503#define elf_tc_make_sections elf_hppa_tc_make_sections
504extern void elf_hppa_final_processing ();
505#define elf_tc_final_processing elf_hppa_final_processing
506
507/* We need to parse field selectors in .byte, etc. */
508
509#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
510 parse_cons_expression_hppa (exp)
511#define TC_CONS_FIX_NEW cons_fix_new_hppa
512
513extern void parse_cons_expression_hppa PARAMS ((expressionS *exp));
514extern void cons_fix_new_hppa PARAMS ((fragS *frag,
515 int where,
516 int size,
517 expressionS *exp));
518
519#endif /* _TC_HPPA_H */
This page took 0.041952 seconds and 4 git commands to generate.