diff --git a/cmd/vet/asmdecl.go b/cmd/vet/asmdecl.go index 001b1770cc..c32ed9930d 100644 --- a/cmd/vet/asmdecl.go +++ b/cmd/vet/asmdecl.go @@ -33,6 +33,7 @@ type asmArch struct { name string ptrSize int intSize int + maxAlign int bigEndian bool } @@ -55,14 +56,16 @@ type asmVar struct { } var ( - asmArch386 = asmArch{"386", 4, 4, false} - asmArchArm = asmArch{"arm", 4, 4, false} - asmArchAmd64 = asmArch{"amd64", 8, 8, false} + asmArch386 = asmArch{"386", 4, 4, 4, false} + asmArchArm = asmArch{"arm", 4, 4, 4, false} + asmArchAmd64 = asmArch{"amd64", 8, 8, 8, false} + asmArchAmd64p32 = asmArch{"amd64p32", 4, 4, 8, false} arches = []*asmArch{ &asmArch386, &asmArchArm, &asmArchAmd64, + &asmArchAmd64p32, } ) @@ -234,13 +237,13 @@ func (f *File) asmParseDecl(decl *ast.FuncDecl) map[string]*asmFunc { case "int32", "uint32", "float32": size = 4 case "int64", "uint64", "float64": - align = arch.ptrSize + align = arch.maxAlign size = 8 case "int", "uint": size = arch.intSize case "uintptr", "iword", "Word", "Errno", "unsafe.Pointer": size = arch.ptrSize - case "string": + case "string", "ErrorString": size = arch.ptrSize * 2 align = arch.ptrSize kind = asmString @@ -403,7 +406,7 @@ func (f *File) asmParseDecl(decl *ast.FuncDecl) map[string]*asmFunc { offset = 0 addParams(decl.Type.Params.List) if decl.Type.Results != nil && len(decl.Type.Results.List) > 0 { - offset += -offset & (arch.ptrSize - 1) + offset += -offset & (arch.maxAlign - 1) addParams(decl.Type.Results.List) } fn.size = offset