[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