Function findTrackable [src]

Find all tracked ZIR instructions, recursively, within a declaration instruction. Does not recurse through nested declarations; to find all declarations, call this function recursively on the type declarations discovered in contents.explicit_types. This populates an ArrayListUnmanaged because an iterator would need to allocate memory anyway.

Prototype

pub fn findTrackable(zir: Zir, gpa: Allocator, contents: *DeclContents, decl_inst: Zir.Inst.Index) !void

Parameters

zir: Zirgpa: Allocatorcontents: *DeclContentsdecl_inst: Zir.Inst.Index

Source

pub fn findTrackable(zir: Zir, gpa: Allocator, contents: *DeclContents, decl_inst: Zir.Inst.Index) !void { contents.clear(); const decl = zir.getDeclaration(decl_inst); // `defer` instructions duplicate the same body arbitrarily many times, but we only want to traverse // their contents once per defer. So, we store the extra index of the body here to deduplicate. var found_defers: std.AutoHashMapUnmanaged(u32, void) = .empty; defer found_defers.deinit(gpa); if (decl.type_body) |b| try zir.findTrackableBody(gpa, contents, &found_defers, b); if (decl.align_body) |b| try zir.findTrackableBody(gpa, contents, &found_defers, b); if (decl.linksection_body) |b| try zir.findTrackableBody(gpa, contents, &found_defers, b); if (decl.addrspace_body) |b| try zir.findTrackableBody(gpa, contents, &found_defers, b); if (decl.value_body) |b| try zir.findTrackableBody(gpa, contents, &found_defers, b); }