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

Unified Diff: src/IceGlobalContext.cpp

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.h ('k') | src/IceGlobalInits.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/IceGlobalContext.cpp
diff --git a/src/IceGlobalContext.cpp b/src/IceGlobalContext.cpp
index 15cc40d2c5ad278e954c084b5cd773117ddc021a..0065d51c31ed74e9c212a262fce4c75942db3328 100644
--- a/src/IceGlobalContext.cpp
+++ b/src/IceGlobalContext.cpp
@@ -292,17 +292,6 @@ GlobalContext::GlobalContext(Ostream *OsDump, Ostream *OsEmit, Ostream *OsError,
break;
}
- // ProfileBlockInfoVarDecl is initialized here because it takes this as a
- // parameter -- we want to
- // ensure that at least this' member variables are initialized.
- ProfileBlockInfoVarDecl = VariableDeclaration::createExternal(this);
- ProfileBlockInfoVarDecl->setAlignment(typeWidthInBytes(IceType_i64));
- ProfileBlockInfoVarDecl->setIsConstant(true);
-
- // Note: if you change this symbol, make sure to update
- // runtime/szrt_profiler.c as well.
- ProfileBlockInfoVarDecl->setName("__Sz_block_profile_info");
-
TargetLowering::staticInit(this);
}
@@ -397,14 +386,10 @@ void GlobalContext::lowerConstants() { DataLowering->lowerConstants(); }
void GlobalContext::lowerJumpTables() { DataLowering->lowerJumpTables(); }
-void GlobalContext::addBlockInfoPtrs(VariableDeclaration *ProfileBlockInfo) {
- for (const VariableDeclaration *Global : Globals) {
+void GlobalContext::saveBlockInfoPtrs() {
+ for (VariableDeclaration *Global : Globals) {
if (Cfg::isProfileGlobal(*Global)) {
- constexpr RelocOffsetT BlockExecutionCounterOffset = 0;
- ProfileBlockInfo->addInitializer(
- VariableDeclaration::RelocInitializer::create(
- Global,
- {RelocOffset::create(this, BlockExecutionCounterOffset)}));
+ ProfileBlockInfos.push_back(Global);
}
}
}
@@ -424,7 +409,7 @@ void GlobalContext::lowerGlobals(const IceString &SectionSuffix) {
if (Flags.getDisableTranslation())
return;
- addBlockInfoPtrs(ProfileBlockInfoVarDecl);
+ saveBlockInfoPtrs();
// If we need to shuffle the layout of global variables, shuffle them now.
if (getFlags().shouldReorderGlobalVariables()) {
// Create a random number generator for global variable reordering.
@@ -434,26 +419,48 @@ void GlobalContext::lowerGlobals(const IceString &SectionSuffix) {
[&RNG](int N) { return (uint32_t)RNG.next(N); });
}
DataLowering->lowerGlobals(Globals, SectionSuffix);
- for (VariableDeclaration *Var : Globals) {
- Var->discardInitializers();
+ if (ProfileBlockInfos.empty() && DisposeGlobalVariablesAfterLowering) {
+ Globals.clearAndPurge();
+ } else {
+ Globals.clear();
}
- Globals.clear();
}
void GlobalContext::lowerProfileData() {
// ProfileBlockInfoVarDecl is initialized in the constructor, and will only
// ever be nullptr after this method completes. This assertion is a convoluted
// way of ensuring lowerProfileData is invoked a single time.
- assert(ProfileBlockInfoVarDecl != nullptr);
+ assert(ProfileBlockInfoVarDecl == nullptr);
+
+ auto GlobalVariablePool = getInitializerAllocator();
+ ProfileBlockInfoVarDecl =
+ VariableDeclaration::createExternal(GlobalVariablePool.get());
+ ProfileBlockInfoVarDecl->setAlignment(typeWidthInBytes(IceType_i64));
+ ProfileBlockInfoVarDecl->setIsConstant(true);
+
+ // Note: if you change this symbol, make sure to update
+ // runtime/szrt_profiler.c as well.
+ ProfileBlockInfoVarDecl->setName("__Sz_block_profile_info");
+
+ for (const VariableDeclaration *PBI : ProfileBlockInfos) {
+ if (Cfg::isProfileGlobal(*PBI)) {
+ constexpr RelocOffsetT BlockExecutionCounterOffset = 0;
+ ProfileBlockInfoVarDecl->addInitializer(
+ VariableDeclaration::RelocInitializer::create(
+ GlobalVariablePool.get(), PBI,
+ {RelocOffset::create(this, BlockExecutionCounterOffset)}));
+ }
+ }
+
// This adds a 64-bit sentinel entry to the end of our array. For 32-bit
// architectures this will waste 4 bytes.
const SizeT Sizeof64BitNullPtr = typeWidthInBytes(IceType_i64);
ProfileBlockInfoVarDecl->addInitializer(
- VariableDeclaration::ZeroInitializer::create(Sizeof64BitNullPtr));
+ VariableDeclaration::ZeroInitializer::create(GlobalVariablePool.get(),
+ Sizeof64BitNullPtr));
Globals.push_back(ProfileBlockInfoVarDecl);
constexpr char ProfileDataSection[] = "$sz_profiler$";
lowerGlobals(ProfileDataSection);
- ProfileBlockInfoVarDecl = nullptr;
}
void GlobalContext::emitItems() {
« no previous file with comments | « src/IceGlobalContext.h ('k') | src/IceGlobalInits.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698