]> granicus.if.org Git - clang/commitdiff
IRgen/CGValue: Add alignment to LValue, and use that alignment when generating lvalue...
authorDaniel Dunbar <daniel@zuster.org>
Sat, 21 Aug 2010 02:39:23 +0000 (02:39 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Sat, 21 Aug 2010 02:39:23 +0000 (02:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@111710 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExpr.cpp
lib/CodeGen/CGValue.h

index 1d686be19c450e1119c52356af12687bab20f520..f0eec03755705903e5a26e1c02c1747866b31d64 100644 (file)
@@ -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,
index 917a194b389a033a92471d2ae689b31f03f2342e..a1bd193f9e274850c84d2325444ba988d2a988ae 100644 (file)
@@ -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;
   }