PING! On Wed, Jun 04, 2014 at 02:56:00PM +0100, Vidya Praveen wrote: > Hello, > > This is to follow up the patch I had posted to fix bind_pic_locally some time > ago (sorry, this went in to my back log for a while). > > To summarize, multilib_flags when it contains -fpic or -fPIC, overrides -fpie > or -fPIE that is added by bind_pic_locally. The fix that was finally agreed on > was to store the flags to a variable at bind_pic_locally and append it > to > multilib_flags just before invoking target_compile and remove it > immediately > after that (Refer [1]). > > This patch implements the same. Since this is an issue not only for gcc > but > also for g++ and gfortran tests, I have fixed this in g++.exp and gfortran.exp > along with gcc.exp. > > This was tested and works fine on: > > aarch64-none-elf > aarch64-none-linux-gnu > arm-none-linux-gnueabihf > x86_64-unknown-linux-gnu > > OK for trunk? > > Cheers > VP. > > [1] http://gcc.gnu.org/ml/gcc-patches/2014-01/msg00365.html > > ~~~ > > gcc/testsuite/ChangeLog: > > 2014-06-04 Vidya Praveen <vidyaprav...@arm.com> > > * lib/target-support.exp (bind_pic_locally): Save the flags to > 'flags_to_postpone' instead of appending to 'flags'. > * lib/gcc.exp (gcc_target_compile): Append board_info's multilib_flags > with flags_to_postpone and revert after target_compile. > * lib/g++.exp (g++_target_compile): Ditto. > * lib/gfortran.exp (gfortran_target_compile): Ditto.
> diff --git a/gcc/testsuite/lib/g++.exp b/gcc/testsuite/lib/g++.exp > index 751e27b..6658c58 100644 > --- a/gcc/testsuite/lib/g++.exp > +++ b/gcc/testsuite/lib/g++.exp > @@ -288,6 +288,8 @@ proc g++_target_compile { source dest type options } { > global gluefile wrap_flags > global ALWAYS_CXXFLAGS > global GXX_UNDER_TEST > + global flags_to_postpone > + global board_info > > if { [target_info needs_status_wrapper] != "" && [info exists gluefile] > } { > lappend options "libs=${gluefile}" > @@ -313,10 +315,25 @@ proc g++_target_compile { source dest type options } { > exec rm -f $rponame > } > > + # bind_pic_locally adds -fpie/-fPIE flags to flags_to_postpone and it is > + # appended here to multilib_flags as it can be overridden by the latter > + # if it was added earlier. After the target_compile, multilib_flags is > + # restored to its orignal content. > + set tboard [target_info name] > + if {[board_info $tboard exists multilib_flags]} { > + set orig_multilib_flags "[board_info [target_info name] > multilib_flags]" > + append board_info($tboard,multilib_flags) " $flags_to_postpone" > + } > + > set options [dg-additional-files-options $options $source] > > set result [target_compile $source $dest $type $options] > > + if {[board_info $tboard exists multilib_flags]} { > + set board_info($tboard,multilib_flags) $orig_multilib_flags > + set flags_to_postpone "" > + } > + > return $result > } > > diff --git a/gcc/testsuite/lib/gcc.exp b/gcc/testsuite/lib/gcc.exp > index 49394b0..f937064 100644 > --- a/gcc/testsuite/lib/gcc.exp > +++ b/gcc/testsuite/lib/gcc.exp > @@ -126,7 +126,9 @@ proc gcc_target_compile { source dest type options } { > global GCC_UNDER_TEST > global TOOL_OPTIONS > global TEST_ALWAYS_FLAGS > - > + global flags_to_postpone > + global board_info > + > if {[target_info needs_status_wrapper] != "" && \ > [target_info needs_status_wrapper] != "0" && \ > [info exists gluefile] } { > @@ -162,8 +164,26 @@ proc gcc_target_compile { source dest type options } { > set options [concat "{additional_flags=$TOOL_OPTIONS}" $options] > } > > + # bind_pic_locally adds -fpie/-fPIE flags to flags_to_postpone and it is > + # appended here to multilib_flags as it can be overridden by the latter > + # if it was added earlier. After the target_compile, multilib_flags is > + # restored to its orignal content. > + set tboard [target_info name] > + if {[board_info $tboard exists multilib_flags]} { > + set orig_multilib_flags "[board_info [target_info name] > multilib_flags]" > + append board_info($tboard,multilib_flags) " $flags_to_postpone" > + } > + > lappend options "timeout=[timeout_value]" > lappend options "compiler=$GCC_UNDER_TEST" > set options [dg-additional-files-options $options $source] > - return [target_compile $source $dest $type $options] > + set return_val [target_compile $source $dest $type $options] > + > + if {[board_info $tboard exists multilib_flags]} { > + set board_info($tboard,multilib_flags) $orig_multilib_flags > + set flags_to_postpone "" > + } > + > + return $return_val > } > + > diff --git a/gcc/testsuite/lib/gfortran.exp b/gcc/testsuite/lib/gfortran.exp > index c9b5d64..9d174bb 100644 > --- a/gcc/testsuite/lib/gfortran.exp > +++ b/gcc/testsuite/lib/gfortran.exp > @@ -234,16 +234,35 @@ proc gfortran_target_compile { source dest type options > } { > global gluefile wrap_flags > global ALWAYS_GFORTRANFLAGS > global GFORTRAN_UNDER_TEST > + global flags_to_postpone > + global board_info > > if { [target_info needs_status_wrapper] != "" && [info exists gluefile] > } { > lappend options "libs=${gluefile}" > lappend options "ldflags=${wrap_flags}" > } > > + # bind_pic_locally adds -fpie/-fPIE flags to flags_to_postpone and it is > + # appended here to multilib_flags as it can be overridden by the latter > + # if it was added earlier. After the target_compile, multilib_flags is > + # restored to its orignal content. > + set tboard [target_info name] > + if {[board_info $tboard exists multilib_flags]} { > + set orig_multilib_flags "[board_info [target_info name] > multilib_flags]" > + append board_info($tboard,multilib_flags) " $flags_to_postpone" > + } > + > lappend options "compiler=$GFORTRAN_UNDER_TEST" > lappend options "timeout=[timeout_value]" > > set options [concat "$ALWAYS_GFORTRANFLAGS" $options] > set options [dg-additional-files-options $options $source] > - return [target_compile $source $dest $type $options] > + set return_val [target_compile $source $dest $type $options] > + > + if {[board_info $tboard exists multilib_flags]} { > + set board_info($tboard,multilib_flags) $orig_multilib_flags > + set flags_to_postpone "" > + } > + > + return $return_val > } > diff --git a/gcc/testsuite/lib/target-supports.exp > b/gcc/testsuite/lib/target-supports.exp > index 57b10d0..3f2d32c 100644 > --- a/gcc/testsuite/lib/target-supports.exp > +++ b/gcc/testsuite/lib/target-supports.exp > @@ -5151,25 +5151,35 @@ proc add_options_for_ieee { flags } { > return $flags > } > > +if {![info exists flags_to_postpone]} { > + set flags_to_postpone "" > +} > + > # Add to FLAGS the flags needed to enable functions to bind locally > # when using pic/PIC passes in the testsuite. > - > proc add_options_for_bind_pic_locally { flags } { > + global flags_to_postpone > + > + # Instead of returning 'flags' with the -fPIE or -fpie appended, we save > it > + # in 'flags_to_postpone' and append it later in gcc_target_compile > procedure in > + # order to make sure that the multilib_flags doesn't override this. > + > if {[check_no_compiler_messages using_pic2 assembly { > #if __PIC__ != 2 > #error FOO > #endif > }]} { > - return "$flags -fPIE" > + set flags_to_postpone "-fPIE" > + return $flags > } > if {[check_no_compiler_messages using_pic1 assembly { > #if __PIC__ != 1 > #error FOO > #endif > }]} { > - return "$flags -fpie" > + set flags_to_postpone "-fpie" > + return $flags > } > - > return $flags > } >