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>
{