diff options
author | Matt Fleming <matt@console-pimps.org> | 2009-08-20 14:53:49 -0400 |
---|---|---|
committer | Matt Fleming <matt@console-pimps.org> | 2009-08-21 08:04:11 -0400 |
commit | 5580e9044df9c0e87861739d8c527006ead92e52 (patch) | |
tree | ef7c280cbc9e5b9f22170485cf05e7ebbe6c01f5 /arch/sh/kernel/dwarf.c | |
parent | 5480675dc60c7dda7146e506981b2b40a775cc1e (diff) |
sh: Handle the DWARF op, DW_CFA_undefined
Allow a DWARF register to have an undefined value. When applied to the
DWARF return address register this lets lets us label a function as
having no direct caller, e.g. kernel_thread_helper().
Signed-off-by: Matt Fleming <matt@console-pimps.org>
Diffstat (limited to 'arch/sh/kernel/dwarf.c')
-rw-r--r-- | arch/sh/kernel/dwarf.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/arch/sh/kernel/dwarf.c b/arch/sh/kernel/dwarf.c index e6f427cff5ba..577302f31e6a 100644 --- a/arch/sh/kernel/dwarf.c +++ b/arch/sh/kernel/dwarf.c | |||
@@ -452,6 +452,8 @@ static int dwarf_cfa_execute_insns(unsigned char *insn_start, | |||
452 | case DW_CFA_undefined: | 452 | case DW_CFA_undefined: |
453 | count = dwarf_read_uleb128(current_insn, ®); | 453 | count = dwarf_read_uleb128(current_insn, ®); |
454 | current_insn += count; | 454 | current_insn += count; |
455 | regp = dwarf_frame_alloc_reg(frame, reg); | ||
456 | regp->flags |= DWARF_UNDEFINED; | ||
455 | break; | 457 | break; |
456 | case DW_CFA_def_cfa: | 458 | case DW_CFA_def_cfa: |
457 | count = dwarf_read_uleb128(current_insn, | 459 | count = dwarf_read_uleb128(current_insn, |
@@ -629,9 +631,16 @@ struct dwarf_frame * dwarf_unwind_stack(unsigned long pc, | |||
629 | UNWINDER_BUG(); | 631 | UNWINDER_BUG(); |
630 | } | 632 | } |
631 | 633 | ||
632 | /* If we haven't seen the return address reg, we're screwed. */ | ||
633 | reg = dwarf_frame_reg(frame, DWARF_ARCH_RA_REG); | 634 | reg = dwarf_frame_reg(frame, DWARF_ARCH_RA_REG); |
634 | UNWINDER_BUG_ON(!reg); | 635 | |
636 | /* | ||
637 | * If we haven't seen the return address register or the return | ||
638 | * address column is undefined then we must assume that this is | ||
639 | * the end of the callstack. | ||
640 | */ | ||
641 | if (!reg || reg->flags == DWARF_UNDEFINED) | ||
642 | goto bail; | ||
643 | |||
635 | UNWINDER_BUG_ON(reg->flags != DWARF_REG_OFFSET); | 644 | UNWINDER_BUG_ON(reg->flags != DWARF_REG_OFFSET); |
636 | 645 | ||
637 | addr = frame->cfa + reg->addr; | 646 | addr = frame->cfa + reg->addr; |