67 lines
952 B
Go
67 lines
952 B
Go
package loader
|
|
|
|
import (
|
|
"math"
|
|
"math/bits"
|
|
)
|
|
|
|
func clampAddUint64(x uint64, y uint64) uint64 {
|
|
z, carry := bits.Add64(x, y, 0)
|
|
if carry != 0 {
|
|
return math.MaxUint64
|
|
}
|
|
return z
|
|
}
|
|
|
|
type addrRange struct {
|
|
min, max uint64
|
|
}
|
|
|
|
func newAddrRange() addrRange {
|
|
return addrRange{min: math.MaxUint64, max: 0}
|
|
}
|
|
|
|
func (a addrRange) len() uint64 {
|
|
if a.min >= a.max {
|
|
return 0
|
|
}
|
|
return a.max - a.min
|
|
}
|
|
|
|
/*
|
|
func (a addrRange) contains(addr uint64) bool {
|
|
if a.len() == 0 {
|
|
return false
|
|
}
|
|
return a.min <= addr && addr < a.max
|
|
}
|
|
*/
|
|
|
|
func (a addrRange) containsRange(b addrRange) bool {
|
|
if a.len() == 0 || b.len() == 0 {
|
|
return false
|
|
}
|
|
return a.min <= b.min && a.max >= b.max
|
|
}
|
|
|
|
func (a *addrRange) extendToFit(x uint64) {
|
|
if x < a.min {
|
|
a.min = x
|
|
}
|
|
if x > a.max {
|
|
a.max = x
|
|
}
|
|
}
|
|
|
|
func (a *addrRange) insert(b addrRange) {
|
|
if b.len() == 0 {
|
|
return
|
|
}
|
|
if b.min < a.min {
|
|
a.min = b.min
|
|
}
|
|
if b.max > a.max {
|
|
a.max = b.max
|
|
}
|
|
}
|