LLVM & SSE2

Jun. 2nd, 2010 08:27 am
madf: (Default)
[personal profile] madf
Знайшов причину вчорашніх падінь. Виявилось що LLVM тишком-нишком юзає SSE2, якого у моєму AMD Sempron 2500+ немає.

Пруф:
(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.

Profile

madf: (Default)
madf

April 2018

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
2930     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 7th, 2026 05:11 am
Powered by Dreamwidth Studios