Subzero. Allocate global initializers from a dedicated arena.

This allows Subzero to release the global initializers once they've been
lowered.

This CL also modifies the global initializer types to ensure they are
trivially destructible -- therefore not requiring destructors to run.

BUG= https://bugs.chromium.org/p/nativeclient/issues/detail?id=4360
R=stichnot@chromium.org

Review URL: https://codereview.chromium.org/1776473007 .
diff --git a/src/IceCfg.cpp b/src/IceCfg.cpp
index c3d91e6..e5d8cc4 100644
--- a/src/IceCfg.cpp
+++ b/src/IceCfg.cpp
@@ -122,46 +122,43 @@
 namespace {
 constexpr char BlockNameGlobalPrefix[] = ".L$profiler$block_name$";
 constexpr char BlockStatsGlobalPrefix[] = ".L$profiler$block_info$";
+} // end of anonymous namespace
 
-VariableDeclaration *nodeNameDeclaration(GlobalContext *Ctx,
-                                         const IceString &NodeAsmName) {
-  auto *Var = VariableDeclaration::create(Ctx);
+void Cfg::createNodeNameDeclaration(const IceString &NodeAsmName) {
+  auto *Var = VariableDeclaration::create(GlobalInits.get());
   Var->setName(BlockNameGlobalPrefix + NodeAsmName);
   Var->setIsConstant(true);
   Var->addInitializer(VariableDeclaration::DataInitializer::create(
-      NodeAsmName.data(), NodeAsmName.size() + 1));
+      GlobalInits.get(), NodeAsmName.data(), NodeAsmName.size() + 1));
   const SizeT Int64ByteSize = typeWidthInBytes(IceType_i64);
   Var->setAlignment(Int64ByteSize); // Wasteful, 32-bit could use 4 bytes.
-  return Var;
+  GlobalInits->push_back(Var);
 }
 
-VariableDeclaration *
-blockProfilingInfoDeclaration(GlobalContext *Ctx, const IceString &NodeAsmName,
-                              VariableDeclaration *NodeNameDeclaration) {
-  auto *Var = VariableDeclaration::create(Ctx);
+void Cfg::createBlockProfilingInfoDeclaration(
+    const IceString &NodeAsmName, VariableDeclaration *NodeNameDeclaration) {
+  auto *Var = VariableDeclaration::create(GlobalInits.get());
   Var->setName(BlockStatsGlobalPrefix + NodeAsmName);
   const SizeT Int64ByteSize = typeWidthInBytes(IceType_i64);
-  Var->addInitializer(
-      VariableDeclaration::ZeroInitializer::create(Int64ByteSize));
+  Var->addInitializer(VariableDeclaration::ZeroInitializer::create(
+      GlobalInits.get(), Int64ByteSize));
 
   const RelocOffsetT NodeNameDeclarationOffset = 0;
   Var->addInitializer(VariableDeclaration::RelocInitializer::create(
-      NodeNameDeclaration,
+      GlobalInits.get(), NodeNameDeclaration,
       {RelocOffset::create(Ctx, NodeNameDeclarationOffset)}));
   Var->setAlignment(Int64ByteSize);
-  return Var;
+  GlobalInits->push_back(Var);
 }
-} // end of anonymous namespace
 
 void Cfg::profileBlocks() {
   if (GlobalInits == nullptr)
     GlobalInits.reset(new VariableDeclarationList());
 
   for (CfgNode *Node : Nodes) {
-    IceString NodeAsmName = Node->getAsmName();
-    GlobalInits->push_back(nodeNameDeclaration(Ctx, NodeAsmName));
-    GlobalInits->push_back(
-        blockProfilingInfoDeclaration(Ctx, NodeAsmName, GlobalInits->back()));
+    const IceString NodeAsmName = Node->getAsmName();
+    createNodeNameDeclaration(NodeAsmName);
+    createBlockProfilingInfoDeclaration(NodeAsmName, GlobalInits->back());
     Node->profileExecutionCount(GlobalInits->back());
   }
 }