[fpc-devel] wrong results of function "align"
Burkhard Carstens
fpc at bcsoft.de
Sun Jul 2 16:03:26 CEST 2006
fpc-2.1.1 r4075
linux-i386
If I understand the purpose of function align
(rtl/inc/{systemh.inc,generic.inc}) correctly, it gives wrong results
when used with pointers > $8000000.
Align uses ptrint. Using ptrUint instead works.
I tried using it to align a array to 4k bounds, like this:
p:=getmem(MyAry,sizeof(MyAry)+4096); p:=align(p,4096);
IMO align($80000001,$1000) should give $80001000, but gives $80002000.
Attached is a testcase and a patch.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: fixalign.patch
Type: text/x-diff
Size: 1889 bytes
Desc: not available
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20060702/8c4ab42c/attachment.patch>
-------------- next part --------------
program writeroundtest;
{$mode objfpc}{$H+}
var
ap1,ap2 : pointer;
function UINTalign(addr : Pointer;alignment : PtrUInt) : Pointer;
begin
if PtrUInt(addr) mod alignment<>0 then
result:=pointer(addr+(alignment-(PtrUInt(addr) mod alignment)))
else
result:=addr;
end;
begin
ap1:=pointer($70000001);
ap2:=pointer($80000001);
writeln(hexstr(ap1),' --> ',hexstr(align(ap1,$1000)));
writeln(hexstr(ap2),' --> ',hexstr(align(ap2,$1000)));
writeln(hexstr(ap2),' --> ',hexstr(UINTalign(ap2,$1000)));
end.
More information about the fpc-devel
mailing list