Function parseInfoStream [src]

Prototype

pub fn parseInfoStream(self: *Pdb) !void

Parameters

self: *Pdb

Source

pub fn parseInfoStream(self: *Pdb) !void { var stream = self.getStream(pdb.StreamType.pdb) orelse return error.InvalidDebugInfo; const reader = stream.reader(); // Parse the InfoStreamHeader. const version = try reader.readInt(u32, .little); const signature = try reader.readInt(u32, .little); _ = signature; const age = try reader.readInt(u32, .little); const guid = try reader.readBytesNoEof(16); if (version != 20000404) // VC70, only value observed by LLVM team return error.UnknownPDBVersion; self.guid = guid; self.age = age; // Find the string table. const string_table_index = str_tab_index: { const name_bytes_len = try reader.readInt(u32, .little); const name_bytes = try self.allocator.alloc(u8, name_bytes_len); defer self.allocator.free(name_bytes); try reader.readNoEof(name_bytes); const HashTableHeader = extern struct { size: u32, capacity: u32, fn maxLoad(cap: u32) u32 { return cap * 2 / 3 + 1; } }; const hash_tbl_hdr = try reader.readStruct(HashTableHeader); if (hash_tbl_hdr.capacity == 0) return error.InvalidDebugInfo; if (hash_tbl_hdr.size > HashTableHeader.maxLoad(hash_tbl_hdr.capacity)) return error.InvalidDebugInfo; const present = try readSparseBitVector(&reader, self.allocator); defer self.allocator.free(present); if (present.len != hash_tbl_hdr.size) return error.InvalidDebugInfo; const deleted = try readSparseBitVector(&reader, self.allocator); defer self.allocator.free(deleted); for (present) |_| { const name_offset = try reader.readInt(u32, .little); const name_index = try reader.readInt(u32, .little); if (name_offset > name_bytes.len) return error.InvalidDebugInfo; const name = std.mem.sliceTo(name_bytes[name_offset..], 0); if (std.mem.eql(u8, name, "/names")) { break :str_tab_index name_index; } } return error.MissingDebugInfo; }; self.string_table = self.getStreamById(string_table_index) orelse return error.MissingDebugInfo; }