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

Unified Diff: src/IceGlobalInits.h

Issue 1776473007: Subzero. Allocate global initializers from a dedicated arena. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Removes global variable (and initializer) allocation methods from GlobalContext. Created 4 years, 9 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 419702d9cc867fc960fb66efa1b8fd0cae15c78c..b37343b6c9c438d4b69a1ed2d2b0e4b26731a5b1 100644
--- a/src/IceGlobalInits.h
+++ b/src/IceGlobalInits.h
@@ -220,7 +220,6 @@ public:
RelocInitializerKind
};
InitializerKind getKind() const { return Kind; }
- virtual ~Initializer() = default;
virtual SizeT getNumBytes() const = 0;
virtual void dump(Ostream &Stream) const = 0;
virtual void dumpType(Ostream &Stream) const;
@@ -231,9 +230,11 @@ public:
private:
const InitializerKind Kind;
};
+ static_assert(std::is_trivially_destructible<Initializer>::value,
+ "Initializer must be trivially destructible.");
/// Models the data in a data initializer.
- using DataVecType = std::vector<char>;
+ using DataVecType = char *;
/// Defines a sequence of byte values as a data initializer.
class DataInitializer : public Initializer {
@@ -242,35 +243,49 @@ public:
public:
template <class... Args>
- static std::unique_ptr<DataInitializer> create(Args &&... TheArgs) {
- return makeUnique<DataInitializer>(std::forward<Args>(TheArgs)...);
+ static DataInitializer *create(VariableDeclarationList *VDL,
+ Args &&... TheArgs) {
+ return new (VDL->allocate_initializer<DataInitializer>())
+ DataInitializer(VDL, std::forward<Args>(TheArgs)...);
}
- const DataVecType &getContents() const { return Contents; }
- SizeT getNumBytes() const final { return Contents.size(); }
+ const llvm::StringRef getContents() const {
+ return llvm::StringRef(Contents, ContentsSize);
+ }
+ SizeT getNumBytes() const final { return ContentsSize; }
void dump(Ostream &Stream) const final;
static bool classof(const Initializer *D) {
return D->getKind() == DataInitializerKind;
}
private:
- ENABLE_MAKE_UNIQUE;
-
- DataInitializer(const llvm::NaClBitcodeRecord::RecordVector &Values)
- : Initializer(DataInitializerKind), Contents(Values.size()) {
+ DataInitializer(VariableDeclarationList *VDL,
+ const llvm::NaClBitcodeRecord::RecordVector &Values)
+ : Initializer(DataInitializerKind), ContentsSize(Values.size()),
+ // ugh, we should actually do new char[], but this may involve
+ // implementation-specific details. Given that Contents is arena
+ // allocated, and never detele[]d, just use char --
+ // AllocOwner->allocate_array will allocate a buffer with the right
+ // size.
+ Contents(new (VDL->allocate_initializer<char>(ContentsSize)) char) {
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) {
+ DataInitializer(VariableDeclarationList *VDL, const char *Str,
+ size_t StrLen)
+ : Initializer(DataInitializerKind), ContentsSize(StrLen),
+ Contents(new (VDL->allocate_initializer<char>(ContentsSize)) char) {
for (size_t i = 0; i < StrLen; ++i)
Contents[i] = Str[i];
}
/// The byte contents of the data initializer.
+ const SizeT ContentsSize;
DataVecType Contents;
};
+ static_assert(std::is_trivially_destructible<DataInitializer>::value,
+ "DataInitializer must be trivially destructible.");
/// Defines a sequence of bytes initialized to zero.
class ZeroInitializer : public Initializer {
@@ -278,8 +293,9 @@ public:
ZeroInitializer &operator=(const ZeroInitializer &) = delete;
public:
- static std::unique_ptr<ZeroInitializer> create(SizeT Size) {
- return makeUnique<ZeroInitializer>(Size);
+ static ZeroInitializer *create(VariableDeclarationList *VDL, SizeT Size) {
+ return new (VDL->allocate_initializer<ZeroInitializer>())
+ ZeroInitializer(Size);
}
SizeT getNumBytes() const final { return Size; }
void dump(Ostream &Stream) const final;
@@ -288,14 +304,14 @@ public:
}
private:
- ENABLE_MAKE_UNIQUE;
-
explicit ZeroInitializer(SizeT Size)
: Initializer(ZeroInitializerKind), Size(Size) {}
/// The number of bytes to be zero initialized.
SizeT Size;
};
+ static_assert(std::is_trivially_destructible<ZeroInitializer>::value,
+ "ZeroInitializer must be trivially destructible.");
/// Defines the relocation value of another global declaration.
class RelocInitializer : public Initializer {
@@ -303,25 +319,27 @@ public:
RelocInitializer &operator=(const RelocInitializer &) = delete;
public:
- static std::unique_ptr<RelocInitializer>
- create(const GlobalDeclaration *Declaration,
- const RelocOffsetArray &OffsetExpr) {
+ static RelocInitializer *create(VariableDeclarationList *VDL,
+ const GlobalDeclaration *Declaration,
+ const RelocOffsetArray &OffsetExpr) {
constexpr bool NoFixup = false;
- return makeUnique<RelocInitializer>(Declaration, OffsetExpr, NoFixup);
+ return new (VDL->allocate_initializer<RelocInitializer>())
+ RelocInitializer(VDL, Declaration, OffsetExpr, NoFixup);
}
- static std::unique_ptr<RelocInitializer>
- create(const GlobalDeclaration *Declaration,
- const RelocOffsetArray &OffsetExpr, FixupKind Fixup) {
+ static RelocInitializer *create(VariableDeclarationList *VDL,
+ const GlobalDeclaration *Declaration,
+ const RelocOffsetArray &OffsetExpr,
+ FixupKind Fixup) {
constexpr bool HasFixup = true;
- return makeUnique<RelocInitializer>(Declaration, OffsetExpr, HasFixup,
- Fixup);
+ return new (VDL->allocate_initializer<RelocInitializer>())
+ RelocInitializer(VDL, Declaration, OffsetExpr, HasFixup, Fixup);
}
RelocOffsetT getOffset() const {
RelocOffsetT Offset = 0;
- for (const auto *RelocOffset : OffsetExpr) {
- Offset += RelocOffset->getOffset();
+ for (SizeT i = 0; i < OffsetExprSize; ++i) {
+ Offset += OffsetExpr[i]->getOffset();
}
return Offset;
}
@@ -341,54 +359,65 @@ public:
}
private:
- ENABLE_MAKE_UNIQUE;
-
- RelocInitializer(const GlobalDeclaration *Declaration,
+ RelocInitializer(VariableDeclarationList *VDL,
+ const GlobalDeclaration *Declaration,
const RelocOffsetArray &OffsetExpr, bool HasFixup,
FixupKind Fixup = 0)
: Initializer(RelocInitializerKind),
Declaration(Declaration), // The global declaration used in the reloc.
- OffsetExpr(OffsetExpr), HasFixup(HasFixup), Fixup(Fixup) {}
+ OffsetExprSize(OffsetExpr.size()),
+ OffsetExpr(new (VDL->allocate_initializer<RelocOffset *>(
+ OffsetExprSize)) RelocOffset *),
+ HasFixup(HasFixup), Fixup(Fixup) {
+ for (SizeT i = 0; i < OffsetExprSize; ++i) {
+ this->OffsetExpr[i] = OffsetExpr[i];
+ }
+ }
const GlobalDeclaration *Declaration;
/// The offset to add to the relocation.
- const RelocOffsetArray OffsetExpr;
+ const SizeT OffsetExprSize;
+ RelocOffset **OffsetExpr;
const bool HasFixup = false;
const FixupKind Fixup = 0;
};
+ static_assert(std::is_trivially_destructible<RelocInitializer>::value,
+ "RelocInitializer must be trivially destructible.");
/// Models the list of initializers.
- using InitializerListType = std::vector<std::unique_ptr<Initializer>>;
+ // TODO(jpp): missing allocator.
+ using InitializerListType = std::vector<Initializer *>;
- static VariableDeclaration *create(GlobalContext *Context,
+ static VariableDeclaration *create(VariableDeclarationList *VDL,
bool SuppressMangling = false,
llvm::GlobalValue::LinkageTypes Linkage =
llvm::GlobalValue::InternalLinkage) {
- return new (Context->allocate<VariableDeclaration>())
+ return new (VDL->allocate_variable_declaration<VariableDeclaration>())
VariableDeclaration(Linkage, SuppressMangling);
}
- static VariableDeclaration *createExternal(GlobalContext *Context) {
+
+ static VariableDeclaration *createExternal(VariableDeclarationList *VDL) {
constexpr bool SuppressMangling = true;
constexpr llvm::GlobalValue::LinkageTypes Linkage =
llvm::GlobalValue::ExternalLinkage;
- return create(Context, SuppressMangling, Linkage);
+ return create(VDL, SuppressMangling, Linkage);
}
- 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 HasInitializer; }
bool hasNonzeroInitializer() const {
- return !(Initializers->size() == 1 &&
- llvm::isa<ZeroInitializer>((*Initializers)[0].get()));
+ return !(Initializers.size() == 1 &&
+ llvm::isa<ZeroInitializer>(Initializers[0]));
}
/// Returns the number of bytes for the initializer of the global address.
SizeT getNumBytes() const {
SizeT Count = 0;
- for (const std::unique_ptr<Initializer> &Init : *Initializers) {
+ for (const auto *Init : Initializers) {
Count += Init->getNumBytes();
}
return Count;
@@ -396,9 +425,9 @@ public:
/// Adds Initializer to the list of initializers. Takes ownership of the
/// initializer.
- void addInitializer(std::unique_ptr<Initializer> Initializer) {
+ void addInitializer(Initializer *Initializer) {
const bool OldSuppressMangling = getSuppressMangling();
- Initializers->emplace_back(std::move(Initializer));
+ Initializers.emplace_back(Initializer);
HasInitializer = true;
// The getSuppressMangling() logic depends on whether the global variable
// has initializers. If its value changed as a result of adding an
@@ -431,11 +460,11 @@ public:
return isExternal() && !hasInitializer();
}
- void discardInitializers() { Initializers = nullptr; }
+ void discardInitializers() { Initializers.clear(); }
private:
/// List of initializers for the declared variable.
- std::unique_ptr<InitializerListType> Initializers;
+ InitializerListType Initializers;
bool HasInitializer = false;
/// The alignment of the declared variable.
uint32_t Alignment = 0;
@@ -447,7 +476,6 @@ private:
VariableDeclaration(llvm::GlobalValue::LinkageTypes Linkage,
bool SuppressMangling)
: GlobalDeclaration(VariableDeclarationKind, Linkage),
- Initializers(new InitializerListType),
ForceSuppressMangling(SuppressMangling) {}
};
« 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