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

Yaron Keren yaron.keren at gmail.com
Fri Jun 20 11:29:06 PDT 2014


Hi,

I rebooted, updated and rebuild and now the clang tests pass. Before the
reboot&update total rebuild (=delete all of msvc and start from scratch)
did not help. So either the reboot or one of the few latest revisions did
the trick.

I run the test from the command line :

python msvc/RelWithDebInfo/bin/llvm-lit.py -s test
c:\my\ceemple\0\Python27\python msvc/RelWithDebInfo/bin/llvm-lit.py
tools\clang\test -s

If it happens again I'll try to debug the failing program to get to the
root of the problem. It does look like a deadlock of some kind.

Thanks!

Yaron




2014-06-20 21:03 GMT+03:00 Zachary Turner <zturner at google.com>:

> Still not reproducing for me even with the same options.  Very strange.
>
> The test(s) that are failing, I assume they're run as part of check-clang?
>  That's what I'm running.
>
> Only thing I can think of is to open ErrorHandling.cpp and find
> report_fatal_error().  Change exit(1) to std::quick_exit(1) (or
> alternatively, if a fatal_error_handler is installed, make sure it calls
> either quick_exit or abort, but not exit).  I experienced a deadlock
> related to this before, but none of the stuff that triggered that deadlock
> are currently checked in, so it could be another instance of it that for
> some reason only happens to you.
>


On Fri, Jun 20, 2014 at 10:38 AM, Zachary Turner <zturner at google.com> wrote:

> Thanks.  I'll try with these options as well.  I have a pretty beefy
> machine, so a full build only takes 2 or 3 minutes for me, let's see if I
> can repro...
>
>
> On Fri, Jun 20, 2014 at 10:36 AM, Yaron Keren <yaron.keren at gmail.com>
> wrote:
>
>> I use a bunch more
>>
>> cmake -G "Visual Studio 12" -DLLVM_TARGETS_TO_BUILD=X86
>> -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_INCLUDE_EXAMPLES=OFF
>> -DLLVM_INCLUDE_DOCS=OFF -DLLVM_USE_CRT_RELWITHDEBINFO:STRING=MT
>> -DLLVM_ENABLE_THREADS:BOOL=OFF ..
>>
>> and build in Release with Debug Info and with asserts.
>>
>> I'm still looking into this, rebuilding takes time.
>>
>> Yaron
>>
>>
>>
>> 2014-06-20 20:26 GMT+03:00 Zachary Turner <zturner at google.com>:
>>
>> It's odd that I'm not able to reproduce this.  I'm also using MSVC and I
>>> run cmake as
>>>
>>> cmake -D LLVM_ENABLE_THREADS:BOOL=OFF
>>>
>>> Is this what you're doing, or do you have some other options set?
>>>
>>
>>
>> On Fri, Jun 20, 2014 at 10:04 AM, Yaron Keren <yaron.keren at gmail.com>
>> wrote:
>>
>>> 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/e36aa2e9/attachment.html>


More information about the llvm-commits mailing list