From 9f4f7cfe40edd5ed9d8ea7b8ce7c3dd988c7e310 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Sat, 21 Aug 2010 02:39:23 +0000 Subject: [PATCH] IRgen/CGValue: Add alignment to LValue, and use that alignment when generating lvalue load/stores. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111710 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGExpr.cpp | 7 ++----- lib/CodeGen/CGValue.h | 19 +++++++++++++------ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 1d686be19c..f0eec03755 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -635,11 +635,9 @@ RValue CodeGenFunction::EmitLoadOfLValue(LValue LV, QualType ExprType) { // Simple scalar l-value. // // FIXME: We shouldn't have to use isSingleValueType here. - // - // FIXME: Pass alignment! if (EltTy->isSingleValueType()) return RValue::get(EmitLoadOfScalar(Ptr, LV.isVolatileQualified(), - /*Alignment=*/0, ExprType)); + LV.getAlignment(), ExprType)); assert(ExprType->isFunctionType() && "Unknown scalar value"); return RValue::get(Ptr); @@ -849,9 +847,8 @@ void CodeGenFunction::EmitStoreThroughLValue(RValue Src, LValue Dst, } assert(Src.isScalar() && "Can't emit an agg store with this method"); - // FIXME: Pass alignment. EmitStoreOfScalar(Src.getScalarVal(), Dst.getAddress(), - Dst.isVolatileQualified(), /*Alignment=*/0, Ty); + Dst.isVolatileQualified(), Dst.getAlignment(), Ty); } void CodeGenFunction::EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst, diff --git a/lib/CodeGen/CGValue.h b/lib/CodeGen/CGValue.h index 917a194b38..a1bd193f9e 100644 --- a/lib/CodeGen/CGValue.h +++ b/lib/CodeGen/CGValue.h @@ -136,6 +136,9 @@ class LValue { // 'const' is unused here Qualifiers Quals; + /// The alignment to use when accessing this lvalue. + unsigned char Alignment; + // objective-c's ivar bool Ivar:1; @@ -154,11 +157,12 @@ class LValue { Expr *BaseIvarExp; private: - void Initialize(Qualifiers Quals) { + void Initialize(Qualifiers Quals, unsigned Alignment = 0) { this->Quals = Quals; - - // FIXME: Convenient place to set objc flags to 0. This should really be - // done in a user-defined constructor instead. + this->Alignment = Alignment; + assert(this->Alignment == Alignment && "Alignment exceeds allowed max!"); + + // Initialize Objective-C flags. this->Ivar = this->ObjIsArray = this->NonGC = this->GlobalObjCRef = false; this->ThreadLocalRef = false; this->BaseIvarExp = 0; @@ -191,6 +195,8 @@ public: unsigned getAddressSpace() const { return Quals.getAddressSpace(); } + unsigned getAlignment() const { return Alignment; } + static void SetObjCIvar(LValue& R, bool iValue) { R.Ivar = iValue; } @@ -243,11 +249,12 @@ public: return KVCRefExpr; } - static LValue MakeAddr(llvm::Value *V, Qualifiers Quals) { + static LValue MakeAddr(llvm::Value *V, Qualifiers Quals, + unsigned Alignment = 0) { LValue R; R.LVType = Simple; R.V = V; - R.Initialize(Quals); + R.Initialize(Quals, Alignment); return R; } -- 2.40.0