Skip to content

Commit 8daff0e

Browse files
committed
objects: fixes and extensions for builder
- use walkObj as the creation point where we can - deploy as per type
1 parent 60a227b commit 8daff0e

File tree

3 files changed

+110
-73
lines changed

3 files changed

+110
-73
lines changed

objects/builder.go

Lines changed: 72 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
package objects
1616

1717
import (
18-
"fmt"
1918
"go/token"
2019
"go/types"
2120

@@ -104,72 +103,48 @@ func (b *Builder) Type(ty typeset.Type) *Builder {
104103
}
105104

106105
func (b *Builder) Struct(gty *types.Struct) *Struct {
107-
b.GoType(gty)
108-
s := &Struct{}
109-
s.loc = b.Gen()
110-
s.typ = b.mmod.Type(s.loc)
111-
n := memory.Loc(b.mmod.Lsize(s.loc))
112-
s.fields = make([]memory.Loc, 0, gty.NumFields())
113-
for i := memory.Loc(1); i < n; i++ {
114-
pfloc := b.mmod.Parent(s.loc + i)
115-
if pfloc != s.loc {
116-
continue
117-
}
118-
s.fields = append(s.fields, s.loc+i)
119-
}
120-
if len(s.fields) != gty.NumFields() {
121-
panic("internal error")
122-
}
123-
b.omap[s.loc] = s
124-
b.walkObj(s.loc)
125-
return s
106+
m := b.GoType(gty).Gen()
107+
b.walkObj(m)
108+
return b.omap[m].(*Struct)
109+
}
110+
111+
func (b *Builder) Tuple(ty *types.Tuple) *Tuple {
112+
m := b.GoType(ty).Gen()
113+
b.walkObj(m)
114+
return b.omap[m].(*Tuple)
126115
}
127116

128117
func (b *Builder) Array(gty *types.Array) *Array {
129-
b.GoType(gty)
130-
a := &Array{}
131-
a.loc = b.Gen()
132-
a.typ = b.mmod.Type(a.loc)
133-
a.n = gty.Len()
134-
a.elemSize = int64(b.ts.Lsize(b.ts.Elem(a.typ)))
135-
b.omap[a.loc] = a
136-
b.walkObj(a.loc)
137-
return a
118+
m := b.GoType(gty).Gen()
119+
b.walkObj(m)
120+
return b.omap[m].(*Array)
138121
}
139122

140123
func (b *Builder) Slice(gty *types.Slice, length, capacity indexing.I) *Slice {
141124
ty := b.ts.FromGoType(gty)
142-
b.Type(ty)
143-
s := &Slice{}
144-
s.loc = b.Gen()
145-
s.Len = length
146-
s.Cap = capacity
147-
// add one uni-slot by default.
148-
b.AddSlot(s, b.indexing.Var())
149-
b.omap[s.loc] = s
150-
return s
125+
m := b.Type(ty).Gen()
126+
b.walkObj(m)
127+
sl := b.omap[m].(*Slice)
128+
sl.Len = length
129+
sl.Cap = capacity
130+
b.AddSlot(sl, b.indexing.Var())
131+
return sl
151132
}
152133

153134
func (b *Builder) AddSlot(slice *Slice, i indexing.I) {
154135
elem := b.ts.Elem(slice.typ)
136+
loc := b.Type(elem).Gen()
155137
slice.slots = append(slice.slots, Slot{
156-
Loc: b.Type(elem).Gen(),
138+
Loc: loc,
157139
I: i})
140+
b.walkObj(loc)
158141
}
159142

160143
func (b *Builder) Map(gty *types.Map) *Map {
161144
ty := b.ts.FromGoType(gty)
162-
kty, ety := b.ts.Key(ty), b.ts.Elem(ty)
163-
mloc := b.mmod.Gen(b.mgp.Type(ty))
164-
kloc := b.Type(kty).Gen()
165-
eloc := b.Type(ety).Gen()
166-
b.mmod.AddAddressOf(mloc, eloc)
167-
168-
m := &Map{key: kloc, elem: eloc}
169-
m.loc = mloc
170-
m.typ = ty
171-
b.omap[m.loc] = m
172-
return m
145+
m := b.Type(ty).Gen()
146+
b.walkObj(m)
147+
return b.omap[m].(*Map)
173148
}
174149

175150
func (b *Builder) Object(m memory.Loc) Object {
@@ -212,6 +187,7 @@ func (b *Builder) Func(sig *types.Signature, declName string, opaque memory.Attr
212187
if recv != nil {
213188
b.mgp.Type(b.ts.FromGoType(recv.Type()))
214189
fn.recv = b.mmod.Gen(b.mgp)
190+
b.walkObj(fn.recv)
215191
}
216192
params := sig.Params()
217193
N := params.Len()
@@ -220,6 +196,7 @@ func (b *Builder) Func(sig *types.Signature, declName string, opaque memory.Attr
220196
pty := b.ts.FromGoType(param.Type())
221197
fn.params[i] =
222198
b.Pos(param.Pos()).Type(pty).Attrs(memory.IsParam | opaque).Gen()
199+
b.walkObj(fn.params[i])
223200
}
224201
rets := sig.Results()
225202
N = rets.Len()
@@ -228,6 +205,7 @@ func (b *Builder) Func(sig *types.Signature, declName string, opaque memory.Attr
228205
rty := b.ts.FromGoType(ret.Type())
229206
fn.results[i] =
230207
b.Pos(ret.Pos()).Type(rty).Attrs(memory.IsReturn | opaque).Gen()
208+
b.walkObj(fn.results[i])
231209
}
232210
// TBD: FreeVars
233211
b.omap[fn.loc] = fn
@@ -245,7 +223,6 @@ func (b *Builder) walkObj(m memory.Loc) {
245223
switch ty {
246224
case typeset.Pointer:
247225
if b.omap[m] == nil {
248-
fmt.Printf("walk ptr\n")
249226
ptr := &Pointer{}
250227
ptr.loc = m
251228
ptr.typ = ty
@@ -256,7 +233,6 @@ func (b *Builder) walkObj(m memory.Loc) {
256233
var arr *Array
257234
obj := b.omap[m]
258235
if obj == nil {
259-
fmt.Printf("walk arr\n")
260236
arr = &Array{}
261237
arr.loc = m
262238
arr.typ = ty
@@ -276,42 +252,76 @@ func (b *Builder) walkObj(m memory.Loc) {
276252
var strukt *Struct
277253
obj := b.omap[m]
278254
if obj == nil {
279-
fmt.Printf("walk str\n")
280255
strukt = &Struct{}
281256
strukt.loc = m
282257
strukt.typ = ty
283-
n := b.ts.NumFields(ty)
284-
strukt.fields = make([]memory.Loc, 0, n)
285-
for i := 0; i < n; i++ {
286-
_, _, foff := b.ts.Field(ty, i)
287-
strukt.fields[i] = m + memory.Loc(foff)
288-
b.walkObj(m + memory.Loc(foff))
289-
}
290258
b.omap[m] = strukt
291259
} else {
292260
strukt = obj.(*Struct)
293261
}
262+
n := b.ts.NumFields(ty)
263+
strukt.fields = make([]memory.Loc, n)
264+
for i := 0; i < n; i++ {
265+
_, _, foff := b.ts.Field(ty, i)
266+
floc := m + memory.Loc(foff)
267+
strukt.fields[i] = floc
268+
b.walkObj(floc)
269+
}
294270

295271
case typeset.Chan:
296272
case typeset.Map:
297273
var ma *Map
298274
obj := b.omap[m]
299275
if obj == nil {
300-
fmt.Printf("walk map\n")
301-
ma := &Map{}
276+
ma = &Map{}
302277
ma.loc = m
303278
ma.typ = ty
279+
ma.key = b.Type(b.ts.Key(ty)).Gen()
280+
ma.elem = b.Type(b.ts.Elem(ty)).Gen()
281+
b.mmod.AddAddressOf(ma.loc, ma.elem)
304282
b.omap[m] = ma
305283
} else {
306284
ma = obj.(*Map)
307285
}
308286
b.walkObj(ma.key)
309287
b.walkObj(ma.elem)
310288
case typeset.Slice:
289+
var slice *Slice
290+
obj := b.omap[m]
291+
if obj == nil {
292+
slice = &Slice{}
293+
slice.loc = m
294+
slice.typ = b.mmod.Type(m)
295+
slice.Len = b.indexing.Var()
296+
slice.Cap = b.indexing.Var()
297+
b.omap[m] = slice
298+
} else {
299+
slice = obj.(*Slice)
300+
}
301+
311302
case typeset.Interface:
312303
case typeset.Func:
313304
case typeset.Named:
305+
314306
case typeset.Tuple:
307+
var tuple *Tuple
308+
obj := b.omap[m]
309+
if obj == nil {
310+
tuple = &Tuple{}
311+
tuple.loc = m
312+
tuple.typ = ty
313+
b.omap[m] = tuple
314+
} else {
315+
tuple = obj.(*Tuple)
316+
}
317+
n := b.ts.NumFields(ty)
318+
tuple.fields = make([]memory.Loc, n)
319+
for i := 0; i < n; i++ {
320+
_, _, foff := b.ts.Field(ty, i)
321+
floc := m + memory.Loc(foff)
322+
tuple.fields[i] = floc
323+
b.walkObj(floc)
324+
}
315325

316326
}
317327
}

ssa2pal/t.go

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -185,28 +185,34 @@ func (p *T) genConstraints(name string, fn *ssa.Function) {
185185

186186
func (p *T) genBlockValues(name string, blk *ssa.BasicBlock) {
187187
rands := make([]*ssa.Value, 0, 13)
188+
var ssaVal ssa.Value
189+
var ok bool
188190
for _, i9n := range blk.Instrs {
191+
ssaVal = nil
189192
switch v := i9n.(type) {
190193
case *ssa.DebugRef, *ssa.Defer, *ssa.Go, *ssa.If, *ssa.Jump,
191194
*ssa.MapUpdate, *ssa.Panic, *ssa.Return,
192195
*ssa.RunDefers, *ssa.Send, *ssa.Store:
193196
// these are not values
194197
default:
195-
vv := v.(ssa.Value)
196-
_, ok := p.vmap[vv]
197-
if !ok {
198-
p.genValueLoc(v.(ssa.Value))
199-
}
198+
ssaVal = v.(ssa.Value)
200199
}
201200
rands = i9n.Operands(rands[:0])
202201
for _, arg := range rands {
203202
_, ok := p.vmap[*arg]
204203
if !ok && *arg != nil {
205204
// I believe that if *arg is nil, the
206-
// arg is irrelevant. This does happen.
205+
// arg is irrelevant (eg Slice with 1 or 2 args).
207206
p.genValueLoc(*arg)
208207
}
209208
}
209+
if ssaVal == nil {
210+
continue
211+
}
212+
_, ok = p.vmap[ssaVal]
213+
if !ok {
214+
p.genValueLoc(ssaVal)
215+
}
210216
}
211217
}
212218

@@ -215,7 +221,13 @@ func (p *T) genBlockValues(name string, blk *ssa.BasicBlock) {
215221
// genValueLoc may need to work recursively on struct and
216222
// array typed structured data.
217223
func (p *T) genValueLoc(v ssa.Value) memory.Loc {
218-
fmt.Printf("genValueLoc(%s)\n", v)
224+
defer func() {
225+
if e := recover(); e != nil {
226+
fmt.Printf("oops %s (%#v)\n", v, v)
227+
os.Stdout.Sync()
228+
panic(e)
229+
}
230+
}()
219231
p.buildr.Pos(v.Pos()).GoType(v.Type()).Class(memory.Local).Attrs(memory.NoAttrs)
220232
var res memory.Loc
221233
switch v := v.(type) {
@@ -284,15 +296,30 @@ func (p *T) genValueLoc(v ssa.Value) memory.Loc {
284296
t := p.buildr.Object(tloc).(*objects.Tuple)
285297
res = t.Field(v.Index)
286298

287-
//v.Tuple, v.Index
288-
289299
case *ssa.Const:
290300
return memory.NoLoc
291301

292302
default:
293-
res = p.buildr.Gen()
303+
switch ty := v.Type().Underlying().(type) {
304+
case *types.Tuple:
305+
res = p.buildr.Tuple(ty).Loc()
306+
case *types.Struct:
307+
res = p.buildr.Struct(ty).Loc()
308+
case *types.Array:
309+
res = p.buildr.Array(ty).Loc()
310+
case *types.Slice:
311+
res = p.buildr.Slice(ty, nil, nil).Loc()
312+
case *types.Map:
313+
res = p.buildr.Map(ty).Loc()
314+
case *types.Signature:
315+
res = p.buildr.Func(ty, "", memory.NoAttrs).Loc()
316+
default:
317+
res = p.buildr.Gen()
318+
}
319+
294320
}
295321
p.vmap[v] = res
322+
//fmt.Printf("genValueLoc(%s): %d\n", v, res)
296323
return res
297324
}
298325

typeset/gotypes.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ func (t *TypeSet) FromGoType(gotype types.Type) Type {
161161
}
162162
return res
163163
default:
164-
panic(fmt.Sprintf("pal type cannot represent go type %s", gotype))
164+
panic(fmt.Sprintf("pal type cannot represent go type %s (%#v)", gotype, gotype))
165165
}
166166
}
167167

0 commit comments

Comments
 (0)