// Copyright 2014 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. // Test for auto-generated symbols. // There is no test for $f64. and $f32. symbols, because those are // not possible to write in the assembler syntax. Instead of changing // the assembler to allow that, we plan to change the compilers // not to generate such symbols (plain dupok data is sufficient). package main import ( "bytes" "cmd/internal/goobj" "testing" ) // Each test case is an object file, generated from a corresponding .s file. // The image of the autotab symbol should be a sequence of pairs of // identical 8-byte sequences. var autoTests = []string{ "testdata/autosection.6", "testdata/autoweak.6", } func TestAuto(t *testing.T) { for _, obj := range autoTests { p := Prog{GOOS: "darwin", GOARCH: "amd64", StartSym: "start"} p.omitRuntime = true p.Error = func(s string) { t.Error(s) } var buf bytes.Buffer p.link(&buf, obj) if p.NumError > 0 { continue // already reported } const name = "autotab" sym := p.Syms[goobj.SymID{Name: name}] if sym == nil { t.Errorf("%s is missing %s symbol", obj, name) return } if sym.Size == 0 { return } seg := sym.Section.Segment off := sym.Addr - seg.VirtAddr data := seg.Data[off : off+Addr(sym.Size)] if len(data)%16 != 0 { t.Errorf("%s: %s.Size = %d, want multiple of 16", obj, name, len(data)) return } Data: for i := 0; i < len(data); i += 16 { have := p.byteorder.Uint64(data[i : i+8]) want := p.byteorder.Uint64(data[i+8 : i+16]) if have != want { // Look for relocation so we can explain what went wrong. for _, r := range sym.Reloc { if r.Offset == i { t.Errorf("%s: %s+%#x: %s: have %#x want %#x", obj, name, i, r.Sym, have, want) continue Data } } t.Errorf("%s: %s+%#x: have %#x want %#x", obj, name, i, have, want) } } } }