]> granicus.if.org Git - clang/commitdiff
Rearrange EmitLValueForField a bit to work properly for _Bool bitfields
authorEli Friedman <eli.friedman@gmail.com>
Thu, 29 May 2008 11:33:25 +0000 (11:33 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Thu, 29 May 2008 11:33:25 +0000 (11:33 +0000)
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

lib/CodeGen/CGExpr.cpp
test/CodeGen/union.c

index d715b45229775396b37cb77fed129817f48b208e..f657d8f28887a82ddd41cdf79ed325d7c942d8a9 100644 (file)
@@ -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) {
index 1e4346d471f8427012da76642d01dfe57e864abd..616cf56ece849e52dfe67bdf41907bd73ba520d5 100644 (file)
@@ -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;}
+