diff --git a/Dockerfile.dev b/Dockerfile.dev index 6c2f5994..01019441 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -75,7 +75,7 @@ COPY test/*.cpp ./test/ RUN cd test && \ for arch in $TOOLCHAIN_ARCHS; do \ mkdir -p $arch && \ - for test in hello-cpp hello-exception tlstest-main; do \ + for test in hello-cpp hello-exception tlstest-main exception-locale; do \ $arch-w64-mingw32-clang++ $test.cpp -o $arch/$test.exe || exit 1; \ done; \ for test in tlstest-lib; do \ diff --git a/run-tests.sh b/run-tests.sh index 1c7342f3..f2639a9d 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -16,7 +16,7 @@ TESTS_C="hello hello-tls crt-test setjmp" TESTS_C_DLL="autoimport-lib" TESTS_C_LINK_DLL="autoimport-main" TESTS_C_NO_BUILTIN="crt-test" -TESTS_CPP="hello-cpp hello-exception tlstest-main" +TESTS_CPP="hello-cpp hello-exception tlstest-main exception-locale" TESTS_CPP_DLL="tlstest-lib" TESTS_SSP="ssp" for arch in $ARCHS; do diff --git a/test/exception-locale.cpp b/test/exception-locale.cpp new file mode 100644 index 00000000..62e1ac1d --- /dev/null +++ b/test/exception-locale.cpp @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018 SquallATF + * + * This file is part of llvm-mingw. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +int main(int argc, char *argv[]) { + try { + std::locale loc("test"); + } catch (std::runtime_error& e) { + std::cerr << "Caught " << e.what() << std::endl; + std::cerr << "Type " << typeid(e).name() << std::endl; + } catch (...) { + std::cerr << "catch all" << std::endl; + } + + return 0; +} diff --git a/wrappers/clang-target-wrapper.sh b/wrappers/clang-target-wrapper.sh index 360eb645..3cce3889 100755 --- a/wrappers/clang-target-wrapper.sh +++ b/wrappers/clang-target-wrapper.sh @@ -10,8 +10,13 @@ esac ARCH=$(echo $TARGET | sed 's/-.*//') case $ARCH in i686) - # Dwarf is the default here. - ARCH_FLAGS= + # Dwarf is the default for i686, but libunwind sometimes fails to + # to unwind correctly on i686. This issue might be related to cases + # of DW_CFA_GNU_args_size (which were adjusted in libunwind SVN r337312). + # The issue can be reproduced with test/exception-locale.cpp. + # The issue goes away if building libunwind/libcxxabi/libcxx and the + # test example with -mstack-alignment=16 -mstackrealign. + ARCH_FLAGS=-fsjlj-exceptions ;; x86_64) # SEH is the default here.