aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2010-08-21 04:20:22 +0000
committerDaniel Dunbar <daniel@zuster.org>2010-08-21 04:20:22 +0000
commit983e3d7dac99aed376939f1a4daadef98e09c3b9 (patch)
treece7e6406c00ad475228c938c983121b5f3b436cb /lib/CodeGen
parentf2c737c5b89e5ba3e2a64595930ab894df206bd2 (diff)
IRgen: Set the alignment correctly when creating LValue for a decls.
- Fixes PR5598. - Review appreciated. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111726 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/CGExpr.cpp24
-rw-r--r--lib/CodeGen/CodeGenFunction.h4
2 files changed, 17 insertions, 11 deletions
diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp
index 8cc548048d..cbe19825f9 100644
--- a/lib/CodeGen/CGExpr.cpp
+++ b/lib/CodeGen/CGExpr.cpp
@@ -1118,7 +1118,8 @@ static LValue EmitGlobalVarDeclLValue(CodeGenFunction &CGF,
llvm::Value *V = CGF.CGM.GetAddrOfGlobalVar(VD);
if (VD->getType()->isReferenceType())
V = CGF.Builder.CreateLoad(V, "tmp");
- LValue LV = CGF.MakeAddrLValue(V, E->getType());
+ unsigned Alignment = CGF.getContext().getDeclAlign(VD).getQuantity();
+ LValue LV = CGF.MakeAddrLValue(V, E->getType(), Alignment);
setObjCGCLValueClass(CGF.getContext(), E, LV);
return LV;
}
@@ -1138,17 +1139,18 @@ static LValue EmitFunctionDeclLValue(CodeGenFunction &CGF,
V = CGF.Builder.CreateBitCast(V, CGF.ConvertType(NoProtoType), "tmp");
}
}
- return CGF.MakeAddrLValue(V, E->getType());
+ unsigned Alignment = CGF.getContext().getDeclAlign(FD).getQuantity();
+ return CGF.MakeAddrLValue(V, E->getType(), Alignment);
}
LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
const NamedDecl *ND = E->getDecl();
+ unsigned Alignment = CGF.getContext().getDeclAlign(ND).getQuantity();
if (ND->hasAttr<WeakRefAttr>()) {
const ValueDecl* VD = cast<ValueDecl>(ND);
llvm::Constant *Aliasee = CGM.GetWeakRefReference(VD);
-
- return MakeAddrLValue(Aliasee, E->getType());
+ return MakeAddrLValue(Aliasee, E->getType(), Alignment);
}
if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
@@ -1174,7 +1176,7 @@ LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
if (VD->getType()->isReferenceType())
V = Builder.CreateLoad(V, "tmp");
- LValue LV = MakeAddrLValue(V, E->getType());
+ LValue LV = MakeAddrLValue(V, E->getType(), Alignment);
if (NonGCable) {
LV.getQuals().removeObjCGCAttr();
LV.setNonGC(true);
@@ -1190,7 +1192,7 @@ LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
if (E->getQualifier()) {
const FieldDecl *FD = cast<FieldDecl>(ND);
llvm::Value *V = CGM.EmitPointerToDataMember(FD);
- return MakeAddrLValue(V, FD->getType());
+ return MakeAddrLValue(V, FD->getType(), Alignment);
}
assert(false && "Unhandled DeclRefExpr");
@@ -1201,7 +1203,9 @@ LValue CodeGenFunction::EmitDeclRefLValue(const DeclRefExpr *E) {
}
LValue CodeGenFunction::EmitBlockDeclRefLValue(const BlockDeclRefExpr *E) {
- return MakeAddrLValue(GetAddrOfBlockDecl(E), E->getType());
+ unsigned Alignment =
+ CGF.getContext().getDeclAlign(E->getDecl()).getQuantity();
+ return MakeAddrLValue(GetAddrOfBlockDecl(E), E->getType(), Alignment);
}
LValue CodeGenFunction::EmitUnaryOpLValue(const UnaryOperator *E) {
@@ -1637,7 +1641,8 @@ LValue CodeGenFunction::EmitLValueForField(llvm::Value* BaseValue,
if (Field->getType()->isReferenceType())
V = Builder.CreateLoad(V, "tmp");
- LValue LV = MakeAddrLValue(V, Field->getType());
+ unsigned Alignment = getContext().getDeclAlign(Field).getQuantity();
+ LValue LV = MakeAddrLValue(V, Field->getType(), Alignment);
LV.getQuals().addCVRQualifiers(CVRQualifiers);
// __weak attribute on a field is ignored.
@@ -1663,7 +1668,8 @@ CodeGenFunction::EmitLValueForFieldInitialization(llvm::Value* BaseValue,
assert(!FieldType.getObjCGCAttr() && "fields cannot have GC attrs");
- return MakeAddrLValue(V, FieldType);
+ unsigned Alignment = getContext().getDeclAlign(Field).getQuantity();
+ return MakeAddrLValue(V, FieldType, Alignment);
}
LValue CodeGenFunction::EmitCompoundLiteralLValue(const CompoundLiteralExpr* E){
diff --git a/lib/CodeGen/CodeGenFunction.h b/lib/CodeGen/CodeGenFunction.h
index 603d309e63..f54a0113e7 100644
--- a/lib/CodeGen/CodeGenFunction.h
+++ b/lib/CodeGen/CodeGenFunction.h
@@ -969,8 +969,8 @@ public:
// Helpers
//===--------------------------------------------------------------------===//
- LValue MakeAddrLValue(llvm::Value *V, QualType T) {
- return LValue::MakeAddr(V, T, 0, getContext());
+ LValue MakeAddrLValue(llvm::Value *V, QualType T, unsigned Alignment = 0) {
+ return LValue::MakeAddr(V, T, Alignment, getContext());
}
/// CreateTempAlloca - This creates a alloca and inserts it into the entry