<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
span.pln1
        {mso-style-name:pln1;
        color:#303336;}
span.pun1
        {mso-style-name:pun1;
        color:#303336;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="EN-GB" link="blue" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">Well I can workaround by marking the method with:</p>
<p class="MsoNormal"><span class="pln1"><span style="background:#EFF0F1">__attribute__
</span></span><span class="pun1"><span style="background:#EFF0F1">((</span></span><span class="pln1"><span style="background:#EFF0F1">optnone</span></span><span class="pun1"><span style="background:#EFF0F1">))<o:p></o:p></span></span></p>
<p class="MsoNormal"><span class="pun1"><span style="background:#EFF0F1"><o:p> </o:p></span></span></p>
<p class="MsoNormal"><span class="pun1"><span style="background:#EFF0F1">I would expect code that compiles with no optimizations to work with optimizations on clang. (if it were bug free
</span></span><span class="pun1"><span style="font-family:"Segoe UI Emoji",sans-serif;background:#EFF0F1">😉</span><span style="background:#EFF0F1">)<o:p></o:p></span></span></p>
<p class="MsoNormal"><span class="pun1"><span style="background:#EFF0F1"><o:p> </o:p></span></span></p>
<p class="MsoNormal"><span class="pun1"><span style="background:#EFF0F1">Also this bug also shows up if you use uint32 so not limited to floats.<o:p></o:p></span></span></p>
<p class="MsoNormal"><span class="pun1"><span style="background:#EFF0F1"><o:p> </o:p></span></span></p>
<p class="MsoNormal">So its not currently possible to read a uint32 value from a buffer at an unaligned position. This should work shouldn’t it?</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The issue is with using VLDR instruction.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thanks</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Dan</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Sent from <a href="https://go.microsoft.com/fwlink/?LinkId=550986">
Mail</a> for Windows 10</p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="mso-element:para-border-div;border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm">
<p class="MsoNormal" style="border:none;padding:0cm"><b>From: </b><a href="mailto:mats@planetcatfish.com">mats petersson</a><br>
<b>Sent: </b>10 August 2017 15:21<br>
<b>To: </b><a href="mailto:dan@walms.co.uk">Dan Walmsley</a><br>
<b>Cc: </b><a href="mailto:hans@chromium.org">Hans Wennborg</a>; <a href="mailto:cfe-dev@lists.llvm.org">
cfe-dev@lists.llvm.org</a><br>
<b>Subject: </b>Re: [cfe-dev] Cortex-M4F Assembly Code Generation Incorrect for float casting, causing HardFaults</p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Does the C and C++ standards not state that loading a value from an unaligned addres (e.g. float from an address not aligned to 4) is undefined behaviour?<o:p></o:p></p>
<div>
<p class="MsoNormal">I'm not saying SO is the definitive reference for this, but it would seem like it says so, with a reference to the spec:
<br>
<a href="https://stackoverflow.com/questions/28893303/is-a-misaligned-load-due-to-a-cast-undefined-behavior">https://stackoverflow.com/questions/28893303/is-a-misaligned-load-due-to-a-cast-undefined-behavior</a><o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="margin-bottom:12.0pt">Whilst it may well be that this "works" on some archiectures (particularly x86), I do believe it's perfectly valid to produce code that assumes aligned data.<o:p></o:p></p>
<div>
<p class="MsoNormal">Or am I missing something on the subject?<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">--<o:p></o:p></p>
</div>
<p class="MsoNormal">Mats<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On 10 August 2017 at 14:50, Dan Walmsley via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>> wrote:<o:p></o:p></p>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<div>
<div id="m_-3693839330198491667divtagdefaultwrapper">
<p><span style="font-size:12.0pt;color:black">If have filed a bug here:<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
<p><span style="font-size:12.0pt;color:black"><a href="https://bugs.llvm.org/show_bug.cgi?id=34143" target="_blank">https://bugs.llvm.org/show_bug.cgi?id=34143</a><o:p></o:p></span></p>
</div>
<p class="MsoNormal"><img border="0" width="688" height="2" style="width:7.1666in;height:.0208in" id="Horizontal_x0020_Line_x0020_1" src="cid:image002.png@01D311EC.F444CCE0"><o:p></o:p></p>
<div id="m_-3693839330198491667divRplyFwdMsg">
<p class="MsoNormal"><b><span style="color:black">From:</span></b><span style="color:black"> cfe-dev <<a href="mailto:cfe-dev-bounces@lists.llvm.org" target="_blank">cfe-dev-bounces@lists.llvm.org</a>> on behalf of Dan Walmsley via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>><br>
<b>Sent:</b> 10 August 2017 13:41:39<br>
<b>To:</b> <a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>; Hans Wennborg<br>
<b>Subject:</b> [cfe-dev] Cortex-M4F Assembly Code Generation Incorrect for float casting, causing HardFaults</span>
<o:p></o:p></p>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
</div>
<div>
<div>
<div>
<div id="m_-3693839330198491667divtagdefaultwrapper">
<div id="m_-3693839330198491667divtagdefaultwrapper">
<p><span style="font-size:12.0pt;color:black">Basically the following code can repro the issue:<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
<p><span style="font-size:12.0pt;color:black">Compile flags are:<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">Wall -c -fshort-enums -ggdb3 -std=c++14 -fno-rtti -fno-exceptions -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -O1 -target arm-none-eabi -mcpu=cortex-m4
 -mthumb <o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
<p><span style="font-size:12.0pt;color:black">code to reproduce is:<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
<p><span style="font-size:12.0pt;color:black">```<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">template <typename T> inline T Read (uint8_t* data)<br>
{<br>
    auto valuePtr = reinterpret_cast<T*> (data);<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">    auto value = *valuePtr;<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">    return value;<br>
}<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">static float test = 180.0f;<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">int main (void)<br>
{<br>
    uint8_t* data = new uint8_t[8];<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">    memcpy (data, &test, sizeof (float));<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">    auto value = Read<float> (data);<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
<p><span style="font-size:12.0pt;color:black">    memcpy (data + 1, &test, sizeof (float));<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">    value = Read<float> (data + 1); // hard fault here!<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">    return value;<br>
}<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black">```<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
<p><span style="font-size:12.0pt;color:black">My diagnosis is that when it dereferences the float pointer it uses the VLDR instruction, <a href="https://developer.arm.com/docs/100069/0607/advanced-simd-instructions-32-bit/vldr" target="_blank">https://developer.arm.com/docs/100069/0607/advanced-simd-instructions-32-bit/vldr</a><o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
<p><span style="font-size:12.0pt;color:black">This instruction can only be used on word aligned boundaries.<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
<p><span style="font-size:12.0pt;color:black">So It works for first call to my Read method, but the second call which is not aligned, it crashes.<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
<p><span style="font-size:12.0pt;color:black">Not sure who is the right person to fix this.<o:p></o:p></span></p>
<p><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
<p><span style="font-size:12.0pt;color:black">I will reply with  a bug, once I manage to login to the bug database.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">Thanks<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:12.0pt;color:black">Dan<o:p></o:p></span></p>
</div>
<p><span style="font-size:12.0pt;color:black"><o:p> </o:p></span></p>
</div>
</div>
</div>
</div>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><o:p></o:p></p>
</blockquote>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>