<div dir="ltr"><div>Hi All,</div><div><br></div><div>Below code is compiled with clang on raspberry pi2(<span style="font-family:Calibri,sans-serif;font-size:11pt">bcm2836</span>) + freebsd11.0. But it doesn't work well if address from alloca is not 32-bit aligned. I am trying to put down a scenario encountered on a large build system, but I am unable to generate strd with a simple c example so using asm here. This problem is encountered only on strd instruction and not on str. If strd instruction has a alignment requirement why is alloca returning an unaligned memory address(Not telling in the context of this example)? Please help me understand what is the best way to handle this issue.</div><div><br></div><div><div>$ clang -v</div><div>FreeBSD clang version 3.8.0 (tags/RELEASE_380/final 262564) (based on LLVM 3.8.0)</div><div>Target: armv6--freebsd11.0-gnueabihf</div><div>Thread model: posix</div><div>InstalledDir: /usr/bin</div></div><div><br></div><div><div>$ ./a.out</div><div>dst addr = 0xbfbfecaf</div><div>Bus error (core dumped)</div></div><div><br></div><div>But, if the address is 32-bit aligned</div><div><div>$ ./a.out</div><div>dst addr = 0xbfbfecb0</div><div>value = 123456789123456</div></div><div><br></div><div>Regards,</div><div>Karan</div><div><br></div><div>--------- CODE -----------</div><div><div>#include <stdio.h></div><div>#include <stdlib.h></div><div><br></div><div>void test_strd(unsigned long long* addr)</div><div>{</div><div>  unsigned long long value = 0x123456789123456;</div><div>  asm("ldr     r4, [sp, #20];"</div><div>      "ldr     r3, [sp, #12];"</div><div>      "ldr     r2, [sp, #8];"</div><div>      "strd    r2, r3, [r4];");</div><div>}</div><div><br></div><div>/* void test_strd(unsigned long long* addr) */</div><div>/* { */</div><div>/*   unsigned long long value = 0x123456789123456; */</div><div>/*   asm("ldr     r4, [sp, #20];" */</div><div>/*       "ldr     r3, [sp, #12];" */</div><div>/*       "ldr     r2, [sp, #8];" */</div><div>/*       "str     r3, [r4, #4];" */</div><div>/*       "str     r2, [r4];"); */</div><div>/* } */</div><div><br></div><div>int main()</div><div>{</div><div>  alloca(1);</div><div>  /* alloca(1); */</div><div>  /* alloca(1); */</div><div>  /* alloca(1); */</div><div>  unsigned long long *dst = (unsigned long long *)alloca(sizeof(unsigned long long));</div><div>  printf("dst addr = %p\n", (void *)dst);</div><div>  test_strd(dst);</div><div>  printf("value = %llx\n", *dst);</div><div><br></div><div>  return 0;</div><div>}</div></div><div>-------------------------------</div><div><br></div><div>$ cat strd_test.ll<br></div><div><div>; ModuleID = 'strd_test.c'</div><div>target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"</div><div>target triple = "armv6kz--freebsd11.0-gnueabihf"</div><div><br></div><div>@.str = private unnamed_addr constant [15 x i8] c"dst addr = %p\0A\00", align 1</div><div>@.str.1 = private unnamed_addr constant [14 x i8] c"value = %llx\0A\00", align 1</div><div><br></div><div>; Function Attrs: nounwind</div><div>define void @test_strd(i64* %addr) #0 {</div><div>  %1 = alloca i64*, align 4</div><div>  %value = alloca i64, align 8</div><div>  store i64* %addr, i64** %1, align 4</div><div>  store i64 81985529206420566, i64* %value, align 8</div><div>  call void asm sideeffect "ldr     r4, [sp, #20];ldr     r3, [sp, #12];ldr     r2, [sp, #8];strd    r2, r3, [r4];", ""() #2, !srcloc !3</div><div>  ret void</div><div>}</div><div><br></div><div>; Function Attrs: nounwind</div><div>define i32 @main() #0 {</div><div>  %1 = alloca i32, align 4</div><div>  %dst = alloca i64*, align 4</div><div>  store i32 0, i32* %1, align 4</div><div>  %2 = alloca i8</div><div>  %3 = alloca i8, i32 8</div><div>  %4 = bitcast i8* %3 to i64*</div><div>  store i64* %4, i64** %dst, align 4</div><div>  %5 = load i64*, i64** %dst, align 4</div><div>  %6 = bitcast i64* %5 to i8*</div><div>  %7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str, i32 0, i32 0), i8* %6)</div><div>  %8 = load i64*, i64** %dst, align 4</div><div>  call void @test_strd(i64* %8)</div><div>  %9 = load i64*, i64** %dst, align 4</div><div>  %10 = load i64, i64* %9, align 8</div><div>  %11 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.1, i32 0, i32 0), i64 %10)</div><div>  ret i32 0</div><div>}</div></div><div><br></div><div><div>declare i32 @printf(i8*, ...) #1</div><div><br></div><div>attributes #0 = { nounwind "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="arm1176jzf-s" "target-features"="+dsp,+strict-align,+vfp2" "unsafe-fp-math"="false" "use-soft-float"="false" }</div><div>attributes #1 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="arm1176jzf-s" "target-features"="+dsp,+strict-align,+vfp2" "unsafe-fp-math"="false" "use-soft-float"="false" }</div><div>attributes #2 = { nounwind }</div><div><br></div><div>!llvm.module.flags = !{!0, !1}</div><div>!llvm.ident = !{!2}</div><div><br></div><div>!0 = !{i32 1, !"wchar_size", i32 4}</div><div>!1 = !{i32 1, !"min_enum_size", i32 4}</div><div>!2 = !{!"FreeBSD clang version 3.8.0 (tags/RELEASE_380/final 262564) (based on LLVM 3.8.0)"}</div><div>!3 = !{i32 139}</div></div><div>-----------------------------<br></div></div>