[lazarus] Nasty compiler bug ???
Peter Vreman
peter at freepascal.org
Mon Jan 8 02:28:39 EST 2001
> Hi,
>
> While debugging the recent problems I found somthing wierd. The
> Segmentation fouls in Lazarus is generated in the following piece of code:
>
> procedure SelectGDKPenProps(const DC: HDC);
> begin
> with PDeviceContext(DC)^, CurrentPen^ do
> begin
> gdk_gc_set_foreground(GC, @GDIPenColor);
> .
> .
> .
>
> If you look at the disassembly you notice that about 1.9 GB of stack is
> used for local vars
>
> 0x8074950 <SELECTGDKPENPROPS>: push %ebp
> 0x8074951 <SELECTGDKPENPROPS+1>: mov %esp,%ebp
> 0x8074953 <SELECTGDKPENPROPS+3>: sub $0x72f7000c,%esp
> ^^^^^^^^^^^^^^^^
> A bit to much I quess to hold with1 and with2
>
> 0x8074959 <SELECTGDKPENPROPS+9>: mov 0x8(%ebp),%eax
> 0x807495c <SELECTGDKPENPROPS+12>: mov %eax,0xfffffffc(%ebp)
> 0x807495f <SELECTGDKPENPROPS+15>: mov 0xfffffffc(%ebp),%eax
> 0x8074962 <SELECTGDKPENPROPS+18>: mov 0x1c(%eax),%eax
> 0x8074965 <SELECTGDKPENPROPS+21>: mov %eax,0xfffffff8(%ebp)
> 0x8074968 <SELECTGDKPENPROPS+24>: mov 0xfffffff8(%ebp),%eax
> 0x807496b <SELECTGDKPENPROPS+27>: lea 0x4(%eax),%eax
> 0x807496e <SELECTGDKPENPROPS+30>: push %eax
> ^^^^^^^^^^^^^
> Causes segfault since stack is invalid.
>
> 0x807496f <SELECTGDKPENPROPS+31>: mov 0xfffffffc(%ebp),%eax
> 0x8074972 <SELECTGDKPENPROPS+34>: pushl 0x4(%eax)
> 0x8074975 <SELECTGDKPENPROPS+37>: call 0x804e484 <gdk_gc_set_foreground>
>
> To check if this was compiler related I put all needed structs in one
> program, called the same piece of code and this version disassembed to:
>
> 0x80542f0 <SELECTGDKPENPROPS>: push %ebp
> 0x80542f1 <SELECTGDKPENPROPS+1>: mov %esp,%ebp
> 0x80542f3 <SELECTGDKPENPROPS+3>: sub $0x8,%esp
> ^^^^^^^^^
> Seems reasonable hold with1 and with2
>
> 0x80542f6 <SELECTGDKPENPROPS+6>: mov 0x8(%ebp),%eax
> 0x80542f9 <SELECTGDKPENPROPS+9>: mov %eax,0xfffffffc(%ebp)
> 0x80542fc <SELECTGDKPENPROPS+12>: mov 0xfffffffc(%ebp),%eax
> 0x80542ff <SELECTGDKPENPROPS+15>: mov 0x1c(%eax),%eax
> 0x8054302 <SELECTGDKPENPROPS+18>: mov %eax,0xfffffff8(%ebp)
> 0x8054305 <SELECTGDKPENPROPS+21>: mov 0xfffffff8(%ebp),%eax
> 0x8054308 <SELECTGDKPENPROPS+24>: lea 0x4(%eax),%eax
> 0x805430b <SELECTGDKPENPROPS+27>: push %eax
> 0x805430c <SELECTGDKPENPROPS+28>: mov 0xfffffffc(%ebp),%eax
> 0x805430f <SELECTGDKPENPROPS+31>: pushl 0x4(%eax)
> 0x8054312 <SELECTGDKPENPROPS+34>: call 0x8048af8 <gdk_gc_set_foreground>
>
>
> And that was something you would expect. So my question... what to do about it.
>
1. If compiling with optimization, try to turn it off (-O- on the commandline)
2. Try to remove the 'with' construct
More information about the Lazarus
mailing list