Skip to content

Commit 6854f63

Browse files
committed
add checks for empty vectors
1 parent 86ef409 commit 6854f63

2 files changed

Lines changed: 94 additions & 51 deletions

File tree

include/CL/opencl.hpp

Lines changed: 79 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -3393,8 +3393,9 @@ class Context
33933393
}
33943394

33953395
object_ = CL_(clCreateContext)(
3396-
properties, (cl_uint) numDevices,
3397-
deviceIDs.data(),
3396+
properties,
3397+
(cl_uint)deviceIDs.size(),
3398+
deviceIDs.empty() ? nullptr : deviceIDs.data(),
33983399
notifyFptr, data, &error);
33993400

34003401
detail::errHandler(error, __CREATE_CONTEXT_ERR);
@@ -6463,10 +6464,11 @@ class Kernel : public detail::Wrapper<cl_kernel>
64636464
/*! \brief setArg overload taking a vector type.
64646465
*/
64656466
template<typename T, class Alloc>
6466-
cl_int setArg(cl_uint index, const cl::vector<T, Alloc> &argPtr)
6467+
cl_int setArg(cl_uint index, const cl::vector<T, Alloc> &arg)
64676468
{
64686469
return detail::errHandler(
6469-
CL_(clSetKernelArgSVMPointer)(object_, index, argPtr.data()),
6470+
CL_(clSetKernelArgSVMPointer)(object_, index,
6471+
arg.empty() ? nullptr : arg.data()),
64706472
__SET_KERNEL_ARGS_ERR);
64716473
}
64726474

@@ -6515,8 +6517,8 @@ class Kernel : public detail::Wrapper<cl_kernel>
65156517
CL_(clSetKernelExecInfo)(
65166518
object_,
65176519
CL_KERNEL_EXEC_INFO_SVM_PTRS,
6518-
sizeof(void*)*pointerList.size(),
6519-
pointerList.data()));
6520+
sizeof(void*) * pointerList.size(),
6521+
pointerList.empty() ? nullptr : pointerList.data()));
65206522
}
65216523

65226524
/*!
@@ -6530,8 +6532,8 @@ class Kernel : public detail::Wrapper<cl_kernel>
65306532
CL_(clSetKernelExecInfo)(
65316533
object_,
65326534
CL_KERNEL_EXEC_INFO_SVM_PTRS,
6533-
sizeof(void*)*pointerList.size(),
6534-
pointerList.data()));
6535+
sizeof(void*) * pointerList.size(),
6536+
pointerList.empty() ? nullptr : pointerList.data()));
65356537
}
65366538

65376539
/*! \brief Enable fine-grained system SVM.
@@ -6597,7 +6599,7 @@ class Kernel : public detail::Wrapper<cl_kernel>
65976599
CL_(clSetKernelExecInfo)(
65986600
object_,
65996601
CL_KERNEL_EXEC_INFO_SVM_PTRS,
6600-
sizeof(void*)*(1 + sizeof...(Ts)),
6602+
sizeof(void*) * (1 + sizeof...(Ts)),
66016603
pointerList.data()));
66026604
}
66036605

@@ -6753,7 +6755,10 @@ class Program : public detail::Wrapper<cl_program>
67536755
}
67546756

67556757
object_ = CL_(clCreateProgramWithSource)(
6756-
context(), (cl_uint)n, strings.data(), lengths.data(), &error);
6758+
context(), (cl_uint)n,
6759+
strings.empty() ? nullptr : strings.data(),
6760+
lengths.empty() ? nullptr : lengths.data(),
6761+
&error);
67576762

67586763
detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
67596764
if (err != nullptr) {
@@ -6788,7 +6793,10 @@ class Program : public detail::Wrapper<cl_program>
67886793
}
67896794

67906795
object_ = CL_(clCreateProgramWithSource)(
6791-
context(), (cl_uint)n, strings.data(), lengths.data(), &error);
6796+
context(), (cl_uint)n,
6797+
strings.empty() ? nullptr : strings.data(),
6798+
lengths.empty() ? nullptr : lengths.data(),
6799+
&error);
67926800

67936801
detail::errHandler(error, __CREATE_PROGRAM_WITH_SOURCE_ERR);
67946802
if (err != nullptr) {
@@ -6969,11 +6977,15 @@ class Program : public detail::Wrapper<cl_program>
69696977
}
69706978

69716979
object_ = CL_(clCreateProgramWithBinary)(
6972-
context(), (cl_uint) devices.size(),
6973-
deviceIDs.data(),
6974-
lengths.data(), images.data(), (binaryStatus != nullptr && numDevices > 0)
6980+
context(),
6981+
(cl_uint)deviceIDs.size(),
6982+
deviceIDs.empty() ? nullptr : deviceIDs.data(),
6983+
lengths.empty() ? nullptr : lengths.data(),
6984+
images.empty() ? nullptr : images.data(),
6985+
(binaryStatus != nullptr && numDevices > 0)
69756986
? &binaryStatus->front()
6976-
: nullptr, &error);
6987+
: nullptr,
6988+
&error);
69776989

69786990
detail::errHandler(error, __CREATE_PROGRAM_WITH_BINARY_ERR);
69796991
if (err != nullptr) {
@@ -6995,7 +7007,6 @@ class Program : public detail::Wrapper<cl_program>
69957007
{
69967008
cl_int error;
69977009

6998-
69997010
size_type numDevices = devices.size();
70007011
vector<cl_device_id> deviceIDs(numDevices);
70017012
for( size_type deviceIndex = 0; deviceIndex < numDevices; ++deviceIndex ) {
@@ -7004,8 +7015,8 @@ class Program : public detail::Wrapper<cl_program>
70047015

70057016
object_ = CL_(clCreateProgramWithBuiltInKernels)(
70067017
context(),
7007-
(cl_uint) devices.size(),
7008-
deviceIDs.data(),
7018+
(cl_uint)deviceIDs.size(),
7019+
deviceIDs.empty() ? nullptr : deviceIDs.data(),
70097020
kernelNames.c_str(),
70107021
&error);
70117022

@@ -7058,9 +7069,8 @@ class Program : public detail::Wrapper<cl_program>
70587069

70597070
cl_int buildError = CL_(clBuildProgram)(
70607071
object_,
7061-
(cl_uint)
7062-
devices.size(),
7063-
deviceIDs.data(),
7072+
(cl_uint)deviceIDs.size(),
7073+
deviceIDs.empty() ? nullptr : deviceIDs.data(),
70647074
options,
70657075
notifyFptr,
70667076
data);
@@ -7168,18 +7178,20 @@ class Program : public detail::Wrapper<cl_program>
71687178
{
71697179
static_assert(sizeof(cl::Program) == sizeof(cl_program),
71707180
"Size of cl::Program must be equal to size of cl_program");
7181+
71717182
vector<const char*> headerIncludeNamesCStr;
71727183
for(const string& name: headerIncludeNames) {
71737184
headerIncludeNamesCStr.push_back(name.c_str());
71747185
}
7186+
71757187
cl_int error = CL_(clCompileProgram)(
71767188
object_,
71777189
0,
71787190
nullptr,
71797191
options,
71807192
static_cast<cl_uint>(inputHeaders.size()),
7181-
reinterpret_cast<const cl_program*>(inputHeaders.data()),
7182-
reinterpret_cast<const char**>(headerIncludeNamesCStr.data()),
7193+
reinterpret_cast<const cl_program*>(inputHeaders.empty() ? nullptr : inputHeaders.data()),
7194+
reinterpret_cast<const char**>(headerIncludeNamesCStr.empty() ? nullptr : headerIncludeNamesCStr.data()),
71837195
notifyFptr,
71847196
data);
71857197
return detail::buildErrHandler(error, __COMPILE_PROGRAM_ERR, getBuildInfo<CL_PROGRAM_BUILD_LOG>());
@@ -7198,30 +7210,33 @@ class Program : public detail::Wrapper<cl_program>
71987210

71997211
cl_int compile(
72007212
const char* options,
7201-
const vector<Device>& deviceList,
7213+
const vector<Device>& devices,
72027214
const vector<Program>& inputHeaders = vector<Program>(),
72037215
const vector<string>& headerIncludeNames = vector<string>(),
72047216
void (CL_CALLBACK * notifyFptr)(cl_program, void *) = nullptr,
72057217
void* data = nullptr) const
72067218
{
72077219
static_assert(sizeof(cl::Program) == sizeof(cl_program),
72087220
"Size of cl::Program must be equal to size of cl_program");
7221+
7222+
vector<cl_device_id> deviceIDs;
7223+
for(const Device& device: devices) {
7224+
deviceIDs.push_back(device());
7225+
}
7226+
72097227
vector<const char*> headerIncludeNamesCStr;
72107228
for(const string& name: headerIncludeNames) {
72117229
headerIncludeNamesCStr.push_back(name.c_str());
72127230
}
7213-
vector<cl_device_id> deviceIDList;
7214-
for(const Device& device: deviceList) {
7215-
deviceIDList.push_back(device());
7216-
}
7231+
72177232
cl_int error = CL_(clCompileProgram)(
72187233
object_,
7219-
static_cast<cl_uint>(deviceList.size()),
7220-
reinterpret_cast<const cl_device_id*>(deviceIDList.data()),
7234+
static_cast<cl_uint>(deviceIDs.size()),
7235+
reinterpret_cast<const cl_device_id*>(deviceIDs.empty() ? nullptr : deviceIDs.data()),
72217236
options,
72227237
static_cast<cl_uint>(inputHeaders.size()),
7223-
reinterpret_cast<const cl_program*>(inputHeaders.data()),
7224-
reinterpret_cast<const char**>(headerIncludeNamesCStr.data()),
7238+
reinterpret_cast<const cl_program*>(inputHeaders.empty() ? nullptr : inputHeaders.data()),
7239+
reinterpret_cast<const char**>(headerIncludeNamesCStr.empty() ? nullptr : headerIncludeNamesCStr.data()),
72257240
notifyFptr,
72267241
data);
72277242
return detail::buildErrHandler(error, __COMPILE_PROGRAM_ERR, getBuildInfo<CL_PROGRAM_BUILD_LOG>());
@@ -7325,9 +7340,11 @@ class Program : public detail::Wrapper<cl_program>
73257340
}
73267341

73277342
vector<cl_kernel> value(numKernels);
7328-
73297343
err = CL_(clCreateKernelsInProgram)(
7330-
object_, numKernels, value.data(), nullptr);
7344+
object_,
7345+
numKernels,
7346+
value.empty() ? nullptr : value.data(),
7347+
nullptr);
73317348
if (err != CL_SUCCESS) {
73327349
return detail::errHandler(err, __CREATE_KERNELS_IN_PROGRAM_ERR);
73337350
}
@@ -7478,7 +7495,7 @@ inline Program linkProgram(
74787495
nullptr,
74797496
options,
74807497
static_cast<cl_uint>(inputPrograms.size()),
7481-
reinterpret_cast<const cl_program *>(inputPrograms.data()),
7498+
reinterpret_cast<const cl_program *>(inputPrograms.empty() ? nullptr : inputPrograms.data()),
74827499
notifyFptr,
74837500
data,
74847501
&error_local);
@@ -8921,12 +8938,13 @@ class CommandQueue : public detail::Wrapper<cl_command_queue>
89218938
return detail::errHandler(CL_INVALID_VALUE,__ENQUEUE_COPY_SVM_ERR);
89228939
}
89238940
cl_int err = detail::errHandler(CL_(clEnqueueSVMMemcpy)(
8924-
object_, blocking, static_cast<void *>(dst_container.data()),
8925-
static_cast<const void *>(src_container.data()),
8941+
object_, blocking,
8942+
dst_container.empty() ? nullptr : dst_container.data(),
8943+
src_container.empty() ? nullptr : src_container.data(),
89268944
dst_container.size() * sizeof(T),
89278945
(events != nullptr) ? (cl_uint) events->size() : 0,
89288946
(events != nullptr && events->size() > 0) ? (const cl_event *) &events->front() : nullptr,
8929-
(event != NULL) ? &tmp : nullptr), __ENQUEUE_COPY_SVM_ERR);
8947+
(event != nullptr) ? &tmp : nullptr), __ENQUEUE_COPY_SVM_ERR);
89308948

89318949
if (event != nullptr && err == CL_SUCCESS)
89328950
*event = tmp;
@@ -8997,8 +9015,11 @@ class CommandQueue : public detail::Wrapper<cl_command_queue>
89979015
{
89989016
cl_event tmp;
89999017
cl_int err = detail::errHandler(CL_(clEnqueueSVMMemFill)(
9000-
object_, static_cast<void *>(container.data()), static_cast<void *>(&pattern),
9001-
sizeof(PatternType), container.size() * sizeof(T),
9018+
object_,
9019+
container.empty() ? nullptr : container.data(),
9020+
&pattern,
9021+
sizeof(PatternType),
9022+
container.size() * sizeof(T),
90029023
(events != nullptr) ? (cl_uint) events->size() : 0,
90039024
(events != nullptr && events->size() > 0) ? (const cl_event *) &events->front() : nullptr,
90049025
(event != nullptr) ? &tmp : NULL), __ENQUEUE_FILL_SVM_ERR);
@@ -9078,7 +9099,9 @@ class CommandQueue : public detail::Wrapper<cl_command_queue>
90789099
{
90799100
cl_event tmp;
90809101
cl_int err = detail::errHandler(CL_(clEnqueueSVMMap)(
9081-
object_, blocking, flags, static_cast<void*>(container.data()), container.size()*sizeof(T),
9102+
object_, blocking, flags,
9103+
container.empty() ? nullptr : container.data(),
9104+
container.size() * sizeof(T),
90829105
(events != nullptr) ? (cl_uint)events->size() : 0,
90839106
(events != nullptr && events->size() > 0) ? (const cl_event*)&events->front() : nullptr,
90849107
(event != nullptr) ? &tmp : nullptr),
@@ -9177,7 +9200,8 @@ class CommandQueue : public detail::Wrapper<cl_command_queue>
91779200
cl_event tmp;
91789201
cl_int err = detail::errHandler(
91799202
CL_(clEnqueueSVMUnmap)(
9180-
object_, static_cast<void*>(container.data()),
9203+
object_,
9204+
container.empty() ? nullptr : container.data(),
91819205
(events != nullptr) ? (cl_uint)events->size() : 0,
91829206
(events != nullptr && events->size() > 0) ? (const cl_event*)&events->front() : nullptr,
91839207
(event != nullptr) ? &tmp : nullptr),
@@ -9274,7 +9298,7 @@ class CommandQueue : public detail::Wrapper<cl_command_queue>
92749298
CL_(clEnqueueMigrateMemObjects)(
92759299
object_,
92769300
(cl_uint)memObjects.size(),
9277-
localMemObjects.data(),
9301+
localMemObjects.empty() ? nullptr : localMemObjects.data(),
92789302
flags,
92799303
(events != nullptr) ? (cl_uint) events->size() : 0,
92809304
(events != nullptr && events->size() > 0) ? (const cl_event*) &events->front() : nullptr,
@@ -9306,8 +9330,9 @@ class CommandQueue : public detail::Wrapper<cl_command_queue>
93069330
cl_event tmp;
93079331
cl_int err = detail::errHandler(CL_(clEnqueueSVMMigrateMem)(
93089332
object_,
9309-
svmRawPointers.size(), static_cast<void**>(svmRawPointers.data()),
9310-
sizes.data(), // array of sizes not passed
9333+
svmRawPointers.size(),
9334+
svmRawPointers.empty() ? nullptr : svmRawPointers.data(),
9335+
sizes.empty() ? nullptr : sizes.data(),
93119336
flags,
93129337
(events != nullptr) ? (cl_uint)events->size() : 0,
93139338
(events != nullptr && events->size() > 0) ? (const cl_event*)&events->front() : nullptr,
@@ -9676,7 +9701,7 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)(
96769701
err = pfn_clEnqueueAcquireExternalMemObjectsKHR(
96779702
object_,
96789703
static_cast<cl_uint>(mem_objects.size()),
9679-
(mem_objects.size() > 0) ? reinterpret_cast<const cl_mem *>(mem_objects.data()) : nullptr,
9704+
reinterpret_cast<const cl_mem *>(mem_objects.empty() ? nullptr : mem_objects.data()),
96809705
(events_wait != nullptr) ? static_cast<cl_uint>(events_wait->size()) : 0,
96819706
(events_wait != nullptr && events_wait->size() > 0) ? reinterpret_cast<const cl_event*>(events_wait->data()) : nullptr,
96829707
&tmp);
@@ -9705,7 +9730,7 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *PFN_clEnqueueReleaseD3D10ObjectsKHR)(
97059730
err = pfn_clEnqueueReleaseExternalMemObjectsKHR(
97069731
object_,
97079732
static_cast<cl_uint>(mem_objects.size()),
9708-
(mem_objects.size() > 0) ? reinterpret_cast<const cl_mem *>(mem_objects.data()) : nullptr,
9733+
reinterpret_cast<const cl_mem *>(mem_objects.empty() ? nullptr : mem_objects.data()),
97099734
(events_wait != nullptr) ? static_cast<cl_uint>(events_wait->size()) : 0,
97109735
(events_wait != nullptr && events_wait->size() > 0) ? reinterpret_cast<const cl_event*>(events_wait->data()) : nullptr,
97119736
&tmp);
@@ -11337,7 +11362,7 @@ class Semaphore : public detail::Wrapper<cl_semaphore_khr>
1133711362
{
1133811363
object_ = pfn_clCreateSemaphoreWithPropertiesKHR(
1133911364
context(),
11340-
sema_props.data(),
11365+
sema_props.empty() ? nullptr : sema_props.data(),
1134111366
&error);
1134211367
}
1134311368

@@ -11931,7 +11956,7 @@ class CommandBufferKhr : public detail::Wrapper<cl_command_buffer_khr>
1193111956
nullptr, // Properties
1193211957
#endif
1193311958
image(),
11934-
static_cast<void*>(&fillColor),
11959+
&fillColor,
1193511960
origin.data(),
1193611961
region.data(),
1193711962
(sync_points_vec != nullptr) ? (cl_uint) sync_points_vec->size() : 0,
@@ -12010,8 +12035,11 @@ class CommandBufferKhr : public detail::Wrapper<cl_command_buffer_khr>
1201012035
__UPDATE_MUTABLE_COMMANDS_KHR_ERR);
1201112036
}
1201212037
return detail::errHandler(
12013-
pfn_clUpdateMutableCommandsKHR(object_, static_cast<cl_uint>(configs.size()),
12014-
config_types.data(), configs.data()),
12038+
pfn_clUpdateMutableCommandsKHR(
12039+
object_,
12040+
static_cast<cl_uint>(configs.size()),
12041+
config_types.empty() ? nullptr : config_types.data(),
12042+
configs.empty() ? nullptr : configs.data()),
1201512043
__UPDATE_MUTABLE_COMMANDS_KHR_ERR);
1201612044
}
1201712045
#endif /* CL_KHR_COMMAND_BUFFER_MUTABLE_DISPATCH_EXTENSION_VERSION */

tests/test_openclhpp.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2026,6 +2026,21 @@ void testKernelSetSVMPointers(void)
20262026
TEST_ASSERT_EQUAL_HEX(expected, ret);
20272027
#endif
20282028
}
2029+
2030+
void testKernelSetSVMPointersEmpty(void)
2031+
{
2032+
#if CL_HPP_TARGET_OPENCL_VERSION >= 200
2033+
clSetKernelExecInfo_ExpectAndReturn(make_kernel(0),
2034+
CL_KERNEL_EXEC_INFO_SVM_PTRS,
2035+
0, nullptr, CL_SUCCESS);
2036+
2037+
cl::vector<void *> vec;
2038+
cl_int ret = kernelPool[0].setSVMPointers(vec);
2039+
2040+
TEST_ASSERT_EQUAL_HEX(CL_SUCCESS, ret);
2041+
#endif
2042+
}
2043+
20292044
cl_int clSetKernelExecInfo_EnableFineGrainedSystemSVM(cl_kernel kernel,
20302045
cl_kernel_exec_info param_name,
20312046
size_t param_value_size,

0 commit comments

Comments
 (0)