[fpc-devel] Where to set proper alignment default of const strings?
Benito van der Zander
benito at benibela.de
Wed Nov 28 20:38:53 CET 2018
Hi Michael,
there was a discussion in this issue
https://bugs.freepascal.org/view.php?id=33323
Cheers,
Benito
Am 28.11.18 um 19:51 schrieb Michael Ring:
>
> The more I dig the more I ask myself if not the rtl routine is to
> blame for the issue in the first place because it only takes alignment
> of the destination into account when doing it's job.
>
> Aligncount is calculated base on destination (which is RAM), for this
> reason the last line always crashes because psrc can be unaligned.
>
> I most likely completely misunderstand the meaning of
> FPC_REQUIRES_PROPER_ALIGNMENT but usually ram can be written byte
> aligned but flash has often limitations on read access so alignment
> should look for psrc as this can come from flash.
>
> Unless of course FPC_REQUIRES_PROPER_ALIGNMENT is primarily meant for
> speed improovement only, then it would make sense to look at pdest to
> try to optimize write performance by having as much aligned access as
> possible.I only found an old discussion in lazarus list from 2011 on
> this topic, where it looks like structs were manually aligned in
> lazarus, but I did not look too deep into the patches.
>
> procedure Move(const source;var dest;count:SizeInt);[public, alias:
> 'FPC_MOVE']; from generic.inc line77:
>
> begin
> { Align on native pointer size }
> --> *aligncount:=(PtrUInt(pdest) and (sizeof(PtrUInt)-1));*
> dec(count,aligncount);
> pend:=psrc+aligncount;
> while psrc<pend do
> begin
> pdest^:=psrc^;
> inc(pdest);
> inc(psrc);
> end;
> { use sizeuint typecast to force shr optimization }
> pptruint(pend):=pptruint(psrc)+(sizeuint(count) div
> sizeof(ptruint));
> while psrc<pend do
> begin
> pptruint(pdest)^:=pptruint(psrc)^;
>
> Am 28.11.18 um 17:49 schrieb Michael Ring:
>> Hi,
>>
>> I am debugging an issue that I see on mipsel embedded target (and
>> perhaps also on arm-embedded for corteX-m0, I had crashes in the same
>> rtl routine a while ago)
>>
>> because RAM is small on embedded devices I use:
>>
>> {$WRITEABLECONST OFF}
>>
>> which means that const are read from flash and not from ram.
>>
>> problem is now that const strings are sometimes not 32-bit aligned
>> and this causes an unaligned access exception on pic32mx because date
>> from flash must be read 32-bit aligned.
>>
>> I thought that I had seen the correct place to configure this
>> alignment in the past but my google/grep foo is weak at the moment, I
>> cannot find something in the fpc sourcecode that rings a bell.
>>
>> {$CODEALIGN CONSTMIN=4}
>>
>> also does not work, I recompiled and in my case the const is still
>> improperly alligned.
>>
>>
>> Thanks in advance,
>>
>>
>> Michael
>>
>>
>>
>> _______________________________________________
>> fpc-devel maillist - fpc-devel at lists.freepascal.org
>> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
>
> _______________________________________________
> fpc-devel maillist - fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20181128/75bbed53/attachment.html>
More information about the fpc-devel
mailing list