// addSpilledParam declares a parameter that is pre-spilled to the // stack; the function body will load/store the spilled location. // Subsequent registerization will eliminate spills where possible. // func (f *Function) addSpilledParam(obj types.Object) { name := obj.GetName() param := f.addParam(name, obj.GetType()) spill := &Alloc{ Name_: name + "~", // "~" means "spilled" Type_: pointer(obj.GetType()), } f.objects[obj] = spill f.Locals = append(f.Locals, spill) f.emit(spill) f.emit(&Store{Addr: spill, Val: param}) }
// addNamedLocal creates a local variable, adds it to function f and // returns it. Its name and type are taken from obj. Subsequent // calls to f.lookup(obj) will return the same local. // // Precondition: f.syntax != nil (i.e. a Go source function). // func (f *Function) addNamedLocal(obj types.Object) *Alloc { l := f.addLocal(obj.GetType()) l.Name_ = obj.GetName() f.objects[obj] = l return l }