From 1eb1c343dec25e630213dccdca30ffc980601adf Mon Sep 17 00:00:00 2001 From: herongpeng Date: Tue, 26 Aug 2025 16:46:43 +0800 Subject: [PATCH] Adjust the static AOT switch Adjust the static AOT switch Issue:https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/ICUVE1 Signed-off-by: herongpeng Change-Id: I8f26aa524b1f1a0422c7f45fdc3f3bd194ef63af --- compiler_service/include/aot_args_handler.h | 18 ++- compiler_service/src/aot_args_handler.cpp | 57 +++++--- .../aotcompilerargshandler_unit/BUILD.gn | 2 + .../aotcompilerargshandler_unit.cpp | 124 +++++++++++++++--- 4 files changed, 157 insertions(+), 44 deletions(-) diff --git a/compiler_service/include/aot_args_handler.h b/compiler_service/include/aot_args_handler.h index 9af571ebbe..3c91928a1e 100644 --- a/compiler_service/include/aot_args_handler.h +++ b/compiler_service/include/aot_args_handler.h @@ -49,11 +49,24 @@ public: std::string GetCodeSignArgs() const; + void SetParser(const std::unordered_map &argsMap); + + void SetIsEnableStaticCompiler(bool value) + { + isEnableStaticCompiler_ = value; + } + + bool IsEnableStaticCompiler() const + { + return isEnableStaticCompiler_; + } + private: std::unique_ptr parser_; const std::unordered_map argsMap_; HapArgs hapArgs_; mutable std::mutex hapArgsMutex_; + bool isEnableStaticCompiler_ { false }; }; class AOTArgsParserBase { @@ -108,8 +121,9 @@ public: class AOTArgsParserFactory { public: - static std::optional> GetParser(const std::unordered_map &argsMap); + static std::optional> GetParser( + const std::unordered_map &argsMap, bool IsEnableStaticCompiler = false); }; } // namespace OHOS::ArkCompiler #endif // OHOS_ARKCOMPILER_AOT_ARGS_HANDLER_H + \ No newline at end of file diff --git a/compiler_service/src/aot_args_handler.cpp b/compiler_service/src/aot_args_handler.cpp index ab2f6cee9b..ae35d8d621 100644 --- a/compiler_service/src/aot_args_handler.cpp +++ b/compiler_service/src/aot_args_handler.cpp @@ -49,13 +49,26 @@ const std::string ETS_PATH = "/ets"; const std::string OWNERID_SHARED_TAG = "SHARED_LIB_ID"; #ifdef ENABLE_COMPILER_SERVICE_GET_PARAMETER -// Default closed, open on qiangji +// disable on master branch defaultly, only enable on feature branch const bool ARK_AOT_ENABLE_STATIC_COMPILER_DEFAULT_VALUE = false; #endif AOTArgsHandler::AOTArgsHandler(const std::unordered_map &argsMap) : argsMap_(argsMap) { - parser_ = *AOTArgsParserFactory::GetParser(argsMap); +#ifdef ENABLE_COMPILER_SERVICE_GET_PARAMETER + SetIsEnableStaticCompiler(AOTArgsParserBase::IsEnableStaticCompiler()); +#endif + SetParser(argsMap); +} + +void AOTArgsHandler::SetParser(const std::unordered_map &argsMap) +{ + auto parserOpt = AOTArgsParserFactory::GetParser(argsMap, IsEnableStaticCompiler()); + if (parserOpt.has_value()) { + parser_ = std::move(parserOpt.value()); + } else { + parser_ = nullptr; + } } int32_t AOTArgsHandler::Handle(int32_t thermalLevel) @@ -64,6 +77,10 @@ int32_t AOTArgsHandler::Handle(int32_t thermalLevel) LOG_SA(ERROR) << "pass empty args to aot sa"; return ERR_AOT_COMPILER_PARAM_FAILED; } + if (!parser_) { + LOG_SA(ERROR) << "AOTArgsParser is null, invalid parameters"; + return ERR_AOT_COMPILER_PARAM_FAILED; + } std::lock_guard lock(hapArgsMutex_); int32_t ret = parser_->Parse(argsMap_, hapArgs_, thermalLevel); @@ -300,13 +317,25 @@ std::string StaticAOTArgsParser::ParseLocation(std::string &anFilePath) } std::optional> AOTArgsParserFactory::GetParser( - const std::unordered_map &argsMap) + const std::unordered_map &argsMap, bool isEnableStaticCompiler) { -#ifdef ENABLE_COMPILER_SERVICE_GET_PARAMETER - if (!AOTArgsParserBase::IsEnableStaticCompiler()) { + std::string arkTsMode; + if (AOTArgsParserBase::FindArgsIdxToString(argsMap, ArgsIdx::ARKTS_MODE, arkTsMode) != ERR_OK) { + LOG_SA(INFO) << "aot sa failed to get arkTsMode"; return std::make_unique(); } -#endif + if (arkTsMode == ARKTS_DYNAMIC) { + LOG_SA(INFO) << "aot sa use default compiler"; + return std::make_unique(); + } + if (arkTsMode != ARKTS_STATIC && arkTsMode != ARKTS_HYBRID) { + LOG_SA(ERROR) << "aot sa get invalid code arkTsMode"; + return std::nullopt; + } + // After this, only arkTsMode that is static or hybrid will proceed downwards + if (!isEnableStaticCompiler) { + return std::nullopt; + } int32_t isSystemComponent = 0; if ((AOTArgsParserBase::FindArgsIdxToInteger(argsMap, ArgsIdx::IS_SYSTEM_COMPONENT, isSystemComponent) != ERR_OK)) { LOG_SA(INFO) << "aot sa failed to get isSystemComponent"; @@ -314,21 +343,7 @@ std::optional> AOTArgsParserFactory::GetParse if (isSystemComponent) { return std::make_unique(); } - std::string arkTsMode; - if (AOTArgsParserBase::FindArgsIdxToString(argsMap, ArgsIdx::ARKTS_MODE, arkTsMode) != ERR_OK) { - LOG_SA(INFO) << "aot sa failed to get language version"; - arkTsMode = ARKTS_DYNAMIC; - } - - if (arkTsMode == ARKTS_DYNAMIC) { - LOG_SA(INFO) << "aot sa use default compiler"; - return std::make_unique(); - } else if (arkTsMode == ARKTS_STATIC || arkTsMode == ARKTS_HYBRID) { - LOG_SA(INFO) << "aot sa use static compiler"; - return std::make_unique(); - } - LOG_SA(FATAL) << "aot sa get invalid code language version"; - return std::nullopt; + return std::make_unique(); } bool StaticFrameworkAOTArgsParser::IsFileExists(const std::string &fileName) diff --git a/compiler_service/test/unittest/aotcompilerargshandler_unit/BUILD.gn b/compiler_service/test/unittest/aotcompilerargshandler_unit/BUILD.gn index 4d0b7078db..4234503693 100644 --- a/compiler_service/test/unittest/aotcompilerargshandler_unit/BUILD.gn +++ b/compiler_service/test/unittest/aotcompilerargshandler_unit/BUILD.gn @@ -81,6 +81,8 @@ ohos_unittest("AotCompilerArgsHandlerUnitTest") { "samgr:samgr_proxy", ] defines = [] + external_deps += [ "init:libbegetutil" ] + defines += [ "ENABLE_COMPILER_SERVICE_GET_PARAMETER" ] if (code_sign_enable_test) { external_deps += [ "code_signature:liblocal_code_sign_sdk" ] defines += [ "CODE_SIGN_ENABLE" ] diff --git a/compiler_service/test/unittest/aotcompilerargshandler_unit/aotcompilerargshandler_unit.cpp b/compiler_service/test/unittest/aotcompilerargshandler_unit/aotcompilerargshandler_unit.cpp index 8a9fa88cf2..e5e84d90f8 100644 --- a/compiler_service/test/unittest/aotcompilerargshandler_unit/aotcompilerargshandler_unit.cpp +++ b/compiler_service/test/unittest/aotcompilerargshandler_unit/aotcompilerargshandler_unit.cpp @@ -36,8 +36,27 @@ public: static void SetUpTestCase() {} static void TearDownTestCase() {} - void SetUp() override {} - void TearDown() override {}; + void SetUp() override + { + mkdir(systemDir_, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + mkdir(systemFrameworkDir_, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); + std::string bootpathJsonStr = + "{\"bootpath\":\"/system/framework/etsstdlib_bootabc.abc:/system/framework/arkoala.abc\"}"; + std::ofstream file(bootPathJson_); + file << bootpathJsonStr << std::endl; + file.close(); + } + + void TearDown() override + { + unlink(bootPathJson_); + rmdir(systemFrameworkDir_); + rmdir(bootPathJson_); + }; + + const char *systemDir_ = "/system"; + const char *systemFrameworkDir_ = "/system/framework"; + const char *bootPathJson_ = "/system/framework/bootpath.json"; }; /** @@ -169,6 +188,8 @@ HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_007, TestSize.Level0) std::unordered_map argsMap(argsMapForTest); argsMap.emplace(ArgsIdx::ARKTS_MODE, "dynamic"); std::unique_ptr argsHandler = std::make_unique(argsMap); + argsHandler->SetIsEnableStaticCompiler(true); + argsHandler->SetParser(argsMap); int32_t ret = argsHandler->Handle(0); EXPECT_EQ(ret, ERR_OK); std::vector argv = argsHandler->GetAotArgs(); @@ -185,6 +206,8 @@ HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_008, TestSize.Level0) std::unordered_map argsMap(argsMapForTest); argsMap.emplace(ArgsIdx::ARKTS_MODE, "static"); std::unique_ptr argsHandler = std::make_unique(argsMap); + argsHandler->SetIsEnableStaticCompiler(true); + argsHandler->SetParser(argsMap); int32_t ret = argsHandler->Handle(0); EXPECT_EQ(ret, ERR_OK); std::vector argv = argsHandler->GetAotArgs(); @@ -209,24 +232,16 @@ const std::unordered_map framewordArgsMapForTest { {"outputPath", "/data/service/el1/public/for-all-app/framework_ark_cache/etsstdlib_bootabc.an"}, {"anFileName", "/data/service/el1/public/for-all-app/framework_ark_cache/etsstdlib_bootabc.an"}, {"isSysComp", "1"}, + {ArgsIdx::ARKTS_MODE, "static"}, {"sysCompPath", "/system/framework/etsstdlib_bootabc.abc"}, {"ABC-Path", "/system/framework/etsstdlib_bootabc.abc"} }; HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_010, TestSize.Level0) { - const char *systemDir = "/system"; - const char *systemFrameworkDir = "/system/framework"; - const char *bootPathJson = "/system/framework/bootpath.json"; - mkdir(systemDir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); - mkdir(systemFrameworkDir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); - std::string bootpathJsonStr = - "{\"bootpath\":\"/system/framework/etsstdlib_bootabc.abc:/system/framework/arkoala.abc\"}"; - std::ofstream file(bootPathJson); - file << bootpathJsonStr << std::endl; - file.close(); - std::unique_ptr argsHandler = std::make_unique(framewordArgsMapForTest); + argsHandler->SetIsEnableStaticCompiler(true); + argsHandler->SetParser(framewordArgsMapForTest); int32_t ret = argsHandler->Handle(0); EXPECT_EQ(ret, ERR_OK); std::string fileName = argsHandler->GetFileName(); @@ -243,9 +258,6 @@ HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_010, TestSize.Level0) EXPECT_STREQ(arg, "--boot-panda-files=/system/framework/etsstdlib_bootabc.abc"); } } - unlink(bootPathJson); - rmdir(systemFrameworkDir); - rmdir(systemDir); } /** @@ -259,7 +271,7 @@ HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_011, TestSize.Level0) { {ArgsIdx::ARKTS_MODE, "static"} }; - auto result = AOTArgsParserFactory::GetParser(argsMap); + auto result = AOTArgsParserFactory::GetParser(argsMap, true); EXPECT_TRUE(result.has_value()); EXPECT_NE(result.value(), nullptr); } @@ -274,7 +286,7 @@ HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_012, TestSize.Level0) { {ArgsIdx::ARKTS_MODE, "hybrid"} }; - auto result = AOTArgsParserFactory::GetParser(argsMap); + auto result = AOTArgsParserFactory::GetParser(argsMap, true); EXPECT_TRUE(result.has_value()); EXPECT_NE(result.value(), nullptr); } @@ -291,7 +303,7 @@ HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_013, TestSize.Level0) {ArgsIdx::ARKTS_MODE, "dynamic"} }; - auto result = AOTArgsParserFactory::GetParser(argsMap); + auto result = AOTArgsParserFactory::GetParser(argsMap, true); EXPECT_TRUE(result.has_value()); EXPECT_NE(result.value(), nullptr); } @@ -308,7 +320,7 @@ HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_014, TestSize.Level0) {ArgsIdx::ARKTS_MODE, "dynamic"} }; - auto result = AOTArgsParserFactory::GetParser(argsMap); + auto result = AOTArgsParserFactory::GetParser(argsMap, true); EXPECT_NE(result, nullptr); EXPECT_NE(result.value(), nullptr); } @@ -324,8 +336,78 @@ HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_015, TestSize.Level0) {ArgsIdx::IS_SYSTEM_COMPONENT, "0"} }; - auto result = AOTArgsParserFactory::GetParser(argsMap); + auto result = AOTArgsParserFactory::GetParser(argsMap, true); EXPECT_TRUE(result.has_value()); EXPECT_NE(result.value(), nullptr); } + +HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_016, TestSize.Level0) +{ + std::unordered_map argsMap = { + {ArgsIdx::ARKTS_MODE, "static"}, + {ArgsIdx::IS_SYSTEM_COMPONENT, "1"} + }; + std::unique_ptr argsHandler = std::make_unique(argsMap); + int32_t ret = argsHandler->Handle(0); + EXPECT_EQ(ret, ERR_AOT_COMPILER_PARAM_FAILED); +} + +HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_017, TestSize.Level0) +{ + std::unordered_map argsMap = { + {ArgsIdx::ARKTS_MODE, "dynamic"}, + {ArgsIdx::IS_SYSTEM_COMPONENT, "0"} + }; + std::unique_ptr argsHandler = std::make_unique(argsMap); + int32_t ret = argsHandler->Handle(0); + EXPECT_EQ(ret, ERR_AOT_COMPILER_PARAM_FAILED); +} + +HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_018, TestSize.Level0) +{ + std::unordered_map argsMap = { + {ArgsIdx::IS_SYSTEM_COMPONENT, "0"} + }; + std::unique_ptr argsHandler = std::make_unique(argsMap); + int32_t ret = argsHandler->Handle(0); + EXPECT_EQ(ret, ERR_AOT_COMPILER_PARAM_FAILED); +} + +HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_019, TestSize.Level0) +{ + std::unordered_map argsMap = { + {ArgsIdx::ARKTS_MODE, "static"}, + {ArgsIdx::IS_SYSTEM_COMPONENT, "1"} + }; + std::unique_ptr argsHandler = std::make_unique(argsMap); + argsHandler->SetIsEnableStaticCompiler(true); + argsHandler->SetParser(argsMap); + int32_t ret = argsHandler->Handle(0); + EXPECT_EQ(ret, ERR_AOT_COMPILER_PARAM_FAILED); +} + +HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_020, TestSize.Level0) +{ + std::unordered_map argsMap = { + {ArgsIdx::ARKTS_MODE, "static"}, + {ArgsIdx::IS_SYSTEM_COMPONENT, "0"} + }; + std::unique_ptr argsHandler = std::make_unique(argsMap); + argsHandler->SetIsEnableStaticCompiler(true); + argsHandler->SetParser(argsMap); + int32_t ret = argsHandler->Handle(0); + EXPECT_EQ(ret, ERR_AOT_COMPILER_PARAM_FAILED); +} + +HWTEST_F(AotArgsHandlerTest, AotArgsHandlerTest_021, TestSize.Level0) +{ + std::unordered_map argsMap = { + {ArgsIdx::ARKTS_MODE, "INVALID_VALUE"} + }; + std::unique_ptr argsHandler = std::make_unique(argsMap); + argsHandler->SetIsEnableStaticCompiler(true); + argsHandler->SetParser(argsMap); + int32_t ret = argsHandler->Handle(0); + EXPECT_EQ(ret, ERR_AOT_COMPILER_PARAM_FAILED); +} } // namespace OHOS::ArkCompiler \ No newline at end of file -- Gitee