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("