Jack Howarth
2009-Sep-18 17:43 UTC
[LLVMdev] OT: intel darwin losing primary target status
On Fri, Sep 18, 2009 at 10:28:15AM -0700, Nick Kledzik wrote:> So, when these test cases are run, is the binary linked against /usr/ > lib/libgcc_s.10.5.dylib? or against some just built libgcc_s.10.5.dylib? > or against some just build libgcc_s.dylib? If either of the latter, then > if you changed the FSF build of libgcc_s for darwin to have the right > magic symbols, then when targeting 10.6, the linker will ignore those > dylibs and record that the symbols should be found in > /usr/lib/libSystem.B.dylib at runtime. >I'll double check but I believe that the testsuite always links the libgcc_s.10.5.dylib built by the FSF gcc build. The problem with the emutls symbols if I recall correctly is that those are not exposed through libgcc_s.10.5 but rather libgcc_s directly. For now, it would be better to ignore the emults issues and focus on what needs to be done to fix the unwinding. I guess you are saying we need to move the unwinders symbols out into a libgcc_ext and use that in the linkage on 10.6 or later so the FSF unwinder is used instead of the system one? Jack
Nick Kledzik
2009-Sep-18 18:13 UTC
[LLVMdev] OT: intel darwin losing primary target status
On Sep 18, 2009, at 10:43 AM, Jack Howarth wrote:> On Fri, Sep 18, 2009 at 10:28:15AM -0700, Nick Kledzik wrote: >> So, when these test cases are run, is the binary linked against /usr/ >> lib/libgcc_s.10.5.dylib? or against some just built libgcc_s. >> 10.5.dylib? >> or against some just build libgcc_s.dylib? If either of the >> latter, then >> if you changed the FSF build of libgcc_s for darwin to have the right >> magic symbols, then when targeting 10.6, the linker will ignore those >> dylibs and record that the symbols should be found in >> /usr/lib/libSystem.B.dylib at runtime. >> > I'll double check but I believe that the testsuite always links the > libgcc_s.10.5.dylib built by the FSF gcc build. The problem with the > emutls symbols if I recall correctly is that those are not exposed > through libgcc_s.10.5 but rather libgcc_s directly. For now, it would > be better to ignore the emults issues and focus on what needs to be > done to fix the unwinding. I guess you are saying we need to move > the unwinders symbols out into a libgcc_ext and use that in the > linkage on 10.6 or later so the FSF unwinder is used instead of > the system one? > JackThe important thing is that only one unwinder is used. The _Unwind_Context data structure is different between the darwin and FSF implementations, so you can't pass it between two different implementations. Since darwin uses two-level namespace and swapping in a new libgcc_s.dylib at runtime is not going to effect the various OS dylibs that are looking for _Unwind_* routines in libSystem.dylib. Even if you managed to get the test suite to run where everything is consistently using the just built libgcc_s.dylib, how will this work for end users of the gcc-4.5+ who want to ship an app built with gcc-4.5+? Their code needs to use the OS unwinder. So it seems to me you should be testing the compiler against the OS unwinder - not against the just built unwinder. Has something changed in the FSF unwinder that clients of gcc will want? -Nick P.S. One minor pet peeve of mine is that the exception handling is well layered (e.g. _cxa_* layer on top the _Unwind_* layer (which on darwin is now built upon the libunwind layer)). Except for one glaring problem. The compiler mostly emits calls to _cxa_* functions, but it makes one call to _Unwind_Resume. Ah!! And those are in different dylibs! If instead the compiler made some call like __cxa_resume() in libstdc++.dylib which turned around and called _Unwind_Resume() in libgcc_s.dylib, then much of the problem above would never happen.
Jack Howarth
2009-Sep-18 18:40 UTC
[LLVMdev] OT: intel darwin losing primary target status
On Fri, Sep 18, 2009 at 11:13:52AM -0700, Nick Kledzik wrote:> > The important thing is that only one unwinder is used. The > _Unwind_Context data structure is different between the darwin and FSF > implementations, so you can't pass it between two different > implementations. Since darwin uses two-level namespace and swapping in > a new libgcc_s.dylib at runtime is not going to effect the various OS > dylibs that are looking for _Unwind_* routines in libSystem.dylib. > > Even if you managed to get the test suite to run where everything is > consistently using the just built libgcc_s.dylib, how will this work for > end users of the gcc-4.5+ who want to ship an app built with gcc-4.5+? > Their code needs to use the OS unwinder. > > So it seems to me you should be testing the compiler against the OS > unwinder - not against the just built unwinder. > > Has something changed in the FSF unwinder that clients of gcc will want? > > -Nick > > P.S. One minor pet peeve of mine is that the exception handling is well > layered (e.g. _cxa_* layer on top the _Unwind_* layer (which on darwin is > now built upon the libunwind layer)). Except for one glaring problem. > The compiler mostly emits calls to _cxa_* functions, but it makes one > call to _Unwind_Resume. Ah!! And those are in different dylibs! If > instead the compiler made some call like __cxa_resume() in > libstdc++.dylib which turned around and called _Unwind_Resume() in > libgcc_s.dylib, then much of the problem above would never happen. >I am not sure if some of these problems were latent and only exposed by the change, but the mass regressions in the g++ and libjava testsuites were triggered by the commit... Author: rth Date: Sat May 30 00:33:46 2009 New Revision: 147995 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=147995 Log: * cfgcleanup.c (try_crossjump_to_edge): Only skip past NOTE_INSN_BASIC_BLOCK. * cfglayout.c (duplicate_insn_chain): Copy epilogue insn marks. Duplicate NOTE_INSN_EPILOGUE_BEG notes. * cfgrtl.c (can_delete_note_p): Allow NOTE_INSN_EPILOGUE_BEG to be deleted. * dwarf2out.c (struct cfa_loc): Change indirect field to bitfield, add in_use field. (add_cfi): Disable check redefining cfa away from drap. (lookup_cfa_1): Add remember argument; handle remember/restore. (lookup_cfa): Pass remember argument. (cfa_remember): New. (compute_barrier_args_size_1): Remove sibcall check. (dwarf2out_frame_debug_def_cfa): New. (dwarf2out_frame_debug_adjust_cfa): New. (dwarf2out_frame_debug_cfa_offset): New. (dwarf2out_frame_debug_cfa_register): New. (dwarf2out_frame_debug_cfa_restore): New. (dwarf2out_frame_debug): Handle REG_CFA_* notes. (dwarf2out_begin_epilogue): New. (dwarf2out_frame_debug_restore_state): New. (dw_cfi_oprnd1_desc): Handle DW_CFA_remember_state, DW_CFA_restore_state. (output_cfi_directive): Likewise. (convert_cfa_to_fb_loc_list): Likewise. (dw_cfi_oprnd1_desc): Handle DW_CFA_restore. * dwarf2out.h: Update. * emit-rtl.c (try_split): Don't split RTX_FRAME_RELATED_P. (copy_insn_1): Early out for null. * final.c (final_scan_insn): Call dwarf2out_begin_epilogue and dwarf2out_frame_debug_restore_state. * function.c (prologue, epilogue, sibcall_epilogue): Remove. (prologue_insn_hash, epilogue_insn_hash): New. (free_after_compilation): Adjust freeing accordingly. (record_insns): Create hash table if needed; push insns into hash instead of array. (maybe_copy_epilogue_insn): New. (contains): Search hash table instead of array. (sibcall_epilogue_contains): Remove. (thread_prologue_and_epilogue_insns): Split eh_return insns and mark them as epilogues. (reposition_prologue_and_epilogue_notes): Rewrite epilogue scanning in terms of basic blocks. * insn-notes.def (CFA_RESTORE_STATE): New. * jump.c (returnjump_p_1): Accept EH_RETURN. (eh_returnjump_p_1, eh_returnjump_p): New. * reg-notes.def (CFA_DEF_CFA, CFA_ADJUST_CFA, CFA_OFFSET, CFA_REGISTER, CFA_RESTORE): New. * rtl.def (EH_RETURN): New. * rtl.h (eh_returnjump_p, maybe_copy_epilogue_insn): Declare. * config/bfin/bfin.md (UNSPEC_VOLATILE_EH_RETURN): Remove. (eh_return_internal): Use eh_return rtx; split w/ epilogue. * config/i386/i386.c (gen_push): Update cfa state. (pro_epilogue_adjust_stack): Add set_cfa argument. When true, add a CFA_ADJUST_CFA note. (ix86_dwarf_handle_frame_unspec): Remove. (ix86_expand_prologue): Update cfa state. (ix86_emit_restore_reg_using_pop): New. (ix86_emit_restore_regs_using_pop): New. (ix86_emit_leave): New. (ix86_emit_restore_regs_using_mov): Add CFA_RESTORE notes. (ix86_expand_epilogue): Add notes for unwinding the epilogue. * config/i386/i386.h (struct machine_cfa_state): New. (ix86_cfa_state): New. * config/i386/i386.md (UNSPEC_EH_RETURN): Remove. (eh_return_internal): Merge from eh_return_<mode>, use eh_return rtx, split w/ epilogue.
Jack Howarth
2009-Sep-18 19:11 UTC
[LLVMdev] OT: intel darwin losing primary target status
On Fri, Sep 18, 2009 at 11:13:52AM -0700, Nick Kledzik wrote:> > > Has something changed in the FSF unwinder that clients of gcc will want? > > -Nick > >Nick, I've always built FSF gcc as a stock build (which defaults to the FSF libgcc for linking). The last time I can recall seeing anyone build FSF gcc against the system libgcc was related to the thread... http://gcc.gnu.org/ml/gcc/2008-11/msg00280.html I believe this was being done with --with-slibdir='\$\${prefix}/ lib'. Tonight I'll try building like that under SL and see what happens. It is very non-standard though for how everyone builds FSF gcc on darwin. Jack
Jack Howarth
2009-Sep-18 19:33 UTC
[LLVMdev] OT: intel darwin losing primary target status
Nick, So is this basically a depreciation of libgcc for darwin10 and later? I was wondering about that very issue awhile ago (as in what exactly what relationship clang would have to libgcc). If so, perhaps the correct answer is to see if FSF gcc would accept changing the default build for darwin10 and later to not use the FSF libgcc and instead move any additional symbols into a libgcc-ext. Jack