From 131cbcc6af3cf7e34d41a0e3429e7b8804105ff3 Mon Sep 17 00:00:00 2001 From: Ben Clayton Date: Tue, 1 Jun 2021 09:38:30 +0000 Subject: [PATCH] [tools]: Add intrinsic-gen tool Parses the intrinsics.def file, then scans the source tree for .tmpl files. Using both of these, it produces source files for use in tint. Bug: tint:832 Change-Id: I718114f4c540b9d620899e89d5758f048377ee04 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/52642 Kokoro: Kokoro Commit-Queue: Ben Clayton Reviewed-by: David Neto --- tools/intrinsic-gen | 33 ++++ tools/src/cmd/intrinsic-gen/gen/generate.go | 179 ++++++++++++++++++++ tools/src/cmd/intrinsic-gen/main.go | 146 ++++++++++++++++ 3 files changed, 358 insertions(+) create mode 100755 tools/intrinsic-gen create mode 100644 tools/src/cmd/intrinsic-gen/gen/generate.go create mode 100644 tools/src/cmd/intrinsic-gen/main.go diff --git a/tools/intrinsic-gen b/tools/intrinsic-gen new file mode 100755 index 0000000000..cfbbd4eeff --- /dev/null +++ b/tools/intrinsic-gen @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +# Copyright 2021 The Tint Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e # Fail on any error. + +if [ ! -x "$(which go)" ] ; then + echo "error: go needs to be on \$PATH to use $0" + exit 1 +fi + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd )" +ROOT_DIR="$( cd "${SCRIPT_DIR}/.." >/dev/null 2>&1 && pwd )" +BINARY="${SCRIPT_DIR}/bin/intrinsic-gen" + +# Rebuild the binary. +# Note, go caches build artifacts, so this is quick for repeat calls +pushd "${SCRIPT_DIR}/src/cmd/intrinsic-gen" > /dev/null + go build -o "${BINARY}" main.go +popd > /dev/null + +"${BINARY}" "$@" diff --git a/tools/src/cmd/intrinsic-gen/gen/generate.go b/tools/src/cmd/intrinsic-gen/gen/generate.go new file mode 100644 index 0000000000..a797840b8a --- /dev/null +++ b/tools/src/cmd/intrinsic-gen/gen/generate.go @@ -0,0 +1,179 @@ +// Copyright 2021 The Tint Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package gen + +import ( + "fmt" + "io" + "reflect" + "strings" + "text/template" + "unicode" + + "dawn.googlesource.com/tint/tools/src/cmd/intrinsic-gen/sem" +) + +type generator struct { + s *sem.Sem +} + +// Generate executes the template tmpl using the provided semantic +// information, writing the output to w. +// See https://golang.org/pkg/text/template/ for documentation on the template +// syntax. +func Generate(s *sem.Sem, tmpl string, w io.Writer) error { + g := generator{s: s} + return g.generate(tmpl, w) +} + +func (g *generator) generate(tmpl string, w io.Writer) error { + t, err := template. + New("