...
1
2
3
4
5 package ssa
6
7 import (
8 "testing"
9
10 "cmd/compile/internal/ir"
11 "cmd/compile/internal/typecheck"
12 "cmd/compile/internal/types"
13 "cmd/internal/obj"
14 "cmd/internal/obj/arm64"
15 "cmd/internal/obj/s390x"
16 "cmd/internal/obj/x86"
17 "cmd/internal/src"
18 )
19
20 var CheckFunc = checkFunc
21 var Opt = opt
22 var Deadcode = deadcode
23 var Copyelim = copyelim
24
25 var testCtxts = map[string]*obj.Link{
26 "amd64": obj.Linknew(&x86.Linkamd64),
27 "s390x": obj.Linknew(&s390x.Links390x),
28 "arm64": obj.Linknew(&arm64.Linkarm64),
29 }
30
31 func testConfig(tb testing.TB) *Conf { return testConfigArch(tb, "amd64") }
32 func testConfigS390X(tb testing.TB) *Conf { return testConfigArch(tb, "s390x") }
33 func testConfigARM64(tb testing.TB) *Conf { return testConfigArch(tb, "arm64") }
34
35 func testConfigArch(tb testing.TB, arch string) *Conf {
36 ctxt, ok := testCtxts[arch]
37 if !ok {
38 tb.Fatalf("unknown arch %s", arch)
39 }
40 if ctxt.Arch.PtrSize != 8 {
41 tb.Fatal("testTypes is 64-bit only")
42 }
43 c := &Conf{
44 config: NewConfig(arch, testTypes, ctxt, true, false),
45 tb: tb,
46 }
47 return c
48 }
49
50 type Conf struct {
51 config *Config
52 tb testing.TB
53 fe Frontend
54 }
55
56 func (c *Conf) Frontend() Frontend {
57 if c.fe == nil {
58 pkg := types.NewPkg("my/import/path", "path")
59 fn := ir.NewFunc(src.NoXPos, src.NoXPos, pkg.Lookup("function"), types.NewSignature(nil, nil, nil))
60 fn.DeclareParams(true)
61 fn.LSym = &obj.LSym{Name: "my/import/path.function"}
62
63 c.fe = TestFrontend{
64 t: c.tb,
65 ctxt: c.config.ctxt,
66 f: fn,
67 }
68 }
69 return c.fe
70 }
71
72 func (c *Conf) Temp(typ *types.Type) *ir.Name {
73 n := ir.NewNameAt(src.NoXPos, &types.Sym{Name: "aFakeAuto"}, typ)
74 n.Class = ir.PAUTO
75 return n
76 }
77
78
79
80 type TestFrontend struct {
81 t testing.TB
82 ctxt *obj.Link
83 f *ir.Func
84 }
85
86 func (TestFrontend) StringData(s string) *obj.LSym {
87 return nil
88 }
89 func (d TestFrontend) SplitSlot(parent *LocalSlot, suffix string, offset int64, t *types.Type) LocalSlot {
90 return LocalSlot{N: parent.N, Type: t, Off: offset}
91 }
92 func (d TestFrontend) Syslook(s string) *obj.LSym {
93 return d.ctxt.Lookup(s)
94 }
95 func (TestFrontend) UseWriteBarrier() bool {
96 return true
97 }
98
99 func (d TestFrontend) Logf(msg string, args ...interface{}) { d.t.Logf(msg, args...) }
100 func (d TestFrontend) Log() bool { return true }
101
102 func (d TestFrontend) Fatalf(_ src.XPos, msg string, args ...interface{}) { d.t.Fatalf(msg, args...) }
103 func (d TestFrontend) Warnl(_ src.XPos, msg string, args ...interface{}) { d.t.Logf(msg, args...) }
104 func (d TestFrontend) Debug_checknil() bool { return false }
105
106 func (d TestFrontend) Func() *ir.Func {
107 return d.f
108 }
109
110 var testTypes Types
111
112 func init() {
113
114 types.PtrSize = 8
115 types.RegSize = 8
116 types.MaxWidth = 1 << 50
117
118 typecheck.InitUniverse()
119 testTypes.SetTypPtrs()
120 }
121
View as plain text