Building LLDB when LLVM is built with threading disabled

We build LLVM with threads disabled by default (using make&configure).
Recently this started causing the LLDB build to fail. I'm not sure if
this is because of changes to LLDB or the LLVM build system in general
but it brings me to two questions. First, is it now necessary to build
LLVM with threads enabled to build LLDB? And, second, if not, is it
reasonable to link in pthread even when --disable-threads is passed to
./configure, since I don't believe LLDB can be built without threading
support entirely?

Thanks,
Keno

Because LLVM enables threading manually, this is the main reason we didn't use their locking primitives.

I am not sure if we recently started using any of LLVM threading stuff that gets disabled (Zach's changes?) when threading isn't enabled in LLVM, but I don't believe we have enabled threading in LLVM builds.

Can you elaborate on what is making the build fail now after you disable threads?

What errors do you get?

Threading should be enabled by default in LLVM, you have to go out of your way to disable it.

This is copied from a user who sent me his error message, but I saw
the same (the errors can be fixed by linking in -lpthread manually, so
it's probably just a make system issue):

llvm[6]: Linking Release+Asserts Shared Library liblldb.so
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbExpression.a(ClangExpressionParser.o):
In function `lldb_private::ClangExpressionParser::Parse(lldb_private::Stream&)':
ClangExpressionParser.cpp:(.text._ZN12lldb_private21ClangExpressionParser5ParseERNS_6StreamE+0x397):
warning: the use of `mktemp' is dangerous, better use `mkstemp' or
`mkdtemp'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(NativeProcessLinux.o):
In function `lldb_private::NativeProcessLinux::OperationArgs::OperationArgs(lldb_private::NativeProcessLinux*)':
NativeProcessLinux.cpp:(.text._ZN12lldb_private18NativeProcessLinux13OperationArgsC2EPS0_+0x1a):
undefined reference to `sem_init'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(NativeProcessLinux.o):
In function `lldb_private::NativeProcessLinux::OperationArgs::~OperationArgs()':
NativeProcessLinux.cpp:(.text._ZN12lldb_private18NativeProcessLinux13OperationArgsD2Ev+0x9):
undefined reference to `sem_destroy'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(NativeProcessLinux.o):
In function `lldb_private::NativeProcessLinux::ServeOperation(lldb_private::NativeProcessLinux::OperationArgs*)':
NativeProcessLinux.cpp:(.text._ZN12lldb_private18NativeProcessLinux14ServeOperationEPNS0_13OperationArgsE+0xd):
undefined reference to `sem_post'
NativeProcessLinux.cpp:(.text._ZN12lldb_private18NativeProcessLinux14ServeOperationEPNS0_13OperationArgsE+0x24):
undefined reference to `sem_wait'
NativeProcessLinux.cpp:(.text._ZN12lldb_private18NativeProcessLinux14ServeOperationEPNS0_13OperationArgsE+0x6c):
undefined reference to `sem_post'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(NativeProcessLinux.o):
In function `lldb_private::NativeProcessLinux::DoOperation(void*)':
NativeProcessLinux.cpp:(.text._ZN12lldb_private18NativeProcessLinux11DoOperationEPv+0x36):
undefined reference to `sem_post'
NativeProcessLinux.cpp:(.text._ZN12lldb_private18NativeProcessLinux11DoOperationEPv+0x4e):
undefined reference to `sem_wait'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(NativeProcessLinux.o):
In function `lldb_private::NativeProcessLinux::StopMonitor()':
NativeProcessLinux.cpp:(.text._ZN12lldb_private18NativeProcessLinux11StopMonitorEv+0x19):
undefined reference to `sem_destroy'
NativeProcessLinux.cpp:(.text._ZN12lldb_private18NativeProcessLinux11StopMonitorEv+0x26):
undefined reference to `sem_destroy'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(NativeProcessLinux.o):
In function `lldb_private::NativeProcessLinux::LaunchInferior(lldb_private::Module*,
char const**, char const**, char const*, char const*, char const*,
char const*, lldb_private::ProcessLaunchInfo const&,
lldb_private::Error&)':
NativeProcessLinux.cpp:(.text._ZN12lldb_private18NativeProcessLinux14LaunchInferiorEPNS_6ModuleEPPKcS5_S4_S4_S4_S4_RKNS_17ProcessLaunchInfoERNS_5ErrorE+0xd1):
undefined reference to `sem_init'
NativeProcessLinux.cpp:(.text._ZN12lldb_private18NativeProcessLinux14LaunchInferiorEPNS_6ModuleEPPKcS5_S4_S4_S4_S4_RKNS_17ProcessLaunchInfoERNS_5ErrorE+0xe1):
undefined reference to `sem_init'
NativeProcessLinux.cpp:(.text._ZN12lldb_private18NativeProcessLinux14LaunchInferiorEPNS_6ModuleEPPKcS5_S4_S4_S4_S4_RKNS_17ProcessLaunchInfoERNS_5ErrorE+0x116):
undefined reference to `sem_wait'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(NativeProcessLinux.o):
In function `lldb_private::NativeProcessLinux::AttachToInferior(unsigned
long, lldb_private::Error&)':
NativeProcessLinux.cpp:(.text._ZN12lldb_private18NativeProcessLinux16AttachToInferiorEmRNS_5ErrorE+0x1bb):
undefined reference to `sem_init'
NativeProcessLinux.cpp:(.text._ZN12lldb_private18NativeProcessLinux16AttachToInferiorEmRNS_5ErrorE+0x1cc):
undefined reference to `sem_init'
NativeProcessLinux.cpp:(.text._ZN12lldb_private18NativeProcessLinux16AttachToInferiorEmRNS_5ErrorE+0x222):
undefined reference to `sem_wait'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(NativeProcessLinux.o):
In function `lldb_private::NativeProcessLinux::LaunchOpThread(void*)':
NativeProcessLinux.cpp:(.text._ZN12lldb_private18NativeProcessLinux14LaunchOpThreadEPv+0x25):
undefined reference to `sem_post'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(NativeProcessLinux.o):
In function `lldb_private::NativeProcessLinux::AttachOpThread(void*)':
NativeProcessLinux.cpp:(.text._ZN12lldb_private18NativeProcessLinux14AttachOpThreadEPv+0x25):
undefined reference to `sem_post'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(ProcessMonitor.o):
In function `ProcessMonitor::OperationArgs::OperationArgs(ProcessMonitor*)':
ProcessMonitor.cpp:(.text._ZN14ProcessMonitor13OperationArgsC2EPS_+0x1a):
undefined reference to `sem_init'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(ProcessMonitor.o):
In function `ProcessMonitor::OperationArgs::~OperationArgs()':
ProcessMonitor.cpp:(.text._ZN14ProcessMonitor13OperationArgsD2Ev+0x9):
undefined reference to `sem_destroy'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(ProcessMonitor.o):
In function `ProcessMonitor::ServeOperation(ProcessMonitor::OperationArgs*)':
ProcessMonitor.cpp:(.text._ZN14ProcessMonitor14ServeOperationEPNS_13OperationArgsE+0xd):
undefined reference to `sem_post'
ProcessMonitor.cpp:(.text._ZN14ProcessMonitor14ServeOperationEPNS_13OperationArgsE+0x24):
undefined reference to `sem_wait'
ProcessMonitor.cpp:(.text._ZN14ProcessMonitor14ServeOperationEPNS_13OperationArgsE+0x69):
undefined reference to `sem_post'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(ProcessMonitor.o):
In function `ProcessMonitor::DoOperation(Operation*)':
ProcessMonitor.cpp:(.text._ZN14ProcessMonitor11DoOperationEP9Operation+0x2a):
undefined reference to `sem_post'
ProcessMonitor.cpp:(.text._ZN14ProcessMonitor11DoOperationEP9Operation+0x3e):
undefined reference to `sem_wait'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(ProcessMonitor.o):
In function `ProcessMonitor::StopMonitor()':
ProcessMonitor.cpp:(.text._ZN14ProcessMonitor11StopMonitorEv+0x16):
undefined reference to `sem_destroy'
ProcessMonitor.cpp:(.text._ZN14ProcessMonitor11StopMonitorEv+0x20):
undefined reference to `sem_destroy'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(ProcessMonitor.o):
In function `ProcessMonitor::ProcessMonitor(ProcessPOSIX*,
lldb_private::Module*, char const**, char const**, char const*, char
const*, char const*, char const*, lldb_private::ProcessLaunchInfo
const&, lldb_private::Error&)':
ProcessMonitor.cpp:(.text._ZN14ProcessMonitorC2EP12ProcessPOSIXPN12lldb_private6ModuleEPPKcS7_S6_S6_S6_S6_RKNS2_17ProcessLaunchInfoERNS2_5ErrorE+0xd3):
undefined reference to `sem_init'
ProcessMonitor.cpp:(.text._ZN14ProcessMonitorC2EP12ProcessPOSIXPN12lldb_private6ModuleEPPKcS7_S6_S6_S6_S6_RKNS2_17ProcessLaunchInfoERNS2_5ErrorE+0xe0):
undefined reference to `sem_init'
ProcessMonitor.cpp:(.text._ZN14ProcessMonitorC2EP12ProcessPOSIXPN12lldb_private6ModuleEPPKcS7_S6_S6_S6_S6_RKNS2_17ProcessLaunchInfoERNS2_5ErrorE+0x116):
undefined reference to `sem_wait'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(ProcessMonitor.o):
In function `ProcessMonitor::ProcessMonitor(ProcessPOSIX*, unsigned
long, lldb_private::Error&)':
ProcessMonitor.cpp:(.text._ZN14ProcessMonitorC2EP12ProcessPOSIXmRN12lldb_private5ErrorE+0x50):
undefined reference to `sem_init'
ProcessMonitor.cpp:(.text._ZN14ProcessMonitorC2EP12ProcessPOSIXmRN12lldb_private5ErrorE+0x5d):
undefined reference to `sem_init'
ProcessMonitor.cpp:(.text._ZN14ProcessMonitorC2EP12ProcessPOSIXmRN12lldb_private5ErrorE+0xae):
undefined reference to `sem_wait'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(ProcessMonitor.o):
In function `ProcessMonitor::LaunchOpThread(void*)':
ProcessMonitor.cpp:(.text._ZN14ProcessMonitor14LaunchOpThreadEPv+0x25):
undefined reference to `sem_post'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbPluginProcessLinux.a(ProcessMonitor.o):
In function `ProcessMonitor::AttachOpThread(void*)':
ProcessMonitor.cpp:(.text._ZN14ProcessMonitor14AttachOpThreadEPv+0x25):
undefined reference to `sem_post'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbHostCommon.a(Host.o):
In function `MonitorChildProcessThreadFunction(void*)':
Host.cpp:(.text._ZL33MonitorChildProcessThreadFunctionPv+0xf3):
undefined reference to `pthread_testcancel'
Host.cpp:(.text._ZL33MonitorChildProcessThreadFunctionPv+0x10b):
undefined reference to `pthread_testcancel'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbHostCommon.a(Host.o):
In function `lldb_private::Host::ThreadCreate(char const*, void*
(*)(void*), void*, lldb_private::Error*)':
Host.cpp:(.text._ZN12lldb_private4Host12ThreadCreateEPKcPFPvS3_ES3_PNS_5ErrorE+0x63):
undefined reference to `pthread_create'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbHostCommon.a(Host.o):
In function `lldb_private::Host::ThreadCancel(unsigned long,
lldb_private::Error*)':
Host.cpp:(.text._ZN12lldb_private4Host12ThreadCancelEmPNS_5ErrorE+0xa):
undefined reference to `pthread_cancel'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbHostCommon.a(Host.o):
In function `lldb_private::Host::ThreadDetach(unsigned long,
lldb_private::Error*)':
Host.cpp:(.text._ZN12lldb_private4Host12ThreadDetachEmPNS_5ErrorE+0xa):
undefined reference to `pthread_detach'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbHostCommon.a(Host.o):
In function `lldb_private::Host::ThreadJoin(unsigned long, void**,
lldb_private::Error*)':
Host.cpp:(.text._ZN12lldb_private4Host10ThreadJoinEmPPvPNS_5ErrorE+0xa):
undefined reference to `pthread_join'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbHostCommon.a(Host.o):
In function `lldb_private::Host::ThreadLocalStorageCreate(void
(*)(void*))':
Host.cpp:(.text._ZN12lldb_private4Host24ThreadLocalStorageCreateEPFvPvE+0xd):
undefined reference to `pthread_key_create'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbHostCommon.a(Host.o):
In function `lldb_private::Host::ThreadLocalStorageGet(unsigned int)':
Host.cpp:(.text._ZN12lldb_private4Host21ThreadLocalStorageGetEj+0x1):
undefined reference to `pthread_getspecific'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbHostCommon.a(Host.o):
In function `lldb_private::Host::ThreadLocalStorageSet(unsigned int,
void*)':
Host.cpp:(.text._ZN12lldb_private4Host21ThreadLocalStorageSetEjPv+0x1):
undefined reference to `pthread_setspecific'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbHostCommon.a(Mutex.o):
In function `lldb_private::Mutex::Mutex(lldb_private::Mutex::Type)':
Mutex.cpp:(.text._ZN12lldb_private5MutexC2ENS0_4TypeE+0x4c): undefined
reference to `pthread_mutexattr_init'
Mutex.cpp:(.text._ZN12lldb_private5MutexC2ENS0_4TypeE+0x7a): undefined
reference to `pthread_mutexattr_destroy'
Mutex.cpp:(.text._ZN12lldb_private5MutexC2ENS0_4TypeE+0xa9): undefined
reference to `pthread_mutexattr_settype'
Mutex.cpp:(.text._ZN12lldb_private5MutexC2ENS0_4TypeE+0xd6): undefined
reference to `pthread_mutexattr_settype'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbHostCommon.a(Mutex.o):
In function `lldb_private::Mutex::TryLock(char const*)':
Mutex.cpp:(.text._ZN12lldb_private5Mutex7TryLockEPKc+0x1): undefined
reference to `pthread_mutex_trylock'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbHostCommon.a(ProcessRunLock.o):
In function `lldb_private::ProcessRunLock::ProcessRunLock()':
ProcessRunLock.cpp:(.text._ZN12lldb_private14ProcessRunLockC2Ev+0x7):
undefined reference to `pthread_rwlock_init'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbHostCommon.a(ProcessRunLock.o):
In function `lldb_private::ProcessRunLock::~ProcessRunLock()':
ProcessRunLock.cpp:(.text._ZN12lldb_private14ProcessRunLockD2Ev+0x1):
undefined reference to `pthread_rwlock_destroy'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbHostCommon.a(ProcessRunLock.o):
In function `lldb_private::ProcessRunLock::ReadTryLock()':
ProcessRunLock.cpp:(.text._ZN12lldb_private14ProcessRunLock11ReadTryLockEv+0x5):
undefined reference to `pthread_rwlock_rdlock'
ProcessRunLock.cpp:(.text._ZN12lldb_private14ProcessRunLock11ReadTryLockEv+0x24):
undefined reference to `pthread_rwlock_unlock'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbHostCommon.a(ProcessRunLock.o):
In function `lldb_private::ProcessRunLock::ReadUnlock()':
ProcessRunLock.cpp:(.text._ZN12lldb_private14ProcessRunLock10ReadUnlockEv+0x5):
undefined reference to `pthread_rwlock_unlock'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbHostCommon.a(ProcessRunLock.o):
In function `lldb_private::ProcessRunLock::SetRunning()':
ProcessRunLock.cpp:(.text._ZN12lldb_private14ProcessRunLock10SetRunningEv+0x5):
undefined reference to `pthread_rwlock_wrlock'
ProcessRunLock.cpp:(.text._ZN12lldb_private14ProcessRunLock10SetRunningEv+0x11):
undefined reference to `pthread_rwlock_unlock'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbHostCommon.a(ProcessRunLock.o):
In function `lldb_private::ProcessRunLock::TrySetRunning()':
ProcessRunLock.cpp:(.text._ZN12lldb_private14ProcessRunLock13TrySetRunningEv+0xa):
undefined reference to `pthread_rwlock_trywrlock'
ProcessRunLock.cpp:(.text._ZN12lldb_private14ProcessRunLock13TrySetRunningEv+0x20):
undefined reference to `pthread_rwlock_unlock'
/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldbHostCommon.a(ProcessRunLock.o):
In function `lldb_private::ProcessRunLock::SetStopped()':
ProcessRunLock.cpp:(.text._ZN12lldb_private14ProcessRunLock10SetStoppedEv+0x5):
undefined reference to `pthread_rwlock_wrlock'
ProcessRunLock.cpp:(.text._ZN12lldb_private14ProcessRunLock10SetStoppedEv+0x11):
undefined reference to `pthread_rwlock_unlock'
collect2: error: ld returned 1 exit status
make[6]: *** [/mnt/hdd/mlubin/julia-0.4/deps/llvm-svn/build_Release+Asserts/Release+Asserts/lib/liblldb.so]
Error 1

It sounds to me like you simply need to link in libpthread. “LLVM with threading enabled” is a very confusing thing. Compiling LLVM with “threading disabled” DOES NOT mean that you promise your application will be single-threaded. It only means that you agree that a very specific subset of operations will not be thread-safe. If someone is deciding whether to link libpthread based on the value of LLVM_ENABLE_THREADING, that right there is a bug, because the two are independent. LLDB always needs to link libpthread.

That said, it might be interesting just to know why this broke recently. In that case, you can use the “git bisect” command to track down the offending changelist.

I unfortunately don't currently have the time to do a bisect, but I'll
submit a patch soon to simply add -lpthread to the link line.