Author: laurov Date: Mon Aug 13 18:14:28 2007 New Revision: 41057 URL: http://llvm.org/viewvc/llvm-project?rev=41057&view=rev Log: - Handle the load/store alignment of bitfields. - Fix a bug in TypeConverter::ConvertRECORD.
It fixes the consumer-typeset test on ARM. Modified: llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp llvm-gcc-4.0/trunk/gcc/llvm-types.cpp Modified: llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp?rev=41057&r1=41056&r2=41057&view=diff ============================================================================== --- llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp (original) +++ llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp Mon Aug 13 18:14:28 2007 @@ -2478,9 +2478,9 @@ LValue LV = EmitLV(exp); bool isVolatile = TREE_THIS_VOLATILE(exp); const Type *Ty = ConvertType(TREE_TYPE(exp)); + unsigned Alignment = expr_align(exp) / 8; if (!LV.isBitfield()) { - unsigned Alignment = expr_align(exp) / 8; if (!DestLoc) { // Scalar value: emit a load. Value *Ptr = CastToType(Instruction::BitCast, LV.Ptr, @@ -2495,7 +2495,10 @@ } } else { // This is a bitfield reference. - Value *Val = Builder.CreateLoad(LV.Ptr, isVolatile, "tmp"); + LoadInst *LI = Builder.CreateLoad(LV.Ptr, isVolatile, "tmp"); + LI->setAlignment(Alignment); + + Value *Val = LI; unsigned ValSizeInBits = Val->getType()->getPrimitiveSizeInBits(); assert(Val->getType()->isInteger() && "Invalid bitfield lvalue!"); @@ -2968,7 +2971,9 @@ // Last case, this is a store to a bitfield, so we have to emit a // read/modify/write sequence. - Value *OldVal = Builder.CreateLoad(LV.Ptr, isVolatile, "tmp"); + LoadInst *LI = Builder.CreateLoad(LV.Ptr, isVolatile, "tmp"); + LI->setAlignment(Alignment); + Value *OldVal = LI; // If the target is big-endian, invert the bit in the word. unsigned ValSizeInBits = TD.getTypeSize(OldVal->getType())*8; @@ -2997,7 +3002,8 @@ // Finally, merge the two together and store it. Value *Val = Builder.CreateOr(OldVal, RHS, "tmp"); - Builder.CreateStore(Val, LV.Ptr, isVolatile); + StoreInst *SI = Builder.CreateStore(Val, LV.Ptr, isVolatile); + SI->setAlignment(Alignment); return RetVal; } Modified: llvm-gcc-4.0/trunk/gcc/llvm-types.cpp URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.0/trunk/gcc/llvm-types.cpp?rev=41057&r1=41056&r2=41057&view=diff ============================================================================== --- llvm-gcc-4.0/trunk/gcc/llvm-types.cpp (original) +++ llvm-gcc-4.0/trunk/gcc/llvm-types.cpp Mon Aug 13 18:14:28 2007 @@ -1700,6 +1700,10 @@ unsigned DeclBitAlignment = Info->getTypeAlignment(DeclFieldTy)*8; FieldOffsetInBits &= ~(DeclBitAlignment-1ULL); + // When we fix the field alignment, we must restart the FieldNo search + // because the FieldOffsetInBits can be lower than it was in the + // previous iteration. + CurFieldNo = 0; } // Figure out if this field is zero bits wide, e.g. {} or [0 x int]. Do _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits