2000-04-22 04:22:24 +08:00
|
|
|
/* tc-ia64.h -- Header file for tc-ia64.c.
|
2022-01-02 06:30:17 +08:00
|
|
|
Copyright (C) 1998-2022 Free Software Foundation, Inc.
|
2000-04-22 04:22:24 +08:00
|
|
|
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
|
|
|
|
|
|
|
|
This file is part of GAS, the GNU Assembler.
|
|
|
|
|
|
|
|
GAS is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
2007-07-03 19:01:12 +08:00
|
|
|
the Free Software Foundation; either version 3, or (at your option)
|
2000-04-22 04:22:24 +08:00
|
|
|
any later version.
|
|
|
|
|
|
|
|
GAS is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with GAS; see the file COPYING. If not, write to
|
2005-05-05 17:13:19 +08:00
|
|
|
the Free Software Foundation, 51 Franklin Street - Fifth Floor,
|
|
|
|
Boston, MA 02110-1301, USA. */
|
2000-04-22 04:22:24 +08:00
|
|
|
|
2002-05-25 20:53:29 +08:00
|
|
|
#include "opcode/ia64.h"
|
|
|
|
#include "elf/ia64.h"
|
2000-04-22 04:22:24 +08:00
|
|
|
|
|
|
|
#define TC_IA64
|
|
|
|
|
2000-11-07 09:21:10 +08:00
|
|
|
/* Linux is little endian by default. HPUX is big endian by default. */
|
|
|
|
#ifdef TE_HPUX
|
|
|
|
#define TARGET_BYTES_BIG_ENDIAN 1
|
2002-01-11 17:27:39 +08:00
|
|
|
#define MD_FLAGS_DEFAULT EF_IA_64_BE
|
2000-11-07 09:21:10 +08:00
|
|
|
#else
|
|
|
|
#define TARGET_BYTES_BIG_ENDIAN 0
|
2002-01-11 17:27:39 +08:00
|
|
|
#define MD_FLAGS_DEFAULT EF_IA_64_ABI64
|
2000-11-07 09:21:10 +08:00
|
|
|
#endif /* TE_HPUX */
|
|
|
|
|
2008-08-13 07:39:31 +08:00
|
|
|
extern void (*ia64_number_to_chars) (char *, valueT, int);
|
2003-05-01 09:00:30 +08:00
|
|
|
#define md_number_to_chars (*ia64_number_to_chars)
|
|
|
|
|
2008-08-13 07:39:31 +08:00
|
|
|
extern void ia64_elf_section_change_hook (void);
|
2003-05-01 09:00:30 +08:00
|
|
|
#define md_elf_section_change_hook ia64_elf_section_change_hook
|
|
|
|
|
|
|
|
/* We record the endian for this section. 0 means default, 1 means
|
|
|
|
big endian and 2 means little endian. */
|
|
|
|
struct ia64_segment_info_type
|
|
|
|
{
|
|
|
|
unsigned int endian : 2;
|
|
|
|
};
|
|
|
|
|
|
|
|
#define TC_SEGMENT_INFO_TYPE struct ia64_segment_info_type
|
|
|
|
|
2008-08-13 07:39:31 +08:00
|
|
|
extern void ia64_adjust_symtab (void);
|
2003-05-08 03:31:10 +08:00
|
|
|
#define tc_adjust_symtab() ia64_adjust_symtab ()
|
|
|
|
|
2008-08-13 07:39:31 +08:00
|
|
|
extern void ia64_frob_file (void);
|
2003-05-08 03:31:10 +08:00
|
|
|
#define tc_frob_file() ia64_frob_file ()
|
|
|
|
|
2000-11-07 09:21:10 +08:00
|
|
|
/* We need to set the default object file format in ia64_init and not in
|
|
|
|
md_begin. This is because parse_args is called before md_begin, and we
|
|
|
|
do not want md_begin to wipe out the flag settings set by options parsed in
|
|
|
|
md_parse_args. */
|
|
|
|
|
|
|
|
#define HOST_SPECIAL_INIT ia64_init
|
2008-08-13 07:39:31 +08:00
|
|
|
extern void ia64_init (int, char **);
|
2000-11-07 09:21:10 +08:00
|
|
|
|
|
|
|
#define TARGET_FORMAT ia64_target_format()
|
2008-08-13 07:39:31 +08:00
|
|
|
extern const char *ia64_target_format (void);
|
2000-04-22 04:22:24 +08:00
|
|
|
|
|
|
|
#define TARGET_ARCH bfd_arch_ia64
|
|
|
|
#define DOUBLESLASH_LINE_COMMENTS /* allow //-style comments */
|
|
|
|
|
|
|
|
#define NEED_LITERAL_POOL /* need gp literal pool */
|
|
|
|
#define RELOC_REQUIRES_SYMBOL
|
|
|
|
#define DIFF_EXPR_OK /* foo-. gets turned into PC relative relocs */
|
|
|
|
#define NEED_INDEX_OPERATOR /* [ ] is index operator */
|
|
|
|
|
|
|
|
#define QUOTES_IN_INSN /* allow `string "foo;bar"' */
|
2005-02-11 18:13:07 +08:00
|
|
|
#define LEX_AT (LEX_NAME|LEX_BEGIN_NAME) /* allow `@' inside name */
|
|
|
|
#define LEX_QM (LEX_NAME|LEX_BEGIN_NAME) /* allow `?' inside name */
|
2000-04-22 04:22:24 +08:00
|
|
|
#define LEX_HASH LEX_END_NAME /* allow `#' ending a name */
|
|
|
|
|
bfd:
* Makefile.am (ALL_MACHINES): Add cpu-tic6x.lo.
(ALL_MACHINES_CFILES): Add cpu-tic6x.c.
(BFD32_BACKENDS): Add elf32-tic6x.lo.
(BFD32_BACKENDS_CFILES): Add elf32-tic6x.c.
* Makefile.in: Regenerate.
* archures.c (bfd_arch_tic6x, bfd_tic6x_arch): New.
(bfd_archures_list): Update.
* config.bfd (tic6x-*-elf): New.
* configure.in (bfd_elf32_tic6x_be_vec, bfd_elf32_tic6x_le_vec):
New.
* configure: Regenerate.
* cpu-tic6x.c, elf32-tic6x.c: New.
* reloc.c (BFD_RELOC_C6000_PCR_S21, BFD_RELOC_C6000_PCR_S12,
BFD_RELOC_C6000_PCR_S10, BFD_RELOC_C6000_PCR_S7,
BFD_RELOC_C6000_ABS_S16, BFD_RELOC_C6000_ABS_L16,
BFD_RELOC_C6000_ABS_H16, BFD_RELOC_C6000_SBR_U15_B,
BFD_RELOC_C6000_SBR_U15_H, BFD_RELOC_C6000_SBR_U15_W,
BFD_RELOC_C6000_SBR_S16, BFD_RELOC_C6000_SBR_L16_B,
BFD_RELOC_C6000_SBR_L16_H, BFD_RELOC_C6000_SBR_L16_W,
BFD_RELOC_C6000_SBR_H16_B, BFD_RELOC_C6000_SBR_H16_H,
BFD_RELOC_C6000_SBR_H16_W, BFD_RELOC_C6000_SBR_GOT_U15_W,
BFD_RELOC_C6000_SBR_GOT_L16_W, BFD_RELOC_C6000_SBR_GOT_H16_W,
BFD_RELOC_C6000_DSBT_INDEX, BFD_RELOC_C6000_PREL31,
BFD_RELOC_C6000_COPY, BFD_RELOC_C6000_ALIGN,
BFD_RELOC_C6000_FPHEAD, BFD_RELOC_C6000_NOCMP): New.
* targets.c (bfd_elf32_tic6x_be_vec, bfd_elf32_tic6x_le_vec): New.
(_bfd_target_vector): Update.
* bfd-in2.h, libbfd.h: Regenerate.
binutils:
* MAINTAINERS: Add self as TI C6X maintainer.
* NEWS: Add news entry for TI C6X support.
* readelf.c: Include elf/tic6x.h.
(guess_is_rela): Handle EM_TI_C6000.
(dump_relocations): Likewise.
(get_tic6x_dynamic_type): New.
(get_dynamic_type): Call it.
(get_machine_flags): Handle EF_C6000_REL.
(get_osabi_name): Handle machine-specific values only for relevant
machines. Handle C6X values.
(get_tic6x_segment_type): New.
(get_segment_type): Call it.
(get_tic6x_section_type_name): New.
(get_section_type_name): Call it.
(is_32bit_abs_reloc, is_16bit_abs_reloc, is_none_reloc): Handle
EM_TI_C6000.
gas:
* Makefile.am (TARGET_CPU_CFILES): Add config/tc-tic6x.c.
(TARGET_CPU_HFILES): Add config/tc-tic6x.h.
* Makefile.in: Regenerate.
* NEWS: Add news entry for TI C6X support.
* app.c (do_scrub_chars): Handle "||^" for TI C6X. Handle
TC_PREDICATE_START_CHAR and TC_PREDICATE_END_CHAR. Keep spaces in
operands if TC_KEEP_OPERAND_SPACES.
* configure.tgt (tic6x-*-*): New.
* config/tc-ia64.h (TC_PREDICATE_START_CHAR,
TC_PREDICATE_END_CHAR): Define.
* config/tc-tic6x.c, config/tc-tic6x.h: New.
* doc/Makefile.am (CPU_DOCS): Add c-tic6x.texi.
* doc/Makefile.in: Regenerate.
* doc/all.texi (TIC6X): Define.
* doc/as.texinfo: Add TI C6X documentation. Include c-tic6x.texi.
* doc/c-tic6x.texi: New.
gas/testsuite:
* gas/tic6x: New directory and testcases.
include:
* dis-asm.h (print_insn_tic6x): Declare.
include/elf:
* common.h (ELFOSABI_C6000_ELFABI, ELFOSABI_C6000_LINUX): Define.
* tic6x.h: New.
include/opcode:
* tic6x-control-registers.h, tic6x-insn-formats.h,
tic6x-opcode-table.h, tic6x.h: New.
ld:
* Makefile.am (ALL_EMULATIONS): Add eelf32_tic6x_be.o and
eelf32_tic6x_le.o.
(eelf32_tic6x_be.c, eelf32_tic6x_le.c): New.
* NEWS: Add news entry for TI C6X support.
* configure.tgt (tic6x-*-*): New.
* emulparams/elf32_tic6x_be.sh, emulparams/elf32_tic6x_le.sh: New.
ld/testsuite:
* ld-elf/flags1.d, ld-elf/merge.d: XFAIL for tic6x-*-*.
* ld-elf/sec-to-seg.exp: Set B_test_same_seg to 0 for tic6x-*-*.
* ld-tic6x: New directory and testcases.
opcodes:
* Makefile.am (TARGET_LIBOPCODES_CFILES): Add tic6x-dis.c.
* Makefile.in: Regenerate.
* configure.in (bfd_tic6x_arch): New.
* configure: Regenerate.
* disassemble.c (ARCH_tic6x): Define if ARCH_all.
(disassembler): Handle TI C6X.
* tic6x-dis.c: New.
2010-03-26 05:12:36 +08:00
|
|
|
#define TC_PREDICATE_START_CHAR '('
|
|
|
|
#define TC_PREDICATE_END_CHAR ')'
|
|
|
|
|
2005-02-15 15:32:14 +08:00
|
|
|
extern const char ia64_symbol_chars[];
|
|
|
|
#define tc_symbol_chars ia64_symbol_chars
|
|
|
|
|
2003-05-01 08:53:39 +08:00
|
|
|
#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
|
|
|
|
|
2000-04-22 04:22:24 +08:00
|
|
|
struct ia64_fix
|
|
|
|
{
|
|
|
|
int bigendian; /* byte order at fix location */
|
|
|
|
enum ia64_opnd opnd;
|
|
|
|
};
|
|
|
|
|
gas: rename md_end to md_finish
Currently md_end is typically used for some final actions rather than
freeing memory like other *_end functions. Rename it to md_finish,
and rename target implementation. The renaming of target functions
makes it possible to find them all with "grep md_finish",
eg. md_mips_end is renamed to mips_md_finish, not md_mips_finish.
This patch leaves a number of md_end functions unchanged, those that
either do nothing or deallocate memory, and calls them late.
The idea here is that target maintainers implement md_end functions to
tidy memory, if anyone cares. Freeing persistent memory in gas is
not at all important, except that it can hide more important memory
leaks, those that happen once per some frequent gas operation, amongst
these unimportant memory leaks.
* as.c (main): Rename md_end to md_finish.
* config/tc-alpha.c, * config/tc-alpha.h,
* config/tc-arc.c, * config/tc-arc.h,
* config/tc-arm.c, * config/tc-arm.h,
* config/tc-csky.c, * config/tc-csky.h,
* config/tc-ia64.c, * config/tc-ia64.h,
* config/tc-mcore.c, * config/tc-mcore.h,
* config/tc-mips.c, * config/tc-mips.h,
* config/tc-mmix.c, * config/tc-mmix.h,
* config/tc-msp430.c, * config/tc-msp430.h,
* config/tc-nds32.c, * config/tc-nds32.h,
* config/tc-ppc.c, * config/tc-ppc.h,
* config/tc-pru.c, * config/tc-pru.h,
* config/tc-riscv.c, * config/tc-riscv.h,
* config/tc-s390.c, * config/tc-s390.h,
* config/tc-sparc.c, * config/tc-sparc.h,
* config/tc-tic4x.c, * config/tc-tic4x.h,
* config/tc-tic6x.c, * config/tc-tic6x.h,
* config/tc-v850.c, * config/tc-v850.h,
* config/tc-xtensa.c, * config/tc-xtensa.h,
* config/tc-z80.c, * config/tc-z80.h: Similarly.
* output-file.c (output_file_close): Call md_end.
2022-07-05 11:56:38 +08:00
|
|
|
extern void ia64_md_finish (void);
|
2008-08-13 07:39:31 +08:00
|
|
|
extern void ia64_start_line (void);
|
|
|
|
extern int ia64_unrecognized_line (int);
|
|
|
|
extern void ia64_frob_label (struct symbol *);
|
2004-02-11 09:35:14 +08:00
|
|
|
#ifdef TE_HPUX
|
2008-08-13 07:39:31 +08:00
|
|
|
extern int ia64_frob_symbol (struct symbol *);
|
2004-02-11 09:35:14 +08:00
|
|
|
#endif
|
2008-08-13 07:39:31 +08:00
|
|
|
extern void ia64_flush_pending_output (void);
|
|
|
|
extern int ia64_parse_name (char *, expressionS *, char *);
|
|
|
|
extern int ia64_optimize_expr (expressionS *, operatorT, expressionS *);
|
|
|
|
extern void ia64_cons_align (int);
|
|
|
|
extern void ia64_flush_insns (void);
|
|
|
|
extern int ia64_fix_adjustable (struct fix *);
|
|
|
|
extern int ia64_force_relocation (struct fix *);
|
gas TC_PARSE_CONS_EXPRESSION communication with TC_CONS_FIX_NEW
A number of targets pass extra information from TC_PARSE_CONS_EXPRESSION
to TC_CONS_FIX_NEW via static variables. That's OK, but not best
practice. tc-ppc.c goes further in implementing its own replacement
for cons(), because the generic one doesn't allow relocation modifiers
on constants. This patch fixes both of these warts.
* gas/config/tc-alpha.h (TC_CONS_FIX_NEW): Add RELOC parameter.
* gas/config/tc-arc.c (arc_cons_fix_new): Add reloc parameter.
* gas/config/tc-arc.h (arc_cons_fix_new): Update prototype.
(TC_CONS_FIX_NEW): Add RELOC parameter.
* gas/config/tc-arm.c (cons_fix_new_arm): Similarly
* gas/config/tc-arm.h (cons_fix_new_arm, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-cr16.c (cr16_cons_fix_new): Similarly.
* gas/config/tc-cr16.h (cr16_cons_fix_new, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-crx.h (TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-m32c.c (m32c_cons_fix_new): Similarly.
* gas/config/tc-m32c.h (m32c_cons_fix_new, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-mn10300.c (mn10300_cons_fix_new): Similarly.
* gas/config/tc-mn10300.h (mn10300_cons_fix_new, TC_CONS_FIX_NEW):
Similarly.
* gas/config/tc-ns32k.c (cons_fix_new_ns32k): Similarly.
* gas/config/tc-ns32k.h (cons_fix_new_ns32k): Similarly.
* gas/config/tc-pj.c (pj_cons_fix_new_pj): Similarly.
* gas/config/tc-pj.h (pj_cons_fix_new_pj, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-rx.c (rx_cons_fix_new): Similarly.
* gas/config/tc-rx.h (rx_cons_fix_new, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-sh.c (sh_cons_fix_new): Similarly.
* gas/config/tc-sh.h (sh_cons_fix_new, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-tic54x.c (tic54x_cons_fix_new): Similarly.
* gas/config/tc-tic54x.h (tic54x_cons_fix_new, TC_CONS_FIX_NEW):
Similarly.
* gas/config/tc-tic6x.c (tic6x_cons_fix_new): Similarly.
* gas/config/tc-tic6x.h (tic6x_cons_fix_new, TC_CONS_FIX_NEW):
Similarly.
* gas/config/tc-arc.c (arc_parse_cons_expression): Return reloc.
* gas/config/tc-arc.h (arc_parse_cons_expression): Update proto.
* gas/config/tc-avr.c (exp_mod_data): Make global.
(pexp_mod_data): Delete.
(avr_parse_cons_expression): Return exp_mod_data pointer.
(avr_cons_fix_new): Add exp_mod_data_t pointer param.
(exp_mod_data_t): Move typedef..
* gas/config/tc-avr.h: ..to here.
(exp_mod_data): Declare.
(TC_PARSE_CONS_RETURN_TYPE, TC_PARSE_CONS_RETURN_NONE): Define.
(avr_parse_cons_expression, avr_cons_fix_new): Update prototype.
(TC_CONS_FIX_NEW): Update.
* gas/config/tc-hppa.c (hppa_field_selector): Delete static var.
(cons_fix_new_hppa): Add hppa_field_selector param.
(fix_new_hppa): Adjust.
(parse_cons_expression_hppa): Return field selector.
* gas/config/tc-hppa.h (parse_cons_expression_hppa): Update proto.
(cons_fix_new_hppa): Likewise.
(TC_PARSE_CONS_RETURN_TYPE, TC_PARSE_CONS_RETURN_NONE): Define.
* gas/config/tc-i386.c (got_reloc): Delete static var.
(x86_cons_fix_new): Add reloc param.
(x86_cons): Return got reloc.
* gas/config/tc-i386.h (x86_cons, x86_cons_fix_new): Update proto.
(TC_CONS_FIX_NEW): Add RELOC param.
* gas/config/tc-ia64.c (ia64_cons_fix_new): Add reloc param. Adjust
calls.
* gas/config/tc-ia64.h (ia64_cons_fix_new): Update prototype.
(TC_CONS_FIX_NEW): Add reloc param.
* gas/config/tc-microblaze.c (parse_cons_expression_microblaze):
Return reloc.
(cons_fix_new_microblaze): Add reloc param.
* gas/config/tc-microblaze.h: Formatting.
(parse_cons_expression_microblaze): Update proto.
(cons_fix_new_microblaze): Likewise.
* gas/config/tc-nios2.c (nios2_tls_ldo_reloc): Delete static var.
(nios2_cons): Return ldo reloc.
(nios2_cons_fix_new): Delete.
* gas/config/tc-nios2.h (nios2_cons): Update prototype.
(nios2_cons_fix_new, TC_CONS_FIX_NEW): Delete.
* gas/config/tc-ppc.c (md_pseudo_table): Remove quad, long, word,
short. Make llong use cons.
(ppc_elf_suffix): Return BFD_RELOC_NONE rather than BFD_RELOC_UNUSED.
(ppc_elf_cons): Delete.
(ppc_elf_parse_cons): New function.
(ppc_elf_validate_fix): Don't check for BFD_RELOC_UNUSED.
(md_assemble): Use BFD_RELOC_NONE rather than BFD_RELOC_UNUSED.
* gas/config/tc-ppc.h (TC_PARSE_CONS_EXPRESSION): Define
(ppc_elf_parse_cons): Declare.
* gas/config/tc-sparc.c (sparc_cons_special_reloc): Delete static var.
(sparc_cons): Return reloc specifier.
(cons_fix_new_sparc): Add reloc specifier param.
(sparc_cfi_emit_pcrel_expr): Use emit_expr_with_reloc.
* gas/config/tc-sparc.h (TC_PARSE_CONS_RETURN_TYPE): Define.
(TC_PARSE_CONS_RETURN_NONE): Define.
(sparc_cons, cons_fix_new_sparc): Update prototype.
* gas/config/tc-v850.c (hold_cons_reloc): Delete static var.
(v850_reloc_prefix): Use BFD_RELOC_NONE rather than BFD_RELOC_UNUSED.
(md_assemble): Likewise.
(parse_cons_expression_v850): Return reloc.
(cons_fix_new_v850): Add reloc parameter.
* gas/config/tc-v850.h (parse_cons_expression_v850): Update proto.
(cons_fix_new_v850): Likewise.
* gas/config/tc-vax.c (vax_cons_special_reloc): Delete static var.
(vax_cons): Return reloc.
(vax_cons_fix_new): Add reloc parameter.
* gas/config/tc-vax.h (vax_cons, vax_cons_fix_new): Update proto.
* gas/config/tc-xstormy16.c (xstormy16_cons_fix_new): Add reloc param.
* gas/config/tc-xstormy16.h (xstormy16_cons_fix_new): Update proto.
* gas/dwarf2dbg.c (TC_PARSE_CONS_RETURN_NONE): Provide default.
(emit_fixed_inc_line_addr): Adjust exmit_expr_fix calls.
* gas/read.c (TC_PARSE_CONS_EXPRESSION): Return value.
(do_parse_cons_expression): Adjust.
(cons_worker): Pass return value from TC_PARSE_CONS_EXPRESSION
to emit_expr_with_reloc.
(emit_expr_with_reloc): New function handling reloc, mostly
extracted from..
(emit_expr): ..here.
(emit_expr_fix): Add reloc param. Adjust TC_CONS_FIX_NEW invocation.
Handle reloc.
(parse_mri_cons): Convert to ISO.
* gas/read.h (TC_PARSE_CONS_RETURN_TYPE): Define.
(TC_PARSE_CONS_RETURN_NONE): Define.
(emit_expr_with_reloc): Declare.
(emit_expr_fix): Update prototype.
* gas/write.c (write_object_file): Update TC_CONS_FIX_NEW invocation.
2014-04-08 13:08:22 +08:00
|
|
|
extern void ia64_cons_fix_new (fragS *, int, int, expressionS *,
|
|
|
|
bfd_reloc_code_real_type);
|
2008-08-13 07:39:31 +08:00
|
|
|
extern void ia64_validate_fix (struct fix *);
|
|
|
|
extern char * ia64_canonicalize_symbol_name (char *);
|
2016-04-01 20:07:50 +08:00
|
|
|
extern bfd_vma ia64_elf_section_letter (int, const char **);
|
* include/elf/ia64.h (SHT_IA_64_VMS_DISPLAY_NAME_INFO,
EF_IA_64_ARCHVER_1): New macros. Minor reformatting.
* bfd/Makefile.am (BFD32_BACKENDS): Add new object vmsutil.lo
(BFD32_BACKENDS_CFILES): Add new file vmsutil.c
(vmsutil.lo): Add dependency rule
* bfd/Makefile.in: Regenerate
* bfd/config.bfd (ia64*-*-*vms*): Add case.
* bfd/configure.in (bfd_elf64_ia64_vms_vec): Add case.
* bfd/configure: Regenerate
* bfd/vmsutil.[ch]: New files
* bfd/elf-bfd.h (struct bfd_elf_special_section): Change type of
attr to bfd_vma.
* bfd/elfxx-ia64.c (elfNN_vms_post_process_headers,
elfNN_vms_section_processing, elfNN_vms_final_write_processing,
elfNN_vms_close_and_cleanup, elfNN_vms_section_from_shdr,
elfNN_vms_object_p): New functions
* bfd/targets.c (bfd_elf64_ia64_vms_vec): New target.
* gas/configure.tgt(ia64-*-*vms*): New target.
* gas/dwarf2dbg.h (dwarf2_loc_mark_labels): Make extern.
* gas/tc.h (md_number_to_chars): Declare iff undefined.
* gas/config/obj-elf.c (obj_elf_change_section): Change type of
arg attr to bfd_vma.
(obj_elf_parse_section_letters): Return a bfd_vma. Change type of
variables attr, md_attr to bfd_vma.
(obj_elf_section_word): Likewise.
(obj_elf_section): Change type of variable attr to bfd_vma
* gas/config/obj-elf.h (obj_elf_change_section): Change type of
arg attr to bfd_vma
* gas/config/tc-ia64.c (bfdver.h,time.h): Include.
(ia64_elf_section_letter): Now returns a bfd_vma.
Handle VMS specific attributes.
(ia64_elf_section_flags): Arg attr now a bfd_vma.
(ia64_init): Don't turn on dependency checking for VMS.
(ia64_target_format): Check for VMS flag bit.
(do_alias): Hande decc$ functions.
(get_vms_time): New function.
(ia64_vms_note): New function.
* gas/config/tc-ia64.h (ia64_elf_section_letter): Now returns a bfd_vma.
(ia64_elf_section_flags): Arg attr now a bfd_vma.
(tc_init_after_args): Define for VMS.
* gas/config/tc-alpha.c (alpha_elf_section_letter): Return a bfd_vma.
(alpha_elf_section_flags): Change type of arg attr to bfd_vma.
* gas/config/tc-alpha.h: Likewise.
* gas/config/tc-i386.c (x86_64_section_letter): Return a bfd_vma.
(x86_64_section_word): Return a bfd_vma.
* gas/config/tc-i386.h: Likewise.
* gas/config/tc-ip2k.c (ip2k_elf_section_flags): Change type of arg
attr to bfd_vma.
* gas/config/tc-ip2k.h: Likewise.
* gas/config/tc-mep.c (mep_elf_section_letter): Return a bfd_vma.
(mep_elf_section_flags): Change type of arg attr to bfd_vma.
* gas/config/tc-mep.h: Likewise.
* gas/config/tc-ppc.c (ppc_section_letter): Return a bfd_vma.
(ppc_section_word): Return a bfd_vma.
(ppc_section_flags): Change type of arg attr to bfd_vma.
* gas/config/tc-ppc.h: Likewise.
* gas/config/te-vms.h (DWARF2_DIR_SHOULD_END_WITH_SEPARATOR,
DWAR2_FILE_TIME_NAME, DWARF2_FILE_SIZE_NAME, DWARF2_FILEN_NAME):
New file with new macros
* gas/dwarf2dbg.c (get_filenum, out_file_list): Default and call new
macros.
2009-01-15 20:42:52 +08:00
|
|
|
extern flagword ia64_elf_section_flags (flagword, bfd_vma, int);
|
2008-08-13 07:39:31 +08:00
|
|
|
extern int ia64_elf_section_type (const char *, size_t);
|
|
|
|
extern long ia64_pcrel_from_section (struct fix *, segT);
|
|
|
|
extern void ia64_md_do_align (int, const char *, int, int);
|
|
|
|
extern void ia64_handle_align (fragS *);
|
|
|
|
extern void ia64_after_parse_args (void);
|
|
|
|
extern void ia64_dwarf2_emit_offset (symbolS *, unsigned int);
|
|
|
|
extern void ia64_check_label (symbolS *);
|
2004-02-21 08:24:15 +08:00
|
|
|
extern int ia64_estimate_size_before_relax (fragS *, asection *);
|
2004-01-08 03:19:35 +08:00
|
|
|
extern void ia64_convert_frag (fragS *);
|
2000-04-22 04:22:24 +08:00
|
|
|
|
gas: rename md_end to md_finish
Currently md_end is typically used for some final actions rather than
freeing memory like other *_end functions. Rename it to md_finish,
and rename target implementation. The renaming of target functions
makes it possible to find them all with "grep md_finish",
eg. md_mips_end is renamed to mips_md_finish, not md_mips_finish.
This patch leaves a number of md_end functions unchanged, those that
either do nothing or deallocate memory, and calls them late.
The idea here is that target maintainers implement md_end functions to
tidy memory, if anyone cares. Freeing persistent memory in gas is
not at all important, except that it can hide more important memory
leaks, those that happen once per some frequent gas operation, amongst
these unimportant memory leaks.
* as.c (main): Rename md_end to md_finish.
* config/tc-alpha.c, * config/tc-alpha.h,
* config/tc-arc.c, * config/tc-arc.h,
* config/tc-arm.c, * config/tc-arm.h,
* config/tc-csky.c, * config/tc-csky.h,
* config/tc-ia64.c, * config/tc-ia64.h,
* config/tc-mcore.c, * config/tc-mcore.h,
* config/tc-mips.c, * config/tc-mips.h,
* config/tc-mmix.c, * config/tc-mmix.h,
* config/tc-msp430.c, * config/tc-msp430.h,
* config/tc-nds32.c, * config/tc-nds32.h,
* config/tc-ppc.c, * config/tc-ppc.h,
* config/tc-pru.c, * config/tc-pru.h,
* config/tc-riscv.c, * config/tc-riscv.h,
* config/tc-s390.c, * config/tc-s390.h,
* config/tc-sparc.c, * config/tc-sparc.h,
* config/tc-tic4x.c, * config/tc-tic4x.h,
* config/tc-tic6x.c, * config/tc-tic6x.h,
* config/tc-v850.c, * config/tc-v850.h,
* config/tc-xtensa.c, * config/tc-xtensa.h,
* config/tc-z80.c, * config/tc-z80.h: Similarly.
* output-file.c (output_file_close): Call md_end.
2022-07-05 11:56:38 +08:00
|
|
|
#define md_finish() ia64_md_finish ()
|
2000-04-22 04:22:24 +08:00
|
|
|
#define md_start_line_hook() ia64_start_line ()
|
|
|
|
#define tc_unrecognized_line(ch) ia64_unrecognized_line (ch)
|
|
|
|
#define tc_frob_label(s) ia64_frob_label (s)
|
2004-02-11 09:35:14 +08:00
|
|
|
#ifdef TE_HPUX
|
|
|
|
#define tc_frob_symbol(s,p) p |= ia64_frob_symbol (s)
|
|
|
|
#endif /* TE_HPUX */
|
2000-04-22 04:22:24 +08:00
|
|
|
#define md_flush_pending_output() ia64_flush_pending_output ()
|
2005-10-11 19:16:17 +08:00
|
|
|
#define md_parse_name(s,e,m,c) ia64_parse_name (s, e, c)
|
2007-09-26 16:34:24 +08:00
|
|
|
#define md_register_arithmetic 0
|
2000-04-22 04:22:24 +08:00
|
|
|
#define tc_canonicalize_symbol_name(s) ia64_canonicalize_symbol_name (s)
|
2003-05-02 10:46:36 +08:00
|
|
|
#define tc_canonicalize_section_name(s) ia64_canonicalize_symbol_name (s)
|
2000-04-22 04:22:24 +08:00
|
|
|
#define md_optimize_expr(l,o,r) ia64_optimize_expr (l, o, r)
|
|
|
|
#define md_cons_align(n) ia64_cons_align (n)
|
|
|
|
#define TC_FORCE_RELOCATION(f) ia64_force_relocation (f)
|
|
|
|
#define tc_fix_adjustable(f) ia64_fix_adjustable (f)
|
2002-09-05 08:01:18 +08:00
|
|
|
#define MD_APPLY_SYM_VALUE(FIX) 0
|
2004-01-08 03:19:35 +08:00
|
|
|
#define md_convert_frag(b,s,f) ia64_convert_frag (f)
|
2001-07-23 22:02:13 +08:00
|
|
|
#define md_create_long_jump(p,f,t,fr,s) as_fatal ("ia64_create_long_jump")
|
2000-04-22 04:22:24 +08:00
|
|
|
#define md_create_short_jump(p,f,t,fr,s) \
|
2001-07-23 22:02:13 +08:00
|
|
|
as_fatal ("ia64_create_short_jump")
|
2000-04-22 04:22:24 +08:00
|
|
|
#define md_estimate_size_before_relax(f,s) \
|
2004-02-21 08:24:15 +08:00
|
|
|
ia64_estimate_size_before_relax(f,s)
|
2001-09-12 02:26:04 +08:00
|
|
|
#define md_elf_section_letter ia64_elf_section_letter
|
2000-04-22 04:22:24 +08:00
|
|
|
#define md_elf_section_flags ia64_elf_section_flags
|
|
|
|
#define TC_FIX_TYPE struct ia64_fix
|
|
|
|
#define TC_INIT_FIX_DATA(f) { f->tc_fix_data.opnd = 0; }
|
gas TC_PARSE_CONS_EXPRESSION communication with TC_CONS_FIX_NEW
A number of targets pass extra information from TC_PARSE_CONS_EXPRESSION
to TC_CONS_FIX_NEW via static variables. That's OK, but not best
practice. tc-ppc.c goes further in implementing its own replacement
for cons(), because the generic one doesn't allow relocation modifiers
on constants. This patch fixes both of these warts.
* gas/config/tc-alpha.h (TC_CONS_FIX_NEW): Add RELOC parameter.
* gas/config/tc-arc.c (arc_cons_fix_new): Add reloc parameter.
* gas/config/tc-arc.h (arc_cons_fix_new): Update prototype.
(TC_CONS_FIX_NEW): Add RELOC parameter.
* gas/config/tc-arm.c (cons_fix_new_arm): Similarly
* gas/config/tc-arm.h (cons_fix_new_arm, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-cr16.c (cr16_cons_fix_new): Similarly.
* gas/config/tc-cr16.h (cr16_cons_fix_new, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-crx.h (TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-m32c.c (m32c_cons_fix_new): Similarly.
* gas/config/tc-m32c.h (m32c_cons_fix_new, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-mn10300.c (mn10300_cons_fix_new): Similarly.
* gas/config/tc-mn10300.h (mn10300_cons_fix_new, TC_CONS_FIX_NEW):
Similarly.
* gas/config/tc-ns32k.c (cons_fix_new_ns32k): Similarly.
* gas/config/tc-ns32k.h (cons_fix_new_ns32k): Similarly.
* gas/config/tc-pj.c (pj_cons_fix_new_pj): Similarly.
* gas/config/tc-pj.h (pj_cons_fix_new_pj, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-rx.c (rx_cons_fix_new): Similarly.
* gas/config/tc-rx.h (rx_cons_fix_new, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-sh.c (sh_cons_fix_new): Similarly.
* gas/config/tc-sh.h (sh_cons_fix_new, TC_CONS_FIX_NEW): Similarly.
* gas/config/tc-tic54x.c (tic54x_cons_fix_new): Similarly.
* gas/config/tc-tic54x.h (tic54x_cons_fix_new, TC_CONS_FIX_NEW):
Similarly.
* gas/config/tc-tic6x.c (tic6x_cons_fix_new): Similarly.
* gas/config/tc-tic6x.h (tic6x_cons_fix_new, TC_CONS_FIX_NEW):
Similarly.
* gas/config/tc-arc.c (arc_parse_cons_expression): Return reloc.
* gas/config/tc-arc.h (arc_parse_cons_expression): Update proto.
* gas/config/tc-avr.c (exp_mod_data): Make global.
(pexp_mod_data): Delete.
(avr_parse_cons_expression): Return exp_mod_data pointer.
(avr_cons_fix_new): Add exp_mod_data_t pointer param.
(exp_mod_data_t): Move typedef..
* gas/config/tc-avr.h: ..to here.
(exp_mod_data): Declare.
(TC_PARSE_CONS_RETURN_TYPE, TC_PARSE_CONS_RETURN_NONE): Define.
(avr_parse_cons_expression, avr_cons_fix_new): Update prototype.
(TC_CONS_FIX_NEW): Update.
* gas/config/tc-hppa.c (hppa_field_selector): Delete static var.
(cons_fix_new_hppa): Add hppa_field_selector param.
(fix_new_hppa): Adjust.
(parse_cons_expression_hppa): Return field selector.
* gas/config/tc-hppa.h (parse_cons_expression_hppa): Update proto.
(cons_fix_new_hppa): Likewise.
(TC_PARSE_CONS_RETURN_TYPE, TC_PARSE_CONS_RETURN_NONE): Define.
* gas/config/tc-i386.c (got_reloc): Delete static var.
(x86_cons_fix_new): Add reloc param.
(x86_cons): Return got reloc.
* gas/config/tc-i386.h (x86_cons, x86_cons_fix_new): Update proto.
(TC_CONS_FIX_NEW): Add RELOC param.
* gas/config/tc-ia64.c (ia64_cons_fix_new): Add reloc param. Adjust
calls.
* gas/config/tc-ia64.h (ia64_cons_fix_new): Update prototype.
(TC_CONS_FIX_NEW): Add reloc param.
* gas/config/tc-microblaze.c (parse_cons_expression_microblaze):
Return reloc.
(cons_fix_new_microblaze): Add reloc param.
* gas/config/tc-microblaze.h: Formatting.
(parse_cons_expression_microblaze): Update proto.
(cons_fix_new_microblaze): Likewise.
* gas/config/tc-nios2.c (nios2_tls_ldo_reloc): Delete static var.
(nios2_cons): Return ldo reloc.
(nios2_cons_fix_new): Delete.
* gas/config/tc-nios2.h (nios2_cons): Update prototype.
(nios2_cons_fix_new, TC_CONS_FIX_NEW): Delete.
* gas/config/tc-ppc.c (md_pseudo_table): Remove quad, long, word,
short. Make llong use cons.
(ppc_elf_suffix): Return BFD_RELOC_NONE rather than BFD_RELOC_UNUSED.
(ppc_elf_cons): Delete.
(ppc_elf_parse_cons): New function.
(ppc_elf_validate_fix): Don't check for BFD_RELOC_UNUSED.
(md_assemble): Use BFD_RELOC_NONE rather than BFD_RELOC_UNUSED.
* gas/config/tc-ppc.h (TC_PARSE_CONS_EXPRESSION): Define
(ppc_elf_parse_cons): Declare.
* gas/config/tc-sparc.c (sparc_cons_special_reloc): Delete static var.
(sparc_cons): Return reloc specifier.
(cons_fix_new_sparc): Add reloc specifier param.
(sparc_cfi_emit_pcrel_expr): Use emit_expr_with_reloc.
* gas/config/tc-sparc.h (TC_PARSE_CONS_RETURN_TYPE): Define.
(TC_PARSE_CONS_RETURN_NONE): Define.
(sparc_cons, cons_fix_new_sparc): Update prototype.
* gas/config/tc-v850.c (hold_cons_reloc): Delete static var.
(v850_reloc_prefix): Use BFD_RELOC_NONE rather than BFD_RELOC_UNUSED.
(md_assemble): Likewise.
(parse_cons_expression_v850): Return reloc.
(cons_fix_new_v850): Add reloc parameter.
* gas/config/tc-v850.h (parse_cons_expression_v850): Update proto.
(cons_fix_new_v850): Likewise.
* gas/config/tc-vax.c (vax_cons_special_reloc): Delete static var.
(vax_cons): Return reloc.
(vax_cons_fix_new): Add reloc parameter.
* gas/config/tc-vax.h (vax_cons, vax_cons_fix_new): Update proto.
* gas/config/tc-xstormy16.c (xstormy16_cons_fix_new): Add reloc param.
* gas/config/tc-xstormy16.h (xstormy16_cons_fix_new): Update proto.
* gas/dwarf2dbg.c (TC_PARSE_CONS_RETURN_NONE): Provide default.
(emit_fixed_inc_line_addr): Adjust exmit_expr_fix calls.
* gas/read.c (TC_PARSE_CONS_EXPRESSION): Return value.
(do_parse_cons_expression): Adjust.
(cons_worker): Pass return value from TC_PARSE_CONS_EXPRESSION
to emit_expr_with_reloc.
(emit_expr_with_reloc): New function handling reloc, mostly
extracted from..
(emit_expr): ..here.
(emit_expr_fix): Add reloc param. Adjust TC_CONS_FIX_NEW invocation.
Handle reloc.
(parse_mri_cons): Convert to ISO.
* gas/read.h (TC_PARSE_CONS_RETURN_TYPE): Define.
(TC_PARSE_CONS_RETURN_NONE): Define.
(emit_expr_with_reloc): Declare.
(emit_expr_fix): Update prototype.
* gas/write.c (write_object_file): Update TC_CONS_FIX_NEW invocation.
2014-04-08 13:08:22 +08:00
|
|
|
#define TC_CONS_FIX_NEW(f,o,l,e,r) ia64_cons_fix_new (f, o, l, e, r)
|
2000-04-22 04:22:24 +08:00
|
|
|
#define TC_VALIDATE_FIX(fix,seg,skip) ia64_validate_fix (fix)
|
|
|
|
#define MD_PCREL_FROM_SECTION(fix,sec) ia64_pcrel_from_section (fix, sec)
|
2003-05-01 08:53:39 +08:00
|
|
|
#define md_section_align(seg,size) (size)
|
2000-12-28 18:07:56 +08:00
|
|
|
#define md_do_align(n,f,l,m,j) ia64_md_do_align (n,f,l,m)
|
|
|
|
#define HANDLE_ALIGN(f) ia64_handle_align (f)
|
2001-02-10 09:42:04 +08:00
|
|
|
#define md_elf_section_type(str,len) ia64_elf_section_type (str, len)
|
2001-11-29 01:00:46 +08:00
|
|
|
#define md_after_parse_args() ia64_after_parse_args ()
|
2003-03-12 06:00:33 +08:00
|
|
|
#define TC_DWARF2_EMIT_OFFSET ia64_dwarf2_emit_offset
|
2003-05-02 10:41:45 +08:00
|
|
|
#define tc_check_label(l) ia64_check_label (l)
|
* include/elf/ia64.h (SHT_IA_64_VMS_DISPLAY_NAME_INFO,
EF_IA_64_ARCHVER_1): New macros. Minor reformatting.
* bfd/Makefile.am (BFD32_BACKENDS): Add new object vmsutil.lo
(BFD32_BACKENDS_CFILES): Add new file vmsutil.c
(vmsutil.lo): Add dependency rule
* bfd/Makefile.in: Regenerate
* bfd/config.bfd (ia64*-*-*vms*): Add case.
* bfd/configure.in (bfd_elf64_ia64_vms_vec): Add case.
* bfd/configure: Regenerate
* bfd/vmsutil.[ch]: New files
* bfd/elf-bfd.h (struct bfd_elf_special_section): Change type of
attr to bfd_vma.
* bfd/elfxx-ia64.c (elfNN_vms_post_process_headers,
elfNN_vms_section_processing, elfNN_vms_final_write_processing,
elfNN_vms_close_and_cleanup, elfNN_vms_section_from_shdr,
elfNN_vms_object_p): New functions
* bfd/targets.c (bfd_elf64_ia64_vms_vec): New target.
* gas/configure.tgt(ia64-*-*vms*): New target.
* gas/dwarf2dbg.h (dwarf2_loc_mark_labels): Make extern.
* gas/tc.h (md_number_to_chars): Declare iff undefined.
* gas/config/obj-elf.c (obj_elf_change_section): Change type of
arg attr to bfd_vma.
(obj_elf_parse_section_letters): Return a bfd_vma. Change type of
variables attr, md_attr to bfd_vma.
(obj_elf_section_word): Likewise.
(obj_elf_section): Change type of variable attr to bfd_vma
* gas/config/obj-elf.h (obj_elf_change_section): Change type of
arg attr to bfd_vma
* gas/config/tc-ia64.c (bfdver.h,time.h): Include.
(ia64_elf_section_letter): Now returns a bfd_vma.
Handle VMS specific attributes.
(ia64_elf_section_flags): Arg attr now a bfd_vma.
(ia64_init): Don't turn on dependency checking for VMS.
(ia64_target_format): Check for VMS flag bit.
(do_alias): Hande decc$ functions.
(get_vms_time): New function.
(ia64_vms_note): New function.
* gas/config/tc-ia64.h (ia64_elf_section_letter): Now returns a bfd_vma.
(ia64_elf_section_flags): Arg attr now a bfd_vma.
(tc_init_after_args): Define for VMS.
* gas/config/tc-alpha.c (alpha_elf_section_letter): Return a bfd_vma.
(alpha_elf_section_flags): Change type of arg attr to bfd_vma.
* gas/config/tc-alpha.h: Likewise.
* gas/config/tc-i386.c (x86_64_section_letter): Return a bfd_vma.
(x86_64_section_word): Return a bfd_vma.
* gas/config/tc-i386.h: Likewise.
* gas/config/tc-ip2k.c (ip2k_elf_section_flags): Change type of arg
attr to bfd_vma.
* gas/config/tc-ip2k.h: Likewise.
* gas/config/tc-mep.c (mep_elf_section_letter): Return a bfd_vma.
(mep_elf_section_flags): Change type of arg attr to bfd_vma.
* gas/config/tc-mep.h: Likewise.
* gas/config/tc-ppc.c (ppc_section_letter): Return a bfd_vma.
(ppc_section_word): Return a bfd_vma.
(ppc_section_flags): Change type of arg attr to bfd_vma.
* gas/config/tc-ppc.h: Likewise.
* gas/config/te-vms.h (DWARF2_DIR_SHOULD_END_WITH_SEPARATOR,
DWAR2_FILE_TIME_NAME, DWARF2_FILE_SIZE_NAME, DWARF2_FILEN_NAME):
New file with new macros
* gas/dwarf2dbg.c (get_filenum, out_file_list): Default and call new
macros.
2009-01-15 20:42:52 +08:00
|
|
|
#ifdef TE_VMS
|
|
|
|
#define tc_init_after_args() ia64_vms_note ()
|
|
|
|
void ia64_vms_note (void);
|
|
|
|
#endif
|
2000-12-28 18:07:56 +08:00
|
|
|
|
2004-03-03 12:37:38 +08:00
|
|
|
/* Record if an alignment frag should end with a stop bit. */
|
|
|
|
#define TC_FRAG_TYPE int
|
2019-02-10 20:34:10 +08:00
|
|
|
#define TC_FRAG_INIT(FRAGP, MAX_BYTES) do {(FRAGP)->tc_frag_data = 0;}while (0)
|
2004-03-03 12:37:38 +08:00
|
|
|
|
2004-07-04 08:29:21 +08:00
|
|
|
/* Give an error if a frag containing code is not aligned to a 16 byte
|
|
|
|
boundary. */
|
|
|
|
#define md_frag_check(FRAGP) \
|
|
|
|
if ((FRAGP)->has_code \
|
|
|
|
&& (((FRAGP)->fr_address + (FRAGP)->insn_addr) & 15) != 0) \
|
|
|
|
as_bad_where ((FRAGP)->fr_file, (FRAGP)->fr_line, \
|
|
|
|
_("instruction address is not a multiple of 16"));
|
|
|
|
|
2000-12-28 18:07:56 +08:00
|
|
|
#define MAX_MEM_FOR_RS_ALIGN_CODE (15 + 16)
|
2000-04-22 04:22:24 +08:00
|
|
|
|
|
|
|
#define WORKING_DOT_WORD /* don't do broken word processing for now */
|
|
|
|
|
|
|
|
#define DWARF2_LINE_MIN_INSN_LENGTH 1 /* so slot-multipliers can be 1 */
|
|
|
|
|
|
|
|
/* This is the information required for unwind records in an ia64
|
2000-09-16 08:56:47 +08:00
|
|
|
object file. This is required by GAS and the compiler runtime. */
|
2000-04-22 04:22:24 +08:00
|
|
|
|
|
|
|
/* These are the starting point masks for the various types of
|
|
|
|
unwind records. To create a record of type R3 for instance, one
|
2000-09-16 08:56:47 +08:00
|
|
|
starts by using the value UNW_R3 and or-ing in any other required values.
|
|
|
|
These values are also unique (in context), so they can be used to identify
|
2000-04-22 04:22:24 +08:00
|
|
|
the various record types as well. UNW_Bx and some UNW_Px do have the
|
|
|
|
same value, but Px can only occur in a prologue context, and Bx in
|
|
|
|
a body context. */
|
|
|
|
|
|
|
|
#define UNW_R1 0x00
|
|
|
|
#define UNW_R2 0x40
|
|
|
|
#define UNW_R3 0x60
|
|
|
|
#define UNW_P1 0x80
|
|
|
|
#define UNW_P2 0xA0
|
|
|
|
#define UNW_P3 0xB0
|
|
|
|
#define UNW_P4 0xB8
|
|
|
|
#define UNW_P5 0xB9
|
|
|
|
#define UNW_P6 0xC0
|
|
|
|
#define UNW_P7 0xE0
|
|
|
|
#define UNW_P8 0xF0
|
|
|
|
#define UNW_P9 0xF1
|
|
|
|
#define UNW_P10 0xFF
|
|
|
|
#define UNW_X1 0xF9
|
|
|
|
#define UNW_X2 0xFA
|
|
|
|
#define UNW_X3 0xFB
|
|
|
|
#define UNW_X4 0xFC
|
|
|
|
#define UNW_B1 0x80
|
|
|
|
#define UNW_B2 0xC0
|
|
|
|
#define UNW_B3 0xE0
|
|
|
|
#define UNW_B4 0xF0
|
|
|
|
|
|
|
|
/* These are all the various types of unwind records. */
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
prologue, prologue_gr, body, mem_stack_f, mem_stack_v, psp_gr, psp_sprel,
|
|
|
|
rp_when, rp_gr, rp_br, rp_psprel, rp_sprel, pfs_when, pfs_gr, pfs_psprel,
|
|
|
|
pfs_sprel, preds_when, preds_gr, preds_psprel, preds_sprel,
|
|
|
|
fr_mem, frgr_mem, gr_gr, gr_mem, br_mem, br_gr, spill_base, spill_mask,
|
|
|
|
unat_when, unat_gr, unat_psprel, unat_sprel, lc_when, lc_gr, lc_psprel,
|
2000-09-16 08:56:47 +08:00
|
|
|
lc_sprel, fpsr_when, fpsr_gr, fpsr_psprel, fpsr_sprel,
|
|
|
|
priunat_when_gr, priunat_when_mem, priunat_gr, priunat_psprel,
|
2000-04-22 04:22:24 +08:00
|
|
|
priunat_sprel, bsp_when, bsp_gr, bsp_psprel, bsp_sprel, bspstore_when,
|
|
|
|
bspstore_gr, bspstore_psprel, bspstore_sprel, rnat_when, rnat_gr,
|
|
|
|
rnat_psprel, rnat_sprel, epilogue, label_state, copy_state,
|
|
|
|
spill_psprel, spill_sprel, spill_reg, spill_psprel_p, spill_sprel_p,
|
2004-02-06 07:50:21 +08:00
|
|
|
spill_reg_p, unwabi, endp
|
2000-04-22 04:22:24 +08:00
|
|
|
} unw_record_type;
|
|
|
|
|
2000-09-16 08:56:47 +08:00
|
|
|
/* These structures declare the fields that can be used in each of the
|
2000-04-22 04:22:24 +08:00
|
|
|
4 record formats, R, P, B and X. */
|
|
|
|
|
|
|
|
typedef struct unw_r_record
|
|
|
|
{
|
|
|
|
unsigned long rlen;
|
2000-05-25 10:00:14 +08:00
|
|
|
unsigned short grmask;
|
2000-04-22 04:22:24 +08:00
|
|
|
unsigned short grsave;
|
2000-05-25 10:00:14 +08:00
|
|
|
/* masks to represent the union of save.g, save.f, save.b, and
|
|
|
|
save.gf: */
|
|
|
|
unsigned long imask_size;
|
|
|
|
struct
|
|
|
|
{
|
|
|
|
unsigned char *i;
|
2005-07-27 14:32:46 +08:00
|
|
|
unsigned int fr_mem;
|
2000-05-25 10:00:14 +08:00
|
|
|
unsigned char gr_mem;
|
|
|
|
unsigned char br_mem;
|
|
|
|
} mask;
|
2000-04-22 04:22:24 +08:00
|
|
|
} unw_r_record;
|
|
|
|
|
|
|
|
typedef struct unw_p_record
|
|
|
|
{
|
2005-07-27 14:32:46 +08:00
|
|
|
struct unw_rec_list *next;
|
2000-04-22 04:22:24 +08:00
|
|
|
unsigned long t;
|
|
|
|
unsigned long size;
|
2005-07-27 14:32:46 +08:00
|
|
|
union
|
|
|
|
{
|
|
|
|
unsigned long sp;
|
|
|
|
unsigned long psp;
|
|
|
|
} off;
|
|
|
|
union
|
|
|
|
{
|
|
|
|
unsigned short gr;
|
|
|
|
unsigned short br;
|
|
|
|
} r;
|
|
|
|
unsigned char grmask;
|
|
|
|
unsigned char brmask;
|
|
|
|
unsigned int frmask;
|
2000-05-25 10:00:14 +08:00
|
|
|
unsigned char abi;
|
|
|
|
unsigned char context;
|
2000-04-22 04:22:24 +08:00
|
|
|
} unw_p_record;
|
|
|
|
|
|
|
|
typedef struct unw_b_record
|
|
|
|
{
|
|
|
|
unsigned long t;
|
|
|
|
unsigned long label;
|
|
|
|
unsigned short ecount;
|
|
|
|
} unw_b_record;
|
|
|
|
|
|
|
|
typedef struct unw_x_record
|
|
|
|
{
|
|
|
|
unsigned long t;
|
2005-07-27 14:32:46 +08:00
|
|
|
union
|
|
|
|
{
|
|
|
|
unsigned long spoff;
|
|
|
|
unsigned long pspoff;
|
|
|
|
unsigned int reg;
|
|
|
|
} where;
|
2000-04-22 04:22:24 +08:00
|
|
|
unsigned short reg;
|
|
|
|
unsigned short qp;
|
2000-05-25 10:00:14 +08:00
|
|
|
unsigned short ab; /* Value of the AB field.. */
|
|
|
|
unsigned short xy; /* Value of the XY field.. */
|
2000-04-22 04:22:24 +08:00
|
|
|
} unw_x_record;
|
|
|
|
|
2000-09-16 08:56:47 +08:00
|
|
|
/* This structure is used to determine the specific record type and
|
2000-04-22 04:22:24 +08:00
|
|
|
its fields. */
|
|
|
|
typedef struct unwind_record
|
|
|
|
{
|
|
|
|
unw_record_type type;
|
|
|
|
union {
|
|
|
|
unw_r_record r;
|
|
|
|
unw_p_record p;
|
|
|
|
unw_b_record b;
|
|
|
|
unw_x_record x;
|
|
|
|
} record;
|
|
|
|
} unwind_record;
|
2001-02-07 03:09:01 +08:00
|
|
|
|
2002-09-05 08:01:18 +08:00
|
|
|
/* This expression evaluates to true if the relocation is for a local
|
2001-02-07 03:09:01 +08:00
|
|
|
object for which we still want to do the relocation at runtime.
|
2002-09-05 08:01:18 +08:00
|
|
|
False if we are willing to perform this relocation while building
|
|
|
|
the .o file. */
|
2001-02-07 03:09:01 +08:00
|
|
|
|
2001-02-14 09:46:10 +08:00
|
|
|
/* If the reloc type is BFD_RELOC_UNUSED, then this is for a TAG13/TAG13b field
|
|
|
|
which has no external reloc, so we must resolve the value now. */
|
|
|
|
|
2002-09-05 08:01:18 +08:00
|
|
|
#define TC_FORCE_RELOCATION_LOCAL(FIX) \
|
|
|
|
((FIX)->fx_r_type != BFD_RELOC_UNUSED \
|
2017-05-16 07:13:24 +08:00
|
|
|
&& (GENERIC_FORCE_RELOCATION_LOCAL (FIX) \
|
|
|
|
|| (FIX)->fx_r_type == BFD_RELOC_IA64_PLTOFF22))
|
2011-03-31 16:02:41 +08:00
|
|
|
|
|
|
|
/* VMS backtraces expect dwarf version 3. */
|
|
|
|
#ifdef TE_VMS
|
2020-03-07 01:13:22 +08:00
|
|
|
#define DWARF2_VERSION (dwarf_level < 3 ? 3 : dwarf_level)
|
2011-03-31 16:02:41 +08:00
|
|
|
#endif
|
2020-09-14 23:56:41 +08:00
|
|
|
|
|
|
|
#define md_single_noop_insn "nop 0"
|