[tint] Move intrinsics.def to lang/core/core.def

And add template support for loading different definition files.

Change-Id: I37d9b2486633fdd2a829686fa339ff566539e62c
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/144120
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/src/tint/lang/core/builtin/access.cc.tmpl b/src/tint/lang/core/builtin/access.cc.tmpl
index 06f12cf..c1e5332 100644
--- a/src/tint/lang/core/builtin/access.cc.tmpl
+++ b/src/tint/lang/core/builtin/access.cc.tmpl
@@ -11,8 +11,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "access") -}}
+{{- $enum := ($I.Sem.Enum "access") -}}
 
 #include "src/tint/lang/core/builtin/access.h"
 
diff --git a/src/tint/lang/core/builtin/access.h.tmpl b/src/tint/lang/core/builtin/access.h.tmpl
index 8d28e7d..beda7fd 100644
--- a/src/tint/lang/core/builtin/access.h.tmpl
+++ b/src/tint/lang/core/builtin/access.h.tmpl
@@ -11,8 +11,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "access") -}}
+{{- $enum := ($I.Sem.Enum "access") -}}
 
 #ifndef SRC_TINT_LANG_CORE_BUILTIN_ACCESS_H_
 #define SRC_TINT_LANG_CORE_BUILTIN_ACCESS_H_
diff --git a/src/tint/lang/core/builtin/access_bench.cc.tmpl b/src/tint/lang/core/builtin/access_bench.cc.tmpl
index 7e8265c..b883b09 100644
--- a/src/tint/lang/core/builtin/access_bench.cc.tmpl
+++ b/src/tint/lang/core/builtin/access_bench.cc.tmpl
@@ -11,8 +11,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "access") -}}
+{{- $enum := ($I.Sem.Enum "access") -}}
 
 #include "src/tint/lang/core/builtin/access.h"
 
diff --git a/src/tint/lang/core/builtin/access_test.cc.tmpl b/src/tint/lang/core/builtin/access_test.cc.tmpl
index 76bb9d6..244e60f 100644
--- a/src/tint/lang/core/builtin/access_test.cc.tmpl
+++ b/src/tint/lang/core/builtin/access_test.cc.tmpl
@@ -11,8 +11,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "access") -}}
+{{- $enum := ($I.Sem.Enum "access") -}}
 
 #include "src/tint/lang/core/builtin/access.h"
 
diff --git a/src/tint/lang/core/builtin/address_space.cc.tmpl b/src/tint/lang/core/builtin/address_space.cc.tmpl
index b82e734..c7b6bf6 100644
--- a/src/tint/lang/core/builtin/address_space.cc.tmpl
+++ b/src/tint/lang/core/builtin/address_space.cc.tmpl
@@ -11,8 +11,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "address_space") -}}
+{{- $enum := ($I.Sem.Enum "address_space") -}}
 
 #include "src/tint/lang/core/builtin/address_space.h"
 
diff --git a/src/tint/lang/core/builtin/address_space.h.tmpl b/src/tint/lang/core/builtin/address_space.h.tmpl
index 8c9c918..979e27c 100644
--- a/src/tint/lang/core/builtin/address_space.h.tmpl
+++ b/src/tint/lang/core/builtin/address_space.h.tmpl
@@ -11,8 +11,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "address_space") -}}
+{{- $enum := ($I.Sem.Enum "address_space") -}}
 
 #ifndef SRC_TINT_LANG_CORE_BUILTIN_ADDRESS_SPACE_H_
 #define SRC_TINT_LANG_CORE_BUILTIN_ADDRESS_SPACE_H_
diff --git a/src/tint/lang/core/builtin/address_space_bench.cc.tmpl b/src/tint/lang/core/builtin/address_space_bench.cc.tmpl
index d51116b..6969fe3 100644
--- a/src/tint/lang/core/builtin/address_space_bench.cc.tmpl
+++ b/src/tint/lang/core/builtin/address_space_bench.cc.tmpl
@@ -11,8 +11,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "address_space") -}}
+{{- $enum := ($I.Sem.Enum "address_space") -}}
 
 #include "src/tint/lang/core/builtin/address_space.h"
 
diff --git a/src/tint/lang/core/builtin/address_space_test.cc.tmpl b/src/tint/lang/core/builtin/address_space_test.cc.tmpl
index 0364c15..717e24c 100644
--- a/src/tint/lang/core/builtin/address_space_test.cc.tmpl
+++ b/src/tint/lang/core/builtin/address_space_test.cc.tmpl
@@ -11,8 +11,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "address_space") -}}
+{{- $enum := ($I.Sem.Enum "address_space") -}}
 
 #include "src/tint/lang/core/builtin/address_space.h"
 
diff --git a/src/tint/lang/core/builtin/attribute.cc.tmpl b/src/tint/lang/core/builtin/attribute.cc.tmpl
index 667a1eb..3868cfd 100644
--- a/src/tint/lang/core/builtin/attribute.cc.tmpl
+++ b/src/tint/lang/core/builtin/attribute.cc.tmpl
@@ -11,8 +11,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "attribute") -}}
+{{- $enum := ($I.Sem.Enum "attribute") -}}
 
 #include "src/tint/lang/core/builtin/attribute.h"
 
diff --git a/src/tint/lang/core/builtin/attribute.h.tmpl b/src/tint/lang/core/builtin/attribute.h.tmpl
index 02def09..df6f563 100644
--- a/src/tint/lang/core/builtin/attribute.h.tmpl
+++ b/src/tint/lang/core/builtin/attribute.h.tmpl
@@ -11,8 +11,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "attribute") -}}
+{{- $enum := ($I.Sem.Enum "attribute") -}}
 
 #ifndef SRC_TINT_LANG_CORE_BUILTIN_ATTRIBUTE_H_
 #define SRC_TINT_LANG_CORE_BUILTIN_ATTRIBUTE_H_
diff --git a/src/tint/lang/core/builtin/attribute_bench.cc.tmpl b/src/tint/lang/core/builtin/attribute_bench.cc.tmpl
index 677ae24..b523518 100644
--- a/src/tint/lang/core/builtin/attribute_bench.cc.tmpl
+++ b/src/tint/lang/core/builtin/attribute_bench.cc.tmpl
@@ -11,8 +11,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "attribute") -}}
+{{- $enum := ($I.Sem.Enum "attribute") -}}
 
 #include "src/tint/lang/core/builtin/attribute.h"
 
diff --git a/src/tint/lang/core/builtin/attribute_test.cc.tmpl b/src/tint/lang/core/builtin/attribute_test.cc.tmpl
index dbcc51b..ae8eb01 100644
--- a/src/tint/lang/core/builtin/attribute_test.cc.tmpl
+++ b/src/tint/lang/core/builtin/attribute_test.cc.tmpl
@@ -11,8 +11,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "attribute") -}}
+{{- $enum := ($I.Sem.Enum "attribute") -}}
 
 #include "src/tint/lang/core/builtin/attribute.h"
 
diff --git a/src/tint/lang/core/builtin/builtin.cc.tmpl b/src/tint/lang/core/builtin/builtin.cc.tmpl
index efdb480..ca3c9a6 100644
--- a/src/tint/lang/core/builtin/builtin.cc.tmpl
+++ b/src/tint/lang/core/builtin/builtin.cc.tmpl
@@ -11,8 +11,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "builtin_type") -}}
+{{- $enum := ($I.Sem.Enum "builtin_type") -}}
 {{- Eval "OverrideEnumName" "Enum" $enum "Name" "Builtin" -}}
 
 #include "src/tint/lang/core/builtin/builtin.h"
diff --git a/src/tint/lang/core/builtin/builtin.h.tmpl b/src/tint/lang/core/builtin/builtin.h.tmpl
index 308fdbb..8fb4a3a 100644
--- a/src/tint/lang/core/builtin/builtin.h.tmpl
+++ b/src/tint/lang/core/builtin/builtin.h.tmpl
@@ -11,8 +11,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "builtin_type") -}}
+{{- $enum := ($I.Sem.Enum "builtin_type") -}}
 {{- Eval "OverrideEnumName" "Enum" $enum "Name" "Builtin" -}}
 
 #ifndef SRC_TINT_LANG_CORE_BUILTIN_BUILTIN_H_
diff --git a/src/tint/lang/core/builtin/builtin_bench.cc.tmpl b/src/tint/lang/core/builtin/builtin_bench.cc.tmpl
index 69e8f22..aa4f6ef 100644
--- a/src/tint/lang/core/builtin/builtin_bench.cc.tmpl
+++ b/src/tint/lang/core/builtin/builtin_bench.cc.tmpl
@@ -11,8 +11,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "builtin_type") -}}
+{{- $enum := ($I.Sem.Enum "builtin_type") -}}
 {{- Eval "OverrideEnumName" "Enum" $enum "Name" "Builtin" -}}
 
 #include "src/tint/lang/core/builtin/builtin.h"
diff --git a/src/tint/lang/core/builtin/builtin_test.cc.tmpl b/src/tint/lang/core/builtin/builtin_test.cc.tmpl
index b893c64..7a6959b 100644
--- a/src/tint/lang/core/builtin/builtin_test.cc.tmpl
+++ b/src/tint/lang/core/builtin/builtin_test.cc.tmpl
@@ -11,8 +11,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "builtin_type") -}}
+{{- $enum := ($I.Sem.Enum "builtin_type") -}}
 {{- Eval "OverrideEnumName" "Enum" $enum "Name" "Builtin" -}}
 
 #include "src/tint/lang/core/builtin/builtin.h"
diff --git a/src/tint/lang/core/builtin/builtin_value.cc.tmpl b/src/tint/lang/core/builtin/builtin_value.cc.tmpl
index df4ba2a..390bed1 100644
--- a/src/tint/lang/core/builtin/builtin_value.cc.tmpl
+++ b/src/tint/lang/core/builtin/builtin_value.cc.tmpl
@@ -8,8 +8,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "builtin_value") -}}
+{{- $enum := ($I.Sem.Enum "builtin_value") -}}
 
 #include "src/tint/lang/core/builtin/builtin_value.h"
 
diff --git a/src/tint/lang/core/builtin/builtin_value.h.tmpl b/src/tint/lang/core/builtin/builtin_value.h.tmpl
index 96643ed..cc5edda 100644
--- a/src/tint/lang/core/builtin/builtin_value.h.tmpl
+++ b/src/tint/lang/core/builtin/builtin_value.h.tmpl
@@ -8,8 +8,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "builtin_value") -}}
+{{- $enum := ($I.Sem.Enum "builtin_value") -}}
 
 #ifndef SRC_TINT_LANG_CORE_BUILTIN_BUILTIN_VALUE_H_
 #define SRC_TINT_LANG_CORE_BUILTIN_BUILTIN_VALUE_H_
diff --git a/src/tint/lang/core/builtin/builtin_value_bench.cc.tmpl b/src/tint/lang/core/builtin/builtin_value_bench.cc.tmpl
index 935f74f..5f95d49 100644
--- a/src/tint/lang/core/builtin/builtin_value_bench.cc.tmpl
+++ b/src/tint/lang/core/builtin/builtin_value_bench.cc.tmpl
@@ -8,8 +8,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "builtin_value") -}}
+{{- $enum := ($I.Sem.Enum "builtin_value") -}}
 
 #include "src/tint/lang/core/builtin/builtin_value.h"
 
diff --git a/src/tint/lang/core/builtin/builtin_value_test.cc.tmpl b/src/tint/lang/core/builtin/builtin_value_test.cc.tmpl
index a19306b..f0beafb 100644
--- a/src/tint/lang/core/builtin/builtin_value_test.cc.tmpl
+++ b/src/tint/lang/core/builtin/builtin_value_test.cc.tmpl
@@ -8,8 +8,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "builtin_value") -}}
+{{- $enum := ($I.Sem.Enum "builtin_value") -}}
 
 #include "src/tint/lang/core/builtin/builtin_value.h"
 
diff --git a/src/tint/lang/core/builtin/diagnostic_rule.cc.tmpl b/src/tint/lang/core/builtin/diagnostic_rule.cc.tmpl
index 5f40e7c..32e16e8 100644
--- a/src/tint/lang/core/builtin/diagnostic_rule.cc.tmpl
+++ b/src/tint/lang/core/builtin/diagnostic_rule.cc.tmpl
@@ -8,6 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/core/builtin/diagnostic_rule.h"
@@ -18,12 +19,12 @@
 
 namespace tint::builtin {
 
-{{ Eval "ParseEnum" (Sem.Enum "core_diagnostic_rule")}}
+{{ Eval "ParseEnum" ($I.Sem.Enum "core_diagnostic_rule")}}
 
-{{ Eval "EnumOStream" (Sem.Enum "core_diagnostic_rule")}}
+{{ Eval "EnumOStream" ($I.Sem.Enum "core_diagnostic_rule")}}
 
-{{ Eval "ParseEnum" (Sem.Enum "chromium_diagnostic_rule")}}
+{{ Eval "ParseEnum" ($I.Sem.Enum "chromium_diagnostic_rule")}}
 
-{{ Eval "EnumOStream" (Sem.Enum "chromium_diagnostic_rule")}}
+{{ Eval "EnumOStream" ($I.Sem.Enum "chromium_diagnostic_rule")}}
 
 }  // namespace tint::builtin
diff --git a/src/tint/lang/core/builtin/diagnostic_rule.h.tmpl b/src/tint/lang/core/builtin/diagnostic_rule.h.tmpl
index 8b6de0e..b6ffee3 100644
--- a/src/tint/lang/core/builtin/diagnostic_rule.h.tmpl
+++ b/src/tint/lang/core/builtin/diagnostic_rule.h.tmpl
@@ -8,6 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #ifndef SRC_TINT_LANG_CORE_BUILTIN_DIAGNOSTIC_RULE_H_
@@ -21,10 +22,10 @@
 namespace tint::builtin {
 
 /// WGSL core diagnostic rules.
-{{ Eval "DeclareEnum" (Sem.Enum "core_diagnostic_rule") }}
+{{ Eval "DeclareEnum" ($I.Sem.Enum "core_diagnostic_rule") }}
 
 /// Chromium-specific diagnostic rules.
-{{ Eval "DeclareEnum" (Sem.Enum "chromium_diagnostic_rule") }}
+{{ Eval "DeclareEnum" ($I.Sem.Enum "chromium_diagnostic_rule") }}
 
 /// All diagnostic rules understood by Tint.
 using DiagnosticRule = std::variant<CoreDiagnosticRule, ChromiumDiagnosticRule>;
diff --git a/src/tint/lang/core/builtin/diagnostic_rule_bench.cc.tmpl b/src/tint/lang/core/builtin/diagnostic_rule_bench.cc.tmpl
index 9136599..dc0afdd 100644
--- a/src/tint/lang/core/builtin/diagnostic_rule_bench.cc.tmpl
+++ b/src/tint/lang/core/builtin/diagnostic_rule_bench.cc.tmpl
@@ -8,6 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/core/builtin/diagnostic_rule.h"
@@ -19,9 +20,9 @@
 namespace tint::builtin {
 namespace {
 
-{{ Eval "BenchmarkParseEnum" (Sem.Enum "core_diagnostic_rule")}}
+{{ Eval "BenchmarkParseEnum" ($I.Sem.Enum "core_diagnostic_rule")}}
 
-{{ Eval "BenchmarkParseEnum" (Sem.Enum "chromium_diagnostic_rule")}}
+{{ Eval "BenchmarkParseEnum" ($I.Sem.Enum "chromium_diagnostic_rule")}}
 
 }  // namespace
 }  // namespace tint::builtin
diff --git a/src/tint/lang/core/builtin/diagnostic_rule_test.cc.tmpl b/src/tint/lang/core/builtin/diagnostic_rule_test.cc.tmpl
index baa3996..8d3dbf0 100644
--- a/src/tint/lang/core/builtin/diagnostic_rule_test.cc.tmpl
+++ b/src/tint/lang/core/builtin/diagnostic_rule_test.cc.tmpl
@@ -8,6 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include <string>
@@ -21,13 +22,13 @@
 
 namespace core_diagnostic_rule_tests {
 
-{{ Eval "TestParsePrintEnum" (Sem.Enum "core_diagnostic_rule")}}
+{{ Eval "TestParsePrintEnum" ($I.Sem.Enum "core_diagnostic_rule")}}
 
 }  // namespace core_diagnostic_rule_tests
 
 namespace chromium_diagnostic_rule_tests {
 
-{{ Eval "TestParsePrintEnum" (Sem.Enum "chromium_diagnostic_rule")}}
+{{ Eval "TestParsePrintEnum" ($I.Sem.Enum "chromium_diagnostic_rule")}}
 
 }  // namespace chromium_diagnostic_rule_tests
 
diff --git a/src/tint/lang/core/builtin/diagnostic_severity.cc.tmpl b/src/tint/lang/core/builtin/diagnostic_severity.cc.tmpl
index 2793f1f..3894692 100644
--- a/src/tint/lang/core/builtin/diagnostic_severity.cc.tmpl
+++ b/src/tint/lang/core/builtin/diagnostic_severity.cc.tmpl
@@ -8,6 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/core/builtin/diagnostic_severity.h"
@@ -29,8 +30,8 @@
     }
 }
 
-{{ Eval "ParseEnum" (Sem.Enum "diagnostic_severity")}}
+{{ Eval "ParseEnum" ($I.Sem.Enum "diagnostic_severity")}}
 
-{{ Eval "EnumOStream" (Sem.Enum "diagnostic_severity")}}
+{{ Eval "EnumOStream" ($I.Sem.Enum "diagnostic_severity")}}
 
 }  // namespace tint::builtin
diff --git a/src/tint/lang/core/builtin/diagnostic_severity.h.tmpl b/src/tint/lang/core/builtin/diagnostic_severity.h.tmpl
index f7433bf..4dfec5a 100644
--- a/src/tint/lang/core/builtin/diagnostic_severity.h.tmpl
+++ b/src/tint/lang/core/builtin/diagnostic_severity.h.tmpl
@@ -8,6 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #ifndef SRC_TINT_LANG_CORE_BUILTIN_DIAGNOSTIC_SEVERITY_H_
@@ -23,7 +24,7 @@
 namespace tint::builtin {
 
 /// The diagnostic severity control.
-{{ Eval "DeclareEnum" (Sem.Enum "diagnostic_severity") }}
+{{ Eval "DeclareEnum" ($I.Sem.Enum "diagnostic_severity") }}
 
 /// Convert a DiagnosticSeverity to the corresponding diag::Severity.
 diag::Severity ToSeverity(DiagnosticSeverity sc);
diff --git a/src/tint/lang/core/builtin/diagnostic_severity_bench.cc.tmpl b/src/tint/lang/core/builtin/diagnostic_severity_bench.cc.tmpl
index 985032c..cf3cd65 100644
--- a/src/tint/lang/core/builtin/diagnostic_severity_bench.cc.tmpl
+++ b/src/tint/lang/core/builtin/diagnostic_severity_bench.cc.tmpl
@@ -8,6 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/core/builtin/diagnostic_severity.h"
@@ -19,7 +20,7 @@
 namespace tint::builtin {
 namespace {
 
-{{ Eval "BenchmarkParseEnum" (Sem.Enum "diagnostic_severity")}}
+{{ Eval "BenchmarkParseEnum" ($I.Sem.Enum "diagnostic_severity")}}
 
 }  // namespace
 }  // namespace tint::builtin
diff --git a/src/tint/lang/core/builtin/diagnostic_severity_test.cc.tmpl b/src/tint/lang/core/builtin/diagnostic_severity_test.cc.tmpl
index 963f230..f87e5fe 100644
--- a/src/tint/lang/core/builtin/diagnostic_severity_test.cc.tmpl
+++ b/src/tint/lang/core/builtin/diagnostic_severity_test.cc.tmpl
@@ -8,6 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include <string>
@@ -21,7 +22,7 @@
 
 namespace diagnostic_severity_tests {
 
-{{ Eval "TestParsePrintEnum" (Sem.Enum "diagnostic_severity")}}
+{{ Eval "TestParsePrintEnum" ($I.Sem.Enum "diagnostic_severity")}}
 
 }  // namespace diagnostic_severity_tests
 
diff --git a/src/tint/lang/core/builtin/extension.cc.tmpl b/src/tint/lang/core/builtin/extension.cc.tmpl
index 794fe3f..5624638 100644
--- a/src/tint/lang/core/builtin/extension.cc.tmpl
+++ b/src/tint/lang/core/builtin/extension.cc.tmpl
@@ -8,8 +8,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "extension") -}}
+{{- $enum := ($I.Sem.Enum "extension") -}}
 
 #include "src/tint/lang/core/builtin/extension.h"
 
diff --git a/src/tint/lang/core/builtin/extension.h b/src/tint/lang/core/builtin/extension.h
index 09ccd209..9e45ebc 100644
--- a/src/tint/lang/core/builtin/extension.h
+++ b/src/tint/lang/core/builtin/extension.h
@@ -29,7 +29,7 @@
 namespace tint::builtin {
 
 /// An enumerator of WGSL extensions
-/// @see src/tint/intrinsics.def for extension descriptions
+/// @see src/tint/lang/wgsl/intrinsics.def for extension descriptions
 enum class Extension {
     kUndefined,
     kChromiumDisableUniformityAnalysis,
diff --git a/src/tint/lang/core/builtin/extension.h.tmpl b/src/tint/lang/core/builtin/extension.h.tmpl
index 8d301b9..7e32462 100644
--- a/src/tint/lang/core/builtin/extension.h.tmpl
+++ b/src/tint/lang/core/builtin/extension.h.tmpl
@@ -8,8 +8,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "extension") -}}
+{{- $enum := ($I.Sem.Enum "extension") -}}
 
 #ifndef SRC_TINT_LANG_CORE_BUILTIN_EXTENSION_H_
 #define SRC_TINT_LANG_CORE_BUILTIN_EXTENSION_H_
@@ -20,7 +21,7 @@
 namespace tint::builtin {
 
 /// An enumerator of WGSL extensions
-/// @see src/tint/intrinsics.def for extension descriptions
+/// @see src/tint/lang/wgsl/intrinsics.def for extension descriptions
 {{ Eval "DeclareEnum" $enum}}
 
 // A unique vector of extensions
diff --git a/src/tint/lang/core/builtin/extension_bench.cc.tmpl b/src/tint/lang/core/builtin/extension_bench.cc.tmpl
index 252d616..649cb76 100644
--- a/src/tint/lang/core/builtin/extension_bench.cc.tmpl
+++ b/src/tint/lang/core/builtin/extension_bench.cc.tmpl
@@ -8,8 +8,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "extension") -}}
+{{- $enum := ($I.Sem.Enum "extension") -}}
 
 #include "src/tint/lang/core/builtin/extension.h"
 
diff --git a/src/tint/lang/core/builtin/extension_test.cc.tmpl b/src/tint/lang/core/builtin/extension_test.cc.tmpl
index f5df4c1..7975679 100644
--- a/src/tint/lang/core/builtin/extension_test.cc.tmpl
+++ b/src/tint/lang/core/builtin/extension_test.cc.tmpl
@@ -8,8 +8,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "extension") -}}
+{{- $enum := ($I.Sem.Enum "extension") -}}
 
 #include "src/tint/lang/core/builtin/extension.h"
 
diff --git a/src/tint/lang/core/builtin/function.cc.tmpl b/src/tint/lang/core/builtin/function.cc.tmpl
index 656c541..228a6a1 100644
--- a/src/tint/lang/core/builtin/function.cc.tmpl
+++ b/src/tint/lang/core/builtin/function.cc.tmpl
@@ -11,12 +11,13 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 #include "src/tint/lang/core/builtin/function.h"
 
 namespace tint::builtin {
 
 Function ParseFunction(std::string_view name) {
-{{- range Sem.Builtins  }}
+{{- range $I.Sem.Builtins  }}
     if (name == "{{.Name}}") {
         return Function::k{{PascalCase .Name}};
     }
@@ -28,7 +29,7 @@
     switch (i) {
         case Function::kNone:
             return "<none>";
-{{- range Sem.Builtins  }}
+{{- range $I.Sem.Builtins  }}
         case Function::k{{PascalCase .Name}}:
             return "{{.Name}}";
 {{- end  }}
diff --git a/src/tint/lang/core/builtin/function.h.tmpl b/src/tint/lang/core/builtin/function.h.tmpl
index f43ab7a..e9ff45e 100644
--- a/src/tint/lang/core/builtin/function.h.tmpl
+++ b/src/tint/lang/core/builtin/function.h.tmpl
@@ -11,6 +11,8 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+
 #ifndef SRC_TINT_LANG_CORE_BUILTIN_FUNCTION_H_
 #define SRC_TINT_LANG_CORE_BUILTIN_FUNCTION_H_
 
@@ -24,7 +26,7 @@
 /// Enumerator of all builtin functions
 enum class Function {
     kNone = -1,
-{{- range Sem.Builtins }}
+{{- range $I.Sem.Builtins }}
     k{{PascalCase .Name}},
 {{- end }}
 };
@@ -48,14 +50,14 @@
 
 /// All builtin functions
 constexpr Function kFunctions[] = {
-{{- range Sem.Builtins }}
+{{- range $I.Sem.Builtins }}
     Function::k{{PascalCase .Name}},
 {{- end }}
 };
 
 /// All builtin function names
 constexpr const char* kFunctionStrings[] = {
-{{- range Sem.Builtins }}
+{{- range $I.Sem.Builtins }}
     "{{.Name}}",
 {{- end }}
 };
diff --git a/src/tint/lang/core/builtin/interpolation_sampling.cc.tmpl b/src/tint/lang/core/builtin/interpolation_sampling.cc.tmpl
index 9fe6a21a..e29c088 100644
--- a/src/tint/lang/core/builtin/interpolation_sampling.cc.tmpl
+++ b/src/tint/lang/core/builtin/interpolation_sampling.cc.tmpl
@@ -8,6 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/core/builtin/interpolation_sampling.h"
@@ -16,8 +17,8 @@
 
 namespace tint::builtin {
 
-{{ Eval "ParseEnum" (Sem.Enum "interpolation_sampling")}}
+{{ Eval "ParseEnum" ($I.Sem.Enum "interpolation_sampling")}}
 
-{{ Eval "EnumOStream" (Sem.Enum "interpolation_sampling")}}
+{{ Eval "EnumOStream" ($I.Sem.Enum "interpolation_sampling")}}
 
 }  // namespace tint::builtin
diff --git a/src/tint/lang/core/builtin/interpolation_sampling.h.tmpl b/src/tint/lang/core/builtin/interpolation_sampling.h.tmpl
index c510fe0..91b0705 100644
--- a/src/tint/lang/core/builtin/interpolation_sampling.h.tmpl
+++ b/src/tint/lang/core/builtin/interpolation_sampling.h.tmpl
@@ -8,6 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #ifndef SRC_TINT_LANG_CORE_BUILTIN_INTERPOLATION_SAMPLING_H_
@@ -20,7 +21,7 @@
 namespace tint::builtin {
 
 /// The interpolation sampling.
-{{ Eval "DeclareEnum" (Sem.Enum "interpolation_sampling") }}
+{{ Eval "DeclareEnum" ($I.Sem.Enum "interpolation_sampling") }}
 
 }  // namespace tint::builtin
 
diff --git a/src/tint/lang/core/builtin/interpolation_sampling_bench.cc.tmpl b/src/tint/lang/core/builtin/interpolation_sampling_bench.cc.tmpl
index a880b3d..8cbe73a 100644
--- a/src/tint/lang/core/builtin/interpolation_sampling_bench.cc.tmpl
+++ b/src/tint/lang/core/builtin/interpolation_sampling_bench.cc.tmpl
@@ -8,6 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include <array>
@@ -18,7 +19,7 @@
 namespace tint::builtin {
 namespace {
 
-{{ Eval "BenchmarkParseEnum" (Sem.Enum "interpolation_sampling")}}
+{{ Eval "BenchmarkParseEnum" ($I.Sem.Enum "interpolation_sampling")}}
 
 }  // namespace
 }  // namespace tint::builtin
diff --git a/src/tint/lang/core/builtin/interpolation_sampling_test.cc.tmpl b/src/tint/lang/core/builtin/interpolation_sampling_test.cc.tmpl
index b36007c..faeee6c 100644
--- a/src/tint/lang/core/builtin/interpolation_sampling_test.cc.tmpl
+++ b/src/tint/lang/core/builtin/interpolation_sampling_test.cc.tmpl
@@ -8,6 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/core/builtin/interpolation_sampling.h"
@@ -22,7 +23,7 @@
 
 namespace interpolation_sampling_tests {
 
-{{ Eval "TestParsePrintEnum" (Sem.Enum "interpolation_sampling")}}
+{{ Eval "TestParsePrintEnum" ($I.Sem.Enum "interpolation_sampling")}}
 
 }  // namespace interpolation_sampling_tests
 
diff --git a/src/tint/lang/core/builtin/interpolation_type.cc.tmpl b/src/tint/lang/core/builtin/interpolation_type.cc.tmpl
index ba8cbb8..0922641 100644
--- a/src/tint/lang/core/builtin/interpolation_type.cc.tmpl
+++ b/src/tint/lang/core/builtin/interpolation_type.cc.tmpl
@@ -8,6 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/core/builtin/interpolation_type.h"
@@ -16,8 +17,8 @@
 
 namespace tint::builtin {
 
-{{ Eval "ParseEnum" (Sem.Enum "interpolation_type")}}
+{{ Eval "ParseEnum" ($I.Sem.Enum "interpolation_type")}}
 
-{{ Eval "EnumOStream" (Sem.Enum "interpolation_type")}}
+{{ Eval "EnumOStream" ($I.Sem.Enum "interpolation_type")}}
 
 }  // namespace tint::builtin
diff --git a/src/tint/lang/core/builtin/interpolation_type.h.tmpl b/src/tint/lang/core/builtin/interpolation_type.h.tmpl
index f8946c3..3785706 100644
--- a/src/tint/lang/core/builtin/interpolation_type.h.tmpl
+++ b/src/tint/lang/core/builtin/interpolation_type.h.tmpl
@@ -8,6 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #ifndef SRC_TINT_LANG_CORE_BUILTIN_INTERPOLATION_TYPE_H_
@@ -20,7 +21,7 @@
 namespace tint::builtin {
 
 /// The interpolation type.
-{{ Eval "DeclareEnum" (Sem.Enum "interpolation_type") }}
+{{ Eval "DeclareEnum" ($I.Sem.Enum "interpolation_type") }}
 
 }  // namespace tint::builtin
 
diff --git a/src/tint/lang/core/builtin/interpolation_type_bench.cc.tmpl b/src/tint/lang/core/builtin/interpolation_type_bench.cc.tmpl
index 1329093..c1bbd43 100644
--- a/src/tint/lang/core/builtin/interpolation_type_bench.cc.tmpl
+++ b/src/tint/lang/core/builtin/interpolation_type_bench.cc.tmpl
@@ -8,6 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/core/builtin/interpolation_type.h"
@@ -19,7 +20,7 @@
 namespace tint::builtin {
 namespace {
 
-{{ Eval "BenchmarkParseEnum" (Sem.Enum "interpolation_type")}}
+{{ Eval "BenchmarkParseEnum" ($I.Sem.Enum "interpolation_type")}}
 
 }  // namespace
 }  // namespace tint::builtin
diff --git a/src/tint/lang/core/builtin/interpolation_type_test.cc.tmpl b/src/tint/lang/core/builtin/interpolation_type_test.cc.tmpl
index d616675..297efe1 100644
--- a/src/tint/lang/core/builtin/interpolation_type_test.cc.tmpl
+++ b/src/tint/lang/core/builtin/interpolation_type_test.cc.tmpl
@@ -8,6 +8,7 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
 
 #include "src/tint/lang/core/builtin/interpolation_type.h"
@@ -22,7 +23,7 @@
 
 namespace interpolation_type_tests {
 
-{{ Eval "TestParsePrintEnum" (Sem.Enum "interpolation_type")}}
+{{ Eval "TestParsePrintEnum" ($I.Sem.Enum "interpolation_type")}}
 
 }  // namespace interpolation_type_tests
 
diff --git a/src/tint/lang/core/builtin/texel_format.cc.tmpl b/src/tint/lang/core/builtin/texel_format.cc.tmpl
index 3cef759..0708350 100644
--- a/src/tint/lang/core/builtin/texel_format.cc.tmpl
+++ b/src/tint/lang/core/builtin/texel_format.cc.tmpl
@@ -8,8 +8,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "texel_format") -}}
+{{- $enum := ($I.Sem.Enum "texel_format") -}}
 
 #include "src/tint/lang/core/builtin/texel_format.h"
 
diff --git a/src/tint/lang/core/builtin/texel_format.h.tmpl b/src/tint/lang/core/builtin/texel_format.h.tmpl
index e4b1125..51fa418 100644
--- a/src/tint/lang/core/builtin/texel_format.h.tmpl
+++ b/src/tint/lang/core/builtin/texel_format.h.tmpl
@@ -8,8 +8,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "texel_format") -}}
+{{- $enum := ($I.Sem.Enum "texel_format") -}}
 
 #ifndef SRC_TINT_LANG_CORE_BUILTIN_TEXEL_FORMAT_H_
 #define SRC_TINT_LANG_CORE_BUILTIN_TEXEL_FORMAT_H_
diff --git a/src/tint/lang/core/builtin/texel_format_bench.cc.tmpl b/src/tint/lang/core/builtin/texel_format_bench.cc.tmpl
index 646e7ba3..566bb59 100644
--- a/src/tint/lang/core/builtin/texel_format_bench.cc.tmpl
+++ b/src/tint/lang/core/builtin/texel_format_bench.cc.tmpl
@@ -8,8 +8,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "texel_format") -}}
+{{- $enum := ($I.Sem.Enum "texel_format") -}}
 
 #include "src/tint/lang/core/builtin/texel_format.h"
 
diff --git a/src/tint/lang/core/builtin/texel_format_test.cc.tmpl b/src/tint/lang/core/builtin/texel_format_test.cc.tmpl
index d985800..332456f 100644
--- a/src/tint/lang/core/builtin/texel_format_test.cc.tmpl
+++ b/src/tint/lang/core/builtin/texel_format_test.cc.tmpl
@@ -8,8 +8,9 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
 {{- Import "src/tint/utils/templates/enums.tmpl.inc" -}}
-{{- $enum := (Sem.Enum "texel_format") -}}
+{{- $enum := ($I.Sem.Enum "texel_format") -}}
 
 #include "src/tint/lang/core/builtin/texel_format.h"
 
diff --git a/src/tint/intrinsics.def b/src/tint/lang/core/core.def
similarity index 100%
rename from src/tint/intrinsics.def
rename to src/tint/lang/core/core.def
diff --git a/src/tint/lang/wgsl/resolver/ctor_conv_intrinsic.cc.tmpl b/src/tint/lang/wgsl/resolver/ctor_conv_intrinsic.cc.tmpl
index dd33015..46ffe81 100644
--- a/src/tint/lang/wgsl/resolver/ctor_conv_intrinsic.cc.tmpl
+++ b/src/tint/lang/wgsl/resolver/ctor_conv_intrinsic.cc.tmpl
@@ -11,6 +11,8 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+
 #include "src/tint/lang/wgsl/resolver/ctor_conv_intrinsic.h"
 
 namespace tint::resolver {
@@ -19,7 +21,7 @@
     switch (i) {
         case CtorConvIntrinsic::kNone:
             return "<none>";
-{{- range Sem.ConstructorsAndConverters  }}
+{{- range $I.Sem.ConstructorsAndConverters  }}
         case CtorConvIntrinsic::k{{Title .Name}}:
             return "{{.Name}}";
 {{- end  }}
diff --git a/src/tint/lang/wgsl/resolver/ctor_conv_intrinsic.h.tmpl b/src/tint/lang/wgsl/resolver/ctor_conv_intrinsic.h.tmpl
index dcae601..3a49828 100644
--- a/src/tint/lang/wgsl/resolver/ctor_conv_intrinsic.h.tmpl
+++ b/src/tint/lang/wgsl/resolver/ctor_conv_intrinsic.h.tmpl
@@ -11,6 +11,8 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+
 #ifndef SRC_TINT_LANG_WGSL_RESOLVER_CTOR_CONV_INTRINSIC_H_
 #define SRC_TINT_LANG_WGSL_RESOLVER_CTOR_CONV_INTRINSIC_H_
 
@@ -22,7 +24,7 @@
 /// declared in the intrinsic table.
 enum class CtorConvIntrinsic {
     kNone = -1,
-{{- range Sem.ConstructorsAndConverters }}
+{{- range $I.Sem.ConstructorsAndConverters }}
     k{{Title .Name}},
 {{- end }}
 };
diff --git a/src/tint/lang/wgsl/resolver/intrinsic_table.inl.tmpl b/src/tint/lang/wgsl/resolver/intrinsic_table.inl.tmpl
index 2410b07..1be75c7 100644
--- a/src/tint/lang/wgsl/resolver/intrinsic_table.inl.tmpl
+++ b/src/tint/lang/wgsl/resolver/intrinsic_table.inl.tmpl
@@ -12,9 +12,11 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+
 // clang-format off
 
-{{  with Sem -}}
+{{  with $I.Sem -}}
 {{    range .Types -}}
 {{      template "Type" . }}
 {{    end -}}
@@ -26,8 +28,8 @@
 {{    end -}}
 {{- end -}}
 
-{{- with IntrinsicTable -}}
-{{- template "Matchers" . }}
+{{- with $I.Table -}}
+{{- template "Matchers" $I }}
 
 constexpr MatcherIndex kMatcherIndices[] = {
 {{- range $i, $idx := .MatcherIndices }}
@@ -341,27 +343,27 @@
  private:
 {{- $t_names := Map -}}
 {{- $n_names := Map -}}
-{{- range Iterate Sem.MaxTemplateTypes -}}
+{{- range Iterate $.Sem.MaxTemplateTypes -}}
 {{-   $name := printf "template_type_%v" . -}}
 {{-   $t_names.Put . $name }}
   TemplateTypeMatcher {{$name}}_{ {{- . -}} };
 {{- end }}
-{{- range Iterate Sem.MaxTemplateNumbers -}}
+{{- range Iterate $.Sem.MaxTemplateNumbers -}}
 {{-   $name := printf "template_number_%v" . -}}
 {{-   $n_names.Put . $name }}
   TemplateNumberMatcher {{$name}}_{ {{- . -}} };
 {{- end }}
-{{- range Sem.Types -}}
+{{- range $.Sem.Types -}}
 {{-   $name := PascalCase .Name -}}
 {{-   $t_names.Put . $name }}
   {{$name}} {{$name}}_;
 {{- end }}
-{{- range Sem.TypeMatchers -}}
+{{- range $.Sem.TypeMatchers -}}
 {{-   $name := PascalCase .Name -}}
 {{-   $t_names.Put . $name }}
   {{$name}} {{$name}}_;
 {{- end }}
-{{- range Sem.EnumMatchers -}}
+{{- range $.Sem.EnumMatchers -}}
 {{-   $name := PascalCase .Name -}}
 {{-   $n_names.Put . $name }}
   {{$name}} {{$name}}_;
@@ -374,8 +376,8 @@
   ~Matchers();
 
   /// The template types, types, and type matchers
-  TypeMatcher const* const type[{{len .TMatchers}}] = {
-{{- range $i, $m := .TMatchers }}
+  TypeMatcher const* const type[{{len $.Table.TMatchers}}] = {
+{{- range $i, $m := $.Table.TMatchers }}
     /* [{{$i}}] */
 {{-   if $m }} &{{$t_names.Get $m}}_,
 {{-   else  }} &{{$t_names.Get $i}}_,
@@ -384,8 +386,8 @@
   };
 
   /// The template numbers, and number matchers
-  NumberMatcher const* const number[{{len .NMatchers}}] = {
-{{- range $i, $m := .NMatchers }}
+  NumberMatcher const* const number[{{len $.Table.NMatchers}}] = {
+{{- range $i, $m := $.Table.NMatchers }}
     /* [{{$i}}] */
 {{-   if $m }} &{{$n_names.Get $m}}_,
 {{-   else  }} &{{$n_names.Get $i}}_,
diff --git a/src/tint/lang/wgsl/sem/parameter_usage.cc.tmpl b/src/tint/lang/wgsl/sem/parameter_usage.cc.tmpl
index afdc67f..1a3981c 100644
--- a/src/tint/lang/wgsl/sem/parameter_usage.cc.tmpl
+++ b/src/tint/lang/wgsl/sem/parameter_usage.cc.tmpl
@@ -11,6 +11,8 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+
 #include "src/tint/lang/wgsl/sem/parameter_usage.h"
 
 namespace tint::sem {
@@ -19,7 +21,7 @@
     switch (usage) {
         case ParameterUsage::kNone:
             return "none";
-{{- range Sem.UniqueParameterNames  }}
+{{- range $I.Sem.UniqueParameterNames  }}
         case ParameterUsage::k{{PascalCase .}}:
             return "{{.}}";
 {{- end  }}
diff --git a/src/tint/lang/wgsl/sem/parameter_usage.h.tmpl b/src/tint/lang/wgsl/sem/parameter_usage.h.tmpl
index ddaf7e9..a13e1c4 100644
--- a/src/tint/lang/wgsl/sem/parameter_usage.h.tmpl
+++ b/src/tint/lang/wgsl/sem/parameter_usage.h.tmpl
@@ -11,6 +11,8 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+
 #ifndef SRC_TINT_LANG_WGSL_SEM_PARAMETER_USAGE_H_
 #define SRC_TINT_LANG_WGSL_SEM_PARAMETER_USAGE_H_
 
@@ -20,7 +22,7 @@
 /// overload position
 enum class ParameterUsage {
     kNone = -1,
-{{- range Sem.UniqueParameterNames  }}
+{{- range $I.Sem.UniqueParameterNames  }}
     k{{PascalCase .}},
 {{- end  }}
 };
diff --git a/test/tint/builtins/gen/gen.wgsl.tmpl b/test/tint/builtins/gen/gen.wgsl.tmpl
index b1e9670..e76dd820 100644
--- a/test/tint/builtins/gen/gen.wgsl.tmpl
+++ b/test/tint/builtins/gen/gen.wgsl.tmpl
@@ -9,11 +9,13 @@
 --------------------------------------------------------------------------------
 */ -}}
 
+{{- $I := LoadIntrinsics "src/tint/lang/core/core.def" -}}
+
 {{- /* For each permutation of each overload of each function... */ -}}
-{{- range Sem.Builtins -}}
+{{- range $I.Sem.Builtins -}}
 {{    if not (HasPrefix .Name "_") }}
 {{-     range .Overloads  -}}
-{{-       range Permute . -}}
+{{-       range $I.Permute . -}}
 {{- /*      Generate a ./literal/<function>/<permuataion-hash>.wgsl file using
             the Permutation macro defined below                             */ -}}
 {{-         $file := printf "./literal/%v/%v.wgsl" .Intrinsic.Name .Hash -}}
diff --git a/tools/src/cmd/gen/main.go b/tools/src/cmd/gen/main.go
index c574d8b..8336383 100644
--- a/tools/src/cmd/gen/main.go
+++ b/tools/src/cmd/gen/main.go
@@ -12,8 +12,8 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-// gen parses the <tint>/src/tint/intrinsics.def file, then scans the
-// project directory for '<file>.tmpl' files, to produce source code files.
+// gen scans the the project directory for '<file>.tmpl' files, producing code
+// from those template files.
 package main
 
 import (
@@ -42,8 +42,6 @@
 	"dawn.googlesource.com/dawn/tools/src/tint/intrinsic/sem"
 )
 
-const defProjectRelPath = "src/tint/intrinsics.def"
-
 func main() {
 	if err := run(); err != nil {
 		fmt.Println(err)
@@ -59,9 +57,6 @@
 are explicitly specified, then gen scans the '<dawn>/src/tint' and
 '<dawn>/test/tint' directories for '<file>.tmpl' files.
 
-If the templates use the 'IntrinsicTable' function then gen will parse and
-resolve the <tint>/src/tint/intrinsics.def file.
-
 usage:
   gen [flags] [template files]
 
@@ -228,28 +223,26 @@
 	return nil
 }
 
-// Cache for objects that are expensive to build, and can be reused between templates.
-type genCache struct {
-	cached struct {
-		sem            *sem.Sem            // lazily built by sem()
-		intrinsicTable *gen.IntrinsicTable // lazily built by intrinsicTable()
-		permuter       *gen.Permuter       // lazily built by permute()
-	}
+type intrinsicCache struct {
+	path           string
+	cachedSem      *sem.Sem            // lazily built by sem()
+	cachedTable    *gen.IntrinsicTable // lazily built by intrinsicTable()
+	cachedPermuter *gen.Permuter       // lazily built by permute()
 }
 
-// sem lazily parses and resolves the intrinsic.def file, returning the semantic info.
-func (g *genCache) sem() (*sem.Sem, error) {
-	if g.cached.sem == nil {
-		// Load the builtins definition file
-		defPath := filepath.Join(fileutils.DawnRoot(), defProjectRelPath)
+// Sem lazily parses and resolves the intrinsic.def file, returning the semantic info.
+func (i *intrinsicCache) Sem() (*sem.Sem, error) {
+	if i.cachedSem == nil {
+		// Load the intrinsic definition file
+		defPath := filepath.Join(fileutils.DawnRoot(), i.path)
 
-		defSource, err := ioutil.ReadFile(defPath)
+		defSource, err := os.ReadFile(defPath)
 		if err != nil {
 			return nil, err
 		}
 
 		// Parse the definition file to produce an AST
-		ast, err := parser.Parse(string(defSource), defProjectRelPath)
+		ast, err := parser.Parse(string(defSource), i.path)
 		if err != nil {
 			return nil, err
 		}
@@ -260,41 +253,58 @@
 			return nil, err
 		}
 
-		g.cached.sem = sem
+		i.cachedSem = sem
 	}
-	return g.cached.sem, nil
+	return i.cachedSem, nil
 }
 
-// intrinsicTable lazily calls and returns the result of buildIntrinsicTable(),
+// Table lazily calls and returns the result of BuildIntrinsicTable(),
 // caching the result for repeated calls.
-func (g *genCache) intrinsicTable() (*gen.IntrinsicTable, error) {
-	if g.cached.intrinsicTable == nil {
-		sem, err := g.sem()
+func (i *intrinsicCache) Table() (*gen.IntrinsicTable, error) {
+	if i.cachedTable == nil {
+		sem, err := i.Sem()
 		if err != nil {
 			return nil, err
 		}
-		g.cached.intrinsicTable, err = gen.BuildIntrinsicTable(sem)
+		i.cachedTable, err = gen.BuildIntrinsicTable(sem)
 		if err != nil {
 			return nil, err
 		}
 	}
-	return g.cached.intrinsicTable, nil
+	return i.cachedTable, nil
 }
 
-// permute lazily calls buildPermuter(), caching the result for repeated
-// calls, then passes the argument to Permutator.Permute()
-func (g *genCache) permute(overload *sem.Overload) ([]gen.Permutation, error) {
-	if g.cached.permuter == nil {
-		sem, err := g.sem()
+// Permute lazily calls NewPermuter(), caching the result for repeated calls,
+// then passes the argument to Permutator.Permute()
+func (i *intrinsicCache) Permute(overload *sem.Overload) ([]gen.Permutation, error) {
+	if i.cachedPermuter == nil {
+		sem, err := i.Sem()
 		if err != nil {
 			return nil, err
 		}
-		g.cached.permuter, err = gen.NewPermuter(sem)
+		i.cachedPermuter, err = gen.NewPermuter(sem)
 		if err != nil {
 			return nil, err
 		}
 	}
-	return g.cached.permuter.Permute(overload)
+	return i.cachedPermuter.Permute(overload)
+}
+
+// Cache for objects that are expensive to build, and can be reused between templates.
+type genCache struct {
+	intrinsicsCache container.Map[string, *intrinsicCache]
+}
+
+func (g *genCache) intrinsics(path string) *intrinsicCache {
+	if g.intrinsicsCache == nil {
+		g.intrinsicsCache = container.NewMap[string, *intrinsicCache]()
+	}
+	i := g.intrinsicsCache[path]
+	if i == nil {
+		i = &intrinsicCache{path: path}
+		g.intrinsicsCache[path] = i
+	}
+	return i
 }
 
 var copyrightRegex = regexp.MustCompile(`// Copyright (\d+) The`)
@@ -364,9 +374,7 @@
 		"OverloadUsesF16":       gen.OverloadUsesF16,
 		"IsFirstIn":             isFirstIn,
 		"IsLastIn":              isLastIn,
-		"Sem":                   g.cache.sem,
-		"IntrinsicTable":        g.cache.intrinsicTable,
-		"Permute":               g.cache.permute,
+		"LoadIntrinsics":        func(path string) *intrinsicCache { return g.cache.intrinsics(path) },
 		"WriteFile":             func(relPath, content string) (string, error) { return "", g.writeFile(relPath, content) },
 	}
 	return template.Run(tmpl, w, funcs)