mirror of
https://github.com/golang/go
synced 2024-11-02 13:42:29 +00:00
cmd/cgo: remove -fsanitize=hwaddress hardware tags
No test because this isn't support on any of the builders. Fixes #53285 Change-Id: If8d17bdcdac81a6ce404a35a289bf83f07f02855 Reviewed-on: https://go-review.googlesource.com/c/go/+/411698 Auto-Submit: Ian Lance Taylor <iant@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Run-TryBot: Ian Lance Taylor <iant@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
parent
5ee939b819
commit
fbc75dff2f
1 changed files with 29 additions and 8 deletions
|
@ -1831,6 +1831,23 @@ func (p *Package) gccDebug(stdin []byte, nnames int) (d *dwarf.Data, ints []int6
|
|||
bo := f.ByteOrder
|
||||
symtab, err := f.Symbols()
|
||||
if err == nil {
|
||||
// Check for use of -fsanitize=hwaddress (issue 53285).
|
||||
removeTag := func(v uint64) uint64 { return v }
|
||||
if goarch == "arm64" {
|
||||
for i := range symtab {
|
||||
if symtab[i].Name == "__hwasan_init" {
|
||||
// -fsanitize=hwaddress on ARM
|
||||
// uses the upper byte of a
|
||||
// memory address as a hardware
|
||||
// tag. Remove it so that
|
||||
// we can find the associated
|
||||
// data.
|
||||
removeTag = func(v uint64) uint64 { return v &^ (0xff << (64 - 8)) }
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for i := range symtab {
|
||||
s := &symtab[i]
|
||||
switch {
|
||||
|
@ -1838,9 +1855,10 @@ func (p *Package) gccDebug(stdin []byte, nnames int) (d *dwarf.Data, ints []int6
|
|||
// Found it. Now find data section.
|
||||
if i := int(s.Section); 0 <= i && i < len(f.Sections) {
|
||||
sect := f.Sections[i]
|
||||
if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
|
||||
val := removeTag(s.Value)
|
||||
if sect.Addr <= val && val < sect.Addr+sect.Size {
|
||||
if sdat, err := sect.Data(); err == nil {
|
||||
data := sdat[s.Value-sect.Addr:]
|
||||
data := sdat[val-sect.Addr:]
|
||||
ints = make([]int64, len(data)/8)
|
||||
for i := range ints {
|
||||
ints[i] = int64(bo.Uint64(data[i*8:]))
|
||||
|
@ -1852,9 +1870,10 @@ func (p *Package) gccDebug(stdin []byte, nnames int) (d *dwarf.Data, ints []int6
|
|||
// Found it. Now find data section.
|
||||
if i := int(s.Section); 0 <= i && i < len(f.Sections) {
|
||||
sect := f.Sections[i]
|
||||
if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
|
||||
val := removeTag(s.Value)
|
||||
if sect.Addr <= val && val < sect.Addr+sect.Size {
|
||||
if sdat, err := sect.Data(); err == nil {
|
||||
data := sdat[s.Value-sect.Addr:]
|
||||
data := sdat[val-sect.Addr:]
|
||||
floats = make([]float64, len(data)/8)
|
||||
for i := range floats {
|
||||
floats[i] = math.Float64frombits(bo.Uint64(data[i*8:]))
|
||||
|
@ -1867,9 +1886,10 @@ func (p *Package) gccDebug(stdin []byte, nnames int) (d *dwarf.Data, ints []int6
|
|||
// Found it. Now find data section.
|
||||
if i := int(s.Section); 0 <= i && i < len(f.Sections) {
|
||||
sect := f.Sections[i]
|
||||
if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
|
||||
val := removeTag(s.Value)
|
||||
if sect.Addr <= val && val < sect.Addr+sect.Size {
|
||||
if sdat, err := sect.Data(); err == nil {
|
||||
data := sdat[s.Value-sect.Addr:]
|
||||
data := sdat[val-sect.Addr:]
|
||||
strdata[n] = string(data)
|
||||
}
|
||||
}
|
||||
|
@ -1880,9 +1900,10 @@ func (p *Package) gccDebug(stdin []byte, nnames int) (d *dwarf.Data, ints []int6
|
|||
// Found it. Now find data section.
|
||||
if i := int(s.Section); 0 <= i && i < len(f.Sections) {
|
||||
sect := f.Sections[i]
|
||||
if sect.Addr <= s.Value && s.Value < sect.Addr+sect.Size {
|
||||
val := removeTag(s.Value)
|
||||
if sect.Addr <= val && val < sect.Addr+sect.Size {
|
||||
if sdat, err := sect.Data(); err == nil {
|
||||
data := sdat[s.Value-sect.Addr:]
|
||||
data := sdat[val-sect.Addr:]
|
||||
strlen := bo.Uint64(data[:8])
|
||||
if strlen > (1<<(uint(p.IntSize*8)-1) - 1) { // greater than MaxInt?
|
||||
fatalf("string literal too big")
|
||||
|
|
Loading…
Reference in a new issue