[vm] Initial implementation of dynamic modules in the VM/AOT

TEST=Manually tested dynamic modules

Change-Id: Icb2616e414167bd1fbd10f01dea64c57dbdeeac7
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/380281
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
This commit is contained in:
Alexander Markov
2024-08-15 14:09:52 +00:00
committed by Commit Queue
parent a09fbf8468
commit 8fbca8ba67
73 changed files with 14701 additions and 3515 deletions
+28 -5
View File
@@ -17,6 +17,7 @@
#include "vm/debugger.h"
#include "vm/deopt_instructions.h"
#include "vm/flags.h"
#include "vm/interpreter.h"
#include "vm/log.h"
#include "vm/longjump.h"
#include "vm/object.h"
@@ -105,14 +106,25 @@ static void BuildStackTrace(StackTraceBuilder* builder) {
StackFrame* frame = frames.NextFrame();
ASSERT(frame != nullptr); // We expect to find a dart invocation frame.
Code& code = Code::Handle();
Bytecode& bytecode = Bytecode::Handle();
for (; frame != nullptr; frame = frames.NextFrame()) {
if (!frame->IsDartFrame()) {
continue;
}
code = frame->LookupDartCode();
ASSERT(code.ContainsInstructionAt(frame->pc()));
const uword pc_offset = frame->pc() - code.PayloadStart();
builder->AddFrame(code, pc_offset);
if (frame->is_interpreted()) {
bytecode = frame->LookupDartBytecode();
ASSERT(bytecode.ContainsInstructionAt(frame->pc()));
if (bytecode.function() == Function::null()) {
continue;
}
const uword pc_offset = frame->pc() - bytecode.PayloadStart();
builder->AddFrame(bytecode, pc_offset);
} else {
code = frame->LookupDartCode();
ASSERT(code.ContainsInstructionAt(frame->pc()));
const uword pc_offset = frame->pc() - code.PayloadStart();
builder->AddFrame(code, pc_offset);
}
}
}
@@ -587,7 +599,9 @@ static void ClearLazyDeopts(Thread* thread, uword frame_pointer) {
StackFrameIterator::kNoCrossThreadIteration);
for (StackFrame* frame = frames.NextFrame(); frame != nullptr;
frame = frames.NextFrame()) {
if (frame->fp() >= frame_pointer) {
if (frame->is_interpreted()) {
continue;
} else if (frame->fp() >= frame_pointer) {
break;
}
if (frame->IsMarkedForLazyDeopt()) {
@@ -634,6 +648,15 @@ NO_SANITIZE_SAFE_STACK // This function manipulates the safestack pointer.
uword frame_pointer,
bool clear_deopt_at_target) {
ASSERT(thread->execution_state() == Thread::kThreadInVM);
#if defined(DART_DYNAMIC_MODULES)
Interpreter* interpreter = thread->interpreter();
if ((interpreter != nullptr) && interpreter->HasFrame(frame_pointer)) {
interpreter->JumpToFrame(program_counter, stack_pointer, frame_pointer,
thread);
}
#endif // defined(DART_DYNAMIC_MODULES)
const uword fp_for_clearing =
(clear_deopt_at_target ? frame_pointer + 1 : frame_pointer);
ClearLazyDeopts(thread, fp_for_clearing);