1
0
mirror of https://github.com/golang/go synced 2024-10-05 20:31:20 -06:00

[dev.ssa] cmd/compile/ssa: add -f suffix to logging methods

Requested in CL 11380.

Change-Id: Icf0d23fb8d383c76272401e363cc9b2169d11403
Reviewed-on: https://go-review.googlesource.com/11450
Reviewed-by: Alan Donovan <adonovan@google.com>
This commit is contained in:
Josh Bleecher Snyder 2015-06-24 14:03:39 -07:00
parent d779b20cd2
commit 37ddc270ca
18 changed files with 85 additions and 85 deletions

View File

@ -135,13 +135,13 @@ type state struct {
line []int32
}
func (s *state) Fatal(msg string, args ...interface{}) { s.config.Fatal(msg, args...) }
func (s *state) Unimplemented(msg string, args ...interface{}) { s.config.Unimplemented(msg, args...) }
func (s *state) Fatalf(msg string, args ...interface{}) { s.config.Fatalf(msg, args...) }
func (s *state) Unimplementedf(msg string, args ...interface{}) { s.config.Unimplementedf(msg, args...) }
// startBlock sets the current block we're generating code in to b.
func (s *state) startBlock(b *ssa.Block) {
if s.curBlock != nil {
s.Fatal("starting block %v when block %v has not ended", b, s.curBlock)
s.Fatalf("starting block %v when block %v has not ended", b, s.curBlock)
}
s.curBlock = b
s.vars = map[string]*ssa.Value{}
@ -294,7 +294,7 @@ func (s *state) stmt(n *Node) {
s.startBlock(t)
}
if n.Op == OGOTO && s.curBlock == nil {
s.Unimplemented("goto at start of function; see test/goto.go")
s.Unimplementedf("goto at start of function; see test/goto.go")
}
case OAS, OASWB:
@ -354,7 +354,7 @@ func (s *state) stmt(n *Node) {
// generate code to test condition
// TODO(khr): Left == nil exception
if n.Left == nil {
s.Unimplemented("cond n.Left == nil: %v", n)
s.Unimplementedf("cond n.Left == nil: %v", n)
}
s.startBlock(bCond)
cond := s.expr(n.Left)
@ -381,7 +381,7 @@ func (s *state) stmt(n *Node) {
// TODO(khr): ??? anything to do here? Only for addrtaken variables?
// Maybe just link it in the store chain?
default:
s.Unimplemented("unhandled stmt %s", opnames[n.Op])
s.Unimplementedf("unhandled stmt %s", opnames[n.Op])
}
}
@ -409,7 +409,7 @@ func (s *state) expr(n *Node) *ssa.Value {
case CTSTR:
return s.entryNewValue0A(ssa.OpConst, n.Type, n.Val().U)
default:
s.Unimplemented("unhandled OLITERAL %v", n.Val().Ctype())
s.Unimplementedf("unhandled OLITERAL %v", n.Val().Ctype())
return nil
}
case OCONVNOP:
@ -513,7 +513,7 @@ func (s *state) expr(n *Node) *ssa.Value {
a := s.entryNewValue1I(ssa.OpOffPtr, Ptrto(fp.Type), fp.Width, s.sp)
return s.newValue2(ssa.OpLoad, fp.Type, a, call)
default:
s.Unimplemented("unhandled expr %s", opnames[n.Op])
s.Unimplementedf("unhandled expr %s", opnames[n.Op])
return nil
}
}
@ -533,7 +533,7 @@ func (s *state) assign(op uint8, left *Node, right *Node) {
case t.IsBoolean():
val = s.entryNewValue0A(ssa.OpConst, left.Type, false) // TODO: store bools as 0/1 in AuxInt?
default:
s.Unimplemented("zero for type %v not implemented", t)
s.Unimplementedf("zero for type %v not implemented", t)
}
} else {
val = s.expr(right)
@ -563,7 +563,7 @@ func (s *state) addr(n *Node) *ssa.Value {
return s.expr(n.Name.Heapaddr)
default:
// TODO: address of locals
s.Unimplemented("variable address of %v not implemented", n)
s.Unimplementedf("variable address of %v not implemented", n)
return nil
}
case OINDREG:
@ -586,7 +586,7 @@ func (s *state) addr(n *Node) *ssa.Value {
return s.newValue2(ssa.OpPtrIndex, Ptrto(n.Left.Type.Type), p, i)
}
default:
s.Unimplemented("addr: bad op %v", Oconv(int(n.Op), 0))
s.Unimplementedf("addr: bad op %v", Oconv(int(n.Op), 0))
return nil
}
}
@ -652,7 +652,7 @@ func (s *state) variable(name string, t ssa.Type) *ssa.Value {
// Unimplemented instead of Fatal because fixedbugs/bug303.go
// demonstrates a case in which this appears to happen legitimately.
// TODO: decide on the correct behavior here.
s.Unimplemented("nil curblock adding variable %v (%v)", name, t)
s.Unimplementedf("nil curblock adding variable %v (%v)", name, t)
}
v := s.vars[name]
if v == nil {
@ -705,7 +705,7 @@ func (s *state) lookupVarIncoming(b *ssa.Block, t ssa.Type, name string) *ssa.Va
vals = append(vals, s.lookupVarOutgoing(p, t, name))
}
if len(vals) == 0 {
s.Unimplemented("TODO: Handle fixedbugs/bug076.go")
s.Unimplementedf("TODO: Handle fixedbugs/bug076.go")
return nil
}
v0 := vals[0]
@ -868,7 +868,7 @@ func genValue(v *ssa.Value) {
p.To.Type = obj.TYPE_REG
p.To.Reg = regnum(v)
case ssa.OpAMD64MULQconst:
v.Unimplemented("IMULQ doasm")
v.Unimplementedf("IMULQ doasm")
return
// TODO: this isn't right. doasm fails on it. I don't think obj
// has ever been taught to compile imul $c, r1, r2.
@ -903,7 +903,7 @@ func genValue(v *ssa.Value) {
r := regnum(v)
if x != r {
if r == x86.REG_CX {
v.Fatal("can't implement %s, target and shift both in CX", v.LongString())
v.Fatalf("can't implement %s, target and shift both in CX", v.LongString())
}
p := Prog(x86.AMOVQ)
p.From.Type = obj.TYPE_REG
@ -1052,12 +1052,12 @@ func genValue(v *ssa.Value) {
loc := f.RegAlloc[v.ID]
for _, a := range v.Args {
if f.RegAlloc[a.ID] != loc { // TODO: .Equal() instead?
v.Fatal("phi arg at different location than phi %v %v %v %v", v, loc, a, f.RegAlloc[a.ID])
v.Fatalf("phi arg at different location than phi %v %v %v %v", v, loc, a, f.RegAlloc[a.ID])
}
}
case ssa.OpConst:
if v.Block.Func.RegAlloc[v.ID] != nil {
v.Fatal("const value %v shouldn't have a location", v)
v.Fatalf("const value %v shouldn't have a location", v)
}
case ssa.OpArg:
// memory arg needs no code
@ -1082,7 +1082,7 @@ func genValue(v *ssa.Value) {
case ssa.OpFP, ssa.OpSP:
// nothing to do
default:
v.Unimplemented("value %s not implemented", v.LongString())
v.Unimplementedf("value %s not implemented", v.LongString())
}
}
@ -1190,7 +1190,7 @@ func genBlock(b, next *ssa.Block, branches []branch) []branch {
}
default:
b.Unimplemented("branch %s not implemented", b.LongString())
b.Unimplementedf("branch %s not implemented", b.LongString())
}
return branches
}
@ -1244,7 +1244,7 @@ func (*ssaExport) StringSym(s string) interface{} {
}
// Log logs a message from the compiler.
func (e *ssaExport) Log(msg string, args ...interface{}) {
func (e *ssaExport) Logf(msg string, args ...interface{}) {
// If e was marked as unimplemented, anything could happen. Ignore.
if e.log && !e.unimplemented {
fmt.Printf(msg, args...)
@ -1252,7 +1252,7 @@ func (e *ssaExport) Log(msg string, args ...interface{}) {
}
// Fatal reports a compiler error and exits.
func (e *ssaExport) Fatal(msg string, args ...interface{}) {
func (e *ssaExport) Fatalf(msg string, args ...interface{}) {
// If e was marked as unimplemented, anything could happen. Ignore.
if !e.unimplemented {
Fatal(msg, args...)
@ -1261,7 +1261,7 @@ func (e *ssaExport) Fatal(msg string, args ...interface{}) {
// Unimplemented reports that the function cannot be compiled.
// It will be removed once SSA work is complete.
func (e *ssaExport) Unimplemented(msg string, args ...interface{}) {
func (e *ssaExport) Unimplementedf(msg string, args ...interface{}) {
const alwaysLog = false // enable to calculate top unimplemented features
if !e.unimplemented && (e.log || alwaysLog) {
// first implementation failure, print explanation

View File

@ -70,6 +70,6 @@ func (b *Block) LongString() string {
return s
}
func (b *Block) Log(msg string, args ...interface{}) { b.Func.Log(msg, args...) }
func (b *Block) Fatal(msg string, args ...interface{}) { b.Func.Fatal(msg, args...) }
func (b *Block) Unimplemented(msg string, args ...interface{}) { b.Func.Unimplemented(msg, args...) }
func (b *Block) Logf(msg string, args ...interface{}) { b.Func.Logf(msg, args...) }
func (b *Block) Fatalf(msg string, args ...interface{}) { b.Func.Fatalf(msg, args...) }
func (b *Block) Unimplementedf(msg string, args ...interface{}) { b.Func.Unimplementedf(msg, args...) }

View File

@ -11,17 +11,17 @@ func checkFunc(f *Func) {
for _, b := range f.Blocks {
if blockMark[b.ID] {
f.Fatal("block %s appears twice in %s!", b, f.Name)
f.Fatalf("block %s appears twice in %s!", b, f.Name)
}
blockMark[b.ID] = true
if b.Func != f {
f.Fatal("%s.Func=%s, want %s", b, b.Func.Name, f.Name)
f.Fatalf("%s.Func=%s, want %s", b, b.Func.Name, f.Name)
}
for i, c := range b.Succs {
for j, d := range b.Succs {
if i != j && c == d {
f.Fatal("%s.Succs has duplicate block %s", b, c)
f.Fatalf("%s.Succs has duplicate block %s", b, c)
}
}
}
@ -44,64 +44,64 @@ func checkFunc(f *Func) {
}
}
if !found {
f.Fatal("block %s is not a succ of its pred block %s", b, p)
f.Fatalf("block %s is not a succ of its pred block %s", b, p)
}
}
switch b.Kind {
case BlockExit:
if len(b.Succs) != 0 {
f.Fatal("exit block %s has successors", b)
f.Fatalf("exit block %s has successors", b)
}
if b.Control == nil {
f.Fatal("exit block %s has no control value", b)
f.Fatalf("exit block %s has no control value", b)
}
if !b.Control.Type.IsMemory() {
f.Fatal("exit block %s has non-memory control value %s", b, b.Control.LongString())
f.Fatalf("exit block %s has non-memory control value %s", b, b.Control.LongString())
}
case BlockPlain:
if len(b.Succs) != 1 {
f.Fatal("plain block %s len(Succs)==%d, want 1", b, len(b.Succs))
f.Fatalf("plain block %s len(Succs)==%d, want 1", b, len(b.Succs))
}
if b.Control != nil {
f.Fatal("plain block %s has non-nil control %s", b, b.Control.LongString())
f.Fatalf("plain block %s has non-nil control %s", b, b.Control.LongString())
}
case BlockIf:
if len(b.Succs) != 2 {
f.Fatal("if block %s len(Succs)==%d, want 2", b, len(b.Succs))
f.Fatalf("if block %s len(Succs)==%d, want 2", b, len(b.Succs))
}
if b.Control == nil {
f.Fatal("if block %s has no control value", b)
f.Fatalf("if block %s has no control value", b)
}
if !b.Control.Type.IsBoolean() {
f.Fatal("if block %s has non-bool control value %s", b, b.Control.LongString())
f.Fatalf("if block %s has non-bool control value %s", b, b.Control.LongString())
}
case BlockCall:
if len(b.Succs) != 2 {
f.Fatal("call block %s len(Succs)==%d, want 2", b, len(b.Succs))
f.Fatalf("call block %s len(Succs)==%d, want 2", b, len(b.Succs))
}
if b.Control == nil {
f.Fatal("call block %s has no control value", b)
f.Fatalf("call block %s has no control value", b)
}
if !b.Control.Type.IsMemory() {
f.Fatal("call block %s has non-memory control value %s", b, b.Control.LongString())
f.Fatalf("call block %s has non-memory control value %s", b, b.Control.LongString())
}
if b.Succs[1].Kind != BlockExit {
f.Fatal("exception edge from call block %s does not go to exit but %s", b, b.Succs[1])
f.Fatalf("exception edge from call block %s does not go to exit but %s", b, b.Succs[1])
}
}
for _, v := range b.Values {
if valueMark[v.ID] {
f.Fatal("value %s appears twice!", v.LongString())
f.Fatalf("value %s appears twice!", v.LongString())
}
valueMark[v.ID] = true
if v.Block != b {
f.Fatal("%s.block != %s", v, b)
f.Fatalf("%s.block != %s", v, b)
}
if v.Op == OpPhi && len(v.Args) != len(b.Preds) {
f.Fatal("phi length %s does not match pred length %d for block %s", v.LongString(), len(b.Preds), b)
f.Fatalf("phi length %s does not match pred length %d for block %s", v.LongString(), len(b.Preds), b)
}
// TODO: check for cycles in values
@ -111,12 +111,12 @@ func checkFunc(f *Func) {
for _, id := range f.bid.free {
if blockMark[id] {
f.Fatal("used block b%d in free list", id)
f.Fatalf("used block b%d in free list", id)
}
}
for _, id := range f.vid.free {
if valueMark[id] {
f.Fatal("used value v%d in free list", id)
f.Fatalf("used value v%d in free list", id)
}
}
}

View File

@ -15,13 +15,13 @@ import "log"
func Compile(f *Func) {
// TODO: debugging - set flags to control verbosity of compiler,
// which phases to dump IR before/after, etc.
f.Log("compiling %s\n", f.Name)
f.Logf("compiling %s\n", f.Name)
// hook to print function & phase if panic happens
phaseName := "init"
defer func() {
if phaseName != "" {
f.Fatal("panic during %s while compiling %s\n", phaseName, f.Name)
f.Fatalf("panic during %s while compiling %s\n", phaseName, f.Name)
}
}()
@ -30,9 +30,9 @@ func Compile(f *Func) {
checkFunc(f)
for _, p := range passes {
phaseName = p.name
f.Log(" pass %s begin\n", p.name)
f.Logf(" pass %s begin\n", p.name)
p.fn(f)
f.Log(" pass %s end\n", p.name)
f.Logf(" pass %s end\n", p.name)
printFunc(f)
checkFunc(f)
}

View File

@ -22,14 +22,14 @@ type Frontend interface {
StringSym(string) interface{} // returns *gc.Sym
// Log logs a message from the compiler.
Log(string, ...interface{})
Logf(string, ...interface{})
// Fatal reports a compiler error and exits.
Fatal(string, ...interface{})
Fatalf(string, ...interface{})
// Unimplemented reports that the function cannot be compiled.
// It will be removed once SSA work is complete.
Unimplemented(msg string, args ...interface{})
Unimplementedf(msg string, args ...interface{})
}
// NewConfig returns a new configuration object for the given architecture.
@ -45,7 +45,7 @@ func NewConfig(arch string, fe Frontend) *Config {
c.lowerBlock = rewriteBlockAMD64
c.lowerValue = rewriteValueAMD64 // TODO(khr): full 32-bit support
default:
fe.Unimplemented("arch %s not implemented", arch)
fe.Unimplementedf("arch %s not implemented", arch)
}
// cache the intptr type in the config
@ -63,9 +63,9 @@ func (c *Config) NewFunc() *Func {
return &Func{Config: c}
}
func (c *Config) Log(msg string, args ...interface{}) { c.fe.Log(msg, args...) }
func (c *Config) Fatal(msg string, args ...interface{}) { c.fe.Fatal(msg, args...) }
func (c *Config) Unimplemented(msg string, args ...interface{}) { c.fe.Unimplemented(msg, args...) }
func (c *Config) Logf(msg string, args ...interface{}) { c.fe.Logf(msg, args...) }
func (c *Config) Fatalf(msg string, args ...interface{}) { c.fe.Fatalf(msg, args...) }
func (c *Config) Unimplementedf(msg string, args ...interface{}) { c.fe.Unimplementedf(msg, args...) }
// TODO(khr): do we really need a separate Config, or can we just
// store all its fields inside a Func?

View File

@ -80,7 +80,7 @@ func deadcode(f *Func) {
i++
} else {
if len(b.Values) > 0 {
b.Fatal("live values in unreachable block %v: %v", b, b.Values)
b.Fatalf("live values in unreachable block %v: %v", b, b.Values)
}
f.bid.put(b.ID)
}
@ -103,7 +103,7 @@ func removePredecessor(b, c *Block) {
if n == 0 {
// c is now dead - don't bother working on it
if c.Preds[0] != b {
b.Fatal("%s.Preds[0]==%s, want %s", c, c.Preds[0], b)
b.Fatalf("%s.Preds[0]==%s, want %s", c, c.Preds[0], b)
}
return
}

View File

@ -56,12 +56,12 @@ func dse(f *Func) {
continue
}
if last != nil {
b.Fatal("two final stores - simultaneous live stores", last, v)
b.Fatalf("two final stores - simultaneous live stores", last, v)
}
last = v
}
if last == nil {
b.Fatal("no last store found - cycle?")
b.Fatalf("no last store found - cycle?")
}
// Walk backwards looking for dead stores. Keep track of shadowed addresses.

View File

@ -45,7 +45,7 @@ func postorder(f *Func) []*Block {
}
}
default:
b.Fatal("bad stack state %v %d", b, mark[b.ID])
b.Fatalf("bad stack state %v %d", b, mark[b.ID])
}
}
return order
@ -71,7 +71,7 @@ func dominators(f *Func) []*Block {
// Make the entry block a self-loop
idom[f.Entry.ID] = f.Entry
if postnum[f.Entry.ID] != len(post)-1 {
f.Fatal("entry block %v not last in postorder", f.Entry)
f.Fatalf("entry block %v not last in postorder", f.Entry)
}
// Compute relaxation of idom entries

View File

@ -19,6 +19,6 @@ func (DummyFrontend) StringSym(s string) interface{} {
return nil
}
func (d DummyFrontend) Log(msg string, args ...interface{}) { d.t.Logf(msg, args...) }
func (d DummyFrontend) Fatal(msg string, args ...interface{}) { d.t.Fatalf(msg, args...) }
func (d DummyFrontend) Unimplemented(msg string, args ...interface{}) { d.t.Fatalf(msg, args...) }
func (d DummyFrontend) Logf(msg string, args ...interface{}) { d.t.Logf(msg, args...) }
func (d DummyFrontend) Fatalf(msg string, args ...interface{}) { d.t.Fatalf(msg, args...) }
func (d DummyFrontend) Unimplementedf(msg string, args ...interface{}) { d.t.Fatalf(msg, args...) }

View File

@ -77,7 +77,7 @@ func (b *Block) NewValue0A(line int32, op Op, t Type, aux interface{}) *Value {
// Disallow int64 aux values. They should be in the auxint field instead.
// Maybe we want to allow this at some point, but for now we disallow it
// to prevent errors like using NewValue1A instead of NewValue1I.
b.Fatal("aux field has int64 type op=%s type=%s aux=%v", op, t, aux)
b.Fatalf("aux field has int64 type op=%s type=%s aux=%v", op, t, aux)
}
v := &Value{
ID: b.Func.vid.get(),
@ -208,6 +208,6 @@ func (f *Func) ConstInt(line int32, t Type, c int64) *Value {
return f.Entry.NewValue0I(line, OpConst, t, c)
}
func (f *Func) Log(msg string, args ...interface{}) { f.Config.Log(msg, args...) }
func (f *Func) Fatal(msg string, args ...interface{}) { f.Config.Fatal(msg, args...) }
func (f *Func) Unimplemented(msg string, args ...interface{}) { f.Config.Unimplemented(msg, args...) }
func (f *Func) Logf(msg string, args ...interface{}) { f.Config.Logf(msg, args...) }
func (f *Func) Fatalf(msg string, args ...interface{}) { f.Config.Fatalf(msg, args...) }
func (f *Func) Unimplementedf(msg string, args ...interface{}) { f.Config.Unimplementedf(msg, args...) }

View File

@ -161,7 +161,7 @@ func Fun(c *Config, entry string, blocs ...bloc) fun {
if c.control != "" {
cval, ok := values[c.control]
if !ok {
f.Fatal("control value for block %s missing", bloc.name)
f.Fatalf("control value for block %s missing", bloc.name)
}
b.Control = cval
}
@ -171,7 +171,7 @@ func Fun(c *Config, entry string, blocs ...bloc) fun {
for _, arg := range valu.args {
a, ok := values[arg]
if !ok {
b.Fatal("arg %s missing for value %s in block %s",
b.Fatalf("arg %s missing for value %s in block %s",
arg, valu.name, bloc.name)
}
v.AddArg(a)

View File

@ -80,7 +80,7 @@ blockloop:
continue blockloop
}
}
b.Fatal("no block available for layout")
b.Fatalf("no block available for layout")
}
f.Blocks = order
}

View File

@ -13,7 +13,7 @@ func lower(f *Func) {
for _, b := range f.Blocks {
for _, v := range b.Values {
if opcodeTable[v.Op].generic && v.Op != OpFP && v.Op != OpSP && v.Op != OpArg && v.Op != OpCopy && v.Op != OpPhi {
f.Unimplemented("%s not lowered", v.LongString())
f.Unimplementedf("%s not lowered", v.LongString())
}
}
}

View File

@ -11,7 +11,7 @@ import (
)
func printFunc(f *Func) {
f.Log("%s", f.String())
f.Logf("%s", f.String())
}
func (f *Func) String() string {

View File

@ -349,7 +349,7 @@ func regalloc(f *Func) {
if b.Kind == BlockCall {
call = b.Control
if call != b.Values[len(b.Values)-1] {
b.Fatal("call not at end of block %b %v", b, call)
b.Fatalf("call not at end of block %b %v", b, call)
}
b.Values = b.Values[:len(b.Values)-1]
// TODO: do this for all control types?
@ -419,7 +419,7 @@ func live(f *Func) [][]ID {
t := newSparseSet(f.NumValues())
for {
for _, b := range f.Blocks {
f.Log("live %s %v\n", b, live[b.ID])
f.Logf("live %s %v\n", b, live[b.ID])
}
changed := false

View File

@ -12,10 +12,10 @@ func applyRewrite(f *Func, rb func(*Block) bool, rv func(*Value, *Config) bool)
var curv *Value
defer func() {
if curb != nil {
curb.Fatal("panic during rewrite of block %s\n", curb.LongString())
curb.Fatalf("panic during rewrite of block %s\n", curb.LongString())
}
if curv != nil {
curv.Fatal("panic during rewrite of value %s\n", curv.LongString())
curv.Fatalf("panic during rewrite of value %s\n", curv.LongString())
// TODO(khr): print source location also
}
}()

View File

@ -77,7 +77,7 @@ func stackalloc(f *Func) {
for _, v := range b.Values {
if v.Op == OpFP {
if fp != nil {
b.Fatal("multiple FP ops: %s %s", fp, v)
b.Fatalf("multiple FP ops: %s %s", fp, v)
}
fp = v
}
@ -97,12 +97,12 @@ func stackalloc(f *Func) {
case OpAMD64LEAQ, OpAMD64MOVQload, OpAMD64MOVQstore, OpAMD64MOVLload, OpAMD64MOVLstore, OpAMD64MOVWload, OpAMD64MOVWstore, OpAMD64MOVBload, OpAMD64MOVBstore, OpAMD64MOVQloadidx8:
if v.Op == OpAMD64MOVQloadidx8 && i == 1 {
// Note: we could do it, but it is probably an error
f.Fatal("can't do FP->SP adjust on index slot of load %s", v.Op)
f.Fatalf("can't do FP->SP adjust on index slot of load %s", v.Op)
}
// eg: (MOVQload [c] (FP) mem) -> (MOVQload [c+n] (SP) mem)
v.AuxInt = addOff(v.AuxInt, n)
default:
f.Unimplemented("can't do FP->SP adjust on %s", v.Op)
f.Unimplementedf("can't do FP->SP adjust on %s", v.Op)
// TODO: OpCopy -> ADDQ
}
}

View File

@ -111,6 +111,6 @@ func (v *Value) resetArgs() {
v.Args = v.argstorage[:0]
}
func (v *Value) Log(msg string, args ...interface{}) { v.Block.Log(msg, args...) }
func (v *Value) Fatal(msg string, args ...interface{}) { v.Block.Fatal(msg, args...) }
func (v *Value) Unimplemented(msg string, args ...interface{}) { v.Block.Unimplemented(msg, args...) }
func (v *Value) Logf(msg string, args ...interface{}) { v.Block.Logf(msg, args...) }
func (v *Value) Fatalf(msg string, args ...interface{}) { v.Block.Fatalf(msg, args...) }
func (v *Value) Unimplementedf(msg string, args ...interface{}) { v.Block.Unimplementedf(msg, args...) }