Reactor: Fix printing of strings with escape characters

Don't bake the string into the printf format, use a '%s' and pass the string as a parameter.

Change-Id: I47be05383637caaa81a93d19623ff39c47988df3
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/31429
Tested-by: Ben Clayton <bclayton@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp
index 8616bea..272d8f0 100644
--- a/src/Reactor/LLVMReactor.cpp
+++ b/src/Reactor/LLVMReactor.cpp
@@ -4092,6 +4092,7 @@
 	std::vector<Value*> PrintValue::Ty<UShort4>::val(const RValue<UShort4>& v) { return extractAll(v.value, 4); }
 	std::vector<Value*> PrintValue::Ty<Float>::val(const RValue<Float>& v) { return toDouble({v.value}); }
 	std::vector<Value*> PrintValue::Ty<Float4>::val(const RValue<Float4>& v) { return toDouble(extractAll(v.value, 4)); }
+	std::vector<Value*> PrintValue::Ty<const char*>::val(const char* v) { return {V(::builder->CreateGlobalStringPtr(v))}; }
 
 	void Printv(const char* function, const char* file, int line, const char* fmt, std::initializer_list<PrintValue> args)
 	{
diff --git a/src/Reactor/Reactor.hpp b/src/Reactor/Reactor.hpp
index 8ac97d5..c1296d8 100644
--- a/src/Reactor/Reactor.hpp
+++ b/src/Reactor/Reactor.hpp
@@ -3252,8 +3252,6 @@
 		PrintValue(uint64_t v) : format(std::to_string(v)) {}
 		PrintValue(float v) : format(std::to_string(v)) {}
 		PrintValue(double v) : format(std::to_string(v)) {}
-		PrintValue(const char* v) : format(v) {}
-		PrintValue(const std::string& v) : format(v) {}
 
 		template <typename T>
 		PrintValue(const T* v) : format(addr(v)) {}
@@ -3295,6 +3293,18 @@
 		}
 	};
 
+	// PrintValue::Ty<T> specializations for basic types.
+	template <> struct PrintValue::Ty<const char*>
+	{
+		static constexpr const char* fmt = "%s";
+		static std::vector<Value*> val(const char* v);
+	};
+	template <> struct PrintValue::Ty<std::string>
+	{
+		static constexpr const char* fmt = PrintValue::Ty<const char*>::fmt;
+		static std::vector<Value*> val(const std::string& v) { return PrintValue::Ty<const char*>::val(v.c_str()); }
+	};
+
 	// PrintValue::Ty<T> specializations for standard Reactor types.
 	template <> struct PrintValue::Ty<Bool>
 	{