From 441c89fbd0cfeccd8cd790a44d4c5365c563720c Mon Sep 17 00:00:00 2001 From: Gil Pitney Date: Tue, 31 Mar 2015 22:52:46 +0000 Subject: Update clGetProgramInfo() for library program objects. Added: clGetProgramInfo( program, CL_PROGRAM_BINARY_SIZES, ...) clGetProgramInfo( program, CL_PROGRAM_BINARIES, ...) to return binaries for library program objects. Previously, this was only returning binaries for executables. This enables the Khronos v1.2 conformance test to pass: - % test_compiler execute_after_serialize_reload_library Signed-off-by: Gil Pitney --- src/core/program.cpp | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/core/program.cpp b/src/core/program.cpp index 5d32840..f5e9b64 100644 --- a/src/core/program.cpp +++ b/src/core/program.cpp @@ -105,6 +105,7 @@ void Program::resetDeviceDependent() delete dep.compiler; delete dep.program; delete dep.linked_module; + dep.unlinked_binary.clear(); p_device_dependent.pop_back(); } @@ -123,6 +124,7 @@ void Program::setDevices(cl_uint num_devices, DeviceInterface * const*devices) dep.is_native_binary = false; dep.linked_module = 0; dep.compiler = new Compiler(dep.device); + dep.unlinked_binary.clear(); } } @@ -956,9 +958,21 @@ cl_int Program::info(cl_program_info param_name, case CL_PROGRAM_BINARY_SIZES: for (size_t i=0; i + (p_device_dependent[i]); - binary_sizes.push_back(dep.unlinked_binary.size()); + if (!dep.linked_module) { + binary_sizes.push_back(0); + } + else if (dep.unlinked_binary.empty()) { + llvm::raw_string_ostream ostream(dep.unlinked_binary); + llvm::WriteBitcodeToFile(dep.linked_module, ostream); + ostream.flush(); + binary_sizes.push_back(dep.unlinked_binary.size()); + } + else { + binary_sizes.push_back(dep.unlinked_binary.size()); + } } value = binary_sizes.data(); @@ -977,12 +991,19 @@ cl_int Program::info(cl_program_info param_name, if (param_value && param_value_size >= value_length) for (size_t i=0; i + (p_device_dependent[i]); unsigned char *dest = binaries[i]; if (!dest) continue; + if (dep.unlinked_binary.empty()) { + llvm::raw_string_ostream ostream(dep.unlinked_binary); + llvm::WriteBitcodeToFile(dep.linked_module, ostream); + ostream.flush(); + } + std::memcpy(dest, dep.unlinked_binary.data(), dep.unlinked_binary.size()); } -- cgit v1.2.3