[cfe-commits] r100745 - in /cfe/trunk/lib/CodeGen: CGExpr.cpp CGObjCMac.cpp CGRecordLayout.h CGRecordLayoutBuilder.cpp CGValue.h

Daniel Dunbar daniel at zuster.org
Wed Apr 7 19:59:45 PDT 2010


Author: ddunbar
Date: Wed Apr  7 21:59:45 2010
New Revision: 100745

URL: http://llvm.org/viewvc/llvm-project?rev=100745&view=rev
Log:
IRgen: Move the bit-field access type into CGBitFieldInfo, and change bit-field LValues to just store the base address of object containing the bit-field.

Modified:
    cfe/trunk/lib/CodeGen/CGExpr.cpp
    cfe/trunk/lib/CodeGen/CGObjCMac.cpp
    cfe/trunk/lib/CodeGen/CGRecordLayout.h
    cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp
    cfe/trunk/lib/CodeGen/CGValue.h

Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=100745&r1=100744&r2=100745&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExpr.cpp Wed Apr  7 21:59:45 2010
@@ -603,12 +603,27 @@
   return EmitLoadOfKVCRefLValue(LV, ExprType);
 }
 
+static llvm::Value *getBitFieldAddr(LValue LV, CGBuilderTy &Builder) {
+  const CGBitFieldInfo &Info = LV.getBitFieldInfo();
+
+  llvm::Value *BaseValue = LV.getBitFieldBaseAddr();
+  const llvm::PointerType *BaseTy =
+    cast<llvm::PointerType>(BaseValue->getType());
+
+  // Cast to the type of the access we will perform.
+  llvm::Value *V = Builder.CreateBitCast(
+    BaseValue, llvm::PointerType::get(Info.FieldTy, BaseTy->getAddressSpace()));
+
+  // Offset by the access index.
+  return Builder.CreateConstGEP1_32(V, Info.FieldNo);
+}
+
 RValue CodeGenFunction::EmitLoadOfBitfieldLValue(LValue LV,
                                                  QualType ExprType) {
   const CGBitFieldInfo &Info = LV.getBitFieldInfo();
   unsigned StartBit = Info.Start;
   unsigned BitfieldSize = Info.Size;
-  llvm::Value *Ptr = LV.getBitFieldAddr();
+  llvm::Value *Ptr = getBitFieldAddr(LV, Builder);
 
   const llvm::Type *EltTy =
     cast<llvm::PointerType>(Ptr->getType())->getElementType();
@@ -785,7 +800,7 @@
   const CGBitFieldInfo &Info = Dst.getBitFieldInfo();
   unsigned StartBit = Info.Start;
   unsigned BitfieldSize = Info.Size;
-  llvm::Value *Ptr = Dst.getBitFieldAddr();
+  llvm::Value *Ptr = getBitFieldAddr(Dst, Builder);
 
   const llvm::Type *EltTy =
     cast<llvm::PointerType>(Ptr->getType())->getElementType();
@@ -1474,19 +1489,7 @@
   const CGRecordLayout &RL =
     CGM.getTypes().getCGRecordLayout(Field->getParent());
   const CGBitFieldInfo &Info = RL.getBitFieldInfo(Field);
-
-  // FIXME: CodeGenTypes should expose a method to get the appropriate type for
-  // FieldTy (the appropriate type is ABI-dependent).
-  const llvm::Type *FieldTy =
-    CGM.getTypes().ConvertTypeForMem(Field->getType());
-  const llvm::PointerType *BaseTy =
-  cast<llvm::PointerType>(BaseValue->getType());
-  unsigned AS = BaseTy->getAddressSpace();
-  BaseValue = Builder.CreateBitCast(BaseValue,
-                                    llvm::PointerType::get(FieldTy, AS));
-  llvm::Value *V = Builder.CreateConstGEP1_32(BaseValue, Info.FieldNo);
-
-  return LValue::MakeBitfield(V, Info,
+  return LValue::MakeBitfield(BaseValue, Info,
                              Field->getType().getCVRQualifiers()|CVRQualifiers);
 }
 

Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=100745&r1=100744&r2=100745&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Wed Apr  7 21:59:45 2010
@@ -126,8 +126,8 @@
   // objects.
   unsigned FieldNo = 0; // This value is unused.
   CGBitFieldInfo *Info =
-    new (CGF.CGM.getContext()) CGBitFieldInfo(FieldNo, BitOffset, BitFieldSize,
-                                              IvarTy->isSignedIntegerType());
+    new (CGF.CGM.getContext()) CGBitFieldInfo(
+      LTy, FieldNo, BitOffset, BitFieldSize, IvarTy->isSignedIntegerType());
 
   // FIXME: We need to set a very conservative alignment on this, or make sure
   // that the runtime is doing the right thing.

Modified: cfe/trunk/lib/CodeGen/CGRecordLayout.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGRecordLayout.h?rev=100745&r1=100744&r2=100745&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGRecordLayout.h (original)
+++ cfe/trunk/lib/CodeGen/CGRecordLayout.h Wed Apr  7 21:59:45 2010
@@ -21,11 +21,14 @@
 
 class CGBitFieldInfo {
 public:
-  CGBitFieldInfo(unsigned FieldNo, unsigned Start, unsigned Size,
-                 bool IsSigned)
-    : FieldNo(FieldNo), Start(Start), Size(Size), IsSigned(IsSigned) {}
+  CGBitFieldInfo(const llvm::Type *FieldTy, unsigned FieldNo,
+                 unsigned Start, unsigned Size, bool IsSigned)
+    : FieldTy(FieldTy), FieldNo(FieldNo),
+      Start(Start), Size(Size), IsSigned(IsSigned) {}
 
+  const llvm::Type *FieldTy;
   unsigned FieldNo;
+
   unsigned Start;
   unsigned Size;
   bool IsSigned : 1;

Modified: cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp?rev=100745&r1=100744&r2=100745&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp Wed Apr  7 21:59:45 2010
@@ -180,7 +180,7 @@
 
   bool IsSigned = D->getType()->isSignedIntegerType();
   LLVMBitFields.push_back(LLVMBitFieldInfo(
-                            D, CGBitFieldInfo(FieldOffset / TypeSizeInBits,
+                            D, CGBitFieldInfo(Ty, FieldOffset / TypeSizeInBits,
                                               FieldOffset % TypeSizeInBits,
                                               FieldSize, IsSigned)));
 
@@ -270,6 +270,8 @@
        FieldEnd = D->field_end(); Field != FieldEnd; ++Field, ++FieldNo) {
     assert(Layout.getFieldOffset(FieldNo) == 0 &&
           "Union field offset did not start at the beginning of record!");
+    const llvm::Type *FieldTy =
+      Types.ConvertTypeForMemRecursive(Field->getType());
 
     if (Field->isBitField()) {
       uint64_t FieldSize =
@@ -282,7 +284,7 @@
       // Add the bit field info.
       bool IsSigned = Field->getType()->isSignedIntegerType();
       LLVMBitFields.push_back(LLVMBitFieldInfo(
-                                *Field, CGBitFieldInfo(0, 0, FieldSize,
+                                *Field, CGBitFieldInfo(FieldTy, 0, 0, FieldSize,
                                                        IsSigned)));
     } else {
       LLVMFields.push_back(LLVMFieldInfo(*Field, 0));
@@ -290,8 +292,6 @@
 
     HasOnlyZeroSizedBitFields = false;
 
-    const llvm::Type *FieldTy =
-      Types.ConvertTypeForMemRecursive(Field->getType());
     unsigned FieldAlign = Types.getTargetData().getABITypeAlignment(FieldTy);
     uint64_t FieldSize = Types.getTargetData().getTypeAllocSize(FieldTy);
 

Modified: cfe/trunk/lib/CodeGen/CGValue.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGValue.h?rev=100745&r1=100744&r2=100745&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGValue.h (original)
+++ cfe/trunk/lib/CodeGen/CGValue.h Wed Apr  7 21:59:45 2010
@@ -220,7 +220,7 @@
   }
 
   // bitfield lvalue
-  llvm::Value *getBitFieldAddr() const {
+  llvm::Value *getBitFieldBaseAddr() const {
     assert(isBitField());
     return V;
   }
@@ -269,11 +269,17 @@
     return R;
   }
 
-  static LValue MakeBitfield(llvm::Value *V, const CGBitFieldInfo &Info,
+  /// \brief Create a new object to represent a bit-field access.
+  ///
+  /// \param BaseValue - The base address of the structure containing the
+  /// bit-field.
+  /// \param Info - The information describing how to perform the bit-field
+  /// access.
+  static LValue MakeBitfield(llvm::Value *BaseValue, const CGBitFieldInfo &Info,
                              unsigned CVR) {
     LValue R;
     R.LVType = BitField;
-    R.V = V;
+    R.V = BaseValue;
     R.BitFieldInfo = &Info;
     R.SetQualifiers(Qualifiers::fromCVRMask(CVR));
     return R;





More information about the cfe-commits mailing list