// Copyright 2020 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package ld import "cmd/link/internal/loader" // Min-heap implementation, for the deadcode pass. // Specialized for loader.Sym elements. type heap []loader.Sym func (h *heap) push(s loader.Sym) { *h = append(*h, s) // sift up n := len(*h) - 1 for n > 0 { p := (n - 1) / 2 // parent if (*h)[p] <= (*h)[n] { break } (*h)[n], (*h)[p] = (*h)[p], (*h)[n] n = p } } func (h *heap) pop() loader.Sym { r := (*h)[0] n := len(*h) - 1 (*h)[0] = (*h)[n] *h = (*h)[:n] // sift down i := 0 for { c := 2*i + 1 // left child if c >= n { break } if c1 := c + 1; c1 < n && (*h)[c1] < (*h)[c] { c = c1 // right child } if (*h)[i] <= (*h)[c] { break } (*h)[i], (*h)[c] = (*h)[c], (*h)[i] i = c } return r } func (h *heap) empty() bool { return len(*h) == 0 }