Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1082)

Unified Diff: src/IceGlobalInits.h

Issue 1181013016: Subzero. Fixes memory leaks. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Addresses codereview comments. Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/IceGlobalContext.cpp ('k') | src/IceGlobalInits.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/IceGlobalInits.h
diff --git a/src/IceGlobalInits.h b/src/IceGlobalInits.h
index 754f181d510ac47ced3185e384b04c1848ff249f..cd66500362742f4fdc96b56026aec7a5ae3d8c13 100644
--- a/src/IceGlobalInits.h
+++ b/src/IceGlobalInits.h
@@ -17,8 +17,12 @@
#ifndef SUBZERO_SRC_ICEGLOBALINITS_H
#define SUBZERO_SRC_ICEGLOBALINITS_H
+#include <memory>
+#include <utility>
+
+#include "llvm/Bitcode/NaCl/NaClBitcodeParser.h" // for NaClBitcodeRecord.
#include "llvm/IR/CallingConv.h"
-#include "llvm/IR/GlobalValue.h" // for GlobalValue::LinkageTypes
+#include "llvm/IR/GlobalValue.h" // for GlobalValue::LinkageTypes.
#include "IceDefs.h"
#include "IceTypes.h"
@@ -54,7 +58,7 @@ public:
void setLinkage(llvm::GlobalValue::LinkageTypes NewLinkage) {
Linkage = NewLinkage;
}
- virtual ~GlobalDeclaration() {}
+ virtual ~GlobalDeclaration() = default;
/// Prints out type of the global declaration.
virtual void dumpType(Ostream &Stream) const = 0;
@@ -95,11 +99,14 @@ class FunctionDeclaration : public GlobalDeclaration {
FunctionDeclaration &operator=(const FunctionDeclaration &) = delete;
public:
- static FunctionDeclaration *create(const FuncSigType &Signature,
+ static FunctionDeclaration *create(GlobalContext *Context,
+ const FuncSigType &Signature,
llvm::CallingConv::ID CallingConv,
llvm::GlobalValue::LinkageTypes Linkage,
- bool IsProto);
- ~FunctionDeclaration() final {}
+ bool IsProto) {
+ return new (Context->allocate<FunctionDeclaration>())
+ FunctionDeclaration(Signature, CallingConv, Linkage, IsProto);
+ }
const FuncSigType &getSignature() const { return Signature; }
llvm::CallingConv::ID getCallingConv() const { return CallingConv; }
// isProto implies that there isn't a (local) definition for the function.
@@ -142,7 +149,7 @@ public:
RelocInitializerKind
};
InitializerKind getKind() const { return Kind; }
- virtual ~Initializer() {}
+ virtual ~Initializer() = default;
virtual SizeT getNumBytes() const = 0;
virtual void dump(GlobalContext *Ctx, Ostream &Stream) const = 0;
void dump(Ostream &Stream) const {
@@ -167,21 +174,11 @@ public:
DataInitializer &operator=(const DataInitializer &) = delete;
public:
- template <class IntContainer>
- DataInitializer(const IntContainer &Values)
- : Initializer(DataInitializerKind), Contents(Values.size()) {
- size_t i = 0;
- for (auto &V : Values) {
- Contents[i] = static_cast<int8_t>(V);
- ++i;
- }
+ template <class... Args>
+ static std::unique_ptr<DataInitializer> create(Args &&... TheArgs) {
+ return makeUnique<DataInitializer>(std::forward<Args>(TheArgs)...);
}
- DataInitializer(const char *Str, size_t StrLen)
- : Initializer(DataInitializerKind), Contents(StrLen) {
- for (size_t i = 0; i < StrLen; ++i)
- Contents[i] = Str[i];
- }
- ~DataInitializer() override {}
+
const DataVecType &getContents() const { return Contents; }
SizeT getNumBytes() const final { return Contents.size(); }
void dump(GlobalContext *Ctx, Ostream &Stream) const final;
@@ -190,6 +187,20 @@ public:
}
private:
+ ENABLE_MAKE_UNIQUE;
+
+ DataInitializer(const llvm::NaClBitcodeRecord::RecordVector &Values)
+ : Initializer(DataInitializerKind), Contents(Values.size()) {
+ for (SizeT I = 0; I < Values.size(); ++I)
+ Contents[I] = static_cast<int8_t>(Values[I]);
+ }
+
+ DataInitializer(const char *Str, size_t StrLen)
+ : Initializer(DataInitializerKind), Contents(StrLen) {
+ for (size_t i = 0; i < StrLen; ++i)
+ Contents[i] = Str[i];
+ }
+
// The byte contents of the data initializer.
DataVecType Contents;
};
@@ -200,9 +211,9 @@ public:
ZeroInitializer &operator=(const ZeroInitializer &) = delete;
public:
- explicit ZeroInitializer(SizeT Size)
- : Initializer(ZeroInitializerKind), Size(Size) {}
- ~ZeroInitializer() override {}
+ static std::unique_ptr<ZeroInitializer> create(SizeT Size) {
+ return makeUnique<ZeroInitializer>(Size);
+ }
SizeT getNumBytes() const final { return Size; }
void dump(GlobalContext *Ctx, Ostream &Stream) const final;
static bool classof(const Initializer *Z) {
@@ -210,6 +221,11 @@ public:
}
private:
+ ENABLE_MAKE_UNIQUE;
+
+ explicit ZeroInitializer(SizeT Size)
+ : Initializer(ZeroInitializerKind), Size(Size) {}
+
// The number of bytes to be zero initialized.
SizeT Size;
};
@@ -220,10 +236,11 @@ public:
RelocInitializer &operator=(const RelocInitializer &) = delete;
public:
- RelocInitializer(const GlobalDeclaration *Declaration, RelocOffsetT Offset)
- : Initializer(RelocInitializerKind), Declaration(Declaration),
- Offset(Offset) {}
- ~RelocInitializer() override {}
+ static std::unique_ptr<RelocInitializer>
+ create(const GlobalDeclaration *Declaration, RelocOffsetT Offset) {
+ return makeUnique<RelocInitializer>(Declaration, Offset);
+ }
+
RelocOffsetT getOffset() const { return Offset; }
const GlobalDeclaration *getDeclaration() const { return Declaration; }
SizeT getNumBytes() const final { return RelocAddrSize; }
@@ -234,34 +251,40 @@ public:
}
private:
- // The global declaration used in the relocation.
+ ENABLE_MAKE_UNIQUE;
+
+ RelocInitializer(const GlobalDeclaration *Declaration, RelocOffsetT Offset)
+ : Initializer(RelocInitializerKind), Declaration(Declaration),
+ Offset(Offset) {} // The global declaration used in the relocation.
+
const GlobalDeclaration *Declaration;
// The offset to add to the relocation.
const RelocOffsetT Offset;
};
/// Models the list of initializers.
- typedef std::vector<Initializer *> InitializerListType;
+ typedef std::vector<std::unique_ptr<Initializer>> InitializerListType;
- static VariableDeclaration *create();
- ~VariableDeclaration() final;
+ static VariableDeclaration *create(GlobalContext *Context) {
+ return new (Context->allocate<VariableDeclaration>()) VariableDeclaration();
+ }
- const InitializerListType &getInitializers() const { return Initializers; }
+ const InitializerListType &getInitializers() const { return *Initializers; }
bool getIsConstant() const { return IsConstant; }
void setIsConstant(bool NewValue) { IsConstant = NewValue; }
uint32_t getAlignment() const { return Alignment; }
void setAlignment(uint32_t NewAlignment) { Alignment = NewAlignment; }
- bool hasInitializer() const { return !Initializers.empty(); }
+ bool hasInitializer() const { return HasInitializer; }
bool hasNonzeroInitializer() const {
- return !(Initializers.size() == 1 &&
- llvm::isa<ZeroInitializer>(Initializers[0]));
+ return !(Initializers->size() == 1 &&
+ llvm::isa<ZeroInitializer>((*Initializers)[0].get()));
}
/// Returns the number of bytes for the initializer of the global
/// address.
SizeT getNumBytes() const {
SizeT Count = 0;
- for (Initializer *Init : Initializers) {
+ for (const std::unique_ptr<Initializer> &Init : *Initializers) {
Count += Init->getNumBytes();
}
return Count;
@@ -269,8 +292,9 @@ public:
/// Adds Initializer to the list of initializers. Takes ownership of
/// the initializer.
- void addInitializer(Initializer *Initializer) {
- Initializers.push_back(Initializer);
+ void addInitializer(std::unique_ptr<Initializer> Initializer) {
+ Initializers->emplace_back(std::move(Initializer));
+ HasInitializer = true;
}
/// Prints out type for initializer associated with the declaration
@@ -293,9 +317,12 @@ public:
void setSuppressMangling() { ForceSuppressMangling = true; }
+ void discardInitializers() { Initializers = nullptr; }
+
private:
// list of initializers for the declared variable.
- InitializerListType Initializers;
+ std::unique_ptr<InitializerListType> Initializers;
+ bool HasInitializer;
// The alignment of the declared variable.
uint32_t Alignment;
// True if a declared (global) constant.
@@ -306,6 +333,7 @@ private:
VariableDeclaration()
: GlobalDeclaration(VariableDeclarationKind,
llvm::GlobalValue::InternalLinkage),
+ Initializers(new InitializerListType), HasInitializer(false),
Alignment(0), IsConstant(false), ForceSuppressMangling(false) {}
};
« no previous file with comments | « src/IceGlobalContext.cpp ('k') | src/IceGlobalInits.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698