Richard Sandiford <rdsandif...@googlemail.com> writes:
> "Maciej W. Rozycki" <ma...@codesourcery.com> writes:
>>> If there's still some concern that __mips16_rdhwr might not have
>>> the right ABI, then maybe we should simply emit a link-once function
>>> in each object that needs it.  We could then switch to another function
>>> (and another API) without having to keep the old one in libgcc.a for
>>> compatibility.  It would also avoid the -shared-libgcc thing.
>>> 
>>> Admittedly that's just an off-the-top-of-my-head idea. :-)
>>> What do you think?
>>
>>  Actually I had that idea of a link-once function too, but it turned out 
>> quite complicated to do without rewriting some generic parts of GCC as it 
>> is currently not prepared to emit link-once functions outside C++ 
>> compilations.  It's been a while and I did lots of other stuff meanwhile, 
>> so please excuse me if I got anything wrong here.
>
> Hmm, OK, I wouldn't have expected that.  But if you've tried making
> __mips16_rdhwr link-once and had a bad experience with it, then yeah,
> let's go with the hidden libgcc function.  It's just a shame that we're
> having to force static linking of libgcc for this one case.
>
> I'll take the relevant parts from Chung-Lin's patch and test them
> over the weekend.

Here's what I committed after testing on mips64-linux-gnu, both with
and without PLTs.

Richard


libgcc/
2012-02-05  Chung-Lin Tang  <clt...@codesourcery.com>

        * config.host (mips64*-*-linux*, mipsisa64*-*-linux*, mips*-*-linux*):
        Add t-slibgcc-libgcc to tmake_file.
        * config/mips/libgcc-mips16.ver: Revert previous patch.
        * config/mips/mips16.S (__mips16_rdhwr): Hide.

Index: libgcc/config.host
===================================================================
--- libgcc/config.host  2012-02-04 10:27:18.000000000 +0000
+++ libgcc/config.host  2012-02-04 11:34:03.000000000 +0000
@@ -746,12 +746,12 @@ mips*-*-netbsd*)                  # NetBSD/mips, either
        ;;
 mips64*-*-linux* | mipsisa64*-*-linux*)
        extra_parts="$extra_parts crtfastmath.o"
-       tmake_file="${tmake_file} t-crtfm mips/t-mips16 mips/t-tpbit"
+       tmake_file="${tmake_file} t-crtfm mips/t-mips16 mips/t-tpbit 
t-slibgcc-libgcc"
        md_unwind_header=mips/linux-unwind.h
        ;;
 mips*-*-linux*)                                # Linux MIPS, either endian.
        extra_parts="$extra_parts crtfastmath.o"
-       tmake_file="${tmake_file} t-crtfm mips/t-mips16"
+       tmake_file="${tmake_file} t-crtfm mips/t-mips16 t-slibgcc-libgcc"
        md_unwind_header=mips/linux-unwind.h
        ;;
 mips*-*-openbsd*)
Index: libgcc/config/mips/libgcc-mips16.ver
===================================================================
--- libgcc/config/mips/libgcc-mips16.ver        2012-02-04 11:12:01.000000000 
+0000
+++ libgcc/config/mips/libgcc-mips16.ver        2012-02-04 11:34:03.000000000 
+0000
@@ -84,7 +84,3 @@ GCC_4.4.0 {
   __mips16_call_stub_dc_9
   __mips16_call_stub_dc_10
 }
-
-GCC_4.7.0 {
-  __mips16_rdhwr
-}
Index: libgcc/config/mips/mips16.S
===================================================================
--- libgcc/config/mips/mips16.S 2012-02-04 10:27:18.000000000 +0000
+++ libgcc/config/mips/mips16.S 2012-02-04 11:34:03.000000000 +0000
@@ -712,6 +712,9 @@ CALL_STUB_RET (__mips16_call_stub_dc_10,
 
 #ifdef L_m16rdhwr
 STARTFN (__mips16_rdhwr)
+       /* Forced always hidden, because the PLT resolver function would
+          not preserve all necessary registers.  */
+       .hidden __mips16_rdhwr
        .set    push
        .set    mips32r2
        .set    noreorder

Reply via email to