zig/lib/std/dwarf/abi.zig
kcbanner f3f3c877e0 - add DWARF expression parser
- change read apis to use a stream
- add register formatters
2023-07-20 22:58:13 -04:00

75 lines
2.9 KiB
Zig

const std = @import("../std.zig");
fn writeUnknownReg(writer: anytype, reg_number: u8) !void {
try writer.print("reg{}", .{reg_number});
}
pub fn writeRegisterName(writer: anytype, arch: ?std.Target.Cpu.Arch, reg_number: u8) !void {
if (arch) |a| {
switch (a) {
.x86_64 => {
switch (reg_number) {
0 => try writer.writeAll("RAX"),
1 => try writer.writeAll("RDX"),
2 => try writer.writeAll("RCX"),
3 => try writer.writeAll("RBX"),
4 => try writer.writeAll("RSI"),
5 => try writer.writeAll("RDI"),
6 => try writer.writeAll("RBP"),
7 => try writer.writeAll("RSP"),
8...15 => try writer.print("R{}", .{reg_number}),
16 => try writer.writeAll("RIP"),
17...32 => try writer.print("XMM{}", .{reg_number - 17}),
33...40 => try writer.print("ST{}", .{reg_number - 33}),
41...48 => try writer.print("MM{}", .{reg_number - 41}),
49 => try writer.writeAll("RFLAGS"),
50 => try writer.writeAll("ES"),
51 => try writer.writeAll("CS"),
52 => try writer.writeAll("SS"),
53 => try writer.writeAll("DS"),
54 => try writer.writeAll("FS"),
55 => try writer.writeAll("GS"),
// 56-57 Reserved
58 => try writer.writeAll("FS.BASE"),
59 => try writer.writeAll("GS.BASE"),
// 60-61 Reserved
62 => try writer.writeAll("TR"),
63 => try writer.writeAll("LDTR"),
64 => try writer.writeAll("MXCSR"),
65 => try writer.writeAll("FCW"),
66 => try writer.writeAll("FSW"),
67...82 => try writer.print("XMM{}", .{reg_number - 51}),
// 83-117 Reserved
118...125 => try writer.print("K{}", .{reg_number - 118}),
// 126-129 Reserved
else => try writeUnknownReg(writer, reg_number),
}
},
// TODO: Add x86, aarch64
else => try writeUnknownReg(writer, reg_number),
}
} else try writeUnknownReg(writer, reg_number);
}
const FormatRegisterData = struct {
reg_number: u8,
arch: ?std.Target.Cpu.Arch,
};
pub fn formatRegister(
data: FormatRegisterData,
comptime fmt: []const u8,
options: std.fmt.FormatOptions,
writer: anytype,
) !void {
_ = fmt;
_ = options;
try writeRegisterName(writer, data.arch, data.reg_number);
}
pub fn fmtRegister(reg_number: u8, arch: ?std.Target.Cpu.Arch) std.fmt.Formatter(formatRegister) {
return .{ .data = .{ .reg_number = reg_number, .arch = arch } };
}