]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/testsuite] Fix gdb.arch/arm-pseudo-unwind.exp with unix/mthumb
authorTom de Vries <tdevries@suse.de>
Wed, 17 Jul 2024 15:04:02 +0000 (17:04 +0200)
committerTom de Vries <tdevries@suse.de>
Wed, 17 Jul 2024 15:04:02 +0000 (17:04 +0200)
When running test-case gdb.arch/arm-pseudo-unwind.exp with target board
unix/mthumb, we run into:
...
(gdb) continue^M
Continuing.^M
^M
Program received signal SIGILL, Illegal instruction.^M
0x00400f38 in ?? ()^M
(gdb) FAIL: $exp: continue to breakpoint: continue to callee
...

The test-case attempts to force arm-pseudo-unwind.c to be compiled in arm mode
using additional_flags=-marm, but that's overridden by using target board
unix/mthumb.

This causes function main to be in thumb mode, and consequently function
caller (which is called from main) is is executed as if it's in thumb mode,
while it's actually in arm mode.

Fix this by adding an intermediate function caller_trampoline in
arm-pseudo-unwind.c, and hardcoding it to arm mode using
__attribute__((target("arm"))).

Likewise for test-case gdb.arch/arm-pseudo-unwind-legacy.exp.

Tested on arm-linux.

Approved-By: Luis Machado <luis.machado@arm.com>
gdb/testsuite/gdb.arch/arm-pseudo-unwind-legacy.c
gdb/testsuite/gdb.arch/arm-pseudo-unwind.c

index 49b0553ade40c77ab6503154564ab8f305ba23e9..adda4b8b29878a84453c0a61edffa59774878b98 100644 (file)
@@ -24,10 +24,17 @@ break_here_c (uint64_t value)
 {
 }
 
+__attribute__((target("arm")))
+uint64_t
+caller_trampoline (void)
+{
+  return caller ();
+}
+
 int
 main (void)
 {
-  uint64_t value = caller ();
+  uint64_t value = caller_trampoline ();
   break_here_c (value);
   return 0;
 }
index 49b0553ade40c77ab6503154564ab8f305ba23e9..adda4b8b29878a84453c0a61edffa59774878b98 100644 (file)
@@ -24,10 +24,17 @@ break_here_c (uint64_t value)
 {
 }
 
+__attribute__((target("arm")))
+uint64_t
+caller_trampoline (void)
+{
+  return caller ();
+}
+
 int
 main (void)
 {
-  uint64_t value = caller ();
+  uint64_t value = caller_trampoline ();
   break_here_c (value);
   return 0;
 }