Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
devel:gcc
gcc33
ia64-unwind.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File ia64-unwind.patch of Package gcc33
2005-01-10 David Mosberger <davidm@hpl.hp.com> PR target/18987 * config/ia64/ia64.c (process_set): For alloc insn, only call process_epilogue is !frame_pointer_needed. 2004-10-27 David Mosberger <davidm@hpl.hp.com> James E Wilson <wilson@specifixinc.com> PR target/13158 * config/ia64/ia64.c (ia64_expand_epilogue): Set RTX_FRAME_RELATED_P on sibcall alloc instruction. (process_set): Handle sibcall alloc instruction. 2003-04-01 David Mosberger <davidm@hpl.hp.com> * config/ia64/crtend.asm: (__do_global_ctors_aux): Add unwind directives. * config/ia64/crtbegin.asm: (__do_global_dtors_aux): Add unwind directives. (__do_jv_register_classes): Ditto. Index: gcc-3.3.3/gcc/config/ia64/crtbegin.asm =================================================================== --- gcc-3.3.3.orig/gcc/config/ia64/crtbegin.asm 2003-01-25 18:28:42.000000000 +0100 +++ gcc-3.3.3/gcc/config/ia64/crtbegin.asm 2009-11-20 13:05:21.000000000 +0100 @@ -48,8 +48,9 @@ __dso_handle: data8 __dso_handle# #else .section .bss + .align 8 __dso_handle: - data8 0 + .skip 8 #endif .hidden __dso_handle# @@ -116,11 +117,15 @@ __dso_handle: .align 16 .proc __do_global_dtors_aux# __do_global_dtors_aux: + .prologue #ifndef SHARED { .mii + .save ar.pfs, r35 alloc loc3 = ar.pfs, 0, 4, 1, 0 addl loc0 = @gprel(dtor_ptr#), gp + .save rp, loc1 mov loc1 = b0 + .body } { .mib mov loc2 = gp @@ -133,6 +138,7 @@ __do_global_dtors_aux: __cxa_finalize(__dso_handle) */ { .mii + .save ar.pfs, r35 alloc loc3 = ar.pfs, 0, 4, 1, 0 addl loc0 = @gprel(dtor_ptr#), gp addl r16 = @ltoff(@fptr(__cxa_finalize#)), gp @@ -148,16 +154,17 @@ __do_global_dtors_aux: { .mmi ld8 out0 = [out0] (p7) ld8 r18 = [r16], 8 + .save rp, loc1 mov loc1 = b0 ;; } - { .mfi + { .mmi mov loc2 = gp +(p7) ld8 gp = [r16] (p7) mov b6 = r18 } { .mfb -(p7) ld8 gp = [r16] (p7) br.call.sptk.many b0 = b6 } { .mfb @@ -189,15 +196,14 @@ __do_global_dtors_aux: adds r15 = 8, r15 ;; } - { .mmi + { .mii ld8 r16 = [r16] - mov gp = loc2 mov b0 = loc1 + mov ar.pfs = loc3 ;; } { .mib cmp.ne p6, p0 = r0, r16 - mov ar.pfs = loc3 (p6) br.cond.sptk.few 0b } { .bbb @@ -209,7 +215,9 @@ __do_global_dtors_aux: .align 16 .proc __do_jv_register_classes# __do_jv_register_classes: + .prologue { .mlx + .save ar.pfs, r34 alloc loc2 = ar.pfs, 0, 3, 1, 0 movl out0 = @gprel(__JCR_LIST__) ;; @@ -232,7 +240,9 @@ __do_jv_register_classes: } { .mii ld8 r15 = [r14], 8 + .save rp, loc0 mov loc0 = b0 + .body mov loc1 = gp ;; } Index: gcc-3.3.3/gcc/config/ia64/crtend.asm =================================================================== --- gcc-3.3.3.orig/gcc/config/ia64/crtend.asm 2003-01-25 18:28:42.000000000 +0100 +++ gcc-3.3.3/gcc/config/ia64/crtend.asm 2009-11-20 13:05:21.000000000 +0100 @@ -74,18 +74,22 @@ __JCR_END__: #endif .proc __do_global_ctors_aux# __do_global_ctors_aux: + .prologue /* for (loc0 = __CTOR_END__-1; *p != -1; --p) (*p) (); */ { .mlx + .save ar.pfs, r36 alloc loc4 = ar.pfs, 0, 5, 0, 0 movl loc0 = @gprel(__CTOR_END__# - 8) ;; } { .mmi add loc0 = loc0, gp + .save rp, loc1 mov loc1 = b0 + .body ;; } { Index: gcc-3.3.3/gcc/config/ia64/ia64.c =================================================================== --- gcc-3.3.3.orig/gcc/config/ia64/ia64.c 2009-11-20 13:04:57.000000000 +0100 +++ gcc-3.3.3/gcc/config/ia64/ia64.c 2009-11-20 13:05:21.000000000 +0100 @@ -2885,10 +2885,13 @@ ia64_expand_epilogue (sibcall_p) preserve those input registers used as arguments to the sibling call. It is unclear how to compute that number here. */ if (current_frame_info.n_input_regs != 0) - emit_insn (gen_alloc (gen_rtx_REG (DImode, fp), - GEN_INT (0), GEN_INT (0), - GEN_INT (current_frame_info.n_input_regs), - GEN_INT (0))); + { + rtx n_inputs = GEN_INT (current_frame_info.n_input_regs); + insn = emit_insn (gen_alloc (gen_rtx_REG (DImode, fp), + GEN_INT (0), GEN_INT (0), + n_inputs, GEN_INT (0))); + RTX_FRAME_RELATED_P (insn) = 1; + } } } @@ -7446,13 +7449,24 @@ process_set (asm_out_file, pat) { dest_regno = REGNO (dest); - /* If this isn't the final destination for ar.pfs, the alloc - shouldn't have been marked frame related. */ - if (dest_regno != current_frame_info.reg_save_ar_pfs) - abort (); - - fprintf (asm_out_file, "\t.save ar.pfs, r%d\n", - ia64_dbx_register_number (dest_regno)); + /* If this is the final destination for ar.pfs, then this must + be the alloc in the prologue. */ + if (dest_regno == current_frame_info.reg_save_ar_pfs) + fprintf (asm_out_file, "\t.save ar.pfs, r%d\n", + ia64_dbx_register_number (dest_regno)); + else + { + /* This must be an alloc before a sibcall. We must drop the + old frame info. The easiest way to drop the old frame + info is to ensure we had a ".restore sp" directive + followed by a new prologue. If the procedure doesn't + have a memory-stack frame, we'll issue a dummy ".restore + sp" now. */ + if (current_frame_info.total_size == 0 && !frame_pointer_needed) + /* if haven't done process_epilogue() yet, do it now */ + process_epilogue (); + fprintf (asm_out_file, "\t.prologue\n"); + } return 1; }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor