Re: Restrict global constructors base ISA?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Wrong list... please disregard.
On Sat, Dec 1, 2018 at 4:53 AM Jeffrey Walton <noloader@xxxxxxxxx> wrote:
>
> I'm testing on older OS X 10.8 with older SSE4 hardware from about
> 2010. I've got updated gear from MacPorts and it includes GCC and
> Clang. GCC is the compiler, and Clang is the assembler.
>
> We perform a compile/link on a test file to ensure an ISA is supported
> by the toolchain. If an ISA is available then we compile a source file
> to the ISA. Then, we guard the higher ISAs at runtime to avoid
> SIGILLs. It worked well until we added AVX2.
>
> At AVX2 we see this as expected:
>
>     $ CXX=/opt/local/bin/clang++-mp-5.0 make
>     /opt/local/bin/clang++-mp-5.0 ... -c chacha.cpp
>     /opt/local/bin/clang++-mp-5.0 ... -mavx2 -c chacha_avx.cpp
>     /opt/local/bin/clang++-mp-5.0 ... -msse2 -c chacha_simd.cpp
>
> At runtime we catch a SIGILL due to chacha_avx.cpp as shown below. It
> looks like global constructors are using instructions from AVX (vxorps
> ), which is beyond what the machine can support.
>
> How do we tell GCC to use the base ISA for global constructors?
>
> Thanks in advance.
>
> ==========
>
> (lldb) r v
> ...
> * thread #1: tid = 0x19f83aa, 0x000000010016ec49
> cryptest.exe`_GLOBAL__sub_I_chacha_avx.cpp at string:1322, queue =
> 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION
> (code=EXC_I386_INVOP, subcode=0x0)
>     frame #0: 0x000000010016ec49
> cryptest.exe`_GLOBAL__sub_I_chacha_avx.cpp at string:1322
>    1319         {
>    1320             size_type (&__a)[__n_words] = __r_.first().__r.__words;
>    1321             for (unsigned __i = 0; __i < __n_words; ++__i)
> -> 1322                 __a[__i] = 0;
>    1323         }
>    1324
>    1325     template <size_type __a> static
>
> And:
>
> (lldb) disass
> cryptest.exe`_GLOBAL__sub_I_chacha_avx.cpp at chacha_avx.cpp:
>    0x10016ec30:  pushq  %rbp
>    0x10016ec31:  movq   %rsp, %rbp
>    0x10016ec34:  pushq  %r14
>    0x10016ec36:  pushq  %rbx
>    0x10016ec37:  movq   0x24cf8a(%rip), %rax      ; (void
> *)0x00000001003e69f0: vtable for CryptoPP::NullNameValuePairs
>    0x10016ec3e:  addq   $0x10, %rax
>    0x10016ec42:  movq   %rax, 0x2dfb6f(%rip)      ;
> CryptoPP::s_nullNameValuePairs
> -> 0x10016ec49:  vxorps %xmm0, %xmm0, %xmm0
>    0x10016ec4d:  vmovups %xmm0, 0x2dfb6b(%rip)     ; CryptoPP::DEFAULT_CHANNEL
>    0x10016ec55:  movq   $0x0, 0x2dfb70(%rip)      ;
> CryptoPP::DEFAULT_CHANNEL + 12
>    0x10016ec60:  leaq   0x2dfb59(%rip), %rsi      ; CryptoPP::DEFAULT_CHANNEL
>    0x10016ec67:  movq   0x24ba52(%rip), %rbx      ; (void
> *)0x00007fff8f09321e: std::__1::basic_string<char,
> std::__1::char_traits<char>, std::__1::allocator<char>
> >::~basic_string()
>    0x10016ec6e:  leaq   -0x16ec75(%rip), %r14     ; _mh_execute_header
>    ...



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux