Zig 0.17.0-dev (Split by item)
This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig library itself.
Zig › std/ › debug/ › Pdb.zig › parseDbiStream
parseDbiStream
Pdb.parseDbiStream
pub fn parseDbiStream (self : *Pdb ) !void
File
Code
pub fn parseDbiStream (self : *Pdb ) !void {
var stream = self .getStream (pdb .StreamType .dbi ) orelse
return error .InvalidDebugInfo ;
const gpa = self .allocator ;
const reader = &stream .interface ;
const header = try reader .takeStruct (pdb .DbiStreamHeader , .little );
if (header .version_header != 19990903 )
return error .UnknownPDBVersion ;
// return error.UnmatchingPDB;
const mod_info_size = header .mod_info_size ;
const section_contrib_size = header .section_contribution_size ;
var modules : std .ArrayList (Module ) = .empty ;
defer modules .deinit (gpa );
var mod_info_offset : usize = 0 ;
while (mod_info_offset != mod_info_size ) {
const mod_info = try reader .takeStruct (pdb .ModInfo , .little );
var this_record_len : usize = @sizeOf (pdb .ModInfo );
var module_name : Io .Writer .Allocating = .init (gpa );
defer module_name .deinit ();
this_record_len += try reader .streamDelimiterLimit (&module_name .writer , 0 , .limited (1024 ));
assert (reader .buffered ()[0 ] == 0 );
reader .toss (1 );
this_record_len += 1 ;
var obj_file_name : Io .Writer .Allocating = .init (gpa );
defer obj_file_name .deinit ();
this_record_len += try reader .streamDelimiterLimit (&obj_file_name .writer , 0 , .limited (1024 ));
assert (reader .buffered ()[0 ] == 0 );
reader .toss (1 );
this_record_len += 1 ;
if (this_record_len % 4 != 0 ) {
const round_to_next_4 = (this_record_len | 0x3 ) + 1 ;
const march_forward_bytes = round_to_next_4 - this_record_len ;
try stream .seekBy (@as (isize , @intCast (march_forward_bytes )));
this_record_len += march_forward_bytes ;
}
try modules .ensureUnusedCapacity (gpa , 1 );
const module_name_slice = try module_name .toOwnedSlice ();
errdefer gpa .free (module_name_slice );
const obj_file_name_slice = try obj_file_name .toOwnedSlice ();
errdefer gpa .free (obj_file_name_slice );
modules .appendAssumeCapacity (.{
.mod_info = mod_info ,
.module_name = module_name_slice ,
.obj_file_name = obj_file_name_slice ,
.populated = false ,
.symbols = undefined ,
.subsect_info = undefined ,
.checksum_offset = null ,
.inlinee_source_lines = undefined ,
});
mod_info_offset += this_record_len ;
if (mod_info_offset > mod_info_size )
return error .InvalidDebugInfo ;
}
var sect_contribs : std .ArrayList (pdb .SectionContribEntry ) = .empty ;
defer sect_contribs .deinit (gpa );
var sect_cont_offset : usize = 0 ;
if (section_contrib_size != 0 ) {
const version = reader .takeEnum (pdb .SectionContrSubstreamVersion , .little ) catch |err | switch (err ) {
error .InvalidEnumTag , error .EndOfStream => return error .InvalidDebugInfo ,
error .ReadFailed => |e | return e ,
};
_ = version ;
sect_cont_offset += @sizeOf (u32 );
}
while (sect_cont_offset != section_contrib_size ) {
const entry = try sect_contribs .addOne (gpa );
entry .* = try reader .takeStruct (pdb .SectionContribEntry , .little );
sect_cont_offset += @sizeOf (pdb .SectionContribEntry );
if (sect_cont_offset > section_contrib_size )
return error .InvalidDebugInfo ;
}
try sect_contribs .shrinkToLen (gpa );
try modules .shrinkToLen (gpa );
self .sect_contribs = sect_contribs .toOwnedSliceAssert ();
self .modules = modules .toOwnedSliceAssert ();
}