From 4c9528e08da8e684fa5b0060a6b3c08507364cfb Mon Sep 17 00:00:00 2001 From: Junyan He Date: Mon, 1 Sep 2014 16:18:45 +0800 Subject: Fix the global string bug for printf. When there are multi printf statements in multi kernel fucntions within the same translate unit, if they have the same sting parameter, the Clang will just generate one global string named .strXXX to represent that string. So when translating the kernel to gen, we can not unref that global var. Just ignore it to avoid assert. Signed-off-by: Junyan He Reviewed-by: Zhigang Gong --- backend/src/llvm/llvm_gen_backend.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/backend/src/llvm/llvm_gen_backend.cpp b/backend/src/llvm/llvm_gen_backend.cpp index 39ae3842..09220d64 100644 --- a/backend/src/llvm/llvm_gen_backend.cpp +++ b/backend/src/llvm/llvm_gen_backend.cpp @@ -1728,6 +1728,18 @@ namespace gbe ctx.getFunction().getPrintfSet()->setIndexBufBTI(btiBase); globalPointer.insert(std::make_pair(&v, btiBase++)); regTranslator.newScalarProxy(ir::ocl::printfiptr, const_cast(&v)); + } else if(v.getName().str().substr(0, 4) == ".str") { + /* When there are multi printf statements in multi kernel fucntions within the same + translate unit, if they have the same sting parameter, such as + kernel_func1 () { + printf("Line is %d\n", line_num1); + } + kernel_func2 () { + printf("Line is %d\n", line_num2); + } + The Clang will just generate one global string named .strXXX to represent "Line is %d\n" + So when translating the kernel_func1, we can not unref that global var, so we will + get here. Just ignore it to avoid assert. */ } else { GBE_ASSERT(0); } -- cgit v1.2.3