[LLVMdev] MC ARM ELF local common variable alignment.

Jason Kim jasonwkim at google.com
Wed Jul 20 10:05:52 PDT 2011


Hi,

Can you please file a bug and Cc me directly on it?
I'll go take a look soon.

Thanks
-jason

On Wed, Jul 20, 2011 at 9:53 AM, TDYa127 <a127a127 at gmail.com> wrote:

> Hi all,
>
> I noticed that the static local variable(internal global in .bc) is
> not aligned in ARM ELF(use MC(-filetype=obj)).
> Then I found that the alignment information is lost at:
> lib/CodeGen/AsmPrinter/AsmPrinter.cpp:316
>    if (MAI->hasLCOMMDirective()) {
>      // .lcomm _foo, 42
>      OutStreamer.EmitLocalCommonSymbol(GVSym, Size);
>      return;
>    }
>
> MCStreamer::EmitLocalCommonSymbol have no parameter about alignment.
>
> Is this issue will cause some problem?
>
>
>
> The original c code:
> ===========test-lcomm.c=========
> #include <stdio.h>
> int main(){
>    static char a;
>    static long long b;
>    static long long c;
>    scanf("%c%lld%lld",&a,&b,&c);
>    printf("%c%lld%lld",a,b,c);
> }
> ================================
>
> I use clang, compile test-lcomm.c to bitcode:
> $ clang test-lcomm.c -ccc-host-triple armv7-none-linux-gnueabi
> -emit-llvm -c -o test-lcomm.bc
>
> bitcode:
> ===test-lcomm.ll===
> ; ModuleID = 'test-lcomm.c'
> target datalayout =
>
> "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"
> target triple = "armv7-none-linux-gnueabi"
>
> @main.a = internal global i8 0, align 1
> @main.b = internal global i64 0, align 8
> @main.c = internal global i64 0, align 8
> @.str = private unnamed_addr constant [11 x i8] c"%c%lld%lld\00", align 1
>
> define i32 @main() nounwind {
> entry:
>  %retval = alloca i32, align 4
>  store i32 0, i32* %retval
>  %call = call i32 (i8*, ...)* @__isoc99_scanf(i8* getelementptr
> inbounds ([11 x i8]* @.str, i32 0, i32 0), i8* @main.a, i64* @main.b,
> i64* @main.c)
>  %tmp = load i8* @main.a, align 1
>  %conv = zext i8 %tmp to i32
>  %tmp1 = load i64* @main.b, align 8
>  %tmp2 = load i64* @main.c, align 8
>  %call3 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds
> ([11 x i8]* @.str, i32 0, i32 0), i32 %conv, i64 %tmp1, i64 %tmp2)
>  %0 = load i32* %retval
>  ret i32 %0
> }
>
> declare i32 @__isoc99_scanf(i8*, ...)
>
> declare i32 @printf(i8*, ...)
> ===================
>
>
> Then, use llc to generate .o :
> $ llc test-lcomm.bc -filetype=obj -O0 -o test-lcomm.o
> And use readelf to print out the symbol table
> $ readelf -s test-lcomm.o
>
> Symbol table '.symtab' contains 14 entries:
>   Num:    Value  Size Type    Bind   Vis      Ndx Name
>     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND
>     1: 00000000     0 FILE    LOCAL  DEFAULT  ABS test-lcomm.bc
>     2: 00000000    11 OBJECT  LOCAL  DEFAULT    6 .L.str
>     3: 00000000     1 OBJECT  LOCAL  DEFAULT    4 main.a
>     4: 00000001     8 OBJECT  LOCAL  DEFAULT    4 main.b
>     5: 00000009     8 OBJECT  LOCAL  DEFAULT    4 main.c
> ...
>
> The variable b, c is not aligned to 8.
>
> (The llvm commit I used is 4c8164813c1be51f6797fda6826bdf3665f2a7d1)
>
>
> Sorry for it being so long.
>
>
> Thanks,
> TDYa127
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110720/8f9b0848/attachment.html>


More information about the llvm-dev mailing list