From ca5e1ce0281bd7fb363bd53d59185d6a1a99f75b Mon Sep 17 00:00:00 2001 From: Gabriel Corona Date: Fri, 7 Mar 2014 12:49:47 +0100 Subject: [PATCH] [mc] Implement DW_OP_call_frame_cfa using libunwind This is used by DWARF4 for DW_AT_frame_base. We need to implement this in order to use the new DWARf expression code for DW_AT_frame_base resolution (used in DWARF4 libpthread_nonshared.a). --- src/mc/mc_dwarf_expression.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/mc/mc_dwarf_expression.c b/src/mc/mc_dwarf_expression.c index 54f0d22e2a..54183b4bb9 100644 --- a/src/mc/mc_dwarf_expression.c +++ b/src/mc/mc_dwarf_expression.c @@ -43,6 +43,31 @@ int mc_dwarf_execute_expression( break; } + // Push the CFA (Call Frame Addresse): + case DW_OP_call_frame_cfa: + { + unw_word_t res; + + int register_id = +#if defined(UNW_TARGET_X86_64) + UNW_X86_64_CFA +#elif defined(UNW_TARGET_X86) + UNW_X86_CFA +#else + -1; +#endif + ; + if(register_id<0) + xbt_die("Support for CFA not implemented for this achitecture."); + + if(!state->cursor) + return MC_EXPRESSION_E_MISSING_STACK_CONTEXT; + + unw_get_reg(state->cursor, register_id, &res); + error = mc_dwarf_push_value(state, res + op->number); + break; + } + // Frame base: case DW_OP_fbreg: -- 2.20.1