Commit 84aa494e authored by svenpanne's avatar svenpanne Committed by Commit bot

Fixed various simulator-related space leaks.

Alas, this involved quite a bit of copy-n-paste between the
architectures, but this is caused by the very convoluted
relationships, lifetimes and distribution of responsibilities. This
should really be cleaned up by moving code around and using STL maps,
but that's not really a priority right now.

Bonus: Fixed leaks in the ARM64 disassembler tests.

Review URL: https://codereview.chromium.org/1132943007

Cr-Commit-Position: refs/heads/master@{#28496}
parent 31fb5024
...@@ -774,8 +774,7 @@ Simulator::Simulator(Isolate* isolate) : isolate_(isolate) { ...@@ -774,8 +774,7 @@ Simulator::Simulator(Isolate* isolate) : isolate_(isolate) {
} }
Simulator::~Simulator() { Simulator::~Simulator() { free(stack_); }
}
// When the generated code calls an external reference we need to catch that in // When the generated code calls an external reference we need to catch that in
...@@ -834,6 +833,14 @@ class Redirection { ...@@ -834,6 +833,14 @@ class Redirection {
return redirection->external_function(); return redirection->external_function();
} }
static void DeleteChain(Redirection* redirection) {
while (redirection != nullptr) {
Redirection* next = redirection->next_;
delete redirection;
redirection = next;
}
}
private: private:
void* external_function_; void* external_function_;
uint32_t swi_instruction_; uint32_t swi_instruction_;
...@@ -842,6 +849,19 @@ class Redirection { ...@@ -842,6 +849,19 @@ class Redirection {
}; };
// static
void Simulator::TearDown(HashMap* i_cache, Redirection* first) {
Redirection::DeleteChain(first);
if (i_cache != nullptr) {
for (HashMap::Entry* entry = i_cache->Start(); entry != nullptr;
entry = i_cache->Next(entry)) {
delete static_cast<CachePage*>(entry->value);
}
delete i_cache;
}
}
void* Simulator::RedirectExternalReference(void* external_function, void* Simulator::RedirectExternalReference(void* external_function,
ExternalReference::Type type) { ExternalReference::Type type) {
Redirection* redirection = Redirection::Get(external_function, type); Redirection* redirection = Redirection::Get(external_function, type);
......
...@@ -194,6 +194,8 @@ class Simulator { ...@@ -194,6 +194,8 @@ class Simulator {
// Call on program start. // Call on program start.
static void Initialize(Isolate* isolate); static void Initialize(Isolate* isolate);
static void TearDown(HashMap* i_cache, Redirection* first);
// V8 generally calls into generated JS code with 5 parameters and into // V8 generally calls into generated JS code with 5 parameters and into
// generated RegExp code with 7 parameters. This is a convenience function, // generated RegExp code with 7 parameters. This is a convenience function,
// which sets up the simulator state and grabs the result on return. // which sets up the simulator state and grabs the result on return.
......
...@@ -500,6 +500,14 @@ class Redirection { ...@@ -500,6 +500,14 @@ class Redirection {
return redirection->external_function<void*>(); return redirection->external_function<void*>();
} }
static void DeleteChain(Redirection* redirection) {
while (redirection != nullptr) {
Redirection* next = redirection->next_;
delete redirection;
redirection = next;
}
}
private: private:
void* external_function_; void* external_function_;
Instruction redirect_call_; Instruction redirect_call_;
...@@ -508,6 +516,12 @@ class Redirection { ...@@ -508,6 +516,12 @@ class Redirection {
}; };
// static
void Simulator::TearDown(HashMap* i_cache, Redirection* first) {
Redirection::DeleteChain(first);
}
// Calls into the V8 runtime are based on this very simple interface. // Calls into the V8 runtime are based on this very simple interface.
// Note: To be able to return two values from some calls the code in runtime.cc // Note: To be able to return two values from some calls the code in runtime.cc
// uses the ObjectPair structure. // uses the ObjectPair structure.
......
...@@ -163,6 +163,8 @@ class Simulator : public DecoderVisitor { ...@@ -163,6 +163,8 @@ class Simulator : public DecoderVisitor {
static void Initialize(Isolate* isolate); static void Initialize(Isolate* isolate);
static void TearDown(HashMap* i_cache, Redirection* first);
static Simulator* current(v8::internal::Isolate* isolate); static Simulator* current(v8::internal::Isolate* isolate);
class CallArgument; class CallArgument;
......
...@@ -2001,6 +2001,12 @@ Isolate::~Isolate() { ...@@ -2001,6 +2001,12 @@ Isolate::~Isolate() {
delete debug_; delete debug_;
debug_ = NULL; debug_ = NULL;
#if USE_SIMULATOR
Simulator::TearDown(simulator_i_cache_, simulator_redirection_);
simulator_i_cache_ = nullptr;
simulator_redirection_ = nullptr;
#endif
} }
......
...@@ -989,8 +989,7 @@ Simulator::Simulator(Isolate* isolate) : isolate_(isolate) { ...@@ -989,8 +989,7 @@ Simulator::Simulator(Isolate* isolate) : isolate_(isolate) {
} }
Simulator::~Simulator() { Simulator::~Simulator() { free(stack_); }
}
// When the generated code calls an external reference we need to catch that in // When the generated code calls an external reference we need to catch that in
...@@ -1046,6 +1045,14 @@ class Redirection { ...@@ -1046,6 +1045,14 @@ class Redirection {
return redirection->external_function(); return redirection->external_function();
} }
static void DeleteChain(Redirection* redirection) {
while (redirection != nullptr) {
Redirection* next = redirection->next_;
delete redirection;
redirection = next;
}
}
private: private:
void* external_function_; void* external_function_;
uint32_t swi_instruction_; uint32_t swi_instruction_;
...@@ -1054,6 +1061,19 @@ class Redirection { ...@@ -1054,6 +1061,19 @@ class Redirection {
}; };
// static
void Simulator::TearDown(HashMap* i_cache, Redirection* first) {
Redirection::DeleteChain(first);
if (i_cache != nullptr) {
for (HashMap::Entry* entry = i_cache->Start(); entry != nullptr;
entry = i_cache->Next(entry)) {
delete static_cast<CachePage*>(entry->value);
}
delete i_cache;
}
}
void* Simulator::RedirectExternalReference(void* external_function, void* Simulator::RedirectExternalReference(void* external_function,
ExternalReference::Type type) { ExternalReference::Type type) {
Redirection* redirection = Redirection::Get(external_function, type); Redirection* redirection = Redirection::Get(external_function, type);
......
...@@ -200,6 +200,8 @@ class Simulator { ...@@ -200,6 +200,8 @@ class Simulator {
// Call on program start. // Call on program start.
static void Initialize(Isolate* isolate); static void Initialize(Isolate* isolate);
static void TearDown(HashMap* i_cache, Redirection* first);
// V8 generally calls into generated JS code with 5 parameters and into // V8 generally calls into generated JS code with 5 parameters and into
// generated RegExp code with 7 parameters. This is a convenience function, // generated RegExp code with 7 parameters. This is a convenience function,
// which sets up the simulator state and grabs the result on return. // which sets up the simulator state and grabs the result on return.
......
...@@ -920,8 +920,7 @@ Simulator::Simulator(Isolate* isolate) : isolate_(isolate) { ...@@ -920,8 +920,7 @@ Simulator::Simulator(Isolate* isolate) : isolate_(isolate) {
} }
Simulator::~Simulator() { Simulator::~Simulator() { free(stack_); }
}
// When the generated code calls an external reference we need to catch that in // When the generated code calls an external reference we need to catch that in
...@@ -977,6 +976,14 @@ class Redirection { ...@@ -977,6 +976,14 @@ class Redirection {
return redirection->external_function(); return redirection->external_function();
} }
static void DeleteChain(Redirection* redirection) {
while (redirection != nullptr) {
Redirection* next = redirection->next_;
delete redirection;
redirection = next;
}
}
private: private:
void* external_function_; void* external_function_;
uint32_t swi_instruction_; uint32_t swi_instruction_;
...@@ -985,6 +992,19 @@ class Redirection { ...@@ -985,6 +992,19 @@ class Redirection {
}; };
// static
void Simulator::TearDown(HashMap* i_cache, Redirection* first) {
Redirection::DeleteChain(first);
if (i_cache != nullptr) {
for (HashMap::Entry* entry = i_cache->Start(); entry != nullptr;
entry = i_cache->Next(entry)) {
delete static_cast<CachePage*>(entry->value);
}
delete i_cache;
}
}
void* Simulator::RedirectExternalReference(void* external_function, void* Simulator::RedirectExternalReference(void* external_function,
ExternalReference::Type type) { ExternalReference::Type type) {
Redirection* redirection = Redirection::Get(external_function, type); Redirection* redirection = Redirection::Get(external_function, type);
......
...@@ -232,6 +232,8 @@ class Simulator { ...@@ -232,6 +232,8 @@ class Simulator {
// Call on program start. // Call on program start.
static void Initialize(Isolate* isolate); static void Initialize(Isolate* isolate);
static void TearDown(HashMap* i_cache, Redirection* first);
// V8 generally calls into generated JS code with 5 parameters and into // V8 generally calls into generated JS code with 5 parameters and into
// generated RegExp code with 7 parameters. This is a convenience function, // generated RegExp code with 7 parameters. This is a convenience function,
// which sets up the simulator state and grabs the result on return. // which sets up the simulator state and grabs the result on return.
......
...@@ -830,7 +830,7 @@ Simulator::Simulator(Isolate* isolate) : isolate_(isolate) { ...@@ -830,7 +830,7 @@ Simulator::Simulator(Isolate* isolate) : isolate_(isolate) {
} }
Simulator::~Simulator() {} Simulator::~Simulator() { free(stack_); }
// When the generated code calls an external reference we need to catch that in // When the generated code calls an external reference we need to catch that in
...@@ -888,6 +888,14 @@ class Redirection { ...@@ -888,6 +888,14 @@ class Redirection {
return redirection->external_function(); return redirection->external_function();
} }
static void DeleteChain(Redirection* redirection) {
while (redirection != nullptr) {
Redirection* next = redirection->next_;
delete redirection;
redirection = next;
}
}
private: private:
void* external_function_; void* external_function_;
uint32_t swi_instruction_; uint32_t swi_instruction_;
...@@ -896,6 +904,19 @@ class Redirection { ...@@ -896,6 +904,19 @@ class Redirection {
}; };
// static
void Simulator::TearDown(HashMap* i_cache, Redirection* first) {
Redirection::DeleteChain(first);
if (i_cache != nullptr) {
for (HashMap::Entry* entry = i_cache->Start(); entry != nullptr;
entry = i_cache->Next(entry)) {
delete static_cast<CachePage*>(entry->value);
}
delete i_cache;
}
}
void* Simulator::RedirectExternalReference(void* external_function, void* Simulator::RedirectExternalReference(void* external_function,
ExternalReference::Type type) { ExternalReference::Type type) {
Redirection* redirection = Redirection::Get(external_function, type); Redirection* redirection = Redirection::Get(external_function, type);
......
...@@ -212,6 +212,8 @@ class Simulator { ...@@ -212,6 +212,8 @@ class Simulator {
// Call on program start. // Call on program start.
static void Initialize(Isolate* isolate); static void Initialize(Isolate* isolate);
static void TearDown(HashMap* i_cache, Redirection* first);
// V8 generally calls into generated JS code with 5 parameters and into // V8 generally calls into generated JS code with 5 parameters and into
// generated RegExp code with 7 parameters. This is a convenience function, // generated RegExp code with 7 parameters. This is a convenience function,
// which sets up the simulator state and grabs the result on return. // which sets up the simulator state and grabs the result on return.
......
...@@ -83,10 +83,11 @@ using namespace v8::internal; ...@@ -83,10 +83,11 @@ using namespace v8::internal;
abort(); \ abort(); \
} }
#define CLEANUP() \ #define CLEANUP() \
delete disasm; \ delete disasm; \
delete decoder; \ delete decoder; \
delete assm delete assm; \
free(buf)
static bool vm_initialized = false; static bool vm_initialized = false;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment