From: Eli Friedman Date: Thu, 29 May 2008 11:33:25 +0000 (+0000) Subject: Rearrange EmitLValueForField a bit to work properly for _Bool bitfields X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1e86b34f15f0502c13750ee1d6cf338def6e2242;p=clang Rearrange EmitLValueForField a bit to work properly for _Bool bitfields in unions (we don't want to do the union-specific bitcast for bit-fields). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@51678 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index d715b45229..f657d8f288 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -557,9 +557,7 @@ LValue CodeGenFunction::EmitLValueForField(llvm::Value* BaseValue, llvm::Value *V; unsigned idx = CGM.getTypes().getLLVMFieldNo(Field); - if (!Field->isBitField()) { - V = Builder.CreateStructGEP(BaseValue, idx, "tmp"); - } else { + if (Field->isBitField()) { // FIXME: CodeGenTypes should expose a method to get the appropriate // type for FieldTy (the appropriate type is ABI-dependent). unsigned EltTySize = @@ -574,8 +572,15 @@ LValue CodeGenFunction::EmitLValueForField(llvm::Value* BaseValue, V = Builder.CreateGEP(BaseValue, llvm::ConstantInt::get(llvm::Type::Int32Ty, idx), "tmp"); + + CodeGenTypes::BitFieldInfo bitFieldInfo = + CGM.getTypes().getBitFieldInfo(Field); + return LValue::MakeBitfield(V, bitFieldInfo.Begin, bitFieldInfo.Size, + Field->getType()->isSignedIntegerType()); } + V = Builder.CreateStructGEP(BaseValue, idx, "tmp"); + // Match union field type. if (isUnion) { const llvm::Type * FieldTy = ConvertType(Field->getType()); @@ -587,13 +592,7 @@ LValue CodeGenFunction::EmitLValueForField(llvm::Value* BaseValue, "tmp"); } - if (!Field->isBitField()) - return LValue::MakeAddr(V); - - CodeGenTypes::BitFieldInfo bitFieldInfo = - CGM.getTypes().getBitFieldInfo(Field); - return LValue::MakeBitfield(V, bitFieldInfo.Begin, bitFieldInfo.Size, - Field->getType()->isSignedIntegerType()); + return LValue::MakeAddr(V); } LValue CodeGenFunction::EmitCompoundLiteralLValue(const CompoundLiteralExpr* E) { diff --git a/test/CodeGen/union.c b/test/CodeGen/union.c index 1e4346d471..616cf56ece 100644 --- a/test/CodeGen/union.c +++ b/test/CodeGen/union.c @@ -36,3 +36,6 @@ typedef union{ } q; int qfunc() {q buf; unsigned char* x = buf.x;} +union RR {_Bool a : 1;} RRU; +int RRF(void) {return RRU.a;} +