summaryrefslogtreecommitdiff
path: root/libebl/libebl.h
diff options
context:
space:
mode:
authorRoland McGrath <roland@redhat.com>2009-06-24 17:41:40 -0700
committerRoland McGrath <roland@redhat.com>2009-07-08 15:15:52 -0700
commit3c84db3b4b610bf636c4363abb6d3dac5ae020f9 (patch)
treee0af0c5a7f27a3f06a66353a3da9bec0bd7bd32f /libebl/libebl.h
parentfe8b42e6131b74829fe31d15f31349cade566a59 (diff)
downloadelfutils-3c84db3b4b610bf636c4363abb6d3dac5ae020f9.tar.gz
CFI support: lookup by PC and translate into DWARF location per register
Diffstat (limited to 'libebl/libebl.h')
-rw-r--r--libebl/libebl.h34
1 files changed, 33 insertions, 1 deletions
diff --git a/libebl/libebl.h b/libebl/libebl.h
index 50258690..1a56b966 100644
--- a/libebl/libebl.h
+++ b/libebl/libebl.h
@@ -1,5 +1,5 @@
/* Interface for libebl.
- Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007, 2008 Red Hat, Inc.
+ Copyright (C) 2000, 2001-2009 Red Hat, Inc.
This file is part of Red Hat elfutils.
Red Hat elfutils is free software; you can redistribute it and/or modify
@@ -256,6 +256,38 @@ extern ssize_t ebl_register_info (Ebl *ebl,
extern int ebl_syscall_abi (Ebl *ebl, int *sp, int *pc,
int *callno, int args[6]);
+/* Supply the ABI-specified state of DWARF CFI before CIE initial programs.
+
+ The DWARF 3.0 spec says that the default initial states of all registers
+ are "undefined", unless otherwise specified by the machine/compiler ABI.
+
+ This default is wrong for every machine with the CFI generated by GCC.
+ The EH unwinder does not really distinguish "same_value" and "undefined",
+ since it doesn't matter for unwinding (in either case there is no change
+ to make for that register). GCC generates CFI that says nothing at all
+ about registers it hasn't spilled somewhere. For our unwinder to give
+ the true story, the backend must supply an initial state that uses
+ "same_value" rules for all the callee-saves registers.
+
+ This can fill in the initial_instructions, initial_instructions_end
+ members of *ABI_INFO to point at a CFI instruction stream to process
+ before each CIE's initial instructions. It should set the
+ data_alignment_factor member if it affects the initial instructions.
+
+ As a shorthand for some common cases, for this instruction stream
+ we overload some CFI instructions that cannot be used in a CIE:
+
+ DW_CFA_restore -- Change default rule for all unmentioned
+ registers from undefined to same_value.
+
+ This function can also fill in ABI_INFO->return_address_register with the
+ DWARF register number that identifies the actual PC in machine state.
+ If there is no canonical DWARF register number with that meaning, it's
+ left unchanged (callers usually initialize with (Dwarf_Word) -1).
+ This value is not used by CFI per se. */
+extern int ebl_abi_cfi (Ebl *ebl, Dwarf_CIE *abi_info)
+ __nonnull_attribute__ (2);
+
/* ELF string table handling. */
struct Ebl_Strtab;
struct Ebl_Strent;