intrinsic-gen: Support decorations on enum entries
Add `[[internal]]` decoration on `storage_class.handle` - its not an entry that should ever appear in WGSL.
Bug: tint:832
Change-Id: I210f64c495bf37a8f48422919248806e7b096638
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/53045
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: David Neto <dneto@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/src/intrinsics.def b/src/intrinsics.def
index bb5d08e..40a9d88 100644
--- a/src/intrinsics.def
+++ b/src/intrinsics.def
@@ -30,7 +30,7 @@
workgroup
uniform
storage
- handle
+ [[internal]] handle
}
// https://gpuweb.github.io/gpuweb/wgsl/#memory-access-mode
diff --git a/tools/src/cmd/intrinsic-gen/ast/ast.go b/tools/src/cmd/intrinsic-gen/ast/ast.go
index 75133d4..e7000f3 100644
--- a/tools/src/cmd/intrinsic-gen/ast/ast.go
+++ b/tools/src/cmd/intrinsic-gen/ast/ast.go
@@ -56,18 +56,34 @@
type EnumDecl struct {
Source tok.Source
Name string
- Entries []string
+ Entries []EnumEntry
}
// Format implements the fmt.Formatter interface
func (e EnumDecl) Format(w fmt.State, verb rune) {
fmt.Fprintf(w, "enum %v {\n", e.Name)
for _, e := range e.Entries {
- fmt.Fprintf(w, " %s\n", e)
+ fmt.Fprintf(w, " %v\n", e)
}
fmt.Fprintf(w, "}\n")
}
+// EnumEntry describes an entry in a enumerator
+type EnumEntry struct {
+ Source tok.Source
+ Name string
+ Decorations Decorations
+}
+
+// Format implements the fmt.Formatter interface
+func (e EnumEntry) Format(w fmt.State, verb rune) {
+ if len(e.Decorations) > 0 {
+ fmt.Fprintf(w, "%v %v", e.Decorations, e.Name)
+ } else {
+ fmt.Fprint(w, e.Name)
+ }
+}
+
// MatcherDecl describes a matcher declaration
type MatcherDecl struct {
Source tok.Source
diff --git a/tools/src/cmd/intrinsic-gen/parser/parser.go b/tools/src/cmd/intrinsic-gen/parser/parser.go
index 861e6f4..8434305 100644
--- a/tools/src/cmd/intrinsic-gen/parser/parser.go
+++ b/tools/src/cmd/intrinsic-gen/parser/parser.go
@@ -73,11 +73,17 @@
e := ast.EnumDecl{Source: name.Source, Name: string(name.Runes)}
p.expect(tok.Lbrace, "enum declaration")
for p.err == nil && p.match(tok.Rbrace) == nil {
- e.Entries = append(e.Entries, p.ident("enumerator value"))
+ e.Entries = append(e.Entries, p.enumEntry())
}
return e
}
+func (p *parser) enumEntry() ast.EnumEntry {
+ decos := p.decorations()
+ name := p.expect(tok.Identifier, "enum entry")
+ return ast.EnumEntry{Source: name.Source, Decorations: decos, Name: string(name.Runes)}
+}
+
func (p *parser) matcherDecl() ast.MatcherDecl {
p.expect(tok.Match, "matcher declaration")
name := p.expect(tok.Identifier, "matcher name")
diff --git a/tools/src/cmd/intrinsic-gen/parser/parser_test.go b/tools/src/cmd/intrinsic-gen/parser/parser_test.go
index dddb166..774dc0d 100644
--- a/tools/src/cmd/intrinsic-gen/parser/parser_test.go
+++ b/tools/src/cmd/intrinsic-gen/parser/parser_test.go
@@ -31,10 +31,17 @@
{"enum E {}", ast.AST{
Enums: []ast.EnumDecl{{Name: "E"}},
}},
- {"enum E { A B C }", ast.AST{
+ {"enum E { A [[deco]] B C }", ast.AST{
Enums: []ast.EnumDecl{{
- Name: "E",
- Entries: []string{"A", "B", "C"},
+ Name: "E",
+ Entries: []ast.EnumEntry{
+ {Name: "A"},
+ {
+ Decorations: ast.Decorations{{Name: "deco"}},
+ Name: "B",
+ },
+ {Name: "C"},
+ },
}},
}},
{"type T", ast.AST{
diff --git a/tools/src/cmd/intrinsic-gen/resolver/resolve.go b/tools/src/cmd/intrinsic-gen/resolver/resolve.go
index 1798d0d..05d14e1 100644
--- a/tools/src/cmd/intrinsic-gen/resolver/resolve.go
+++ b/tools/src/cmd/intrinsic-gen/resolver/resolve.go
@@ -90,9 +90,18 @@
// Register each of the enum entries
for _, ast := range e.Entries {
entry := &sem.EnumEntry{
- Name: ast,
+ Name: ast.Name,
Enum: s,
}
+ if internal := ast.Decorations.Take("internal"); internal != nil {
+ entry.IsInternal = true
+ if len(internal.Values) != 0 {
+ return fmt.Errorf("%v unexpected value for internal decoration", ast.Source)
+ }
+ }
+ if len(ast.Decorations) != 0 {
+ return fmt.Errorf("%v unknown decoration", ast.Decorations[0].Source)
+ }
if err := r.globals.declare(entry, e.Source); err != nil {
return err
}
diff --git a/tools/src/cmd/intrinsic-gen/sem/sem.go b/tools/src/cmd/intrinsic-gen/sem/sem.go
index 1a615fe..cb8f383 100644
--- a/tools/src/cmd/intrinsic-gen/sem/sem.go
+++ b/tools/src/cmd/intrinsic-gen/sem/sem.go
@@ -63,8 +63,9 @@
// EnumEntry is an entry in an enumerator
type EnumEntry struct {
- Enum *Enum
- Name string
+ Enum *Enum
+ Name string
+ IsInternal bool // True if this entry is not part of the WGSL grammar
}
// Type declares a type