[fpc-pascal] CLX for FPC + Bug i386 cdecl
Den Jean
Den.Jean at telenet.be
Wed Mar 9 06:30:47 CET 2005
Hi,
We are porting CLX to FPC. You can see a first snapshot here:
http://sourceforge.net/project/screenshots.php?group_id=116605
The use of the BitBtn shows that we dealt with {$R QButtons.res}
The code will be available at:
http://sourceforge.net/projects/qtforfpc/
There is still alot of work to do, diffs are welcome.
The FPC Wiki shows someone else is busy at it too,
any cooperation would be great.
By the way thx for the many updates to the rtl,
it is much easier than back in July when I first tried this.
Also thx for renaming rtlconst(s) just after I had already replaced it
everywhere :-)
BTW, our aim is to be able to kinda just recompile Kylix programs
if ever we encounter problems with dcc on newer distributions.
Some programs that have some qt dependencies, just cannot
be ported that easy to LCL (yet). New programs should ofcourse
use the lazarus/LCL and profit of its nice form editor.
We will try to convert the xfm files with lazres after
some further study of the classes unit
i386 FPC CDecl Bug encountered:
=================
When using libqtintf we call c-code and get called by c-code.
For eg c-code calls this function in BindHelp.pas
function GetPointsLength(const PA: TPointArray): Integer; cdecl; export;
But with FPC this call fails. The way 'const TPointArray' is passed on the
stack seems not ABI correct. I am an ABI analphabet, but I guess the address
of the points should be on EBP+8 so the following test program tests this.
With Kylix (dcc) it works and with FPC it fails.
=====================================
== Output of both compilers ==
=====================================
[jan at home]$ dcc TestPointArray
writeln('end of program');
[jan at home]$ dcc -q TestPointArray ; ./TestPointArray
Borland Delphi for Linux Version 14.5
Copyright (c) 1983,2002 Borland Software Corporation
59 lines, 0.03 seconds, 137636 bytes code, 7204 bytes data.
GetPointsLength 1:
Length:3
GetPointsLength 2:
Length:3
[jan at home]$ ppc386 -Sd -v0 TestPointArray.pas ; ./TestPointArray
Free Pascal Compiler version 1.9.9 [2005/03/08] for i386
Copyright (c) 1993-2005 by Florian Klaempfl
GetPointsLength 1:
Length:3
GetPointsLength 2:
Oooops:i<>p
Length:3
=====================================
== Test Program: ==
=====================================
program TestPointArray;
{$H+}
uses
Classes, SysUtils, Types;
type
PPointArray = ^TPointArray;
TPointArray = array of TPoint;
var
Points : TPointArray;
p : PPointArray;
i : integer;
function GetPointsLength1 (PA: pointer): Integer; cdecl;
begin
asm
mov EAX,[EBP+$08]
mov i,eax
end;
writeln('GetPointsLength 1:');
if i <> integer (p) then writeln (' Oooops:i<>p');
if integer(PA) <> integer (p) then writeln (' Oooops:PA<>p');
Result:=Length(TPointArray(PA));
writeln(' Length:',Result);
end;
{$IFDEF FPC}
{$asmmode intel}
{$ENDIF}
function GetPointsLength2 (const PA: TPointArray): Integer; cdecl;
begin
asm
mov EAX,[EBP+$08]
mov i,eax
end;
writeln('GetPointsLength 2:');
if i <> integer (p) then writeln (' Oooops:i<>p');
if integer(PA) <> integer (p) then writeln (' Oooops:PA<>p');
Result:=Length(PA);
writeln(' Length:',Result);
end;
begin
SetLength (Points, 3);
Points [0] := Point (1,2);
Points [1] := Point (3,4);
Points [2] := Point (5,6);
p:=@Points[0];
getPointsLength1(Points);
getPointsLength2(Points);
end.
===========================
kind regards,
Den Jean
More information about the fpc-pascal
mailing list