[llvm] r211287 - Remove support for LLVM runtime multi-threading.

Zachary Turner zturner at google.com
Fri Jun 20 09:54:31 PDT 2014


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/64a33c0f/attachment.html>


More information about the llvm-commits mailing list