Update documentation accordingly

This commit is contained in:
Théophile Bastian 2018-04-06 16:51:55 +02:00
parent 36096575ed
commit e5b76b3fb1
3 changed files with 35 additions and 8 deletions

View file

@ -791,7 +791,7 @@ WARN_LOGFILE =
# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
# Note: If this tag is empty the current directory is searched. # Note: If this tag is empty the current directory is searched.
INPUT = "include/" "src/" INPUT = "include/dwarfinterpret/" "src/"
# This tag can be used to specify the character encoding of the source files # This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses

View file

@ -92,7 +92,14 @@ class DwarfInterpret {
typedef uintptr_t reg_content_t; typedef uintptr_t reg_content_t;
/// An unwind context, holding registers /** An unwind context, holding registers.
*
* The registers kept here should be enough for most of the unwinding
* processes. To fully emulate libunwind, we would have to save every
* register that is overwritten and not caller-saved.
*
* You'll most probably want to instanciate such a structure using
* #DwarfInterpret::get_current_unwind_context. */
struct UnwindContext { struct UnwindContext {
// Let's pretend this is enough // Let's pretend this is enough
uintptr_t rip; uintptr_t rip;
@ -137,7 +144,32 @@ class DwarfInterpret {
const UnwindContext& ctx const UnwindContext& ctx
) const; ) const;
/// Get the current UnwindContext (from the caller's point of view) /** Get the current UnwindContext (from the caller's point of view)
*
* **WARNING!** This context will be valid within the call frame of the
* caller, and within descendant calls from this function, but will
* most probably be invalid and result in weird behaviours if there is
* only a single `return` made!
*
* This is supposed to work:
* ```
* void foo() {
* UnwindContext context = get_current_unwind_context();
* // have fun with context
* }
* ```
*
* While this will probably crash:
* ```
* UnwindContext wrap_get_context() {
* return f(get_current_unwind_context());
* }
* void foo() {
* UnwindContext context = wrap_get_context();
* // have fun with context
* }
* ```
*/
static UnwindContext get_current_unwind_context(); static UnwindContext get_current_unwind_context();
/// Unwinds once the given context /// Unwinds once the given context

View file

@ -189,11 +189,6 @@ DwarfInterpret::reg_content_t DwarfInterpret::interpret_dw_register(
} }
DwarfInterpret::UnwindContext DwarfInterpret::get_current_unwind_context() { DwarfInterpret::UnwindContext DwarfInterpret::get_current_unwind_context() {
// FIXME for now this returns SOME unwind context (actually, the unwind
// context snapshot naively taken from inside this function). Unwinding
// it some number of times should yield the expected context
UnwindContext ctx; UnwindContext ctx;
get_cpu_register(REG_RIP, ctx.rip); get_cpu_register(REG_RIP, ctx.rip);
get_cpu_register(REG_RSP, ctx.rsp); get_cpu_register(REG_RSP, ctx.rsp);