Skip to content

Commit 06609ea

Browse files
committed
Released writeSpirv from locking, too.
1 parent 2c497db commit 06609ea

File tree

1 file changed

+42
-43
lines changed

1 file changed

+42
-43
lines changed

common_clang.cpp

Lines changed: 42 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -289,51 +289,50 @@ Compile(const char *pszProgramSource, const char **pInputHeaders,
289289
success = clang::ExecuteCompilerInvocation(compiler.get());
290290
} catch (const std::exception &) {
291291
}
292-
{
293-
llvm::sys::SmartScopedLock<true> compileGuard {*compileMutex};
294-
pResult->setIRType(IR_TYPE_COMPILED_OBJECT);
295-
pResult->setIRName(optionsParser.getSourceName());
296-
297-
// Our error handler depends on the Diagnostics object, which we're
298-
// potentially about to delete. Uninstall the handler now so that any
299-
// later errors use the default handling behavior instead.
300-
// (currently commented out since setting the llvm error handling in
301-
// multi-threaded environment is unsupported)
302-
// llvm::remove_fatal_error_handler();
303-
err_ostream.flush();
304-
305-
if (success && optionsParser.hasEmitSPIRV()) {
306-
// Translate LLVM IR to SPIR-V.
307-
llvm::StringRef LLVM_IR(static_cast<const char*>(pResult->GetIR()),
308-
pResult->GetIRSize());
309-
std::unique_ptr<llvm::MemoryBuffer> MB = llvm::MemoryBuffer::getMemBuffer(LLVM_IR, pResult->GetIRName(), false);
310-
llvm::LLVMContext Context;
311-
auto E = llvm::getOwningLazyBitcodeModule(std::move(MB), Context,
312-
/*ShouldLazyLoadMetadata=*/true);
313-
llvm::logAllUnhandledErrors(E.takeError(), err_ostream, "error: ");
314-
std::unique_ptr<llvm::Module> M = std::move(*E);
315-
316-
if (M->materializeAll()) {
317-
if (pBinaryResult) {
318-
*pBinaryResult = nullptr;
319-
}
320-
assert(!"Failed to read just compiled LLVM IR!");
321-
return CL_COMPILE_PROGRAM_FAILURE;
322-
}
323-
pResult->getIRBufferRef().clear();
324-
SmallVectorBuffer StreamBuf(pResult->getIRBufferRef());
325-
std::ostream OS(&StreamBuf);
326-
std::string Err;
327-
SPIRV::TranslatorOpts SPIRVOpts;
328-
SPIRVOpts.enableAllExtensions();
329-
if (!optionsParser.hasOptDisable()) {
330-
SPIRVOpts.setMemToRegEnabled(true);
292+
pResult->setIRType(IR_TYPE_COMPILED_OBJECT);
293+
pResult->setIRName(optionsParser.getSourceName());
294+
295+
// Our error handler depends on the Diagnostics object, which we're
296+
// potentially about to delete. Uninstall the handler now so that any
297+
// later errors use the default handling behavior instead.
298+
// (currently commented out since setting the llvm error handling in
299+
// multi-threaded environment is unsupported)
300+
// llvm::remove_fatal_error_handler();
301+
err_ostream.flush();
302+
303+
if (success && optionsParser.hasEmitSPIRV()) {
304+
// Translate LLVM IR to SPIR-V.
305+
llvm::StringRef LLVM_IR(static_cast<const char*>(pResult->GetIR()),
306+
pResult->GetIRSize());
307+
std::unique_ptr<llvm::MemoryBuffer> MB = llvm::MemoryBuffer::getMemBuffer(LLVM_IR, pResult->GetIRName(), false);
308+
llvm::LLVMContext Context;
309+
auto E = llvm::getOwningLazyBitcodeModule(std::move(MB), Context,
310+
/*ShouldLazyLoadMetadata=*/true);
311+
llvm::logAllUnhandledErrors(E.takeError(), err_ostream, "error: ");
312+
std::unique_ptr<llvm::Module> M = std::move(*E);
313+
314+
if (M->materializeAll()) {
315+
if (pBinaryResult) {
316+
*pBinaryResult = nullptr;
331317
}
332-
success = llvm::writeSpirv(M.get(), SPIRVOpts, OS, Err);
333-
err_ostream << Err.c_str();
334-
err_ostream.flush();
318+
assert(!"Failed to read just compiled LLVM IR!");
319+
return CL_COMPILE_PROGRAM_FAILURE;
335320
}
336-
321+
pResult->getIRBufferRef().clear();
322+
SmallVectorBuffer StreamBuf(pResult->getIRBufferRef());
323+
std::ostream OS(&StreamBuf);
324+
std::string Err;
325+
SPIRV::TranslatorOpts SPIRVOpts;
326+
SPIRVOpts.enableAllExtensions();
327+
if (!optionsParser.hasOptDisable()) {
328+
SPIRVOpts.setMemToRegEnabled(true);
329+
}
330+
success = llvm::writeSpirv(M.get(), SPIRVOpts, OS, Err);
331+
err_ostream << Err.c_str();
332+
err_ostream.flush();
333+
}
334+
{
335+
llvm::sys::SmartScopedLock<true> compileGuard {*compileMutex};
337336
if (pBinaryResult) {
338337
*pBinaryResult = pResult.release();
339338
}

0 commit comments

Comments
 (0)