atrosinenko wrote:

> ... (rather than requiring a jit generated frame)

IIUC it should be rather straightforward to get a stack frame without any 
associated CFI by manually writing a function in assembly and not providing any 
`.cfi_*` directives for it.

```c
class my_exception {
  int n;
};

asm(
  "  .globl  caller\n"
  "  .p2align 4\n"
  "  .type   caller,@function\n"
  "caller:\n"
  "  stp     x29, x30, [sp, #-16]!\n"
  "  mov     x29, sp\n"
  "  bl      thrower\n"
  "  ldp     x29, x30, [sp], #16\n"
  "  ret\n"
);

extern "C" void caller();

extern "C" void thrower() {
  throw my_exception();
}

int main() {
  try {
    caller();
  } catch (...) {
    return 1;
  }
  return 0;
}
```

Though, I cannot make an assertion in `__unw_set_reg` trigger, I simply get 
"normal" abnormal termination instead:
```
libc++abi: terminating due to uncaught exception of type my_exception
```

I guess the `__unw_set_reg` function is only called during the Unwinding Phase, 
but it is not even started, as (I guess) missing debug info is already detected 
during the Search Phase. What I see in debugger is that if I set breakpoints at 
`unwind_phase1` and `unwind_phase2`, then I get the fatal error after I 
continue execution at `unwind_phase1` (without ever hitting `unwind_phase2`).

I guess that the issue may be reproduced by performing forced unwind, as IIRC 
it skips the first phase at all.

https://github.com/llvm/llvm-project/pull/184041
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to