On Tue, Nov 28, 2006 at 02:12:24PM +0000, Jan Beulich wrote: > This fixes a problem with gcc4 mis-compiling the stack unwind code under > -Os, which resulted in 'stuck' messages whenever an assembly routine was > encountered.
"mis-compiling" and "work around" are wrong words, the code had undefined behavior (there is no sequence point between evaluation of ptr and get_uleb128(&ptr, end) and ptr is modified twice, so the compiler can evaluate it e.g. as: temp = ptr; temp = temp + get_uleb128(&ptr, end); ptr = temp; or temp = get_uleb128(&ptr, end); ptr += temp; While gcc has some warnings for sequence point semantics violations (-Wsequence-point), this can't be one of the cases at least until IPA moves much further, because get_uleb128 might very well not modify the variable and at that point the code would be ok). > Signed-off-by: Jan Beulich <[EMAIL PROTECTED]> > > --- linux-2.6.19-rc6/kernel/unwind.c 2006-11-22 14:54:10.000000000 +0100 > +++ 2.6.19-rc6-unwind-stuck/kernel/unwind.c 2006-11-28 15:02:15.000000000 > +0100 > @@ -938,8 +938,11 @@ int unwind(struct unwind_frame_info *fra > else { > retAddrReg = state.version <= 1 ? *ptr++ : > get_uleb128(&ptr, end); > /* skip augmentation */ > - if (((const char *)(cie + 2))[1] == 'z') > - ptr += get_uleb128(&ptr, end); > + if (((const char *)(cie + 2))[1] == 'z') { > + uleb128_t augSize = get_uleb128(&ptr, end); > + > + ptr += augSize; > + } > if (ptr > end > || retAddrReg >= ARRAY_SIZE(reg_info) > || REG_INVALID(retAddrReg) Jakub - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/