forked from OSchip/llvm-project
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). llvm-svn: 51678
This commit is contained in:
parent
045bf4ff82
commit
133e8040ca
|
@ -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) {
|
||||
|
|
|
@ -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;}
|
||||
|
||||
|
|
Loading…
Reference in New Issue