[llvm] r211287 - Remove support for LLVM runtime multi-threading.
Yaron Keren
yaron.keren at gmail.com
Fri Jun 20 10:04:41 PDT 2014
No, I had not verified this yet, just hoped it may ring a bell.
I'll try revisions.
Yaron
2014-06-20 19:54 GMT+03:00 Zachary Turner <zturner at google.com>:
> I am trying to reproduce locally as well.
On Fri, Jun 20, 2014 at 9:52 AM, Zachary Turner <zturner at google.com> wrote:
> Did you verify that it's this revision specifically that caused it? Can
> you just checkout the revision immediately before this and confirm it
> works, and then checkout this revision and confirm it doesn't work? I
> suspect it's actually a different revision that caused it, since these
> functions were actually just no-ops at this point.
>
>
> On Fri, Jun 20, 2014 at 9:46 AM, Yaron Keren <yaron.keren at gmail.com>
> wrote:
>
>> Running ARCMT clang tests with these two tools stopped working for me
>> after updating to trunk today, on WIndows 64 bit Visual C++ 2013 building
>> 32 bit target. They just hang and never finish. I thought initially that's
>> related to them running in thread but the same happens even if the thread
>> is disabled in main() and cindextest_main() is called directly.
>> llvm tests complete OK as are other clang tests that do not use c-arcmt-test
>> and and c-index-test.
>>
>> It this possibly related to mutex changes?
>> Maybe LLVM must be built with threads to support the ARCMT tests?
>>
>> Yaron
>>
>>
>>
>>
>> 2014-06-20 19:40 GMT+03:00 Zachary Turner <zturner at google.com>:
>>
>> It should continue to work. The only thing llvm_start_multithreaded()
>>> and llvm_stop_multithreaded() did before, despite their names, was to
>>> allocate a mutex on the heap that served as a global lock. In other words,
>>> it didn't really do much of anything useful. You could still create
>>> threads even if you compiled with LLVM_ENABLE_THREADS=0. Some stuff might
>>> not have been safe for concurrent access, but a) that's not an issue with
>>> these tests anyway, since they create the thread and then join, so there is
>>> no concurrency, and b) the areas that were conditionally protected by this
>>> global lock before are now always protected.
>>>
>>> In fact, this makes me wonder if we even need the compile time flag.
>>>
>>
>>
>> On Fri, Jun 20, 2014 at 9:34 AM, Yaron Keren <yaron.keren at gmail.com>
>> wrote:
>>
>>> Hi,
>>>
>>> Two of the clang test tools, c-arcmt-test and and c-index-test always
>>> run the test through one thread only:
>>>
>>> /* We intentionally run in a separate thread to ensure we at least
>>> minimal
>>> * testing of a multithreaded environment (for example, having a reduced
>>> stack
>>> * size). */
>>>
>>> If LLVM/clang were built without thread support, can these tools
>>> continue the same?
>>>
>>> Yaron
>>>
>>>
>>>
>>>
>>> 2014-06-19 21:18 GMT+03:00 Zachary Turner <zturner at google.com>:
>>>
>>>> Author: zturner
>>>> Date: Thu Jun 19 13:18:23 2014
>>>> New Revision: 211287
>>>>
>>>> URL: http://llvm.org/viewvc/llvm-project?rev=211287&view=rev
>>>> Log:
>>>> Remove support for LLVM runtime multi-threading.
>>>>
>>>> After a number of previous small iterations, the functions
>>>> llvm_start_multithreaded() and llvm_stop_multithreaded() have
>>>> been reduced essentially to no-ops. This change removes them
>>>> entirely.
>>>>
>>>> Reviewed by: rnk, dblaikie
>>>>
>>>> Differential Revision: http://reviews.llvm.org/D4216
>>>>
>>>> Modified:
>>>> llvm/trunk/docs/ProgrammersManual.rst
>>>> llvm/trunk/include/llvm-c/Core.h
>>>> llvm/trunk/include/llvm/Support/ManagedStatic.h
>>>> llvm/trunk/include/llvm/Support/Threading.h
>>>> llvm/trunk/lib/IR/Core.cpp
>>>> llvm/trunk/lib/Support/Threading.cpp
>>>> llvm/trunk/unittests/Support/ManagedStatic.cpp
>>>>
>>>> Modified: llvm/trunk/docs/ProgrammersManual.rst
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/ProgrammersManual.rst?rev=211287&r1=211286&r2=211287&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/docs/ProgrammersManual.rst (original)
>>>> +++ llvm/trunk/docs/ProgrammersManual.rst Thu Jun 19 13:18:23 2014
>>>> @@ -2170,46 +2170,13 @@ compiler, consider compiling LLVM and LL
>>>> using the resultant compiler to build a copy of LLVM with
>>>> multithreading
>>>> support.
>>>>
>>>> -.. _startmultithreaded:
>>>> -
>>>> -Entering and Exiting Multithreaded Mode
>>>> ----------------------------------------
>>>> -
>>>> -In order to properly protect its internal data structures while
>>>> avoiding
>>>> -excessive locking overhead in the single-threaded case, the LLVM must
>>>> intialize
>>>> -certain data structures necessary to provide guards around its
>>>> internals. To do
>>>> -so, the client program must invoke ``llvm_start_multithreaded()``
>>>> before making
>>>> -any concurrent LLVM API calls. To subsequently tear down these
>>>> structures, use
>>>> -the ``llvm_stop_multithreaded()`` call. You can also use the
>>>> -``llvm_is_multithreaded()`` call to check the status of multithreaded
>>>> mode.
>>>> -
>>>> -Note that both of these calls must be made *in isolation*. That is to
>>>> say that
>>>> -no other LLVM API calls may be executing at any time during the
>>>> execution of
>>>> -``llvm_start_multithreaded()`` or ``llvm_stop_multithreaded``. It is
>>>> the
>>>> -client's responsibility to enforce this isolation.
>>>> -
>>>> -The return value of ``llvm_start_multithreaded()`` indicates the
>>>> success or
>>>> -failure of the initialization. Failure typically indicates that your
>>>> copy of
>>>> -LLVM was built without multithreading support, typically because GCC
>>>> atomic
>>>> -intrinsics were not found in your system compiler. In this case, the
>>>> LLVM API
>>>> -will not be safe for concurrent calls. However, it *will* be safe for
>>>> hosting
>>>> -threaded applications in the JIT, though :ref:`care must be taken
>>>> -<jitthreading>` to ensure that side exits and the like do not
>>>> accidentally
>>>> -result in concurrent LLVM API calls.
>>>> -
>>>> .. _shutdown:
>>>>
>>>> Ending Execution with ``llvm_shutdown()``
>>>> -----------------------------------------
>>>>
>>>> When you are done using the LLVM APIs, you should call
>>>> ``llvm_shutdown()`` to
>>>> -deallocate memory used for internal structures. This will also invoke
>>>> -``llvm_stop_multithreaded()`` if LLVM is operating in multithreaded
>>>> mode. As
>>>> -such, ``llvm_shutdown()`` requires the same isolation guarantees as
>>>> -``llvm_stop_multithreaded()``.
>>>> -
>>>> -Note that, if you use scope-based shutdown, you can use the
>>>> -``llvm_shutdown_obj`` class, which calls ``llvm_shutdown()`` in its
>>>> destructor.
>>>> +deallocate memory used for internal structures.
>>>>
>>>> .. _managedstatic:
>>>>
>>>> @@ -2217,15 +2184,11 @@ Lazy Initialization with ``ManagedStatic
>>>> ------------------------------------------
>>>>
>>>> ``ManagedStatic`` is a utility class in LLVM used to implement static
>>>> -initialization of static resources, such as the global type tables.
>>>> Before the
>>>> -invocation of ``llvm_shutdown()``, it implements a simple lazy
>>>> initialization
>>>> -scheme. Once ``llvm_start_multithreaded()`` returns, however, it uses
>>>> +initialization of static resources, such as the global type tables.
>>>> In a
>>>> +single-threaded environment, it implements a simple lazy
>>>> initialization scheme.
>>>> +When LLVM is compiled with support for multi-threading, however, it
>>>> uses
>>>> double-checked locking to implement thread-safe lazy initialization.
>>>>
>>>> -Note that, because no other threads are allowed to issue LLVM API
>>>> calls before
>>>> -``llvm_start_multithreaded()`` returns, it is possible to have
>>>> -``ManagedStatic``\ s of ``llvm::sys::Mutex``\ s.
>>>> -
>>>> .. _llvmcontext:
>>>>
>>>> Achieving Isolation with ``LLVMContext``
>>>>
>>>> Modified: llvm/trunk/include/llvm-c/Core.h
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/Core.h?rev=211287&r1=211286&r2=211287&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/include/llvm-c/Core.h (original)
>>>> +++ llvm/trunk/include/llvm-c/Core.h Thu Jun 19 13:18:23 2014
>>>> @@ -2848,16 +2848,13 @@ void LLVMDisposePassManager(LLVMPassMana
>>>> * @{
>>>> */
>>>>
>>>> -/** Allocate and initialize structures needed to make LLVM safe for
>>>> - multithreading. The return value indicates whether multithreaded
>>>> - initialization succeeded. Must be executed in isolation from all
>>>> - other LLVM api calls.
>>>> - @see llvm::llvm_start_multithreaded */
>>>> +/** Deprecated: Multi-threading can only be enabled/disabled with the
>>>> compile
>>>> + time define LLVM_ENABLE_THREADS. This function always returns
>>>> + LLVMIsMultithreaded(). */
>>>> LLVMBool LLVMStartMultithreaded(void);
>>>>
>>>> -/** Deallocate structures necessary to make LLVM safe for
>>>> multithreading.
>>>> - Must be executed in isolation from all other LLVM api calls.
>>>> - @see llvm::llvm_stop_multithreaded */
>>>> +/** Deprecated: Multi-threading can only be enabled/disabled with the
>>>> compile
>>>> + time define LLVM_ENABLE_THREADS. */
>>>> void LLVMStopMultithreaded(void);
>>>>
>>>> /** Check whether LLVM is executing in thread-safe mode or not.
>>>>
>>>> Modified: llvm/trunk/include/llvm/Support/ManagedStatic.h
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/ManagedStatic.h?rev=211287&r1=211286&r2=211287&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/include/llvm/Support/ManagedStatic.h (original)
>>>> +++ llvm/trunk/include/llvm/Support/ManagedStatic.h Thu Jun 19 13:18:23
>>>> 2014
>>>> @@ -103,9 +103,6 @@ void llvm_shutdown();
>>>> /// llvm_shutdown() when it is destroyed.
>>>> struct llvm_shutdown_obj {
>>>> llvm_shutdown_obj() { }
>>>> - explicit llvm_shutdown_obj(bool multithreaded) {
>>>> - if (multithreaded) llvm_start_multithreaded();
>>>> - }
>>>> ~llvm_shutdown_obj() { llvm_shutdown(); }
>>>> };
>>>>
>>>>
>>>> Modified: llvm/trunk/include/llvm/Support/Threading.h
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Threading.h?rev=211287&r1=211286&r2=211287&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/include/llvm/Support/Threading.h (original)
>>>> +++ llvm/trunk/include/llvm/Support/Threading.h Thu Jun 19 13:18:23 2014
>>>> @@ -7,30 +7,19 @@
>>>> //
>>>>
>>>> //===----------------------------------------------------------------------===//
>>>> //
>>>> -// TThis file defines llvm_start_multithreaded() and friends.
>>>> +// This file declares helper functions for running LLVM in a
>>>> multi-threaded
>>>> +// environment.
>>>> //
>>>>
>>>> //===----------------------------------------------------------------------===//
>>>>
>>>> #ifndef LLVM_SUPPORT_THREADING_H
>>>> #define LLVM_SUPPORT_THREADING_H
>>>>
>>>> -namespace llvm {
>>>> - /// llvm_start_multithreaded - Allocate and initialize structures
>>>> needed to
>>>> - /// make LLVM safe for multithreading. The return value indicates
>>>> whether
>>>> - /// multithreaded initialization succeeded. LLVM will still be
>>>> operational
>>>> - /// on "failed" return, and will still be safe for hosting threading
>>>> - /// applications in the JIT, but will not be safe for concurrent
>>>> calls to the
>>>> - /// LLVM APIs.
>>>> - /// THIS MUST EXECUTE IN ISOLATION FROM ALL OTHER LLVM API CALLS.
>>>> - bool llvm_start_multithreaded();
>>>> -
>>>> - /// llvm_stop_multithreaded - Deallocate structures necessary to
>>>> make LLVM
>>>> - /// safe for multithreading.
>>>> - /// THIS MUST EXECUTE IN ISOLATION FROM ALL OTHER LLVM API CALLS.
>>>> - void llvm_stop_multithreaded();
>>>> +#include "llvm/Support/Mutex.h"
>>>>
>>>> - /// llvm_is_multithreaded - Check whether LLVM is executing in
>>>> thread-safe
>>>> - /// mode or not.
>>>> +namespace llvm {
>>>> + /// Returns true if LLVM is compiled with support for
>>>> multi-threading, and
>>>> + /// false otherwise.
>>>> bool llvm_is_multithreaded();
>>>>
>>>> /// llvm_execute_on_thread - Execute the given \p UserFn on a
>>>> separate
>>>>
>>>> Modified: llvm/trunk/lib/IR/Core.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Core.cpp?rev=211287&r1=211286&r2=211287&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/lib/IR/Core.cpp (original)
>>>> +++ llvm/trunk/lib/IR/Core.cpp Thu Jun 19 13:18:23 2014
>>>> @@ -2702,11 +2702,10 @@ void LLVMDisposePassManager(LLVMPassMana
>>>> /*===-- Threading
>>>> ------------------------------------------------------===*/
>>>>
>>>> LLVMBool LLVMStartMultithreaded() {
>>>> - return llvm_start_multithreaded();
>>>> + return LLVMIsMultithreaded();
>>>> }
>>>>
>>>> void LLVMStopMultithreaded() {
>>>> - llvm_stop_multithreaded();
>>>> }
>>>>
>>>> LLVMBool LLVMIsMultithreaded() {
>>>>
>>>> Modified: llvm/trunk/lib/Support/Threading.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Threading.cpp?rev=211287&r1=211286&r2=211287&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/lib/Support/Threading.cpp (original)
>>>> +++ llvm/trunk/lib/Support/Threading.cpp Thu Jun 19 13:18:23 2014
>>>> @@ -7,7 +7,8 @@
>>>> //
>>>>
>>>> //===----------------------------------------------------------------------===//
>>>> //
>>>> -// This file implements llvm_start_multithreaded() and friends.
>>>> +// This file defines helper functions for running LLVM in a
>>>> multi-threaded
>>>> +// environment.
>>>> //
>>>>
>>>> //===----------------------------------------------------------------------===//
>>>>
>>>> @@ -19,38 +20,14 @@
>>>>
>>>> using namespace llvm;
>>>>
>>>> -static bool multithreaded_mode = false;
>>>> -
>>>> -bool llvm::llvm_start_multithreaded() {
>>>> +bool llvm::llvm_is_multithreaded() {
>>>> #if LLVM_ENABLE_THREADS != 0
>>>> - assert(!multithreaded_mode && "Already multithreaded!");
>>>> - multithreaded_mode = true;
>>>> -
>>>> - // We fence here to ensure that all initialization is complete
>>>> BEFORE we
>>>> - // return from llvm_start_multithreaded().
>>>> - sys::MemoryFence();
>>>> return true;
>>>> #else
>>>> return false;
>>>> #endif
>>>> }
>>>>
>>>> -void llvm::llvm_stop_multithreaded() {
>>>> -#if LLVM_ENABLE_THREADS != 0
>>>> - assert(multithreaded_mode && "Not currently multithreaded!");
>>>> -
>>>> - // We fence here to insure that all threaded operations are complete
>>>> BEFORE we
>>>> - // return from llvm_stop_multithreaded().
>>>> - sys::MemoryFence();
>>>> -
>>>> - multithreaded_mode = false;
>>>> -#endif
>>>> -}
>>>> -
>>>> -bool llvm::llvm_is_multithreaded() {
>>>> - return multithreaded_mode;
>>>> -}
>>>> -
>>>> #if LLVM_ENABLE_THREADS != 0 && defined(HAVE_PTHREAD_H)
>>>> #include <pthread.h>
>>>>
>>>>
>>>> Modified: llvm/trunk/unittests/Support/ManagedStatic.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/ManagedStatic.cpp?rev=211287&r1=211286&r2=211287&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/unittests/Support/ManagedStatic.cpp (original)
>>>> +++ llvm/trunk/unittests/Support/ManagedStatic.cpp Thu Jun 19 13:18:23
>>>> 2014
>>>> @@ -47,7 +47,6 @@ TEST(Initialize, MultipleThreads) {
>>>> void *p1 = test1::allocate_stack(a1);
>>>> void *p2 = test1::allocate_stack(a2);
>>>>
>>>> - llvm_start_multithreaded();
>>>> pthread_t t1, t2;
>>>> pthread_create(&t1, &a1, test1::helper, nullptr);
>>>> pthread_create(&t2, &a2, test1::helper, nullptr);
>>>> @@ -55,7 +54,6 @@ TEST(Initialize, MultipleThreads) {
>>>> pthread_join(t2, nullptr);
>>>> free(p1);
>>>> free(p2);
>>>> - llvm_stop_multithreaded();
>>>> }
>>>> #endif
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> llvm-commits mailing list
>>>> llvm-commits at cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>>
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140620/64557827/attachment.html>
More information about the llvm-commits
mailing list