coff: move Symtab and Strtab out of coff.Coff

This should ease interfacing with different std.coff functionalities.
This commit is contained in:
Jakub Konka 2022-08-30 15:51:46 +02:00
parent 7ef0c9d298
commit aa5568beb6

View file

@ -1100,15 +1100,16 @@ pub const Coff = struct {
mem.copy(u8, out_buff, self.data[sec.pointer_to_raw_data..][0..sec.virtual_size]);
return out_buff;
}
};
pub const Symtab = struct {
pub const Symtab = struct {
buffer: []const u8,
fn len(self: Symtab) usize {
pub fn len(self: Symtab) usize {
return @divExact(self.buffer.len, Symbol.sizeOf());
}
const Tag = enum {
pub const Tag = enum {
symbol,
func_def,
debug_info,
@ -1117,7 +1118,7 @@ pub const Coff = struct {
sect_def,
};
const Record = union(Tag) {
pub const Record = union(Tag) {
symbol: Symbol,
debug_info: DebugInfoDefinition,
func_def: FunctionDefinition,
@ -1127,7 +1128,7 @@ pub const Coff = struct {
};
/// Lives as long as Symtab instance.
fn at(self: Symtab, index: usize, tag: Tag) Record {
pub fn at(self: Symtab, index: usize, tag: Tag) Record {
const offset = index * Symbol.sizeOf();
const raw = self.buffer[offset..][0..Symbol.sizeOf()];
return switch (tag) {
@ -1197,13 +1198,13 @@ pub const Coff = struct {
};
}
const Slice = struct {
pub const Slice = struct {
buffer: []const u8,
num: usize,
count: usize = 0,
/// Lives as long as Symtab instance.
fn next(self: *Slice) ?Symbol {
pub fn next(self: *Slice) ?Symbol {
if (self.count >= self.num) return null;
const sym = asSymbol(self.buffer[0..Symbol.sizeOf()]);
self.count += 1;
@ -1212,20 +1213,19 @@ pub const Coff = struct {
}
};
fn slice(self: Symtab, start: usize, end: ?usize) Slice {
pub fn slice(self: Symtab, start: usize, end: ?usize) Slice {
const offset = start * Symbol.sizeOf();
const llen = if (end) |e| e * Symbol.sizeOf() else self.buffer.len;
const num = @divExact(llen - offset, Symbol.sizeOf());
return Slice{ .buffer = self.buffer[offset..][0..llen], .num = num };
}
};
};
pub const Strtab = struct {
pub const Strtab = struct {
buffer: []const u8,
fn get(self: Strtab, off: u32) []const u8 {
pub fn get(self: Strtab, off: u32) []const u8 {
assert(off < self.buffer.len);
return mem.sliceTo(@ptrCast([*:0]const u8, self.buffer.ptr + off), 0);
}
};
};