[gdb/testsuite] add lib/jit-elf-helpers.exp
New utility library to be used by jit-elf tests responsible for compiling binary artifacts. In the next commit the compilation process will become more complicated because of extra mandatory flag - keeping it in one place will make tests less fragile. gdb/testsuite/ChangeLog: 2020-02-18 Mihails Strasuns <mihails.strasuns@intel.com> * lib/jit-elf-helpers.exp: New file. * gdb.base/jit-elf.exp: Updated to use jit-elf-helpers.exp. * gdb.base/jit-elf-so.exp: Updated to use jit-elf-helpers.exp.
This commit is contained in:
parent
9a94694506
commit
f801207197
@ -26,6 +26,8 @@ if {[get_compiler_info]} {
|
||||
return 1
|
||||
}
|
||||
|
||||
load_lib jit-elf-helpers.exp
|
||||
|
||||
# The "real" main of this test, which loads jit-elf-main
|
||||
# as a shared library.
|
||||
set main_loader_basename jit-elf-dlmain
|
||||
@ -41,25 +43,6 @@ set main_solib_binfile [standard_output_file ${main_solib_basename}.so]
|
||||
set jit_solib_basename jit-elf-solib
|
||||
set jit_solib_srcfile ${srcdir}/${subdir}/${jit_solib_basename}.c
|
||||
|
||||
# Compile jit-elf-main.c as a shared library.
|
||||
#
|
||||
# OPTIONS is passed to gdb_compile when compiling the program.
|
||||
#
|
||||
# On success, return 0.
|
||||
# On failure, return -1.
|
||||
proc compile_jit_elf_main_as_so {options} {
|
||||
global main_solib_srcfile main_solib_binfile
|
||||
set options [concat $options debug]
|
||||
|
||||
if { [gdb_compile_shlib ${main_solib_srcfile} ${main_solib_binfile} \
|
||||
$options] != "" } {
|
||||
untested "failed to compile ${main_solib_basename}.c as a shared library"
|
||||
return -1
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Compile the testcase shared library loader.
|
||||
#
|
||||
# OPTIONS is passed to gdb_compile when compiling the binary.
|
||||
@ -79,34 +62,6 @@ proc compile_jit_dlmain {options} {
|
||||
return 0
|
||||
}
|
||||
|
||||
# Compile jit-elf-solib.c as a shared library in multiple copies and
|
||||
# upload them to the target.
|
||||
#
|
||||
# On success, return a list of target path to the shared libraries.
|
||||
# On failure, return -1.
|
||||
proc compile_and_download_n_jit_so {count} {
|
||||
global jit_solib_basename jit_solib_srcfile
|
||||
set binfiles_target {}
|
||||
|
||||
for {set i 1} {$i <= $count} {incr i} {
|
||||
set binfile [standard_output_file ${jit_solib_basename}.$i.so]
|
||||
|
||||
# Note: compiling without debug info by default: some test
|
||||
# do symbol renaming by munging on ELF symbol table, and that
|
||||
# wouldn't work for .debug sections. Also, output for "info
|
||||
# function" changes when debug info is present.
|
||||
if { [gdb_compile_shlib ${jit_solib_srcfile} ${binfile} {}] != "" } {
|
||||
untested "failed to compile ${jit_solib_basename}.c as a shared library"
|
||||
return -1
|
||||
}
|
||||
|
||||
set path [gdb_remote_download target ${binfile}]
|
||||
lappend binfiles_target $path
|
||||
}
|
||||
|
||||
return $binfiles_target
|
||||
}
|
||||
|
||||
# Run $main_loader_binfile and load $main_solib_binfile in
|
||||
# GDB. Check jit-related debug output and matches `info function`
|
||||
# output for a jit loaded function using MATCH_STR.
|
||||
@ -117,7 +72,6 @@ proc compile_and_download_n_jit_so {count} {
|
||||
# must match.
|
||||
proc one_jit_test {solib_binfiles_target match_str} {
|
||||
set count [llength $solib_binfiles_target]
|
||||
|
||||
with_test_prefix "one_jit_test-$count" {
|
||||
global verbose
|
||||
global main_loader_binfile main_loader_srcfile
|
||||
@ -184,7 +138,8 @@ proc one_jit_test {solib_binfiles_target match_str} {
|
||||
}
|
||||
|
||||
# Compile the main code (which loads the JIT objects) as a shared library.
|
||||
if { [compile_jit_elf_main_as_so {additional_flags="-DMAIN=jit_dl_main"}] < 0 } {
|
||||
if { [compile_jit_elf_main_as_so $main_solib_srcfile $main_solib_binfile \
|
||||
{additional_flags="-DMAIN=jit_dl_main"}] < 0 } {
|
||||
return
|
||||
}
|
||||
|
||||
@ -194,7 +149,8 @@ if { [compile_jit_dlmain {shlib_load}] < 0 } {
|
||||
}
|
||||
|
||||
# Compile two shared libraries to use as JIT objects.
|
||||
set jit_solibs_target [compile_and_download_n_jit_so 2]
|
||||
set jit_solibs_target [compile_and_download_n_jit_so \
|
||||
$jit_solib_basename $jit_solib_srcfile 2]
|
||||
if { $jit_solibs_target == -1 } {
|
||||
return
|
||||
}
|
||||
|
@ -23,8 +23,10 @@ if {[get_compiler_info]} {
|
||||
return 1
|
||||
}
|
||||
|
||||
load_lib jit-elf-helpers.exp
|
||||
|
||||
# The main code that loads and registers JIT objects.
|
||||
set main_basename jit-elf-main
|
||||
set main_basename "jit-elf-main"
|
||||
set main_srcfile ${srcdir}/${subdir}/${main_basename}.c
|
||||
set main_binfile [standard_output_file ${main_basename}]
|
||||
|
||||
@ -32,58 +34,7 @@ set main_binfile [standard_output_file ${main_basename}]
|
||||
set jit_solib_basename jit-elf-solib
|
||||
set jit_solib_srcfile ${srcdir}/${subdir}/${jit_solib_basename}.c
|
||||
|
||||
# Compile jit-elf-main.c as an executable.
|
||||
#
|
||||
# BINSUFFIX is appended to the binary name.
|
||||
# OPTIONS is passed to gdb_compile when compiling the program.
|
||||
#
|
||||
# On success, return 0.
|
||||
# On failure, return -1.
|
||||
proc compile_jit_main {binsuffix options} {
|
||||
global main_binfile main_srcfile main_basename
|
||||
|
||||
set binfile ${main_binfile}${binsuffix}
|
||||
set options [concat $options debug]
|
||||
|
||||
if { [gdb_compile ${main_srcfile} ${binfile} \
|
||||
executable $options] != "" } {
|
||||
untested "failed to compile ${main_basename}.c"
|
||||
return -1
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Compile jit-elf-solib.c as a shared library in multiple copies and
|
||||
# upload them to the target.
|
||||
#
|
||||
# On success, return a list of target paths to the shared libraries.
|
||||
# On failure, return -1.
|
||||
proc compile_and_download_n_jit_so {count} {
|
||||
global jit_solib_basename jit_solib_srcfile
|
||||
set binfiles_target {}
|
||||
|
||||
for {set i 1} {$i <= $count} {incr i} {
|
||||
set binfile [standard_output_file ${jit_solib_basename}.$i.so]
|
||||
|
||||
# Note: compiling without debug info by default: some test
|
||||
# do symbol renaming by munging on ELF symbol table, and that
|
||||
# wouldn't work for .debug sections. Also, output for "info
|
||||
# function" changes when debug info is present.
|
||||
if { [gdb_compile_shlib ${jit_solib_srcfile} ${binfile} {}] != "" } {
|
||||
untested "failed to compile ${jit_solib_basename}.c as a shared library"
|
||||
return -1
|
||||
}
|
||||
|
||||
set path [gdb_remote_download target ${binfile}]
|
||||
lappend binfiles_target $path
|
||||
}
|
||||
|
||||
return $binfiles_target
|
||||
}
|
||||
|
||||
# Detach, restart GDB, and re-attach to the program.
|
||||
|
||||
proc clean_reattach {} {
|
||||
global decimal gdb_prompt
|
||||
global main_binfile main_srcfile
|
||||
@ -180,13 +131,14 @@ proc one_jit_test {jit_solibs_target match_str reattach} {
|
||||
}
|
||||
|
||||
# Compile two shared libraries to use as JIT objects.
|
||||
set jit_solibs_target [compile_and_download_n_jit_so 2]
|
||||
set jit_solibs_target [compile_and_download_n_jit_so \
|
||||
$jit_solib_basename $jit_solib_srcfile 2]
|
||||
if { $jit_solibs_target == -1 } {
|
||||
return
|
||||
}
|
||||
|
||||
# Compile the main code (which loads the JIT objects).
|
||||
if { [compile_jit_main "" {}] == 0 } {
|
||||
if { [compile_jit_main ${main_srcfile} ${main_binfile} {}] == 0 } {
|
||||
one_jit_test [lindex $jit_solibs_target 0] "${hex} jit_function_0001" 0
|
||||
one_jit_test $jit_solibs_target "${hex} jit_function_0001\[\r\n\]+${hex} jit_function_0002" 0
|
||||
}
|
||||
@ -195,14 +147,15 @@ if { [compile_jit_main "" {}] == 0 } {
|
||||
# registered. We reuse the normal test, and detach/reattach at
|
||||
# specific interesting points.
|
||||
if {[can_spawn_for_attach]} {
|
||||
if { [compile_jit_main "-attach" {additional_flags=-DATTACH=1}] == 0 } {
|
||||
if { [compile_jit_main ${main_srcfile} ${main_binfile}"-attach" \
|
||||
{additional_flags=-DATTACH=1}] == 0 } {
|
||||
with_test_prefix attach {
|
||||
one_jit_test $jit_solibs_target "${hex} jit_function_0001\[\r\n\]+${hex} jit_function_0002" 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if { [compile_jit_main "-pie" {additional_flags=-fPIE ldflags=-pie}] == 0 } {
|
||||
if { [compile_jit_main ${main_srcfile} ${main_binfile}"-pie" {additional_flags=-fPIE ldflags=-pie}] == 0 } {
|
||||
with_test_prefix PIE {
|
||||
one_jit_test [lindex $jit_solibs_target 0] "${hex} jit_function_0001" 0
|
||||
}
|
||||
|
78
gdb/testsuite/lib/jit-elf-helpers.exp
Normal file
78
gdb/testsuite/lib/jit-elf-helpers.exp
Normal file
@ -0,0 +1,78 @@
|
||||
# Copyright 2020 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Compile jit-elf-main.c as an executable.
|
||||
#
|
||||
# BINSUFFIX is appended to the binary name.
|
||||
# OPTIONS is passed to gdb_compile when compiling the program.
|
||||
#
|
||||
# On success, return 0.
|
||||
# On failure, return -1.
|
||||
proc compile_jit_main {main_srcfile main_binfile options} {
|
||||
set options [concat $options debug]
|
||||
|
||||
if { [gdb_compile ${main_srcfile} ${main_binfile} \
|
||||
executable $options] != "" } {
|
||||
untested "failed to compile ${main_basename}.c"
|
||||
return -1
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Compile jit-elf-main.c as a shared library.
|
||||
#
|
||||
# OPTIONS is passed to gdb_compile when compiling the program.
|
||||
#
|
||||
# On success, return 0.
|
||||
# On failure, return -1.
|
||||
proc compile_jit_elf_main_as_so {main_solib_srcfile main_solib_binfile options} {
|
||||
set options [concat $options debug]
|
||||
|
||||
if { [gdb_compile_shlib ${main_solib_srcfile} ${main_solib_binfile} \
|
||||
$options] != "" } {
|
||||
untested "failed to compile ${main_solib_basename}.c as a shared library"
|
||||
return -1
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
# Compile jit-elf-solib.c as a shared library in multiple copies and
|
||||
# upload them to the target.
|
||||
#
|
||||
# On success, return a list of target path to the shared libraries.
|
||||
# On failure, return -1.
|
||||
proc compile_and_download_n_jit_so {jit_solib_basename jit_solib_srcfile count} {
|
||||
set binfiles_target {}
|
||||
|
||||
for {set i 1} {$i <= $count} {incr i} {
|
||||
set binfile [standard_output_file ${jit_solib_basename}.$i.so]
|
||||
|
||||
# Note: compiling without debug info by default: some test
|
||||
# do symbol renaming by munging on ELF symbol table, and that
|
||||
# wouldn't work for .debug sections. Also, output for "info
|
||||
# function" changes when debug info is present.
|
||||
if { [gdb_compile_shlib ${jit_solib_srcfile} ${binfile} {}] != "" } {
|
||||
untested "failed to compile ${jit_solib_basename}.c as a shared library"
|
||||
return -1
|
||||
}
|
||||
|
||||
set path [gdb_remote_download target ${binfile}]
|
||||
lappend binfiles_target $path
|
||||
}
|
||||
|
||||
return $binfiles_target
|
||||
}
|
Loading…
Reference in New Issue
Block a user