We have seen random symbol not found "__cxa_throw" error in fuschia build bots and out-of-tree users. The understanding have been that they are built without exception support, but it turned out that these platforms have LLVM_STATIC_LINK_CXX_STDLIB ON so that they link libstdc++ to llvm statically. The reason why this is problematic for clang-repl is that by default clang-repl tries to find symbols from symbol table of executable and dynamic libraries loaded by current process. It needs to load another libstdc++, but the platform that had LLVM_STATIC_LINK_CXX_STDLIB turned on is usally those with missing or obsolate shared libstdc++ in the first place -- trying to load it again would be destined to fail eventually with a risk to introuduce mixed libstdc++ versions. A proper solution that doesn't take a workaround is statically link the same libstdc++ by clang-repl side, but this is not possible with old JIT linker runtimedyld. New just-in-time linker JITLink handles this relatively well, but it's not availalbe in majority of platforms. For now, this patch just disables the building of clang-repl when LLVM_STATIC_LINK_CXX_STDLIB is ON and removes the "__cxa_throw" check in exception unittest as well as reverting previous exception check flag patch. Reviewed By: v.g.vassilev Differential Revision: https://reviews.llvm.org/D130788
23 lines
736 B
C++
23 lines
736 B
C++
// clang-format off
|
|
// RUN: clang-repl "int x = 10;" "int y=7; err;" "int y = 10;"
|
|
// RUN: clang-repl "int i = 10;" 'extern "C" int printf(const char*,...);' \
|
|
// RUN: 'auto r1 = printf("i = %d\n", i);' | FileCheck --check-prefix=CHECK-DRIVER %s
|
|
// UNSUPPORTED: system-aix
|
|
// CHECK-DRIVER: i = 10
|
|
// RUN: cat %s | clang-repl | FileCheck %s
|
|
// RUN: cat %s | clang-repl -Xcc -O2 | FileCheck %s
|
|
extern "C" int printf(const char *, ...);
|
|
int i = 42;
|
|
auto r1 = printf("i = %d\n", i);
|
|
// CHECK: i = 42
|
|
|
|
struct S { float f = 1.0; S *m = nullptr;} s;
|
|
|
|
auto r2 = printf("S[f=%f, m=0x%llx]\n", s.f, reinterpret_cast<unsigned long long>(s.m));
|
|
// CHECK-NEXT: S[f=1.000000, m=0x0]
|
|
|
|
inline int foo() { return 42; }
|
|
int r3 = foo();
|
|
|
|
%quit
|