[llvm-dev] single-threaded code-gen and how to make it support multi-thread

pongba via llvm-dev llvm-dev at lists.llvm.org
Wed Apr 3 18:24:25 PDT 2019

Hi llvm-dev,

Our code base has a ancient copy of llvm (ver 3.5.1), and it uses the LLVM
code gen for some domain-specific language.

The previous dev left a global lock around the usage of LLVM code gen
stating that because LLVM code gen can only be accessed single-threaded it
needs to be protected with this global lock.

But now this lock has caused some perf issues as we pretty much lose
concurrency when having to compile a large number of source files.

I've tried to remove the global lock and what I have observed in crashing
stack is something like below:

(I did make sure LLVM_ENABLE_THREADS is defined to be 1, apparently it
didn't seem to help)

The document around this seems vague, I have not found a clear instruction
as to how to solve this, hence this post. Can anyone help with some

Any guidance is appreciated:)

  ntdll.dll!RtlReportCriticalFailure(long StatusCode, void * FailureInfo,
unsigned long BreakIfDbgPresent) Line 201 C
  ntdll.dll!RtlpHeapHandleError(long ErrorLevel) Line 344 C
  ntdll.dll!RtlpHpHeapHandleError(_HEAP_FAILURE_TYPE FailureType, unsigned
__int64 HeapAddress, unsigned __int64 Address) Line 670 C
  ntdll.dll!RtlpLogHeapFailure(_HEAP_FAILURE_TYPE FailureType, void *
HeapAddress, void * Address, void * Param1, void * Param2, void * Param3)
Line 158 C
  ntdll.dll!RtlFreeHeap(void * HeapHandle, unsigned long Flags, void *
BaseAddress) Line 352 C
  ucrtbase.dll!_free_base(void * block) Line 105 C++
  XXXTest.exe!llvm::StringMapImpl::RehashTable(unsigned int BucketNo) Line
238 C++
  XXXTest.exe!llvm::StringMap<llvm::ConstantDataSequential *
*> KV) Line 344 C++
  [Inline Frame] XXXTest.exe!llvm::StringMap<llvm::Value
*,llvm::MallocAllocator>::GetOrCreateValue(llvm::StringRef) Line 371 C++
  [Inline Frame] XXXTest.exe!llvm::StringMap<llvm::Value
*,llvm::MallocAllocator>::GetOrCreateValue(llvm::StringRef) Line 375 C++
  XXXTest.exe!llvm::ValueSymbolTable::createValueName(llvm::StringRef Name,
llvm::Value * V) Line 98 C++
  XXXTest.exe!llvm::Value::setName(const llvm::Twine & NewName) Line 236 C++
>::Insert<llvm::GetElementPtrInst>(llvm::GetElementPtrInst * I, const
llvm::Twine & Name) Line 497 C++
>::CreateConstInBoundsGEP1_32(llvm::Value * Ptr, unsigned int Idx0, const
llvm::Twine & Name) Line 1014 C++
> XXXTest.exe!XXX::LlvmCodeGenerator::Visit(const XXX::FeatureRefExpression
& p_expr) Line 953 C++
  XXXTest.exe!XXX::FeatureRefExpression::Accept(XXX::Visitor & p_visitor)
Line 46 C++
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190403/85d4a7b2/attachment.html>

More information about the llvm-dev mailing list