【发布时间】:2017-01-06 18:01:54
【问题描述】:
假设我有一个 c 的基本程序,我用 clang 编译它,如下所示:
#include "stdio.h"
int x = 0x7FFFFFFF;
int main(void)
{
printf("%d\n",x);
}
用clang -emit-llvm temp.c -fno-rtti -O3 -S 编译它会产生以下位码:
; ModuleID = 'temp.c'
target datalayout = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"
target triple = "i686-pc-linux-gnu"
@x = global i32 2147483647, align 4
@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1
; Function Attrs: nounwind
define i32 @main() #0 {
entry:
%0 = load i32, i32* @x, align 4, !tbaa !1
%call = tail call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i32 0, i32 0), i32 %0) #1
ret i32 0
}
; Function Attrs: nounwind
declare i32 @printf(i8* nocapture readonly, ...) #0
attributes #0 = { nounwind "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="pentium4" "target-features"="+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { nounwind }
!llvm.ident = !{!0}
!0 = !{!"clang version 3.7.1 "}
!1 = !{!2, !2, i64 0}
!2 = !{!"int", !3, i64 0}
!3 = !{!"omnipotent char", !4, i64 0}
!4 = !{!"Simple C/C++ TBAA"}
现在我真正的问题是关于引用变量x 的行。如果您注意到,x 似乎被声明为对齐变量(它与 4 对齐)。
clang 怎么知道ints 应该对齐?我的主张是,clang 对任何变量的对齐方式一无所知,因为这取决于您使用的后端。例如,我可以为 8 位机器使用后端,那么它根本不需要对齐。
所以我的问题是:为什么铿锵会猜测对齐,因为它确实不可能?
【问题讨论】:
-
不知道是因为
target triple = "i686-pc-linux-gnu"吗? -
您下载了特定拱门的 clang 版本....
-
@NathanOliver 这可能......我什至没有看到......
-
编译器将为它所在的平台编译它,除非您指定不同的 AFAIK。
-
@DarthRubik looks like 可能。
标签: c++ c alignment clang llvm