diff --git a/ecmascript/compiler/codegen/llvm/llvm_ir_builder.cpp b/ecmascript/compiler/codegen/llvm/llvm_ir_builder.cpp index a68ad5ee22..cdaec5de8a 100644 --- a/ecmascript/compiler/codegen/llvm/llvm_ir_builder.cpp +++ b/ecmascript/compiler/codegen/llvm/llvm_ir_builder.cpp @@ -355,6 +355,30 @@ BasicBlockImpl *LLVMIRBuilder::EnsureBBImpl(BasicBlock *bb) const return bb->GetImpl(); } +void LLVMIRBuilder::AssistGenPrologue(const size_t reservedSlotsSize, FrameType frameType) +{ + LLVMAddTargetDependentFunctionAttr(function_, "frame-reserved-slots", + std::to_string(reservedSlotsSize).c_str()); + auto ArgList = circuit_->GetArgRoot(); + auto uses = acc_.Uses(ArgList); + for (auto useIt = uses.begin(); useIt != uses.end(); ++useIt) { + int argth = static_cast(acc_.TryGetValue(*useIt)); + LLVMValueRef value = LLVMGetParam(function_, argth); + int funcIndex = 0; + if (isFastCallAot_) { + frameType = FrameType::FASTJIT_FAST_CALL_FUNCTION_FRAME; + funcIndex = static_cast(FastCallArgIdx::FUNC); + } else { + funcIndex = static_cast(CommonArgIdx::FUNC); + } + if (argth == funcIndex) { + SaveByteCodePcOnOptJSFuncFrame(value); + SaveJSFuncOnOptJSFuncFrame(value); + SaveFrameTypeOnFrame(frameType, builder_); + } + } +} + void LLVMIRBuilder::GenPrologue() { auto frameType = circuit_->GetFrameType(); @@ -397,26 +421,7 @@ void LLVMIRBuilder::GenPrologue() } } else if (frameType == FrameType::FASTJIT_FUNCTION_FRAME) { reservedSlotsSize = FASTJITFunctionFrame::ComputeReservedPcOffset(slotSize_); - LLVMAddTargetDependentFunctionAttr(function_, "frame-reserved-slots", - std::to_string(reservedSlotsSize).c_str()); - auto ArgList = circuit_->GetArgRoot(); - auto uses = acc_.Uses(ArgList); - for (auto useIt = uses.begin(); useIt != uses.end(); ++useIt) { - int argth = static_cast(acc_.TryGetValue(*useIt)); - LLVMValueRef value = LLVMGetParam(function_, argth); - int funcIndex = 0; - if (isFastCallAot_) { - frameType = FrameType::FASTJIT_FAST_CALL_FUNCTION_FRAME; - funcIndex = static_cast(FastCallArgIdx::FUNC); - } else { - funcIndex = static_cast(CommonArgIdx::FUNC); - } - if (argth == funcIndex) { - SaveByteCodePcOnOptJSFuncFrame(value); - SaveJSFuncOnOptJSFuncFrame(value); - SaveFrameTypeOnFrame(frameType, builder_); - } - } + AssistGenPrologue(reservedSlotsSize, frameType); } else { LOG_COMPILER(FATAL) << "frameType interpret type error !"; ASSERT_PRINT(static_cast(frameType), "is not support !"); diff --git a/ecmascript/compiler/codegen/llvm/llvm_ir_builder.h b/ecmascript/compiler/codegen/llvm/llvm_ir_builder.h index c3a5bcee1e..79355ec88e 100644 --- a/ecmascript/compiler/codegen/llvm/llvm_ir_builder.h +++ b/ecmascript/compiler/codegen/llvm/llvm_ir_builder.h @@ -292,6 +292,7 @@ private: LLVMValueRef GetCurrentSP(); LLVMValueRef ReadRegister(LLVMModuleRef &module, LLVMBuilderRef &builder, LLVMMetadataRef meta); void GenPrologue(); + void AssistGenPrologue(const size_t reservedSlotsSize, FrameType frameType); LLVMBasicBlockRef EnsureLBB(BasicBlock *bb) const; BasicBlockImpl *EnsureBBImpl(BasicBlock *bb) const; void SetToCfg(BasicBlock *bb) const; diff --git a/ecmascript/compiler/codegen/maple/litecg_ir_builder.cpp b/ecmascript/compiler/codegen/maple/litecg_ir_builder.cpp index 1d98a10687..e0c5b3c18e 100644 --- a/ecmascript/compiler/codegen/maple/litecg_ir_builder.cpp +++ b/ecmascript/compiler/codegen/maple/litecg_ir_builder.cpp @@ -294,6 +294,35 @@ void LiteCGIRBuilder::Build() lmirBuilder_->AppendBB(lmirBuilder_->GetLastPosBB()); } +void LiteCGIRBuilder::AssistGenPrologue(const size_t reservedSlotsSize, FrameType frameType, + maple::litecg::Function &function) +{ + lmirBuilder_->SetFuncFrameResverdSlot(reservedSlotsSize); + if (circuit_->IsOsr()) { + SaveFrameTypeOnFrame(methodLiteral_->IsFastCall() ? FrameType::FASTJIT_FAST_CALL_FUNCTION_FRAME : + frameType); + return; + } + auto ArgList = circuit_->GetArgRoot(); + auto uses = acc_.Uses(ArgList); + for (auto useIt = uses.begin(); useIt != uses.end(); ++useIt) { + int argth = static_cast(acc_.TryGetValue(*useIt)); + Var &value = lmirBuilder_->GetParam(function, argth); + int funcIndex = 0; + if (methodLiteral_->IsFastCall()) { + frameType = FrameType::FASTJIT_FAST_CALL_FUNCTION_FRAME; + funcIndex = static_cast(FastCallArgIdx::FUNC); + } else { + funcIndex = static_cast(CommonArgIdx::FUNC); + } + if (argth == funcIndex) { + SaveByteCodePcOnOptJSFuncFrame(value); + SaveJSFuncOnOptJSFuncFrame(value); + SaveFrameTypeOnFrame(frameType); + } + } +} + void LiteCGIRBuilder::GenPrologue(maple::litecg::Function &function) { auto frameType = circuit_->GetFrameType(); @@ -333,30 +362,7 @@ void LiteCGIRBuilder::GenPrologue(maple::litecg::Function &function) } } else if (frameType == FrameType::FASTJIT_FUNCTION_FRAME) { reservedSlotsSize = FASTJITFunctionFrame::ComputeReservedPcOffset(slotSize_); - lmirBuilder_->SetFuncFrameResverdSlot(reservedSlotsSize); - if (circuit_->IsOsr()) { - SaveFrameTypeOnFrame(methodLiteral_->IsFastCall() ? FrameType::FASTJIT_FAST_CALL_FUNCTION_FRAME : - frameType); - return; - } - auto ArgList = circuit_->GetArgRoot(); - auto uses = acc_.Uses(ArgList); - for (auto useIt = uses.begin(); useIt != uses.end(); ++useIt) { - int argth = static_cast(acc_.TryGetValue(*useIt)); - Var &value = lmirBuilder_->GetParam(function, argth); - int funcIndex = 0; - if (methodLiteral_->IsFastCall()) { - frameType = FrameType::FASTJIT_FAST_CALL_FUNCTION_FRAME; - funcIndex = static_cast(FastCallArgIdx::FUNC); - } else { - funcIndex = static_cast(CommonArgIdx::FUNC); - } - if (argth == funcIndex) { - SaveByteCodePcOnOptJSFuncFrame(value); - SaveJSFuncOnOptJSFuncFrame(value); - SaveFrameTypeOnFrame(frameType); - } - } + AssistGenPrologue(reservedSlotsSize, frameType, function); } else { LOG_COMPILER(FATAL) << "frameType interpret type error !"; ASSERT_PRINT(static_cast(frameType), "is not support !"); diff --git a/ecmascript/compiler/codegen/maple/litecg_ir_builder.h b/ecmascript/compiler/codegen/maple/litecg_ir_builder.h index aafef23be7..4329b46d19 100644 --- a/ecmascript/compiler/codegen/maple/litecg_ir_builder.h +++ b/ecmascript/compiler/codegen/maple/litecg_ir_builder.h @@ -206,6 +206,7 @@ private: void CollectExraCallSiteInfo(std::unordered_map &deoptBundleInfo, maple::litecg::Expr pcOffset, GateRef frameArgs); void GenPrologue(maple::litecg::Function &function); + void AssistGenPrologue(const size_t reservedSlotsSize, FrameType frameType, maple::litecg::Function &function); void SaveByteCodePcOnOptJSFuncFrame(maple::litecg::Var &value); void SaveJSFuncOnOptJSFuncFrame(maple::litecg::Var &value); void SaveFrameTypeOnFrame(FrameType frameType); diff --git a/ecmascript/dfx/stackinfo/js_stackinfo.cpp b/ecmascript/dfx/stackinfo/js_stackinfo.cpp index ad3585b52e..941c5c33b2 100644 --- a/ecmascript/dfx/stackinfo/js_stackinfo.cpp +++ b/ecmascript/dfx/stackinfo/js_stackinfo.cpp @@ -951,6 +951,7 @@ bool ArkWriteJitCode([[maybe_unused]] void *ctx, [[maybe_unused]] ReadMemFunc re } jitDumpElf.WriteJitElfFile(fd); JsStackInfo::nameMap.clear(); + JsStackInfo::machineCodeMap.clear(); return true; } diff --git a/ecmascript/ecma_vm.cpp b/ecmascript/ecma_vm.cpp index 175c5d0903..2f320d911f 100644 --- a/ecmascript/ecma_vm.cpp +++ b/ecmascript/ecma_vm.cpp @@ -233,8 +233,7 @@ void EcmaVM::PostFork() } ResetPGOProfiler(); - bool enableJitFrame = ohos::JitTools::GetJitFrameEnable(); - options_.SetEnableJitFrame(enableJitFrame); + options_.SetEnableJitFrame(ohos::JitTools::GetJitFrameEnable()); bool jitEscapeDisable = ohos::JitTools::GetJitEscapeDisable(); if (jitEscapeDisable || !JSNApi::IsJitEscape()) { diff --git a/ecmascript/frames.h b/ecmascript/frames.h index 3e774745a9..0ceed9f9e7 100644 --- a/ecmascript/frames.h +++ b/ecmascript/frames.h @@ -1711,7 +1711,7 @@ struct BuiltinWithArgvFrame : public base::AlignedStruct |--------------------------| --------------- +// callerSp ---> |--------------------------| --------------- // | returnAddr | ^ // |--------------------------| | // | callsiteFp | | @@ -1721,7 +1721,7 @@ struct BuiltinWithArgvFrame : public base::AlignedStruct +--------------------------+ --------------- // // NOLINTNEXTLINE(cppcoreguidelines-pro-type-member-init) struct FASTJITFunctionFrame : public base::AlignedStruct