Skip to content

Commit

Permalink
[SYCL] Fix uncaught exceptions and null dereference (intel#15173)
Browse files Browse the repository at this point in the history
Added proper handling of exceptions propagated to the outermost level.

---------

Co-authored-by: Dmitry Vodopyanov <[email protected]>
  • Loading branch information
2 people authored and AlexeySachkov committed Nov 26, 2024
1 parent d7b4230 commit acd8dbd
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 16 deletions.
25 changes: 17 additions & 8 deletions sycl/source/detail/device_image_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,14 @@ class device_image_impl {

// Otherwise, if the device candidate is a sub-device it is also valid if
// its parent is valid.
if (!getSyclObjImpl(DeviceCand)->isRootDevice())
return has_kernel(KernelIDCand,
DeviceCand.get_info<info::device::parent_device>());

if (!getSyclObjImpl(DeviceCand)->isRootDevice()) {
try {
return has_kernel(KernelIDCand,
DeviceCand.get_info<info::device::parent_device>());
} catch (std::exception &e) {
__SYCL_REPORT_EXCEPTION_TO_STREAM("exception in has_kernel", e);
}
}
return false;
}

Expand Down Expand Up @@ -270,10 +274,15 @@ class device_image_impl {
// TODO consider changing the lifetime of device_image_impl instead
ur_buffer_properties_t Properties = {UR_STRUCTURE_TYPE_BUFFER_PROPERTIES,
nullptr, MSpecConstsBlob.data()};
memBufferCreateHelper(
Plugin, detail::getSyclObjImpl(MContext)->getHandleRef(),
UR_MEM_FLAG_READ_WRITE | UR_MEM_FLAG_ALLOC_COPY_HOST_POINTER,
MSpecConstsBlob.size(), &MSpecConstsBuffer, &Properties);
try {
memBufferCreateHelper(
Plugin, detail::getSyclObjImpl(MContext)->getHandleRef(),
UR_MEM_FLAG_READ_WRITE | UR_MEM_FLAG_ALLOC_COPY_HOST_POINTER,
MSpecConstsBlob.size(), &MSpecConstsBuffer, &Properties);
} catch (std::exception &e) {
__SYCL_REPORT_EXCEPTION_TO_STREAM(
"exception in get_spec_const_buffer_ref", e);
}
}
return MSpecConstsBuffer;
}
Expand Down
13 changes: 10 additions & 3 deletions sycl/source/detail/global_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -355,8 +355,14 @@ void shutdown_late() {
extern "C" __SYCL_EXPORT BOOL WINAPI DllMain(HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID lpReserved) {
bool PrintUrTrace =
sycl::detail::ur::trace(sycl::detail::ur::TraceLevel::TRACE_CALLS);
bool PrintUrTrace = false;
try {
PrintUrTrace =
sycl::detail::ur::trace(sycl::detail::ur::TraceLevel::TRACE_CALLS);
} catch (std::exception &e) {
__SYCL_REPORT_EXCEPTION_TO_STREAM("exception in DllMain", e);
return FALSE;
}

// Perform actions based on the reason for calling.
switch (fdwReason) {
Expand All @@ -367,7 +373,8 @@ extern "C" __SYCL_EXPORT BOOL WINAPI DllMain(HINSTANCE hinstDLL,
#ifdef XPTI_ENABLE_INSTRUMENTATION
if (xptiTraceEnabled())
return TRUE; // When doing xpti tracing, we can't safely call shutdown.
// TODO: figure out what XPTI is doing that prevents release.
// TODO: figure out what XPTI is doing that prevents
// release.
#endif

shutdown_win();
Expand Down
7 changes: 4 additions & 3 deletions sycl/source/detail/graph_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1623,16 +1623,17 @@ void modifiable_command_graph::end_recording() {

void modifiable_command_graph::end_recording(queue &RecordingQueue) {
auto QueueImpl = sycl::detail::getSyclObjImpl(RecordingQueue);
if (QueueImpl && QueueImpl->getCommandGraph() == impl) {
if (!QueueImpl)
return;
if (QueueImpl->getCommandGraph() == impl) {
QueueImpl->setCommandGraph(nullptr);
graph_impl::WriteLock Lock(impl->MMutex);
impl->removeQueue(QueueImpl);
}
if (QueueImpl->getCommandGraph() != nullptr) {
if (QueueImpl->getCommandGraph() != nullptr)
throw sycl::exception(sycl::make_error_code(errc::invalid),
"end_recording called for a queue which is recording "
"to a different graph.");
}
}

void modifiable_command_graph::end_recording(
Expand Down
7 changes: 6 additions & 1 deletion sycl/source/detail/image_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,12 @@ class image_impl final : public SYCLMemObjT {

// Returns the total number of elements in the image
size_t get_count() const { return size(); }
size_t size() const noexcept { return MRange.size(); }
size_t size() const noexcept try {
return MRange.size();
} catch (std::exception &e) {
__SYCL_REPORT_EXCEPTION_TO_STREAM("exception in size", e);
std::abort();
}

void *allocateMem(ContextImplPtr Context, bool InitFromUserData,
void *HostPtr, ur_event_handle_t &OutEventToWait) override;
Expand Down
7 changes: 6 additions & 1 deletion sycl/source/event.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,12 @@ event::get_profiling_info() const {

#undef __SYCL_PARAM_TRAITS_SPEC

backend event::get_backend() const noexcept { return getImplBackend(impl); }
backend event::get_backend() const noexcept try {
return getImplBackend(impl);
} catch (std::exception &e) {
__SYCL_REPORT_EXCEPTION_TO_STREAM("exception in get_backend", e);
std::abort();
}

ur_native_handle_t event::getNative() const { return impl->getNative(); }

Expand Down

0 comments on commit acd8dbd

Please sign in to comment.