[lldb] [lit] Introduce tests for writing x86 general-purpose registers

Introduce two initial tests for 'register write' command.  The tests
first clobber x86 general purpose registers, then call int3 to let lldb
write to them, then print the new values.  FileCheck takes care of
verifying whether correct values were written.

Differential Revision: https://reviews.llvm.org/D61221

llvm-svn: 359441
This commit is contained in:
Michal Gorny 2019-04-29 11:38:28 +00:00
parent eb279bcede
commit 8507d4f48a
4 changed files with 168 additions and 0 deletions

View File

@ -0,0 +1,55 @@
#include <cinttypes>
#include <cstdint>
#include <cstdio>
int main() {
constexpr uint64_t fill = 0x0F0F0F0F0F0F0F0F;
uint64_t rax, rbx, rcx, rdx, rsp, rbp, rsi, rdi;
asm volatile(
// save rsp & rbp
"movq %%rsp, %%mm0\n\t"
"movq %%rbp, %%mm1\n\t"
"\n\t"
"movq %8, %%rax\n\t"
"movq %8, %%rbx\n\t"
"movq %8, %%rcx\n\t"
"movq %8, %%rdx\n\t"
"movq %8, %%rsp\n\t"
"movq %8, %%rbp\n\t"
"movq %8, %%rsi\n\t"
"movq %8, %%rdi\n\t"
"\n\t"
"int3\n\t"
"\n\t"
"movq %%rax, %0\n\t"
"movq %%rbx, %1\n\t"
"movq %%rcx, %2\n\t"
"movq %%rdx, %3\n\t"
"movq %%rsp, %4\n\t"
"movq %%rbp, %5\n\t"
"movq %%rsi, %6\n\t"
"movq %%rdi, %7\n\t"
"\n\t"
// restore rsp & rbp
"movq %%mm0, %%rsp\n\t"
"movq %%mm1, %%rbp\n\t"
: "=r"(rax), "=r"(rbx), "=r"(rcx), "=r"(rdx), "=r"(rsp), "=r"(rbp),
"=r"(rsi), "=r"(rdi)
: "g"(fill)
: "%rax", "%rbx", "%rcx", "%rdx", "%rsp", "%rbp", "%rsi", "%rdi", "%mm0",
"%mm1"
);
printf("rax = 0x%016" PRIx64 "\n", rax);
printf("rbx = 0x%016" PRIx64 "\n", rbx);
printf("rcx = 0x%016" PRIx64 "\n", rcx);
printf("rdx = 0x%016" PRIx64 "\n", rdx);
printf("rsp = 0x%016" PRIx64 "\n", rsp);
printf("rbp = 0x%016" PRIx64 "\n", rbp);
printf("rsi = 0x%016" PRIx64 "\n", rsi);
printf("rdi = 0x%016" PRIx64 "\n", rdi);
return 0;
}

View File

@ -0,0 +1,61 @@
#include <cinttypes>
#include <cstdint>
#include <cstdio>
int main() {
constexpr uint32_t fill = 0x0F0F0F0F;
uint32_t eax, ebx, ecx, edx, esp, ebp, esi, edi;
asm volatile(
// save esp & ebp
"movd %%esp, %%mm0\n\t"
"movd %%ebp, %%mm1\n\t"
"\n\t"
"movl %8, %%eax\n\t"
"movl %8, %%ebx\n\t"
"movl %8, %%ecx\n\t"
"movl %8, %%edx\n\t"
"movl %8, %%esp\n\t"
"movl %8, %%ebp\n\t"
"movl %8, %%esi\n\t"
"movl %8, %%edi\n\t"
"\n\t"
"int3\n\t"
"\n\t"
// first save new esp & ebp, and restore their original values, so that
// we can output values via memory
"movd %%esp, %%mm2\n\t"
"movd %%ebp, %%mm3\n\t"
"movd %%mm0, %%esp\n\t"
"movd %%mm1, %%ebp\n\t"
"\n\t"
// output values via memory
"movl %%eax, %0\n\t"
"movl %%ebx, %1\n\t"
"movl %%ecx, %2\n\t"
"movl %%edx, %3\n\t"
"movl %%esi, %6\n\t"
"movl %%edi, %7\n\t"
"\n\t"
// output saved esp & ebp
"movd %%mm2, %4\n\t"
"movd %%mm3, %5\n\t"
: "=m"(eax), "=m"(ebx), "=m"(ecx), "=m"(edx), "=a"(esp), "=b"(ebp),
"=m"(esi), "=m"(edi)
: "i"(fill)
: "%ecx", "%edx", "%esp", "%ebp", "%esi", "%edi", "%mm0", "%mm1", "%mm2",
"%mm3"
);
printf("eax = 0x%08" PRIx32 "\n", eax);
printf("ebx = 0x%08" PRIx32 "\n", ebx);
printf("ecx = 0x%08" PRIx32 "\n", ecx);
printf("edx = 0x%08" PRIx32 "\n", edx);
printf("esp = 0x%08" PRIx32 "\n", esp);
printf("ebp = 0x%08" PRIx32 "\n", ebp);
printf("esi = 0x%08" PRIx32 "\n", esi);
printf("edi = 0x%08" PRIx32 "\n", edi);
return 0;
}

View File

@ -0,0 +1,26 @@
# XFAIL: system-windows
# REQUIRES: native && target-x86_64
# RUN: %clangxx -fomit-frame-pointer %p/Inputs/x86-64-gp-read.cpp -o %t
# RUN: %lldb -b -s %s %t | FileCheck %s
process launch
register write rax 0x0102030405060708
register write rbx 0x1112131415161718
register write rcx 0x2122232425262728
register write rdx 0x3132333435363738
register write rsp 0x4142434445464748
register write rbp 0x5152535455565758
register write rsi 0x6162636465666768
register write rdi 0x7172737475767778
process continue
# CHECK-DAG: rax = 0x0102030405060708
# CHECK-DAG: rbx = 0x1112131415161718
# CHECK-DAG: rcx = 0x2122232425262728
# CHECK-DAG: rdx = 0x3132333435363738
# CHECK-DAG: rsp = 0x4142434445464748
# CHECK-DAG: rbp = 0x5152535455565758
# CHECK-DAG: rsi = 0x6162636465666768
# CHECK-DAG: rdi = 0x7172737475767778
# CHECK: Process {{[0-9]+}} exited with status = 0

View File

@ -0,0 +1,26 @@
# XFAIL: system-windows
# REQUIRES: native && target-x86
# RUN: %clangxx -fomit-frame-pointer %p/Inputs/x86-64-gp-read.cpp -o %t
# RUN: %lldb -b -s %s %t | FileCheck %s
process launch
register write eax 0x01020304
register write ebx 0x11121314
register write ecx 0x21222324
register write edx 0x31323334
register write esp 0x41424344
register write ebp 0x51525354
register write esi 0x61626364
register write edi 0x71727374
process continue
# CHECK-DAG: eax = 0x01020304
# CHECK-DAG: ebx = 0x11121314
# CHECK-DAG: ecx = 0x21222324
# CHECK-DAG: edx = 0x31323334
# CHECK-DAG: esp = 0x41424344
# CHECK-DAG: ebp = 0x51525354
# CHECK-DAG: esi = 0x61626364
# CHECK-DAG: edi = 0x71727374
# CHECK: Process {{[0-9]+}} exited with status = 0