[LLVMdev] MC ARM ELF local common variable alignment.

TDYa127 a127a127 at gmail.com
Wed Jul 20 09:53:36 PDT 2011


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



More information about the llvm-dev mailing list