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