<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<p>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.</p>
<p>Aligncount is calculated base on destination (which is RAM), for
this reason the last line always crashes because psrc can be
unaligned.</p>
<p>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. <br>
</p>
<p>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.<br>
</p>
<p>procedure Move(const source;var dest;count:SizeInt);[public,
alias: 'FPC_MOVE']; from generic.inc line77: <br>
</p>
<p> begin<br>
{ Align on native pointer size }<br>
--> <b>aligncount:=(PtrUInt(pdest) and
(sizeof(PtrUInt)-1));</b><br>
dec(count,aligncount);<br>
pend:=psrc+aligncount;<br>
while psrc<pend do<br>
begin<br>
pdest^:=psrc^;<br>
inc(pdest);<br>
inc(psrc);<br>
end;<br>
{ use sizeuint typecast to force shr optimization }<br>
pptruint(pend):=pptruint(psrc)+(sizeuint(count) div
sizeof(ptruint));<br>
while psrc<pend do<br>
begin<br>
pptruint(pdest)^:=pptruint(psrc)^;<br>
<br>
</p>
<div class="moz-cite-prefix">Am 28.11.18 um 17:49 schrieb Michael
Ring:<br>
</div>
<blockquote type="cite"
cite="mid:dbacdcac-6122-a87e-800a-1973a5eb18a8@michael-ring.org">Hi,
<br>
<br>
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)
<br>
<br>
because RAM is small on embedded devices I use:
<br>
<br>
{$WRITEABLECONST OFF}
<br>
<br>
which means that const are read from flash and not from ram.
<br>
<br>
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.
<br>
<br>
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.
<br>
<br>
{$CODEALIGN CONSTMIN=4}
<br>
<br>
also does not work, I recompiled and in my case the const is still
improperly alligned.
<br>
<br>
<br>
Thanks in advance,
<br>
<br>
<br>
Michael
<br>
<br>
<br>
<br>
_______________________________________________
<br>
fpc-devel maillist - <a class="moz-txt-link-abbreviated" href="mailto:fpc-devel@lists.freepascal.org">fpc-devel@lists.freepascal.org</a>
<br>
<a class="moz-txt-link-freetext" href="http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel">http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel</a>
<br>
</blockquote>
</body>
</html>