solaris - 是什么导致 bfd_asm.c 中的 SunCC 崩溃?
问题描述
我正在尝试追查 SunCC 编译器崩溃的原因。它从早期的 SunCC 12.x 时代就已经存在,并且存在于最新的 SunCC 12.6 中。尝试在 x86 系统上乘以多项式时会发生崩溃。下面的代码是 GCM 算法的一部分:
$ cat test.cxx
# include <emmintrin.h>
# include <tmmintrin.h>
# include <wmmintrin.h>
__m128i GCM_Reduce_CLMUL(__m128i c0, __m128i c1, __m128i c2, const __m128i &r)
{
__m128i t = r;
c1 = _mm_xor_si128(c1, _mm_slli_si128(c0, 8));
t = _mm_clmulepi64_si128(c0, r, 0x10);
c1 = _mm_xor_si128(c1, t);
c0 = _mm_srli_si128(c0, 8);
c0 = _mm_xor_si128(c0, c1);
c0 = _mm_slli_epi64(c0, 1);
c0 = _mm_clmulepi64_si128(c0, r, 0x0);
c2 = _mm_xor_si128(c2, c0);
t = _mm_srli_si128(c1, 8);
c2 = _mm_xor_si128(c2, t);
c1 = _mm_unpacklo_epi64(c1, c2);
c1 = _mm_srli_epi64(c1, 63);
c2 = _mm_slli_epi64(c2, 1);
return _mm_xor_si128(c2, c1);
}
和:
$ /opt/developerstudio12.6/bin/CC -DNDEBUG -g3 -xO3 -m64 -KPIC -template=no%extdef -xarch=aes -c test.cxx
lf 25 PCLMULP_Xx REG %x4 UND 0 REG %x4 REG %x0 UND 0 UND 0 UND 0 UND 0 UND 0 UND 0 off:0 uc:2 nxt: 29 bb: 3 FDI:F Ln:10 Ex:22
"test.cxx", [__1cQGCM_Reduce_CLMUL6FXXXrkX_X_]: assertion failed in function dump_asm_instruction() @ bfd_asm.c:2602
assert(nd_not_null_( disp.disp[0]) || (hf_dump_node(bfd_lf_node), 0))
CC: ube failed for test.cxx
我无法找到有关由于bfd_asm.c:2602
. 我相信这与使用时导致 g3mangler.cc 中的 SunCC 崩溃的原因相同-std=XXX
?,但它只是移动了。
迄今为止,我们的策略是在等待修复时禁用代码路径。它看起来不会很快得到修复,因此我们希望找到一种解决方法并重新启用代码。
是什么导致了崩溃,我该如何解决?
我认为这是 MCVE,虽然它不是很有用:
$ cat test.cxx
# include <emmintrin.h>
# include <tmmintrin.h>
# include <wmmintrin.h>
__m128i GCM_Reduce_CLMUL(__m128i c0, __m128i c1, __m128i c2, const __m128i &r)
{
__m128i t = r;
t = _mm_clmulepi64_si128(c0, t, 0x10);
c0 = _mm_clmulepi64_si128(c0, t, 0x0);
return _mm_xor_si128(c1, c0);
}
jwalton@solaris2:~/cryptopp$ /opt/developerstudio12.6/bin/CC -DNDEBUG -g3 -xO3 -m64 -KPIC -template=no%extdef -xarch=aes -c test.cxx
lf 17 PCLMULP_Xx REG %x2 UND 0 REG %x2 REG %x0 UND 0 UND 0 UND 0 UND 0 UND 0 UND 0 off:0 uc:2 nxt: 21 bb: 3 FDI:F Ln:9 Ex:15
"test.cxx", [__1cQGCM_Reduce_CLMUL6FXXXrkX_X_]: assertion failed in function dump_asm_instruction() @ bfd_asm.c:2602
assert(nd_not_null_( disp.disp[0]) || (hf_dump_node(bfd_lf_node), 0))
CC: ube failed for test.cxx
解决方案
这是编译器中的一个错误。PCLMUL
从内部表示转储中,我看到指令的第二个输入操作数的类型错误。它必须是即时的,但在转储中它是 XMM。
可悲的是,这不太可能得到解决。我能想到的唯一解决方法是使用-xarch=avx
或更高,因为这将使用不同的指令表示,并且不会出现错误。
推荐阅读
- python-3.x - 将带有自定义节点对象的图形写入 Networkx 中的 gml 文件
- javascript - 为 HTML5 视频添加字幕
- git - 如何更改 git global user.email?
- javascript - Javascript Canvas 空白 Tizen webapp
- maven - 如何使用 Cucumber 6 和 Maven 集成集成测试
- javascript - 在 vue.js 中为 .sync 添加条件
- python - 如何使用 Beautiful Soup 获取 html 页面中两个标签之间的内容?
- c# - 无法使用 SAS 从 Azure Blob 存储中检索文件
- python - 从python中的另一个数组获取真实索引的值
- html - CSS用图像替换javascript生成的表格中的文本