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
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>
Already filed; http://llvm.org/bugs/show_bug.cgi?id=10128 . -Eli On Wed, Jul 20, 2011 at 10:05 AM, Jason Kim <jasonwkim at google.com> wrote:> > 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 > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >
Reasonably Related Threads
- [LLVMdev] MC ARM ELF local common variable alignment.
- [LLVMdev] Patch - SPU bss alignment
- [PATCH] drm/nouveau/fb/gf100-: Fix 32 bit wraparound in new ram detection
- Is there a reason why MCAsmStreamer class doesn't have its own .h file?
- [LLVMdev] RFC: -fwritable-strings Change