@@ -113,8 +113,8 @@ setupIndirectCallTable(DeviceTy &Device, __tgt_device_image *Image,
113113 for (const auto &Entry : Entries) {
114114 if (Entry.Kind != llvm::object::OffloadKind::OFK_OpenMP ||
115115 Entry.Size == 0 ||
116- !(Entry.Flags &
117- (OMP_DECLARE_TARGET_INDIRECT | OMP_DECLARE_TARGET_INDIRECT_VTABLE)))
116+ ( !(Entry.Flags & OMP_DECLARE_TARGET_INDIRECT) & &
117+ !(Entry. Flags & OMP_DECLARE_TARGET_INDIRECT_VTABLE)))
118118 continue ;
119119
120120 size_t PtrSize = sizeof (void *);
@@ -133,27 +133,37 @@ setupIndirectCallTable(DeviceTy &Device, __tgt_device_image *Image,
133133 if (Device.retrieveData (&res, Vtable, PtrSize, AsyncInfo))
134134 return error::createOffloadError (error::ErrorCode::INVALID_BINARY,
135135 " failed to load %s" , Entry.SymbolName );
136+ if (Device.synchronize (AsyncInfo))
137+ return error::createOffloadError (
138+ error::ErrorCode::INVALID_BINARY,
139+ " failed to synchronize after retrieving %s" , Entry.SymbolName );
136140 // Calculate and emplace entire Vtable from first Vtable byte
137141 for (uint64_t i = 0 ; i < Entry.Size / PtrSize; ++i) {
138142 auto &[HstPtr, DevPtr] = IndirectCallTable.emplace_back ();
139- HstPtr = (void *)((uintptr_t )Entry.Address + i * PtrSize);
140- DevPtr = (void *)((uintptr_t )res + i * PtrSize);
143+ HstPtr = reinterpret_cast <void *>(
144+ reinterpret_cast <uintptr_t >(Entry.Address ) + i * PtrSize);
145+ DevPtr = reinterpret_cast <void *>(reinterpret_cast <uintptr_t >(res) +
146+ i * PtrSize);
141147 }
142148 } else {
143149 // Indirect function case: Entry.Size should equal PtrSize since we're
144150 // dealing with a single function pointer (not a VTable)
145151 assert (Entry.Size == PtrSize && " Global not a function pointer?" );
146152 auto &[HstPtr, DevPtr] = IndirectCallTable.emplace_back ();
147153 void *Ptr;
148- if (Device.RTL ->get_global (Binary, Entry.Size , Entry.SymbolName , &Ptr))
149- return error::createOffloadError (error::ErrorCode::INVALID_BINARY,
150- " failed to load %s" , Entry.SymbolName );
151-
152- HstPtr = Entry.Address ;
153- if (Device.retrieveData (&DevPtr, Ptr, Entry.Size , AsyncInfo))
154- return error::createOffloadError (error::ErrorCode::INVALID_BINARY,
155- " failed to load %s" , Entry.SymbolName );
154+ if (Device.RTL ->get_global (Binary, Entry.Size , Entry.SymbolName , &Ptr))
155+ return error::createOffloadError (error::ErrorCode::INVALID_BINARY,
156+ " failed to load %s" , Entry.SymbolName );
157+
158+ HstPtr = Entry.Address ;
159+ if (Device.retrieveData (&DevPtr, Ptr, Entry.Size , AsyncInfo))
160+ return error::createOffloadError (error::ErrorCode::INVALID_BINARY,
161+ " failed to load %s" , Entry.SymbolName );
156162 }
163+ if (Device.synchronize (AsyncInfo))
164+ return error::createOffloadError (
165+ error::ErrorCode::INVALID_BINARY,
166+ " failed to synchronize after retrieving %s" , Entry.SymbolName );
157167 }
158168
159169 // If we do not have any indirect globals we exit early.
0 commit comments