More cleanup of data member access and then some.

llvm-svn: 77351
This commit is contained in:
Fariborz Jahanian 2009-07-28 18:54:57 +00:00
parent d6b4b29706
commit a399dfae19
3 changed files with 28 additions and 10 deletions

View File

@ -168,16 +168,23 @@ llvm::Value *CodeGenFunction::AddressCXXOfBaseClass(llvm::Value *BaseValue,
getContext().getASTRecordLayout(ClassDecl);
llvm::Type *I8Ptr = VMContext.getPointerTypeUnqual(llvm::Type::Int8Ty);
unsigned Idx = 0;
bool DerivedToBaseConversion = false;
for (CXXRecordDecl::base_class_const_iterator i =
ClassDecl->bases_begin(),
e = ClassDecl->bases_end(); i != e; ++i, ++Idx) {
if (!i->isVirtual()) {
const CXXRecordDecl *Base =
cast<CXXRecordDecl>(i->getType()->getAsRecordType()->getDecl());
if (Base == BaseClassDecl)
break;
if (Base == BaseClassDecl) {
DerivedToBaseConversion = true;
break;
}
}
}
if (!DerivedToBaseConversion) {
assert(false && "FIXME - Only derived to imm. base convesion is supported");
return BaseValue;
}
uint64_t Offset = Layout.getFieldOffset(Idx) / 8;
llvm::Value *OffsetVal = llvm::ConstantInt::get(llvm::Type::Int32Ty, Offset);
BaseValue = Builder.CreateBitCast(BaseValue, I8Ptr);

View File

@ -993,15 +993,14 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) {
if (PTy->getPointeeType()->isUnionType())
isUnion = true;
CVRQualifiers = PTy->getPointeeType().getCVRQualifiers();
if (CXXThisExpr *ThisExpr = dyn_cast<CXXThisExpr>(BaseExpr)) {
QualType ClassTy = ThisExpr->getType();
ClassTy = ClassTy->getPointeeType();
CXXRecordDecl *ClassDecl =
cast<CXXRecordDecl>(ClassTy->getAsRecordType()->getDecl());
QualType ClassTy = BaseExpr->getType();
ClassTy = ClassTy->getPointeeType();
if (CXXRecordDecl *ClassDecl =
dyn_cast<CXXRecordDecl>(ClassTy->getAsRecordType()->getDecl())) {
FieldDecl *Field = dyn_cast<FieldDecl>(E->getMemberDecl());
CXXRecordDecl *BaseClassDecl =
cast<CXXRecordDecl>(Field->getDeclContext());
BaseValue = AddressCXXOfBaseClass(BaseValue, ClassDecl, BaseClassDecl);
if (CXXRecordDecl *BaseClassDecl =
dyn_cast<CXXRecordDecl>(Field->getDeclContext()))
BaseValue = AddressCXXOfBaseClass(BaseValue, ClassDecl, BaseClassDecl);
}
} else if (isa<ObjCPropertyRefExpr>(BaseExpr) ||
isa<ObjCKVCRefExpr>(BaseExpr)) {
@ -1021,6 +1020,15 @@ LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) {
if (BaseExpr->getType()->isUnionType())
isUnion = true;
CVRQualifiers = BaseExpr->getType().getCVRQualifiers();
if (CXXRecordDecl *ClassDecl =
dyn_cast<CXXRecordDecl>(
BaseExpr->getType()->getAsRecordType()->getDecl())) {
FieldDecl *Field = dyn_cast<FieldDecl>(E->getMemberDecl());
if (CXXRecordDecl *BaseClassDecl =
dyn_cast<CXXRecordDecl>(Field->getDeclContext()))
BaseValue =
AddressCXXOfBaseClass(BaseValue, ClassDecl, BaseClassDecl);
}
}
FieldDecl *Field = dyn_cast<FieldDecl>(E->getMemberDecl());

View File

@ -38,6 +38,9 @@ struct N : M , P, Q {
printf("iQ = %d\n", iQ);
printf("iP = %d\n", iP);
printf("iM = %d\n", iM);
printf("iQ = %d\n", (*this).iQ);
printf("iP = %d\n", ((*this)).iP);
printf("iM = %d\n", this->iM);
}
float ld;
float ff;