Hi All,
Below code is compiled with clang on raspberry pi2(bcm2836) + 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.
$ clang -v
FreeBSD clang version 3.8.0 (tags/RELEASE_380/final 262564) (based on LLVM 3.8.0)
Target: armv6–freebsd11.0-gnueabihf
Thread model: posix
InstalledDir: /usr/bin
$ ./a.out
dst addr = 0xbfbfecaf
Bus error (core dumped)
But, if the address is 32-bit aligned
$ ./a.out
dst addr = 0xbfbfecb0
value = 123456789123456
Regards,
Karan
--------- CODE -----------
#include <stdio.h>
#include <stdlib.h>
void test_strd(unsigned long long* addr)
{
unsigned long long value = 0x123456789123456;
asm(“ldr r4, [sp, #20];”
“ldr r3, [sp, #12];”
“ldr r2, [sp, #8];”
“strd r2, r3, [r4];”);
}
/* void test_strd(unsigned long long* addr) /
/ { /
/ unsigned long long value = 0x123456789123456; /
/ asm(“ldr r4, [sp, #20];” /
/ “ldr r3, [sp, #12];” /
/ “ldr r2, [sp, #8];” /
/ “str r3, [r4, #4];” /
/ “str r2, [r4];”); /
/ } */
int main()
{
alloca(1);
/* alloca(1); /
/ alloca(1); /
/ alloca(1); */
unsigned long long *dst = (unsigned long long *)alloca(sizeof(unsigned long long));
printf(“dst addr = %p\n”, (void *)dst);
test_strd(dst);
printf(“value = %llx\n”, *dst);
return 0;
}