From d7ae3a111bd75df44dda69b37da945b50d5133e2 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Thu, 3 Apr 2025 14:35:27 +0200 Subject: pkg/ifuzz: fix generate/build Currently the commands we have in go:generate first create an empty file and then write final contents. This breaks any parallel builds of the source. Even running go generate ./... does not work. Write output files atomically. --- pkg/ifuzz/arm64/arm64.go | 2 +- pkg/ifuzz/arm64/gen/gen.go | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) (limited to 'pkg/ifuzz/arm64') diff --git a/pkg/ifuzz/arm64/arm64.go b/pkg/ifuzz/arm64/arm64.go index 3b835566f..a2d326339 100644 --- a/pkg/ifuzz/arm64/arm64.go +++ b/pkg/ifuzz/arm64/arm64.go @@ -1,7 +1,7 @@ // Copyright 2024 syzkaller project authors. All rights reserved. // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. -//go:generate bash -c "go run gen/gen.go gen/json/arm64.json | gofmt > generated/insns.go" +//go:generate go run gen/gen.go gen/json/arm64.json generated/insns.go // Package arm64 allows to generate and mutate arm64 machine code. package arm64 diff --git a/pkg/ifuzz/arm64/gen/gen.go b/pkg/ifuzz/arm64/gen/gen.go index 659fea202..ef5afbd46 100644 --- a/pkg/ifuzz/arm64/gen/gen.go +++ b/pkg/ifuzz/arm64/gen/gen.go @@ -5,6 +5,7 @@ package main import ( + "bytes" "encoding/json" "fmt" "os" @@ -12,13 +13,14 @@ import ( "strings" "github.com/google/syzkaller/pkg/ifuzz/arm64" + "github.com/google/syzkaller/pkg/osutil" "github.com/google/syzkaller/pkg/serializer" "github.com/google/syzkaller/pkg/tool" ) func main() { - if len(os.Args) != 2 { - tool.Failf("usage: gen arm64.json") + if len(os.Args) != 3 { + tool.Failf("usage: gen arm64.json output.file") } jsonStr, err := os.ReadFile(os.Args[1]) if err != nil { @@ -26,7 +28,8 @@ func main() { } insns := JSONToInsns(jsonStr) - fmt.Printf(`// Code generated by pkg/ifuzz/gen. DO NOT EDIT. + out := new(bytes.Buffer) + fmt.Fprintf(out, `// Code generated by pkg/ifuzz/gen. DO NOT EDIT. // go:build !codeanalysis @@ -42,7 +45,10 @@ func init() { var insns_arm64 = `) - serializer.Write(os.Stdout, insns) + serializer.Write(out, insns) + if err := osutil.WriteFileAtomically(os.Args[2], out.Bytes()); err != nil { + tool.Fail(err) + } fmt.Fprintf(os.Stderr, "handled %v\n", len(insns)) } -- cgit mrf-deployment