<div dir="ltr">Hi Rajesh,<div><br></div><div>Stepan and Manman were changing that part of the code recently, so they can have better answer than I do.</div><div class="gmail_extra"><br><br><div class="gmail_quote">On 18 June 2013 12:26, Rajesh Viswabramana <span dir="ltr"><<a href="mailto:rajesh.vis@samsung.com" target="_blank">rajesh.vis@samsung.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">




<div>
<p><strong>Output on arm :</strong><br></p><p># ./check114.exe <br>values 0x10861, 0x4071706f<br>which is wrong.</p></div></blockquote><div><br></div><div style>This works on my Chromebook, is this soft-float? Can you show us your compilation options and to which target you're compiling to, please?</div>
<div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><p>When the offset(#76) for the instruction, "ldr r1, [r11, #76] ; 0x4c"  is calculated, 4 bytes alignment is considered.<br>
In prologue stackpointer calculation 8 byte alignment is considered. </p>
<p>Due to this mimatch of alignment, If try to access any parameter after byval which results wrong value. </p>
<p>Issue(or offset of 4 bytes) wont occur if even number of register used for byval spilling.<br>ex: <br>struct S114 check114 (int a, struct S114 arg0, struct S114* arg1) { // accessing arg1 is fine in this case<br>.....<br>
}</p></div></blockquote><div style>This looks like a bug. ;)</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>
<p>1) Is this 8 byte alignment mandatory ?  Is this due to " ARM AAPCS 5.2.1.2 Stack constraints at a public interface" ? Can this be removed?<br></p></div></blockquote><div style>I'm not sure what you want removed here. AAPCS should be followed to guarantee compatibility. It looks to me as though the code is considering different constraints in different places, and all we need to do is to match the logic on both places.</div>
<div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><p></p>
<p>2) We will leave alignment as it is but in prologue we will adjust SP once again, this is little meaningless.</p>
<p>3) While accessing arg1 we will consider alignment and add extra offset -> looks better.</p></div></blockquote><div style>I think both are bad fixes, as they don't fix the correct problem. Once the bug is fixed on trunk, can you use trunk LLVM? Or do you have to use a point-version?</div>
<div style><br></div><div style>Anyway, changing your code to work around compiler issues is always a bad idea...</div><div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div>
<p> Offset to access arg1 is calculated by selection DAG that will be target independent. But Alignment adjustment should be done by target lowering. Any suggestions on how to fix this ?</p></div></blockquote><div style>
I'm not too familiar with that part of the code, but Manman or Stepan can give you a hand here.</div><div style><br></div><div style>cheers,</div><div style>--renato</div></div></div></div>