This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
On Wed, Jun 03, 2009 at 08:02:00PM +0200, Ulrich Weigand wrote: > Jakub Jelinek wrote: > > Ok, I'm withdrawing the save_gprs changes (and the change to special case > > %r15 for .cfi_restore). For global regs I'd say .cfi_restore does no harm, > > but could be omitted, but we shouldn't be having .cfi_offset in the prologue > > for them either. > > Hmm, good point. The function might change the value in the global > register; that change will persist once the function returns, it will not > be reverted to the value the register had before the function call; and > therefore the .cfi_offset seems to be actually wrong ... Yeah. Seems the reason why cleanup-9 was hanging for me was that I've been using gcc 4.1.x libgcc_s.so.1, which didn't have http://gcc.gnu.org/ml/gcc-patches/2006-01/msg00617.html fix (that is only in 4.3+), thus DW_CFA_re{member,store}_state was broken. When using 4.4/trunk libgcc_s or after backporting the DW_CFA_re{member,store}_state fix to 4.1 cleanup-9 works, obviously only when %15 is mentioned in DWARF. Attached patch should work and handle also the global regs correctly (tried: register long r8 asm ("%r8"); void bar (void); void bar2 (int, int, int, int); void bar3 (int, int, int, int, int, int, int); long foo (int x, int y) { long a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p; double Q, R, S, T, U, V, W, X, Y, Z; char buf[131077]; asm volatile ("" : "=rm" (a), "=rm" (b), "=rm" (c), "=rm" (d), "=rm" (e), "=rm" (f), "=rm" (g), "=rm" (h), "=rm" (i), "=rm" (j), "=rm" (k), "=rm" (l), "=rm" (m), "=rm" (n), "=rm" (o), "=rm" (p) : "r" (buf)); asm volatile ("# %0 %1 %2 %3 %4 %5 %6 %7 %8 %9" : "=f" (Q), "=f" (R), "=f" (S), "=f" (T), "=f" (U), "=f" (V), "=f" (W), "=f" (X), "=f" (Y), "=f" (Z)); bar (); bar2 (0, 1, 2, 3); bar (); bar3 (0, 1, 2, 3, 4, 5, 6); bar (); bar2 (0, 1, 2, 3); asm volatile ("# %0 %1 %2 %3 %4 %5 %6 %7 %8 %9" : : "f" (Q), "f" (R), "f" (S), "f" (T), "f" (U), "f" (V), "f" (W), "f" (X), "f" (Y), "f" (Z)); return a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p; } ). > The problem is that we need the literal pool (when it is intermixed > with code) to participate in the shorten_branches () and insn length > computations. That's why we use UNSPEC_VOLATILE insns ... > However, it is of course true that this not code, and therefore does > not require CFI. I'm not sure how to provide that information at > the RTL level -- maybe a new UNSPEC_DATA instead? Or some REG_NOTE? Richard, what is your preference here? Yet another alternative could be special REG_* notes that mark the beginning (and optionally end) of region with "instructions" not needing unwind info. OT, for all architectures IMHO dwarf2out.c should move .cfi_remember_state note from NOTE_INSN_EPILOGUE_BEG down to the first insn in the epilogue that actually has any CFI emitted, that way we'll get rid of an unnecessary DW_CFA_advance_loc*. Of course DW_CFA_remember_state has to be the first op emitted after that instruction in that case. Jakub
Attachment:
Y326
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |