mirror of
https://github.com/intel/llvm.git
synced 2026-01-27 06:06:34 +08:00
Some class related cleanup.
llvm-svn: 94938
This commit is contained in:
@@ -44,15 +44,15 @@ ComputeNonVirtualBaseClassOffset(ASTContext &Context, CXXBasePaths &Paths,
|
||||
}
|
||||
|
||||
llvm::Constant *
|
||||
CodeGenModule::GetCXXBaseClassOffset(const CXXRecordDecl *ClassDecl,
|
||||
const CXXRecordDecl *BaseClassDecl) {
|
||||
if (ClassDecl == BaseClassDecl)
|
||||
CodeGenModule::GetNonVirtualBaseClassOffset(const CXXRecordDecl *Class,
|
||||
const CXXRecordDecl *BaseClass) {
|
||||
if (Class == BaseClass)
|
||||
return 0;
|
||||
|
||||
CXXBasePaths Paths(/*FindAmbiguities=*/false,
|
||||
/*RecordPaths=*/true, /*DetectVirtual=*/false);
|
||||
if (!const_cast<CXXRecordDecl *>(ClassDecl)->
|
||||
isDerivedFrom(const_cast<CXXRecordDecl *>(BaseClassDecl), Paths)) {
|
||||
if (!const_cast<CXXRecordDecl *>(Class)->
|
||||
isDerivedFrom(const_cast<CXXRecordDecl *>(BaseClass), Paths)) {
|
||||
assert(false && "Class must be derived from the passed in base class!");
|
||||
return 0;
|
||||
}
|
||||
@@ -67,10 +67,10 @@ CodeGenModule::GetCXXBaseClassOffset(const CXXRecordDecl *ClassDecl,
|
||||
return llvm::ConstantInt::get(PtrDiffTy, Offset);
|
||||
}
|
||||
|
||||
static llvm::Value *GetCXXBaseClassOffset(CodeGenFunction &CGF,
|
||||
llvm::Value *BaseValue,
|
||||
const CXXRecordDecl *ClassDecl,
|
||||
const CXXRecordDecl *BaseClassDecl) {
|
||||
static llvm::Value *GetBaseClassOffset(CodeGenFunction &CGF,
|
||||
llvm::Value *BaseValue,
|
||||
const CXXRecordDecl *ClassDecl,
|
||||
const CXXRecordDecl *BaseClassDecl) {
|
||||
CXXBasePaths Paths(/*FindAmbiguities=*/false,
|
||||
/*RecordPaths=*/true, /*DetectVirtual=*/false);
|
||||
if (!const_cast<CXXRecordDecl *>(ClassDecl)->
|
||||
@@ -94,7 +94,7 @@ static llvm::Value *GetCXXBaseClassOffset(CodeGenFunction &CGF,
|
||||
}
|
||||
if (VBase)
|
||||
VirtualOffset =
|
||||
CGF.GetVirtualCXXBaseClassOffset(BaseValue, ClassDecl, VBase);
|
||||
CGF.GetVirtualBaseClassOffset(BaseValue, ClassDecl, VBase);
|
||||
|
||||
uint64_t Offset =
|
||||
ComputeNonVirtualBaseClassOffset(CGF.getContext(), Paths, Start);
|
||||
@@ -150,15 +150,15 @@ CodeGenModule::ComputeThunkAdjustment(const CXXRecordDecl *ClassDecl,
|
||||
|
||||
llvm::Value *
|
||||
CodeGenFunction::GetAddressOfBaseClass(llvm::Value *Value,
|
||||
const CXXRecordDecl *ClassDecl,
|
||||
const CXXRecordDecl *BaseClassDecl,
|
||||
const CXXRecordDecl *Class,
|
||||
const CXXRecordDecl *BaseClass,
|
||||
bool NullCheckValue) {
|
||||
QualType BTy =
|
||||
getContext().getCanonicalType(
|
||||
getContext().getTypeDeclType(const_cast<CXXRecordDecl*>(BaseClassDecl)));
|
||||
getContext().getTypeDeclType(const_cast<CXXRecordDecl*>(BaseClass)));
|
||||
const llvm::Type *BasePtrTy = llvm::PointerType::getUnqual(ConvertType(BTy));
|
||||
|
||||
if (ClassDecl == BaseClassDecl) {
|
||||
if (Class == BaseClass) {
|
||||
// Just cast back.
|
||||
return Builder.CreateBitCast(Value, BasePtrTy);
|
||||
}
|
||||
@@ -181,8 +181,7 @@ CodeGenFunction::GetAddressOfBaseClass(llvm::Value *Value,
|
||||
|
||||
const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(VMContext);
|
||||
|
||||
llvm::Value *Offset =
|
||||
GetCXXBaseClassOffset(*this, Value, ClassDecl, BaseClassDecl);
|
||||
llvm::Value *Offset = GetBaseClassOffset(*this, Value, Class, BaseClass);
|
||||
|
||||
if (Offset) {
|
||||
// Apply the offset.
|
||||
@@ -212,15 +211,15 @@ CodeGenFunction::GetAddressOfBaseClass(llvm::Value *Value,
|
||||
|
||||
llvm::Value *
|
||||
CodeGenFunction::GetAddressOfDerivedClass(llvm::Value *Value,
|
||||
const CXXRecordDecl *ClassDecl,
|
||||
const CXXRecordDecl *DerivedClassDecl,
|
||||
const CXXRecordDecl *Class,
|
||||
const CXXRecordDecl *DerivedClass,
|
||||
bool NullCheckValue) {
|
||||
QualType DerivedTy =
|
||||
getContext().getCanonicalType(
|
||||
getContext().getTypeDeclType(const_cast<CXXRecordDecl*>(DerivedClassDecl)));
|
||||
getContext().getTypeDeclType(const_cast<CXXRecordDecl*>(DerivedClass)));
|
||||
const llvm::Type *DerivedPtrTy = ConvertType(DerivedTy)->getPointerTo();
|
||||
|
||||
if (ClassDecl == DerivedClassDecl) {
|
||||
if (Class == DerivedClass) {
|
||||
// Just cast back.
|
||||
return Builder.CreateBitCast(Value, DerivedPtrTy);
|
||||
}
|
||||
@@ -241,12 +240,11 @@ CodeGenFunction::GetAddressOfDerivedClass(llvm::Value *Value,
|
||||
EmitBlock(CastNotNull);
|
||||
}
|
||||
|
||||
llvm::Value *Offset = GetCXXBaseClassOffset(*this, Value, DerivedClassDecl,
|
||||
ClassDecl);
|
||||
if (Offset) {
|
||||
if (llvm::Value *NonVirtualOffset =
|
||||
CGM.GetNonVirtualBaseClassOffset(DerivedClass, Class)) {
|
||||
// Apply the offset.
|
||||
Value = Builder.CreatePtrToInt(Value, Offset->getType());
|
||||
Value = Builder.CreateSub(Value, Offset);
|
||||
Value = Builder.CreatePtrToInt(Value, NonVirtualOffset->getType());
|
||||
Value = Builder.CreateSub(Value, NonVirtualOffset);
|
||||
Value = Builder.CreateIntToPtr(Value, DerivedPtrTy);
|
||||
} else {
|
||||
// Just cast.
|
||||
@@ -1300,8 +1298,8 @@ void CodeGenFunction::EmitCXXDestructorCall(const CXXDestructorDecl *DD,
|
||||
}
|
||||
|
||||
llvm::Value *
|
||||
CodeGenFunction::GetVirtualCXXBaseClassOffset(llvm::Value *This,
|
||||
const CXXRecordDecl *ClassDecl,
|
||||
CodeGenFunction::GetVirtualBaseClassOffset(llvm::Value *This,
|
||||
const CXXRecordDecl *ClassDecl,
|
||||
const CXXRecordDecl *BaseClassDecl) {
|
||||
const llvm::Type *Int8PtrTy =
|
||||
llvm::Type::getInt8Ty(VMContext)->getPointerTo();
|
||||
|
||||
@@ -252,8 +252,8 @@ void AggExprEmitter::VisitCastExpr(CastExpr *E) {
|
||||
if (E->getCastKind() == CastExpr::CK_DerivedToBaseMemberPointer)
|
||||
std::swap(DerivedDecl, BaseDecl);
|
||||
|
||||
llvm::Constant *Adj = CGF.CGM.GetCXXBaseClassOffset(DerivedDecl, BaseDecl);
|
||||
if (Adj) {
|
||||
if (llvm::Constant *Adj =
|
||||
CGF.CGM.GetNonVirtualBaseClassOffset(DerivedDecl, BaseDecl)) {
|
||||
if (E->getCastKind() == CastExpr::CK_DerivedToBaseMemberPointer)
|
||||
SrcAdj = Builder.CreateSub(SrcAdj, Adj, "adj");
|
||||
else
|
||||
|
||||
@@ -534,8 +534,8 @@ public:
|
||||
llvm::ConstantStruct *CS = cast<llvm::ConstantStruct>(C);
|
||||
|
||||
// Check if we need to update the adjustment.
|
||||
if (llvm::Constant *Offset = CGM.GetCXXBaseClassOffset(DerivedClass,
|
||||
BaseClass)) {
|
||||
if (llvm::Constant *Offset =
|
||||
CGM.GetNonVirtualBaseClassOffset(DerivedClass, BaseClass)) {
|
||||
llvm::Constant *Values[2];
|
||||
|
||||
Values[0] = CS->getOperand(0);
|
||||
|
||||
@@ -891,8 +891,8 @@ Value *ScalarExprEmitter::EmitCastExpr(CastExpr *CE) {
|
||||
if (CE->getCastKind() == CastExpr::CK_DerivedToBaseMemberPointer)
|
||||
std::swap(DerivedDecl, BaseDecl);
|
||||
|
||||
llvm::Constant *Adj = CGF.CGM.GetCXXBaseClassOffset(DerivedDecl, BaseDecl);
|
||||
if (Adj) {
|
||||
if (llvm::Constant *Adj =
|
||||
CGF.CGM.GetNonVirtualBaseClassOffset(DerivedDecl, BaseDecl)) {
|
||||
if (CE->getCastKind() == CastExpr::CK_DerivedToBaseMemberPointer)
|
||||
Src = Builder.CreateSub(Src, Adj, "adj");
|
||||
else
|
||||
|
||||
@@ -750,10 +750,9 @@ public:
|
||||
const CXXRecordDecl *DerivedClassDecl,
|
||||
bool NullCheckValue);
|
||||
|
||||
llvm::Value *
|
||||
GetVirtualCXXBaseClassOffset(llvm::Value *This,
|
||||
const CXXRecordDecl *ClassDecl,
|
||||
const CXXRecordDecl *BaseClassDecl);
|
||||
llvm::Value *GetVirtualBaseClassOffset(llvm::Value *This,
|
||||
const CXXRecordDecl *ClassDecl,
|
||||
const CXXRecordDecl *BaseClassDecl);
|
||||
|
||||
void EmitClassAggrMemberwiseCopy(llvm::Value *DestValue,
|
||||
llvm::Value *SrcValue,
|
||||
|
||||
@@ -239,10 +239,11 @@ public:
|
||||
BuildCovariantThunk(const GlobalDecl &GD, bool Extern,
|
||||
const CovariantThunkAdjustment &Adjustment);
|
||||
|
||||
/// GetCXXBaseClassOffset - Returns the offset from a derived class to its
|
||||
/// base class. Returns null if the offset is 0.
|
||||
llvm::Constant *GetCXXBaseClassOffset(const CXXRecordDecl *ClassDecl,
|
||||
const CXXRecordDecl *BaseClassDecl);
|
||||
/// GetNonVirtualBaseClassOffset - Returns the offset from a derived class to
|
||||
/// its base class. Returns null if the offset is 0.
|
||||
llvm::Constant *
|
||||
GetNonVirtualBaseClassOffset(const CXXRecordDecl *ClassDecl,
|
||||
const CXXRecordDecl *BaseClassDecl);
|
||||
|
||||
/// ComputeThunkAdjustment - Returns the two parts required to compute the
|
||||
/// offset for an object.
|
||||
|
||||
Reference in New Issue
Block a user