LLVM & SSE2
Jun. 2nd, 2010 08:27 amЗнайшов причину вчорашніх падінь. Виявилось що LLVM тишком-нишком юзає SSE2, якого у моєму AMD Sempron 2500+ немає.
Пруф:
Зверніть увагу на останній дамп. А саме на інструкцію cvtsi2sd. Ц є не що інше як SSE2'шна інструкція для перетворення signed doubleword integer на double precision floating point.
Після зборки з -mno-sse2 (а у документації про цей ключ ні слова) все встало на свої місця. Правда тепер не хоче завантажувати плагіни, лається на undefined symbol.
Пруф:
(gdb) r ./
Starting program: /home/faust/Data/STG/stg-2.5/projects/stargazer/stargazer ./
[Thread debugging using libthread_db enabled]
settings.cpp > 03:00:00 > SETTINGS::SETTINGS(const std::string &)
settings.cpp > 03:00:00 > SETTINGS::~SETTINGS()
[New Thread 0xb7cd8b70 (LWP 4572)]
stg_timer.cpp > 03:00:00 > STG_TIMER started. Time: 0
store_loader.cpp > 08:14:29 > STORE_LOADER::Load()
[New Thread 0xb743bb70 (LWP 4573)]
eventloop.cpp > 08:14:29 > EVENT_LOOP::Runner - Before start
eventloop.cpp > 08:14:29 > EVENT_LOOP::Runner - Sleeping until new actions arrived
Program received signal SIGILL, Illegal instruction.
0x080b34a6 in TARIFF_CONF::TARIFF_CONF() ()
(gdb) bt
#0 0x080b34a6 in TARIFF_CONF::TARIFF_CONF() ()
#1 0x080b3371 in TARIFF_CONF::TARIFF_CONF (this=0x812ac38)
at /home/faust/Data/STG/stg-2.5/projects/stargazer/../../include/tariff_conf.h:121
#2 0x080b2181 in TARIFF::TARIFF (this=0x812ac38) at tariff.cpp:80
#3 0x080b35fa in TARIFFS::TARIFFS (this=0x812abe8, st=0x8129628) at tariffs.cpp:61
#4 0x080a2314 in main (argc=2, argv=0xbffff794) at main.cpp:562
(gdb) frame 1
#1 0x080b3371 in TARIFF_CONF::TARIFF_CONF (this=0x812ac38)
at /home/faust/Data/STG/stg-2.5/projects/stargazer/../../include/tariff_conf.h:121
121 {};
(gdb) disassemble
Dump of assembler code for function _ZN11TARIFF_CONFC1Ev:
0x080b335a <+0>: push %ebp
0x080b335b <+1>: mov %esp,%ebp
0x080b335d <+3>: sub $0x8,%esp
0x080b3360 <+6>: mov 0x8(%ebp),%eax
0x080b3363 <+9>: mov %eax,-0x4(%ebp)
0x080b3366 <+12>: mov -0x4(%ebp),%eax
0x080b3369 <+15>: mov %eax,(%esp)
0x080b336c <+18>: call 0x80b3492 <_ZN11TARIFF_CONFC2Ev>
=> 0x080b3371 <+23>: add $0x8,%esp
0x080b3374 <+26>: pop %ebp
0x080b3375 <+27>: ret
End of assembler dump.
(gdb) frame 0
#0 0x080b34a6 in TARIFF_CONF::TARIFF_CONF() ()
(gdb) disassemble
Dump of assembler code for function _ZN11TARIFF_CONFC2Ev:
0x080b3492 <+0>: push %ebp
0x080b3493 <+1>: mov %esp,%ebp
0x080b3495 <+3>: sub $0x10,%esp
0x080b3498 <+6>: mov 0x8(%ebp),%eax
0x080b349b <+9>: mov %eax,-0x8(%ebp)
0x080b349e <+12>: mov -0x8(%ebp),%eax
0x080b34a1 <+15>: mov $0x0,%ecx
=> 0x080b34a6 <+20>: cvtsi2sd %ecx,%xmm0
0x080b34aa <+24>: movsd %xmm0,(%eax)
0x080b34ae <+28>: movsd %xmm0,0x8(%eax)
0x080b34b3 <+33>: movl $0x0,0x10(%eax)
0x080b34ba <+40>: movsd %xmm0,0x14(%eax)
0x080b34bf <+45>: add $0x1c,%eax
0x080b34c2 <+48>: mov %eax,(%esp)
0x080b34c5 <+51>: call 0x8099628 <_ZNSsC1Ev@plt>
0x080b34ca <+56>: add $0x10,%esp
0x080b34cd <+59>: pop %ebp
0x080b34ce <+60>: ret
End of assembler dump.
Зверніть увагу на останній дамп. А саме на інструкцію cvtsi2sd. Ц є не що інше як SSE2'шна інструкція для перетворення signed doubleword integer на double precision floating point.
Після зборки з -mno-sse2 (а у документації про цей ключ ні слова) все встало на свої місця. Правда тепер не хоче завантажувати плагіни, лається на undefined symbol.