[gdb/testsuite] define jit function name via macro
authorMihails Strasuns <mihails.strasuns@intel.com>
Fri, 27 Mar 2020 10:21:01 +0000 (11:21 +0100)
committerMihails Strasuns <mihails.strasuns@intel.com>
Tue, 12 May 2020 07:52:46 +0000 (09:52 +0200)
Replaces previous approach with patching resulting ELF binary after
loading - now that each test iteration works on a separately compiled
binary it is not necessary anymore.

Tests are still being ran without debug info to preserve original test
functionality but this change opens up the possibility to enable debug
info if needed too.

gdb/testsuite/ChangeLog:

2020-03-27  Mihails Strasuns  <mihails.strasuns@intel.com>

* lib/jit-elf-helpers.exp: Supply -DFUNCTION_NAME macro
  definition when compiling jit-elf-solib.co.
* gdb.base/jit-elf-main.c: Stop patching jit function name.
* gdb.base/jit-elf-solib.c: Use FUNCTION_NAME macro value as a
  function name.

gdb/testsuite/gdb.base/jit-elf-main.c
gdb/testsuite/gdb.base/jit-elf-solib.c
gdb/testsuite/lib/jit-elf-helpers.exp

index be7185ef1a11033c47b12ccd3a842ab0fac38eac..2d654891d942c987de40b7f6851be9ad8eee1323 100644 (file)
@@ -51,35 +51,6 @@ usage (void)
   exit (1);
 }
 
-/* Rename jit_function_XXXX to match idx  */
-
-static void
-update_name (const void *const addr, int idx)
-{
-  const ElfW (Ehdr) *const ehdr = (ElfW (Ehdr) *)addr;
-  ElfW (Shdr) *const shdr = (ElfW (Shdr) *)((char *)addr + ehdr->e_shoff);
-  ElfW (Phdr) *const phdr = (ElfW (Phdr) *)((char *)addr + ehdr->e_phoff);
-  int i;
-
-  for (i = 0; i < ehdr->e_shnum; ++i)
-    {
-      if (shdr[i].sh_type == SHT_STRTAB)
-        {
-          /* Note: we update both .strtab and .dynstr.  The latter would
-             not be correct if this were a regular shared library (.hash
-             would be wrong), but this is a simulation -- the library is
-             never exposed to the dynamic loader, so it all ends up ok.  */
-          char *const strtab = (char *)((ElfW (Addr))addr + shdr[i].sh_offset);
-          char *const strtab_end = strtab + shdr[i].sh_size;
-          char *p;
-
-          for (p = strtab; p < strtab_end; p += strlen (p) + 1)
-            if (strcmp (p, "jit_function_XXXX") == 0)
-              sprintf (p, "jit_function_%04d", idx);
-        }
-    }
-}
-
 /* Defined by the .exp file if testing attach.  */
 #ifndef ATTACH
 #define ATTACH 0
@@ -152,8 +123,6 @@ MAIN (int argc, char *argv[])
          exit (1);
        }
 
-      update_name (addr, i);
-
       /* Link entry at the end of the list.  */
       entry->symfile_addr = (const char *)addr;
       entry->symfile_size = st.st_size;
index 3bdebe9ed0f14af8d426ddbfe3d9f172e02a8927..66d6a2be6d7af6aa700a5b7c959e6aaf0a5b4106 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/>.  */
 
-/* This simulates a JIT library.  The function is "renamed" after being
-   loaded into memory.  */
+/* This simulates a JIT library.  The function name is supplied during
+   compilation as a macro.  */
 
-int jit_function_XXXX() { return 42; }
+#ifndef FUNCTION_NAME
+#error "Must define the FUNCTION_NAME macro to set a jited function name"
+#endif
+
+int FUNCTION_NAME() { return 42; }
index 032417b373d79105563e947df71dcd1a13fce046..ab647abe50eacf9c685fd04ddcbc17bdba6f3115 100644 (file)
@@ -91,6 +91,7 @@ proc compile_and_download_n_jit_so {jit_solib_basename jit_solib_srcfile count}
        # 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] != "" } {