[Lldb-commits] [lldb] e414ede - [lldb] [test/Register] Initial tests for regsets in core dumps
Michał Górny via lldb-commits
lldb-commits at lists.llvm.org
Wed Apr 21 10:41:16 PDT 2021
Author: Michał Górny
Date: 2021-04-21T19:41:09+02:00
New Revision: e414ede2cd54b03f3ff7d547132f06d1b836e5bb
URL: https://github.com/llvm/llvm-project/commit/e414ede2cd54b03f3ff7d547132f06d1b836e5bb
DIFF: https://github.com/llvm/llvm-project/commit/e414ede2cd54b03f3ff7d547132f06d1b836e5bb.diff
LOG: [lldb] [test/Register] Initial tests for regsets in core dumps
Add initial tests for reading register sets from core dumps. This
includes a C++ program to write registers and dump core, resulting core
dumps for Linux, FreeBSD and NetBSD, and the tests to verify them.
The tests are split into generic part, verifying user-specified register
values, and coredump-specific tests that verify memory addresses that
differ for every dump.
At this moment, all platforms support GPRs and FPRs up to XMM for amd64
target. The i386 target does not work on NetBSD at all, and is missing
FPRs entirely on FreeBSD.
Differential Revision: https://reviews.llvm.org/D91963
Added:
lldb/test/Shell/Register/Core/Inputs/strip-coredump.py
lldb/test/Shell/Register/Core/Inputs/x86-32-freebsd.core
lldb/test/Shell/Register/Core/Inputs/x86-32-gp.check
lldb/test/Shell/Register/Core/Inputs/x86-32-linux.core
lldb/test/Shell/Register/Core/Inputs/x86-32-netbsd.core
lldb/test/Shell/Register/Core/Inputs/x86-64-freebsd.core
lldb/test/Shell/Register/Core/Inputs/x86-64-gp-hixmm.check
lldb/test/Shell/Register/Core/Inputs/x86-64-linux.core
lldb/test/Shell/Register/Core/Inputs/x86-64-netbsd.core
lldb/test/Shell/Register/Core/Inputs/x86-core-dump.cpp
lldb/test/Shell/Register/Core/Inputs/x86-fp.check
lldb/test/Shell/Register/Core/x86-32-freebsd-addr.test
lldb/test/Shell/Register/Core/x86-32-freebsd-gp.test
lldb/test/Shell/Register/Core/x86-32-linux-addr.test
lldb/test/Shell/Register/Core/x86-32-linux-fp.test
lldb/test/Shell/Register/Core/x86-32-linux-gp.test
lldb/test/Shell/Register/Core/x86-64-freebsd-addr.test
lldb/test/Shell/Register/Core/x86-64-freebsd-fp.test
lldb/test/Shell/Register/Core/x86-64-freebsd-gp.test
lldb/test/Shell/Register/Core/x86-64-linux-addr.test
lldb/test/Shell/Register/Core/x86-64-linux-fp.test
lldb/test/Shell/Register/Core/x86-64-linux-gp.test
lldb/test/Shell/Register/Core/x86-64-netbsd-addr.test
lldb/test/Shell/Register/Core/x86-64-netbsd-fp.test
lldb/test/Shell/Register/Core/x86-64-netbsd-gp.test
Modified:
Removed:
################################################################################
diff --git a/lldb/test/Shell/Register/Core/Inputs/strip-coredump.py b/lldb/test/Shell/Register/Core/Inputs/strip-coredump.py
new file mode 100755
index 0000000000000..8908c835641fd
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/Inputs/strip-coredump.py
@@ -0,0 +1,69 @@
+#!/usr/bin/env python
+# Strip unnecessary data from a core dump to reduce its size.
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+
+import argparse
+import os.path
+import sys
+import tempfile
+
+from elftools.elf.elffile import ELFFile
+
+
+def strip_non_notes(elf, inf, outf):
+ next_segment_offset = min(x.header.p_offset for x in elf.iter_segments())
+ copy_segments = filter(lambda x: x.header.p_type == "PT_NOTE",
+ elf.iter_segments())
+
+ # first copy the headers
+ inf.seek(0)
+ outf.write(inf.read(next_segment_offset))
+
+ for seg in copy_segments:
+ assert seg.header.p_filesz > 0
+
+ inf.seek(seg.header.p_offset)
+ # fill the area between last write and new offset with zeros
+ outf.seek(seg.header.p_offset)
+
+ # now copy the segment
+ outf.write(inf.read(seg.header.p_filesz))
+
+
+def main():
+ argp = argparse.ArgumentParser()
+ action = argp.add_mutually_exclusive_group(required=True)
+ action.add_argument("--strip-non-notes",
+ action="store_const",
+ const=strip_non_notes,
+ dest="action",
+ help="Strip all segments except for notes")
+ argp.add_argument("elf",
+ help="ELF file to strip (in place)",
+ nargs='+')
+ args = argp.parse_args()
+
+ for path in args.elf:
+ with open(path, "rb") as f:
+ elf = ELFFile(f)
+ # we do not support copying the section table now
+ assert elf.num_sections() == 0
+
+ tmpf = tempfile.NamedTemporaryFile(dir=os.path.dirname(path),
+ delete=False)
+ try:
+ args.action(elf, f, tmpf)
+ except:
+ os.unlink(tmpf.name)
+ raise
+ else:
+ os.rename(tmpf.name, path)
+
+ return 0
+
+
+if __name__ == "__main__":
+ sys.exit(main())
diff --git a/lldb/test/Shell/Register/Core/Inputs/x86-32-freebsd.core b/lldb/test/Shell/Register/Core/Inputs/x86-32-freebsd.core
new file mode 100644
index 0000000000000..ae4e0d9f9cc00
Binary files /dev/null and b/lldb/test/Shell/Register/Core/Inputs/x86-32-freebsd.core
diff er
diff --git a/lldb/test/Shell/Register/Core/Inputs/x86-32-gp.check b/lldb/test/Shell/Register/Core/Inputs/x86-32-gp.check
new file mode 100644
index 0000000000000..b790d7f4ad197
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/Inputs/x86-32-gp.check
@@ -0,0 +1,24 @@
+# CHECK-DAG: eax = 0x23222120
+# CHECK-DAG: ebx = 0x24232221
+# CHECK-DAG: ecx = 0x25242322
+# CHECK-DAG: edx = 0x26252423
+# CHECK-DAG: edi = 0x2a292827
+# CHECK-DAG: esi = 0x29282726
+# CHECK-DAG: ebp = 0x28272625
+# CHECK-DAG: esp = 0x27262524
+# CHECK-DAG: ax = 0x2120
+# CHECK-DAG: bx = 0x2221
+# CHECK-DAG: cx = 0x2322
+# CHECK-DAG: dx = 0x2423
+# CHECK-DAG: di = 0x2827
+# CHECK-DAG: si = 0x2726
+# CHECK-DAG: bp = 0x2625
+# CHECK-DAG: sp = 0x2524
+# CHECK-DAG: ah = 0x21
+# CHECK-DAG: bh = 0x22
+# CHECK-DAG: ch = 0x23
+# CHECK-DAG: dh = 0x24
+# CHECK-DAG: al = 0x20
+# CHECK-DAG: bl = 0x21
+# CHECK-DAG: cl = 0x22
+# CHECK-DAG: dl = 0x23
diff --git a/lldb/test/Shell/Register/Core/Inputs/x86-32-linux.core b/lldb/test/Shell/Register/Core/Inputs/x86-32-linux.core
new file mode 100644
index 0000000000000..8d02ff1ee3e8f
Binary files /dev/null and b/lldb/test/Shell/Register/Core/Inputs/x86-32-linux.core
diff er
diff --git a/lldb/test/Shell/Register/Core/Inputs/x86-32-netbsd.core b/lldb/test/Shell/Register/Core/Inputs/x86-32-netbsd.core
new file mode 100644
index 0000000000000..8dde6b365bac6
Binary files /dev/null and b/lldb/test/Shell/Register/Core/Inputs/x86-32-netbsd.core
diff er
diff --git a/lldb/test/Shell/Register/Core/Inputs/x86-64-freebsd.core b/lldb/test/Shell/Register/Core/Inputs/x86-64-freebsd.core
new file mode 100644
index 0000000000000..250794e737d45
Binary files /dev/null and b/lldb/test/Shell/Register/Core/Inputs/x86-64-freebsd.core
diff er
diff --git a/lldb/test/Shell/Register/Core/Inputs/x86-64-gp-hixmm.check b/lldb/test/Shell/Register/Core/Inputs/x86-64-gp-hixmm.check
new file mode 100644
index 0000000000000..ef0e23ac2ed9a
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/Inputs/x86-64-gp-hixmm.check
@@ -0,0 +1,77 @@
+# CHECK-DAG: rax = 0x2726252423222120
+# CHECK-DAG: rbx = 0x2827262524232221
+# CHECK-DAG: rcx = 0x2928272625242322
+# CHECK-DAG: rdx = 0x2a29282726252423
+# CHECK-DAG: rdi = 0x2e2d2c2b2a292827
+# CHECK-DAG: rsi = 0x2d2c2b2a29282726
+# CHECK-DAG: rbp = 0x2c2b2a2928272625
+# CHECK-DAG: rsp = 0x2b2a292827262524
+# CHECK-DAG: r8 = 0x2f2e2d2c2b2a2928
+# CHECK-DAG: r9 = 0x302f2e2d2c2b2a29
+# CHECK-DAG: r10 = 0x31302f2e2d2c2b2a
+# CHECK-DAG: r11 = 0x3231302f2e2d2c2b
+# CHECK-DAG: r12 = 0x333231302f2e2d2c
+# CHECK-DAG: r13 = 0x34333231302f2e2d
+# CHECK-DAG: r14 = 0x3534333231302f2e
+# CHECK-DAG: r15 = 0x363534333231302f
+# CHECK-DAG: eax = 0x23222120
+# CHECK-DAG: ebx = 0x24232221
+# CHECK-DAG: ecx = 0x25242322
+# CHECK-DAG: edx = 0x26252423
+# CHECK-DAG: edi = 0x2a292827
+# CHECK-DAG: esi = 0x29282726
+# CHECK-DAG: ebp = 0x28272625
+# CHECK-DAG: esp = 0x27262524
+# CHECK-DAG: r8d = 0x2b2a2928
+# CHECK-DAG: r9d = 0x2c2b2a29
+# CHECK-DAG: r10d = 0x2d2c2b2a
+# CHECK-DAG: r11d = 0x2e2d2c2b
+# CHECK-DAG: r12d = 0x2f2e2d2c
+# CHECK-DAG: r13d = 0x302f2e2d
+# CHECK-DAG: r14d = 0x31302f2e
+# CHECK-DAG: r15d = 0x3231302f
+# CHECK-DAG: ax = 0x2120
+# CHECK-DAG: bx = 0x2221
+# CHECK-DAG: cx = 0x2322
+# CHECK-DAG: dx = 0x2423
+# CHECK-DAG: di = 0x2827
+# CHECK-DAG: si = 0x2726
+# CHECK-DAG: bp = 0x2625
+# CHECK-DAG: sp = 0x2524
+# CHECK-DAG: r8w = 0x2928
+# CHECK-DAG: r9w = 0x2a29
+# CHECK-DAG: r10w = 0x2b2a
+# CHECK-DAG: r11w = 0x2c2b
+# CHECK-DAG: r12w = 0x2d2c
+# CHECK-DAG: r13w = 0x2e2d
+# CHECK-DAG: r14w = 0x2f2e
+# CHECK-DAG: r15w = 0x302f
+# CHECK-DAG: ah = 0x21
+# CHECK-DAG: bh = 0x22
+# CHECK-DAG: ch = 0x23
+# CHECK-DAG: dh = 0x24
+# CHECK-DAG: al = 0x20
+# CHECK-DAG: bl = 0x21
+# CHECK-DAG: cl = 0x22
+# CHECK-DAG: dl = 0x23
+# CHECK-DAG: dil = 0x27
+# CHECK-DAG: sil = 0x26
+# CHECK-DAG: bpl = 0x25
+# CHECK-DAG: spl = 0x24
+# CHECK-DAG: r8l = 0x28
+# CHECK-DAG: r9l = 0x29
+# CHECK-DAG: r10l = 0x2a
+# CHECK-DAG: r11l = 0x2b
+# CHECK-DAG: r12l = 0x2c
+# CHECK-DAG: r13l = 0x2d
+# CHECK-DAG: r14l = 0x2e
+# CHECK-DAG: r15l = 0x2f
+
+# CHECK-DAG: xmm8 = {0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17}
+# CHECK-DAG: xmm9 = {0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18}
+# CHECK-DAG: xmm10 = {0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19}
+# CHECK-DAG: xmm11 = {0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a}
+# CHECK-DAG: xmm12 = {0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b}
+# CHECK-DAG: xmm13 = {0x0d 0x0e 0x0f 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c}
+# CHECK-DAG: xmm14 = {0x0e 0x0f 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d}
+# CHECK-DAG: xmm15 = {0x0f 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e}
diff --git a/lldb/test/Shell/Register/Core/Inputs/x86-64-linux.core b/lldb/test/Shell/Register/Core/Inputs/x86-64-linux.core
new file mode 100644
index 0000000000000..44222846cad43
Binary files /dev/null and b/lldb/test/Shell/Register/Core/Inputs/x86-64-linux.core
diff er
diff --git a/lldb/test/Shell/Register/Core/Inputs/x86-64-netbsd.core b/lldb/test/Shell/Register/Core/Inputs/x86-64-netbsd.core
new file mode 100644
index 0000000000000..a14b5cb0b0acd
Binary files /dev/null and b/lldb/test/Shell/Register/Core/Inputs/x86-64-netbsd.core
diff er
diff --git a/lldb/test/Shell/Register/Core/Inputs/x86-core-dump.cpp b/lldb/test/Shell/Register/Core/Inputs/x86-core-dump.cpp
new file mode 100644
index 0000000000000..f6183a57bd5fe
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/Inputs/x86-core-dump.cpp
@@ -0,0 +1,324 @@
+// This program is used to generate a core dump for testing register dumps.
+// The exact set of registers dumped depends on the instruction sets enabled
+// via compiler flags.
+
+#include <cstdint>
+
+struct alignas(64) zmm_t {
+ uint64_t a, b, c, d, e, f, g, h;
+};
+
+struct alignas(16) float80_raw {
+ uint64_t mantissa;
+ uint16_t sign_exp;
+};
+
+int main() {
+ // test data for xmm, ymm and zmm registers
+ constexpr zmm_t zmm[] = {
+ { 0x0706050403020100, 0x0F0E0D0C0B0A0908,
+ 0x1716151413121110, 0x1F1E1D1C1B1A1918,
+ 0x2726252423222120, 0x2F2E2D2C2B2A2928,
+ 0x3736353433323130, 0x3F3E3D3C3B3A3938, },
+ { 0x0807060504030201, 0x100F0E0D0C0B0A09,
+ 0x1817161514131211, 0x201F1E1D1C1B1A19,
+ 0x2827262524232221, 0x302F2E2D2C2B2A29,
+ 0x3837363534333231, 0x403F3E3D3C3B3A39, },
+ { 0x0908070605040302, 0x11100F0E0D0C0B0A,
+ 0x1918171615141312, 0x21201F1E1D1C1B1A,
+ 0x2928272625242322, 0x31302F2E2D2C2B2A,
+ 0x3938373635343332, 0x41403F3E3D3C3B3A, },
+ { 0x0A09080706050403, 0x1211100F0E0D0C0B,
+ 0x1A19181716151413, 0x2221201F1E1D1C1B,
+ 0x2A29282726252423, 0x3231302F2E2D2C2B,
+ 0x3A39383736353433, 0x4241403F3E3D3C3B, },
+ { 0x0B0A090807060504, 0x131211100F0E0D0C,
+ 0x1B1A191817161514, 0x232221201F1E1D1C,
+ 0x2B2A292827262524, 0x333231302F2E2D2C,
+ 0x3B3A393837363534, 0x434241403F3E3D3C, },
+ { 0x0C0B0A0908070605, 0x14131211100F0E0D,
+ 0x1C1B1A1918171615, 0x24232221201F1E1D,
+ 0x2C2B2A2928272625, 0x34333231302F2E2D,
+ 0x3C3B3A3938373635, 0x44434241403F3E3D, },
+ { 0x0D0C0B0A09080706, 0x1514131211100F0E,
+ 0x1D1C1B1A19181716, 0x2524232221201F1E,
+ 0x2D2C2B2A29282726, 0x3534333231302F2E,
+ 0x3D3C3B3A39383736, 0x4544434241403F3E, },
+ { 0x0E0D0C0B0A090807, 0x161514131211100F,
+ 0x1E1D1C1B1A191817, 0x262524232221201F,
+ 0x2E2D2C2B2A292827, 0x363534333231302F,
+ 0x3E3D3C3B3A393837, 0x464544434241403F, },
+#if defined(__x86_64__) || defined(_M_X64)
+ { 0x0F0E0D0C0B0A0908, 0x1716151413121110,
+ 0x1F1E1D1C1B1A1918, 0x2726252423222120,
+ 0x2F2E2D2C2B2A2928, 0x3736353433323130,
+ 0x3F3E3D3C3B3A3938, 0x4746454443424140, },
+ { 0x100F0E0D0C0B0A09, 0x1817161514131211,
+ 0x201F1E1D1C1B1A19, 0x2827262524232221,
+ 0x302F2E2D2C2B2A29, 0x3837363534333231,
+ 0x403F3E3D3C3B3A39, 0x4847464544434241, },
+ { 0x11100F0E0D0C0B0A, 0x1918171615141312,
+ 0x21201F1E1D1C1B1A, 0x2928272625242322,
+ 0x31302F2E2D2C2B2A, 0x3938373635343332,
+ 0x41403F3E3D3C3B3A, 0x4948474645444342, },
+ { 0x1211100F0E0D0C0B, 0x1A19181716151413,
+ 0x2221201F1E1D1C1B, 0x2A29282726252423,
+ 0x3231302F2E2D2C2B, 0x3A39383736353433,
+ 0x4241403F3E3D3C3B, 0x4A49484746454443, },
+ { 0x131211100F0E0D0C, 0x1B1A191817161514,
+ 0x232221201F1E1D1C, 0x2B2A292827262524,
+ 0x333231302F2E2D2C, 0x3B3A393837363534,
+ 0x434241403F3E3D3C, 0x4B4A494847464544, },
+ { 0x14131211100F0E0D, 0x1C1B1A1918171615,
+ 0x24232221201F1E1D, 0x2C2B2A2928272625,
+ 0x34333231302F2E2D, 0x3C3B3A3938373635,
+ 0x44434241403F3E3D, 0x4C4B4A4948474645, },
+ { 0x1514131211100F0E, 0x1D1C1B1A19181716,
+ 0x2524232221201F1E, 0x2D2C2B2A29282726,
+ 0x3534333231302F2E, 0x3D3C3B3A39383736,
+ 0x4544434241403F3E, 0x4D4C4B4A49484746, },
+ { 0x161514131211100F, 0x1E1D1C1B1A191817,
+ 0x262524232221201F, 0x2E2D2C2B2A292827,
+ 0x363534333231302F, 0x3E3D3C3B3A393837,
+ 0x464544434241403F, 0x4E4D4C4B4A494847, },
+ { 0x1716151413121110, 0x1F1E1D1C1B1A1918,
+ 0x2726252423222120, 0x2F2E2D2C2B2A2928,
+ 0x3736353433323130, 0x3F3E3D3C3B3A3938,
+ 0x4746454443424140, 0x4F4E4D4C4B4A4948, },
+ { 0x1817161514131211, 0x201F1E1D1C1B1A19,
+ 0x2827262524232221, 0x302F2E2D2C2B2A29,
+ 0x3837363534333231, 0x403F3E3D3C3B3A39,
+ 0x4847464544434241, 0x504F4E4D4C4B4A49, },
+ { 0x1918171615141312, 0x21201F1E1D1C1B1A,
+ 0x2928272625242322, 0x31302F2E2D2C2B2A,
+ 0x3938373635343332, 0x41403F3E3D3C3B3A,
+ 0x4948474645444342, 0x51504F4E4D4C4B4A, },
+ { 0x1A19181716151413, 0x2221201F1E1D1C1B,
+ 0x2A29282726252423, 0x3231302F2E2D2C2B,
+ 0x3A39383736353433, 0x4241403F3E3D3C3B,
+ 0x4A49484746454443, 0x5251504F4E4D4C4B, },
+ { 0x1B1A191817161514, 0x232221201F1E1D1C,
+ 0x2B2A292827262524, 0x333231302F2E2D2C,
+ 0x3B3A393837363534, 0x434241403F3E3D3C,
+ 0x4B4A494847464544, 0x535251504F4E4D4C, },
+ { 0x1C1B1A1918171615, 0x24232221201F1E1D,
+ 0x2C2B2A2928272625, 0x34333231302F2E2D,
+ 0x3C3B3A3938373635, 0x44434241403F3E3D,
+ 0x4C4B4A4948474645, 0x54535251504F4E4D, },
+ { 0x1D1C1B1A19181716, 0x2524232221201F1E,
+ 0x2D2C2B2A29282726, 0x3534333231302F2E,
+ 0x3D3C3B3A39383736, 0x4544434241403F3E,
+ 0x4D4C4B4A49484746, 0x5554535251504F4E, },
+ { 0x1E1D1C1B1A191817, 0x262524232221201F,
+ 0x2E2D2C2B2A292827, 0x363534333231302F,
+ 0x3E3D3C3B3A393837, 0x464544434241403F,
+ 0x4E4D4C4B4A494847, 0x565554535251504F, },
+ { 0x1F1E1D1C1B1A1918, 0x2726252423222120,
+ 0x2F2E2D2C2B2A2928, 0x3736353433323130,
+ 0x3F3E3D3C3B3A3938, 0x4746454443424140,
+ 0x4F4E4D4C4B4A4948, 0x5756555453525150, },
+ { 0x201F1E1D1C1B1A19, 0x2827262524232221,
+ 0x302F2E2D2C2B2A29, 0x3837363534333231,
+ 0x403F3E3D3C3B3A39, 0x4847464544434241,
+ 0x504F4E4D4C4B4A49, 0x5857565554535251, },
+ { 0x21201F1E1D1C1B1A, 0x2928272625242322,
+ 0x31302F2E2D2C2B2A, 0x3938373635343332,
+ 0x41403F3E3D3C3B3A, 0x4948474645444342,
+ 0x51504F4E4D4C4B4A, 0x5958575655545352, },
+ { 0x2221201F1E1D1C1B, 0x2A29282726252423,
+ 0x3231302F2E2D2C2B, 0x3A39383736353433,
+ 0x4241403F3E3D3C3B, 0x4A49484746454443,
+ 0x5251504F4E4D4C4B, 0x5A59585756555453, },
+ { 0x232221201F1E1D1C, 0x2B2A292827262524,
+ 0x333231302F2E2D2C, 0x3B3A393837363534,
+ 0x434241403F3E3D3C, 0x4B4A494847464544,
+ 0x535251504F4E4D4C, 0x5B5A595857565554, },
+ { 0x24232221201F1E1D, 0x2C2B2A2928272625,
+ 0x34333231302F2E2D, 0x3C3B3A3938373635,
+ 0x44434241403F3E3D, 0x4C4B4A4948474645,
+ 0x54535251504F4E4D, 0x5C5B5A5958575655, },
+ { 0x2524232221201F1E, 0x2D2C2B2A29282726,
+ 0x3534333231302F2E, 0x3D3C3B3A39383736,
+ 0x4544434241403F3E, 0x4D4C4B4A49484746,
+ 0x5554535251504F4E, 0x5D5C5B5A59585756, },
+ { 0x262524232221201F, 0x2E2D2C2B2A292827,
+ 0x363534333231302F, 0x3E3D3C3B3A393837,
+ 0x464544434241403F, 0x4E4D4C4B4A494847,
+ 0x565554535251504F, 0x5E5D5C5B5A595857, },
+#endif
+ };
+
+ // test data for FPU registers
+ float80_raw st[] = {
+ {0x8000000000000000, 0x4000}, // +2.0
+ {0x3f00000000000000, 0x0000}, // 1.654785e-4932 (denormal)
+ {0x0000000000000000, 0x0000}, // +0
+ {0x0000000000000000, 0x8000}, // -0
+ {0x8000000000000000, 0x7fff}, // +inf
+ {0x8000000000000000, 0xffff}, // -inf
+ {0xc000000000000000, 0xffff}, // nan
+ // st7 will be freed to test tag word better
+ {0x0000000000000000, 0x0000}, // +0
+ };
+
+ // unmask divide-by-zero exception
+ uint16_t cw = 0x037b;
+ // used as single-precision float
+ uint32_t zero = 0;
+
+ // test data for GP registers
+ const uint64_t gpr[] = {
+ 0x2726252423222120,
+ 0x2827262524232221,
+ 0x2928272625242322,
+ 0x2A29282726252423,
+ 0x2B2A292827262524,
+ 0x2C2B2A2928272625,
+ 0x2D2C2B2A29282726,
+ 0x2E2D2C2B2A292827,
+ 0x2F2E2D2C2B2A2928,
+ 0x302F2E2D2C2B2A29,
+ 0x31302F2E2D2C2B2A,
+ 0x3231302F2E2D2C2B,
+ 0x333231302F2E2D2C,
+ 0x34333231302F2E2D,
+ 0x3534333231302F2E,
+ 0x363534333231302F,
+ };
+
+ asm volatile(
+ // fill the highest register set supported -- ZMM, YMM or XMM
+#if defined(__AVX512F__)
+ "vmovaps 0x000(%0), %%zmm0\n\t"
+ "vmovaps 0x040(%0), %%zmm1\n\t"
+ "vmovaps 0x080(%0), %%zmm2\n\t"
+ "vmovaps 0x0C0(%0), %%zmm3\n\t"
+ "vmovaps 0x100(%0), %%zmm4\n\t"
+ "vmovaps 0x140(%0), %%zmm5\n\t"
+ "vmovaps 0x180(%0), %%zmm6\n\t"
+ "vmovaps 0x1C0(%0), %%zmm7\n\t"
+#if defined(__x86_64__) || defined(_M_X64)
+ "vmovaps 0x200(%0), %%zmm8\n\t"
+ "vmovaps 0x240(%0), %%zmm9\n\t"
+ "vmovaps 0x280(%0), %%zmm10\n\t"
+ "vmovaps 0x2C0(%0), %%zmm11\n\t"
+ "vmovaps 0x300(%0), %%zmm12\n\t"
+ "vmovaps 0x340(%0), %%zmm13\n\t"
+ "vmovaps 0x380(%0), %%zmm14\n\t"
+ "vmovaps 0x3C0(%0), %%zmm15\n\t"
+ "vmovaps 0x400(%0), %%zmm16\n\t"
+ "vmovaps 0x440(%0), %%zmm17\n\t"
+ "vmovaps 0x480(%0), %%zmm18\n\t"
+ "vmovaps 0x4C0(%0), %%zmm19\n\t"
+ "vmovaps 0x500(%0), %%zmm20\n\t"
+ "vmovaps 0x540(%0), %%zmm21\n\t"
+ "vmovaps 0x580(%0), %%zmm22\n\t"
+ "vmovaps 0x5C0(%0), %%zmm23\n\t"
+ "vmovaps 0x600(%0), %%zmm24\n\t"
+ "vmovaps 0x640(%0), %%zmm25\n\t"
+ "vmovaps 0x680(%0), %%zmm26\n\t"
+ "vmovaps 0x6C0(%0), %%zmm27\n\t"
+ "vmovaps 0x700(%0), %%zmm28\n\t"
+ "vmovaps 0x740(%0), %%zmm29\n\t"
+ "vmovaps 0x780(%0), %%zmm30\n\t"
+ "vmovaps 0x7C0(%0), %%zmm31\n\t"
+#endif // defined(__x86_64__) || defined(_M_X64)
+#elif defined(__AVX__)
+ "vmovaps 0x000(%0), %%ymm0\n\t"
+ "vmovaps 0x040(%0), %%ymm1\n\t"
+ "vmovaps 0x080(%0), %%ymm2\n\t"
+ "vmovaps 0x0C0(%0), %%ymm3\n\t"
+ "vmovaps 0x100(%0), %%ymm4\n\t"
+ "vmovaps 0x140(%0), %%ymm5\n\t"
+ "vmovaps 0x180(%0), %%ymm6\n\t"
+ "vmovaps 0x1C0(%0), %%ymm7\n\t"
+#if defined(__x86_64__) || defined(_M_X64)
+ "vmovaps 0x200(%0), %%ymm8\n\t"
+ "vmovaps 0x240(%0), %%ymm9\n\t"
+ "vmovaps 0x280(%0), %%ymm10\n\t"
+ "vmovaps 0x2C0(%0), %%ymm11\n\t"
+ "vmovaps 0x300(%0), %%ymm12\n\t"
+ "vmovaps 0x340(%0), %%ymm13\n\t"
+ "vmovaps 0x380(%0), %%ymm14\n\t"
+ "vmovaps 0x3C0(%0), %%ymm15\n\t"
+#endif // defined(__x86_64__) || defined(_M_X64)
+#else // !defined(__AVX__)
+ "movaps 0x000(%0), %%xmm0\n\t"
+ "movaps 0x040(%0), %%xmm1\n\t"
+ "movaps 0x080(%0), %%xmm2\n\t"
+ "movaps 0x0C0(%0), %%xmm3\n\t"
+ "movaps 0x100(%0), %%xmm4\n\t"
+ "movaps 0x140(%0), %%xmm5\n\t"
+ "movaps 0x180(%0), %%xmm6\n\t"
+ "movaps 0x1C0(%0), %%xmm7\n\t"
+#if defined(__x86_64__) || defined(_M_X64)
+ "movaps 0x200(%0), %%xmm8\n\t"
+ "movaps 0x240(%0), %%xmm9\n\t"
+ "movaps 0x280(%0), %%xmm10\n\t"
+ "movaps 0x2C0(%0), %%xmm11\n\t"
+ "movaps 0x300(%0), %%xmm12\n\t"
+ "movaps 0x340(%0), %%xmm13\n\t"
+ "movaps 0x380(%0), %%xmm14\n\t"
+ "movaps 0x3C0(%0), %%xmm15\n\t"
+#endif // defined(__x86_64__) || defined(_M_X64)
+#endif
+ "\n\t"
+
+ // fill FPU registers
+ "finit\n\t"
+ "fldcw %2\n\t"
+ // load on stack in reverse order to make the result easier to read
+ "fldt 0x70(%1)\n\t"
+ "fldt 0x60(%1)\n\t"
+ "fldt 0x50(%1)\n\t"
+ "fldt 0x40(%1)\n\t"
+ "fldt 0x30(%1)\n\t"
+ "fldt 0x20(%1)\n\t"
+ "fldt 0x10(%1)\n\t"
+ "fldt 0x00(%1)\n\t"
+ // free st7
+ "ffree %%st(7)\n\t"
+ // this should trigger a divide-by-zero
+ "fdivs (%3)\n\t"
+ "\n\t"
+
+ // fill GP registers
+ // note that this invalidates all parameters
+#if defined(__x86_64__) || defined(_M_X64)
+ "movq 0x78(%4), %%r15\n\t"
+ "movq 0x70(%4), %%r14\n\t"
+ "movq 0x68(%4), %%r13\n\t"
+ "movq 0x60(%4), %%r12\n\t"
+ "movq 0x58(%4), %%r11\n\t"
+ "movq 0x50(%4), %%r10\n\t"
+ "movq 0x48(%4), %%r9\n\t"
+ "movq 0x40(%4), %%r8\n\t"
+ "movq 0x38(%4), %%rdi\n\t"
+ "movq 0x30(%4), %%rsi\n\t"
+ "movq 0x28(%4), %%rbp\n\t"
+ "movq 0x20(%4), %%rsp\n\t"
+ "movq 0x18(%4), %%rdx\n\t"
+ "movq 0x10(%4), %%rcx\n\t"
+ "movq 0x08(%4), %%rbx\n\t"
+ "movq 0x00(%4), %%rax\n\t"
+#else // !(defined(__x86_64__) || defined(_M_X64))
+ "movl 0x38(%4), %%edi\n\t"
+ "movl 0x30(%4), %%esi\n\t"
+ "movl 0x28(%4), %%ebp\n\t"
+ "movl 0x20(%4), %%esp\n\t"
+ "movl 0x18(%4), %%edx\n\t"
+ "movl 0x10(%4), %%ecx\n\t"
+ "movl 0x08(%4), %%ebx\n\t"
+ "movl 0x00(%4), %%eax\n\t"
+#endif
+ "\n\t"
+
+ // trigger SEGV
+ "movl %%eax, 0\n\t"
+ :
+ : "b"(zmm), "c"(st), "m"(cw), "d"(&zero), "a"(gpr)
+ : // clobbers do not really matter since we crash
+ );
+
+ return 0;
+}
diff --git a/lldb/test/Shell/Register/Core/Inputs/x86-fp.check b/lldb/test/Shell/Register/Core/Inputs/x86-fp.check
new file mode 100644
index 0000000000000..b71f328a20ac6
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/Inputs/x86-fp.check
@@ -0,0 +1,30 @@
+# CHECK-DAG: fctrl = 0x037b
+# CHECK-DAG: fstat = 0x8084
+# CHECK-DAG: ftag = 0x007f
+# CHECK-DAG: fop = 0x0032
+# CHECK-DAG: mxcsr = 0x00001f80
+# CHECK-DAG: mxcsrmask = 0x0002ffff
+# CHECK-DAG: st0 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0x00 0x40}
+# CHECK-DAG: st1 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x3f 0x00 0x00}
+# CHECK-DAG: st2 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
+# CHECK-DAG: st3 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80}
+# CHECK-DAG: st4 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0xff 0x7f}
+# CHECK-DAG: st5 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x80 0xff 0xff}
+# CHECK-DAG: st6 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xc0 0xff 0xff}
+# CHECK-DAG: st7 = {0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00}
+# CHECK-DAG: mm0 = 0x8000000000000000
+# CHECK-DAG: mm1 = 0x3f00000000000000
+# CHECK-DAG: mm2 = 0x0000000000000000
+# CHECK-DAG: mm3 = 0x0000000000000000
+# CHECK-DAG: mm4 = 0x8000000000000000
+# CHECK-DAG: mm5 = 0x8000000000000000
+# CHECK-DAG: mm6 = 0xc000000000000000
+# CHECK-DAG: mm7 = 0x0000000000000000
+# CHECK-DAG: xmm0 = {0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f}
+# CHECK-DAG: xmm1 = {0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10}
+# CHECK-DAG: xmm2 = {0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11}
+# CHECK-DAG: xmm3 = {0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12}
+# CHECK-DAG: xmm4 = {0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12 0x13}
+# CHECK-DAG: xmm5 = {0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12 0x13 0x14}
+# CHECK-DAG: xmm6 = {0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12 0x13 0x14 0x15}
+# CHECK-DAG: xmm7 = {0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f 0x10 0x11 0x12 0x13 0x14 0x15 0x16}
diff --git a/lldb/test/Shell/Register/Core/x86-32-freebsd-addr.test b/lldb/test/Shell/Register/Core/x86-32-freebsd-addr.test
new file mode 100644
index 0000000000000..c5a705f481a0b
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/x86-32-freebsd-addr.test
@@ -0,0 +1,13 @@
+# RUN: %lldb -b -s %s -c %p/Inputs/x86-32-freebsd.core | FileCheck %s
+
+register read --all
+# CHECK-DAG: eip = 0x00401c6b
+# CHECK-DAG: eflags = 0x00010246
+# CHECK-DAG: cs = 0x00000033
+# CHECK-DAG: fs = 0x00000013
+# CHECK-DAG: gs = 0x0000001b
+# CHECK-DAG: ss = 0x0000003b
+# CHECK-DAG: ds = 0x0000003b
+# CHECK-DAG: es = 0x0000003b
+
+# TODO: fix reading fp registers
diff --git a/lldb/test/Shell/Register/Core/x86-32-freebsd-gp.test b/lldb/test/Shell/Register/Core/x86-32-freebsd-gp.test
new file mode 100644
index 0000000000000..6cb6c7aa0139e
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/x86-32-freebsd-gp.test
@@ -0,0 +1,3 @@
+# RUN: %lldb -b -s %s -c %p/Inputs/x86-32-freebsd.core | FileCheck %p/Inputs/x86-32-gp.check
+
+register read --all
diff --git a/lldb/test/Shell/Register/Core/x86-32-linux-addr.test b/lldb/test/Shell/Register/Core/x86-32-linux-addr.test
new file mode 100644
index 0000000000000..a926cd193dc5e
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/x86-32-linux-addr.test
@@ -0,0 +1,16 @@
+# RUN: %lldb -b -s %s -c %p/Inputs/x86-32-linux.core | FileCheck %s
+
+register read --all
+# CHECK-DAG: eip = 0x080492ab
+# CHECK-DAG: eflags = 0x00010283
+# CHECK-DAG: cs = 0x00000023
+# CHECK-DAG: fs = 0x00000000
+# CHECK-DAG: gs = 0x00000063
+# CHECK-DAG: ss = 0x0000002b
+# CHECK-DAG: ds = 0x0000002b
+# CHECK-DAG: es = 0x0000002b
+
+# CHECK-DAG: fiseg = 0x00000000
+# CHECK-DAG: fioff = 0x08049292
+# CHECK-DAG: foseg = 0x00000000
+# CHECK-DAG: fooff = 0xfff2d078
diff --git a/lldb/test/Shell/Register/Core/x86-32-linux-fp.test b/lldb/test/Shell/Register/Core/x86-32-linux-fp.test
new file mode 100644
index 0000000000000..32f44b0594761
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/x86-32-linux-fp.test
@@ -0,0 +1,3 @@
+# RUN: %lldb -b -s %s -c %p/Inputs/x86-32-linux.core | FileCheck %p/Inputs/x86-fp.check
+
+register read --all
diff --git a/lldb/test/Shell/Register/Core/x86-32-linux-gp.test b/lldb/test/Shell/Register/Core/x86-32-linux-gp.test
new file mode 100644
index 0000000000000..ba10c193f1dcd
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/x86-32-linux-gp.test
@@ -0,0 +1,3 @@
+# RUN: %lldb -b -s %s -c %p/Inputs/x86-32-linux.core | FileCheck %p/Inputs/x86-32-gp.check
+
+register read --all
diff --git a/lldb/test/Shell/Register/Core/x86-64-freebsd-addr.test b/lldb/test/Shell/Register/Core/x86-64-freebsd-addr.test
new file mode 100644
index 0000000000000..0b67d556b75cc
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/x86-64-freebsd-addr.test
@@ -0,0 +1,18 @@
+# RUN: %lldb -b -s %s -c %p/Inputs/x86-64-freebsd.core | FileCheck %s
+
+register read --all
+# CHECK-DAG: rip = 0x000000000020242b
+# CHECK-DAG: rflags = 0x0000000000010246
+# CHECK-DAG: cs = 0x0000000000000043
+# CHECK-DAG: fs = 0x0013
+# CHECK-DAG: gs = 0x001b
+# CHECK-DAG: ss = 0x000000000000003b
+# CHECK-DAG: ds = 0x003b
+# CHECK-DAG: es = 0x003b
+
+# CHECK-DAG: fiseg = 0x00000000
+# CHECK-DAG: fioff = 0x002023ea
+# CHECK-DAG: fip = 0x00000000002023ea
+# CHECK-DAG: foseg = 0x00007fff
+# CHECK-DAG: fooff = 0xffffd138
+# CHECK-DAG: fdp = 0x00007fffffffd138
diff --git a/lldb/test/Shell/Register/Core/x86-64-freebsd-fp.test b/lldb/test/Shell/Register/Core/x86-64-freebsd-fp.test
new file mode 100644
index 0000000000000..8a05682671ca1
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/x86-64-freebsd-fp.test
@@ -0,0 +1,3 @@
+# RUN: %lldb -b -s %s -c %p/Inputs/x86-64-freebsd.core | FileCheck %p/Inputs/x86-fp.check
+
+register read --all
diff --git a/lldb/test/Shell/Register/Core/x86-64-freebsd-gp.test b/lldb/test/Shell/Register/Core/x86-64-freebsd-gp.test
new file mode 100644
index 0000000000000..0033bde541cf5
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/x86-64-freebsd-gp.test
@@ -0,0 +1,3 @@
+# RUN: %lldb -b -s %s -c %p/Inputs/x86-64-freebsd.core | FileCheck %p/Inputs/x86-64-gp-hixmm.check
+
+register read --all
diff --git a/lldb/test/Shell/Register/Core/x86-64-linux-addr.test b/lldb/test/Shell/Register/Core/x86-64-linux-addr.test
new file mode 100644
index 0000000000000..e13308f3f307a
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/x86-64-linux-addr.test
@@ -0,0 +1,18 @@
+# RUN: %lldb -b -s %s -c %p/Inputs/x86-64-linux.core | FileCheck %s
+
+register read --all
+# CHECK-DAG: rip = 0x00000000004012db
+# CHECK-DAG: rflags = 0x0000000000010246
+# CHECK-DAG: cs = 0x0000000000000033
+# CHECK-DAG: fs = 0x0000000000000000
+# CHECK-DAG: gs = 0x0000000000000000
+# CHECK-DAG: ss = 0x000000000000002b
+# CHECK-DAG: ds = 0x0000000000000000
+# CHECK-DAG: es = 0x0000000000000000
+
+# CHECK-DAG: fiseg = 0x00000000
+# CHECK-DAG: fioff = 0x0040129a
+# CHECK-DAG: fip = 0x000000000040129a
+# CHECK-DAG: foseg = 0x00007ffd
+# CHECK-DAG: fooff = 0x547cb5f8
+# CHECK-DAG: fdp = 0x00007ffd547cb5f8
diff --git a/lldb/test/Shell/Register/Core/x86-64-linux-fp.test b/lldb/test/Shell/Register/Core/x86-64-linux-fp.test
new file mode 100644
index 0000000000000..f1e37a2b9bb31
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/x86-64-linux-fp.test
@@ -0,0 +1,3 @@
+# RUN: %lldb -b -s %s -c %p/Inputs/x86-64-linux.core | FileCheck %p/Inputs/x86-fp.check
+
+register read --all
diff --git a/lldb/test/Shell/Register/Core/x86-64-linux-gp.test b/lldb/test/Shell/Register/Core/x86-64-linux-gp.test
new file mode 100644
index 0000000000000..c2d4e690a7a7a
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/x86-64-linux-gp.test
@@ -0,0 +1,3 @@
+# RUN: %lldb -b -s %s -c %p/Inputs/x86-64-linux.core | FileCheck %p/Inputs/x86-64-gp-hixmm.check
+
+register read --all
diff --git a/lldb/test/Shell/Register/Core/x86-64-netbsd-addr.test b/lldb/test/Shell/Register/Core/x86-64-netbsd-addr.test
new file mode 100644
index 0000000000000..3ae6749dfa7e8
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/x86-64-netbsd-addr.test
@@ -0,0 +1,18 @@
+# RUN: %lldb -b -s %s -c %p/Inputs/x86-64-netbsd.core | FileCheck %s
+
+register read --all
+# CHECK-DAG: rip = 0x0000000000400c47
+# CHECK-DAG: rflags = 0x0000000000010212
+# CHECK-DAG: cs = 0x0000000000000047
+# CHECK-DAG: fs = 0x0000000000000000
+# CHECK-DAG: gs = 0x0000000000000000
+# CHECK-DAG: ss = 0x000000000000003f
+# CHECK-DAG: ds = 0x0000000000000023
+# CHECK-DAG: es = 0x0000000000000023
+
+# CHECK-DAG: fiseg = 0x00000000
+# CHECK-DAG: fioff = 0x00400c06
+# CHECK-DAG: fip = 0x0000000000400c06
+# CHECK-DAG: foseg = 0x00000000
+# CHECK-DAG: fooff = 0xfff93078
+# CHECK-DAG: fdp = 0x00000000fff93078
diff --git a/lldb/test/Shell/Register/Core/x86-64-netbsd-fp.test b/lldb/test/Shell/Register/Core/x86-64-netbsd-fp.test
new file mode 100644
index 0000000000000..bc476a73eb682
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/x86-64-netbsd-fp.test
@@ -0,0 +1,3 @@
+# RUN: %lldb -b -s %s -c %p/Inputs/x86-64-netbsd.core | FileCheck %p/Inputs/x86-fp.check
+
+register read --all
diff --git a/lldb/test/Shell/Register/Core/x86-64-netbsd-gp.test b/lldb/test/Shell/Register/Core/x86-64-netbsd-gp.test
new file mode 100644
index 0000000000000..75025e7057a2c
--- /dev/null
+++ b/lldb/test/Shell/Register/Core/x86-64-netbsd-gp.test
@@ -0,0 +1,3 @@
+# RUN: %lldb -b -s %s -c %p/Inputs/x86-64-netbsd.core | FileCheck %p/Inputs/x86-64-gp-hixmm.check
+
+register read --all
More information about the lldb-commits
mailing list