From 54cfded08ec4835361d381d602fe3f845a45c118 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 20 May 2003 07:58:07 +0000 Subject: * dw2gencfi.c, dw2gencfi.h: New files. * 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. --- gas/dw2gencfi.h | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 gas/dw2gencfi.h (limited to 'gas/dw2gencfi.h') diff --git a/gas/dw2gencfi.h b/gas/dw2gencfi.h new file mode 100644 index 0000000000..1c724540e6 --- /dev/null +++ b/gas/dw2gencfi.h @@ -0,0 +1,100 @@ +/* dw2gencfi.h - Support for generating Dwarf2 CFI information. + Copyright 2003 Free Software Foundation, Inc. + Contributed by Michal Ludvig + + 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 + the Free Software Foundation; either version 2, or (at your option) + 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 the Free + Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +#ifndef DW2GENCFI_H +#define DW2GENCFI_H + +#include "elf/dwarf2.h" + +struct cfi_config { + /* Target address length in bytes. (usually 4 or 8). + Round it up for archs like S/390 with 31b addresses. */ + unsigned int addr_length; + + /* Alignment of .eh_frame blocks in bytes (usually 1, 4 or 8). */ + unsigned int eh_align; + + /* Code alignment (1 for x86/amd64 machines, 4 or 8 for + RISC machines). Consult Dwarf2 standard for details. */ + int code_align; + + /* Data (stack) alignment (-4 on x86, -8 on amd64, something + positive on archs where stack grows up). Consult Dwarf2 + standard for details. */ + int data_align; + + /* Return address column (0x8 on x86, 0x10 on amd64). Consult + Dwarf2 standard for details. */ + int ra_column; + + /* Relocation type for init_addr FDE record. (BFD_RELOC_64 + on amd64). */ + int reloc_type; +}; + +/* Codes of CFI instructions taken from Dwarf2 standard. */ +enum cfi_insn { + CFA_nop = DW_CFA_nop, + CFA_set_loc = DW_CFA_set_loc, + CFA_advance_loc1 = DW_CFA_advance_loc1, + CFA_advance_loc2 = DW_CFA_advance_loc2, + CFA_advance_loc4 = DW_CFA_advance_loc4, + CFA_offset_extended = DW_CFA_offset_extended, + CFA_resotre_extended = DW_CFA_restore_extended, + CFA_undefined = DW_CFA_undefined, + CFA_same_value = DW_CFA_same_value, + CFA_register = DW_CFA_register, + CFA_remember_state = DW_CFA_remember_state, + CFA_restore_state = DW_CFA_restore_state, + CFA_def_cfa = DW_CFA_def_cfa, + CFA_def_cfa_register = DW_CFA_def_cfa_register, + CFA_def_cfa_offset = DW_CFA_def_cfa_offset, + CFA_advance_loc = DW_CFA_advance_loc, + CFA_offset = DW_CFA_offset, + CFA_restore = DW_CFA_restore, + + /* These don't belong to the standard. */ + CFI_startproc = 0xff00, + CFI_endproc = 0xff01, + CFI_adjust_cfa_offset = 0xff10, + CFI_verbose = 0xffff +}; + +extern const pseudo_typeS cfi_pseudo_table[]; + +/* Insert .cfi_* directives to the list of pseudo-ops. */ +void cfi_pop_insert PARAMS ((void)); + +/* Set/change setup of the CFI machinery. This change won't + affect already generated CIEs/FDEs. */ +void cfi_set_config PARAMS ((struct cfi_config *cfg)); + +/* cfi_finish() is called at the end of file. It will complain if + the last CFI wasn't properly closed by .cfi_endproc. */ +void cfi_finish PARAMS ((void)); + +/* Add CFI instruction to the list of instructions + of the current frame. cfi_add_insn() could be used + in tc_cfi_frame_initial_instructions() to add instructions + needed for every frame (ie. those that usually go to CIE). */ +void cfi_add_insn (enum cfi_insn insn, long param0, long param1); + +#endif /* DW2GENCFI_H */ -- cgit v1.2.1