diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 365d5931bcf..53cdc837a5c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2018-12-19 Thomas Preud'homme + + * 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. + 2018-12-19 Tom de Vries * config/nvptx/nvptx.c (PTX_CTA_SIZE): Define. 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 46ef388e109..29c693b9644 100644 --- a/gcc/doc/sourcebuild.texi +++ b/gcc/doc/sourcebuild.texi @@ -2668,7 +2668,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} @}] @@ -2676,13 +2676,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/ChangeLog b/gcc/testsuite/ChangeLog index d1ebfc7c346..e199cd09728 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,17 @@ +2018-12-19 Tony Wang + Thomas Preud'homme + + * 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. + 2018-12-19 Segher Boessenkool * g++.dg/asm-qual-3.C: New testcase. 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 054d8848abc..e47f80de3f4 100644 --- a/gcc/testsuite/lib/gcc-dg.exp +++ b/gcc/testsuite/lib/gcc-dg.exp @@ -1244,5 +1244,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/ChangeLog b/libgcc/ChangeLog index 2075567766d..1879424524d 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,18 @@ +2018-12-19 Thomas Preud'homme + + * /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. + 2018-12-18 Wei Xiao * config/i386/cpuinfo.c (get_intel_cpu): Handle cascadelake. diff --git a/libgcc/config/arm/ieee754-df.S b/libgcc/config/arm/ieee754-df.S index 480e33da31f..1765c5f1f60 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 @@ -870,6 +881,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 +1080,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 -