[Lldb-commits] [lldb] aa73ee0 - [lldb/test] Use inline assembly for instruction counting tests
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Fri Mar 6 02:05:21 PST 2020
Author: Pavel Labath
Date: 2020-03-06T11:05:07+01:00
New Revision: aa73ee052fffb0d06c6b7d8caf0271652c07a80d
URL: https://github.com/llvm/llvm-project/commit/aa73ee052fffb0d06c6b7d8caf0271652c07a80d
DIFF: https://github.com/llvm/llvm-project/commit/aa73ee052fffb0d06c6b7d8caf0271652c07a80d.diff
LOG: [lldb/test] Use inline assembly for instruction counting tests
We have a test which checks that instruction-step really steps one
instruction, but the way it checks this makes it very susceptible to
codegen changes. This rewrites the test inferior to use inline assembly,
which guarantees a known sequence of instructions that the test can
check. This does mean we have to write separate assembly for each
architecture, but that is no better than having architecture-specific
assertions, which the test was already starting to accumulate.
Added:
Modified:
lldb/test/API/tools/lldb-server/main.cpp
Removed:
################################################################################
diff --git a/lldb/test/API/tools/lldb-server/main.cpp b/lldb/test/API/tools/lldb-server/main.cpp
index 992288355f15..399b5e9033b4 100644
--- a/lldb/test/API/tools/lldb-server/main.cpp
+++ b/lldb/test/API/tools/lldb-server/main.cpp
@@ -150,11 +150,39 @@ static void signal_handler(int signo) {
}
static void swap_chars() {
+#if defined(__x86_64__) || defined(__i386__)
+ asm volatile("movb %1, (%2)\n\t"
+ "movb %0, (%3)\n\t"
+ "movb %0, (%2)\n\t"
+ "movb %1, (%3)\n\t"
+ :
+ : "i"('0'), "i"('1'), "r"(&g_c1), "r"(&g_c2)
+ : "memory");
+#elif defined(__aarch64__)
+ asm volatile("strb %w1, [%2]\n\t"
+ "strb %w0, [%3]\n\t"
+ "strb %w0, [%2]\n\t"
+ "strb %w1, [%3]\n\t"
+ :
+ : "r"('0'), "r"('1'), "r"(&g_c1), "r"(&g_c2)
+ : "memory");
+#elif defined(__arm__)
+ asm volatile("strb %1, [%2]\n\t"
+ "strb %0, [%3]\n\t"
+ "strb %0, [%2]\n\t"
+ "strb %1, [%3]\n\t"
+ :
+ : "r"('0'), "r"('1'), "r"(&g_c1), "r"(&g_c2)
+ : "memory");
+#else
+#warning This may generate unpredictible assembly and cause the single-stepping test to fail.
+#warning Please add appropriate assembly for your target.
g_c1 = '1';
g_c2 = '0';
g_c1 = '0';
g_c2 = '1';
+#endif
}
static void hello() {
More information about the lldb-commits
mailing list