Autor Téma: Novinky v Delphi 12 - maskování FPU  (Přečteno 572 krát)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3412
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Novinky v Delphi 12 - maskování FPU
« kdy: 26-09-2023, 14:26:21 »
https://dalijap.blogspot.com/2023/09/coming-in-delphi-12-disabled-floating.html

V D12 dochází ke změně ohledně maskování FPU exception, pokud nerozumíte co to znamená, tak to asi nepotřebujete :-)

Ale ve zkratce: od D2 (možná D1) Delphi při vyjimkach u FP operací (jako je dělení 0, nebo práce s nekonečnem) vyhodí vyjimku, ale v podstatě hodně knihoven a některé jiné vývojové prostředí / OS tyto vyjimky ignorují, a tak při volání těchto knihoven se muselo provést maskování FPU a vyjímky zakázat. V D12 se toto mění.

Samozřejmě můžete se vrátit k původnímu chování
Embarcadero MVP - Czech republic

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3523
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:Novinky v Delphi 12 - maskování FPU
« Odpověď #1 kdy: 28-09-2023, 07:08:49 »
Ale ve zkratce: od D2 (možná D1) Delphi při vyjimkach u FP operací (jako je dělení 0, nebo práce s nekonečnem) vyhodí vyjimku, ale v podstatě hodně knihoven a některé jiné vývojové prostředí / OS tyto vyjimky ignorují, a tak při volání těchto knihoven se muselo provést maskování FPU a vyjímky zakázat. V D12 se toto mění.
To jim taky trvalo: ta ostatni prostredi splnuji IEEE 754, ktera zadne vyjimky pri tech operacich nepredepisuje, ale maji vracet NaN a Infinity - Delphi bylo snad jedine rozsirenejsi prostredi, ktere vyjimky vyvolavalo, i kdyz z pohledu integer/floating point aritmetiky je vyvolavani vyjimek konzistentni.

Offline chaloup

  • Plnoletý
  • ***
  • Příspěvků: 123
  • Karma: 11
    • Verze Delphi: Delphi 11.3
Re:Novinky v Delphi 12 - maskování FPU
« Odpověď #2 kdy: 04-01-2024, 14:26:12 »
No ono to podle mě souvisí s tím jak se Delphi snaží sjednotit chování nativního Delphi(win32/64) a Delphi->LLVM kompilátoru (ios, android, linux)
jestli to dobře chápu, tak win32/64 a LLVM kompilátory mají jiné chování co se týká exceptions
(což se přiznám jsem vůbec nezaznamenal - jestli to embt někde inzeruje)
problém je podle mě mnohem složitější, jak je popsáno zde:
https://dalijap.blogspot.com/2018/10/catch-me-if-you-can.html
https://dalijap.blogspot.com/2023/12/catch-me-if-you-can-part-ii.html

zjednodušeně řečeno, následující kód s win kompilátorem vyhodí exceptions a na LLVM ne:
Kód: Delphi [Vybrat]
  1. type
  2.   TFoo = class(TObject)
  3.   public
  4.     procedure Foo; virtual;
  5.   end;    
  6.  
  7. procedure TFoo.Foo;
  8. begin
  9. end;
  10.  
  11. var
  12.   Foo: TFoo;
  13. begin
  14.   Foo := nil;
  15.   try
  16.     // calling a virtual method on nil reference raises an Access Violation exception
  17.     Foo.Foo;
  18.   except
  19.     Log.d('CAUGHT');
  20.   end;
  21. end;
  22.  

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3412
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:Novinky v Delphi 12 - maskování FPU
« Odpověď #3 kdy: 04-01-2024, 14:46:52 »
No to je trochu popletene:
LLVM (ve všech kompilátorech na světě nezavisle na výrobci) nedokáže zachytit HW exception na stejné úrovni kde vznikne (mohl bych spekulovat o stack frame atd. ale to nevim) a ta vyjimka probubla to vyssi vrstvy kde uz zachytitelna je. To je popsane a zname chovani LLVM.

V podstate se clovek muze potkat realne se 2 typy HW vyjimek, a to FPU a AV. FPU jsou maskovane, takze zbyva AV.

Takze kdyz pises " vyhodí exceptions a na LLVM ne" tak to neni pravda. Jen tu HW (opakuji HW, tj. AV) nechytnes v tom bloku.

S tim finally co tam pise si nejsem tak jist.


No ono to podle mě souvisí s tím jak se Delphi snaží sjednotit chování nativního Delphi(win32/64) a Delphi->LLVM kompilátoru (ios, android, linux)
jestli to dobře chápu, tak win32/64 a LLVM kompilátory mají jiné chování co se týká exceptions
(což se přiznám jsem vůbec nezaznamenal - jestli to embt někde inzeruje)
problém je podle mě mnohem složitější, jak je popsáno zde:
https://dalijap.blogspot.com/2018/10/catch-me-if-you-can.html
https://dalijap.blogspot.com/2023/12/catch-me-if-you-can-part-ii.html

zjednodušeně řečeno, následující kód s win kompilátorem vyhodí exceptions a na LLVM ne:
Kód: Delphi [Vybrat]
  1. type
  2.   TFoo = class(TObject)
  3.   public
  4.     procedure Foo; virtual;
  5.   end;    
  6.  
  7. procedure TFoo.Foo;
  8. begin
  9. end;
  10.  
  11. var
  12.   Foo: TFoo;
  13. begin
  14.   Foo := nil;
  15.   try
  16.     // calling a virtual method on nil reference raises an Access Violation exception
  17.     Foo.Foo;
  18.   except
  19.     Log.d('CAUGHT');
  20.   end;
  21. end;
  22.  

Embarcadero MVP - Czech republic