summaryrefslogtreecommitdiff
path: root/lldb/test/API/macosx
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/test/API/macosx')
-rw-r--r--lldb/test/API/macosx/arm-corefile-regctx/Makefile6
-rw-r--r--lldb/test/API/macosx/arm-corefile-regctx/TestArmMachoCorefileRegctx.py17
-rw-r--r--lldb/test/API/macosx/arm-corefile-regctx/arm64.yaml30
-rw-r--r--lldb/test/API/macosx/arm-corefile-regctx/armv7m.yaml36
-rw-r--r--lldb/test/API/macosx/arm-corefile-regctx/create-arm-corefiles.cpp266
-rw-r--r--lldb/test/API/macosx/arm-pointer-metadata-stripping/Makefile2
-rw-r--r--lldb/test/API/macosx/arm-pointer-metadata-stripping/TestArmPointerMetadataStripping.py48
-rw-r--r--lldb/test/API/macosx/arm-pointer-metadata-stripping/extra_symbols.json21
-rw-r--r--lldb/test/API/macosx/arm-pointer-metadata-stripping/main.c13
-rw-r--r--lldb/test/API/macosx/riscv32-corefile/Makefile7
-rw-r--r--lldb/test/API/macosx/riscv32-corefile/TestRV32MachOCorefile.py17
-rw-r--r--lldb/test/API/macosx/riscv32-corefile/create-empty-riscv-corefile.cpp116
-rw-r--r--lldb/test/API/macosx/riscv32-corefile/riscv32-registers.yaml46
13 files changed, 214 insertions, 411 deletions
diff --git a/lldb/test/API/macosx/arm-corefile-regctx/Makefile b/lldb/test/API/macosx/arm-corefile-regctx/Makefile
deleted file mode 100644
index e1d0354441cd..000000000000
--- a/lldb/test/API/macosx/arm-corefile-regctx/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-MAKE_DSYM := NO
-
-CXX_SOURCES := create-arm-corefiles.cpp
-
-include Makefile.rules
-
diff --git a/lldb/test/API/macosx/arm-corefile-regctx/TestArmMachoCorefileRegctx.py b/lldb/test/API/macosx/arm-corefile-regctx/TestArmMachoCorefileRegctx.py
index 6754288a65e1..a2890cdfeaa4 100644
--- a/lldb/test/API/macosx/arm-corefile-regctx/TestArmMachoCorefileRegctx.py
+++ b/lldb/test/API/macosx/arm-corefile-regctx/TestArmMachoCorefileRegctx.py
@@ -13,20 +13,14 @@ from lldbsuite.test import lldbutil
class TestArmMachoCorefileRegctx(TestBase):
NO_DEBUG_INFO_TESTCASE = True
- @skipUnlessDarwin
- def setUp(self):
- TestBase.setUp(self)
- self.build()
- self.create_corefile = self.getBuildArtifact("a.out")
- self.corefile = self.getBuildArtifact("core")
-
def test_armv7_corefile(self):
### Create corefile
- retcode = call(self.create_corefile + " armv7 " + self.corefile, shell=True)
+ corefile = self.getBuildArtifact("core")
+ self.yaml2macho_core("armv7m.yaml", corefile)
target = self.dbg.CreateTarget("")
err = lldb.SBError()
- process = target.LoadCore(self.corefile)
+ process = target.LoadCore(corefile)
self.assertTrue(process.IsValid())
thread = process.GetSelectedThread()
frame = thread.GetSelectedFrame()
@@ -50,11 +44,12 @@ class TestArmMachoCorefileRegctx(TestBase):
def test_arm64_corefile(self):
### Create corefile
- retcode = call(self.create_corefile + " arm64 " + self.corefile, shell=True)
+ corefile = self.getBuildArtifact("core")
+ self.yaml2macho_core("arm64.yaml", corefile)
target = self.dbg.CreateTarget("")
err = lldb.SBError()
- process = target.LoadCore(self.corefile)
+ process = target.LoadCore(corefile)
self.assertTrue(process.IsValid())
thread = process.GetSelectedThread()
frame = thread.GetSelectedFrame()
diff --git a/lldb/test/API/macosx/arm-corefile-regctx/arm64.yaml b/lldb/test/API/macosx/arm-corefile-regctx/arm64.yaml
new file mode 100644
index 000000000000..fe06f2d4054b
--- /dev/null
+++ b/lldb/test/API/macosx/arm-corefile-regctx/arm64.yaml
@@ -0,0 +1,30 @@
+cpu: arm64
+threads:
+ # (lldb) reg read
+ # % pbpaste | grep = | sed 's, ,,g' | awk -F= '{print "{name: " $1 ", value: " $2 "},"}'
+ - regsets:
+ - flavor: gpr
+ registers: [
+ {name: x0, value: 0x0000000000000001}, {name: x1, value: 0x000000016fdff3c0},
+ {name: x2, value: 0x000000016fdff3d0}, {name: x3, value: 0x000000016fdff510},
+ {name: x4, value: 0x0000000000000000}, {name: x5, value: 0x0000000000000000},
+ {name: x6, value: 0x0000000000000000}, {name: x7, value: 0x0000000000000000},
+ {name: x8, value: 0x000000010000d910}, {name: x9, value: 0x0000000000000001},
+ {name: x10, value: 0xe1e88de000000000}, {name: x11, value: 0x0000000000000003},
+ {name: x12, value: 0x0000000000000148}, {name: x13, value: 0x0000000000004000},
+ {name: x14, value: 0x0000000000000008}, {name: x15, value: 0x0000000000000000},
+ {name: x16, value: 0x0000000000000000}, {name: x17, value: 0x0000000100003f5c},
+ {name: x18, value: 0x0000000000000000}, {name: x19, value: 0x0000000100003f5c},
+ {name: x20, value: 0x000000010000c000}, {name: x21, value: 0x000000010000d910},
+ {name: x22, value: 0x000000016fdff250}, {name: x23, value: 0x000000018ce12366},
+ {name: x24, value: 0x000000016fdff1d0}, {name: x25, value: 0x0000000000000001},
+ {name: x26, value: 0x0000000000000000}, {name: x27, value: 0x0000000000000000},
+ {name: x28, value: 0x0000000000000000}, {name: fp, value: 0x000000016fdff3a0},
+ {name: lr, value: 0x000000018cd97f28}, {name: sp, value: 0x000000016fdff140},
+ {name: pc, value: 0x0000000100003f5c}, {name: cpsr, value: 0x80001000}
+ ]
+ - flavor: exc
+ registers: [ {name: far, value: 0x0000000100003f5c},
+ {name: esr, value: 0xf2000000},
+ {name: exception, value: 0x00000000}
+ ]
diff --git a/lldb/test/API/macosx/arm-corefile-regctx/armv7m.yaml b/lldb/test/API/macosx/arm-corefile-regctx/armv7m.yaml
new file mode 100644
index 000000000000..411c12a7e407
--- /dev/null
+++ b/lldb/test/API/macosx/arm-corefile-regctx/armv7m.yaml
@@ -0,0 +1,36 @@
+cpu: armv7m
+threads:
+ # (lldb) reg read
+ # % pbpaste | grep = | sed 's, ,,g' | awk -F= '{print "{name: " $1 ", value: " $2 "},"}'
+ - regsets:
+ - flavor: gpr
+ registers: [
+ {name: r0, value: 0x00010000}, {name: r1, value: 0x00020000},
+ {name: r2, value: 0x00030000}, {name: r3, value: 0x00040000},
+ {name: r4, value: 0x00050000}, {name: r5, value: 0x00060000},
+ {name: r6, value: 0x00070000}, {name: r7, value: 0x00080000},
+ {name: r8, value: 0x00090000}, {name: r9, value: 0x000a0000},
+ {name: r10, value: 0x000b0000}, {name: r11, value: 0x000c0000},
+ {name: r12, value: 0x000d0000}, {name: sp, value: 0x000e0000},
+ {name: lr, value: 0x000f0000}, {name: pc, value: 0x00100000},
+ {name: cpsr, value: 0x00110000}
+ ]
+ - flavor: exc
+ registers: [ {name: far, value: 0x00003f5c},
+ {name: esr, value: 0xf2000000},
+ {name: exception, value: 0x00000000}
+ ]
+
+memory-regions:
+ # $sp is 0x000e0000, have bytes surrounding that address
+ - addr: 0x000dffe0
+ UInt8: [
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
+ 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
+ 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
+ 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
+ 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c,
+ 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35,
+ 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e,
+ 0x3f
+ ]
diff --git a/lldb/test/API/macosx/arm-corefile-regctx/create-arm-corefiles.cpp b/lldb/test/API/macosx/arm-corefile-regctx/create-arm-corefiles.cpp
deleted file mode 100644
index db39f12ecfb7..000000000000
--- a/lldb/test/API/macosx/arm-corefile-regctx/create-arm-corefiles.cpp
+++ /dev/null
@@ -1,266 +0,0 @@
-#include <mach-o/loader.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string>
-#include <vector>
-
-
-// Normally these are picked up by including <mach/thread_status.h>
-// but that does a compile time check for the build host arch and
-// only defines the ARM register context constants when building on
-// an arm system. We're creating fake corefiles, and might be
-// creating them on an intel system.
-#ifndef ARM_THREAD_STATE
-#define ARM_THREAD_STATE 1
-#endif
-#ifndef ARM_THREAD_STATE_COUNT
-#define ARM_THREAD_STATE_COUNT 17
-#endif
-#ifndef ARM_EXCEPTION_STATE
-#define ARM_EXCEPTION_STATE 3
-#endif
-#ifndef ARM_EXCEPTION_STATE_COUNT
-#define ARM_EXCEPTION_STATE_COUNT 3
-#endif
-#ifndef ARM_THREAD_STATE64
-#define ARM_THREAD_STATE64 6
-#endif
-#ifndef ARM_THREAD_STATE64_COUNT
-#define ARM_THREAD_STATE64_COUNT 68
-#endif
-#ifndef ARM_EXCEPTION_STATE64
-#define ARM_EXCEPTION_STATE64 7
-#endif
-#ifndef ARM_EXCEPTION_STATE64_COUNT
-#define ARM_EXCEPTION_STATE64_COUNT 4
-#endif
-
-union uint32_buf {
- uint8_t bytebuf[4];
- uint32_t val;
-};
-
-union uint64_buf {
- uint8_t bytebuf[8];
- uint64_t val;
-};
-
-void add_uint64(std::vector<uint8_t> &buf, uint64_t val) {
- uint64_buf conv;
- conv.val = val;
- for (int i = 0; i < 8; i++)
- buf.push_back(conv.bytebuf[i]);
-}
-
-void add_uint32(std::vector<uint8_t> &buf, uint32_t val) {
- uint32_buf conv;
- conv.val = val;
- for (int i = 0; i < 4; i++)
- buf.push_back(conv.bytebuf[i]);
-}
-
-std::vector<uint8_t> armv7_lc_thread_load_command() {
- std::vector<uint8_t> data;
- add_uint32(data, LC_THREAD); // thread_command.cmd
- add_uint32(data, 104); // thread_command.cmdsize
- add_uint32(data, ARM_THREAD_STATE); // thread_command.flavor
- add_uint32(data, ARM_THREAD_STATE_COUNT); // thread_command.count
- add_uint32(data, 0x00010000); // r0
- add_uint32(data, 0x00020000); // r1
- add_uint32(data, 0x00030000); // r2
- add_uint32(data, 0x00040000); // r3
- add_uint32(data, 0x00050000); // r4
- add_uint32(data, 0x00060000); // r5
- add_uint32(data, 0x00070000); // r6
- add_uint32(data, 0x00080000); // r7
- add_uint32(data, 0x00090000); // r8
- add_uint32(data, 0x000a0000); // r9
- add_uint32(data, 0x000b0000); // r10
- add_uint32(data, 0x000c0000); // r11
- add_uint32(data, 0x000d0000); // r12
- add_uint32(data, 0x000e0000); // sp
- add_uint32(data, 0x000f0000); // lr
- add_uint32(data, 0x00100000); // pc
- add_uint32(data, 0x00110000); // cpsr
-
- add_uint32(data, ARM_EXCEPTION_STATE); // thread_command.flavor
- add_uint32(data, ARM_EXCEPTION_STATE_COUNT); // thread_command.count
- add_uint32(data, 0x00003f5c); // far
- add_uint32(data, 0xf2000000); // esr
- add_uint32(data, 0x00000000); // exception
-
- return data;
-}
-
-std::vector<uint8_t> arm64_lc_thread_load_command() {
- std::vector<uint8_t> data;
- add_uint32(data, LC_THREAD); // thread_command.cmd
- add_uint32(data, 312); // thread_command.cmdsize
- add_uint32(data, ARM_THREAD_STATE64); // thread_command.flavor
- add_uint32(data, ARM_THREAD_STATE64_COUNT); // thread_command.count
- add_uint64(data, 0x0000000000000001); // x0
- add_uint64(data, 0x000000016fdff3c0); // x1
- add_uint64(data, 0x000000016fdff3d0); // x2
- add_uint64(data, 0x000000016fdff510); // x3
- add_uint64(data, 0x0000000000000000); // x4
- add_uint64(data, 0x0000000000000000); // x5
- add_uint64(data, 0x0000000000000000); // x6
- add_uint64(data, 0x0000000000000000); // x7
- add_uint64(data, 0x000000010000d910); // x8
- add_uint64(data, 0x0000000000000001); // x9
- add_uint64(data, 0xe1e88de000000000); // x10
- add_uint64(data, 0x0000000000000003); // x11
- add_uint64(data, 0x0000000000000148); // x12
- add_uint64(data, 0x0000000000004000); // x13
- add_uint64(data, 0x0000000000000008); // x14
- add_uint64(data, 0x0000000000000000); // x15
- add_uint64(data, 0x0000000000000000); // x16
- add_uint64(data, 0x0000000100003f5c); // x17
- add_uint64(data, 0x0000000000000000); // x18
- add_uint64(data, 0x0000000100003f5c); // x19
- add_uint64(data, 0x000000010000c000); // x20
- add_uint64(data, 0x000000010000d910); // x21
- add_uint64(data, 0x000000016fdff250); // x22
- add_uint64(data, 0x000000018ce12366); // x23
- add_uint64(data, 0x000000016fdff1d0); // x24
- add_uint64(data, 0x0000000000000001); // x25
- add_uint64(data, 0x0000000000000000); // x26
- add_uint64(data, 0x0000000000000000); // x27
- add_uint64(data, 0x0000000000000000); // x28
- add_uint64(data, 0x000000016fdff3a0); // fp
- add_uint64(data, 0x000000018cd97f28); // lr
- add_uint64(data, 0x000000016fdff140); // sp
- add_uint64(data, 0x0000000100003f5c); // pc
- add_uint32(data, 0x80001000); // cpsr
-
- add_uint32(data, 0x00000000); // padding
-
- add_uint32(data, ARM_EXCEPTION_STATE64); // thread_command.flavor
- add_uint32(data, ARM_EXCEPTION_STATE64_COUNT); // thread_command.count
- add_uint64(data, 0x0000000100003f5c); // far
- add_uint32(data, 0xf2000000); // esr
- add_uint32(data, 0x00000000); // exception
-
- return data;
-}
-
-std::vector<uint8_t> lc_segment(uint32_t fileoff,
- uint32_t lc_segment_data_size) {
- std::vector<uint8_t> data;
- // 0x000e0000 is the value of $sp in the armv7 LC_THREAD
- uint32_t start_vmaddr = 0x000e0000 - (lc_segment_data_size / 2);
- add_uint32(data, LC_SEGMENT); // segment_command.cmd
- add_uint32(data, sizeof(struct segment_command)); // segment_command.cmdsize
- for (int i = 0; i < 16; i++)
- data.push_back(0); // segment_command.segname[16]
- add_uint32(data, start_vmaddr); // segment_command.vmaddr
- add_uint32(data, lc_segment_data_size); // segment_command.vmsize
- add_uint32(data, fileoff); // segment_command.fileoff
- add_uint32(data, lc_segment_data_size); // segment_command.filesize
- add_uint32(data, 3); // segment_command.maxprot
- add_uint32(data, 3); // segment_command.initprot
- add_uint32(data, 0); // segment_command.nsects
- add_uint32(data, 0); // segment_command.flags
-
- return data;
-}
-
-enum arch { unspecified, armv7, arm64 };
-
-int main(int argc, char **argv) {
- if (argc != 3) {
- fprintf(stderr,
- "usage: create-arm-corefiles [armv7|arm64] <output-core-name>\n");
- exit(1);
- }
-
- arch arch = unspecified;
-
- if (strcmp(argv[1], "armv7") == 0)
- arch = armv7;
- else if (strcmp(argv[1], "arm64") == 0)
- arch = arm64;
- else {
- fprintf(stderr, "unrecognized architecture %s\n", argv[1]);
- exit(1);
- }
-
- // An array of load commands (in the form of byte arrays)
- std::vector<std::vector<uint8_t>> load_commands;
-
- // An array of corefile contents (page data, lc_note data, etc)
- std::vector<uint8_t> payload;
-
- // First add all the load commands / payload so we can figure out how large
- // the load commands will actually be.
- if (arch == armv7) {
- load_commands.push_back(armv7_lc_thread_load_command());
- load_commands.push_back(lc_segment(0, 0));
- } else if (arch == arm64) {
- load_commands.push_back(arm64_lc_thread_load_command());
- }
-
- int size_of_load_commands = 0;
- for (const auto &lc : load_commands)
- size_of_load_commands += lc.size();
-
- int header_and_load_cmd_room =
- sizeof(struct mach_header_64) + size_of_load_commands;
-
- // Erase the load commands / payload now that we know how much space is
- // needed, redo it.
- load_commands.clear();
- payload.clear();
-
- int payload_fileoff = (header_and_load_cmd_room + 4096 - 1) & ~(4096 - 1);
-
- const int lc_segment_data_size = 64;
- if (arch == armv7) {
- load_commands.push_back(armv7_lc_thread_load_command());
- load_commands.push_back(lc_segment(payload_fileoff, lc_segment_data_size));
- } else if (arch == arm64) {
- load_commands.push_back(arm64_lc_thread_load_command());
- }
-
- if (arch == armv7)
- for (int i = 0; i < lc_segment_data_size;
- i++) // from segment_command.filesize
- payload.push_back(i);
-
- struct mach_header_64 mh;
- int header_size;
- if (arch == armv7) {
- mh.magic = MH_MAGIC;
- mh.cputype = CPU_TYPE_ARM;
- mh.cpusubtype = CPU_SUBTYPE_ARM_V7M;
- header_size = sizeof(struct mach_header);
- } else if (arch == arm64) {
- mh.magic = MH_MAGIC_64;
- mh.cputype = CPU_TYPE_ARM64;
- mh.cpusubtype = CPU_SUBTYPE_ARM64_ALL;
- header_size = sizeof(struct mach_header_64);
- }
- mh.filetype = MH_CORE;
- mh.ncmds = load_commands.size();
- mh.sizeofcmds = size_of_load_commands;
- mh.flags = 0;
- mh.reserved = 0;
-
- FILE *f = fopen(argv[2], "w");
-
- if (f == nullptr) {
- fprintf(stderr, "Unable to open file %s for writing\n", argv[2]);
- exit(1);
- }
-
- fwrite(&mh, header_size, 1, f);
-
- for (const auto &lc : load_commands)
- fwrite(lc.data(), lc.size(), 1, f);
-
- fseek(f, payload_fileoff, SEEK_SET);
-
- fwrite(payload.data(), payload.size(), 1, f);
-
- fclose(f);
-}
diff --git a/lldb/test/API/macosx/arm-pointer-metadata-stripping/Makefile b/lldb/test/API/macosx/arm-pointer-metadata-stripping/Makefile
new file mode 100644
index 000000000000..c9319d6e6888
--- /dev/null
+++ b/lldb/test/API/macosx/arm-pointer-metadata-stripping/Makefile
@@ -0,0 +1,2 @@
+C_SOURCES := main.c
+include Makefile.rules
diff --git a/lldb/test/API/macosx/arm-pointer-metadata-stripping/TestArmPointerMetadataStripping.py b/lldb/test/API/macosx/arm-pointer-metadata-stripping/TestArmPointerMetadataStripping.py
new file mode 100644
index 000000000000..f61945b3eb4c
--- /dev/null
+++ b/lldb/test/API/macosx/arm-pointer-metadata-stripping/TestArmPointerMetadataStripping.py
@@ -0,0 +1,48 @@
+import lldb
+import json
+import os
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+@skipUnlessDarwin
+@skipIf(archs=no_match(["arm64", "arm64e"]))
+class TestArmPointerMetadataStripping(TestBase):
+ # Use extra_symbols.json as a template to add a new symbol whose address
+ # contains non-zero high order bits set.
+ def create_symbols_file(self):
+ template_path = os.path.join(self.getSourceDir(), "extra_symbols.json")
+ with open(template_path, "r") as f:
+ symbols_data = json.load(f)
+
+ target = self.dbg.GetSelectedTarget()
+ symbols_data["triple"] = target.GetTriple()
+
+ module = target.GetModuleAtIndex(0)
+ symbols_data["uuid"] = module.GetUUIDString()
+
+ json_filename = self.getBuildArtifact("extra_symbols.json")
+ with open(json_filename, "w") as file:
+ json.dump(symbols_data, file, indent=4)
+
+ return json_filename
+
+ def test(self):
+ self.build()
+ src = lldb.SBFileSpec("main.c")
+ target, process, thread, bkpt = lldbutil.run_to_source_breakpoint(
+ self, "break here", src
+ )
+
+ symbols_file = self.create_symbols_file()
+ self.runCmd(f"target module add {symbols_file}")
+
+ # The high order bits should be stripped.
+ self.expect_expr("get_high_bits(&myglobal_json)", result_value="0")
+
+ # Mark all bits as used for addresses and ensure bits are no longer stripped.
+ self.runCmd("settings set target.process.virtual-addressable-bits 64")
+ self.expect_expr(
+ "get_high_bits(&myglobal_json)", result_value=str(0x1200000000000000)
+ )
diff --git a/lldb/test/API/macosx/arm-pointer-metadata-stripping/extra_symbols.json b/lldb/test/API/macosx/arm-pointer-metadata-stripping/extra_symbols.json
new file mode 100644
index 000000000000..5c2503d508b4
--- /dev/null
+++ b/lldb/test/API/macosx/arm-pointer-metadata-stripping/extra_symbols.json
@@ -0,0 +1,21 @@
+{
+ "triple": "replace me",
+ "uuid": "replace me",
+ "type": "executable",
+ "sections": [
+ {
+ "name": "__DATA",
+ "type": "data",
+ "address": 1297224342667202580,
+ "size": 16
+ }
+ ],
+ "symbols": [
+ {
+ "name": "myglobal_json",
+ "size": 8,
+ "type": "data",
+ "address": 1297224342667202580
+ }
+ ]
+}
diff --git a/lldb/test/API/macosx/arm-pointer-metadata-stripping/main.c b/lldb/test/API/macosx/arm-pointer-metadata-stripping/main.c
new file mode 100644
index 000000000000..05a85133caf7
--- /dev/null
+++ b/lldb/test/API/macosx/arm-pointer-metadata-stripping/main.c
@@ -0,0 +1,13 @@
+#include <stdint.h>
+
+uintptr_t get_high_bits(void *ptr) {
+ uintptr_t address_bits = 56;
+ uintptr_t mask = ~((1ULL << address_bits) - 1);
+ uintptr_t ptrtoint = (uintptr_t)ptr;
+ uintptr_t high_bits = ptrtoint & mask;
+ return high_bits;
+}
+
+int main() {
+ return 0; // break here
+}
diff --git a/lldb/test/API/macosx/riscv32-corefile/Makefile b/lldb/test/API/macosx/riscv32-corefile/Makefile
deleted file mode 100644
index 04f268758d00..000000000000
--- a/lldb/test/API/macosx/riscv32-corefile/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-MAKE_DSYM := NO
-CXX_SOURCES := create-empty-riscv-corefile.cpp
-EXE := create-empty-riscv-corefile
-
-all: create-empty-riscv-corefile
-
-include Makefile.rules
diff --git a/lldb/test/API/macosx/riscv32-corefile/TestRV32MachOCorefile.py b/lldb/test/API/macosx/riscv32-corefile/TestRV32MachOCorefile.py
index 8d11821d3898..449da70fb08c 100644
--- a/lldb/test/API/macosx/riscv32-corefile/TestRV32MachOCorefile.py
+++ b/lldb/test/API/macosx/riscv32-corefile/TestRV32MachOCorefile.py
@@ -13,18 +13,16 @@ from lldbsuite.test import lldbutil
class TestRV32MachOCorefile(TestBase):
NO_DEBUG_INFO_TESTCASE = True
- @skipUnlessDarwin
+ @no_debug_info_test
def test_riscv32_gpr_corefile_registers(self):
- self.build()
- create_corefile = self.getBuildArtifact("create-empty-riscv-corefile")
corefile = self.getBuildArtifact("core")
- call(create_corefile + " " + corefile, shell=True)
+ self.yaml2macho_core("riscv32-registers.yaml", corefile)
target = self.dbg.CreateTarget("")
process = target.LoadCore(corefile)
process = target.GetProcess()
- self.assertEqual(process.GetNumThreads(), 1)
+ self.assertEqual(process.GetNumThreads(), 2)
thread = process.GetThreadAtIndex(0)
self.assertEqual(thread.GetNumFrames(), 1)
@@ -80,3 +78,12 @@ class TestRV32MachOCorefile(TestBase):
val = idx | (idx << 8) | (idx << 16) | (idx << 24)
self.assertEqual(gpr_regs.GetChildAtIndex(idx).GetValueAsUnsigned(), val)
idx = idx + 1
+
+ thread = process.GetThreadAtIndex(1)
+ self.assertEqual(thread.GetNumFrames(), 1)
+
+ frame = thread.GetFrameAtIndex(0)
+ gpr_regs = frame.registers.GetValueAtIndex(0)
+
+ self.assertEqual(gpr_regs.GetChildAtIndex(0).GetValueAsUnsigned(), 0x90000000)
+ self.assertEqual(gpr_regs.GetChildAtIndex(32).GetValueAsUnsigned(), 0x90202020)
diff --git a/lldb/test/API/macosx/riscv32-corefile/create-empty-riscv-corefile.cpp b/lldb/test/API/macosx/riscv32-corefile/create-empty-riscv-corefile.cpp
deleted file mode 100644
index 907cca3b70b4..000000000000
--- a/lldb/test/API/macosx/riscv32-corefile/create-empty-riscv-corefile.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-#include <inttypes.h>
-#include <mach-o/loader.h>
-#include <mach/thread_status.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <string>
-#include <sys/errno.h>
-#include <uuid/uuid.h>
-#include <vector>
-
-#define CPU_TYPE_RISCV 24
-#define CPU_SUBTYPE_RISCV_ALL 0
-#define RV32_THREAD_STATE 2
-// x0-x31 + pc, all 32-bit
-#define RV32_THREAD_STATE_COUNT 33
-
-union uint32_buf {
- uint8_t bytebuf[4];
- uint32_t val;
-};
-
-union uint64_buf {
- uint8_t bytebuf[8];
- uint64_t val;
-};
-
-void add_uint64(std::vector<uint8_t> &buf, uint64_t val) {
- uint64_buf conv;
- conv.val = val;
- for (int i = 0; i < 8; i++)
- buf.push_back(conv.bytebuf[i]);
-}
-
-void add_uint32(std::vector<uint8_t> &buf, uint32_t val) {
- uint32_buf conv;
- conv.val = val;
- for (int i = 0; i < 4; i++)
- buf.push_back(conv.bytebuf[i]);
-}
-
-std::vector<uint8_t> lc_thread_load_command() {
- std::vector<uint8_t> data;
- add_uint32(data, LC_THREAD); // thread_command.cmd
- add_uint32(data, 4 + 4 + 4 + 4 +
- (RV32_THREAD_STATE_COUNT * 4)); // thread_command.cmdsize
- add_uint32(data, RV32_THREAD_STATE); // thread_command.flavor
- add_uint32(data, RV32_THREAD_STATE_COUNT); // thread_command.count
- for (int i = 0; i < RV32_THREAD_STATE_COUNT; i++) {
- add_uint32(data, i | (i << 8) | (i << 16) | (i << 24));
- }
- return data;
-}
-
-int main(int argc, char **argv) {
- if (argc != 2) {
- fprintf(stderr,
- "usage: create-empty-riscv-corefile output-corefile-name\n");
- exit(1);
- }
-
- cpu_type_t cputype = CPU_TYPE_RISCV;
- cpu_subtype_t cpusubtype = CPU_SUBTYPE_RISCV_ALL;
-
- // An array of load commands (in the form of byte arrays)
- std::vector<std::vector<uint8_t>> load_commands;
-
- // An array of corefile contents (page data, lc_note data, etc)
- std::vector<uint8_t> payload;
-
- // First add all the load commands / payload so we can figure out how large
- // the load commands will actually be.
- load_commands.push_back(lc_thread_load_command());
-
- int size_of_load_commands = 0;
- for (const auto &lc : load_commands)
- size_of_load_commands += lc.size();
-
- int header_and_load_cmd_room =
- sizeof(struct mach_header_64) + size_of_load_commands;
-
- // Erase the load commands / payload now that we know how much space is
- // needed, redo it.
- load_commands.clear();
- payload.clear();
-
- load_commands.push_back(lc_thread_load_command());
-
- struct mach_header mh;
- mh.magic = MH_MAGIC;
- mh.cputype = cputype;
-
- mh.cpusubtype = cpusubtype;
- mh.filetype = MH_CORE;
- mh.ncmds = load_commands.size();
- mh.sizeofcmds = size_of_load_commands;
- mh.flags = 0;
-
- FILE *f = fopen(argv[1], "w");
-
- if (f == nullptr) {
- fprintf(stderr, "Unable to open file %s for writing\n", argv[1]);
- exit(1);
- }
-
- fwrite(&mh, sizeof(struct mach_header), 1, f);
-
- for (const auto &lc : load_commands)
- fwrite(lc.data(), lc.size(), 1, f);
-
- fseek(f, header_and_load_cmd_room, SEEK_SET);
-
- fwrite(payload.data(), payload.size(), 1, f);
-
- fclose(f);
-}
diff --git a/lldb/test/API/macosx/riscv32-corefile/riscv32-registers.yaml b/lldb/test/API/macosx/riscv32-corefile/riscv32-registers.yaml
new file mode 100644
index 000000000000..81c725f1a4f0
--- /dev/null
+++ b/lldb/test/API/macosx/riscv32-corefile/riscv32-registers.yaml
@@ -0,0 +1,46 @@
+cpu: riscv
+threads:
+ # (lldb) reg read
+ # % pbpaste | grep = | sed 's, ,,g' | awk -F= '{print "{name: " $1 ", value: " $2 "},"}'
+ - regsets:
+ - flavor: gpr
+ registers: [
+ {name: zero, value: 0x00000000}, {name: ra, value: 0x01010101},
+ {name: sp, value: 0x02020202}, {name: gp, value: 0x03030303},
+ {name: tp, value: 0x04040404}, {name: t0, value: 0x05050505},
+ {name: t1, value: 0x06060606}, {name: t2, value: 0x07070707},
+ {name: fp, value: 0x08080808}, {name: s1, value: 0x09090909},
+ {name: a0, value: 0x0a0a0a0a}, {name: a1, value: 0x0b0b0b0b},
+ {name: a2, value: 0x0c0c0c0c}, {name: a3, value: 0x0d0d0d0d},
+ {name: a4, value: 0x0e0e0e0e}, {name: a5, value: 0x0f0f0f0f},
+ {name: a6, value: 0x10101010}, {name: a7, value: 0x11111111},
+ {name: s2, value: 0x12121212}, {name: s3, value: 0x13131313},
+ {name: s4, value: 0x14141414}, {name: s5, value: 0x15151515},
+ {name: s6, value: 0x16161616}, {name: s7, value: 0x17171717},
+ {name: s8, value: 0x18181818}, {name: s9, value: 0x19191919},
+ {name: s10, value: 0x1a1a1a1a}, {name: s11, value: 0x1b1b1b1b},
+ {name: t3, value: 0x1c1c1c1c}, {name: t4, value: 0x1d1d1d1d},
+ {name: t5, value: 0x1e1e1e1e}, {name: t6, value: 0x1f1f1f1f},
+ {name: pc, value: 0x20202020}
+ ]
+ - regsets:
+ - flavor: gpr
+ registers: [
+ {name: zero, value: 0x90000000}, {name: ra, value: 0x91010101},
+ {name: sp, value: 0x92020202}, {name: gp, value: 0x93030303},
+ {name: tp, value: 0x94040404}, {name: t0, value: 0x95050505},
+ {name: t1, value: 0x96060606}, {name: t2, value: 0x97070707},
+ {name: fp, value: 0x98080808}, {name: s1, value: 0x99090909},
+ {name: a0, value: 0x9a0a0a0a}, {name: a1, value: 0x9b0b0b0b},
+ {name: a2, value: 0x9c0c0c0c}, {name: a3, value: 0x9d0d0d0d},
+ {name: a4, value: 0x9e0e0e0e}, {name: a5, value: 0x9f0f0f0f},
+ {name: a6, value: 0x90101010}, {name: a7, value: 0x91111111},
+ {name: s2, value: 0x92121212}, {name: s3, value: 0x93131313},
+ {name: s4, value: 0x94141414}, {name: s5, value: 0x95151515},
+ {name: s6, value: 0x96161616}, {name: s7, value: 0x97171717},
+ {name: s8, value: 0x98181818}, {name: s9, value: 0x19191919},
+ {name: s10, value: 0x9a1a1a1a}, {name: s11, value: 0x9b1b1b1b},
+ {name: t3, value: 0x9c1c1c1c}, {name: t4, value: 0x9d1d1d1d},
+ {name: t5, value: 0x9e1e1e1e}, {name: t6, value: 0x9f1f1f1f},
+ {name: pc, value: 0x90202020}
+ ]