[Reapply r128776, modified so that it does not break debug info.]
Change the return type of CodeGenVTables::getVirtualBaseOffsetOffset() to CharUnits. No change in functionality intended. llvm-svn: 129072
This commit is contained in:
		
							parent
							
								
									f6e259049d
								
							
						
					
					
						commit
						bb4e977218
					
				| 
						 | 
				
			
			@ -1317,11 +1317,12 @@ CodeGenFunction::GetVirtualBaseClassOffset(llvm::Value *This,
 | 
			
		|||
                                           const CXXRecordDecl *ClassDecl,
 | 
			
		||||
                                           const CXXRecordDecl *BaseClassDecl) {
 | 
			
		||||
  llvm::Value *VTablePtr = GetVTablePtr(This, Int8PtrTy);
 | 
			
		||||
  int64_t VBaseOffsetOffset = 
 | 
			
		||||
  CharUnits VBaseOffsetOffset = 
 | 
			
		||||
    CGM.getVTables().getVirtualBaseOffsetOffset(ClassDecl, BaseClassDecl);
 | 
			
		||||
  
 | 
			
		||||
  llvm::Value *VBaseOffsetPtr = 
 | 
			
		||||
    Builder.CreateConstGEP1_64(VTablePtr, VBaseOffsetOffset, "vbase.offset.ptr");
 | 
			
		||||
    Builder.CreateConstGEP1_64(VTablePtr, VBaseOffsetOffset.getQuantity(), 
 | 
			
		||||
                               "vbase.offset.ptr");
 | 
			
		||||
  const llvm::Type *PtrDiffTy = 
 | 
			
		||||
    ConvertType(getContext().getPointerDiffType());
 | 
			
		||||
  
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -814,10 +814,13 @@ CollectCXXBases(const CXXRecordDecl *RD, llvm::DIFile Unit,
 | 
			
		|||
    if (BI->isVirtual()) {
 | 
			
		||||
      // virtual base offset offset is -ve. The code generator emits dwarf
 | 
			
		||||
      // expression where it expects +ve number.
 | 
			
		||||
      BaseOffset = 0 - CGM.getVTables().getVirtualBaseOffsetOffset(RD, Base);
 | 
			
		||||
      BaseOffset = 
 | 
			
		||||
        0 - CGM.getVTables().getVirtualBaseOffsetOffset(RD, Base).getQuantity();
 | 
			
		||||
      BFlags = llvm::DIDescriptor::FlagVirtual;
 | 
			
		||||
    } else
 | 
			
		||||
      BaseOffset = RL.getBaseClassOffsetInBits(Base);
 | 
			
		||||
    // FIXME: Inconsistent units for BaseOffset. It is in bytes when
 | 
			
		||||
    // BI->isVirtual() and bits when not.
 | 
			
		||||
    
 | 
			
		||||
    AccessSpecifier Access = BI->getAccessSpecifier();
 | 
			
		||||
    if (Access == clang::AS_private)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -878,7 +878,8 @@ void RTTIBuilder::BuildVMIClassTypeInfo(const CXXRecordDecl *RD) {
 | 
			
		|||
    // subobject. For a virtual base, this is the offset in the virtual table of
 | 
			
		||||
    // the virtual base offset for the virtual base referenced (negative).
 | 
			
		||||
    if (Base->isVirtual())
 | 
			
		||||
      OffsetFlags = CGM.getVTables().getVirtualBaseOffsetOffset(RD, BaseDecl);
 | 
			
		||||
      OffsetFlags = 
 | 
			
		||||
        CGM.getVTables().getVirtualBaseOffsetOffset(RD, BaseDecl).getQuantity();
 | 
			
		||||
    else {
 | 
			
		||||
      const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
 | 
			
		||||
      OffsetFlags = Layout.getBaseClassOffsetInBits(BaseDecl) / 8;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1339,7 +1339,7 @@ ReturnAdjustment VTableBuilder::ComputeReturnAdjustment(BaseOffset Offset) {
 | 
			
		|||
      } else {
 | 
			
		||||
        Adjustment.VBaseOffsetOffset = 
 | 
			
		||||
          VTables.getVirtualBaseOffsetOffset(Offset.DerivedClass,
 | 
			
		||||
                                             Offset.VirtualBase);
 | 
			
		||||
                                             Offset.VirtualBase).getQuantity();
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2431,14 +2431,15 @@ uint64_t CodeGenVTables::getMethodVTableIndex(GlobalDecl GD) {
 | 
			
		|||
  return I->second;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int64_t CodeGenVTables::getVirtualBaseOffsetOffset(const CXXRecordDecl *RD, 
 | 
			
		||||
                                                   const CXXRecordDecl *VBase) {
 | 
			
		||||
CharUnits 
 | 
			
		||||
CodeGenVTables::getVirtualBaseOffsetOffset(const CXXRecordDecl *RD, 
 | 
			
		||||
                                           const CXXRecordDecl *VBase) {
 | 
			
		||||
  ClassPairTy ClassPair(RD, VBase);
 | 
			
		||||
  
 | 
			
		||||
  VirtualBaseClassOffsetOffsetsMapTy::iterator I = 
 | 
			
		||||
    VirtualBaseClassOffsetOffsets.find(ClassPair);
 | 
			
		||||
  if (I != VirtualBaseClassOffsetOffsets.end())
 | 
			
		||||
    return I->second.getQuantity();
 | 
			
		||||
    return I->second;
 | 
			
		||||
  
 | 
			
		||||
  VCallAndVBaseOffsetBuilder Builder(RD, RD, /*FinalOverriders=*/0,
 | 
			
		||||
                                     BaseSubobject(RD, CharUnits::Zero()),
 | 
			
		||||
| 
						 | 
				
			
			@ -2458,7 +2459,7 @@ int64_t CodeGenVTables::getVirtualBaseOffsetOffset(const CXXRecordDecl *RD,
 | 
			
		|||
  I = VirtualBaseClassOffsetOffsets.find(ClassPair);
 | 
			
		||||
  assert(I != VirtualBaseClassOffsetOffsets.end() && "Did not find index!");
 | 
			
		||||
  
 | 
			
		||||
  return I->second.getQuantity();
 | 
			
		||||
  return I->second;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint64_t
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -235,13 +235,13 @@ public:
 | 
			
		|||
  /// stored.
 | 
			
		||||
  uint64_t getMethodVTableIndex(GlobalDecl GD);
 | 
			
		||||
 | 
			
		||||
  /// getVirtualBaseOffsetOffset - Return the offset in bytes (relative to the
 | 
			
		||||
  /// getVirtualBaseOffsetOffset - Return the offset in chars (relative to the
 | 
			
		||||
  /// vtable address point) where the offset of the virtual base that contains 
 | 
			
		||||
  /// the given base is stored, otherwise, if no virtual base contains the given
 | 
			
		||||
  /// class, return 0.  Base must be a virtual base class or an unambigious
 | 
			
		||||
  /// base.
 | 
			
		||||
  int64_t getVirtualBaseOffsetOffset(const CXXRecordDecl *RD,
 | 
			
		||||
                                     const CXXRecordDecl *VBase);
 | 
			
		||||
  CharUnits getVirtualBaseOffsetOffset(const CXXRecordDecl *RD,
 | 
			
		||||
                                       const CXXRecordDecl *VBase);
 | 
			
		||||
 | 
			
		||||
  /// getAddressPoint - Get the address point of the given subobject in the
 | 
			
		||||
  /// class decl.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue