[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