From 9b77242c9a0089dca1ac4f80420b29492c5ed555 Mon Sep 17 00:00:00 2001 From: David Blaikie Date: Tue, 28 Apr 2020 20:40:31 -0700 Subject: [PATCH] CodeGenTypes::CGRecordLayouts: Use unique_ptr to simplify memory management --- clang/lib/CodeGen/CGRecordLayoutBuilder.cpp | 10 +++++----- clang/lib/CodeGen/CodeGenTypes.cpp | 25 ++++++++++++------------- clang/lib/CodeGen/CodeGenTypes.h | 6 +++--- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp index 75af056..c9a1b1d 100644 --- a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp +++ b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp @@ -730,8 +730,8 @@ CGBitFieldInfo CGBitFieldInfo::MakeInfo(CodeGenTypes &Types, return CGBitFieldInfo(Offset, Size, IsSigned, StorageSize, StorageOffset); } -CGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D, - llvm::StructType *Ty) { +std::unique_ptr +CodeGenTypes::ComputeRecordLayout(const RecordDecl *D, llvm::StructType *Ty) { CGRecordLowering Builder(*this, D, /*Packed=*/false); Builder.lower(/*NonVirtualBaseType=*/false); @@ -758,9 +758,9 @@ CGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D, // but we may need to recursively layout D while laying D out as a base type. Ty->setBody(Builder.FieldTypes, Builder.Packed); - CGRecordLayout *RL = - new CGRecordLayout(Ty, BaseTy, Builder.IsZeroInitializable, - Builder.IsZeroInitializableAsBase); + auto RL = std::make_unique( + Ty, BaseTy, (bool)Builder.IsZeroInitializable, + (bool)Builder.IsZeroInitializableAsBase); RL->NonVirtualBases.swap(Builder.NonVirtualBases); RL->CompleteObjectVirtualBases.swap(Builder.VirtualBases); diff --git a/clang/lib/CodeGen/CodeGenTypes.cpp b/clang/lib/CodeGen/CodeGenTypes.cpp index d6d84a3..7ae9e91 100644 --- a/clang/lib/CodeGen/CodeGenTypes.cpp +++ b/clang/lib/CodeGen/CodeGenTypes.cpp @@ -36,8 +36,6 @@ CodeGenTypes::CodeGenTypes(CodeGenModule &cgm) } CodeGenTypes::~CodeGenTypes() { - llvm::DeleteContainerSeconds(CGRecordLayouts); - for (llvm::FoldingSet::iterator I = FunctionInfos.begin(), E = FunctionInfos.end(); I != E; ) delete &*I++; @@ -793,8 +791,8 @@ llvm::StructType *CodeGenTypes::ConvertRecordDeclType(const RecordDecl *RD) { } // Layout fields. - CGRecordLayout *Layout = ComputeRecordLayout(RD, Ty); - CGRecordLayouts[Key] = Layout; + std::unique_ptr Layout = ComputeRecordLayout(RD, Ty); + CGRecordLayouts[Key] = std::move(Layout); // We're done laying out this struct. bool EraseResult = RecordsBeingLaidOut.erase(Key); (void)EraseResult; @@ -820,17 +818,18 @@ const CGRecordLayout & CodeGenTypes::getCGRecordLayout(const RecordDecl *RD) { const Type *Key = Context.getTagDeclType(RD).getTypePtr(); - const CGRecordLayout *Layout = CGRecordLayouts.lookup(Key); - if (!Layout) { - // Compute the type information. - ConvertRecordDeclType(RD); + auto I = CGRecordLayouts.find(Key); + if (I != CGRecordLayouts.end()) + return *I->second; + // Compute the type information. + ConvertRecordDeclType(RD); - // Now try again. - Layout = CGRecordLayouts.lookup(Key); - } + // Now try again. + I = CGRecordLayouts.find(Key); - assert(Layout && "Unable to find record layout information for type"); - return *Layout; + assert(I != CGRecordLayouts.end() && + "Unable to find record layout information for type"); + return *I->second; } bool CodeGenTypes::isPointerZeroInitializable(QualType T) { diff --git a/clang/lib/CodeGen/CodeGenTypes.h b/clang/lib/CodeGen/CodeGenTypes.h index 394e2fd..f8f7542 100644 --- a/clang/lib/CodeGen/CodeGenTypes.h +++ b/clang/lib/CodeGen/CodeGenTypes.h @@ -75,7 +75,7 @@ class CodeGenTypes { llvm::DenseMap InterfaceTypes; /// Maps clang struct type with corresponding record layout info. - llvm::DenseMap CGRecordLayouts; + llvm::DenseMap> CGRecordLayouts; /// Contains the LLVM IR type for any converted RecordDecl. llvm::DenseMap RecordDeclTypes; @@ -272,8 +272,8 @@ public: RequiredArgs args); /// Compute a new LLVM record layout object for the given record. - CGRecordLayout *ComputeRecordLayout(const RecordDecl *D, - llvm::StructType *Ty); + std::unique_ptr ComputeRecordLayout(const RecordDecl *D, + llvm::StructType *Ty); /// addRecordTypeName - Compute a name from the given record decl with an /// optional suffix and name the given LLVM type using it. -- 2.7.4