From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa1.hgst.iphmx.com (esa1.hgst.iphmx.com [68.232.141.245]) by sourceware.org (Postfix) with ESMTPS id DE3A9385DC3A for ; Fri, 3 Apr 2020 22:56:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org DE3A9385DC3A IronPort-SDR: R53eAoh4wuGLVCoRp5AZfcbDgISWTF5v+4NzD9LHjnxms9pZBoTr7fPEkRAI/S575mOWWNwkK5 kJ2b7UQKuHl3vqQEbu2opcH+XqR1vx6KtqJyrxi5/WWnq2zmXDAiqnqwJ1hWK/tWUkPGTaw2sO uzGNtnkPQ8ttrbBdOIlmINkbVWIzp2THuqb22PAKdtzrGc30fNjR6m1dX+5bVMrwm//0fphdNW Wvg4B9Xb9BmnOmxhxyA1W9JATTCHRZuSyNdUn9s8RNJjA1BmcsypUh7QuPTzUXWqdzNEDNKnFG UK0= X-IronPort-AV: E=Sophos;i="5.72,341,1580745600"; d="scan'208";a="243063137" Received: from uls-op-cesaip01.wdc.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 04 Apr 2020 06:56:19 +0800 IronPort-SDR: DCzXzyJ+NZiw3N+2hVabikRuI8pxXXU2uqb4RcRgMI84994ux2dhYsVa46n+vVF4A2HRs58STf +Qt/1i2E96TBst+eVY5j/XMAnqFAzNXXJNor+oYdnENbglRbqJUa1jbo1uHas2HEboQ4hPNOow 4KaujZC8k40vxD1BsLWj7vkcvSZ4wO24ZYfKNCvC2KH/66DmErxTDLNrUHHUS9lHx9gWtdmCHN dYysGdNyDoJ3LbSazhZ/z9mSA3XL0RD8JDs94fy+mdQ6yxKQvOZV59VGGZc+8rzOuQT+LlcpO8 IlYw50jddQ3cYENVzgpby0m6 Received: from uls-op-cesaip01.wdc.com ([10.248.3.36]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Apr 2020 15:47:42 -0700 IronPort-SDR: JiklwgtRVl5ZupialL+rmjp2r7nXtTC9+Wwui2Hy7OkFD8cXtHmYxGwYae7868gUEYq1N3nbSa K3PWa3bVIUWJ+Pkj4LYHTBafA+Chpjez+Ipi5W5QDh0+7MqDIZZQcjKjPOP00P2GH5PXEgILwS 78EvRG3AVXLFFCeHTKuv8HCOqkTd6avDGwL+CoGYkG/Bt4TV8pOth1OjHhBpTxl7uuHI54avF4 bmPU19ax+RxUnroqtLatkoGAMEq/krIA3uEpjY4v6x1I0KL6ovMqwHHtgqG472DirOvCSBj7tM Rzs= WDCIronportException: Internal Received: from unknown (HELO redsun52) ([10.149.66.28]) by uls-op-cesaip01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Apr 2020 15:56:19 -0700 Date: Fri, 3 Apr 2020 23:56:16 +0100 (BST) From: "Maciej W. Rozycki" To: libffi-discuss@sourceware.org cc: Anthony Green , Mike Stump , gcc-patches@gcc.gnu.org Subject: [PATCH libffi 3/4] Make `libffi-init' use $CC_FOR_TARGET In-Reply-To: Message-ID: References: User-Agent: Alpine 2.21 (LFD 202 2017-01-01) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Spam-Status: No, score=-16.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libffi-discuss@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libffi-discuss mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 03 Apr 2020 22:56:22 -0000 Update code in `libffi-init' to use $CC_FOR_TARGET in determining the value of $ld_library_path, as using a different compiler location from one actually used in testing may have odd consequences. As this obviously loses the setting of $gccdir provide a replacement way to determine the directory if feasible, however prefer the location of shared libgcc over static libgcc. This helps in configurations where shared libgcc is, unlike libgcc, a location that is not specific to the compiler version, a common scenario. It does not address the scenario however where there is a shared libgcc symlink installed pointing to the actual run-time library installed elsewhere; this would have to be dealt with in a board description file specific to the installation. Use `remote_exec host' rather than `exec' to invoke the compiler so as to support remote configurations and also avoid the latter procedure's path length limitation that prevents execution in some actual scenarios. As using `remote_exec host' precludes the use of our existing file name globbing to examine directory contents, reuse, with minor modifications needed to adjust to our structure, the piece I previously contributed to GCC with commit d42b84f427e4 ("testsuite: Fix run-time tracking down of `libgcc_s'"). --- Hi, This has its limitation in that it still doesn't default to the same compiler as `target_compile' (`default_target_compile') from target.exp in DejaGNU does, but I believe it is a step in the right direction. That will only affect standalone (e.g. installed) testing iff $CC_FOR_TARGET hasn't been set. Also for C++ compilation our carefully crafted $ld_library_path is unfortunately overridden by `g++_link_flags' from libgloss.exp in DejaGNU called in `default_target_compile'. This actually does cause test failures in my `riscv64-linux-gnu' cross-compilation setup: FAIL: libffi.closures/unwindtest.cc -W -Wall -Wno-psabi -O0 execution test FAIL: libffi.closures/unwindtest.cc -W -Wall -Wno-psabi -O2 execution test FAIL: libffi.closures/unwindtest_ffi_call.cc -W -Wall -Wno-psabi -O0 execution test FAIL: libffi.closures/unwindtest_ffi_call.cc -W -Wall -Wno-psabi -O2 execution test and I am currently not sure how to best address it, i.e. whether to change DejaGNU's `g++_link_flags' or to take advantage of a TCL's feature and provide our own copy of the procedure. Something to consider sometime. NB I chose not to correct obvious indentation issues with lines not touched by this change so as not to obfuscate the patch unnecessarily. A complementing formatting change follows. Maciej --- testsuite/lib/libffi.exp | 68 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 17 deletions(-) Index: libffi/testsuite/lib/libffi.exp =================================================================== --- libffi.orig/testsuite/lib/libffi.exp +++ libffi/testsuite/lib/libffi.exp @@ -272,7 +272,7 @@ proc libffi-init { args } { global srcdir global blddirffi global objdir - global TOOL_OPTIONS + global CC_FOR_TARGET global tool global libffi_include global libffi_link_flags @@ -287,29 +287,63 @@ proc libffi-init { args } { verbose "libffi $blddirffi" if { [string match $compiler_vendor "gnu"] } { - set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a] - if {$gccdir != ""} { - set gccdir [file dirname $gccdir] - } + if [info exists CC_FOR_TARGET] then { + set compiler "$CC_FOR_TARGET" + set libgcc_a_x [remote_exec host "$compiler" \ + "-print-file-name=libgcc.a"] + if { [lindex $libgcc_a_x 0] == 0 } { + set gccdir [file dirname [lindex $libgcc_a_x 1]] + } else { + set gccdir "" + } + } else { + set gccdir [lookfor_file $tool_root_dir gcc/libgcc.a] + if {$gccdir != ""} { + set gccdir [file dirname $gccdir] + } + set compiler "${gccdir}/xgcc" + } verbose "gccdir $gccdir" + set shlib_ext [get_shlib_extension] + set libgcc_s_x [remote_exec host "$compiler" \ + "-print-file-name=libgcc_s.${shlib_ext}"] + if { [lindex $libgcc_s_x 0] == 0 } { + set libgcc_dir [file dirname [lindex $libgcc_s_x 1]] + } else { + set libgcc_dir $gccdir + } + verbose "libgcc_dir $libgcc_dir" + set ld_library_path "." append ld_library_path ":${gccdir}" - set compiler "${gccdir}/xgcc" - if { [is_remote host] == 0 && [which $compiler] != 0 } { - foreach i "[exec $compiler --print-multi-lib]" { - set mldir "" - regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir - set mldir [string trimright $mldir "\;@"] - if { "$mldir" == "." } { + set multi_dir_x [remote_exec host "$compiler" "-print-multi-directory"] + set multi_lib_x [remote_exec host "$compiler" "-print-multi-lib"] + if { [lindex $multi_dir_x 0] == 0 && [lindex $multi_lib_x 0] == 0 } { + set multi_dir [string trim [lindex $multi_dir_x 1]] + set multi_lib [string trim [lindex $multi_lib_x 1]] + if { "$multi_dir" == "." } { + set multi_root "$libgcc_dir" + } else { + set multi_match [string last "/$multi_dir" "$libgcc_dir"] + if { "$multi_match" >= 0 } { + set multi_root [string range "$libgcc_dir" \ + 0 [expr $multi_match - 1]] + } else { + set multi_lib "" + } + } + foreach i "$multi_lib" { + set mldir "" + regexp -- "\[a-z0-9=_/\.-\]*;" $i mldir + set mldir [string trimright $mldir "\;@"] + if { "$mldir" == "$multi_dir" } { continue - } - if { [llength [glob -nocomplain ${gccdir}/${mldir}/libgcc_s*.so.*]] >= 1 } { - append ld_library_path ":${gccdir}/${mldir}" - } + } + append ld_library_path ":${multi_root}/${mldir}" } - } + } } # add the library path for libffi.