diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2011-09-26 01:56:36 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2011-09-26 01:56:36 +0000 |
commit | 71c26936a018eabf024514893011b731ddf933b3 (patch) | |
tree | 425721c02ffa0fe7f8c7e10bcfc7c06ce4581613 /clang/lib/CodeGen | |
parent | a834166e48f094b30b940fa04033016a9241ab54 (diff) | |
download | bcm5719-llvm-71c26936a018eabf024514893011b731ddf933b3.tar.gz bcm5719-llvm-71c26936a018eabf024514893011b731ddf933b3.zip |
Remove CodeGenVTables::ComputeVTableRelatedInformation dependency on CodeGen
llvm-svn: 140503
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r-- | clang/lib/CodeGen/CGVTT.cpp | 3 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGVTables.cpp | 42 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGVTables.h | 14 |
3 files changed, 26 insertions, 33 deletions
diff --git a/clang/lib/CodeGen/CGVTT.cpp b/clang/lib/CodeGen/CGVTT.cpp index c7d1083cc22..e3c085a29d8 100644 --- a/clang/lib/CodeGen/CGVTT.cpp +++ b/clang/lib/CodeGen/CGVTT.cpp @@ -107,7 +107,8 @@ llvm::GlobalVariable *CodeGenVTables::GetAddrOfVTT(const CXXRecordDecl *RD) { Out.flush(); StringRef Name = OutName.str(); - ComputeVTableRelatedInformation(RD, /*VTableRequired=*/true); + // This will also defer the definition of the VTT. + (void) GetAddrOfVTable(RD); VTTBuilder Builder(CGM.getContext(), RD, /*GenerateDefinition=*/false); diff --git a/clang/lib/CodeGen/CGVTables.cpp b/clang/lib/CodeGen/CGVTables.cpp index b444c26cfb9..cd3a45ddafe 100644 --- a/clang/lib/CodeGen/CGVTables.cpp +++ b/clang/lib/CodeGen/CGVTables.cpp @@ -2956,7 +2956,7 @@ void CodeGenVTables::EmitThunks(GlobalDecl GD) const CXXRecordDecl *RD = MD->getParent(); // Compute VTable related info for this class. - ComputeVTableRelatedInformation(RD, false); + ComputeVTableRelatedInformation(RD); ThunksMapTy::const_iterator I = Thunks.find(MD); if (I == Thunks.end()) { @@ -2969,20 +2969,11 @@ void CodeGenVTables::EmitThunks(GlobalDecl GD) EmitThunk(GD, ThunkInfoVector[I], /*UseAvailableExternallyLinkage=*/false); } -void CodeGenVTables::ComputeVTableRelatedInformation(const CXXRecordDecl *RD, - bool RequireVTable) { - VTableLayoutData &Entry = VTableLayoutMap[RD]; +void CodeGenVTables::ComputeVTableRelatedInformation(const CXXRecordDecl *RD) { + uint64_t *&Entry = VTableLayoutMap[RD]; - // We may need to generate a definition for this vtable. - if (RequireVTable && !Entry.getInt()) { - if (ShouldEmitVTableInThisTU(RD)) - CGM.DeferredVTables.push_back(RD); - - Entry.setInt(true); - } - // Check if we've computed this information before. - if (Entry.getPointer()) + if (Entry) return; VTableBuilder Builder(VTContext, RD, CharUnits::Zero(), @@ -2998,7 +2989,7 @@ void CodeGenVTables::ComputeVTableRelatedInformation(const CXXRecordDecl *RD, uint64_t *LayoutData = new uint64_t[NumVTableComponents + 1]; if (IsAppleKext) LayoutData[NumVTableComponents] = 0; - Entry.setPointer(LayoutData); + Entry = LayoutData; // Store the number of components. LayoutData[0] = NumVTableComponents; @@ -3170,23 +3161,31 @@ CodeGenVTables::CreateVTableInitializer(const CXXRecordDecl *RD, } llvm::GlobalVariable *CodeGenVTables::GetAddrOfVTable(const CXXRecordDecl *RD) { + llvm::GlobalVariable *&VTable = VTables[RD]; + if (VTable) + return VTable; + + // We may need to generate a definition for this vtable. + if (ShouldEmitVTableInThisTU(RD)) + CGM.DeferredVTables.push_back(RD); + llvm::SmallString<256> OutName; llvm::raw_svector_ostream Out(OutName); CGM.getCXXABI().getMangleContext().mangleCXXVTable(RD, Out); Out.flush(); StringRef Name = OutName.str(); - ComputeVTableRelatedInformation(RD, /*VTableRequired=*/true); + ComputeVTableRelatedInformation(RD); llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext()); llvm::ArrayType *ArrayType = llvm::ArrayType::get(Int8PtrTy, getNumVTableComponents(RD)); - llvm::GlobalVariable *GV = + VTable = CGM.CreateOrReplaceCXXRuntimeVariable(Name, ArrayType, llvm::GlobalValue::ExternalLinkage); - GV->setUnnamedAddr(true); - return GV; + VTable->setUnnamedAddr(true); + return VTable; } void @@ -3279,13 +3278,10 @@ CodeGenVTables::GenerateConstructionVTable(const CXXRecordDecl *RD, void CodeGenVTables::GenerateClassData(llvm::GlobalVariable::LinkageTypes Linkage, const CXXRecordDecl *RD) { - llvm::GlobalVariable *&VTable = VTables[RD]; - if (VTable) { - assert(VTable->getInitializer() && "VTable doesn't have a definition!"); + llvm::GlobalVariable *VTable = GetAddrOfVTable(RD); + if (VTable->hasInitializer()) return; - } - VTable = GetAddrOfVTable(RD); EmitVTableDefinition(VTable, Linkage, RD); if (RD->getNumVBases()) { diff --git a/clang/lib/CodeGen/CGVTables.h b/clang/lib/CodeGen/CGVTables.h index 6e96be7219b..a29670b4585 100644 --- a/clang/lib/CodeGen/CGVTables.h +++ b/clang/lib/CodeGen/CGVTables.h @@ -89,11 +89,8 @@ class CodeGenVTables { /// Thunks - Contains all thunks that a given method decl will need. ThunksMapTy Thunks; - // The layout entry and a bool indicating whether we've actually emitted - // the vtable. - typedef llvm::PointerIntPair<uint64_t *, 1, bool> VTableLayoutData; - typedef llvm::DenseMap<const CXXRecordDecl *, VTableLayoutData> - VTableLayoutMapTy; + // The layout entry. + typedef llvm::DenseMap<const CXXRecordDecl *, uint64_t *> VTableLayoutMapTy; /// VTableLayoutMap - Stores the vtable layout for all record decls. /// The layout is stored as an array of 64-bit integers, where the first @@ -122,13 +119,13 @@ class CodeGenVTables { uint64_t getNumVTableComponents(const CXXRecordDecl *RD) const { assert(VTableLayoutMap.count(RD) && "No vtable layout for this class!"); - return VTableLayoutMap.lookup(RD).getPointer()[0]; + return VTableLayoutMap.lookup(RD)[0]; } const uint64_t *getVTableComponentsData(const CXXRecordDecl *RD) const { assert(VTableLayoutMap.count(RD) && "No vtable layout for this class!"); - uint64_t *Components = VTableLayoutMap.lookup(RD).getPointer(); + uint64_t *Components = VTableLayoutMap.lookup(RD); return &Components[1]; } @@ -157,8 +154,7 @@ class CodeGenVTables { /// ComputeVTableRelatedInformation - Compute and store all vtable related /// information (vtable layout, vbase offset offsets, thunks etc) for the /// given record decl. - void ComputeVTableRelatedInformation(const CXXRecordDecl *RD, - bool VTableRequired); + void ComputeVTableRelatedInformation(const CXXRecordDecl *RD); /// CreateVTableInitializer - Create a vtable initializer for the given record /// decl. |