Commit | Line | Data |
---|---|---|
88b9d363 | 1 | # Copyright 2020-2022 Free Software Foundation, Inc. |
f8012071 MS |
2 | |
3 | # This program is free software; you can redistribute it and/or modify | |
4 | # it under the terms of the GNU General Public License as published by | |
5 | # the Free Software Foundation; either version 3 of the License, or | |
6 | # (at your option) any later version. | |
7 | # | |
8 | # This program is distributed in the hope that it will be useful, | |
9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
11 | # GNU General Public License for more details. | |
12 | # | |
13 | # You should have received a copy of the GNU General Public License | |
14 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
15 | ||
80ad340c MS |
16 | # Magic constants used to calculate a starting address when linking |
17 | # "jit" shared libraries. When loaded, will be mapped by jit-elf-main | |
18 | # to the same address. | |
19 | ||
20 | set jit_load_address 0x7000000 | |
21 | set jit_load_increment 0x1000000 | |
22 | ||
f8012071 MS |
23 | # Compile jit-elf-main.c as an executable. |
24 | # | |
25 | # BINSUFFIX is appended to the binary name. | |
26 | # OPTIONS is passed to gdb_compile when compiling the program. | |
27 | # | |
28 | # On success, return 0. | |
29 | # On failure, return -1. | |
30 | proc compile_jit_main {main_srcfile main_binfile options} { | |
80ad340c MS |
31 | global jit_load_address jit_load_increment |
32 | ||
33 | set options [concat \ | |
34 | $options \ | |
35 | additional_flags=-DLOAD_ADDRESS=$jit_load_address \ | |
36 | additional_flags=-DLOAD_INCREMENT=$jit_load_increment \ | |
37 | debug] | |
f8012071 MS |
38 | |
39 | if { [gdb_compile ${main_srcfile} ${main_binfile} \ | |
1b59ca1c TV |
40 | executable $options] != "" } { |
41 | set f [file tail $main_binfile] | |
42 | untested "failed to compile $f" | |
43 | return -1 | |
f8012071 MS |
44 | } |
45 | ||
46 | return 0 | |
47 | } | |
48 | ||
49 | # Compile jit-elf-main.c as a shared library. | |
50 | # | |
51 | # OPTIONS is passed to gdb_compile when compiling the program. | |
52 | # | |
53 | # On success, return 0. | |
54 | # On failure, return -1. | |
55 | proc compile_jit_elf_main_as_so {main_solib_srcfile main_solib_binfile options} { | |
80ad340c MS |
56 | global jit_load_address jit_load_increment |
57 | ||
58 | set options [list \ | |
59 | additional_flags="-DMAIN=jit_dl_main" \ | |
60 | additional_flags=-DLOAD_ADDRESS=$jit_load_address \ | |
61 | additional_flags=-DLOAD_INCREMENT=$jit_load_increment \ | |
62 | debug] | |
f8012071 MS |
63 | |
64 | if { [gdb_compile_shlib ${main_solib_srcfile} ${main_solib_binfile} \ | |
1b59ca1c TV |
65 | $options] != "" } { |
66 | set f [file tail $main_solib_binfile] | |
67 | untested "failed to compile shared library $f" | |
f8012071 MS |
68 | return -1 |
69 | } | |
70 | ||
71 | return 0 | |
72 | } | |
73 | ||
74 | # Compile jit-elf-solib.c as a shared library in multiple copies and | |
75 | # upload them to the target. | |
76 | # | |
77 | # On success, return a list of target path to the shared libraries. | |
78 | # On failure, return -1. | |
79 | proc compile_and_download_n_jit_so {jit_solib_basename jit_solib_srcfile count} { | |
80ad340c | 80 | global jit_load_address jit_load_increment |
f8012071 MS |
81 | set binfiles_target {} |
82 | ||
83 | for {set i 1} {$i <= $count} {incr i} { | |
84 | set binfile [standard_output_file ${jit_solib_basename}.$i.so] | |
85 | ||
86 | # Note: compiling without debug info by default: some test | |
87 | # do symbol renaming by munging on ELF symbol table, and that | |
88 | # wouldn't work for .debug sections. Also, output for "info | |
89 | # function" changes when debug info is present. | |
80ad340c MS |
90 | set addr [format 0x%x [expr $jit_load_address + $jit_load_increment * [expr $i-1]]] |
91 | # Using -Ttext-segment flag to ask linked to relocate everything | |
92 | # in the compiled shared library against a fixed base address. Combined | |
93 | # with mapping the resulting binary to the same fixed base it allows | |
94 | # to dynamically execute functions from it without any further adjustments. | |
95 | set options [list \ | |
aff4e759 | 96 | additional_flags=-DFUNCTION_NAME=[format "jit_function_%04d" $i] \ |
80ad340c MS |
97 | additional_flags=-Xlinker \ |
98 | additional_flags=-Ttext-segment=$addr] | |
1b59ca1c TV |
99 | if { [gdb_compile_shlib ${jit_solib_srcfile} ${binfile} \ |
100 | $options] != "" } { | |
101 | set f [file tail $binfile] | |
8f7d38ef | 102 | untested "failed to compile shared library $f" |
f8012071 MS |
103 | return -1 |
104 | } | |
105 | ||
106 | set path [gdb_remote_download target ${binfile}] | |
107 | lappend binfiles_target $path | |
108 | } | |
109 | ||
110 | return $binfiles_target | |
1b59ca1c | 111 | } |