Age | Commit message (Collapse) | Author | Files | Lines |
|
When runtime patching code (like e.g. done by the Linux kernel) there
may be cases where the set of stack frame alterations differs between
unpatched and patched code. Consequently the corresponding unwind data
needs patching too. Locating the right places within an FDE, however,
is rather cumbersome without a way to insert labels in the resulting
section. Hence this patch introduces a new directive, .cfi_label. Note
that with the way CFI data gets emitted currently (at the end of the
assembly process) this can't support local FB- and dollar-labels.
gas/
2015-01-12 Jan Beulich <jbeulich@suse.com>
* gas/dw2gencfi.c (cfi_add_label, dot_cfi_label): New.
(cfi_pseudo_table): Add "cfi_label".
(output_cfi_insn): Handle CFI_label.
(select_cie_for_fde): Als terminate CIE when encountering
CFI_label.
* dw2gencfi.h (cfi_add_label): Declare.
(struct cfi_insn_data): New member "sym_name".
(CFI_label): New.
* read.c (read_symbol_name): Drop "static".
* read.h (read_symbol_name): Declare.
gas/testsuite/
2015-01-12 Jan Beulich <jbeulich@suse.com>
gas/cfi/cfi-label.d, gas/cfi/cfi-label.s: New.
gas/cfi/cfi.exp: Run new tests.
|
|
|
|
|
|
* dw2gencfi.h (all_fde_data): Declare.
* config/tc-alpha.c (alpha_elf_md_end): Don't convert legacy unwind
info to cfi unwind info if the user already has supplied some.
|
|
bfd/
* elf32-tic6x.c (is_tic6x_elf_unwind_section_name,
elf32_tic6x_fake_sections): New functions.
(elf_backend_fake_sections): Define.
gas/
* config/tc-tic6x.c (streq): Define.
(tic6x_get_unwind): New.
(s_tic6x_cantunwind, s_tic6x_handlerdata, s_tic6x_endp,
s_tic6x_personalityindex, s_tic6x_personality): New functions.
(md_pseudo_table): Add "endp", "handlerdata", "personalityindex",
"personality" and "cantunwind".
(tic6x_regname_to_dw2regnum, tic6x_frame_initial_instructions,
tic6x_start_unwind_section, tic6x_unwind_frame_regs,
tic6x_pop_rts_offset_little, tic6x_pop_rts_offset_big,
tic6x_unwind_reg_from_dwarf, tic6x_flush_unwind_word,
tic6x_unwind_byte, tic6x_unwind_2byte, tic6x_unwind_uleb,
tic6x_cfi_startproc, output_exidx_entry, tic6x_output_unwinding,
tic6x_cfi_endproc): New.
* config/tc-tic6x.h (TIC6X_NUM_UNWIND_REGS): Define.
(tic6x_unwind_info): New.
(tic6x_segment_info_type): Add marked_pr_dependency, unwind and
text_unwind.
(TARGET_USE_CFIPOP, tc_regname_to_dw2regnum,
tc_cfi_frame_initial_instructions, DWARF2_DEFAULT_RETURN_COLUMN,
DWARF2_CIE_DATA_ALIGNMENT, tc_cfi_startproc, tc_cfi_endproc,
tc_cfi_section_name): Define.
* doc/c-tic6x.texi: Document new unwinding directives.
* dw2gencfi.c (tc_cfi_startproc, tc_cfi_endproc): Add default
definitions.
(cfi_insn_data, fde_entry, CFI_adjust_cfa_offset, CFI_return_column,
CFI_rel_offset, CFI_escape, CFI_signal_frame, CFI_val_encoded_addr):
Move to dw2gencfi.h.
(CFI_EMIT_target): Define.
(dot_cfi_sections): Check tc_cfi_section_name.
(dot_cfi_startproc): Use tc_cfi_startproc.
(dot_cfi_endproc): Use tc_cfi_endproc.
* dw2gencfi.h (cfi_insn_data, fde_entry, CFI_adjust_cfa_offset,
CFI_return_column, CFI_rel_offset, CFI_escape, CFI_signal_frame,
CFI_val_encoded_addr): Move to here from dw2gencfi.c.
gas/testsuite:
* gas/tic6x/unwind-1.d: New test.
* gas/tic6x/unwind-1.s: New test.
* gas/tic6x/unwind-2.d: New test.
* gas/tic6x/unwind-2.s: New test.
* gas/tic6x/unwind-3.d: New test.
* gas/tic6x/unwind-3.s: New test.
* gas/tic6x/unwind-bad-1.d: New test.
* gas/tic6x/unwind-bad-1.s: New test.
* gas/tic6x/unwind-bad-1.l: New test.
* gas/tic6x/unwind-bad-2.d: New test.
* gas/tic6x/unwind-bad-2.s: New test.
* gas/tic6x/unwind-bad-2.l: New test.
include/
* elf/tic6x.h (ELF_STRING_C6000_unwind,
ELF_STRING_C6000_unwind_info, ELF_STRING_C6000_unwind_once,
ELF_STRING_C6000_unwind_info_once): Define.
|
|
|
|
* Makefile.am (dwarf2.lo): Use dwarf2.h, not elf/dwarf2.h.
(elf-eh-frame.lo): Likewise.
(elf32-bfin.lo): Likewise.
(elf32-frv.lo): Likewise.
(elf32-xc16x.lo): Likewise.
* Makefile.in: Rebuild.
* dwarf2.c: Included dwarf.h, not elf/dwarf2.h.
* elf-eh-frame.c: Likewise.
* elf32-bfin.c: Likewise.
* elf32-frv.c: Likewise.
* elf32-xc16x.c: Likewise.
binutils
* Makefile.am (dwarf.o): Refer to dwarf2.h, not elf/dwarf2.h.
* Makefile.in: Rebuild.
* dwarf.c: Include dwarf2.h, not elf/dwarf2.h.
gas
* Makefile.am (DEPTC_alpha_ecoff): Refer to dwarf2.h, not
elf/dwarf2.h.
(DEPTC_alpha_elf): Likewise.
(DEPTC_alpha_evax): Likewise.
(DEPTC_arm_elf): Likewise.
(DEPTC_hppa_elf): Likewise.
(DEPTC_i386_aout): Likewise.
(DEPTC_i386_coff): Likewise.
(DEPTC_i386_elf): Likewise.
(DEPTC_m68k_aout): Likewise.
(DEPTC_m68k_coff): Likewise.
(DEPTC_m68k_elf): Likewise.
(DEPTC_mips_coff): Likewise.
(DEPTC_mips_ecoff): Likewise.
(DEPTC_mips_elf): Likewise.
(DEPTC_ppc_coff): Likewise.
(DEPTC_ppc_elf): Likewise.
(DEPTC_s390_elf): Likewise.
(DEPTC_sh_coff): Likewise.
(DEPTC_sh_elf): Likewise.
(DEPTC_sh64_elf): Likewise.
(DEPTC_sparc_aout): Likewise.
(DEPTC_sparc_coff): Likewise.
(DEPTC_sparc_elf): Likewise.
(as.o): Likewise.
(dwarf2dbg.o): Likewise.
(dw2gencfi.o): Likewise.
(ehopt.o): Likewise.
(read.o): Likewise.
* Makefile.in: Rebuild.
* dw2gencfi.h: Include dwarf2.h, not elf/dwarf2.h.
* dwarf2dbg.c: Likewise.
* ehopt.c: Likewise.
gdb
* dwarf2-frame.c: Include dwarf2.h, not elf/dwarf2.h.
* dwarf2expr.c: Likewise.
* dwarf2loc.c: Likewise.
* dwarf2read.c: Likewise.
* sh-tdep.c: Likewise.
* xtensa-tdep.c: Likewise.
include
* dwarf2.h: New file, moved from elf/.
include/elf
* dwarf2.h: Move to `..'.
|
|
|
|
|
|
(cfi_add_CFA_nop): Remove.
(CFI_escape, dot_cfi_escape): New.
(dot_cfi): Remove nop.
(cfi_pseudo_table): Remove nop; add escape.
(output_cfi_insn): Likewise.
(select_cie_for_fde): Stop on escape.
* dw2gencfi.h (cfi_add_CFA_nop): Remove.
* read.c, read.h (do_parse_cons_expression): New.
* doc/as.texinfo (.cfi_escape): New.
* gas/cfi/cfi-common-3.[ds]: New.
* gas/cfi/cfi.exp: Run it.
|
|
* dw2gencfi.c (cfi_add_CFA_insn, cfi_add_CFA_insn_reg)
(cfi_add_CFA_insn_reg_reg, cfi_add_CFA_insn_reg_offset): New.
(cfi_add_CFA_offset, cfi_add_CFA_def_cfa)
(cfi_add_CFA_register, cfi_add_CFA_def_cfa_register)
(cfi_add_CFA_def_cfa_offset): Use cfi_add_CFA_insn_*().
(cfi_add_CFA_restore, cfi_add_CFA_undefined)
(cfi_add_CFA_same_value, cfi_add_CFA_remember_state)
(cfi_add_CFA_restore_state, cfi_add_CFA_nop): New.
(cfi_pseudo_table): New directives .cfi_return_column,
.cfi_restore, .cfi_undefined, .cfi_same_value,
.cfi_remember_state, .cfi_restore_state, .cfi_nop.
(dot_cfi, output_cfi_insn): Handle new directives.
* dw2gencfi.h (cfi_add_CFA_restore, cfi_add_CFA_undefined)
(cfi_add_CFA_same_value, cfi_add_CFA_remember_state)
(cfi_add_CFA_restore_state, cfi_add_CFA_nop): New prototypes.
|
|
* as.c (main): Always call cfi_finish.
* config/tc-i386.c (x86_dwarf2_return_column): New.
(x86_cie_data_alignment): New.
(md_begin): Set them.
(tc_x86_cfi_init): Remove.
(tc_x86_regname_to_dw2regnum): Fix 32-bit register numbers;
return int, not unsigned long; don't as_bad here.
(tc_x86_frame_initial_instructions): Streamline; use
updated api.
* config/tc-i386.h (tc_cfi_init): Remove.
(DWARF2_DEFAULT_RETURN_COLUMN): New.
(DWARF2_CIE_DATA_ALIGNMENT): New.
* gas/cfi/cfi-i386.d: Update for dw2gencfi rewrite.
* gas/cfi/cfi-x86_64.d: Likewise.
* gas/cfi/cfi-i386-2.d: New.
* gas/cfi/cfi-i386-2.s: New.
|
|
* config/tc-i386.c (tc_x86_cfi_init): New function.
* config/tc-i386.h (TARGET_USE_CFIPOP, tc_cfi_init): New defines.
* as.c (parse_args): Set verbose flag on --verbose.
(main): Call tc_cfi_init()/cfi_finish().
* as.h (verbose): New external variable.
* read.c (pobegin): Insert CFI pops to the list.
* symbols.c (local_symbol_make): Make symbol external.
* symbols.h (local_symbol_make): New prototype.
* Makefile.am: Add dw2gencfi.[ch] files. Run "make dep-am".
* Makefile.in: Regenerate.
* doc/as.texinfo: Added node "CFI directives" with description of
all implemented .cfi_* directives.
* doc/Makefile.in: Regenerate.
* po/POTFILES.in: Regenerate.
|