.debug_line incremental compilation initial support
Supports writing the first function. Still TODO is: * handling the .debug_line header growing too large * adding a new file to an existing compilation * adding an additional function to an existing file * handling incremental updates * adding the main IR debug ops for IR instructions There are also issues to work out: * readelf --debug-dump=rawline is saying there is no .debug_str section even though there is * readelf --debug-dump=decodedline is saying the file index 0 is bad and reporting some other kind of corruption.
This commit is contained in:
@@ -196,6 +196,10 @@ pub fn HashMap(
|
||||
return self.unmanaged.getEntry(key);
|
||||
}
|
||||
|
||||
pub fn getIndex(self: Self, key: K) ?usize {
|
||||
return self.unmanaged.getIndex(key);
|
||||
}
|
||||
|
||||
pub fn get(self: Self, key: K) ?V {
|
||||
return self.unmanaged.get(key);
|
||||
}
|
||||
@@ -479,17 +483,21 @@ pub fn HashMapUnmanaged(
|
||||
}
|
||||
|
||||
pub fn getEntry(self: Self, key: K) ?*Entry {
|
||||
const index = self.getIndex(key) orelse return null;
|
||||
return &self.entries.items[index];
|
||||
}
|
||||
|
||||
pub fn getIndex(self: Self, key: K) ?usize {
|
||||
const header = self.index_header orelse {
|
||||
// Linear scan.
|
||||
const h = if (store_hash) hash(key) else {};
|
||||
for (self.entries.items) |*item| {
|
||||
for (self.entries.items) |*item, i| {
|
||||
if (item.hash == h and eql(key, item.key)) {
|
||||
return item;
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
switch (header.capacityIndexType()) {
|
||||
.u8 => return self.getInternal(key, header, u8),
|
||||
.u16 => return self.getInternal(key, header, u16),
|
||||
@@ -711,7 +719,7 @@ pub fn HashMapUnmanaged(
|
||||
unreachable;
|
||||
}
|
||||
|
||||
fn getInternal(self: Self, key: K, header: *IndexHeader, comptime I: type) ?*Entry {
|
||||
fn getInternal(self: Self, key: K, header: *IndexHeader, comptime I: type) ?usize {
|
||||
const indexes = header.indexes(I);
|
||||
const h = hash(key);
|
||||
const start_index = header.constrainIndex(h);
|
||||
@@ -725,7 +733,7 @@ pub fn HashMapUnmanaged(
|
||||
const entry = &self.entries.items[index.entry_index];
|
||||
const hash_match = if (store_hash) h == entry.hash else true;
|
||||
if (hash_match and eql(key, entry.key))
|
||||
return entry;
|
||||
return index.entry_index;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user