Hi Richard, None, is there any? All the one I could find in the big switch selecting tm_files and tmake_files in gcc/config.gcc are including arm/elf.h. I tried to build for arm-wince-pe but got: "Configuration arm-wince-pe not supported". However note that to guarantee correct results the only requirement is to support global symbol overriding weak symbol correctly and I see .weak usage in many other libgcc backend (eg. i386). The "take the first definition resolving an undefined reference and ignore the one in following object of a static library" is only to benefit from the size optimization.
Best regards, Thomas On Fri, 7 Dec 2018 at 14:14, Richard Earnshaw (lists) <richard.earns...@arm.com> wrote: > > On 19/11/2018 09:57, Thomas Preudhomme wrote: > > Softfloat single precision and double precision floating-point > > multiplication routines in libgcc share some code with the > > floating-point division of their corresponding precision. As the code > > is structured now, this leads to *all* division code being pulled in an > > executable in softfloat mode even if only multiplication is > > performed. > > > > This patch create some new LIB1ASMFUNCS macros to also build files with > > just the multiplication and shared code as weak symbols. By putting > > these earlier in the static library, they can then be picked up when > > only multiplication is used and they are overriden by the global > > definition in the existing file containing both multiplication and > > division code when division is needed. > > > > The patch also removes changes made to the FUNC_START and ARM_FUNC_START > > macros in r218124 since the intent was to put multiplication and > > division code into their own section in a later patch to achieve the > > same size optimization. That approach relied on specific section layout > > to ensure multiplication and division were not too far from the shared > > bit of code in order to the branches to be within range. Due to lack of > > guarantee regarding section layout, in particular with all the > > possibility of linker scripts, this approach was chosen instead. This > > patch keeps the two testcases that were posted by Tony Wang (an Arm > > employee at the time) on the mailing list to implement this approach > > and adds a new one, hence the attribution. > > > > ChangeLog entries are as follows: > > > > *** gcc/ChangeLog *** > > > > 2018-11-14 Thomas Preud'homme <thomas.preudho...@linaro.org> > > > > * config/arm/elf.h: Update comment about condition that need to > > match with libgcc/config/arm/lib1funcs.S to also include > > libgcc/config/arm/t-arm. > > * doc/sourcebuild.texi (output-exists, output-exists-not): Rename > > subsubsection these directives are in to "Check for output files". > > Move scan-symbol to that section and add to it new scan-symbol-not > > directive. > > > > *** gcc/testsuite/ChangeLog *** > > > > 2018-11-16 Tony Wang <tony.w...@arm.com> > > Thomas Preud'homme <thomas.preudho...@linaro.org> > > > > * lib/lto.exp (lto-execute): Define output_file and testname_with_flags > > to same value as execname. > > (scan-symbol): Move and rename to ... > > * lib/gcc-dg.exp (scan-symbol-common): This. Adapt into a > > helper function returning true or false if a symbol is present. > > (scan-symbol): New procedure. > > (scan-symbol-not): Likewise. > > * gcc.target/arm/size-optimization-ieee-1.c: New testcase. > > * gcc.target/arm/size-optimization-ieee-2.c: Likewise. > > * gcc.target/arm/size-optimization-ieee-3.c: Likewise. > > > > *** libgcc/ChangeLog *** > > > > 2018-11-16 Thomas Preud'homme <thomas.preudho...@linaro.org> > > > > * /config/arm/lib1funcs.S (FUNC_START): Remove unused sp_section > > parameter and corresponding code. > > (ARM_FUNC_START): Likewise in both definitions. > > Also update footer comment about condition that need to match with > > gcc/config/arm/elf.h to also include libgcc/config/arm/t-arm. > > * config/arm/ieee754-df.S (muldf3): Also build it if L_arm_muldf3 is > > defined. Weakly define it in this case. > > * config/arm/ieee754-sf.S (mulsf3): Likewise with L_arm_mulsf3. > > * config/arm/t-elf (LIB1ASMFUNCS): Build _arm_muldf3.o and > > _arm_mulsf3.o before muldiv versions if targeting Thumb-1 only. Add > > comment to keep condition in sync with the one in > > libgcc/config/arm/lib1funcs.S and gcc/config/arm/elf.h. > > > > Testing: Bootstrapped on arm-linux-gnueabihf (Arm & Thumb-2) and > > testsuite shows no > > regression. Also built an arm-none-eabi cross compiler targeting > > soft-float which also shows no regression. In particular newly added > > tests and gcc.dg/lto/20081212-1 test pass. > > Which non-elf targets have you tested? > > R. > > > > > Is this ok for stage3? > > > > Best regards, > > > > Thomas > > > > > > Optimize-size-fpmul_without_div.patch > > > > From 8740697791f99b7175e188f049663883c39e51b0 Mon Sep 17 00:00:00 2001 > > From: Thomas Preud'homme <thomas.preudho...@linaro.org> > > Date: Fri, 26 Oct 2018 16:21:09 +0100 > > Subject: [PATCH] [PATCH, libgcc/ARM] Optimize executable size when using > > softfloat fmul/dmul > > > > Softfloat single precision and double precision floating-point > > multiplication routines in libgcc share some code with the > > floating-point division of their corresponding precision. As the code > > is structured now, this leads to *all* division code being pulled in an > > executable in softfloat mode even if only multiplication is > > performed. > > > > This patch create some new LIB1ASMFUNCS macros to also build files with > > just the multiplication and shared code as weak symbols. By putting > > these earlier in the static library, they can then be picked up when > > only multiplication is used and they are overriden by the global > > definition in the existing file containing both multiplication and > > division code when division is needed. > > > > The patch also removes changes made to the FUNC_START and ARM_FUNC_START > > macros in r218124 since the intent was to put multiplication and > > division code into their own section in a later patch to achieve the > > same size optimization. That approach relied on specific section layout > > to ensure multiplication and division were not too far from the shared > > bit of code in order to the branches to be within range. Due to lack of > > guarantee regarding section layout, in particular with all the > > possibility of linker scripts, this approach was chosen instead. This > > patch keeps the two testcases that were posted by Tony Wang (an Arm > > employee at the time) on the mailing list to implement this approach > > and adds a new one, hence the attribution. > > > > ChangeLog entries are as follows: > > > > *** gcc/ChangeLog *** > > > > 2018-11-14 Thomas Preud'homme <thomas.preudho...@linaro.org> > > > > * config/arm/elf.h: Update comment about condition that need to > > match with libgcc/config/arm/lib1funcs.S to also include > > libgcc/config/arm/t-arm. > > * doc/sourcebuild.texi (output-exists, output-exists-not): Rename > > subsubsection these directives are in to "Check for output files". > > Move scan-symbol to that section and add to it new scan-symbol-not > > directive. > > > > *** gcc/testsuite/ChangeLog *** > > > > 2018-11-16 Tony Wang <tony.w...@arm.com> > > Thomas Preud'homme <thomas.preudho...@linaro.org> > > > > * lib/lto.exp (lto-execute): Define output_file and > > testname_with_flags > > to same value as execname. > > (scan-symbol): Move and rename to ... > > * lib/gcc-dg.exp (scan-symbol-common): This. Adapt into a > > helper function returning true or false if a symbol is present. > > (scan-symbol): New procedure. > > (scan-symbol-not): Likewise. > > * gcc.target/arm/size-optimization-ieee-1.c: New testcase. > > * gcc.target/arm/size-optimization-ieee-2.c: Likewise. > > * gcc.target/arm/size-optimization-ieee-3.c: Likewise. > > > > *** libgcc/ChangeLog *** > > > > 2018-11-16 Thomas Preud'homme <thomas.preudho...@linaro.org> > > > > * /config/arm/lib1funcs.S (FUNC_START): Remove unused sp_section > > parameter and corresponding code. > > (ARM_FUNC_START): Likewise in both definitions. > > Also update footer comment about condition that need to match with > > gcc/config/arm/elf.h to also include libgcc/config/arm/t-arm. > > * config/arm/ieee754-df.S (muldf3): Also build it if L_arm_muldf3 is > > defined. Weakly define it in this case. > > * config/arm/ieee754-sf.S (mulsf3): Likewise with L_arm_mulsf3. > > * config/arm/t-elf (LIB1ASMFUNCS): Build _arm_muldf3.o and > > _arm_mulsf3.o before muldiv versions if targeting Thumb-1 only. Add > > comment to keep condition in sync with the one in > > libgcc/config/arm/lib1funcs.S and gcc/config/arm/elf.h. > > > > Testing: Bootstrapped on arm-linux-gnueabihf and testsuite shows no > > regression. Also built an arm-none-eabi cross compiler targeting > > soft-float which also shows no regression. In particular newly added > > tests and gcc.dg/lto/20081212-1 test pass. > > > > Is this ok for stage3? > > > > Best regards, > > > > Thomas > > --- > > gcc/config/arm/elf.h | 2 +- > > gcc/doc/sourcebuild.texi | 9 +-- > > .../gcc.target/arm/size-optimization-ieee-1.c | 33 ++++++++ > > .../gcc.target/arm/size-optimization-ieee-2.c | 31 ++++++++ > > .../gcc.target/arm/size-optimization-ieee-3.c | 33 ++++++++ > > gcc/testsuite/lib/gcc-dg.exp | 76 +++++++++++++++++++ > > gcc/testsuite/lib/lto.exp | 63 +++------------ > > libgcc/config/arm/ieee754-df.S | 17 ++++- > > libgcc/config/arm/ieee754-sf.S | 16 +++- > > libgcc/config/arm/lib1funcs.S | 19 ++--- > > libgcc/config/arm/t-elf | 16 ++++ > > 11 files changed, 243 insertions(+), 72 deletions(-) > > create mode 100644 gcc/testsuite/gcc.target/arm/size-optimization-ieee-1.c > > create mode 100644 gcc/testsuite/gcc.target/arm/size-optimization-ieee-2.c > > create mode 100644 gcc/testsuite/gcc.target/arm/size-optimization-ieee-3.c > > > > diff --git a/gcc/config/arm/elf.h b/gcc/config/arm/elf.h > > index ad3651ba841..1e00e99afc6 100644 > > --- a/gcc/config/arm/elf.h > > +++ b/gcc/config/arm/elf.h > > @@ -137,7 +137,7 @@ > > > > /* Horrible hack: We want to prevent some libgcc routines being included > > for some multilibs. The condition should match the one in > > - libgcc/config/arm/lib1funcs.S. */ > > + libgcc/config/arm/lib1funcs.S and libgcc/config/arm/t-elf. */ > > #if __ARM_ARCH_ISA_ARM || __ARM_ARCH_ISA_THUMB != 1 > > #undef L_fixdfsi > > #undef L_fixunsdfsi > > diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi > > index 89157079ffb..9bf59b81d87 100644 > > --- a/gcc/doc/sourcebuild.texi > > +++ b/gcc/doc/sourcebuild.texi > > @@ -2638,7 +2638,7 @@ Passes if @var{regex} does not match demangled text > > in the dump file with > > suffix @var{suffix}. > > @end table > > > > -@subsubsection Verify that an output files exists or not > > +@subsubsection Check for output files > > > > @table @code > > @item output-exists [@{ target/xfail @var{selector} @}] > > @@ -2646,13 +2646,12 @@ Passes if compiler output file exists. > > > > @item output-exists-not [@{ target/xfail @var{selector} @}] > > Passes if compiler output file does not exist. > > -@end table > > - > > -@subsubsection Check for LTO tests > > > > -@table @code > > @item scan-symbol @var{regexp} [@{ target/xfail @var{selector} @}] > > Passes if the pattern is present in the final executable. > > + > > +@item scan-symbol-not @var{regexp} [@{ target/xfail @var{selector} @}] > > +Passes if the pattern is absent from the final executable. > > @end table > > > > @subsubsection Checks for @command{gcov} tests > > diff --git a/gcc/testsuite/gcc.target/arm/size-optimization-ieee-1.c > > b/gcc/testsuite/gcc.target/arm/size-optimization-ieee-1.c > > new file mode 100644 > > index 00000000000..34090f20fec > > --- /dev/null > > +++ b/gcc/testsuite/gcc.target/arm/size-optimization-ieee-1.c > > @@ -0,0 +1,33 @@ > > +/* { dg-do link { target arm_soft_ok } } */ > > +/* { dg-options "-mfloat-abi=soft" } */ > > + > > +int > > +foo (void) > > +{ > > + volatile float a; > > + volatile float b; > > + volatile float c = a * b; > > + return 0; > > +} > > + > > +int > > +bar (void) > > +{ > > + volatile double a; > > + volatile double b; > > + volatile double c = a * b; > > + return 0; > > +} > > + > > +int > > +main (void) > > +{ > > + foo (); > > + bar (); > > + return 0; > > +} > > + > > +/* { dg-final { scan-symbol "__aeabi_fmul" } } */ > > +/* { dg-final { scan-symbol "__aeabi_dmul" } } */ > > +/* { dg-final { scan-symbol-not "__aeabi_fdiv" } } */ > > +/* { dg-final { scan-symbol-not "__aeabi_ddiv" } } */ > > diff --git a/gcc/testsuite/gcc.target/arm/size-optimization-ieee-2.c > > b/gcc/testsuite/gcc.target/arm/size-optimization-ieee-2.c > > new file mode 100644 > > index 00000000000..75337894a9c > > --- /dev/null > > +++ b/gcc/testsuite/gcc.target/arm/size-optimization-ieee-2.c > > @@ -0,0 +1,31 @@ > > +/* { dg-do link { target arm_soft_ok } } */ > > +/* { dg-options "-mfloat-abi=soft" } */ > > + > > +int > > +foo (void) > > +{ > > + volatile float a; > > + volatile float b; > > + volatile float c = a / b; > > + return 0; > > +} > > + > > +int > > +bar (void) > > +{ > > + volatile double a; > > + volatile double b; > > + volatile double c = a / b; > > + return 0; > > +} > > + > > +int > > +main (void) > > +{ > > + foo (); > > + bar (); > > + return 0; > > +} > > + > > +/* { dg-final { scan-symbol "__aeabi_fdiv" } } */ > > +/* { dg-final { scan-symbol "__aeabi_ddiv" } } */ > > diff --git a/gcc/testsuite/gcc.target/arm/size-optimization-ieee-3.c > > b/gcc/testsuite/gcc.target/arm/size-optimization-ieee-3.c > > new file mode 100644 > > index 00000000000..63c92b3bbb7 > > --- /dev/null > > +++ b/gcc/testsuite/gcc.target/arm/size-optimization-ieee-3.c > > @@ -0,0 +1,33 @@ > > +/* { dg-do link { target arm_soft_ok } } */ > > +/* { dg-options "-mfloat-abi=soft" } */ > > + > > +int > > +foo (void) > > +{ > > + volatile float a; > > + volatile float b; > > + volatile float c = a * b + a / b; > > + return 0; > > +} > > + > > +int > > +bar (void) > > +{ > > + volatile double a; > > + volatile double b; > > + volatile double c = a * b + a / b; > > + return 0; > > +} > > + > > +int > > +main (void) > > +{ > > + foo (); > > + bar (); > > + return 0; > > +} > > + > > +/* { dg-final { scan-symbol "__aeabi_fmul" } } */ > > +/* { dg-final { scan-symbol "__aeabi_dmul" } } */ > > +/* { dg-final { scan-symbol "__aeabi_fdiv" } } */ > > +/* { dg-final { scan-symbol "__aeabi_ddiv" } } */ > > diff --git a/gcc/testsuite/lib/gcc-dg.exp b/gcc/testsuite/lib/gcc-dg.exp > > index c33a50c0b13..0472b63f94c 100644 > > --- a/gcc/testsuite/lib/gcc-dg.exp > > +++ b/gcc/testsuite/lib/gcc-dg.exp > > @@ -1236,5 +1236,81 @@ proc gdb-exists { args } { > > return 0; > > } > > > > +# Helper function for scan-symbol and scan-symbol-not. It scans a symbol in > > +# the final executable and return 1 if present, otherwise fail. > > +# > > +# Argument 0 is the regexp to match. > > +# Argument 1 handles expected failures and the like > > +proc scan-symbol-common { scan_directive args } { > > + global nm > > + global base_dir > > + > > + # Access variable from gcc-dg-test-1 or lto-execute. > > + upvar 3 output_file output_file > > + > > + if { [llength $args] >= 2 } { > > + switch [dg-process-target [lindex $args 1]] { > > + "S" { } > > + "N" { return } > > + "F" { setup_xfail "*-*-*" } > > + "P" { } > > + } > > + } > > + > > + # Find nm like we find g++ in g++.exp. > > + if ![info exists nm] { > > + set nm [findfile $base_dir/../../../binutils/nm \ > > + $base_dir/../../../binutils/nm \ > > + [findfile $base_dir/../../nm $base_dir/../../nm \ > > + [findfile $base_dir/nm $base_dir/nm \ > > + [transform nm]]]] > > + verbose -log "nm is $nm" > > + } > > + > > + set output_file "[glob -nocomplain $output_file]" > > + if { $output_file == "" } { > > + fail "$scan_directive $args: output file does not exist" > > + return > > + } > > + > > + set fd [open "| $nm $output_file" r] > > + set text [read $fd] > > + close $fd > > + > > + if [regexp -- [lindex $args 0] $text] { > > + return 1 > > + } else { > > + return 0 > > + } > > +} > > + > > +# Utility for scanning a symbol in the final executable, invoked via > > dg-final. > > +# Call pass if pattern is present, otherwise fail. > > +# > > +# Argument 0 is the regexp to match. > > +# Argument 1 handles expected failures and the like > > +proc scan-symbol { args } { > > + set testcase [testname-for-summary] > > + if { [scan-symbol-common "scan-symbol" $args]} { > > + pass "$testcase scan-symbol $args" > > + } else { > > + fail "$testcase scan-symbol $args" > > + } > > +} > > + > > +# Utility for scanning a symbol in the final executable, invoked via > > dg-final. > > +# Call pass if pattern is absent, otherwise fail. > > +# > > +# Argument 0 is the regexp to match. > > +# Argument 1 handles expected failures and the like > > +proc scan-symbol-not { args } { > > + set testcase [testname-for-summary] > > + if { [scan-symbol-common "scan-symbol-not" $args]} { > > + fail "$testcase scan-symbol-not $args" > > + } else { > > + pass "$testcase scan-symbol-not $args" > > + } > > +} > > + > > set additional_prunes "" > > set dg_runtest_extra_prunes "" > > diff --git a/gcc/testsuite/lib/lto.exp b/gcc/testsuite/lib/lto.exp > > index 58a84aa1936..c2c35698827 100644 > > --- a/gcc/testsuite/lib/lto.exp > > +++ b/gcc/testsuite/lib/lto.exp > > @@ -712,6 +712,17 @@ proc lto-execute { src1 sid } { > > > > # There's a unique name for each executable we generate. > > set execname "${execbase}-${count}1.exe" > > + > > + # The LTO tests don't use dg-test, so testname_with_flags and > > + # output_file need to be defined explicitly for each file. > > scan-symbol > > + # directives rely on both of these to be defined to find the symbol to > > + # scan and for the text to print in the PASS/FAIL since they can also > > + # be called from dg-test. testname_with_flags is also used via > > + # testname-for-summary when calling into generic function below to > > + # clean temporary files. > > + set output_file $execname > > + set testname_with_flags $execname > > + > > incr count > > > > file_on_host delete $execname > > @@ -774,11 +785,7 @@ proc lto-execute { src1 sid } { > > } > > } > > > > - # Clean up after -save-temps. The LTO tests don't use dg-test, so > > - # testname-for-summary needs to be defined explicitly for each > > - # file that needs to be removed. > > - set testname_with_flags $execname > > - > > + # Clean up after -save-temps. > > eval "cleanup-saved-temps" > > > > for {set i 0} {$i < $num_srcs} {incr i} { > > @@ -801,52 +808,6 @@ proc lto-execute { src1 sid } { > > } > > } > > > > -# Utility for scanning a symbol in the final executable, invoked via > > dg-final. > > -# Call pass if pattern is present, otherwise fail. > > -# > > -# Argument 0 is the regexp to match. > > -# Argument 1 handles expected failures and the like > > -proc scan-symbol { args } { > > - global nm > > - global base_dir > > - upvar 2 execname execname > > - > > - if { [llength $args] >= 2 } { > > - switch [dg-process-target [lindex $args 1]] { > > - "S" { } > > - "N" { return } > > - "F" { setup_xfail "*-*-*" } > > - "P" { } > > - } > > - } > > - > > - # Find nm like we find g++ in g++.exp. > > - if ![info exists nm] { > > - set nm [findfile $base_dir/../../../binutils/nm \ > > - $base_dir/../../../binutils/nm \ > > - [findfile $base_dir/../../nm $base_dir/../../nm \ > > - [findfile $base_dir/nm $base_dir/nm \ > > - [transform nm]]]] > > - verbose -log "nm is $nm" > > - } > > - > > - set output_file "[glob -nocomplain $execname]" > > - if { $output_file == "" } { > > - fail "scan-symbol $args: dump file does not exist" > > - return > > - } > > - > > - set fd [open "| $nm $output_file" r] > > - set text [read $fd] > > - close $fd > > - > > - if [regexp -- [lindex $args 0] $text] { > > - pass "scan-symbol $args" > > - } else { > > - fail "scan-symbol $args" > > - } > > -} > > - > > # Call pass if object readelf is ok, otherwise fail. > > # example: /* { dg-final { object-readelf Tag_ABI_enum_size int} } */ > > proc object-readelf { args } { > > diff --git a/libgcc/config/arm/ieee754-df.S b/libgcc/config/arm/ieee754-df.S > > index 480e33da31f..9f2ae9ed698 100644 > > --- a/libgcc/config/arm/ieee754-df.S > > +++ b/libgcc/config/arm/ieee754-df.S > > @@ -617,7 +617,18 @@ ARM_FUNC_ALIAS aeabi_l2d floatdidf > > > > #endif /* L_addsubdf3 */ > > > > -#ifdef L_arm_muldivdf3 > > +#if defined(L_arm_muldf3) || defined(L_arm_muldivdf3) > > + > > +@ Define multiplication as weak in _arm_muldf3.o so that it can be > > overriden > > +@ by the global definition in _arm_muldivdf3.o. This allows a program only > > +@ using multiplication to take the weak definition which does not contain > > the > > +@ division code. Programs using only division or both division and > > +@ multiplication will pull _arm_muldivdf3.o from which both the > > multiplication > > +@ and division are taken thanks to the override. > > +#ifdef L_arm_muldf3 > > +WEAK muldf3 > > +WEAK aeabi_dmul > > +#endif > > > > ARM_FUNC_START muldf3 > > ARM_FUNC_ALIAS aeabi_dmul muldf3 > > @@ -719,6 +730,7 @@ LSYM(Lml_1): > > orr xh, xh, #0x00100000 > > mov lr, #0 > > subs r4, r4, #1 > > + > > LSYM(Lml_u): > > @ Overflow? > > bgt LSYM(Lml_o) > > @@ -870,6 +882,8 @@ LSYM(Lml_n): > > FUNC_END aeabi_dmul > > FUNC_END muldf3 > > > > +#ifdef L_arm_muldivdf3 > > + > > ARM_FUNC_START divdf3 > > ARM_FUNC_ALIAS aeabi_ddiv divdf3 > > CFI_START_FUNCTION > > @@ -1067,6 +1081,7 @@ LSYM(Ldv_s): > > FUNC_END divdf3 > > > > #endif /* L_muldivdf3 */ > > +#endif /* L_arm_muldf3 || L_arm_muldivdf3 */ > > > > #ifdef L_arm_cmpdf2 > > > > diff --git a/libgcc/config/arm/ieee754-sf.S b/libgcc/config/arm/ieee754-sf.S > > index 28e0d793281..0b4d1ab377d 100644 > > --- a/libgcc/config/arm/ieee754-sf.S > > +++ b/libgcc/config/arm/ieee754-sf.S > > @@ -428,7 +428,18 @@ ARM_FUNC_ALIAS aeabi_l2f floatdisf > > > > #endif /* L_addsubsf3 */ > > > > -#ifdef L_arm_muldivsf3 > > +#if defined(L_arm_mulsf3) || defined(L_arm_muldivsf3) > > + > > +@ Define multiplication as weak in _arm_mulsf3.o so that it can be > > overriden > > +@ by the global definition in _arm_muldivsf3.o. This allows a program only > > +@ using multiplication to take the weak definition which does not contain > > the > > +@ division code. Programs using only division or both division and > > +@ multiplication will pull _arm_muldivsf3.o from which both the > > multiplication > > +@ and division are taken thanks to the override. > > +#ifdef L_arm_mulsf3 > > +WEAK mulsf3 > > +WEAK aeabi_fmul > > +#endif > > > > ARM_FUNC_START mulsf3 > > ARM_FUNC_ALIAS aeabi_fmul mulsf3 > > @@ -613,6 +624,8 @@ LSYM(Lml_n): > > FUNC_END aeabi_fmul > > FUNC_END mulsf3 > > > > +#ifdef L_arm_muldivsf3 > > + > > ARM_FUNC_START divsf3 > > ARM_FUNC_ALIAS aeabi_fdiv divsf3 > > CFI_START_FUNCTION > > @@ -756,6 +769,7 @@ LSYM(Ldv_s): > > FUNC_END divsf3 > > > > #endif /* L_muldivsf3 */ > > +#endif /* L_arm_mulsf3 || L_arm_muldivsf3 */ > > > > #ifdef L_arm_cmpsf2 > > > > diff --git a/libgcc/config/arm/lib1funcs.S b/libgcc/config/arm/lib1funcs.S > > index ff06d504a4c..193fb251fdb 100644 > > --- a/libgcc/config/arm/lib1funcs.S > > +++ b/libgcc/config/arm/lib1funcs.S > > @@ -359,12 +359,8 @@ SYM (\name): > > #define THUMB_SYNTAX > > #endif > > > > -.macro FUNC_START name sp_section= > > - .ifc \sp_section, function_section > > - .section .text.__\name,"ax",%progbits > > - .else > > +.macro FUNC_START name > > .text > > - .endif > > .globl SYM (__\name) > > TYPE (__\name) > > .align 0 > > @@ -390,8 +386,8 @@ SYM (\name): > > #if defined(__thumb2__) > > > > /* For Thumb-2 we build everything in thumb mode. */ > > -.macro ARM_FUNC_START name sp_section= > > - FUNC_START \name \sp_section > > +.macro ARM_FUNC_START name > > + FUNC_START \name > > .syntax unified > > .endm > > #define EQUIV .thumb_set > > @@ -422,12 +418,8 @@ _L__\name: > > #ifdef NOT_ISA_TARGET_32BIT > > #define EQUIV .thumb_set > > #else > > -.macro ARM_FUNC_START name sp_section= > > - .ifc \sp_section, function_section > > - .section .text.__\name,"ax",%progbits > > - .else > > +.macro ARM_FUNC_START name > > .text > > - .endif > > .globl SYM (__\name) > > TYPE (__\name) > > .align 0 > > @@ -2169,7 +2161,8 @@ LSYM(Lchange_\register): > > .endm > > > > #ifndef __symbian__ > > -/* The condition here must match the one in gcc/config/arm/elf.h. */ > > +/* The condition here must match the one in gcc/config/arm/elf.h and > > + libgcc/config/arm/t-elf. */ > > #ifndef NOT_ISA_TARGET_32BIT > > #include "ieee754-df.S" > > #include "ieee754-sf.S" > > diff --git a/libgcc/config/arm/t-elf b/libgcc/config/arm/t-elf > > index 9e7a3170f17..9da6cd37054 100644 > > --- a/libgcc/config/arm/t-elf > > +++ b/libgcc/config/arm/t-elf > > @@ -1,3 +1,19 @@ > > +ifeq (,$(findstring __symbian__,$(shell $(gcc_compile_bare) -dM -E - > > </dev/null))) > > + > > +ARM_ISA:=$(findstring __ARM_ARCH_ISA_ARM,$(shell $(gcc_compile_bare) -dM > > -E - </dev/null)) > > +THUMB1_ISA:=$(findstring __ARM_ARCH_ISA_THUMB 1,$(shell > > $(gcc_compile_bare) -dM -E - </dev/null)) > > + > > +# The condition here must match the one in gcc/config/arm/elf.h and > > +# libgcc/config/arm/lib1funcs.S. _arm_muldf3 and _arm_mulsf3 must be > > included > > +# first so that the weak multiplication symbols in the corresponding files > > are > > +# chosen over the global symbols that _arm_muldivdf3 and _arm_muldivsf3 > > +# inclusion create when only multiplication is used, thus avoiding pulling > > in > > +# useless division code. > > +ifneq (__ARM_ARCH_ISA_THUMB 1,$(ARM_ISA)$(THUMB1_ISA)) > > +LIB1ASMFUNCS += _arm_muldf3 _arm_mulsf3 > > +endif > > +endif # !__symbian__ > > + > > # For most CPUs we have an assembly soft-float implementations. > > # However this is not true for ARMv6M. Here we want to use the soft-fp C > > # implementation. The soft-fp code is only build for ARMv6M. This pulls > > >