[fpc-pascal] ARM Linux crosscompiler: compiles but... executable gives segmentation fault

Jeppe Græsdal Johansen jeppe at j-software.dk
Tue Jan 14 20:29:04 CET 2014


Should be fixed now. The cpupi code estimated that it needed a copy of 
the TGPIO_Registers record on the stack even though it was passed by 
reference :)

Den 14-01-2014 09:47, Michael Ring skrev:
> I have boiled down my problem to this democode. The problem is in the 
> begin line of set Direction. The sp gets moved to 0x0fff8f94 which is 
> unititialized Space before RAM.
>
> The Reason is that the offset for the local var .Lj9 (.long -32840) is 
> plain wrong. It might be me doing something strange (Setting the 
> record to absolute) but this works fine on armv7m.
>
> Jeppe, could you perhaps have a look, I compared with armv7m code and 
> there the whole handling of local vars seems to work totally different.
>
> I am doing something unusual here, so another conclusion is that my 
> problem is most likely not related to the segfault described, sorry 
> for messing this thread up.
>
> Michael
>
> program hello;
> {$mode objfpc}
> {$modeswitch advancedrecords}
>
> type
>   TGPIO_Bit = 0..11;
>   TGPIO_Direction = (GPIO_Input, GPIO_Output);
> type
>   TGPIO_Registers = record
>     MASKED_ACCESS: array [0 .. 4095] of longword;
>     RESERVED1    : array [0 .. 4095] of longword;
>     DIR          : longword;
>     &IS           : longword;
>     IBE          : longword;
>     IEV          : longword;
>     IE           : longword;
>     RIS          : longword;
>     MIS          : longword;
>     IC           : longword;
>     procedure setDirection(bit : TGPIO_Bit; direction : TGPIO_Direction);
>   end;
>
> const
>   LPC_AHB_BASE   = $50000000;
>   LPC_GPIO0_BASE = (LPC_AHB_BASE + $00000);
>
> var
>   GPIO0 : TGPIO_Registers absolute(LPC_GPIO0_BASE);
>
> procedure TGPIO_Registers.setDirection(bit : TGPIO_Bit; direction : 
> TGPIO_Direction);
> begin
>   DIR := DIR and (not (1 shl bit)) or (longWord(direction) shl bit);
> end;
>
> var
>   i : integer;
> begin
>   i := 0;
>   GPIO0.setDirection(i,GPIO_Output);
> end.
>
>
> Am 13.01.14 15:39, schrieb Michael Ring:
>> I guess not, when I remember correctly this has already been repaired 
>> for armv6m. The problem for me is that .Lj9 is defined as a negative 
>> number. As a consequence r13 points to nirvana and
>>
>> str     r0,[r13, #8] creates an Exception.
>>
>>
>> # [87] begin
>>         push    {r4,r14}
>>         ldr     r4,.Lj9
>>         add     r13,r13,r4
>> # Var bit located at r13+0
>> # Var direction located at r13+4
>> # Var $self located at r13+8
>>         str     r0,[r13, #8]
>>         strb    r1,[r13]
>>         str     r2,[r13, #4]
>> .Ll2:
>>
>> .....
>>
>> .Lj9:
>>         .long   -32840
>> .Lj7:
>>         .long   32768
>> .Lj10:
>>         .long   32840
>> .Lt2:
>>
>> Am 13.01.14 15:15, schrieb Jeppe Græsdal Johansen:
>>> Might be related to the mla/mls optimization which somehow has been 
>>> enabled even though it's still broken
>>>
>>> ----- Reply message -----
>>> Fra: "Reinier Olislagers" <reinierolislagers at gmail.com>
>>> Dato: man., jan. 13, 2014 13:44
>>> Emne: [fpc-pascal] ARM Linux crosscompiler: compiles but... 
>>> executable gives segmentation fault
>>> Til: <fpc-pascal at lists.freepascal.org>
>>>
>>> On 13/01/2014 12:34, Michael Ring wrote:
>>> > I had a look at armv6m yesterday evening, parts of my code run fine in
>>> > gdb, the code crashes in the init of a procedure when trying to 
>>> prepare
>>> > the access to contents of a set.
>>> > The address of the set seems to get calculated totally wrong ending up
>>> > in a memory access at the end of the chip's address range.
>>> > Not sure if this is related to your problem, I will try to boil 
>>> down the
>>> > example to a bare minimum to see where the generated code differs
>>> > between armv7m and armv6m.
>>>
>>> Thanks a lot, Michael!
>>>
>>> _______________________________________________
>>> fpc-pascal maillist  - fpc-pascal at lists.freepascal.org
>>> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> fpc-pascal maillist  -fpc-pascal at lists.freepascal.org
>>> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
>>
>>
>>
>> _______________________________________________
>> fpc-pascal maillist  -fpc-pascal at lists.freepascal.org
>> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
>
>
>
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20140114/8f75e2cc/attachment.html>


More information about the fpc-pascal mailing list