Reland "[glsl] Emit signed and unsigned integers"

This fixes the UBSAN issue with the integer test.

This reverts commit 40038e56505ece1a5be5c30ba941303cfa72b63c.

Change-Id: I32a473c6cd3c3618c6f6b01b530e26db019577cd
Bug: 42251044
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/201014
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/glsl/writer/constant_test.cc b/src/tint/lang/glsl/writer/constant_test.cc
index 9686bf1..0de7fe3 100644
--- a/src/tint/lang/glsl/writer/constant_test.cc
+++ b/src/tint/lang/glsl/writer/constant_test.cc
@@ -63,5 +63,50 @@
 )");
 }
 
+TEST_F(GlslWriterTest, ConstantInt) {
+    auto* f = b.Function("a", ty.i32());
+    f->Block()->Append(b.Return(f, -12345_i));
+
+    ASSERT_TRUE(Generate()) << err_ << output_.glsl;
+    EXPECT_EQ(output_.glsl, GlslHeader() + R"(
+int a() {
+  return -12345;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void unused_entry_point() {
+}
+)");
+}
+
+TEST_F(GlslWriterTest, ConstantIntMin) {
+    auto* f = b.Function("a", ty.i32());
+    b.Append(f->Block(), [&] { b.Return(f, i32(std::numeric_limits<int32_t>::min())); });
+
+    ASSERT_TRUE(Generate()) << err_ << output_.glsl;
+    EXPECT_EQ(output_.glsl, GlslHeader() + R"(
+int a() {
+  return (-2147483647 - 1);
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void unused_entry_point() {
+}
+)");
+}
+
+TEST_F(GlslWriterTest, ConstantUInt) {
+    auto* f = b.Function("a", ty.u32());
+    f->Block()->Append(b.Return(f, 56779_u));
+
+    ASSERT_TRUE(Generate()) << err_ << output_.glsl;
+    EXPECT_EQ(output_.glsl, GlslHeader() + R"(
+uint a() {
+  return 56779u;
+}
+layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
+void unused_entry_point() {
+}
+)");
+}
+
 }  // namespace
 }  // namespace tint::glsl::writer
diff --git a/src/tint/lang/glsl/writer/printer/printer.cc b/src/tint/lang/glsl/writer/printer/printer.cc
index 3d65b00..8e5455b 100644
--- a/src/tint/lang/glsl/writer/printer/printer.cc
+++ b/src/tint/lang/glsl/writer/printer/printer.cc
@@ -36,7 +36,10 @@
 #include "src/tint/lang/core/ir/unreachable.h"
 #include "src/tint/lang/core/ir/validator.h"
 #include "src/tint/lang/core/type/bool.h"
+#include "src/tint/lang/core/type/i32.h"
+#include "src/tint/lang/core/type/u32.h"
 #include "src/tint/lang/core/type/void.h"
+#include "src/tint/lang/glsl/writer/common/printer_support.h"
 #include "src/tint/lang/glsl/writer/common/version.h"
 #include "src/tint/utils/generator/text_generator.h"
 #include "src/tint/utils/macros/scoped_assignment.h"
@@ -158,6 +161,8 @@
         tint::Switch(
             ty,                                               //
             [&](const core::type::Bool*) { out << "bool"; },  //
+            [&](const core::type::I32*) { out << "int"; },    //
+            [&](const core::type::U32*) { out << "uint"; },   //
             [&](const core::type::Void*) { out << "void"; },  //
 
             // TODO(dsinclair): Handle remaining types
@@ -199,6 +204,8 @@
         tint::Switch(
             c->Type(),  //
             [&](const core::type::Bool*) { out << (c->ValueAs<AInt>() ? "true" : "false"); },
+            [&](const core::type::I32*) { PrintI32(out, c->ValueAs<i32>()); },
+            [&](const core::type::U32*) { out << c->ValueAs<AInt>() << "u"; },
 
             // TODO(dsinclair): Emit remaining constant types
             TINT_ICE_ON_NO_MATCH);