Hi All,
While compiling libgcc with LLVM for our target, it seems I don't
get __builtin_dwarf_cfa() right. That causes uw_init_context_1 [1]
initialize the wrong context, and the overall exception handling fail.
I find Hal provided patch years ago adding ISD::EH_DWARF_CFA, which
corresponding to __builtin_dwarf_cfa(), and let us have the
opportunity to handle __builtin_dwarf_cfa() for our own [2].
I copy Mips' lowerEH_DWARF_CFA for our target, and it *just* works
[3]. I have to admit that I don't understand what Hal explained in his
patch, also don't know why Mips code work for ours. Here I have two
questions:
1. What is __builtin_dwarf_cfa()?
What I know about CFA (Canonical Frame Address) is, it's a
base address which we can restore registers for the caller frame. Why
do we have to call __builtin_dwarf_cfa() for uw_init_context_1, I
don't see the connection between them.
2. Why Mips code works for our target?
Okay... Maybe when I fully understand the answer of question
1, I can answer this by myself. But what does Mips' lowerEH_DWARF_CFA?
And why only PowerPC and Mips have to lower EH_DWARF_CFA by
themselves?
Thanks.
P.S. ASCII art might be help on explaining the whole thing. ;-)
[1] https://github.com/gcc-mirror/gcc/blob/master/libgcc/unwind-dw2.c
[2] https://reviews.llvm.org/rL280350
[3] http://llvm.org/doxygen/MipsISelLowering_8cpp_source.html
--
Wei-Ren Chen (陳韋任)
Homepage: https://people.cs.nctu.edu.tw/~chenwj