<br>Hi,<div><br></div><div>Can you please file a bug and Cc me directly on it?</div><div>I'll go take a look soon.</div><div><br></div><div>Thanks</div><div>-jason</div><div><br><div class="gmail_quote">On Wed, Jul 20, 2011 at 9:53 AM, TDYa127 <span dir="ltr"><<a href="mailto:a127a127@gmail.com">a127a127@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Hi all,<br>
<br>
I noticed that the static local variable(internal global in .bc) is<br>
not aligned in ARM ELF(use MC(-filetype=obj)).<br>
Then I found that the alignment information is lost at:<br>
lib/CodeGen/AsmPrinter/AsmPrinter.cpp:316<br>
    if (MAI->hasLCOMMDirective()) {<br>
      // .lcomm _foo, 42<br>
      OutStreamer.EmitLocalCommonSymbol(GVSym, Size);<br>
      return;<br>
    }<br>
<br>
MCStreamer::EmitLocalCommonSymbol have no parameter about alignment.<br>
<br>
Is this issue will cause some problem?<br>
<br>
<br>
<br>
The original c code:<br>
===========test-lcomm.c=========<br>
#include <stdio.h><br>
int main(){<br>
    static char a;<br>
    static long long b;<br>
    static long long c;<br>
    scanf("%c%lld%lld",&a,&b,&c);<br>
    printf("%c%lld%lld",a,b,c);<br>
}<br>
================================<br>
<br>
I use clang, compile test-lcomm.c to bitcode:<br>
$ clang test-lcomm.c -ccc-host-triple armv7-none-linux-gnueabi<br>
-emit-llvm -c -o test-lcomm.bc<br>
<br>
bitcode:<br>
===test-lcomm.ll===<br>
; ModuleID = 'test-lcomm.c'<br>
target datalayout =<br>
"e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:64:128-a0:0:64-n32"<br>
target triple = "armv7-none-linux-gnueabi"<br>
<br>
@main.a = internal global i8 0, align 1<br>
@main.b = internal global i64 0, align 8<br>
@main.c = internal global i64 0, align 8<br>
@.str = private unnamed_addr constant [11 x i8] c"%c%lld%lld\00", align 1<br>
<br>
define i32 @main() nounwind {<br>
entry:<br>
  %retval = alloca i32, align 4<br>
  store i32 0, i32* %retval<br>
  %call = call i32 (i8*, ...)* @__isoc99_scanf(i8* getelementptr<br>
inbounds ([11 x i8]* @.str, i32 0, i32 0), i8* @main.a, i64* @main.b,<br>
i64* @main.c)<br>
  %tmp = load i8* @main.a, align 1<br>
  %conv = zext i8 %tmp to i32<br>
  %tmp1 = load i64* @main.b, align 8<br>
  %tmp2 = load i64* @main.c, align 8<br>
  %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds<br>
([11 x i8]* @.str, i32 0, i32 0), i32 %conv, i64 %tmp1, i64 %tmp2)<br>
  %0 = load i32* %retval<br>
  ret i32 %0<br>
}<br>
<br>
declare i32 @__isoc99_scanf(i8*, ...)<br>
<br>
declare i32 @printf(i8*, ...)<br>
===================<br>
<br>
<br>
Then, use llc to generate .o :<br>
$ llc test-lcomm.bc -filetype=obj -O0 -o test-lcomm.o<br>
And use readelf to print out the symbol table<br>
$ readelf -s test-lcomm.o<br>
<br>
Symbol table '.symtab' contains 14 entries:<br>
   Num:    Value  Size Type    Bind   Vis      Ndx Name<br>
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND<br>
     1: 00000000     0 FILE    LOCAL  DEFAULT  ABS test-lcomm.bc<br>
     2: 00000000    11 OBJECT  LOCAL  DEFAULT    6 .L.str<br>
     3: 00000000     1 OBJECT  LOCAL  DEFAULT    4 main.a<br>
     4: 00000001     8 OBJECT  LOCAL  DEFAULT    4 main.b<br>
     5: 00000009     8 OBJECT  LOCAL  DEFAULT    4 main.c<br>
...<br>
<br>
The variable b, c is not aligned to 8.<br>
<br>
(The llvm commit I used is 4c8164813c1be51f6797fda6826bdf3665f2a7d1)<br>
<br>
<br>
Sorry for it being so long.<br>
<br>
<br>
Thanks,<br>
<font color="#888888">TDYa127<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
</font></blockquote></div><br></div>