This patch removes the ability to build the runtimes in the 32 bit multilib configuration, i.e. using -m32. Instead of doing this, one should cross-compile the runtimes for the appropriate target triple, like we do for all other triples. As it stands, -m32 has several issues, which all seem to be related to the fact that it's not well supported by the operating systems that libc++ support. The simplest path towards fixing this is to remove support for the configuration, which is also the best course of action if there is little interest for keeping that configuration. If there is a desire to keep this configuration around, we'll need to do some work to figure out the underlying issues and fix them. Differential Revision: https://reviews.llvm.org/D114473
75 lines
2.3 KiB
C++
75 lines
2.3 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include <algorithm>
|
|
#include <cstdio>
|
|
#include <cstdlib>
|
|
#include <__threading_support>
|
|
#include <unistd.h>
|
|
|
|
#include "../src/cxa_exception.h"
|
|
|
|
typedef __cxxabiv1::__cxa_eh_globals globals_t ;
|
|
|
|
void *thread_code (void *parm) {
|
|
size_t *result = (size_t *) parm;
|
|
globals_t *glob1, *glob2;
|
|
|
|
glob1 = __cxxabiv1::__cxa_get_globals ();
|
|
if ( NULL == glob1 )
|
|
std::printf("Got null result from __cxa_get_globals\n");
|
|
|
|
glob2 = __cxxabiv1::__cxa_get_globals_fast ();
|
|
if ( glob1 != glob2 )
|
|
std::printf("Got different globals!\n");
|
|
|
|
*result = (size_t) glob1;
|
|
#ifndef _LIBCXXABI_HAS_NO_THREADS
|
|
sleep ( 1 );
|
|
#endif
|
|
return parm;
|
|
}
|
|
|
|
#ifndef _LIBCXXABI_HAS_NO_THREADS
|
|
#define NUMTHREADS 10
|
|
size_t thread_globals [ NUMTHREADS ] = { 0 };
|
|
std::__libcpp_thread_t threads [ NUMTHREADS ];
|
|
#endif
|
|
|
|
int main() {
|
|
#ifndef _LIBCXXABI_HAS_NO_THREADS
|
|
// Make the threads, let them run, and wait for them to finish
|
|
for ( int i = 0; i < NUMTHREADS; ++i )
|
|
std::__libcpp_thread_create ( threads + i, thread_code, (void *) (thread_globals + i));
|
|
for ( int i = 0; i < NUMTHREADS; ++i )
|
|
std::__libcpp_thread_join ( &threads [ i ] );
|
|
|
|
int retVal = 0;
|
|
for ( int i = 0; i < NUMTHREADS; ++i ) {
|
|
if ( 0 == thread_globals [ i ] ) {
|
|
std::printf("Thread #%d had a zero global\n", i);
|
|
retVal = 1;
|
|
}
|
|
}
|
|
|
|
std::sort ( thread_globals, thread_globals + NUMTHREADS );
|
|
for ( int i = 1; i < NUMTHREADS; ++i ) {
|
|
if ( thread_globals [ i - 1 ] == thread_globals [ i ] ) {
|
|
std::printf("Duplicate thread globals (%d and %d)\n", i-1, i);
|
|
retVal = 2;
|
|
}
|
|
}
|
|
return retVal;
|
|
#else // _LIBCXXABI_HAS_NO_THREADS
|
|
size_t thread_globals;
|
|
thread_code(&thread_globals);
|
|
// Check that __cxa_get_globals() is not NULL.
|
|
return (thread_globals == 0) ? 1 : 0;
|
|
#endif // !_LIBCXXABI_HAS_NO_THREADS
|
|
}
|