[cfe-commits] r77332 - in /cfe/trunk: lib/CodeGen/CGCXX.cpp lib/CodeGen/CGExpr.cpp lib/CodeGen/CodeGenFunction.h test/CodeGenCXX/constructor-init.cpp
Fariborz Jahanian
fjahanian at apple.com
Wed Jul 29 08:56:36 PDT 2009
On Jul 28, 2009, at 3:15 PM, Chris Lattner wrote:
> On Jul 28, 2009, at 10:38 AM, Fariborz Jahanian wrote:
>> Author: fjahanian
>> Date: Tue Jul 28 12:38:28 2009
>> New Revision: 77332
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=77332&view=rev
>> Log:
>> More work toward data member access ir-gen.
>
> Nice. :)
>
>
>> +llvm::Value *CodeGenFunction::AddressCXXOfBaseClass(llvm::Value
>> *BaseValue,
>> + CXXRecordDecl
>> *ClassDecl,
>> + CXXRecordDecl
>> *BaseClassDecl) {
>> + if (ClassDecl == BaseClassDecl)
>> + return BaseValue;
>> +
>> + // Accessing a member of the base class. Must add delata to
>> + // the load of 'this'.
>> + // FIXME. Once type layout is complete, this will probably change.
>> + const ASTRecordLayout &Layout =
>> + getContext().getASTRecordLayout(ClassDecl);
>> + llvm::Type *I8Ptr =
>> VMContext.getPointerTypeUnqual(llvm::Type::Int8Ty);
>> + unsigned Idx = 0;
>> + 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;
>> + }
>> + }
>
> Please split this out into a static function that return Idx, as per
> the previous email.
>
>> + uint64_t Offset = Layout.getFieldOffset(Idx) / 8;
>
> Maybe there should be a getFieldOffsetInBytes() method?
>
>> + llvm::Value *OffsetVal =
>> llvm::ConstantInt::get(llvm::Type::Int32Ty, Offset);
>
> will this work with large (64-bit) offsets on x86-64? Maybe this
> should use pointertype instead?
>
>>
>> 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());
>
> I'm seeing a lot of this sort of code. Can you add a method on
> Type, something like "getCXXRecordDeclForPointerType()" that returns
> a CXXRecordDecl if the type is a pointer to record type?
>
> It would basically be:
>
> if (PointerType *PT = X->getAsPointerType())
> if (RecordType *RT = PT->getPointeeType()->getAsRecordType())
> return dyn_cast<CXXRecordDecl>(RT);
> return 0;
>
> Please make use of this helper in various other places, it seems
> that it could significantly simplify a lot of the code you've been
> working on lately.
All are now done. Latest being in: http://llvm.org/viewvc/llvm-project?view=rev&revision=77458
- Thanks, Fariborz
>
>
> -Chris
>
More information about the cfe-commits
mailing list