<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Hello,<div><br></div><div>  I played with Clang + LLVM 3.1 release on ARM Linux and suspected it is incompatible with GCC. My program works fine while compiled using GCC but will crash with Clang. Specifically, the alignment strategy of Clang confused me. I wrote a small program to print the structure layout of the following and compiled it with both Clang and GCC.</div><div><div><br></div><div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px;">struct S {</font></div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px;">  pthread_mutex_t mutex;</font></div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px;">  pthread_cond_t cond;</font></div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px;">  int32_t int32_1;</font></div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px;">  int32_t int32_2;</font></div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px;">};</font></div></div><div><br></div><div>The output are as following (the format is: <font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 13px;">field_address (+offset): field_name; field_size</span></font>):</div><div><br></div><div>gcc</div><div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px; ">0xbe92d588 (+0) : mutex<span class="Apple-tab-span" style="white-space:pre">         </span>; 24</font></div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px; ">0xbe92d5a0 (+24): cond<span class="Apple-tab-span" style="white-space:pre">               </span>; 48</font></div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px; ">0xbe92d5d0 (+72): int32_1<span class="Apple-tab-span" style="white-space:pre"> </span>; 4</font></div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px; ">0xbe92d5d4 (+76): int32_2<span class="Apple-tab-span" style="white-space:pre">  </span>; 4</font></div></div><div><br></div><div>clang</div><div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px;">0xbe856580 (+0) : mutex<span class="Apple-tab-span" style="white-space:pre">         </span>; 24</font></div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px;">0xbe856598 (+24): cond<span class="Apple-tab-span" style="white-space:pre">             </span>; 48</font></div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px;">0xbe8565d0 (+80): int32_1<span class="Apple-tab-span" style="white-space:pre">  </span>; 4</font></div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px;">0xbe8565d4 (+84): int32_2<span class="Apple-tab-span" style="white-space:pre">   </span>; 4</font></div></div><div><br></div><div>I don't understand the way how Clang aligned <span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 12px; ">int32_1</span>. Why does Clang not align the field to 4 bytes but pad 8 bytes before it?</div><div><br></div><div>The problem is annoying as my program works fine with GCC but will crash with Clang. And I am unable to debug the Clang-compiled version since it is incompatible with GDB as well. I assume Clang should be compatible with GCC since they share the ABI (gnueabihf). Is this a bug in Clang+LLVM or that I did something wrong? Is there a way to get around this problem? Thank you!</div><div><br></div><div>----------------------------------------------------------------------------------------</div><div>Following are the testing environment details</div><div>----------------------------------------------------------------------------------------</div><div>1. Platform: Pandaboard ES (ARM Cortex-A9 + Ubuntu/Linaro Linux 12.04)</div><div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">> uname -a</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">Linux lei-desktop 3.2.0-1412-omap4 #16-Ubuntu SMP PREEMPT Tue Apr 17 19:38:42 UTC 2012 armv7l armv7l armv7l GNU/Linux</span></font></div><div><br></div></div><div>2. LLVM + Clang version 3.1 release, natively built with <font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 13px;">--enable-optimized --target armv7l-unknown-linux-gnueabihf</span></font></div><div><div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px; ">> clang -v</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">clang version 3.1 (branches/release_31)</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">Target: armv7l-unknown-linux-gnueabihf</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">Thread model: posix</span></font></div></div></div><div><br></div><div>3. GCC 4.6.3</div><div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px;">> gcc -v</font></div><div><span class="Apple-style-span" style="font-family: 'Courier New'; font-size: 12px;">Using built-in specs.</span></div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px;">COLLECT_GCC=gcc</font></div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px;">COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wrapper</font></div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px;">Target: arm-linux-gnueabihf</font></div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px;">Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=<a href="file:///usr/share/doc/gcc-4.6/README.Bugs">file:///usr/share/doc/gcc-4.6/README.Bugs</a> --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --enable-multilib --disable-sjlj-exceptions --with-arch=armv7-a --with-float=hard --with-fpu=vfpv3-d16 --with-mode=thumb --disable-werror --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf</font></div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px;">Thread model: posix</font></div><div><font class="Apple-style-span" face="'Courier New'" style="font-size: 12px;">gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) </font></div><div><br></div></div><div>4. Testing program code:</div><div><br></div><div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">#define P(B, F) printf("%p (+%d): %s\n", &B->F,(unsigned int)&B->F - (unsigned int)B, #F);</span></font></div></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;"><br></span></font></div><div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">struct S {</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">  pthread_mutex_t mutex;</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">  pthread_cond_t cond;</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">  int32_t int32_1;</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">  int32_t int32_2;</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">};</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;"><br></span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">void print(struct S *l) {</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">  P(l, mutex);</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">  P(l, cond);</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">  P(l, int32_1);</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">  P(l, int32_2);</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">}</span></font></div></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;"><br></span></font></div><div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">int main() {</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">  struct S s;</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">  print(&s);</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">  return 0;</span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">}</span></font></div><div><br></div></div><div>5. C flags:</div><div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;"><br></span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">gcc:  -mcpu=cortex-a9 -mfloat-abi=hard -mfpu=vfpv3</span></font></div></div><div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;"><br></span></font></div><div><font class="Apple-style-span" face="'Courier New'"><span class="Apple-style-span" style="font-size: 12px;">clang: -mcpu=cortex-a9 -mfloat-abi=hard -mfpu=vfpv3 -ccc-host-triple armv7l-unknown-linux-gnueabihf</span></font></div></div><div><br></div><div>- Lei<br>
<br></div></div></body></html>