diff --git a/ecmascript/compiler/code_generator.h b/ecmascript/compiler/code_generator.h index 54b3c4bf39505374cf8ccc6136c716b4dbe57364..0b5b1817b7f618d2ce82feb943a879724183a762 100644 --- a/ecmascript/compiler/code_generator.h +++ b/ecmascript/compiler/code_generator.h @@ -32,13 +32,10 @@ struct CodeInfo { class CodeSpace { public: static CodeSpace *GetInstance(); - - uint8_t *Alloca(uintptr_t size, bool isReq, size_t alignSize); - - private: CodeSpace(); ~CodeSpace(); - + uint8_t *Alloca(uintptr_t size, bool isReq, size_t alignSize); + private: static constexpr size_t REQUIRED_SECS_LIMIT = (1 << 29); // 512M static constexpr size_t UNREQUIRED_SECS_LIMIT = (1 << 28); // 256M @@ -71,7 +68,7 @@ struct CodeInfo { kungfu::CalleeRegAndOffsetVec calleeRegInfo; }; - CodeInfo(CodeSpaceOnDemand &codeSpaceOnDemand); + CodeInfo(CodeSpaceOnDemand &codeSpaceOnDemand, bool useOwnSpace); ~CodeInfo(); @@ -137,11 +134,14 @@ private: std::unordered_map> pc2CallsiteInfo; bool alreadyPageAlign_ {false}; CodeSpaceOnDemand &codeSpaceOnDemand_; + bool useOwnSpace_ {false}; + std::unique_ptr ownCodeSpace_ {nullptr}; }; class Assembler { public: - explicit Assembler(CodeInfo::CodeSpaceOnDemand &codeSpaceOnDemand) : codeInfo_(codeSpaceOnDemand) + explicit Assembler(CodeInfo::CodeSpaceOnDemand &codeSpaceOnDemand, bool useOwnSpace) + : codeInfo_(codeSpaceOnDemand, useOwnSpace) {} virtual ~Assembler() = default; virtual void Run(const CompilerLog &log, bool fastCompileMode, bool isJit = false) = 0; diff --git a/ecmascript/compiler/codegen/llvm/llvm_codegen.cpp b/ecmascript/compiler/codegen/llvm/llvm_codegen.cpp index c92f50f447de4eb290203acdd595337e28f1ea71..9a1df610995f37b732ebe4c5d11e46f2f67ca210 100644 --- a/ecmascript/compiler/codegen/llvm/llvm_codegen.cpp +++ b/ecmascript/compiler/codegen/llvm/llvm_codegen.cpp @@ -54,9 +54,14 @@ namespace panda::ecmascript::kungfu { using namespace panda::ecmascript; using namespace llvm; -CodeInfo::CodeInfo(CodeSpaceOnDemand &codeSpaceOnDemand) : codeSpaceOnDemand_(codeSpaceOnDemand) +CodeInfo::CodeInfo(CodeSpaceOnDemand &codeSpaceOnDemand, bool useOwnSpace) + : codeSpaceOnDemand_(codeSpaceOnDemand), + useOwnSpace_(useOwnSpace) { secInfos_.fill(std::make_pair(nullptr, 0)); + if (useOwnSpace_) { + ownCodeSpace_ = std::make_unique(); + } } CodeInfo::~CodeInfo() @@ -153,11 +158,17 @@ uint8_t *CodeInfo::AllocaOnDemand(uintptr_t size, size_t alignSize) uint8_t *CodeInfo::AllocaInReqSecBuffer(uintptr_t size, size_t alignSize) { + if (useOwnSpace_) { + return ownCodeSpace_->Alloca(size, true, alignSize); + } return CodeSpace::GetInstance()->Alloca(size, true, alignSize); } uint8_t *CodeInfo::AllocaInNotReqSecBuffer(uintptr_t size, size_t alignSize) { + if (useOwnSpace_) { + return ownCodeSpace_->Alloca(size, false, alignSize); + } return CodeSpace::GetInstance()->Alloca(size, false, alignSize); } @@ -467,8 +478,9 @@ void LLVMAssembler::BuildAndRunPassesFastMode() LLVMDisposePassManager(modPass); } -LLVMAssembler::LLVMAssembler(LLVMModule *lm, CodeInfo::CodeSpaceOnDemand &codeSpaceOnDemand, LOptions option) - : Assembler(codeSpaceOnDemand), +LLVMAssembler::LLVMAssembler(LLVMModule *lm, CodeInfo::CodeSpaceOnDemand &codeSpaceOnDemand, LOptions option, + bool isStubCompiler) + : Assembler(codeSpaceOnDemand, isStubCompiler), llvmModule_(lm), module_(llvmModule_->GetModule()), listener_(this) diff --git a/ecmascript/compiler/codegen/llvm/llvm_codegen.h b/ecmascript/compiler/codegen/llvm/llvm_codegen.h index 4d9e41d0a8922cc8d420f011e52b78a7ae3a8f1b..df0ee192f43d2faca940b593274b1cb030a0a3bd 100644 --- a/ecmascript/compiler/codegen/llvm/llvm_codegen.h +++ b/ecmascript/compiler/codegen/llvm/llvm_codegen.h @@ -64,7 +64,7 @@ struct LOptions { class LLVMAssembler : public Assembler { public: explicit LLVMAssembler(LLVMModule *lm, CodeInfo::CodeSpaceOnDemand &codeSpaceOnDemand, - LOptions option = LOptions()); + LOptions option = LOptions(), bool isStubCompiler = false); virtual ~LLVMAssembler(); void Run(const CompilerLog &log, bool fastCompileMode, bool isJit = false) override; const LLVMExecutionEngineRef &GetEngine() diff --git a/ecmascript/compiler/codegen/maple/litecg_codegen.cpp b/ecmascript/compiler/codegen/maple/litecg_codegen.cpp index 7ced8fde43c6293b49e513c57475439b33d8fcc4..63aee74d4bf5b960343e145d54adde6819d9411d 100644 --- a/ecmascript/compiler/codegen/maple/litecg_codegen.cpp +++ b/ecmascript/compiler/codegen/maple/litecg_codegen.cpp @@ -38,7 +38,7 @@ using namespace panda::ecmascript; LiteCGAssembler::LiteCGAssembler(LMIRModule &module, CodeInfo::CodeSpaceOnDemand &codeSpaceOnDemand, const std::vector &litecgOptions) - : Assembler(codeSpaceOnDemand), lmirModule(module), litecgOptions(litecgOptions) {} + : Assembler(codeSpaceOnDemand, false), lmirModule(module), litecgOptions(litecgOptions) {} static uint8_t *AllocateCodeSection(void *object, uint32_t size, [[maybe_unused]] uint32_t alignment, const std::string §ionName) diff --git a/ecmascript/compiler/file_generators.cpp b/ecmascript/compiler/file_generators.cpp index a7b3e3dfd2cdc5ed89cf44e0b94c04ab6737850f..dbdbe5a7702d435d5ea5656d1dff0546b4fc8cb4 100644 --- a/ecmascript/compiler/file_generators.cpp +++ b/ecmascript/compiler/file_generators.cpp @@ -512,7 +512,7 @@ Module* StubFileGenerator::AddModule(NativeAreaAllocator *allocator, const std:: UNREACHABLE(); break; } - LLVMAssembler* ass = new LLVMAssembler(m, jitCodeSpace_, option); + LLVMAssembler* ass = new LLVMAssembler(m, jitCodeSpace_, option, true); modulePackage_.emplace_back(Module(m, ass)); return &modulePackage_.back(); }