Злобный баг: в fpc 3.0.4 x86_64 сломаны ассемблерные вставки

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Злобный баг: в fpc 3.0.4 x86_64 сломаны ассемблерные вставки

Сообщение Cheb » 06.09.2018 13:42:20

Причём, только x86_64: для i686 оные работают отлично.
Причём, только fpc 3: тот же код, скомпилированный fpc 2.6.4 x86_64 работает отлично.

А вот fpc 3 + x86_64 + asm = битый код, который молча запарывает память и крашится где-то в другом месте.

Потом найду время - заставлю высрать ассемблерный вывод чтобы понять, чего он такого косячит. Навскидку - забивает на объявления запорченных регистров в конце asm блока.

З.Ы. Проверял только под {$asmmode intel}

Добавлено спустя 3 часа 5 минут 23 секунды:
Ничего не понимаю.
Выглядят одинаковыми:

Код: Выделить всё
      Result^.events[High(Result^.events)].eType:= deke_Terminator;
    {$ifdef CPUX86_64}
      asm
        mov rsi, qword[Result]
        mov ax, ss
        mov word[rsi + TMotherSEHState.StackSegment], ax
      end['rax', 'rsi'];
    {$endif}
    {$ifdef CPU386}
      asm
        mov esi, dword[Result]
        mov ax, ss
        mov word[esi + TMotherSEHState.StackSegment], ax
      end['eax', 'esi'];
    {$endif}

      LeaveCriticalsection(Mother^.SehCriticalSection); 


2.6.4:
Код: Выделить всё
; [37] Result^.events[High(Result^.events)].eType:= deke_Terminator;
      mov   rax,qword ptr [rbp-8]
; Register raxreleased
      mov   dword ptr [rax+59118],1
; Register raxallocated
; Register rsiallocated
@@l3527:
; [43] mov rsi, qword[Result]
      mov   rsi,qword ptr [rbp-8]
@@l3528:
; [44] mov ax, ss
      mov   ax,ss
@@l3529:
; [45] mov word[rsi + TMotherSEHState.StackSegment], ax
      mov   word ptr [rsi+60],ax
; Register raxreleased
; Register rsireleased
; Register raxallocated
@@l3530:
; [56] LeaveCriticalsection(Mother^.SehCriticalSection);
      mov   rax,qword ptr [U_CL_CGE_MOTHER+$]


3.0.4:
Код: Выделить всё
# [37] Result^.events[High(Result^.events)].eType:= deke_Terminator;
   movq   -8(%rbp),%rax
   movl   $1,59118(%rax)
   # Register rax released
   # Register rax,rsi allocated
.Ll4092:
# [43] mov rsi, qword[Result]
   movq   -8(%rbp),%rsi
.Ll4093:
# [44] mov ax, ss
   movw   %ss,%ax
.Ll4094:
# [45] mov word[rsi + TMotherSEHState.StackSegment], ax
   movw   %ax,60(%rsi)
   # Register rsi released
   # Register rax allocated
.Ll4095:
# [56] LeaveCriticalsection(Mother^.SehCriticalSection);
   movq   U_$CL_CGE_$$_MOTHER(%rip),%rax
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Злобный баг: в fpc 3.0.4 x86_64 сломаны ассемблерные вст

Сообщение bormant » 06.09.2018 21:13:42

А если для 3.0.4 тоже -Amasm синтаксис заказать?
Аватара пользователя
bormant
постоялец
 
Сообщения: 407
Зарегистрирован: 21.03.2012 11:26:01

Re: Злобный баг: в fpc 3.0.4 x86_64 сломаны ассемблерные вст

Сообщение Sergei I. Gorelkin » 07.09.2018 01:13:53

В версии 3.x обработка исключений win64 приведена в соответствие со спецификацией. Т.е. она стала совсем не такой как в win32. Т.е. все хаки, основанные на коде из win32, обречены.
А с ассемблерными вставками все хорошо. Без них компилятор не сможет собрать сам себя. Со списком регистров стало даже лучше, чем в 2.6.x: компилятор научился сохранять регистры, отличные от целочисленных (xmm в случае win64).
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Злобный баг: в fpc 3.0.4 x86_64 сломаны ассемблерные вст

Сообщение Cheb » 07.09.2018 19:28:12

А если для 3.0.4 тоже -Amasm синтаксис заказать?

Падает с внутренней ошибкой компилятора.

приведена в соответствие со спецификацией.

Хммм... То есть это - "ищи, где стреляешь себе в ногу, Люк" ?
Это ж замечательно!

..хотя нет. Это бесполезно: я застрял на 2.6.4 для x86_64 из-за вот этой бякости :cry:
[тяжкий вздох]
Сегодня вечером попытаюсь поставить 2.6.4 на убунту 18 :oops:

По ходу выполол из движка дюжину страшных ляпов, перевёл адресацию на [rip + MyGlobalvar], и x86_64 версия падать перестала. От слова совсем. Но... Но как это может работать?! Rip же скользящий! :shock:
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Злобный баг: в fpc 3.0.4 x86_64 сломаны ассемблерные вст

Сообщение Sergei I. Gorelkin » 10.09.2018 21:34:43

Cheb писал(а):По ходу выполол из движка дюжину страшных ляпов, перевёл адресацию на [rip + MyGlobalvar], и x86_64 версия падать перестала. От слова совсем. Но... Но как это может работать?! Rip же скользящий!

Это режим адресации, появившийся в x86_64, в инструкции кодируется 4-х байтовое смещение от текущей позиции до символа. Пока оно влазит в плюс-минус 2ГБайт, получается позиционно-независимый код без лишних хлопот.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

Рейтинг@Mail.ru