[gdb/testsuite] Fix var use in compile_and_download_n_jit_so
[binutils-gdb.git] / gdb / testsuite / lib / jit-elf-helpers.exp
index 91b64f2915d76305e499cb1fa816c62eb15efa18..f1e8ad77852e01a06afb65b6c6e7b923fd2e8601 100644 (file)
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+# Magic constants used to calculate a starting address when linking
+# "jit" shared libraries.  When loaded, will be mapped by jit-elf-main
+# to the same address.
+
+set jit_load_address   0x7000000
+set jit_load_increment 0x1000000
+
 # Compile jit-elf-main.c as an executable.
 #
 # BINSUFFIX is appended to the binary name.
 # On success, return 0.
 # On failure, return -1.
 proc compile_jit_main {main_srcfile main_binfile options} {
-    set options [concat $options debug]
+    global jit_load_address jit_load_increment
+
+    set options [concat \
+       $options \
+       additional_flags=-DLOAD_ADDRESS=$jit_load_address \
+       additional_flags=-DLOAD_INCREMENT=$jit_load_increment \
+       debug]
 
     if { [gdb_compile ${main_srcfile} ${main_binfile} \
-         executable $options] != "" } {
-             untested "failed to compile ${main_basename}.c"
-             return -1
+             executable $options] != "" } {
+       set f [file tail $main_binfile]
+       untested "failed to compile $f"
+       return -1
     }
 
     return 0
@@ -39,11 +53,18 @@ proc compile_jit_main {main_srcfile main_binfile options} {
 # 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]
+    global jit_load_address jit_load_increment
+
+    set options [list \
+       additional_flags="-DMAIN=jit_dl_main" \
+       additional_flags=-DLOAD_ADDRESS=$jit_load_address \
+       additional_flags=-DLOAD_INCREMENT=$jit_load_increment \
+       debug]
 
     if { [gdb_compile_shlib ${main_solib_srcfile} ${main_solib_binfile} \
-           $options] != "" } {
-       untested "failed to compile ${main_solib_basename}.c as a shared library"
+             $options] != "" } {
+       set f [file tail $main_solib_binfile]
+       untested "failed to compile shared library $f"
        return -1
     }
 
@@ -56,6 +77,7 @@ proc compile_jit_elf_main_as_so {main_solib_srcfile main_solib_binfile options}
 # 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} {
+    global jit_load_address jit_load_increment
     set binfiles_target {}
 
     for {set i 1} {$i <= $count} {incr i} {
@@ -65,8 +87,19 @@ proc compile_and_download_n_jit_so {jit_solib_basename jit_solib_srcfile count}
        # 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"
+       set addr [format 0x%x [expr $jit_load_address + $jit_load_increment * [expr $i-1]]]
+       # Using -Ttext-segment flag to ask linked to relocate everything
+       # in the compiled shared library against a fixed base address.  Combined
+       # with mapping the resulting binary to the same fixed base it allows
+       # to dynamically execute functions from it without any further adjustments.
+       set options [list \
+           additional_flags=-DFUNCTION_NAME=[format "jit_function_%04d" $i] \
+           additional_flags=-Xlinker \
+           additional_flags=-Ttext-segment=$addr]
+       if { [gdb_compile_shlib ${jit_solib_srcfile} ${binfile} \
+                 $options] != "" } {
+           set f [file tail $binfile]
+           untested "failed to compile shared library $f"
            return -1
        }
 
@@ -75,4 +108,4 @@ proc compile_and_download_n_jit_so {jit_solib_basename jit_solib_srcfile count}
     }
 
     return $binfiles_target
-}
\ No newline at end of file
+}