[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