| // 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 } |