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/IceELFObjectWriter.cpp b/src/IceELFObjectWriter.cpp
index 8f7d3fc..109ca5f 100644
--- a/src/IceELFObjectWriter.cpp
+++ b/src/IceELFObjectWriter.cpp
@@ -288,7 +288,7 @@
// Partition the Vars list by SectionType into VarsBySection. If TranslateOnly
// is non-empty, then only the TranslateOnly variable is kept for emission.
void partitionGlobalsBySection(const VariableDeclarationList &Vars,
- VariableDeclarationList VarsBySection[],
+ VariableDeclarationPartition VarsBySection[],
const IceString &TranslateOnly) {
for (VariableDeclaration *Var : Vars) {
if (GlobalContext::matchSymbolName(Var->getName(), TranslateOnly)) {
@@ -307,7 +307,7 @@
bool IsPIC) {
TimerMarker Timer(TimerStack::TT_writeELF, &Ctx);
assert(!SectionNumbersAssigned);
- VariableDeclarationList VarsBySection[ELFObjectWriter::NumSectionTypes];
+ VariableDeclarationPartition VarsBySection[ELFObjectWriter::NumSectionTypes];
for (auto &SectionList : VarsBySection)
SectionList.reserve(Vars.size());
partitionGlobalsBySection(Vars, VarsBySection,
@@ -329,7 +329,7 @@
// TODO(jvoung): Handle fdata-sections.
void ELFObjectWriter::writeDataOfType(SectionType ST,
- const VariableDeclarationList &Vars,
+ const VariableDeclarationPartition &Vars,
FixupKind RelocationKind,
const IceString &SectionSuffix,
bool IsPIC) {
@@ -407,12 +407,11 @@
Section->setSize(Section->getCurrentSize() + SymbolSize);
} else {
assert(ST != BSS);
- for (const std::unique_ptr<VariableDeclaration::Initializer> &Init :
- Var->getInitializers()) {
+ for (const auto *Init : Var->getInitializers()) {
switch (Init->getKind()) {
case VariableDeclaration::Initializer::DataInitializerKind: {
const auto &Data =
- llvm::cast<VariableDeclaration::DataInitializer>(Init.get())
+ llvm::cast<VariableDeclaration::DataInitializer>(Init)
->getContents();
Section->appendData(Str, llvm::StringRef(Data.data(), Data.size()));
break;
@@ -422,7 +421,7 @@
break;
case VariableDeclaration::Initializer::RelocInitializerKind: {
const auto *Reloc =
- llvm::cast<VariableDeclaration::RelocInitializer>(Init.get());
+ llvm::cast<VariableDeclaration::RelocInitializer>(Init);
AssemblerFixup NewFixup;
NewFixup.set_position(Section->getCurrentSize());
NewFixup.set_kind(Reloc->hasFixup() ? Reloc->getFixup()