diff --git a/src/cmd/compile/internal/gc/builtin.go b/src/cmd/compile/internal/gc/builtin.go index 71b323f8a1..70200c624b 100644 --- a/src/cmd/compile/internal/gc/builtin.go +++ b/src/cmd/compile/internal/gc/builtin.go @@ -12,229 +12,228 @@ var runtimeDecls = [...]struct { {"panicslice", funcTag, 5}, {"panicdivide", funcTag, 5}, {"throwinit", funcTag, 5}, - {"panicwrap", funcTag, 7}, - {"gopanic", funcTag, 9}, - {"gorecover", funcTag, 12}, + {"panicwrap", funcTag, 5}, + {"gopanic", funcTag, 7}, + {"gorecover", funcTag, 10}, {"goschedguarded", funcTag, 5}, - {"printbool", funcTag, 14}, - {"printfloat", funcTag, 16}, - {"printint", funcTag, 18}, - {"printhex", funcTag, 20}, - {"printuint", funcTag, 20}, - {"printcomplex", funcTag, 22}, - {"printstring", funcTag, 23}, - {"printpointer", funcTag, 24}, - {"printiface", funcTag, 24}, - {"printeface", funcTag, 24}, - {"printslice", funcTag, 24}, + {"printbool", funcTag, 12}, + {"printfloat", funcTag, 14}, + {"printint", funcTag, 16}, + {"printhex", funcTag, 18}, + {"printuint", funcTag, 18}, + {"printcomplex", funcTag, 20}, + {"printstring", funcTag, 22}, + {"printpointer", funcTag, 23}, + {"printiface", funcTag, 23}, + {"printeface", funcTag, 23}, + {"printslice", funcTag, 23}, {"printnl", funcTag, 5}, {"printsp", funcTag, 5}, {"printlock", funcTag, 5}, {"printunlock", funcTag, 5}, - {"concatstring2", funcTag, 27}, - {"concatstring3", funcTag, 28}, - {"concatstring4", funcTag, 29}, - {"concatstring5", funcTag, 30}, - {"concatstrings", funcTag, 32}, - {"cmpstring", funcTag, 34}, - {"eqstring", funcTag, 35}, - {"intstring", funcTag, 38}, - {"slicebytetostring", funcTag, 40}, - {"slicebytetostringtmp", funcTag, 41}, - {"slicerunetostring", funcTag, 44}, - {"stringtoslicebyte", funcTag, 45}, - {"stringtoslicerune", funcTag, 48}, - {"decoderune", funcTag, 49}, - {"slicecopy", funcTag, 51}, - {"slicestringcopy", funcTag, 52}, - {"convI2I", funcTag, 53}, - {"convT2E", funcTag, 54}, - {"convT2I", funcTag, 54}, - {"assertE2I", funcTag, 53}, - {"assertE2I2", funcTag, 55}, - {"assertI2I", funcTag, 53}, - {"assertI2I2", funcTag, 55}, - {"panicdottype", funcTag, 56}, - {"panicnildottype", funcTag, 57}, - {"ifaceeq", funcTag, 58}, - {"efaceeq", funcTag, 58}, - {"makemap", funcTag, 60}, - {"mapaccess1", funcTag, 61}, - {"mapaccess1_fast32", funcTag, 62}, - {"mapaccess1_fast64", funcTag, 62}, - {"mapaccess1_faststr", funcTag, 62}, - {"mapaccess1_fat", funcTag, 63}, - {"mapaccess2", funcTag, 64}, - {"mapaccess2_fast32", funcTag, 65}, - {"mapaccess2_fast64", funcTag, 65}, - {"mapaccess2_faststr", funcTag, 65}, - {"mapaccess2_fat", funcTag, 66}, - {"mapassign", funcTag, 61}, - {"mapiterinit", funcTag, 67}, - {"mapdelete", funcTag, 67}, - {"mapiternext", funcTag, 68}, - {"makechan", funcTag, 70}, - {"chanrecv1", funcTag, 72}, - {"chanrecv2", funcTag, 73}, - {"chansend1", funcTag, 75}, - {"closechan", funcTag, 24}, - {"writeBarrier", varTag, 76}, - {"writebarrierptr", funcTag, 77}, - {"typedmemmove", funcTag, 78}, - {"typedmemclr", funcTag, 79}, - {"typedslicecopy", funcTag, 80}, - {"selectnbsend", funcTag, 81}, - {"selectnbrecv", funcTag, 82}, - {"selectnbrecv2", funcTag, 84}, - {"newselect", funcTag, 85}, - {"selectsend", funcTag, 81}, - {"selectrecv", funcTag, 73}, - {"selectrecv2", funcTag, 86}, - {"selectdefault", funcTag, 87}, - {"selectgo", funcTag, 57}, + {"concatstring2", funcTag, 26}, + {"concatstring3", funcTag, 27}, + {"concatstring4", funcTag, 28}, + {"concatstring5", funcTag, 29}, + {"concatstrings", funcTag, 31}, + {"cmpstring", funcTag, 33}, + {"eqstring", funcTag, 34}, + {"intstring", funcTag, 37}, + {"slicebytetostring", funcTag, 39}, + {"slicebytetostringtmp", funcTag, 40}, + {"slicerunetostring", funcTag, 43}, + {"stringtoslicebyte", funcTag, 44}, + {"stringtoslicerune", funcTag, 47}, + {"decoderune", funcTag, 48}, + {"slicecopy", funcTag, 50}, + {"slicestringcopy", funcTag, 51}, + {"convI2I", funcTag, 52}, + {"convT2E", funcTag, 53}, + {"convT2I", funcTag, 53}, + {"assertE2I", funcTag, 52}, + {"assertE2I2", funcTag, 54}, + {"assertI2I", funcTag, 52}, + {"assertI2I2", funcTag, 54}, + {"panicdottype", funcTag, 55}, + {"panicnildottype", funcTag, 56}, + {"ifaceeq", funcTag, 57}, + {"efaceeq", funcTag, 57}, + {"makemap", funcTag, 59}, + {"mapaccess1", funcTag, 60}, + {"mapaccess1_fast32", funcTag, 61}, + {"mapaccess1_fast64", funcTag, 61}, + {"mapaccess1_faststr", funcTag, 61}, + {"mapaccess1_fat", funcTag, 62}, + {"mapaccess2", funcTag, 63}, + {"mapaccess2_fast32", funcTag, 64}, + {"mapaccess2_fast64", funcTag, 64}, + {"mapaccess2_faststr", funcTag, 64}, + {"mapaccess2_fat", funcTag, 65}, + {"mapassign", funcTag, 60}, + {"mapiterinit", funcTag, 66}, + {"mapdelete", funcTag, 66}, + {"mapiternext", funcTag, 67}, + {"makechan", funcTag, 69}, + {"chanrecv1", funcTag, 71}, + {"chanrecv2", funcTag, 72}, + {"chansend1", funcTag, 74}, + {"closechan", funcTag, 23}, + {"writeBarrier", varTag, 75}, + {"writebarrierptr", funcTag, 76}, + {"typedmemmove", funcTag, 77}, + {"typedmemclr", funcTag, 78}, + {"typedslicecopy", funcTag, 79}, + {"selectnbsend", funcTag, 80}, + {"selectnbrecv", funcTag, 81}, + {"selectnbrecv2", funcTag, 83}, + {"newselect", funcTag, 84}, + {"selectsend", funcTag, 80}, + {"selectrecv", funcTag, 72}, + {"selectrecv2", funcTag, 85}, + {"selectdefault", funcTag, 86}, + {"selectgo", funcTag, 56}, {"block", funcTag, 5}, - {"makeslice", funcTag, 89}, - {"makeslice64", funcTag, 90}, - {"growslice", funcTag, 91}, - {"memmove", funcTag, 92}, - {"memclrNoHeapPointers", funcTag, 93}, - {"memclrHasPointers", funcTag, 93}, - {"memequal", funcTag, 94}, - {"memequal8", funcTag, 95}, - {"memequal16", funcTag, 95}, - {"memequal32", funcTag, 95}, - {"memequal64", funcTag, 95}, - {"memequal128", funcTag, 95}, - {"int64div", funcTag, 96}, - {"uint64div", funcTag, 97}, - {"int64mod", funcTag, 96}, - {"uint64mod", funcTag, 97}, - {"float64toint64", funcTag, 98}, - {"float64touint64", funcTag, 99}, - {"float64touint32", funcTag, 101}, - {"int64tofloat64", funcTag, 102}, - {"uint64tofloat64", funcTag, 103}, - {"uint32tofloat64", funcTag, 104}, - {"complex128div", funcTag, 105}, - {"racefuncenter", funcTag, 106}, + {"makeslice", funcTag, 88}, + {"makeslice64", funcTag, 89}, + {"growslice", funcTag, 90}, + {"memmove", funcTag, 91}, + {"memclrNoHeapPointers", funcTag, 92}, + {"memclrHasPointers", funcTag, 92}, + {"memequal", funcTag, 93}, + {"memequal8", funcTag, 94}, + {"memequal16", funcTag, 94}, + {"memequal32", funcTag, 94}, + {"memequal64", funcTag, 94}, + {"memequal128", funcTag, 94}, + {"int64div", funcTag, 95}, + {"uint64div", funcTag, 96}, + {"int64mod", funcTag, 95}, + {"uint64mod", funcTag, 96}, + {"float64toint64", funcTag, 97}, + {"float64touint64", funcTag, 98}, + {"float64touint32", funcTag, 100}, + {"int64tofloat64", funcTag, 101}, + {"uint64tofloat64", funcTag, 102}, + {"uint32tofloat64", funcTag, 103}, + {"complex128div", funcTag, 104}, + {"racefuncenter", funcTag, 105}, {"racefuncexit", funcTag, 5}, - {"raceread", funcTag, 106}, - {"racewrite", funcTag, 106}, - {"racereadrange", funcTag, 107}, - {"racewriterange", funcTag, 107}, - {"msanread", funcTag, 107}, - {"msanwrite", funcTag, 107}, + {"raceread", funcTag, 105}, + {"racewrite", funcTag, 105}, + {"racereadrange", funcTag, 106}, + {"racewriterange", funcTag, 106}, + {"msanread", funcTag, 106}, + {"msanwrite", funcTag, 106}, } func runtimeTypes() []*Type { - var typs [108]*Type + var typs [107]*Type typs[0] = bytetype typs[1] = typPtr(typs[0]) typs[2] = Types[TANY] typs[3] = typPtr(typs[2]) typs[4] = functype(nil, []*Node{anonfield(typs[1])}, []*Node{anonfield(typs[3])}) typs[5] = functype(nil, nil, nil) - typs[6] = Types[TSTRING] - typs[7] = functype(nil, []*Node{anonfield(typs[6]), anonfield(typs[6]), anonfield(typs[6])}, nil) - typs[8] = Types[TINTER] - typs[9] = functype(nil, []*Node{anonfield(typs[8])}, nil) - typs[10] = Types[TINT32] - typs[11] = typPtr(typs[10]) - typs[12] = functype(nil, []*Node{anonfield(typs[11])}, []*Node{anonfield(typs[8])}) - typs[13] = Types[TBOOL] + typs[6] = Types[TINTER] + typs[7] = functype(nil, []*Node{anonfield(typs[6])}, nil) + typs[8] = Types[TINT32] + typs[9] = typPtr(typs[8]) + typs[10] = functype(nil, []*Node{anonfield(typs[9])}, []*Node{anonfield(typs[6])}) + typs[11] = Types[TBOOL] + typs[12] = functype(nil, []*Node{anonfield(typs[11])}, nil) + typs[13] = Types[TFLOAT64] typs[14] = functype(nil, []*Node{anonfield(typs[13])}, nil) - typs[15] = Types[TFLOAT64] + typs[15] = Types[TINT64] typs[16] = functype(nil, []*Node{anonfield(typs[15])}, nil) - typs[17] = Types[TINT64] + typs[17] = Types[TUINT64] typs[18] = functype(nil, []*Node{anonfield(typs[17])}, nil) - typs[19] = Types[TUINT64] + typs[19] = Types[TCOMPLEX128] typs[20] = functype(nil, []*Node{anonfield(typs[19])}, nil) - typs[21] = Types[TCOMPLEX128] + typs[21] = Types[TSTRING] typs[22] = functype(nil, []*Node{anonfield(typs[21])}, nil) - typs[23] = functype(nil, []*Node{anonfield(typs[6])}, nil) - typs[24] = functype(nil, []*Node{anonfield(typs[2])}, nil) - typs[25] = typArray(typs[0], 32) - typs[26] = typPtr(typs[25]) - typs[27] = functype(nil, []*Node{anonfield(typs[26]), anonfield(typs[6]), anonfield(typs[6])}, []*Node{anonfield(typs[6])}) - typs[28] = functype(nil, []*Node{anonfield(typs[26]), anonfield(typs[6]), anonfield(typs[6]), anonfield(typs[6])}, []*Node{anonfield(typs[6])}) - typs[29] = functype(nil, []*Node{anonfield(typs[26]), anonfield(typs[6]), anonfield(typs[6]), anonfield(typs[6]), anonfield(typs[6])}, []*Node{anonfield(typs[6])}) - typs[30] = functype(nil, []*Node{anonfield(typs[26]), anonfield(typs[6]), anonfield(typs[6]), anonfield(typs[6]), anonfield(typs[6]), anonfield(typs[6])}, []*Node{anonfield(typs[6])}) - typs[31] = typSlice(typs[6]) - typs[32] = functype(nil, []*Node{anonfield(typs[26]), anonfield(typs[31])}, []*Node{anonfield(typs[6])}) - typs[33] = Types[TINT] - typs[34] = functype(nil, []*Node{anonfield(typs[6]), anonfield(typs[6])}, []*Node{anonfield(typs[33])}) - typs[35] = functype(nil, []*Node{anonfield(typs[6]), anonfield(typs[6])}, []*Node{anonfield(typs[13])}) - typs[36] = typArray(typs[0], 4) - typs[37] = typPtr(typs[36]) - typs[38] = functype(nil, []*Node{anonfield(typs[37]), anonfield(typs[17])}, []*Node{anonfield(typs[6])}) - typs[39] = typSlice(typs[0]) - typs[40] = functype(nil, []*Node{anonfield(typs[26]), anonfield(typs[39])}, []*Node{anonfield(typs[6])}) - typs[41] = functype(nil, []*Node{anonfield(typs[39])}, []*Node{anonfield(typs[6])}) - typs[42] = runetype - typs[43] = typSlice(typs[42]) - typs[44] = functype(nil, []*Node{anonfield(typs[26]), anonfield(typs[43])}, []*Node{anonfield(typs[6])}) - typs[45] = functype(nil, []*Node{anonfield(typs[26]), anonfield(typs[6])}, []*Node{anonfield(typs[39])}) - typs[46] = typArray(typs[42], 32) - typs[47] = typPtr(typs[46]) - typs[48] = functype(nil, []*Node{anonfield(typs[47]), anonfield(typs[6])}, []*Node{anonfield(typs[43])}) - typs[49] = functype(nil, []*Node{anonfield(typs[6]), anonfield(typs[33])}, []*Node{anonfield(typs[42]), anonfield(typs[33])}) - typs[50] = Types[TUINTPTR] - typs[51] = functype(nil, []*Node{anonfield(typs[2]), anonfield(typs[2]), anonfield(typs[50])}, []*Node{anonfield(typs[33])}) - typs[52] = functype(nil, []*Node{anonfield(typs[2]), anonfield(typs[2])}, []*Node{anonfield(typs[33])}) - typs[53] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[2])}, []*Node{anonfield(typs[2])}) - typs[54] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3])}, []*Node{anonfield(typs[2])}) - typs[55] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[2])}, []*Node{anonfield(typs[2]), anonfield(typs[13])}) - typs[56] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[1]), anonfield(typs[1])}, nil) - typs[57] = functype(nil, []*Node{anonfield(typs[1])}, nil) - typs[58] = functype(nil, []*Node{anonfield(typs[2]), anonfield(typs[2])}, []*Node{anonfield(typs[13])}) - typs[59] = typMap(typs[2], typs[2]) - typs[60] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[17]), anonfield(typs[3]), anonfield(typs[3])}, []*Node{anonfield(typs[59])}) - typs[61] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[59]), anonfield(typs[3])}, []*Node{anonfield(typs[3])}) - typs[62] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[59]), anonfield(typs[2])}, []*Node{anonfield(typs[3])}) - typs[63] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[59]), anonfield(typs[3]), anonfield(typs[1])}, []*Node{anonfield(typs[3])}) - typs[64] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[59]), anonfield(typs[3])}, []*Node{anonfield(typs[3]), anonfield(typs[13])}) - typs[65] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[59]), anonfield(typs[2])}, []*Node{anonfield(typs[3]), anonfield(typs[13])}) - typs[66] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[59]), anonfield(typs[3]), anonfield(typs[1])}, []*Node{anonfield(typs[3]), anonfield(typs[13])}) - typs[67] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[59]), anonfield(typs[3])}, nil) - typs[68] = functype(nil, []*Node{anonfield(typs[3])}, nil) - typs[69] = typChan(typs[2], Cboth) - typs[70] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[17])}, []*Node{anonfield(typs[69])}) - typs[71] = typChan(typs[2], Crecv) - typs[72] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[71]), anonfield(typs[3])}, nil) - typs[73] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[71]), anonfield(typs[3])}, []*Node{anonfield(typs[13])}) - typs[74] = typChan(typs[2], Csend) - typs[75] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[74]), anonfield(typs[3])}, nil) - typs[76] = tostruct([]*Node{namedfield("enabled", typs[13]), namedfield("needed", typs[13]), namedfield("cgo", typs[13])}) - typs[77] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[2])}, nil) - typs[78] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3]), anonfield(typs[3])}, nil) - typs[79] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3])}, nil) - typs[80] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[2]), anonfield(typs[2])}, []*Node{anonfield(typs[33])}) - typs[81] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[74]), anonfield(typs[3])}, []*Node{anonfield(typs[13])}) - typs[82] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3]), anonfield(typs[71])}, []*Node{anonfield(typs[13])}) - typs[83] = typPtr(typs[13]) - typs[84] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3]), anonfield(typs[83]), anonfield(typs[71])}, []*Node{anonfield(typs[13])}) - typs[85] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[17]), anonfield(typs[10])}, nil) - typs[86] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[71]), anonfield(typs[3]), anonfield(typs[83])}, []*Node{anonfield(typs[13])}) - typs[87] = functype(nil, []*Node{anonfield(typs[1])}, []*Node{anonfield(typs[13])}) - typs[88] = typSlice(typs[2]) - typs[89] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[33]), anonfield(typs[33])}, []*Node{anonfield(typs[88])}) - typs[90] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[17]), anonfield(typs[17])}, []*Node{anonfield(typs[88])}) - typs[91] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[88]), anonfield(typs[33])}, []*Node{anonfield(typs[88])}) - typs[92] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3]), anonfield(typs[50])}, nil) - typs[93] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[50])}, nil) - typs[94] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3]), anonfield(typs[50])}, []*Node{anonfield(typs[13])}) - typs[95] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3])}, []*Node{anonfield(typs[13])}) + typs[23] = functype(nil, []*Node{anonfield(typs[2])}, nil) + typs[24] = typArray(typs[0], 32) + typs[25] = typPtr(typs[24]) + typs[26] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[21]), anonfield(typs[21])}, []*Node{anonfield(typs[21])}) + typs[27] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[21]), anonfield(typs[21]), anonfield(typs[21])}, []*Node{anonfield(typs[21])}) + typs[28] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[21]), anonfield(typs[21]), anonfield(typs[21]), anonfield(typs[21])}, []*Node{anonfield(typs[21])}) + typs[29] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[21]), anonfield(typs[21]), anonfield(typs[21]), anonfield(typs[21]), anonfield(typs[21])}, []*Node{anonfield(typs[21])}) + typs[30] = typSlice(typs[21]) + typs[31] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[30])}, []*Node{anonfield(typs[21])}) + typs[32] = Types[TINT] + typs[33] = functype(nil, []*Node{anonfield(typs[21]), anonfield(typs[21])}, []*Node{anonfield(typs[32])}) + typs[34] = functype(nil, []*Node{anonfield(typs[21]), anonfield(typs[21])}, []*Node{anonfield(typs[11])}) + typs[35] = typArray(typs[0], 4) + typs[36] = typPtr(typs[35]) + typs[37] = functype(nil, []*Node{anonfield(typs[36]), anonfield(typs[15])}, []*Node{anonfield(typs[21])}) + typs[38] = typSlice(typs[0]) + typs[39] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[38])}, []*Node{anonfield(typs[21])}) + typs[40] = functype(nil, []*Node{anonfield(typs[38])}, []*Node{anonfield(typs[21])}) + typs[41] = runetype + typs[42] = typSlice(typs[41]) + typs[43] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[42])}, []*Node{anonfield(typs[21])}) + typs[44] = functype(nil, []*Node{anonfield(typs[25]), anonfield(typs[21])}, []*Node{anonfield(typs[38])}) + typs[45] = typArray(typs[41], 32) + typs[46] = typPtr(typs[45]) + typs[47] = functype(nil, []*Node{anonfield(typs[46]), anonfield(typs[21])}, []*Node{anonfield(typs[42])}) + typs[48] = functype(nil, []*Node{anonfield(typs[21]), anonfield(typs[32])}, []*Node{anonfield(typs[41]), anonfield(typs[32])}) + typs[49] = Types[TUINTPTR] + typs[50] = functype(nil, []*Node{anonfield(typs[2]), anonfield(typs[2]), anonfield(typs[49])}, []*Node{anonfield(typs[32])}) + typs[51] = functype(nil, []*Node{anonfield(typs[2]), anonfield(typs[2])}, []*Node{anonfield(typs[32])}) + typs[52] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[2])}, []*Node{anonfield(typs[2])}) + typs[53] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3])}, []*Node{anonfield(typs[2])}) + typs[54] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[2])}, []*Node{anonfield(typs[2]), anonfield(typs[11])}) + typs[55] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[1]), anonfield(typs[1])}, nil) + typs[56] = functype(nil, []*Node{anonfield(typs[1])}, nil) + typs[57] = functype(nil, []*Node{anonfield(typs[2]), anonfield(typs[2])}, []*Node{anonfield(typs[11])}) + typs[58] = typMap(typs[2], typs[2]) + typs[59] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[3]), anonfield(typs[3])}, []*Node{anonfield(typs[58])}) + typs[60] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[58]), anonfield(typs[3])}, []*Node{anonfield(typs[3])}) + typs[61] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[58]), anonfield(typs[2])}, []*Node{anonfield(typs[3])}) + typs[62] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[58]), anonfield(typs[3]), anonfield(typs[1])}, []*Node{anonfield(typs[3])}) + typs[63] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[58]), anonfield(typs[3])}, []*Node{anonfield(typs[3]), anonfield(typs[11])}) + typs[64] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[58]), anonfield(typs[2])}, []*Node{anonfield(typs[3]), anonfield(typs[11])}) + typs[65] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[58]), anonfield(typs[3]), anonfield(typs[1])}, []*Node{anonfield(typs[3]), anonfield(typs[11])}) + typs[66] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[58]), anonfield(typs[3])}, nil) + typs[67] = functype(nil, []*Node{anonfield(typs[3])}, nil) + typs[68] = typChan(typs[2], Cboth) + typs[69] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15])}, []*Node{anonfield(typs[68])}) + typs[70] = typChan(typs[2], Crecv) + typs[71] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[70]), anonfield(typs[3])}, nil) + typs[72] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[70]), anonfield(typs[3])}, []*Node{anonfield(typs[11])}) + typs[73] = typChan(typs[2], Csend) + typs[74] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[73]), anonfield(typs[3])}, nil) + typs[75] = tostruct([]*Node{namedfield("enabled", typs[11]), namedfield("needed", typs[11]), namedfield("cgo", typs[11])}) + typs[76] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[2])}, nil) + typs[77] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3]), anonfield(typs[3])}, nil) + typs[78] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3])}, nil) + typs[79] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[2]), anonfield(typs[2])}, []*Node{anonfield(typs[32])}) + typs[80] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[73]), anonfield(typs[3])}, []*Node{anonfield(typs[11])}) + typs[81] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3]), anonfield(typs[70])}, []*Node{anonfield(typs[11])}) + typs[82] = typPtr(typs[11]) + typs[83] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[3]), anonfield(typs[82]), anonfield(typs[70])}, []*Node{anonfield(typs[11])}) + typs[84] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[8])}, nil) + typs[85] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[70]), anonfield(typs[3]), anonfield(typs[82])}, []*Node{anonfield(typs[11])}) + typs[86] = functype(nil, []*Node{anonfield(typs[1])}, []*Node{anonfield(typs[11])}) + typs[87] = typSlice(typs[2]) + typs[88] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[32]), anonfield(typs[32])}, []*Node{anonfield(typs[87])}) + typs[89] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[15]), anonfield(typs[15])}, []*Node{anonfield(typs[87])}) + typs[90] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[87]), anonfield(typs[32])}, []*Node{anonfield(typs[87])}) + typs[91] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3]), anonfield(typs[49])}, nil) + typs[92] = functype(nil, []*Node{anonfield(typs[1]), anonfield(typs[49])}, nil) + typs[93] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3]), anonfield(typs[49])}, []*Node{anonfield(typs[11])}) + typs[94] = functype(nil, []*Node{anonfield(typs[3]), anonfield(typs[3])}, []*Node{anonfield(typs[11])}) + typs[95] = functype(nil, []*Node{anonfield(typs[15]), anonfield(typs[15])}, []*Node{anonfield(typs[15])}) typs[96] = functype(nil, []*Node{anonfield(typs[17]), anonfield(typs[17])}, []*Node{anonfield(typs[17])}) - typs[97] = functype(nil, []*Node{anonfield(typs[19]), anonfield(typs[19])}, []*Node{anonfield(typs[19])}) - typs[98] = functype(nil, []*Node{anonfield(typs[15])}, []*Node{anonfield(typs[17])}) - typs[99] = functype(nil, []*Node{anonfield(typs[15])}, []*Node{anonfield(typs[19])}) - typs[100] = Types[TUINT32] - typs[101] = functype(nil, []*Node{anonfield(typs[15])}, []*Node{anonfield(typs[100])}) - typs[102] = functype(nil, []*Node{anonfield(typs[17])}, []*Node{anonfield(typs[15])}) - typs[103] = functype(nil, []*Node{anonfield(typs[19])}, []*Node{anonfield(typs[15])}) - typs[104] = functype(nil, []*Node{anonfield(typs[100])}, []*Node{anonfield(typs[15])}) - typs[105] = functype(nil, []*Node{anonfield(typs[21]), anonfield(typs[21])}, []*Node{anonfield(typs[21])}) - typs[106] = functype(nil, []*Node{anonfield(typs[50])}, nil) - typs[107] = functype(nil, []*Node{anonfield(typs[50]), anonfield(typs[50])}, nil) + typs[97] = functype(nil, []*Node{anonfield(typs[13])}, []*Node{anonfield(typs[15])}) + typs[98] = functype(nil, []*Node{anonfield(typs[13])}, []*Node{anonfield(typs[17])}) + typs[99] = Types[TUINT32] + typs[100] = functype(nil, []*Node{anonfield(typs[13])}, []*Node{anonfield(typs[99])}) + typs[101] = functype(nil, []*Node{anonfield(typs[15])}, []*Node{anonfield(typs[13])}) + typs[102] = functype(nil, []*Node{anonfield(typs[17])}, []*Node{anonfield(typs[13])}) + typs[103] = functype(nil, []*Node{anonfield(typs[99])}, []*Node{anonfield(typs[13])}) + typs[104] = functype(nil, []*Node{anonfield(typs[19]), anonfield(typs[19])}, []*Node{anonfield(typs[19])}) + typs[105] = functype(nil, []*Node{anonfield(typs[49])}, nil) + typs[106] = functype(nil, []*Node{anonfield(typs[49]), anonfield(typs[49])}, nil) return typs[:] } diff --git a/src/cmd/compile/internal/gc/builtin/runtime.go b/src/cmd/compile/internal/gc/builtin/runtime.go index 69511155f4..e9d41a3095 100644 --- a/src/cmd/compile/internal/gc/builtin/runtime.go +++ b/src/cmd/compile/internal/gc/builtin/runtime.go @@ -17,7 +17,7 @@ func panicindex() func panicslice() func panicdivide() func throwinit() -func panicwrap(string, string, string) +func panicwrap() func gopanic(interface{}) func gorecover(*int32) interface{} diff --git a/src/cmd/compile/internal/gc/subr.go b/src/cmd/compile/internal/gc/subr.go index 9dd2adcd4c..c7b81858cc 100644 --- a/src/cmd/compile/internal/gc/subr.go +++ b/src/cmd/compile/internal/gc/subr.go @@ -1759,22 +1759,8 @@ func genwrapper(rcvr *Type, method *Field, newnam *Sym, iface int) { if rcvr.IsPtr() && rcvr.Elem() == methodrcvr { // generating wrapper from *T to T. n := nod(OIF, nil, nil) - n.Left = nod(OEQ, this.Left, nodnil()) - - // these strings are already in the reflect tables, - // so no space cost to use them here. - var l []*Node - - var v Val - v.U = rcvr.Elem().Sym.Pkg.Name // package name - l = append(l, nodlit(v)) - v.U = rcvr.Elem().Sym.Name // type name - l = append(l, nodlit(v)) - v.U = method.Sym.Name - l = append(l, nodlit(v)) // method name call := nod(OCALL, syslook("panicwrap"), nil) - call.List.Set(l) n.Nbody.Set1(call) fn.Nbody.Append(n) } diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go index ec73bb3327..7b644cb6b1 100644 --- a/src/cmd/internal/obj/x86/obj6.go +++ b/src/cmd/internal/obj/x86/obj6.go @@ -953,7 +953,7 @@ func isZeroArgRuntimeCall(s *obj.LSym) bool { return false } switch s.Name { - case "runtime.panicindex", "runtime.panicslice", "runtime.panicdivide": + case "runtime.panicindex", "runtime.panicslice", "runtime.panicdivide", "runtime.panicwrap": return true } return false diff --git a/src/runtime/error.go b/src/runtime/error.go index 0238c5e592..f5b015c091 100644 --- a/src/runtime/error.go +++ b/src/runtime/error.go @@ -4,6 +4,8 @@ package runtime +import _ "unsafe" // for go:linkname + // The Error interface identifies a run time error. type Error interface { error @@ -91,7 +93,41 @@ func printany(i interface{}) { } } +// strings.IndexByte is implemented in runtime/asm_$goarch.s +// but amusingly we need go:linkname to get access to it here in the runtime. +//go:linkname stringsIndexByte strings.IndexByte +func stringsIndexByte(s string, c byte) int + // called from generated code -func panicwrap(pkg, typ, meth string) { +func panicwrap() { + pc := make([]uintptr, 1) + n := Callers(2, pc) + if n == 0 { + throw("panicwrap: Callers failed") + } + frames := CallersFrames(pc) + frame, _ := frames.Next() + name := frame.Function + // name is something like "main.(*T).F". + // We want to extract pkg ("main"), typ ("T"), and meth ("F"). + // Do it by finding the parens. + i := stringsIndexByte(name, '(') + if i < 0 { + throw("panicwrap: no ( in " + frame.Function) + } + pkg := name[:i-1] + if i+2 >= len(name) || name[i-1:i+2] != ".(*" { + throw("panicwrap: unexpected string after package name: " + frame.Function) + } + name = name[i+2:] + i = stringsIndexByte(name, ')') + if i < 0 { + throw("panicwrap: no ) in " + frame.Function) + } + if i+2 >= len(name) || name[i:i+2] != ")." { + throw("panicwrap: unexpected string after type name: " + frame.Function) + } + typ := name[:i] + meth := name[i+2:] panic(plainError("value method " + pkg + "." + typ + "." + meth + " called using nil *" + typ + " pointer")) } diff --git a/test/fixedbugs/issue19040.go b/test/fixedbugs/issue19040.go new file mode 100644 index 0000000000..67881df624 --- /dev/null +++ b/test/fixedbugs/issue19040.go @@ -0,0 +1,36 @@ +// run + +// Copyright 2017 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. + +// Check the text of the panic that comes from +// a nil pointer passed to automatically generated method wrapper. + +package main + +import "fmt" + +type T int + +type I interface { + F() +} + +func (t T) F() {} + +var ( + t *T + i I = t +) + +func main() { + defer func() { + got := recover().(error).Error() + want := "value method main.T.F called using nil *T pointer" + if got != want { + fmt.Printf("panicwrap error text:\n\t%q\nwant:\n\t%q\n", got, want) + } + }() + i.F() +}