Even more explanation.
authorBill Wendling <isanbard@gmail.com>
Tue, 19 Jan 2010 02:44:01 +0000 (02:44 +0000)
committerBill Wendling <isanbard@gmail.com>
Tue, 19 Jan 2010 02:44:01 +0000 (02:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93841 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPCTargetMachine.cpp
lib/Target/X86/X86TargetMachine.cpp

index c80a530c885a56431cb005a89d8a43fd2fe3a688..c7f788238a345d845944876aac26f2217da79b79 100644 (file)
@@ -201,6 +201,18 @@ bool PPCTargetMachine::addSimpleCodeEmitter(PassManagerBase &PM,
 /// to bugs or other conditions. We will default to a 4-byte encoding unless the
 /// system tells us otherwise.
 ///
+/// The issue is when the CIE says their is an LSDA. That mandates that every
+/// FDE have an LSDA slot. But if the function does not need an LSDA. There
+/// needs to be some way to signify there is none. The LSDA is encoded as
+/// pc-rel. But you don't look for some magic value after adding the pc. You
+/// have to look for a zero before adding the pc. The problem is that the size
+/// of the zero to look for depends on the encoding. The unwinder bug in SL is
+/// that it always checks for a pointer-size zero. So on x86_64 it looks for 8
+/// bytes of zero. If you have an LSDA, it works fine since the 8-bytes are
+/// non-zero so it goes ahead and then reads the value based on the encoding.
+/// But if you use sdata4 and there is no LSDA, then the test for zero gives a
+/// false negative and the unwinder thinks there is an LSDA.
+///
 /// FIXME: This call-back isn't good! We should be using the correct encoding
 /// regardless of the system. However, there are some systems which have bugs
 /// that prevent this from occuring.
index 684e1fc573d45b5d023bbb4ab095e5dec5aa19ae..445318e64fb44af5f725d8da3d97348e7f3c26d3 100644 (file)
@@ -257,6 +257,18 @@ void X86TargetMachine::setCodeModelForJIT() {
 /// to bugs or other conditions. We will default to a 4-byte encoding unless the
 /// system tells us otherwise.
 ///
+/// The issue is when the CIE says their is an LSDA. That mandates that every
+/// FDE have an LSDA slot. But if the function does not need an LSDA. There
+/// needs to be some way to signify there is none. The LSDA is encoded as
+/// pc-rel. But you don't look for some magic value after adding the pc. You
+/// have to look for a zero before adding the pc. The problem is that the size
+/// of the zero to look for depends on the encoding. The unwinder bug in SL is
+/// that it always checks for a pointer-size zero. So on x86_64 it looks for 8
+/// bytes of zero. If you have an LSDA, it works fine since the 8-bytes are
+/// non-zero so it goes ahead and then reads the value based on the encoding.
+/// But if you use sdata4 and there is no LSDA, then the test for zero gives a
+/// false negative and the unwinder thinks there is an LSDA.
+///
 /// FIXME: This call-back isn't good! We should be using the correct encoding
 /// regardless of the system. However, there are some systems which have bugs
 /// that prevent this from occuring.