This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch,testsuite] Fix bind_pic_locally


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  <vidyapraveen@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
>  }
>  



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]