diff --git a/build/core/genmplt.mk b/build/core/genmplt.mk new file mode 100644 index 0000000000000000000000000000000000000000..c59442b02d68ad51d9edc5486254e43d66da4b3f --- /dev/null +++ b/build/core/genmplt.mk @@ -0,0 +1,2 @@ +$(LIB_CORE_MPLT): $(JBC2MPL_BIN) $(LIB_CORE_JAR) + $(JBC2MPL_BIN) -injar $(LIB_CORE_JAR) -output $(LIB_CORE_PATH) diff --git a/build/core/java2jar.mk b/build/core/java2jar.mk index 7366c977546b86ed8bbaaaf908e82ae731d36521..250929ac1a9b7b2b937d0f77563171783c5a5c96 100644 --- a/build/core/java2jar.mk +++ b/build/core/java2jar.mk @@ -1,2 +1,2 @@ -$(APP_JAR): %.jar : %.java - $(JAVA2JAR) $(APP_JAR) ${MAPLE_ROOT}/libjava-core/java-core.jar "$(wildcard *.java)" +$(APP_JAR): %.jar : %.java $(LIB_CORE_JAR) + $(JAVA2JAR) $(APP_JAR) $(LIB_CORE_JAR) "$(wildcard *.java)" diff --git a/build/core/jbc2mpl.mk b/build/core/jbc2mpl.mk index a2bca67ee84601dd4a98c62c231d877ab74da836..2aa542b9a3e818aeeddbfeaf46de462030f9442c 100644 --- a/build/core/jbc2mpl.mk +++ b/build/core/jbc2mpl.mk @@ -1,2 +1,2 @@ -$(APP_MPL): %.mpl : %.jar $(JBC2MPL_BIN) - $(JBC2MPL_BIN) --mplt $(LIB_MPLT) -injar $(APP_JAR) -out $(APP) +$(APP_MPL): %.mpl : %.jar $(JBC2MPL_BIN) $(LIB_CORE_MPLT) + $(JBC2MPL_BIN) --mplt $(LIB_CORE_MPLT) -injar $(APP_JAR) -out $(APP) diff --git a/build/core/maple_test.mk b/build/core/maple_test.mk index a1f421df8c07d3e7b3ab8d7102292f07f48ca228..7c2b38fe53f73b57b9ca2b9f19b8816ea533216c 100644 --- a/build/core/maple_test.mk +++ b/build/core/maple_test.mk @@ -3,6 +3,7 @@ include $(MAPLE_BUILD_CORE)/maple_variables.mk test: $(APP_S) include $(MAPLE_BUILD_CORE)/mplcomb.mk include $(MAPLE_BUILD_CORE)/jbc2mpl.mk +include $(MAPLE_BUILD_CORE)/genmplt.mk include $(MAPLE_BUILD_CORE)/java2jar.mk .PHONY: clean diff --git a/build/core/maple_variables.mk b/build/core/maple_variables.mk index a44a5bd0a171f2dac1ac80714ba6311ff8c5d982..85ce5cda626eb31829ba1e0a5717c9d75fe5e28b 100644 --- a/build/core/maple_variables.mk +++ b/build/core/maple_variables.mk @@ -1,5 +1,7 @@ TARGETS := $(APP) -LIB_MPLT := $(MAPLE_ROOT)/libjava-core/libjava-core.mplt +LIB_CORE_PATH := $(MAPLE_ROOT)/libjava-core +LIB_CORE_JAR := $(LIB_CORE_PATH)/java-core.jar +LIB_CORE_MPLT := $(LIB_CORE_PATH)/java-core.mplt APP_CLASS := $(foreach APP, $(TARGETS), $(APP).class) APP_JAR := $(foreach APP, $(TARGETS), $(APP).jar) APP_MPL := $(foreach APP, $(TARGETS), $(APP).mpl) diff --git a/src/bin/jbc2mpl b/src/bin/jbc2mpl index ec3d7153336484178253d524694a69b7a0af4bf4..3d2b5dde8d508d107ab75828d6b7489e5bc79c12 100755 Binary files a/src/bin/jbc2mpl and b/src/bin/jbc2mpl differ diff --git a/src/bin/maple b/src/bin/maple index 5be1ff0900f10e5339d378437d8526f757a8f520..67733d2cfae90964ccff5d7e1cc67c0b46b62688 100755 Binary files a/src/bin/maple and b/src/bin/maple differ diff --git a/src/bin/mplcg b/src/bin/mplcg index 9de06da2080a4bee3eaecc084f31a2ad52c12995..a7a9dd9ad90feeb0e6ec84aa72c0aea5bee2ef31 100755 Binary files a/src/bin/mplcg and b/src/bin/mplcg differ diff --git a/src/deplibs/libmempool.a b/src/deplibs/libmempool.a index ccb8d9c59e31217546618853badc996f3d398e9c..4bdc164ab0c3a5d8f79d51f5a45765b8799aebb0 100644 Binary files a/src/deplibs/libmempool.a and b/src/deplibs/libmempool.a differ diff --git a/src/maple_driver/include/compiler.h b/src/maple_driver/include/compiler.h index 312ff96038680e6705b5736b7b42c61200c98359..e061e61d6bbe31f0d4091a0f07e87f712cf24620 100644 --- a/src/maple_driver/include/compiler.h +++ b/src/maple_driver/include/compiler.h @@ -60,7 +60,7 @@ class Compiler { return stream.str(); } - virtual DefaultOption GetDefaultOptions(const MplOptions &options) { + virtual DefaultOption GetDefaultOptions(const MplOptions &options) const { return DefaultOption(); } @@ -78,7 +78,7 @@ class Compiler { private: const std::string name; - std::string MakeOption(const MplOptions &options); + std::string MakeOption(const MplOptions &options) const; void AppendDefaultOptions(std::map &finalOptions, const std::map &defaultOptions) const; void AppendUserOptions(std::map &finalOptions, @@ -87,7 +87,7 @@ class Compiler { const std::string &connectSymbol) const; void AppendExtraOptions(std::map &finalOptions, const std::map> &extraOptions) const; - std::map MakeDefaultOptions(const MplOptions &options); + std::map MakeDefaultOptions(const MplOptions &options) const; int Exe(const MplOptions &mplOptions, const std::string &options) const; const std::string &GetName() const { return name; @@ -102,7 +102,7 @@ class Jbc2MplCompiler : public Compiler { private: std::string GetBinName() const override; - DefaultOption GetDefaultOptions(const MplOptions &options) override; + DefaultOption GetDefaultOptions(const MplOptions &options) const override; void GetTmpFilesToDelete(const MplOptions &mplOptions, std::vector &tempFiles) const override; std::unordered_set GetFinalOutputs(const MplOptions &mplOptions) const override; std::vector GetBinNames() const override; @@ -134,7 +134,7 @@ class MplcgCompiler : public Compiler { private: std::string GetInputFileName(const MplOptions &options) const override; - DefaultOption GetDefaultOptions(const MplOptions &options) override; + DefaultOption GetDefaultOptions(const MplOptions &options) const override; std::string GetBinName() const override; std::vector GetBinNames() const override; }; diff --git a/src/maple_driver/include/compiler_factory.h b/src/maple_driver/include/compiler_factory.h index ad3466cd0c35ae5e12cc6193cfe90988f9704b1d..33aad35c5f89516c93f9c2c978ff0ea7f2657acd 100644 --- a/src/maple_driver/include/compiler_factory.h +++ b/src/maple_driver/include/compiler_factory.h @@ -39,7 +39,7 @@ class CompilerFactory { const std::unordered_set &finalOutputs) const; SupportedCompilers supportedCompilers; CompilerSelector *compilerSelector; - MIRModule *theModule; + MIRModule *theModule = nullptr; }; } // namespace maple #endif // MAPLE_DRIVER_INCLUDE_COMPILER_FACTORY_H diff --git a/src/maple_driver/include/compiler_selector.h b/src/maple_driver/include/compiler_selector.h index 57eae416b9cc592a9a0f0e8bfc0c17b7f019adef..abbc4745002a5bbbbc407b28b001c611288384fe 100644 --- a/src/maple_driver/include/compiler_selector.h +++ b/src/maple_driver/include/compiler_selector.h @@ -44,8 +44,8 @@ class CompilerSelectorImpl : public CompilerSelector { private: Compiler *FindCompiler(const SupportedCompilers &compilers, const std::string &name) const; - const ErrorCode InsertCompilerIfNeeded(std::vector &selected, const SupportedCompilers &compilers, - const std::string &name) const; + ErrorCode InsertCompilerIfNeeded(std::vector &selected, const SupportedCompilers &compilers, + const std::string &name) const; }; } // namespace maple #endif // MAPLE_DRIVER_INCLUDE_COMPILER_SELECTOR_H diff --git a/src/maple_driver/include/driver_runner.h b/src/maple_driver/include/driver_runner.h index dee25639ec7fa178b13d40119e690d5d68044670..115152b36c52534a4af96bfd1023687f120fd7bd 100644 --- a/src/maple_driver/include/driver_runner.h +++ b/src/maple_driver/include/driver_runner.h @@ -54,18 +54,6 @@ class DriverRunner final { private: - MIRModule *theModule; - std::vector exeNames; - Options *mpl2mplOptions = nullptr; - std::string mpl2mplInput; - MeOption *meOptions = nullptr; - std::string meInput; - std::string actualInput; - MemPool *optMp; - bool timePhases = false; - bool genMeMpl = false; - std::string printOutExe; - static bool FuncOrderLessThan(const MIRFunction *left, const MIRFunction *right); bool IsFramework() const; @@ -78,6 +66,19 @@ class DriverRunner final { void AddPhase(std::vector &phases, const std::string phase, const PhaseManager &phaseManager) const; void ProcessMpl2mplAndMePhases(const std::string &outputFile, const std::string &vtableImplFile) const; + + MIRModule *theModule; + std::vector exeNames; + Options *mpl2mplOptions = nullptr; + std::string mpl2mplInput; + MeOption *meOptions = nullptr; + std::string meInput; + std::string actualInput; + MemPool *optMp; + bool timePhases = false; + bool genMeMpl = false; + std::string printOutExe; + }; } // namespace maple diff --git a/src/maple_driver/include/file_utils.h b/src/maple_driver/include/file_utils.h index 31ad7dd478ac12ac050761e990ee1b3de8cffd5a..5b832d8f85362bcd29f79ba0dfcd8fa1aafc483d 100644 --- a/src/maple_driver/include/file_utils.h +++ b/src/maple_driver/include/file_utils.h @@ -30,8 +30,7 @@ class FileUtils { static std::string ConvertPathIfNeeded(const std::string &src); static int Remove(const std::string &filePath); static std::string AppendMapleRootIfNeeded(bool needRootPath, const std::string &path, - const std::string &defaultRoot = - ("." + kFileSeperatorStr)); + const std::string &defaultRoot = "." + kFileSeperatorStr); }; } // namespace maple #endif // MAPLE_DRIVER_INCLUDE_FILE_UTILS_H diff --git a/src/maple_driver/include/safe_exe.h b/src/maple_driver/include/safe_exe.h index 7286ee75b983c3de6b38f09734436d618aef114b..5e2eb8e08ac5bad32f85588fe9e8dddb2981d2ac 100644 --- a/src/maple_driver/include/safe_exe.h +++ b/src/maple_driver/include/safe_exe.h @@ -37,7 +37,7 @@ class SafeExe { char **argv = new char*[vectorArgs.size() + 1]; // argv[0] is program name // copy args - for (int j = 0; j < vectorArgs.size(); ++j) { + for (size_t j = 0; j < vectorArgs.size(); ++j) { int strLength = vectorArgs[j].size(); argv[j] = new char[strLength + 1]; strncpy_s(argv[j], strLength + 1, vectorArgs[j].c_str(), strLength); diff --git a/src/maple_driver/src/compiler.cpp b/src/maple_driver/src/compiler.cpp index 0144cea02d04cffde032b40368c1e9ac483b45c5..67a0fdd00924550c77e692b930b450692d867ec5 100644 --- a/src/maple_driver/src/compiler.cpp +++ b/src/maple_driver/src/compiler.cpp @@ -60,13 +60,13 @@ ErrorCode Compiler::Compile(const MplOptions &options, MIRModulePtr &theModule) return ErrorCode::kErrorCompileFail; } timer.Stop(); - LogInfo::MapleLogger() << (GetName() + " consumed ") << timer.Elapsed() << "s" << '\n'; + LogInfo::MapleLogger() << (GetName() + " consumed ") << timer.Elapsed() << "s\n"; return ErrorCode::kErrorNoError; } -std::string Compiler::MakeOption(const MplOptions &options) { +std::string Compiler::MakeOption(const MplOptions &options) const { std::map finalOptions; - auto defaultOptions = MakeDefaultOptions(options); + std::map defaultOptions = MakeDefaultOptions(options); AppendDefaultOptions(finalOptions, defaultOptions); for (const auto &binName : GetBinNames()) { auto userOption = options.GetOptions().find(binName); @@ -123,12 +123,13 @@ void Compiler::AppendExtraOptions(std::map &finalOptions } } -std::map Compiler::MakeDefaultOptions(const MplOptions &options) { - auto rawDefaultOptions = GetDefaultOptions(options); +std::map Compiler::MakeDefaultOptions(const MplOptions &options) const { + DefaultOption rawDefaultOptions = GetDefaultOptions(options); std::map defaultOptions; if (rawDefaultOptions.mplOptions != nullptr) { - for (unsigned int i = 0; i < rawDefaultOptions.length; ++i) { - defaultOptions.insert(std::make_pair(rawDefaultOptions.mplOptions[i].GetKey(), rawDefaultOptions.mplOptions[i])); + for (uint32_t i = 0; i < rawDefaultOptions.length; ++i) { + defaultOptions.insert(std::make_pair(rawDefaultOptions.mplOptions[i].GetKey(), + rawDefaultOptions.mplOptions[i])); } } return defaultOptions; diff --git a/src/maple_driver/src/compiler_factory.cpp b/src/maple_driver/src/compiler_factory.cpp index 9242ae4414fd84978a7d50db48dd13abbab556b8..686e2dcd3e7b14ac96160f8bd69ec2e77362d647 100644 --- a/src/maple_driver/src/compiler_factory.cpp +++ b/src/maple_driver/src/compiler_factory.cpp @@ -30,7 +30,7 @@ CompilerFactory &CompilerFactory::GetInstance() { return instance; } -CompilerFactory::CompilerFactory() : theModule(nullptr) { +CompilerFactory::CompilerFactory() { // Supported compilers ADD_COMPILER("jbc2mpl" ,Jbc2MplCompiler) ADD_COMPILER("me" ,MapleCombCompiler) @@ -66,7 +66,7 @@ void CompilerFactory::Insert(const std::string &name, Compiler *value) { ErrorCode CompilerFactory::DeleteTmpFiles(const MplOptions &mplOptions, const std::vector &tempFiles, const std::unordered_set &finalOutputs) const { int ret = 0; - for (auto tmpFile : tempFiles) { + for (const std::string &tmpFile : tempFiles) { bool isSave = false; for (auto saveFile : mplOptions.GetSaveFiles()) { if (!saveFile.empty() && std::regex_match(tmpFile, std::regex(StringUtils::Replace(saveFile, "*", ".*?")))) { @@ -84,12 +84,12 @@ ErrorCode CompilerFactory::DeleteTmpFiles(const MplOptions &mplOptions, const st ErrorCode CompilerFactory::Compile(const MplOptions &mplOptions) { std::vector compilers; - auto ret = compilerSelector->Select(supportedCompilers, mplOptions, compilers); + ErrorCode ret = compilerSelector->Select(supportedCompilers, mplOptions, compilers); if (ret != ErrorCode::kErrorNoError) { return ret; } - for (auto compiler : compilers) { + for (auto *compiler : compilers) { if (compiler == nullptr) { LogInfo::MapleLogger() << "Failed! Compiler is null." << "\n"; return ErrorCode::kErrorCompileFail; @@ -101,8 +101,8 @@ ErrorCode CompilerFactory::Compile(const MplOptions &mplOptions) { } if (!mplOptions.HasSetSaveTmps() || !mplOptions.GetSaveFiles().empty()) { - auto tmpFiles = std::vector(); - for (auto compiler : compilers) { + std::vector tmpFiles; + for (auto *compiler : compilers) { compiler->GetTmpFilesToDelete(mplOptions, tmpFiles); } ret = DeleteTmpFiles(mplOptions, tmpFiles, compilers.at(compilers.size() - 1)->GetFinalOutputs(mplOptions)); diff --git a/src/maple_driver/src/compiler_selector.cpp b/src/maple_driver/src/compiler_selector.cpp index a9c9c206ef03500f03b2ff83937075183def0e67..d8645e9695068af107c1649e4eb0d40feea60a99 100644 --- a/src/maple_driver/src/compiler_selector.cpp +++ b/src/maple_driver/src/compiler_selector.cpp @@ -25,26 +25,26 @@ Compiler *CompilerSelectorImpl::FindCompiler(const SupportedCompilers &compilers return nullptr; } -const ErrorCode CompilerSelectorImpl::InsertCompilerIfNeeded(std::vector &selected, - const SupportedCompilers &compilers, - const std::string &name) const { +ErrorCode CompilerSelectorImpl::InsertCompilerIfNeeded(std::vector &selected, + const SupportedCompilers &compilers, + const std::string &name) const { Compiler *compiler = FindCompiler(compilers, name); if (compiler != nullptr) { if (std::find(selected.cbegin(), selected.cend(), compiler) == selected.cend()) { selected.push_back(compiler); } return ErrorCode::kErrorNoError; - } else { - LogInfo::MapleLogger(kLlErr) << name << " not found!!!" << '\n'; - return ErrorCode::kErrorToolNotFound; } + + LogInfo::MapleLogger(kLlErr) << name << " not found!!!" << '\n'; + return ErrorCode::kErrorToolNotFound; } ErrorCode CompilerSelectorImpl::Select(const SupportedCompilers &supportedCompilers, const MplOptions &mplOptions, std::vector &selected) const { bool combPhases = false; if (!mplOptions.GetRunningExes().empty()) { - for (auto runningExe : mplOptions.GetRunningExes()) { + for (const std::string &runningExe : mplOptions.GetRunningExes()) { if (runningExe == kBinNameMe) { combPhases = true; } else if (runningExe == kBinNameMpl2mpl && combPhases) { diff --git a/src/maple_driver/src/driver_runner.cpp b/src/maple_driver/src/driver_runner.cpp index 8962ed8ec6ba9a5d973c8bdd3ddfbb63e2793908..b7d1c03e028c2fdbc933115c558e12771ca2298f 100644 --- a/src/maple_driver/src/driver_runner.cpp +++ b/src/maple_driver/src/driver_runner.cpp @@ -16,7 +16,6 @@ #include #include #include -#include #include "mpl_timer.h" #include "mir_function.h" #include "mir_parser.h" @@ -46,7 +45,7 @@ #define ADD_EXTRA_PHASE(name, timephases, timeStart) \ if (timephases) { \ - auto duration = std::chrono::system_clock::now() - timeStart; \ + auto duration = std::chrono::system_clock::now() - (timeStart); \ extraPhasesTime.push_back(std::chrono::duration_cast(duration).count()); \ extraPhasesName.push_back(name); \ } @@ -56,7 +55,11 @@ namespace maple { const std::string mpl2Mpl = "mpl2mpl"; const std::string mplME = "me"; -enum OptLevel { kLevelO0, kLevelO1, kLevelO2 }; +enum OptLevel { + kLevelO0, + kLevelO1, + kLevelO2 +}; ErrorCode DriverRunner::Run() { CHECK_MODULE(ErrorCode::kErrorExit); @@ -69,8 +72,8 @@ ErrorCode DriverRunner::Run() { printOutExe = exeNames[exeNames.size() - 1]; // Prepare output file - std::string::size_type lastDot = actualInput.find_last_of("."); - std::string baseName = lastDot == std::string::npos ? actualInput : actualInput.substr(0, lastDot); + auto lastDot = actualInput.find_last_of("."); + std::string baseName = (lastDot == std::string::npos) ? actualInput : actualInput.substr(0, lastDot); std::string originBaseName = baseName; std::string outputFile = baseName.append(GetPostfix()); @@ -99,7 +102,8 @@ bool DriverRunner::IsFramework() const { std::string DriverRunner::GetPostfix() const { if (printOutExe == mplME) { return ".me.mpl"; - } else if (printOutExe == mpl2Mpl) { + } + if (printOutExe == mpl2Mpl) { return ".VtableImpl.mpl"; } return ""; @@ -161,7 +165,7 @@ void DriverRunner::InitPhases(InterleavedManager &mgr, const std::vector curPhases; - for (std::string phase : phases) { + for (const std::string &phase : phases) { auto temp = mgr.GetSupportPhaseManager(phase); if (temp != nullptr) { if (temp != curManager) { @@ -184,7 +188,7 @@ void DriverRunner::InitPhases(InterleavedManager &mgr, const std::vector &phases, const PhaseManager &phaseManager) const { - const std::type_info &type = typeid(phaseManager); + const auto &type = typeid(phaseManager); if (type == typeid(ModulePhaseManager)) { mgr.AddPhases(phases, true, timePhases); } else if (type == typeid(MeFuncPhaseManager)) { diff --git a/src/maple_driver/src/file_utils.cpp b/src/maple_driver/src/file_utils.cpp index 8c6305d7d02f397b5c3d7874f4835be7273493fc..3eea8ac8c66950130795c72021c272d17a4e9939 100644 --- a/src/maple_driver/src/file_utils.cpp +++ b/src/maple_driver/src/file_utils.cpp @@ -47,8 +47,7 @@ std::string FileUtils::GetFileFolder(const std::string &filePath) { std::string FileUtils::ConvertPathIfNeeded(const std::string &src) { std::string ret = src; - ret = StringUtils::Replace(ret, kFileSeperatorWindowsStyleStr, - kFileSeperatorLinuxStyleStr); + ret = StringUtils::Replace(ret, kFileSeperatorWindowsStyleStr, kFileSeperatorLinuxStyleStr); return ret; } diff --git a/src/maple_driver/src/jbc2mpl_compiler.cpp b/src/maple_driver/src/jbc2mpl_compiler.cpp index ad0c84b2969d7e4bef0f3527d96649a9750d4b70..6117688bd50b1a64ccf225f25432369db481996f 100644 --- a/src/maple_driver/src/jbc2mpl_compiler.cpp +++ b/src/maple_driver/src/jbc2mpl_compiler.cpp @@ -22,12 +22,10 @@ std::string Jbc2MplCompiler::GetBinName() const { } std::vector Jbc2MplCompiler::GetBinNames() const { - auto binNames = std::vector(); - binNames.push_back(kBinNameJbc2mpl); - return binNames; + return std::vector { kBinNameJbc2mpl }; } -DefaultOption Jbc2MplCompiler::GetDefaultOptions(const MplOptions &options) { +DefaultOption Jbc2MplCompiler::GetDefaultOptions(const MplOptions &options) const { DefaultOption defaultOptions = { nullptr, 0 }; return defaultOptions; } @@ -37,7 +35,7 @@ void Jbc2MplCompiler::GetTmpFilesToDelete(const MplOptions &mplOptions, std::vec } std::unordered_set Jbc2MplCompiler::GetFinalOutputs(const MplOptions &mplOptions) const { - auto finalOutputs = std::unordered_set(); + std::unordered_set finalOutputs; finalOutputs.insert(mplOptions.GetOutputFolder() + mplOptions.GetOutputName() + ".mpl"); return finalOutputs; } diff --git a/src/maple_driver/src/maple_comb_compiler.cpp b/src/maple_driver/src/maple_comb_compiler.cpp index d9a28748a04d23aa40b44180d1e701758e50a946..0fc59a1a8f7c1db4fc2a20d54d26eb5d61469dc3 100644 --- a/src/maple_driver/src/maple_comb_compiler.cpp +++ b/src/maple_driver/src/maple_comb_compiler.cpp @@ -26,61 +26,60 @@ using namespace mapleOption; std::string MapleCombCompiler::GetInputFileName(const MplOptions &options) const { if (options.GetInputFileType() == InputFileType::kVtableImplMpl) { return options.GetOutputFolder() + options.GetOutputName() + ".VtableImpl.mpl"; - } else { - return options.GetOutputFolder() + options.GetOutputName() + ".mpl"; } + return options.GetOutputFolder() + options.GetOutputName() + ".mpl"; } std::unordered_set MapleCombCompiler::GetFinalOutputs(const MplOptions &mplOptions) const { - auto finalOutputs = std::unordered_set(); + std::unordered_set finalOutputs; finalOutputs.insert(mplOptions.GetOutputFolder() + mplOptions.GetOutputName() + ".VtableImpl.mpl"); return finalOutputs; } void MapleCombCompiler::PrintCommand(const MplOptions &options) const { std::string runStr = "--run="; - std::string optionStr = "--option=\""; + std::ostringstream optionStr; + optionStr << "--option=\""; std::string connectSym = ""; bool firstComb = false; if (options.GetExeOptions().find(kBinNameMe) != options.GetExeOptions().end()) { runStr += "me"; - auto inputMeOptions = options.GetExeOptions().find(kBinNameMe); - for (const auto &opt : inputMeOptions->second) { - connectSym = opt.Args() != "" ? "=" : ""; - optionStr += " --" + opt.OptionKey() + connectSym + opt.Args(); + auto it = options.GetExeOptions().find(kBinNameMe); + for (const mapleOption::Option &opt : it->second) { + connectSym = !opt.Args().empty() ? "=" : ""; + optionStr << " --" << opt.OptionKey() << connectSym << opt.Args(); } firstComb = true; } if (options.GetExeOptions().find(kBinNameMpl2mpl) != options.GetExeOptions().end()) { if (firstComb) { runStr += ":mpl2mpl"; - optionStr += ":"; + optionStr << ":"; } else { runStr += "mpl2mpl"; } - auto inputMpl2mplOptions = options.GetExeOptions().find(kBinNameMpl2mpl); - for (const auto &opt : inputMpl2mplOptions->second) { - connectSym = opt.Args() != "" ? "=" : ""; - optionStr += " --" + opt.OptionKey() + connectSym + opt.Args(); + auto it = options.GetExeOptions().find(kBinNameMpl2mpl); + for (const mapleOption::Option &opt : it->second) { + connectSym = !opt.Args().empty() ? "=" : ""; + optionStr << " --" << opt.OptionKey() << connectSym << opt.Args(); } } - optionStr += "\""; - LogInfo::MapleLogger() << "Starting:" << options.GetExeFolder() << "maple " << runStr << " " << optionStr << " " + optionStr << "\""; + LogInfo::MapleLogger() << "Starting:" << options.GetExeFolder() << "maple " << runStr << " " << optionStr.str() << " " << GetInputFileName(options) << options.GetPrintCommandStr() << '\n'; } -MeOption *MapleCombCompiler::MakeMeOptions(const MplOptions &options, maple::MemPool &optMp) { +MeOption *MapleCombCompiler::MakeMeOptions(const MplOptions &options, MemPool &optMp) { MeOption *meOption = new MeOption(optMp); - auto inputMeOptions = options.GetExeOptions().find(kBinNameMe); - if (inputMeOptions == options.GetExeOptions().end()) { - LogInfo::MapleLogger() << "no me input options" << '\n'; + auto it = options.GetExeOptions().find(kBinNameMe); + if (it == options.GetExeOptions().end()) { + LogInfo::MapleLogger() << "no me input options\n"; return meOption; } - for (const auto &opt : inputMeOptions->second) { + for (const mapleOption::Option &opt : it->second) { if (options.HasSetDebugFlag()) { - LogInfo::MapleLogger() << "Me options: " << opt.Index() << " " << opt.OptionKey() << " " << opt.Args() - << '\n'; + LogInfo::MapleLogger() << "Me options: " << opt.Index() << " " << opt.OptionKey() << " " << opt.Args() << '\n'; } switch (opt.Index()) { case kMeSkipPhases: @@ -161,14 +160,14 @@ MeOption *MapleCombCompiler::MakeMeOptions(const MplOptions &options, maple::Mem return meOption; } -Options *MapleCombCompiler::MakeMpl2MplOptions(const MplOptions &options, maple::MemPool &optMp) { - Options *mpl2mplOption = new Options(optMp); - auto inputOptions = options.GetExeOptions().find(kBinNameMpl2mpl); - if (inputOptions == options.GetExeOptions().end()) { - LogInfo::MapleLogger() << "no mpl2mpl input options" << '\n'; +Options *MapleCombCompiler::MakeMpl2MplOptions(const MplOptions &options, MemPool &optMp) { + auto *mpl2mplOption = new Options(optMp); + auto it = options.GetExeOptions().find(kBinNameMpl2mpl); + if (it == options.GetExeOptions().end()) { + LogInfo::MapleLogger() << "no mpl2mpl input options\n"; return mpl2mplOption; } - for (auto &opt : inputOptions->second) { + for (const mapleOption::Option &opt : it->second) { if (options.HasSetDebugFlag()) { LogInfo::MapleLogger() << "mpl2mpl options: " << opt.Index() << " " << opt.OptionKey() << " " << opt.Args() << '\n'; @@ -239,8 +238,8 @@ ErrorCode MapleCombCompiler::Compile(const MplOptions &options, MIRModulePtr &th theModule = new MIRModule(fileName); std::unique_ptr meOptions; std::unique_ptr mpl2mplOptions; - auto iterMe = std::find(options.GetRunningExes().begin(), options.GetRunningExes().end(), kBinNameMe); - if (iterMe != options.GetRunningExes().end()) { + auto it = std::find(options.GetRunningExes().begin(), options.GetRunningExes().end(), kBinNameMe); + if (it != options.GetRunningExes().end()) { meOptions.reset(MakeMeOptions(options, *optMp)); } auto iterMpl2Mpl = std::find(options.GetRunningExes().begin(), options.GetRunningExes().end(), kBinNameMpl2mpl); @@ -248,7 +247,7 @@ ErrorCode MapleCombCompiler::Compile(const MplOptions &options, MIRModulePtr &th mpl2mplOptions.reset(MakeMpl2MplOptions(options, *optMp)); } - LogInfo::MapleLogger() << "Starting mpl2mpl&mplme" << '\n'; + LogInfo::MapleLogger() << "Starting mpl2mpl&mplme\n"; PrintCommand(options); DriverRunner runner(theModule, options.GetRunningExes(), mpl2mplOptions.get(), fileName, meOptions.get(), fileName, fileName, optMp, diff --git a/src/maple_driver/src/mplcg_compiler.cpp b/src/maple_driver/src/mplcg_compiler.cpp index f2fff89df72b7f7394bd6298013e2b0bcdffee44..4b19e31bad1b0db2721b213575c70e8e11ec8c7e 100644 --- a/src/maple_driver/src/mplcg_compiler.cpp +++ b/src/maple_driver/src/mplcg_compiler.cpp @@ -16,9 +16,9 @@ #include "compiler.h" #include "default_options.def" -using namespace maple; +namespace maple { -DefaultOption MplcgCompiler::GetDefaultOptions(const MplOptions &options) { +DefaultOption MplcgCompiler::GetDefaultOptions(const MplOptions &options) const { DefaultOption defaultOptions = { nullptr, 0 }; if (options.GetOptimizationLevel() == kO0 && options.HasSetDefaultLevel()) { defaultOptions.mplOptions = kMplcgDefaultOptionsO0; @@ -32,13 +32,12 @@ std::string MplcgCompiler::GetBinName() const { } std::vector MplcgCompiler::GetBinNames() const { - auto binNames = std::vector(); - binNames.push_back(kBinNameMplcg); + std::vector binNames{ kBinNameMplcg }; return binNames; } std::string MplcgCompiler::GetInputFileName(const MplOptions &options) const { - std::string::size_type idx = options.GetOutputName().find(".VtableImpl"); + auto idx = options.GetOutputName().find(".VtableImpl"); std::string outputName = options.GetOutputName(); if (idx != std::string::npos) { outputName = options.GetOutputName().substr(0, idx); @@ -46,3 +45,4 @@ std::string MplcgCompiler::GetInputFileName(const MplOptions &options) const { return options.GetOutputFolder() + outputName + ".VtableImpl.mpl"; } +} // namespace maple diff --git a/src/maple_ipa/include/interleaved_manager.h b/src/maple_ipa/include/interleaved_manager.h index ae7e3d4bef96329658b84cb63822d435cbc8f633..9357539da3db25b34ed94671a9244837b5d90f6b 100644 --- a/src/maple_ipa/include/interleaved_manager.h +++ b/src/maple_ipa/include/interleaved_manager.h @@ -32,16 +32,16 @@ class InterleavedManager { : allocator(memPool), mirModule(*module), phaseManagers(allocator.Adapter()), - supportPhaseManagers(allocator.Adapter()), - timePasses(false) {} + supportPhaseManagers(allocator.Adapter()) {} - void DumpTimers(); ~InterleavedManager() { if (timePasses) { DumpTimers(); } } + void DumpTimers(); + const MapleAllocator *GetMemAllocator() const { return &allocator; } @@ -56,7 +56,7 @@ class InterleavedManager { void Run(); void IPARun(MeFuncPhaseManager&); - const PhaseManager *AccessPhaseManager(int i) const { + const PhaseManager *AccessPhaseManager(size_t i) const { return phaseManagers.at(i); } @@ -68,7 +68,7 @@ class InterleavedManager { MapleVector phaseManagers; MapleVector supportPhaseManagers; // Used to check whether a phase is supported and by which manager std::string meInput; - bool timePasses; + bool timePasses = false; void InitSupportPhaseManagers(); }; diff --git a/src/maple_ipa/include/module_phase_manager.h b/src/maple_ipa/include/module_phase_manager.h index 7568fab44e93194ba06e5d07c4fe2b149d0350a9..19f6f34577c6d21f591a3a96859482400d78f216 100644 --- a/src/maple_ipa/include/module_phase_manager.h +++ b/src/maple_ipa/include/module_phase_manager.h @@ -17,9 +17,6 @@ #include "module_phase.h" #include "me_phase_manager.h" -static constexpr char kDotStr[] = "."; -static constexpr char kDotMplStr[] = ".mpl"; - namespace maple { class DoKlassHierarchy : public ModulePhase { public: diff --git a/src/maple_ipa/include/module_phases.def b/src/maple_ipa/include/module_phases.def index 72f360aa103ee1688c2a56ee48d42d6d39d835c7..b24f8e7a5e32a859bc146827be2eb1797a31e9a8 100644 --- a/src/maple_ipa/include/module_phases.def +++ b/src/maple_ipa/include/module_phases.def @@ -15,7 +15,7 @@ MODAPHASE(MoPhase_CHA, DoKlassHierarchy) MODAPHASE(MoPhase_CLINIT, DoClassInit) #if MIR_JAVA -MODTPHASE(MoPhase_GENNATIVESTUBFUNC, DoGenericNativeStubFunc) +MODTPHASE(MoPhase_GENNATIVESTUBFUNC, DoGenerateNativeStubFunc) MODAPHASE(MoPhase_VTABLEANALYSIS, DoVtableAnalysis) MODAPHASE(MoPhase_REFLECTIONANALYSIS, DoReflectionAnalysis) MODTPHASE(MoPhase_VTABLEIMPL, DoVtableImpl) diff --git a/src/maple_ipa/src/interleaved_manager.cpp b/src/maple_ipa/src/interleaved_manager.cpp index 6821e05ca789daa5deaf7dc5d9f98ffd02feb799..6f428e0325647f6561640554f0d7fe1e5927beb0 100644 --- a/src/maple_ipa/src/interleaved_manager.cpp +++ b/src/maple_ipa/src/interleaved_manager.cpp @@ -35,7 +35,7 @@ void InterleavedManager::AddPhases(const std::vector &phases, bool } if (isModulePhase) { - ModulePhaseManager *mpm = GetMempool()->New(GetMempool(), mirModule, mrm); + auto *mpm = GetMempool()->New(GetMempool(), mirModule, mrm); mpm->RegisterModulePhases(); mpm->AddModulePhases(phases); if (timePhases) { @@ -43,7 +43,7 @@ void InterleavedManager::AddPhases(const std::vector &phases, bool } phaseManagers.push_back(mpm); } else { // MeFuncPhase - MeFuncPhaseManager *fpm = GetMempool()->New(GetMempool(), mirModule, mrm); + auto *fpm = GetMempool()->New(GetMempool(), mirModule, mrm); fpm->RegisterFuncPhases(); if (genMpl) { fpm->SetGenMeMpl(true); @@ -62,12 +62,12 @@ void InterleavedManager::Run() { if (pm == nullptr) { continue; } - if (!dynamic_cast(pm)) { + auto *fpm = dynamic_cast(pm); + if (fpm == nullptr) { pm->Run(); continue; } - MeFuncPhaseManager *fpm = static_cast(pm); - unsigned long rangeNum = 0; + uint64 rangeNum = 0; MapleVector *compList; if (!mirModule.GetCompilationList().empty()) { if ((mirModule.GetCompilationList().size() != mirModule.GetFunctionList().size()) && @@ -127,15 +127,13 @@ void InterleavedManager::DumpTimers() { void InterleavedManager::InitSupportPhaseManagers() { ASSERT(supportPhaseManagers.empty(), "Phase managers already initialized"); - ModuleResultMgr *mrm = nullptr; - - ModulePhaseManager *mpm = GetMempool()->New(GetMempool(), mirModule, mrm); + auto *mpm = GetMempool()->New(GetMempool(), mirModule, nullptr); mpm->RegisterModulePhases(); supportPhaseManagers.push_back(mpm); - mrm = mpm->GetModResultMgr(); + ModuleResultMgr *mrm = mpm->GetModResultMgr(); - MeFuncPhaseManager *fpm = GetMempool()->New(GetMempool(), mirModule, mrm); + auto *fpm = GetMempool()->New(GetMempool(), mirModule, mrm); fpm->RegisterFuncPhases(); supportPhaseManagers.push_back(fpm); } @@ -153,4 +151,4 @@ const PhaseManager *InterleavedManager::GetSupportPhaseManager(const std::string return nullptr; } -} +} // namespace maple diff --git a/src/maple_ipa/src/module_phase_manager.cpp b/src/maple_ipa/src/module_phase_manager.cpp index 3bd49ed7ec0c9fe4d49d7fc3d4db1812551bb27c..a6ee412aaa1560caa18a31199878828210623d7f 100644 --- a/src/maple_ipa/src/module_phase_manager.cpp +++ b/src/maple_ipa/src/module_phase_manager.cpp @@ -30,6 +30,11 @@ #include "bin_mpl_export.h" #include "mpl_timer.h" +namespace { +constexpr char kDotStr[] = "."; +constexpr char kDotMplStr[] = ".mpl"; +} // namespace + namespace maple { // Manage the phases of middle and implement some maplecomb-options such as // skipAfter, skipFrom, quiet. @@ -85,7 +90,7 @@ void ModulePhaseManager::Run() { int phaseIndex = 0; for (auto it = PhaseSequenceBegin(); it != PhaseSequenceEnd(); ++it, ++phaseIndex) { PhaseID id = GetPhaseId(it); - ModulePhase *p = static_cast(GetPhase(id)); + auto *p = static_cast(GetPhase(id)); MIR_ASSERT(p); // if we need to skip after certain pass if (Options::skipFrom.compare(p->PhaseName()) == 0) { diff --git a/src/maple_ir/include/all_attributes.def b/src/maple_ir/include/all_attributes.def index e456a4fc75290df090c6cafddc1c4a7aa5b21659..048644b698686e65b0e0514e05f67f4bf2413dfb 100644 --- a/src/maple_ir/include/all_attributes.def +++ b/src/maple_ir/include/all_attributes.def @@ -23,6 +23,8 @@ ATTR(static) ATTR(synthetic) ATTR(used) + ATTR(hiddenapiblack) + ATTR(hiddenapigrey) #ifdef FUNC_ATTR ATTR(bridge) ATTR(constructor) diff --git a/src/maple_ir/include/bin_mir_file.h b/src/maple_ir/include/bin_mir_file.h index 4363dda4a452553425a6f234e6703a4aff4c0563..bf8513d8d9946d58d55c0762385472c236f0bd44 100644 --- a/src/maple_ir/include/bin_mir_file.h +++ b/src/maple_ir/include/bin_mir_file.h @@ -33,10 +33,10 @@ enum BinMirFileType { // file header for binary format kMmpl, 8B in total // Note the header is different with the specification struct BinMIRFileHeader { - char magic[kMagicSize]; // “HWCMPL”, or "HWLOS_" - maple::uint8 segNum; // number of segments (e.g. one raw IR file is a segment unit) - maple::uint8 type; // enum of type of VM file (e.g. MapleIR, TE) - maple::uint8 version; // version of IR format (should be major.minor) + char magic[kMagicSize]; // “HWCMPL”, or "HWLOS_" + uint8 segNum; // number of segments (e.g. one raw IR file is a segment unit) + uint8 type; // enum of type of VM file (e.g. MapleIR, TE) + uint8 version; // version of IR format (should be major.minor) }; } // namespace maple #endif // MAPLE_IR_INCLUDE_BIN_MIR_FILE_H diff --git a/src/maple_ir/include/global_tables.h b/src/maple_ir/include/global_tables.h index 0a02013c80f7129ba0febac522cf1e803ba2c514..1a81d21f6dda151c4ae248d8e3b114539727ca9c 100644 --- a/src/maple_ir/include/global_tables.h +++ b/src/maple_ir/include/global_tables.h @@ -70,7 +70,10 @@ class TypeTable { return typeTable; } - MIRType *GetTypeFromTyIdx(TyIdx tyIdx) const { + MIRType *GetTypeFromTyIdx(TyIdx tyIdx) { + return const_cast(const_cast(this)->GetTypeFromTyIdx(tyIdx)); + } + const MIRType *GetTypeFromTyIdx(TyIdx tyIdx) const { ASSERT(tyIdx.GetIdx() < typeTable.size(), "array index out of range"); return typeTable.at(tyIdx.GetIdx()); } @@ -250,7 +253,8 @@ class TypeTable { // Get or Create derived types. MIRType *GetOrCreatePointerType(TyIdx pointedTyIdx, PrimType primType = PTY_ptr); MIRType *GetOrCreatePointerType(const MIRType &pointTo, PrimType primType = PTY_ptr); - MIRType *GetPointedTypeIfApplicable(MIRType &type) const; + const MIRType *GetPointedTypeIfApplicable(MIRType &type) const; + MIRType *GetPointedTypeIfApplicable(MIRType &type); MIRType *GetVoidPtr() const { ASSERT(voidPtrType != nullptr, "voidPtrType should not be null"); return voidPtrType; @@ -297,9 +301,6 @@ class TypeTable { } }; - std::unordered_set typeHashTable; - std::vector typeTable; - // create an entry in typeTable for the type node MIRType *CreateType(MIRType &oldType) { MIRType *newType = oldType.CopyMIRTypeNode(); @@ -308,9 +309,12 @@ class TypeTable { return newType; } - MIRType *GetOrCreateStructOrUnion(const std::string &name, const FieldVector &fields, const FieldVector &prntFields, + MIRType *GetOrCreateStructOrUnion(const std::string &name, const FieldVector &fields, const FieldVector &printFields, MIRModule &module, bool forStruct = true); MIRType *GetOrCreateClassOrInterface(const std::string &name, MIRModule &module, bool forClass); + + std::unordered_set typeHashTable; + std::vector typeTable; }; class StrPtrHash { @@ -341,8 +345,8 @@ template class StringTable { public: StringTable() = default; - StringTable &operator=(const StringTable&) = delete; StringTable(const StringTable&) = delete; + StringTable &operator=(const StringTable&) = delete; ~StringTable() { stringTableMap.clear(); @@ -459,9 +463,9 @@ class FunctionTable { return funcTable; } - MIRFunction *GetFunctionFromPuidx(PUIdx pidx) const { - CHECK_FATAL(pidx < funcTable.size(), "Invalid puIdx"); - return funcTable.at(pidx); + MIRFunction *GetFunctionFromPuidx(PUIdx pIdx) const { + CHECK_FATAL(pIdx < funcTable.size(), "Invalid puIdx"); + return funcTable.at(pIdx); } private: @@ -523,7 +527,7 @@ class GSymbolTable { MIRSymbol *CreateSymbol(uint8 scopeID); bool AddToStringSymbolMap(const MIRSymbol &st); bool RemoveFromStringSymbolMap(const MIRSymbol &st); - void Dump(bool islocal, int32 indent = 0) const; + void Dump(bool isLocal, int32 indent = 0) const; private: MIRModule *module = nullptr; diff --git a/src/maple_ir/include/java_eh_lower.h b/src/maple_ir/include/java_eh_lower.h index b52558c9af8a82b4fc85c683da953dcf5b09a258..59596b0d2b57904598c952813afd0f82e37a8e0a 100644 --- a/src/maple_ir/include/java_eh_lower.h +++ b/src/maple_ir/include/java_eh_lower.h @@ -19,13 +19,9 @@ #include "class_hierarchy.h" namespace maple { -const std::string strDivOpnd = "__div_opnd1"; -const std::string strDivRes = "__div_res"; -const std::string strMCCThrowArrayIndexOutOfBoundsException = "MCC_ThrowArrayIndexOutOfBoundsException"; -const std::string strMCCThrowNullPointerException = "MCC_ThrowNullPointerException"; class JavaEHLowerer : public FuncOptimizeImpl { public: - explicit JavaEHLowerer(MIRModule *mod, KlassHierarchy *kh, bool dump); + JavaEHLowerer(MIRModule *mod, KlassHierarchy *kh, bool dump) : FuncOptimizeImpl(mod, kh, dump) {} ~JavaEHLowerer() = default; FuncOptimizeImpl *Clone() override { @@ -43,8 +39,8 @@ class JavaEHLowerer : public FuncOptimizeImpl { return DoLowerDiv(expr, blkNode); } - uint32 divSTIndex; // The index of divide operand and result. - bool useRegTmp; // Use register to save temp variable or not. + uint32 divSTIndex = 0; // The index of divide operand and result. + bool useRegTmp = Options::usePreg; // Use register to save temp variable or not. }; class JavaEHLowererPhase : public ModulePhase { diff --git a/src/maple_ir/include/lexer.h b/src/maple_ir/include/lexer.h index dc13bc19888979edd4ffca27ac7a9dd5af2a0c59..a52b338f67147d277187a7f0590bd0e1580efcac 100644 --- a/src/maple_ir/include/lexer.h +++ b/src/maple_ir/include/lexer.h @@ -14,11 +14,11 @@ */ #ifndef MAPLE_IR_INCLUDE_LEXER_H #define MAPLE_IR_INCLUDE_LEXER_H +#include "cstdio" +#include #include "types_def.h" #include "tokens.h" #include "mempool_allocator.h" -#include "stdio.h" -#include #include "mir_module.h" namespace maple { @@ -73,19 +73,19 @@ class MIRLexer { private: MIRModule &module; // for storing the different types of constant values - int64 theIntVal; // also indicates preg number under kTkPreg - float theFloatVal; - double theDoubleVal; + int64 theIntVal = 0; // also indicates preg number under kTkPreg + float theFloatVal = 0.0; + double theDoubleVal = 0.0; MapleVector seenComments; - std::ifstream *airFile; + std::ifstream *airFile = nullptr; std::ifstream airFileInternal; std::string line; - size_t lineBufSize; // the allocated size of line(buffer). - uint32 currentLineSize; - uint32 curIdx; - uint32 lineNum; - TokenKind kind; - std::string name; // store the name token without the % or $ prefix + size_t lineBufSize = 0; // the allocated size of line(buffer). + uint32 currentLineSize = 0; + uint32 curIdx = 0; + uint32 lineNum = 0; + TokenKind kind = kTkInvalid; + std::string name = ""; // store the name token without the % or $ prefix MapleUnorderedMap keywordMap; void RemoveReturnInline(std::string &line) { @@ -114,24 +114,24 @@ class MIRLexer { TokenKind GetTokenWithPrefixDoubleQuotation(); TokenKind GetTokenSpecial(); - inline char GetCharAt(uint32 idx) const { + char GetCharAt(uint32 idx) const { return line[idx]; } - inline char GetCharAtWithUpperCheck(uint32 idx) const { + char GetCharAtWithUpperCheck(uint32 idx) const { return idx < currentLineSize ? line[idx] : 0; } - inline char GetCharAtWithLowerCheck(uint32 idx) const { + char GetCharAtWithLowerCheck(uint32 idx) const { return idx >= 0 ? line[idx] : 0; } - inline char GetCurrentCharWithUpperCheck() { + char GetCurrentCharWithUpperCheck() { return curIdx < currentLineSize ? line[curIdx] : 0; } - inline char GetNextCurrentCharWithUpperCheck() { - curIdx++; + char GetNextCurrentCharWithUpperCheck() { + ++curIdx; return curIdx < currentLineSize ? line[curIdx] : 0; } @@ -145,23 +145,23 @@ class MIRLexer { }; inline bool IsPrimitiveType(TokenKind tk) { - return tk >= TK_void && tk <= TK_agg; + return (tk >= TK_void) && (tk <= TK_agg); } inline bool IsVarName(TokenKind tk) { - return tk == kTkLname || tk == kTkGname; + return (tk == kTkLname) || (tk == kTkGname); } inline bool IsExprBinary(TokenKind tk) { - return tk >= TK_add && tk <= TK_sub; + return (tk >= TK_add) && (tk <= TK_sub); } inline bool IsConstValue(TokenKind tk) { - return tk >= kTkIntconst && tk <= kTkDoubleconst; + return (tk >= kTkIntconst) && (tk <= kTkDoubleconst); } inline bool IsConstAddrExpr(TokenKind tk) { - return tk == TK_addrof || tk == TK_addroffunc || tk == TK_conststr || tk == TK_conststr16; + return (tk == TK_addrof) || (tk == TK_addroffunc) || (tk == TK_conststr) || (tk == TK_conststr16); } } // namespace maple #endif // MAPLE_IR_INCLUDE_LEXER_H diff --git a/src/maple_ir/include/mir_builder.h b/src/maple_ir/include/mir_builder.h index 159c7223f58e23509058f872dc4b4c79008ac4d3..7d557a1317473f5544f64c09d165919b6d0cd5a4 100644 --- a/src/maple_ir/include/mir_builder.h +++ b/src/maple_ir/include/mir_builder.h @@ -50,8 +50,7 @@ class MIRBuilder { explicit MIRBuilder(MIRModule *module) : mirModule(module), - incompleteTypeRefedSet(std::less(), mirModule->GetMPAllocator().Adapter()), - lineNum(0) {} + incompleteTypeRefedSet(mirModule->GetMPAllocator().Adapter()) {} virtual ~MIRBuilder() = default; @@ -83,9 +82,8 @@ class MIRBuilder { unsigned int GetLineNum() const { return lineNum; } - - void SetLineNum(unsigned int i) { - lineNum = i; + void SetLineNum(unsigned int num) { + lineNum = num; } GStrIdx GetOrCreateStringIndex(const std::string &str) const { @@ -103,7 +101,7 @@ class MIRBuilder { } MIRFunction *GetOrCreateFunction(const std::string&, TyIdx); - MIRFunction *GetFunctionFromSymbol(const MIRSymbol &funcst) const; + MIRFunction *GetFunctionFromSymbol(const MIRSymbol &funcst); MIRFunction *GetFunctionFromStidx(StIdx stIdx); MIRFunction *GetFunctionFromName(const std::string&); // For compiler-generated metadata struct @@ -126,7 +124,7 @@ class MIRBuilder { FieldID GetStructFieldIDFromFieldName(MIRType &type, const std::string &name); FieldID GetStructFieldIDFromFieldNameParentFirst(MIRType *type, const std::string &name); - void SetStructFieldIDFromFieldName(MIRType &structtype, const std::string &name, GStrIdx newStrIdx, + void SetStructFieldIDFromFieldName(MIRStructType &structType, const std::string &name, GStrIdx newStrIdx, const MIRType &newFieldType); // for creating Function. MIRSymbol *GetFunctionArgument(MIRFunction &fun, uint32 index) const { @@ -135,8 +133,8 @@ class MIRBuilder { } MIRFunction *CreateFunction(const std::string &name, const MIRType &returnType, const ArgVector &arguments, - bool isvarg = false, bool createBody = true) const; - MIRFunction *CreateFunction(const StIdx stIdx, bool addToTable = true) const; + bool isVarg = false, bool createBody = true) const; + MIRFunction *CreateFunction(StIdx stIdx, bool addToTable = true) const; virtual void UpdateFunction(MIRFunction &func, MIRType *returnType, const ArgVector &arguments) {} MIRSymbol *GetSymbolFromEnclosingScope(StIdx stIdx) const; @@ -155,29 +153,29 @@ class MIRBuilder { ConstvalNode *CreateFloatConst(float val); ConstvalNode *CreateDoubleConst(double val); ConstvalNode *CreateFloat128Const(const uint64 *val); - ConstvalNode *GetConstInt(MemPool &memPool, int i); - ConstvalNode *GetConstInt(int i) { - return CreateIntConst(i, PTY_i32); + ConstvalNode *GetConstInt(MemPool &memPool, int val); + ConstvalNode *GetConstInt(int val) { + return CreateIntConst(val, PTY_i32); } - ConstvalNode *GetConstUInt1(bool i) { - return CreateIntConst(i, PTY_u1); + ConstvalNode *GetConstUInt1(bool val) { + return CreateIntConst(val, PTY_u1); } - ConstvalNode *GetConstUInt8(uint8 i) { - return CreateIntConst(i, PTY_u8); + ConstvalNode *GetConstUInt8(uint8 val) { + return CreateIntConst(val, PTY_u8); } - ConstvalNode *GetConstUInt16(uint16 i) { - return CreateIntConst(i, PTY_u16); + ConstvalNode *GetConstUInt16(uint16 val) { + return CreateIntConst(val, PTY_u16); } - ConstvalNode *GetConstUInt32(uint32 i) { - return CreateIntConst(i, PTY_u32); + ConstvalNode *GetConstUInt32(uint32 val) { + return CreateIntConst(val, PTY_u32); } - ConstvalNode *GetConstUInt64(uint64 i) { - return CreateIntConst(i, PTY_u64); + ConstvalNode *GetConstUInt64(uint64 val) { + return CreateIntConst(val, PTY_u64); } ConstvalNode *CreateAddrofConst(BaseNode&); @@ -208,12 +206,12 @@ class MIRBuilder { GCMallocNode *CreateExprGCMalloc(Opcode opcode, const MIRType &ptype, const MIRType &type); JarrayMallocNode *CreateExprJarrayMalloc(Opcode opcode, const MIRType &ptype, const MIRType &type, BaseNode *opnd); TypeCvtNode *CreateExprTypeCvt(Opcode o, const MIRType &type, const MIRType &fromtype, BaseNode *opnd); - ExtractbitsNode *CreateExprExtractbits(Opcode o, const MIRType &type, uint32 bOffset, uint32 bsize, BaseNode *opnd); + ExtractbitsNode *CreateExprExtractbits(Opcode o, const MIRType &type, uint32 bOffset, uint32 bSize, BaseNode *opnd); RetypeNode *CreateExprRetype(const MIRType &type, const MIRType &fromType, BaseNode *opnd); ArrayNode *CreateExprArray(const MIRType &arrayType); ArrayNode *CreateExprArray(const MIRType &arrayType, BaseNode *op); ArrayNode *CreateExprArray(const MIRType &arrayType, BaseNode *op1, BaseNode *op2); - IntrinsicopNode *CreateExprIntrinsicop(MIRIntrinsicID idx, Opcode opCode, const MIRType &type, + IntrinsicopNode *CreateExprIntrinsicop(MIRIntrinsicID idx, Opcode opcode, const MIRType &type, const MapleVector &ops); // for creating Statement. NaryStmtNode *CreateStmtReturn(BaseNode *rVal); @@ -227,7 +225,7 @@ class MIRBuilder { IassignNode *CreateStmtIassign(const MIRType &type, FieldID fieldID, BaseNode *addr, BaseNode *src); IassignoffNode *CreateStmtIassignoff(PrimType pty, int32 offset, BaseNode *opnd0, BaseNode *src); IassignFPoffNode *CreateStmtIassignFPoff(PrimType pty, int32 offset, BaseNode *src); - CallNode *CreateStmtCall(PUIdx puIdx, const MapleVector &args, Opcode opCode = OP_call); + CallNode *CreateStmtCall(PUIdx puIdx, const MapleVector &args, Opcode opcode = OP_call); CallNode *CreateStmtCall(const std::string &name, const MapleVector &args); CallNode *CreateStmtVirtualCall(PUIdx puIdx, const MapleVector &args) { return CreateStmtCall(puIdx, args, OP_virtualcall); @@ -267,9 +265,9 @@ class MIRBuilder { TryNode *CreateStmtTry(const MapleVector &cLabIdxs); CatchNode *CreateStmtCatch(const MapleVector &tyIdxVec); LabelIdx GetOrCreateMIRLabel(const std::string &name); - LabelIdx CreateLabIdx(MIRFunction &mirfunc); + LabelIdx CreateLabIdx(MIRFunction &mirFunc); LabelNode *CreateStmtLabel(LabelIdx labIdx); - StmtNode *CreateStmtComment(const std::string &cmnt); + StmtNode *CreateStmtComment(const std::string &comment); CondGotoNode *CreateStmtCondGoto(BaseNode *cond, Opcode op, LabelIdx labIdx); void AddStmtInCurrentFunctionBody(StmtNode &stmt); MIRSymbol *GetSymbol(TyIdx, const std::string&, MIRSymKind, MIRStorageClass, uint8, bool) const; @@ -288,8 +286,8 @@ class MIRBuilder { private: - MIRSymbol *GetOrCreateGlobalDecl(const std::string &str, const TyIdx &tyIdx, bool &created) const; - MIRSymbol *GetOrCreateLocalDecl(const std::string &str, const TyIdx &tyIdx, MIRSymbolTable &symbolTable, + MIRSymbol *GetOrCreateGlobalDecl(const std::string &str, TyIdx tyIdx, bool &created) const; + MIRSymbol *GetOrCreateLocalDecl(const std::string &str, TyIdx tyIdx, MIRSymbolTable &symbolTable, bool &created) const; bool IsValidCallReturn(const MIRSymbol &ret) const { return ret.GetStorageClass() == kScAuto || ret.GetStorageClass() == kScFormal || @@ -300,7 +298,7 @@ class MIRBuilder { MapleSet incompleteTypeRefedSet; // std::vector> extraFieldsTuples; - unsigned int lineNum; + unsigned int lineNum = 0; }; } // namespace maple diff --git a/src/maple_ir/include/mir_config.h b/src/maple_ir/include/mir_config.h index 84aa16acfa9a2770907aba4ff5d57d30b7c54425..2c3a2e7cd2c251448edb2350d2b64e7ff5b0089b 100644 --- a/src/maple_ir/include/mir_config.h +++ b/src/maple_ir/include/mir_config.h @@ -12,13 +12,12 @@ * FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v1 for more details. */ -/* configuration definition for code in maple_ir namespace */ +// configuration definition for code in maple_ir namespace #ifndef MAPLE_IR_INCLUDE_MIR_CONFIG_H #define MAPLE_IR_INCLUDE_MIR_CONFIG_H -/** - * MIR_FEATURE_FULL = 1 : for host/server size building, by default. - * MIR_FEATURE_FULL = 0 : for resource-constrained devices. optimized for memory size - */ + +// MIR_FEATURE_FULL = 1 : for host/server size building, by default. +// MIR_FEATURE_FULL = 0 : for resource-constrained devices. optimized for memory size #if !defined(MIR_FEATURE_FULL) #define MIR_FEATURE_FULL 1 // default to full feature building, for debugging #endif // MIR_FEATURE_FULL define @@ -84,9 +83,8 @@ namespace maple { #define MIR_CAST_TO(var, totype) static_cast(var) #define MIR_DYN_CAST(var, totype) dynamic_cast(var) #endif // !MIR_FEATURE_FULL -/** - * MIR specific configurations. - */ + +// MIR specific configurations. // Note: fix size definition cannot handle arbitary long MIR lines, such // as those array initialization lines. constexpr int kMirMaxLineSize = 3072; // a max of 3K characters per line initially diff --git a/src/maple_ir/include/mir_const.h b/src/maple_ir/include/mir_const.h index 1d2e1853048f228d29fb6570b223057e824bd6c6..55073678de06f18244bc5e497adb763772350060 100644 --- a/src/maple_ir/include/mir_const.h +++ b/src/maple_ir/include/mir_const.h @@ -39,7 +39,7 @@ enum MIRConstKind { class MIRConst { public: - explicit MIRConst(MIRType &type, uint32 fieldID = 0) : kind(kConstInvalid), type(type), fieldID(fieldID) {} + explicit MIRConst(MIRType &type, uint32 fieldID = 0) : type(type), fieldID(fieldID) {} virtual ~MIRConst() = default; @@ -68,15 +68,11 @@ class MIRConst { // NO OP virtual void Neg() {} - virtual bool operator==(MIRConst &rhs) const { + virtual bool operator==(const MIRConst &rhs) const { return &rhs == this; } - MIRConstKind GetKind() { - return kind; - } - - const MIRConstKind GetKind() const { + MIRConstKind GetKind() const { return kind; } @@ -93,7 +89,7 @@ class MIRConst { } private: - MIRConstKind kind; + MIRConstKind kind = kConstInvalid; MIRType &type; uint32 fieldID; }; @@ -117,7 +113,7 @@ class MIRIntConst : public MIRConst { uint8 width = 0; uint64 tmp = value < 0 ? -(value + 1) : value; while (tmp != 0) { - width++; + ++width; tmp = tmp >> 1u; } return width; @@ -128,7 +124,7 @@ class MIRIntConst : public MIRConst { if (shiftBitNum < 0) { CHECK_FATAL(false, "shiftBitNum should not be less than zero"); } - uint32 unsignShiftBitNum = static_cast(shiftBitNum); + auto unsignShiftBitNum = static_cast(shiftBitNum); if (IsSignedInteger(GetType().GetPrimType())) { value = (value << unsignShiftBitNum) >> unsignShiftBitNum; } else { @@ -144,10 +140,9 @@ class MIRIntConst : public MIRConst { } if (IsSignedInteger(GetType().GetPrimType())) { return static_cast(((value) << shiftBitNum) >> shiftBitNum); - } else { - uint64 unsignedVal = static_cast(value); - return static_cast((unsignedVal << shiftBitNum) >> shiftBitNum); } + auto unsignedVal = static_cast(value); + return static_cast((unsignedVal << shiftBitNum) >> shiftBitNum); } void Dump() const override; @@ -177,7 +172,7 @@ class MIRIntConst : public MIRConst { value = val; } - bool operator==(MIRConst &rhs) const override; + bool operator==(const MIRConst &rhs) const override; private: int64 value; @@ -191,7 +186,7 @@ class MIRAddrofConst : public MIRConst { ~MIRAddrofConst() = default; - const StIdx &GetSymbolIndex() const { + StIdx GetSymbolIndex() const { return stIdx; } @@ -199,10 +194,9 @@ class MIRAddrofConst : public MIRConst { return fldID; } - /* virtual */ void Dump() const override; - /* virtual */ - bool operator==(MIRConst &rhs) const override; + + bool operator==(const MIRConst &rhs) const override; private: StIdx stIdx; @@ -221,10 +215,9 @@ class MIRAddroffuncConst : public MIRConst { return puIdx; } - /* virtual */ void Dump() const override; - /* virtual */ - bool operator==(MIRConst &rhs) const override; + + bool operator==(const MIRConst &rhs) const override; private: PUIdx puIdx; @@ -238,7 +231,7 @@ class MIRLblConst : public MIRConst { ~MIRLblConst() = default; - bool operator==(MIRConst &rhs) const override; + bool operator==(const MIRConst &rhs) const override; LabelIdx GetValue() const { return value; @@ -259,7 +252,7 @@ class MIRStrConst : public MIRConst { ~MIRStrConst() = default; void Dump() const override; - bool operator==(MIRConst &rhs) const override; + bool operator==(const MIRConst &rhs) const override; UStrIdx GetValue() const { return value; } @@ -288,7 +281,7 @@ class MIRStr16Const : public MIRConst { } void Dump() const override; - bool operator==(MIRConst &rhs) const override; + bool operator==(const MIRConst &rhs) const override; U16StrIdx GetValue() const { return value; } @@ -343,7 +336,7 @@ class MIRFloatConst : public MIRConst { value.floatValue = -value.floatValue; } - bool operator==(MIRConst &rhs) const override; + bool operator==(const MIRConst &rhs) const override; private: static const PrimType kPrimType = PTY_f32; @@ -364,12 +357,12 @@ class MIRDoubleConst : public MIRConst { ~MIRDoubleConst() = default; uint32 GetIntLow32() const { - uint64 unsignVal = static_cast(value.intValue); + auto unsignVal = static_cast(value.intValue); return static_cast(unsignVal & 0xffffffff); } uint32 GetIntHigh32() const { - uint64 unsignVal = static_cast(value.intValue); + auto unsignVal = static_cast(value.intValue); return static_cast((unsignVal & 0xffffffff00000000) >> 32); } @@ -400,7 +393,7 @@ class MIRDoubleConst : public MIRConst { value.dValue = -value.dValue; } - bool operator==(MIRConst &rhs) const override; + bool operator==(const MIRConst &rhs) const override; private: static const PrimType kPrimType = PTY_f64; @@ -440,7 +433,7 @@ class MIRFloat128Const : public MIRConst { MIR_ASSERT(value && "value must not be nullptr!"); return (value[0] == 0xffffffffffffffff && value[1] == 0xffffffffffffffff); }; - bool operator==(MIRConst &rhs) const override; + bool operator==(const MIRConst &rhs) const override; void Dump() const override; private: @@ -452,7 +445,7 @@ class MIRFloat128Const : public MIRConst { class MIRAggConst : public MIRConst { public: MIRAggConst(MIRModule &mod, MIRType &type) - : MIRConst(type), allocator(nullptr), constVec(mod.GetMPAllocator().Adapter()) { + : MIRConst(type), constVec(mod.GetMPAllocator().Adapter()) { SetKind(kConstAggConst); } @@ -497,10 +490,9 @@ class MIRAggConst : public MIRConst { } void Dump() const override; - bool operator==(MIRConst &rhs) const override; + bool operator==(const MIRConst &rhs) const override; private: - MapleAllocator allocator; MapleVector constVec; }; diff --git a/src/maple_ir/include/mir_function.h b/src/maple_ir/include/mir_function.h index a7d1bf73f790bc858432704685edae6c89a1cfcb..04f8475a8eca0c078345f6b444c0797f61c767c8 100644 --- a/src/maple_ir/include/mir_function.h +++ b/src/maple_ir/include/mir_function.h @@ -136,12 +136,19 @@ class MIRFunction { MIRType *GetNthParamType(size_t i); const TypeAttrs &GetNthParamAttr(size_t i) const { ASSERT(i < funcType->GetParamAttrsList().size(), "array index out of range"); - return funcType->GetParamAttrsList()[i]; + return funcType->GetNthParamAttrs(i); } + void SetNthParamAttr(size_t i, TypeAttrs attrs) { ASSERT(i < funcType->GetParamAttrsList().size(), "array index out of range"); - funcType->GetParamAttrsList()[i] = attrs; + funcType->SetNthParamAttrs(i, attrs); + } + + void SetNthParamAttrKind(size_t i, AttrKind x) const { + CHECK_FATAL(i < funcType->GetParamAttrsList().size(), "array index out of range"); + funcType->GetNthParamAttrs(i).SetAttr(x); } + void AddArgument(MIRSymbol *symbol) { formals.push_back(symbol); funcType->GetParamTypeList().push_back(symbol->GetTyIdx()); @@ -344,7 +351,7 @@ class MIRFunction { } uint32 GetFormalIndex(const MIRSymbol *symbol) const { - for (size_t i = 0; i < formals.size(); i++) + for (size_t i = 0; i < formals.size(); ++i) if (formals[i] == symbol) { return i; } @@ -698,8 +705,8 @@ class MIRFunction { return codeMemPool; } - void SetCodeMemPool(MemPool *currCodemp) { - codeMemPool = currCodemp; + void SetCodeMemPool(MemPool *currCodeMemPool) { + codeMemPool = currCodeMemPool; } MapleAllocator &GetCodeMPAllocator() { diff --git a/src/maple_ir/include/mir_lower.h b/src/maple_ir/include/mir_lower.h index 35c1ba7a4918e5496424eaff6efe19a694b5fb6f..0e4a6dda9f084a45411e0c11b9696c3905df2864 100644 --- a/src/maple_ir/include/mir_lower.h +++ b/src/maple_ir/include/mir_lower.h @@ -19,14 +19,20 @@ #include "opcodes.h" namespace maple { -enum MirLowerPhase : uint8 { kLowerUnder, kLowerMe, kLowerExpandArray, kLowerBe, kLowerCG }; +enum MirLowerPhase : uint8 { + kLowerUnder, + kLowerMe, + kLowerExpandArray, + kLowerBe, + kLowerCG +}; -#define LOWERME (1U << kLowerMe) -#define LOWEREXPANDARRAY (1U << kLowerExpandArray) -#define LOWERBE (1U << kLowerBe) -#define LOWERCG (1U << kLowerCG) +constexpr uint32 kShiftLowerMe = 1U << kLowerMe; +constexpr uint32 kShiftLowerExpandArray = 1U << kLowerExpandArray; +constexpr uint32 kShiftLowerBe = 1U << kLowerBe; +constexpr uint32 kShiftLowerCG = 1U << kLowerCG; // check if a block node ends with an unconditional jump -inline bool OpCodeNoFallThrough(const Opcode opCode) { +inline bool OpCodeNoFallThrough(Opcode opCode) { return opCode == OP_goto || opCode == OP_return || opCode == OP_switch || opCode == OP_throw || opCode == OP_gosub || opCode == OP_retsub; } @@ -39,7 +45,7 @@ class MIRLower { public: static const std::set kSetArrayHotFunc; - MIRLower(MIRModule &mod, MIRFunction *f) : mirModule(mod), mirFunc(f), mirBuilder(nullptr), lowerPhase(0) {} + MIRLower(MIRModule &mod, MIRFunction *f) : mirModule(mod), mirFunc(f) {} virtual ~MIRLower() = default; @@ -59,7 +65,6 @@ class MIRLower { void LowerBrCondition(BlockNode &block); void LowerFunc(MIRFunction &func); void ExpandArrayMrt(MIRFunction &func); - static bool ShouldOptArrayMrt(const MIRFunction &func); IfStmtNode *ExpandArrayMrtIfBlock(IfStmtNode &node); WhileStmtNode *ExpandArrayMrtWhileBlock(WhileStmtNode &node); DoloopNode *ExpandArrayMrtDoloopBlock(DoloopNode &node); @@ -67,42 +72,44 @@ class MIRLower { BlockNode *ExpandArrayMrtBlock(BlockNode &block); void AddArrayMrtMpl(BaseNode &exp, BlockNode &newblk); void SetLowerME() { - lowerPhase |= LOWERME; + lowerPhase |= kShiftLowerMe; } void SetLowerExpandArray() { - lowerPhase |= LOWEREXPANDARRAY; + lowerPhase |= kShiftLowerExpandArray; } void SetLowerBE() { - lowerPhase |= LOWERBE; + lowerPhase |= kShiftLowerBe; } void SetLowerCG() { - lowerPhase |= LOWERCG; + lowerPhase |= kShiftLowerCG; } bool IsLowerME() const { - return lowerPhase & LOWERME; + return lowerPhase & kShiftLowerMe; } bool IsLowerExpandArray() const { - return lowerPhase & LOWEREXPANDARRAY; + return lowerPhase & kShiftLowerExpandArray; } bool IsLowerBE() const { - return lowerPhase & LOWERBE; + return lowerPhase & kShiftLowerBe; } bool IsLowerCG() const { - return lowerPhase & LOWERCG; + return lowerPhase & kShiftLowerCG; } + static bool ShouldOptArrayMrt(const MIRFunction &func); + private: MIRModule &mirModule; MIRFunction *mirFunc; - MIRBuilder *mirBuilder; - uint32 lowerPhase; + MIRBuilder *mirBuilder = nullptr; + uint32 lowerPhase = 0; LabelIdx CreateCondGotoStmt(Opcode op, BlockNode &blk, const IfStmtNode &ifStmt); void CreateBrFalseStmt(BlockNode &blk, const IfStmtNode &ifStmt); void CreateBrTrueStmt(BlockNode &blk, const IfStmtNode &ifStmt); diff --git a/src/maple_ir/include/mir_module.h b/src/maple_ir/include/mir_module.h index cd61c6f712103da0eb3431d0c426c5ca82317ec7..4bfe914947c6e3a98e96adcbb4154c5b576b23b5 100644 --- a/src/maple_ir/include/mir_module.h +++ b/src/maple_ir/include/mir_module.h @@ -45,7 +45,13 @@ enum MIRFlavor { kCmpl // == CMPLv2 }; -enum MIRSrcLang { kSrcLangUnknown, kSrcLangC, kSrcLangJs, kSrcLangJava, kSrcLangCPlusPlus }; +enum MIRSrcLang { + kSrcLangUnknown, + kSrcLangC, + kSrcLangJs, + kSrcLangJava, + kSrcLangCPlusPlus +}; // blksize gives the size of the memory block in bytes; there are (blksize+3)/4 // words; 1 bit for each word, so the bit vector's length in bytes is @@ -261,6 +267,10 @@ class MIRModule { return optimizedFuncs.push_back(func); } + const MapleVector &GetOptFuncs() const { + return optimizedFuncs; + } + const MapleMap*> &GetPuIdxFieldInitializedMap() const { return puIdxFieldInitializedMap; } diff --git a/src/maple_ir/include/mir_nodes.h b/src/maple_ir/include/mir_nodes.h index 0ac46b93bb5224795e0d8d9cd49fb1d94c35095f..ed3c9fe283d15a81828be907577270979bbc93ad 100644 --- a/src/maple_ir/include/mir_nodes.h +++ b/src/maple_ir/include/mir_nodes.h @@ -25,12 +25,13 @@ #include "ptr_list_ref.h" namespace maple { +extern MIRModule *theMIRModule; class MIRPregTable; // circular dependency exists, no other choice class TypeTable; // circular dependency exists, no other choice struct RegFieldPair { public: - RegFieldPair() : fieldID(0), pregIdx(0) {} + RegFieldPair() = default; RegFieldPair(FieldID fidx, PregIdx16 pidx) : fieldID(fidx), pregIdx(pidx) {} @@ -55,8 +56,8 @@ struct RegFieldPair { } private: - FieldID fieldID; - PregIdx16 pregIdx; + FieldID fieldID = 0; + PregIdx16 pregIdx = 0; }; using CallReturnPair = std::pair; @@ -193,22 +194,22 @@ class BaseNode { class UnaryNode : public BaseNode { public: - explicit UnaryNode(Opcode o) : BaseNode(o, 1), uOpnd(nullptr) {} + explicit UnaryNode(Opcode o) : BaseNode(o, 1) {} - UnaryNode(Opcode o, PrimType typ) : BaseNode(o, typ, 1), uOpnd(nullptr) {} + UnaryNode(Opcode o, PrimType typ) : BaseNode(o, typ, 1) {} UnaryNode(Opcode o, PrimType typ, BaseNode *expr) : BaseNode(o, typ, 1), uOpnd(expr) {} - virtual ~UnaryNode() = default; + virtual ~UnaryNode() override = default; void DumpOpnd(const MIRModule &mod, int32 indent) const; void Dump(const MIRModule &mod, int32 indent) const override; bool Verify() const override; UnaryNode *CloneTree(MapleAllocator &allocator) const override { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetOpnd(uOpnd->CloneTree(allocator), 0); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + node->SetOpnd(uOpnd->CloneTree(allocator), 0); + return node; } BaseNode *Opnd(size_t i = 0) const override { @@ -233,27 +234,27 @@ class UnaryNode : public BaseNode { } private: - BaseNode *uOpnd; + BaseNode *uOpnd = nullptr; }; class TypeCvtNode : public UnaryNode { public: - explicit TypeCvtNode(Opcode o) : UnaryNode(o), fromPrimType(kPtyInvalid) {} + explicit TypeCvtNode(Opcode o) : UnaryNode(o) {} - TypeCvtNode(Opcode o, PrimType typ) : UnaryNode(o, typ), fromPrimType(kPtyInvalid) {} + TypeCvtNode(Opcode o, PrimType typ) : UnaryNode(o, typ) {} TypeCvtNode(Opcode o, PrimType typ, PrimType fromtyp, BaseNode *expr) : UnaryNode(o, typ, expr), fromPrimType(fromtyp) {} - ~TypeCvtNode() = default; + virtual ~TypeCvtNode() = default; - void Dump(const MIRModule &mod, int32 indent) const; - bool Verify() const; + void Dump(const MIRModule &mod, int32 indent) const override; + bool Verify() const override; - TypeCvtNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetOpnd(Opnd(0)->CloneTree(allocator), 0); - return nd; + TypeCvtNode *CloneTree(MapleAllocator &allocator) const override { + auto *node = allocator.GetMemPool()->New(*this); + node->SetOpnd(Opnd(0)->CloneTree(allocator), 0); + return node; } PrimType FromType() const { @@ -265,26 +266,26 @@ class TypeCvtNode : public UnaryNode { } private: - PrimType fromPrimType; + PrimType fromPrimType = kPtyInvalid; }; // used for retype class RetypeNode : public TypeCvtNode { public: - RetypeNode() : TypeCvtNode(OP_retype), tyIdx(0) {} + RetypeNode() : TypeCvtNode(OP_retype) {} - explicit RetypeNode(PrimType typ) : TypeCvtNode(OP_retype, typ), tyIdx(0) {} + explicit RetypeNode(PrimType typ) : TypeCvtNode(OP_retype, typ) {} RetypeNode(PrimType typ, PrimType fromtyp, TyIdx idx, BaseNode *expr) : TypeCvtNode(OP_retype, typ, fromtyp, expr), tyIdx(idx) {} - ~RetypeNode() = default; + virtual ~RetypeNode() = default; void Dump(const MIRModule &mod, int32 indent) const; RetypeNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetOpnd(Opnd()->CloneTree(allocator)); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + node->SetOpnd(Opnd()->CloneTree(allocator)); + return node; } const TyIdx &GetTyIdx() const { @@ -296,15 +297,15 @@ class RetypeNode : public TypeCvtNode { } private: - TyIdx tyIdx; + TyIdx tyIdx = TyIdx(0); }; // used for extractbits, sext, zext class ExtractbitsNode : public UnaryNode { public: - explicit ExtractbitsNode(Opcode o) : UnaryNode(o), bitsOffset(0), bitsSize(0) {} + explicit ExtractbitsNode(Opcode o) : UnaryNode(o) {} - ExtractbitsNode(Opcode o, PrimType typ) : UnaryNode(o, typ), bitsOffset(0), bitsSize(0) {} + ExtractbitsNode(Opcode o, PrimType typ) : UnaryNode(o, typ) {} ExtractbitsNode(Opcode o, PrimType typ, uint8 offset, uint8 size) : UnaryNode(o, typ), bitsOffset(offset), bitsSize(size) {} @@ -312,15 +313,15 @@ class ExtractbitsNode : public UnaryNode { ExtractbitsNode(Opcode o, PrimType typ, uint8 offset, uint8 size, BaseNode *expr) : UnaryNode(o, typ, expr), bitsOffset(offset), bitsSize(size) {} - ~ExtractbitsNode() = default; + virtual ~ExtractbitsNode() = default; - void Dump(const MIRModule &mod, int32 indent) const; - bool Verify() const; + void Dump(const MIRModule &mod, int32 indent) const override; + bool Verify() const override; - ExtractbitsNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetOpnd(Opnd()->CloneTree(allocator)); - return nd; + ExtractbitsNode *CloneTree(MapleAllocator &allocator) const override { + auto *node = allocator.GetMemPool()->New(*this); + node->SetOpnd(Opnd()->CloneTree(allocator)); + return node; } uint8 GetBitsOffset() const { @@ -340,23 +341,23 @@ class ExtractbitsNode : public UnaryNode { } private: - uint8 bitsOffset; - uint8 bitsSize; + uint8 bitsOffset = 0; + uint8 bitsSize = 0; }; class GCMallocNode : public BaseNode { public: - explicit GCMallocNode(Opcode o) : BaseNode(o), tyIdx(0), origPrimType(kPtyInvalid) {} + explicit GCMallocNode(Opcode o) : BaseNode(o) {} - GCMallocNode(Opcode o, PrimType typ, TyIdx tIdx) : BaseNode(o, typ, 0), tyIdx(tIdx), origPrimType(kPtyInvalid) {} + GCMallocNode(Opcode o, PrimType typ, TyIdx tIdx) : BaseNode(o, typ, 0), tyIdx(tIdx) {} - ~GCMallocNode() = default; + virtual ~GCMallocNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; GCMallocNode *CloneTree(MapleAllocator &allocator) const override { - auto *nd = allocator.GetMemPool()->New(*this); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + return node; } TyIdx GetTyIdx() const { @@ -372,28 +373,28 @@ class GCMallocNode : public BaseNode { } private: - TyIdx tyIdx; - PrimType origPrimType; + TyIdx tyIdx = TyIdx(0); + PrimType origPrimType = kPtyInvalid; }; class JarrayMallocNode : public UnaryNode { public: - explicit JarrayMallocNode(Opcode o) : UnaryNode(o), tyIdx(0) {} + explicit JarrayMallocNode(Opcode o) : UnaryNode(o) {} - JarrayMallocNode(Opcode o, PrimType typ) : UnaryNode(o, typ), tyIdx(0) {} + JarrayMallocNode(Opcode o, PrimType typ) : UnaryNode(o, typ) {} JarrayMallocNode(Opcode o, PrimType typ, TyIdx typeIdx) : UnaryNode(o, typ), tyIdx(typeIdx) {} JarrayMallocNode(Opcode o, PrimType typ, TyIdx typeIdx, BaseNode *opnd) : UnaryNode(o, typ, opnd), tyIdx(typeIdx) {} - ~JarrayMallocNode() = default; + virtual ~JarrayMallocNode() = default; - void Dump(const MIRModule &mod, int32 indent) const; + void Dump(const MIRModule &mod, int32 indent) const override; - JarrayMallocNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetOpnd(Opnd()->CloneTree(allocator)); - return nd; + JarrayMallocNode *CloneTree(MapleAllocator &allocator) const override { + auto *node = allocator.GetMemPool()->New(*this); + node->SetOpnd(Opnd()->CloneTree(allocator)); + return node; } TyIdx GetTyIdx() const { @@ -405,29 +406,29 @@ class JarrayMallocNode : public UnaryNode { } private: - TyIdx tyIdx; + TyIdx tyIdx = TyIdx(0); }; // iaddrof also use this node class IreadNode : public UnaryNode { public: - explicit IreadNode(Opcode o) : UnaryNode(o), tyIdx(0), fieldID(0) {} + explicit IreadNode(Opcode o) : UnaryNode(o) {} - IreadNode(Opcode o, PrimType typ) : UnaryNode(o, typ), tyIdx(0), fieldID(0) {} + IreadNode(Opcode o, PrimType typ) : UnaryNode(o, typ) {} IreadNode(Opcode o, PrimType typ, TyIdx typeIdx, FieldID fid) : UnaryNode(o, typ), tyIdx(typeIdx), fieldID(fid) {} IreadNode(Opcode o, PrimType typ, TyIdx typeIdx, FieldID fid, BaseNode *expr) : UnaryNode(o, typ, expr), tyIdx(typeIdx), fieldID(fid) {} - ~IreadNode() = default; - virtual void Dump(const MIRModule &mod, int32 indent) const; - bool Verify() const; + virtual ~IreadNode() = default; + virtual void Dump(const MIRModule &mod, int32 indent) const override; + bool Verify() const override; - IreadNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetOpnd(Opnd()->CloneTree(allocator)); - return nd; + IreadNode *CloneTree(MapleAllocator &allocator) const override { + auto *node = allocator.GetMemPool()->New(*this); + node->SetOpnd(Opnd()->CloneTree(allocator)); + return node; } const TyIdx &GetTyIdx() const { @@ -456,8 +457,8 @@ class IreadNode : public UnaryNode { } protected: - TyIdx tyIdx; - FieldID fieldID; + TyIdx tyIdx = TyIdx(0); + FieldID fieldID = 0; }; // IaddrofNode has the same member fields and member methods as IreadNode @@ -465,21 +466,21 @@ using IaddrofNode = IreadNode; class IreadoffNode : public UnaryNode { public: - IreadoffNode() : UnaryNode(OP_ireadoff), offset(0) {} + IreadoffNode() : UnaryNode(OP_ireadoff) {} IreadoffNode(PrimType ptyp, int32 ofst) : UnaryNode(OP_ireadoff, ptyp), offset(ofst) {} IreadoffNode(PrimType ptyp, BaseNode *opnd, int32 ofst) : UnaryNode(OP_ireadoff, ptyp, opnd), offset(ofst) {} - ~IreadoffNode() = default; + virtual ~IreadoffNode() = default; void Dump(const MIRModule &mod, int32 indent) const; bool Verify() const; IreadoffNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetOpnd(Opnd()->CloneTree(allocator)); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + node->SetOpnd(Opnd()->CloneTree(allocator)); + return node; } int32 GetOffset() const { @@ -491,23 +492,23 @@ class IreadoffNode : public UnaryNode { } private: - int32 offset; + int32 offset = 0; }; class IreadFPoffNode : public BaseNode { public: - IreadFPoffNode() : BaseNode(OP_ireadfpoff), offset(0) {} + IreadFPoffNode() : BaseNode(OP_ireadfpoff) {} IreadFPoffNode(PrimType ptyp, int32 ofst) : BaseNode(OP_ireadfpoff, ptyp), offset(ofst) {} - ~IreadFPoffNode() = default; + virtual ~IreadFPoffNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; bool Verify() const override; IreadFPoffNode *CloneTree(MapleAllocator &allocator) const override { - auto *nd = allocator.GetMemPool()->New(*this); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + return node; } int32 GetOffset() const { @@ -519,7 +520,7 @@ class IreadFPoffNode : public BaseNode { } private: - int32 offset; + int32 offset = 0; }; class BinaryOpnds { @@ -553,17 +554,17 @@ class BinaryNode : public BaseNode, public BinaryOpnds { SetBOpnd(r, 1); } - ~BinaryNode() = default; + virtual ~BinaryNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; void Dump(const MIRModule &mod) const; bool Verify() const override; BinaryNode *CloneTree(MapleAllocator &allocator) const override { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); - nd->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + node->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); + node->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); + return node; } bool IsCommutative() const { @@ -606,24 +607,24 @@ class BinaryNode : public BaseNode, public BinaryOpnds { class CompareNode : public BinaryNode { public: - explicit CompareNode(Opcode o) : BinaryNode(o), opndType(kPtyInvalid) {} + explicit CompareNode(Opcode o) : BinaryNode(o) {} - CompareNode(Opcode o, PrimType typ) : BinaryNode(o, typ), opndType(kPtyInvalid) {} + CompareNode(Opcode o, PrimType typ) : BinaryNode(o, typ) {} CompareNode(Opcode o, PrimType typ, PrimType otype, BaseNode *l, BaseNode *r) : BinaryNode(o, typ, l, r), opndType(otype) {} - ~CompareNode() = default; + virtual ~CompareNode() = default; void Dump(const MIRModule &mod, int32 indent) const; void Dump(const MIRModule &mod) const; bool Verify() const; CompareNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); - nd->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + node->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); + node->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); + return node; } PrimType GetOpndType() const { @@ -635,28 +636,28 @@ class CompareNode : public BinaryNode { } private: - PrimType opndType; // type of operands. + PrimType opndType = kPtyInvalid; // type of operands. }; class DepositbitsNode : public BinaryNode { public: - DepositbitsNode() : BinaryNode(OP_depositbits), bitsOffset(0), bitsSize(0) {} + DepositbitsNode() : BinaryNode(OP_depositbits) {} - DepositbitsNode(Opcode o, PrimType typ) : BinaryNode(o, typ), bitsOffset(0), bitsSize(0) {} + DepositbitsNode(Opcode o, PrimType typ) : BinaryNode(o, typ) {} DepositbitsNode(Opcode o, PrimType typ, uint8 offset, uint8 size, BaseNode *l, BaseNode *r) : BinaryNode(o, typ, l, r), bitsOffset(offset), bitsSize(size) {} - ~DepositbitsNode() = default; + virtual ~DepositbitsNode() = default; - void Dump(const MIRModule &mod, int32 indent) const; - bool Verify() const; + void Dump(const MIRModule &mod, int32 indent) const override; + bool Verify() const override; - DepositbitsNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); - nd->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); - return nd; + DepositbitsNode *CloneTree(MapleAllocator &allocator) const override { + auto *node = allocator.GetMemPool()->New(*this); + node->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); + node->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); + return node; } uint8 GetBitsOffset() const { @@ -676,8 +677,8 @@ class DepositbitsNode : public BinaryNode { } private: - uint8 bitsOffset; - uint8 bitsSize; + uint8 bitsOffset = 0; + uint8 bitsSize = 0; }; // used for resolveinterfacefunc, resolvevirtualfunc @@ -685,24 +686,24 @@ class DepositbitsNode : public BinaryNode { // bOpnd[1] stores offset class ResolveFuncNode : public BinaryNode { public: - explicit ResolveFuncNode(Opcode o) : BinaryNode(o), puIdx(0) {} + explicit ResolveFuncNode(Opcode o) : BinaryNode(o) {} - ResolveFuncNode(Opcode o, PrimType typ) : BinaryNode(o, typ), puIdx(0) {} + ResolveFuncNode(Opcode o, PrimType typ) : BinaryNode(o, typ) {} ResolveFuncNode(Opcode o, PrimType typ, PUIdx idx) : BinaryNode(o, typ), puIdx(idx) {} ResolveFuncNode(Opcode o, PrimType typ, PUIdx pIdx, BaseNode *opnd0, BaseNode *opnd1) : BinaryNode(o, typ, opnd0, opnd1), puIdx(pIdx) {} - ~ResolveFuncNode() = default; + virtual ~ResolveFuncNode() = default; void Dump(const MIRModule &mod, int32 indent) const; ResolveFuncNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); - nd->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + node->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); + node->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); + return node; } BaseNode *GetTabBaseAddr() const { @@ -717,27 +718,19 @@ class ResolveFuncNode : public BinaryNode { return puIdx; } - void SetPuIdx(PUIdx idx) { + void SetPUIdx(PUIdx idx) { puIdx = idx; } private: - PUIdx puIdx; + PUIdx puIdx = 0; }; class TernaryNode : public BaseNode { public: - explicit TernaryNode(Opcode o) : BaseNode(o, kOperandNumTernary) { - topnd[0] = nullptr; - topnd[1] = nullptr; - topnd[2] = nullptr; - } + explicit TernaryNode(Opcode o) : BaseNode(o, kOperandNumTernary) {} - TernaryNode(Opcode o, PrimType typ) : BaseNode(o, typ, kOperandNumTernary) { - topnd[0] = nullptr; - topnd[1] = nullptr; - topnd[2] = nullptr; - } + TernaryNode(Opcode o, PrimType typ) : BaseNode(o, typ, kOperandNumTernary) {} TernaryNode(Opcode o, PrimType typ, BaseNode *e0, BaseNode *e1, BaseNode *e2) : BaseNode(o, typ, kOperandNumTernary) { topnd[0] = e0; @@ -745,17 +738,17 @@ class TernaryNode : public BaseNode { topnd[2] = e2; } - ~TernaryNode() = default; + virtual ~TernaryNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; bool Verify() const override; TernaryNode *CloneTree(MapleAllocator &allocator) const override { - auto *nd = allocator.GetMemPool()->New(*this); - nd->topnd[0] = topnd[0]->CloneTree(allocator); - nd->topnd[1] = topnd[1]->CloneTree(allocator); - nd->topnd[2] = topnd[2]->CloneTree(allocator); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + node->topnd[0] = topnd[0]->CloneTree(allocator); + node->topnd[1] = topnd[1]->CloneTree(allocator); + node->topnd[2] = topnd[2]->CloneTree(allocator); + return node; } BaseNode *Opnd(size_t i) const override { @@ -781,7 +774,7 @@ class TernaryNode : public BaseNode { } private: - BaseNode *topnd[kOperandNumTernary]; + BaseNode *topnd[kOperandNumTernary] = { nullptr, nullptr, nullptr }; }; class NaryOpnds { @@ -840,16 +833,16 @@ class NaryNode : public BaseNode, public NaryOpnds { NaryNode(NaryNode &node) = delete; NaryNode &operator=(const NaryNode &node) = delete; - ~NaryNode() = default; + virtual ~NaryNode() = default; virtual void Dump(const MIRModule &mod, int32 indent) const override; NaryNode *CloneTree(MapleAllocator &allocator) const override { - auto *nd = allocator.GetMemPool()->New(allocator, *this); - for (size_t i = 0; i < GetNopndSize(); i++) { - nd->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); + auto *node = allocator.GetMemPool()->New(allocator, *this); + for (size_t i = 0; i < GetNopndSize(); ++i) { + node->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); } - return nd; + return node; } BaseNode *Opnd(size_t i) const override { @@ -901,18 +894,18 @@ class IntrinsicopNode : public NaryNode { IntrinsicopNode(IntrinsicopNode &node) = delete; IntrinsicopNode &operator=(const IntrinsicopNode &node) = delete; - ~IntrinsicopNode() = default; + virtual ~IntrinsicopNode() = default; void Dump(const MIRModule &mod, int32 indent) const; bool Verify() const; IntrinsicopNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(allocator, *this); - for (size_t i = 0; i < GetNopndSize(); i++) { - nd->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); + auto *node = allocator.GetMemPool()->New(allocator, *this); + for (size_t i = 0; i < GetNopndSize(); ++i) { + node->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); } - nd->SetNumOpnds(GetNopndSize()); - return nd; + node->SetNumOpnds(GetNopndSize()); + return node; } MIRIntrinsicID GetIntrinsic() const { @@ -938,14 +931,14 @@ class IntrinsicopNode : public NaryNode { class ConstvalNode : public BaseNode { public: - ConstvalNode() : BaseNode(OP_constval), constVal(nullptr) {} + ConstvalNode() : BaseNode(OP_constval) {} - explicit ConstvalNode(PrimType typ) : BaseNode(OP_constval, typ, 0), constVal(nullptr) {} + explicit ConstvalNode(PrimType typ) : BaseNode(OP_constval, typ, 0) {} explicit ConstvalNode(MIRConst *constv) : BaseNode(OP_constval), constVal(constv) {} ConstvalNode(PrimType typ, MIRConst *constv) : BaseNode(OP_constval, typ, 0), constVal(constv) {} - ~ConstvalNode() = default; + virtual ~ConstvalNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; ConstvalNode *CloneTree(MapleAllocator &allocator) const override { @@ -965,18 +958,18 @@ class ConstvalNode : public BaseNode { } private: - MIRConst *constVal; + MIRConst *constVal = nullptr; }; class ConststrNode : public BaseNode { public: - ConststrNode() : BaseNode(OP_conststr), strIdx(0) {} + ConststrNode() : BaseNode(OP_conststr) {} explicit ConststrNode(UStrIdx i) : BaseNode(OP_conststr), strIdx(i) {} ConststrNode(PrimType typ, UStrIdx i) : BaseNode(OP_conststr, typ, 0), strIdx(i) {} - ~ConststrNode() = default; + virtual ~ConststrNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; @@ -993,18 +986,18 @@ class ConststrNode : public BaseNode { } private: - UStrIdx strIdx; + UStrIdx strIdx = UStrIdx(0); }; class Conststr16Node : public BaseNode { public: - Conststr16Node() : BaseNode(OP_conststr16), strIdx(0) {} + Conststr16Node() : BaseNode(OP_conststr16) {} explicit Conststr16Node(U16StrIdx i) : BaseNode(OP_conststr16), strIdx(i) {} Conststr16Node(PrimType typ, U16StrIdx i) : BaseNode(OP_conststr16, typ, 0), strIdx(i) {} - ~Conststr16Node() = default; + virtual ~Conststr16Node() = default; void Dump(const MIRModule &mod, int32 indent) const override; @@ -1021,18 +1014,18 @@ class Conststr16Node : public BaseNode { } private: - U16StrIdx strIdx; + U16StrIdx strIdx = U16StrIdx(0); }; class SizeoftypeNode : public BaseNode { public: - SizeoftypeNode() : BaseNode(OP_sizeoftype), tyIdx(0) {} + SizeoftypeNode() : BaseNode(OP_sizeoftype) {} explicit SizeoftypeNode(TyIdx t) : BaseNode(OP_sizeoftype), tyIdx(t) {} SizeoftypeNode(PrimType type, TyIdx t) : BaseNode(OP_sizeoftype, type, 0), tyIdx(t) {} - ~SizeoftypeNode() = default; + virtual ~SizeoftypeNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; bool Verify() const override; @@ -1050,19 +1043,19 @@ class SizeoftypeNode : public BaseNode { } private: - TyIdx tyIdx; + TyIdx tyIdx = TyIdx(0); }; class FieldsDistNode : public BaseNode { public: - FieldsDistNode() : BaseNode(OP_fieldsdist), tyIdx(0), fieldID1(0), fieldID2(0) {} + FieldsDistNode() : BaseNode(OP_fieldsdist) {} FieldsDistNode(TyIdx t, FieldID f1, FieldID f2) : BaseNode(OP_fieldsdist), tyIdx(t), fieldID1(f1), fieldID2(f2) {} FieldsDistNode(PrimType typ, TyIdx t, FieldID f1, FieldID f2) : BaseNode(OP_fieldsdist, typ, 0), tyIdx(t), fieldID1(f1), fieldID2(f2) {} - ~FieldsDistNode() = default; + virtual ~FieldsDistNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; @@ -1095,19 +1088,19 @@ class FieldsDistNode : public BaseNode { } private: - TyIdx tyIdx; - FieldID fieldID1; - FieldID fieldID2; + TyIdx tyIdx = TyIdx(0); + FieldID fieldID1 = 0; + FieldID fieldID2 = 0; }; class ArrayNode : public NaryNode { public: - ArrayNode(MapleAllocator &allocator) : NaryNode(allocator, OP_array), boundsCheck(true) {} + ArrayNode(MapleAllocator &allocator) : NaryNode(allocator, OP_array) {} explicit ArrayNode(const MIRModule &mod) : ArrayNode(mod.GetCurFuncCodeMPAllocator()) {} ArrayNode(MapleAllocator &allocator, PrimType typ, TyIdx idx) - : NaryNode(allocator, OP_array, typ), tyIdx(idx), boundsCheck(true) {} + : NaryNode(allocator, OP_array, typ), tyIdx(idx) {} ArrayNode(const MIRModule &mod, PrimType typ, TyIdx idx) : ArrayNode(mod.GetCurFuncCodeMPAllocator(), typ, idx) {} @@ -1124,7 +1117,7 @@ class ArrayNode : public NaryNode { ArrayNode(ArrayNode &node) = delete; ArrayNode &operator=(const ArrayNode &node) = delete; - ~ArrayNode() = default; + virtual ~ArrayNode() = default; void Dump(const MIRModule &mod, int32 indent) const; bool Verify() const; @@ -1136,22 +1129,25 @@ class ArrayNode : public NaryNode { } ArrayNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(allocator, *this); - for (size_t i = 0; i < GetNopndSize(); i++) { - nd->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); + auto *node = allocator.GetMemPool()->New(allocator, *this); + for (size_t i = 0; i < GetNopndSize(); ++i) { + node->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); } - nd->boundsCheck = boundsCheck; - nd->SetNumOpnds(GetNopndSize()); - return nd; + node->boundsCheck = boundsCheck; + node->SetNumOpnds(GetNopndSize()); + return node; } - MIRType *GetArrayType(const TypeTable &tt) const; + const MIRType *GetArrayType(const TypeTable &tt) const; + MIRType *GetArrayType(const TypeTable &tt); BaseNode *GetIndex(size_t i) { return Opnd(i + 1); } - BaseNode *GetDim(const MIRModule &mod, const TypeTable &tt, int i) const; + const BaseNode *GetDim(const MIRModule &mod, TypeTable &tt, int i) const; + BaseNode *GetDim(const MIRModule &mod, TypeTable &tt, int i); + BaseNode *GetBase() { return Opnd(0); } @@ -1174,18 +1170,18 @@ class ArrayNode : public NaryNode { private: TyIdx tyIdx; - bool boundsCheck; + bool boundsCheck = true; }; class AddrofNode : public BaseNode { public: - explicit AddrofNode(Opcode o) : BaseNode(o), stIdx(), fieldID(0) {} + explicit AddrofNode(Opcode o) : BaseNode(o), stIdx() {} AddrofNode(Opcode o, PrimType typ) : AddrofNode(o, typ, StIdx(), 0) {} AddrofNode(Opcode o, PrimType typ, StIdx sIdx, FieldID fid) : BaseNode(o, typ, 0), stIdx(sIdx), fieldID(fid) {} - ~AddrofNode() = default; + virtual ~AddrofNode() = default; virtual void Dump(const MIRModule &mod, int32 indent) const override; bool Verify() const override; @@ -1217,7 +1213,7 @@ class AddrofNode : public BaseNode { private: StIdx stIdx; - FieldID fieldID; + FieldID fieldID = 0; }; // DreadNode has the same member fields and member methods as AddrofNode @@ -1225,7 +1221,7 @@ using DreadNode = AddrofNode; class RegreadNode : public BaseNode { public: - RegreadNode() : BaseNode(OP_regread), regIdx(0) {} + RegreadNode() : BaseNode(OP_regread) {} explicit RegreadNode(PregIdx pIdx) : BaseNode(OP_regread), regIdx(pIdx) {} @@ -1233,7 +1229,7 @@ class RegreadNode : public BaseNode { ptyp = primType; } - ~RegreadNode() = default; + virtual ~RegreadNode() = default; virtual void Dump(const MIRModule &mod, int32 indent) const override; bool Verify() const override; @@ -1250,16 +1246,16 @@ class RegreadNode : public BaseNode { } private: - PregIdx regIdx; // 32bit, negative if special register + PregIdx regIdx = 0; // 32bit, negative if special register }; class AddroffuncNode : public BaseNode { public: - AddroffuncNode() : BaseNode(OP_addroffunc), puIdx(0) {} + AddroffuncNode() : BaseNode(OP_addroffunc) {} AddroffuncNode(PrimType typ, PUIdx pIdx) : BaseNode(OP_addroffunc, typ, 0), puIdx(pIdx) {} - ~AddroffuncNode() = default; + virtual ~AddroffuncNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; bool Verify() const override; @@ -1277,16 +1273,16 @@ class AddroffuncNode : public BaseNode { } private: - PUIdx puIdx; // 32bit now + PUIdx puIdx = 0; // 32bit now }; class AddroflabelNode : public BaseNode { public: - AddroflabelNode() : BaseNode(OP_addroflabel), offset(0) {} + AddroflabelNode() : BaseNode(OP_addroflabel) {} explicit AddroflabelNode(uint32 ofst) : BaseNode(OP_addroflabel), offset(ofst) {} - ~AddroflabelNode() = default; + virtual ~AddroflabelNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; bool Verify() const override; @@ -1304,13 +1300,13 @@ class AddroflabelNode : public BaseNode { } private: - uint32 offset; + uint32 offset = 0; }; // to store source position information class SrcPosition { public: - SrcPosition() : lineNum(0), mplLineNum(0) { + SrcPosition() { u.word0 = 0; } @@ -1378,8 +1374,8 @@ class SrcPosition { uint32 word0; } u; - uint32 lineNum; // line number of original src file, like foo.java - uint32 mplLineNum; // line number of mpl file + uint32 lineNum = 0; // line number of original src file, like foo.java + uint32 mplLineNum = 0; // line number of mpl file }; // for cleanuptry, catch, finally, retsub, endtry, membaracquire, membarrelease, @@ -1390,15 +1386,15 @@ class StmtNode : public BaseNode, public PtrListNodeBase { static uint32 lastPrintedLineNum; // used during printing ascii output explicit StmtNode(Opcode o) : BaseNode(o), PtrListNodeBase(), stmtID(stmtIDNext) { - stmtIDNext++; + ++stmtIDNext; } StmtNode(Opcode o, uint8 numOpr) : BaseNode(o, numOpr), PtrListNodeBase(), stmtID(stmtIDNext) { - stmtIDNext++; + ++stmtIDNext; } StmtNode(Opcode o, PrimType typ, uint8 numOpr) : BaseNode(o, typ, numOpr), PtrListNodeBase(), stmtID(stmtIDNext) { - stmtIDNext++; + ++stmtIDNext; } virtual ~StmtNode() = default; @@ -1461,7 +1457,7 @@ class IassignNode : public StmtNode { SetNumOpnds(kOperandNumBinary); } - ~IassignNode() = default; + virtual ~IassignNode() = default; TyIdx GetTyIdx() const { return tyIdx; @@ -1540,11 +1536,11 @@ class IassignNode : public StmtNode { // goto and gosub class GotoNode : public StmtNode { public: - explicit GotoNode(Opcode o) : StmtNode(o), offset(0) {} + explicit GotoNode(Opcode o) : StmtNode(o) {} GotoNode(Opcode o, uint32 ofst) : StmtNode(o), offset(ofst) {} - ~GotoNode() = default; + virtual ~GotoNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; @@ -1563,18 +1559,18 @@ class GotoNode : public StmtNode { } private: - uint32 offset; + uint32 offset = 0; }; // try class JsTryNode : public StmtNode { public: - JsTryNode() : StmtNode(OP_jstry), catchOffset(0), finallyOffset(0) {} + JsTryNode() : StmtNode(OP_jstry) {} JsTryNode(uint16 catchofst, uint16 finallyofset) : StmtNode(OP_jstry), catchOffset(catchofst), finallyOffset(finallyofset) {} - ~JsTryNode() = default; + virtual ~JsTryNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; @@ -1601,8 +1597,8 @@ class JsTryNode : public StmtNode { } private: - uint16 catchOffset; - uint16 finallyOffset; + uint16 catchOffset = 0; + uint16 finallyOffset = 0; }; // try @@ -1616,7 +1612,7 @@ class TryNode : public StmtNode { TryNode(TryNode &node) = delete; TryNode &operator=(const TryNode &node) = delete; - ~TryNode() = default; + virtual ~TryNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; void Dump(const MIRModule &mod) const; @@ -1661,12 +1657,12 @@ class TryNode : public StmtNode { } TryNode *CloneTree(MapleAllocator &allocator) const override { - auto *nd = allocator.GetMemPool()->New(allocator); - nd->SetStmtID(stmtIDNext++); - for (size_t i = 0; i < offsets.size(); i++) { - nd->AddOffset(offsets[i]); + auto *node = allocator.GetMemPool()->New(allocator); + node->SetStmtID(stmtIDNext++); + for (size_t i = 0; i < offsets.size(); ++i) { + node->AddOffset(offsets[i]); } - return nd; + return node; } private: @@ -1685,7 +1681,7 @@ class CatchNode : public StmtNode { CatchNode(CatchNode &node) = delete; CatchNode &operator=(const CatchNode &node) = delete; - ~CatchNode() = default; + virtual ~CatchNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; void Dump(const MIRModule &mod) const; @@ -1717,12 +1713,12 @@ class CatchNode : public StmtNode { } CatchNode *CloneTree(MapleAllocator &allocator) const override { - auto *j = allocator.GetMemPool()->New(allocator); - j->SetStmtID(stmtIDNext++); - for (uint32 i = 0; i < Size(); i++) { - j->PushBack(GetExceptionTyIdxVecElement(i)); + auto *node = allocator.GetMemPool()->New(allocator); + node->SetStmtID(stmtIDNext++); + for (size_t i = 0; i < Size(); ++i) { + node->PushBack(GetExceptionTyIdxVecElement(i)); } - return j; + return node; } private: @@ -1734,8 +1730,7 @@ using CasePair = std::pair; using CaseVector = MapleVector; class SwitchNode : public StmtNode { public: - explicit SwitchNode(MapleAllocator &allocator) - : StmtNode(OP_switch, 1), switchOpnd(nullptr), defaultLabel(0), switchTable(allocator.Adapter()) {} + explicit SwitchNode(MapleAllocator &allocator) : StmtNode(OP_switch, 1), switchTable(allocator.Adapter()) {} explicit SwitchNode(const MIRModule &mod) : SwitchNode(mod.GetCurFuncCodeMPAllocator()) {} @@ -1748,7 +1743,6 @@ class SwitchNode : public StmtNode { SwitchNode(MapleAllocator &allocator, const SwitchNode &node) : StmtNode(node.GetOpCode(), node.GetPrimType(), node.numOpnds), - switchOpnd(nullptr), defaultLabel(node.GetDefaultLabel()), switchTable(allocator.Adapter()) {} @@ -1756,18 +1750,18 @@ class SwitchNode : public StmtNode { SwitchNode(SwitchNode &node) = delete; SwitchNode &operator=(const SwitchNode &node) = delete; - ~SwitchNode() = default; + virtual ~SwitchNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; bool Verify() const override; SwitchNode *CloneTree(MapleAllocator &allocator) const override { - auto *nd = allocator.GetMemPool()->New(allocator, *this); - nd->SetSwitchOpnd(switchOpnd->CloneTree(allocator)); - for (size_t i = 0; i < switchTable.size(); i++) { - nd->InsertCasePair(switchTable[i]); + auto *node = allocator.GetMemPool()->New(allocator, *this); + node->SetSwitchOpnd(switchOpnd->CloneTree(allocator)); + for (size_t i = 0; i < switchTable.size(); ++i) { + node->InsertCasePair(switchTable[i]); } - return nd; + return node; } BaseNode *Opnd(size_t i) const override { @@ -1822,8 +1816,8 @@ class SwitchNode : public StmtNode { } private: - BaseNode *switchOpnd; - LabelIdx defaultLabel; + BaseNode *switchOpnd = nullptr; + LabelIdx defaultLabel = 0; CaseVector switchTable; }; @@ -1831,35 +1825,32 @@ using MCasePair = std::pair; using MCaseVector = MapleVector; class MultiwayNode : public StmtNode { public: - explicit MultiwayNode(MapleAllocator &allocator) - : StmtNode(OP_multiway, 1), multiWayOpnd(nullptr), defaultLabel(0), multiWayTable(allocator.Adapter()) {} + explicit MultiwayNode(MapleAllocator &allocator) : StmtNode(OP_multiway, 1), multiWayTable(allocator.Adapter()) {} explicit MultiwayNode(const MIRModule &mod) : MultiwayNode(mod.GetCurFuncCodeMPAllocator()) {} MultiwayNode(MapleAllocator &allocator, LabelIdx label) - : StmtNode(OP_multiway, 1), multiWayOpnd(nullptr), defaultLabel(label), multiWayTable(allocator.Adapter()) {} + : StmtNode(OP_multiway, 1), defaultLabel(label), multiWayTable(allocator.Adapter()) {} MultiwayNode(const MIRModule &mod, LabelIdx label) : MultiwayNode(mod.GetCurFuncCodeMPAllocator(), label) {} MultiwayNode(MapleAllocator &allocator, const MultiwayNode &node) : StmtNode(node.GetOpCode(), node.GetPrimType(), node.numOpnds), - multiWayOpnd(nullptr), defaultLabel(node.defaultLabel), multiWayTable(allocator.Adapter()) {} - MultiwayNode(const MIRModule &mod, const MultiwayNode &node) - : MultiwayNode(mod.GetCurFuncCodeMPAllocator(), node) {} + MultiwayNode(const MIRModule &mod, const MultiwayNode &node) : MultiwayNode(mod.GetCurFuncCodeMPAllocator(), node) {} MultiwayNode(MultiwayNode &node) = delete; MultiwayNode &operator=(const MultiwayNode &node) = delete; - ~MultiwayNode() = default; + virtual ~MultiwayNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; MultiwayNode *CloneTree(MapleAllocator &allocator) const override { auto *nd = allocator.GetMemPool()->New(allocator, *this); nd->multiWayOpnd = static_cast(multiWayOpnd->CloneTree(allocator)); - for (size_t i = 0; i < multiWayTable.size(); i++) { + for (size_t i = 0; i < multiWayTable.size(); ++i) { BaseNode *node = multiWayTable[i].first->CloneTree(allocator); MCasePair pair(static_cast(node), multiWayTable[i].second); nd->multiWayTable.push_back(pair); @@ -1875,12 +1866,12 @@ class MultiwayNode : public StmtNode { return multiWayOpnd; } - void SetMultiWayOpnd(BaseNode *multiwayopndPara) { - multiWayOpnd = multiwayopndPara; + void SetMultiWayOpnd(BaseNode *multiwayOpndPara) { + multiWayOpnd = multiwayOpndPara; } - void SetDefaultlabel(LabelIdx defaultlabelPara) { - defaultLabel = defaultlabelPara; + void SetDefaultlabel(LabelIdx defaultLabelPara) { + defaultLabel = defaultLabelPara; } void AppendElemToMultiWayTable(const MCasePair &mCasrPair) { @@ -1892,17 +1883,17 @@ class MultiwayNode : public StmtNode { } private: - BaseNode *multiWayOpnd; - LabelIdx defaultLabel; + BaseNode *multiWayOpnd = nullptr; + LabelIdx defaultLabel = 0; MCaseVector multiWayTable; }; // eval, throw, free, decref, incref, decrefreset, assertnonnull class UnaryStmtNode : public StmtNode { public: - explicit UnaryStmtNode(Opcode o) : StmtNode(o, 1), uOpnd(nullptr) {} + explicit UnaryStmtNode(Opcode o) : StmtNode(o, 1) {} - UnaryStmtNode(Opcode o, PrimType typ) : StmtNode(o, typ, 1), uOpnd(nullptr) {} + UnaryStmtNode(Opcode o, PrimType typ) : StmtNode(o, typ, 1) {} UnaryStmtNode(Opcode o, PrimType typ, BaseNode *opnd) : StmtNode(o, typ, 1), uOpnd(opnd) {} @@ -1917,10 +1908,10 @@ class UnaryStmtNode : public StmtNode { } UnaryStmtNode *CloneTree(MapleAllocator &allocator) const override { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetStmtID(stmtIDNext++); - nd->SetOpnd(uOpnd->CloneTree(allocator)); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + node->SetStmtID(stmtIDNext++); + node->SetOpnd(uOpnd->CloneTree(allocator)); + return node; } bool IsLeaf() const override { @@ -1946,33 +1937,33 @@ class UnaryStmtNode : public StmtNode { } private: - BaseNode *uOpnd; + BaseNode *uOpnd = nullptr; }; // dassign, maydassign class DassignNode : public UnaryStmtNode { public: - DassignNode() : UnaryStmtNode(OP_dassign), stIdx(), fieldID(0) {} + DassignNode() : UnaryStmtNode(OP_dassign), stIdx() {} - explicit DassignNode(PrimType typ) : UnaryStmtNode(OP_dassign, typ), stIdx(), fieldID(0) {} + explicit DassignNode(PrimType typ) : UnaryStmtNode(OP_dassign, typ), stIdx() {} - DassignNode(PrimType typ, BaseNode *opnd) : UnaryStmtNode(OP_dassign, typ, opnd), stIdx(), fieldID(0) {} + DassignNode(PrimType typ, BaseNode *opnd) : UnaryStmtNode(OP_dassign, typ, opnd), stIdx() {} DassignNode(PrimType typ, BaseNode *opnd, StIdx idx, FieldID fieldID) : UnaryStmtNode(OP_dassign, typ, opnd), stIdx(idx), fieldID(fieldID) {} DassignNode(BaseNode *opnd, StIdx idx, FieldID fieldID) : DassignNode(kPtyInvalid, opnd, idx, fieldID) {} - ~DassignNode() = default; + virtual ~DassignNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; bool Verify() const override; DassignNode *CloneTree(MapleAllocator &allocator) const override { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetStmtID(stmtIDNext++); - nd->SetOpnd(Opnd()->CloneTree(allocator)); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + node->SetStmtID(stmtIDNext++); + node->SetOpnd(Opnd()->CloneTree(allocator)); + return node; } uint8 NumOpnds() const override { @@ -1984,7 +1975,7 @@ class DassignNode : public UnaryStmtNode { if (rhs->GetOpCode() != OP_dread) { return false; } - AddrofNode *dread = static_cast(rhs); + auto *dread = static_cast(rhs); return (stIdx == dread->GetStIdx()); } @@ -2013,28 +2004,28 @@ class DassignNode : public UnaryStmtNode { private: StIdx stIdx; - FieldID fieldID; + FieldID fieldID = 0; }; class RegassignNode : public UnaryStmtNode { public: - RegassignNode() : UnaryStmtNode(OP_regassign), regIdx(0) {} + RegassignNode() : UnaryStmtNode(OP_regassign) {} explicit RegassignNode(const RegassignNode &node) : UnaryStmtNode(node), regIdx(node.regIdx) {} RegassignNode(PrimType primType, PregIdx idx, BaseNode *opnd) : UnaryStmtNode(OP_regassign, primType, opnd), regIdx(idx) {} - ~RegassignNode() = default; + virtual ~RegassignNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; bool Verify() const override; RegassignNode *CloneTree(MapleAllocator &allocator) const override { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetStmtID(stmtIDNext++); - nd->SetOpnd(Opnd()->CloneTree(allocator)); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + node->SetStmtID(stmtIDNext++); + node->SetOpnd(Opnd()->CloneTree(allocator)); + return node; } BaseNode *GetRHS() const override { @@ -2053,7 +2044,7 @@ class RegassignNode : public UnaryStmtNode { } private: - PregIdx regIdx; // 32bit, negative if special register + PregIdx regIdx = 0; // 32bit, negative if special register }; // brtrue and brfalse @@ -2065,7 +2056,7 @@ class CondGotoNode : public UnaryStmtNode { SetNumOpnds(kOperandNumUnary); } - ~CondGotoNode() = default; + virtual ~CondGotoNode() = default; void Dump(const MIRModule &mod, int32 indent) const; bool Verify() const; @@ -2079,10 +2070,10 @@ class CondGotoNode : public UnaryStmtNode { } CondGotoNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetStmtID(stmtIDNext++); - nd->SetOpnd(Opnd()->CloneTree(allocator)); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + node->SetStmtID(stmtIDNext++); + node->SetOpnd(Opnd()->CloneTree(allocator)); + return node; } private: @@ -2094,7 +2085,7 @@ using SmallCaseVector = MapleVector; class RangeGotoNode : public UnaryStmtNode { public: explicit RangeGotoNode(MapleAllocator &allocator) - : UnaryStmtNode(OP_rangegoto), tagOffset(0), rangegotoTable(allocator.Adapter()) {} + : UnaryStmtNode(OP_rangegoto), rangegotoTable(allocator.Adapter()) {} explicit RangeGotoNode(const MIRModule &mod) : RangeGotoNode(mod.GetCurFuncCodeMPAllocator()) {} @@ -2108,17 +2099,17 @@ class RangeGotoNode : public UnaryStmtNode { RangeGotoNode(RangeGotoNode &node) = delete; RangeGotoNode &operator=(const RangeGotoNode &node) = delete; - ~RangeGotoNode() = default; + virtual ~RangeGotoNode() = default; void Dump(const MIRModule &mod, int32 indent) const; bool Verify() const; RangeGotoNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(allocator, *this); - nd->SetOpnd(Opnd()->CloneTree(allocator)); - for (size_t i = 0; i < rangegotoTable.size(); i++) { - nd->rangegotoTable.push_back(rangegotoTable[i]); + auto *node = allocator.GetMemPool()->New(allocator, *this); + node->SetOpnd(Opnd()->CloneTree(allocator)); + for (size_t i = 0; i < rangegotoTable.size(); ++i) { + node->rangegotoTable.push_back(rangegotoTable[i]); } - return nd; + return node; } const SmallCaseVector &GetRangeGotoTable() const { @@ -2142,7 +2133,7 @@ class RangeGotoNode : public UnaryStmtNode { } private: - int32 tagOffset; + int32 tagOffset = 0; // add each tag to tagOffset field to get the actual tag values SmallCaseVector rangegotoTable; }; @@ -2250,24 +2241,24 @@ class BlockNode : public StmtNode { class IfStmtNode : public UnaryStmtNode { public: - IfStmtNode() : UnaryStmtNode(OP_if), thenPart(nullptr), elsePart(nullptr) { + IfStmtNode() : UnaryStmtNode(OP_if) { numOpnds = kOperandNumBinary; } - ~IfStmtNode() = default; + virtual ~IfStmtNode() = default; void Dump(const MIRModule &mod, int32 indent) const; bool Verify() const; IfStmtNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetStmtID(stmtIDNext++); - nd->SetOpnd(Opnd()->CloneTree(allocator)); - nd->thenPart = thenPart->CloneTree(allocator); + auto *node = allocator.GetMemPool()->New(*this); + node->SetStmtID(stmtIDNext++); + node->SetOpnd(Opnd()->CloneTree(allocator)); + node->thenPart = thenPart->CloneTree(allocator); if (elsePart != nullptr) { - nd->elsePart = elsePart->CloneTree(allocator); + node->elsePart = elsePart->CloneTree(allocator); } - return nd; + return node; } BaseNode *Opnd(size_t i = 0) const { @@ -2305,28 +2296,28 @@ class IfStmtNode : public UnaryStmtNode { } private: - BlockNode *thenPart; - BlockNode *elsePart; + BlockNode *thenPart = nullptr; + BlockNode *elsePart = nullptr; }; // for both while and dowhile class WhileStmtNode : public UnaryStmtNode { public: - explicit WhileStmtNode(Opcode o) : UnaryStmtNode(o), body(nullptr) { + explicit WhileStmtNode(Opcode o) : UnaryStmtNode(o) { SetNumOpnds(kOperandNumBinary); } - ~WhileStmtNode() = default; + virtual ~WhileStmtNode() = default; void Dump(const MIRModule &mod, int32 indent) const; bool Verify() const; WhileStmtNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetStmtID(stmtIDNext++); - nd->SetOpnd(Opnd()->CloneTree(allocator)); - nd->body = body->CloneTree(allocator); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + node->SetStmtID(stmtIDNext++); + node->SetOpnd(Opnd()->CloneTree(allocator)); + node->body = body->CloneTree(allocator); + return node; } void SetBody(BlockNode *node) { @@ -2338,7 +2329,7 @@ class WhileStmtNode : public UnaryStmtNode { } private: - BlockNode *body; + BlockNode *body = nullptr; }; class DoloopNode : public StmtNode { @@ -2354,20 +2345,20 @@ class DoloopNode : public StmtNode { incrExpr(incrExp), doBody(doBody) {} - ~DoloopNode() = default; + virtual ~DoloopNode() = default; void DumpDoVar(const MIRModule &mod) const; void Dump(const MIRModule &mod, int32 indent) const override; bool Verify() const override; DoloopNode *CloneTree(MapleAllocator &allocator) const override { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetStmtID(stmtIDNext++); - nd->SetStartExpr(startExpr->CloneTree(allocator)); - nd->SetContExpr(GetCondExpr()->CloneTree(allocator)); - nd->SetIncrExpr(GetIncrExpr()->CloneTree(allocator)); - nd->SetDoBody(GetDoBody()->CloneTree(allocator)); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + node->SetStmtID(stmtIDNext++); + node->SetStartExpr(startExpr->CloneTree(allocator)); + node->SetContExpr(GetCondExpr()->CloneTree(allocator)); + node->SetIncrExpr(GetIncrExpr()->CloneTree(allocator)); + node->SetDoBody(GetDoBody()->CloneTree(allocator)); + return node; } void SetDoVarStIdx(StIdx idx) { @@ -2465,11 +2456,11 @@ class DoloopNode : public StmtNode { class ForeachelemNode : public StmtNode { public: - ForeachelemNode() : StmtNode(OP_foreachelem), loopBody(nullptr) { + ForeachelemNode() : StmtNode(OP_foreachelem) { SetNumOpnds(kOperandNumUnary); } - ~ForeachelemNode() = default; + virtual ~ForeachelemNode() = default; const StIdx &GetElemStIdx() const { return elemStIdx; @@ -2506,16 +2497,16 @@ class ForeachelemNode : public StmtNode { void Dump(const MIRModule &mod, int32 indent) const; ForeachelemNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetStmtID(stmtIDNext++); - nd->SetLoopBody(loopBody->CloneTree(allocator)); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + node->SetStmtID(stmtIDNext++); + node->SetLoopBody(loopBody->CloneTree(allocator)); + return node; } private: StIdx elemStIdx; // must be local symbol StIdx arrayStIdx; // symbol table entry of the array/collection variable - BlockNode *loopBody; + BlockNode *loopBody = nullptr; }; // used by assertge, assertlt @@ -2523,16 +2514,16 @@ class BinaryStmtNode : public StmtNode, public BinaryOpnds { public: explicit BinaryStmtNode(Opcode o) : StmtNode(o, kOperandNumBinary) {} - ~BinaryStmtNode() = default; + virtual ~BinaryStmtNode() = default; void Dump(const MIRModule &mod, int32 indent) const; virtual bool Verify() const; BinaryStmtNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetStmtID(stmtIDNext++); - nd->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); - nd->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + node->SetStmtID(stmtIDNext++); + node->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); + node->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); + return node; } BaseNode *Opnd(size_t i) const { @@ -2556,7 +2547,7 @@ class BinaryStmtNode : public StmtNode, public BinaryOpnds { class IassignoffNode : public BinaryStmtNode { public: - IassignoffNode() : BinaryStmtNode(OP_iassignoff), offset(0) {} + IassignoffNode() : BinaryStmtNode(OP_iassignoff) {} explicit IassignoffNode(int32 ofst) : BinaryStmtNode(OP_iassignoff), offset(ofst) {} @@ -2566,17 +2557,17 @@ class IassignoffNode : public BinaryStmtNode { SetBOpnd(srcOpnd, 1); } - ~IassignoffNode() = default; + virtual ~IassignoffNode() = default; void Dump(const MIRModule &mod, int32 indent) const; bool Verify() const; IassignoffNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetStmtID(stmtIDNext++); - nd->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); - nd->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + node->SetStmtID(stmtIDNext++); + node->SetBOpnd(GetBOpnd(0)->CloneTree(allocator), 0); + node->SetBOpnd(GetBOpnd(1)->CloneTree(allocator), 1); + return node; } int32 GetOffset() const { @@ -2588,12 +2579,12 @@ class IassignoffNode : public BinaryStmtNode { } private: - int32 offset; + int32 offset = 0; }; class IassignFPoffNode : public UnaryStmtNode { public: - IassignFPoffNode() : UnaryStmtNode(OP_iassignfpoff), offset(0) {} + IassignFPoffNode() : UnaryStmtNode(OP_iassignfpoff) {} explicit IassignFPoffNode(int32 ofst) : UnaryStmtNode(OP_iassignfpoff), offset(ofst) {} @@ -2602,16 +2593,16 @@ class IassignFPoffNode : public UnaryStmtNode { SetOpnd(src); } - ~IassignFPoffNode() = default; + virtual ~IassignFPoffNode() = default; void Dump(const MIRModule &mod, int32 indent) const; bool Verify() const; IassignFPoffNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(*this); - nd->SetStmtID(stmtIDNext++); - nd->SetOpnd(Opnd()->CloneTree(allocator)); - return nd; + auto *node = allocator.GetMemPool()->New(*this); + node->SetStmtID(stmtIDNext++); + node->SetOpnd(Opnd()->CloneTree(allocator)); + return node; } void SetOffset(int32 ofst) { @@ -2623,7 +2614,7 @@ class IassignFPoffNode : public UnaryStmtNode { } private: - int32 offset; + int32 offset = 0; }; // used by return, syncenter, syncexit @@ -2641,18 +2632,18 @@ class NaryStmtNode : public StmtNode, public NaryOpnds { NaryStmtNode(NaryStmtNode &node) = delete; NaryStmtNode &operator=(const NaryStmtNode &node) = delete; - ~NaryStmtNode() = default; + virtual ~NaryStmtNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; virtual bool Verify() const override; NaryStmtNode *CloneTree(MapleAllocator &allocator) const override { - auto *nd = allocator.GetMemPool()->New(allocator, *this); - for (size_t i = 0; i < GetNopndSize(); i++) { - nd->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); + auto *node = allocator.GetMemPool()->New(allocator, *this); + for (size_t i = 0; i < GetNopndSize(); ++i) { + node->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); } - nd->SetNumOpnds(GetNopndSize()); - return nd; + node->SetNumOpnds(GetNopndSize()); + return node; } BaseNode *Opnd(size_t i) const override { @@ -2699,8 +2690,7 @@ class ReturnValuePart { // customcallassigned class CallNode : public NaryStmtNode { public: - CallNode(MapleAllocator &allocator, Opcode o) - : NaryStmtNode(allocator, o), puIdx(0), tyIdx(0), returnValues(allocator.Adapter()) {} + CallNode(MapleAllocator &allocator, Opcode o) : NaryStmtNode(allocator, o), returnValues(allocator.Adapter()) {} CallNode(MapleAllocator &allocator, Opcode o, PUIdx idx) : CallNode(allocator, o, idx, TyIdx()) {} @@ -2722,22 +2712,22 @@ class CallNode : public NaryStmtNode { CallNode(CallNode &node) = delete; CallNode &operator=(const CallNode &node) = delete; - ~CallNode() = default; + virtual ~CallNode() = default; virtual void Dump(const MIRModule &mod, int32 indent, bool newline) const; bool Verify() const; MIRType *GetCallReturnType(); const MIRSymbol *GetCallReturnSymbol(const MIRModule &mod) const; CallNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(allocator, *this); - for (size_t i = 0; i < GetNopndSize(); i++) { - nd->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); + auto *node = allocator.GetMemPool()->New(allocator, *this); + for (size_t i = 0; i < GetNopndSize(); ++i) { + node->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); } - for (size_t i = 0; i < returnValues.size(); i++) { - nd->GetReturnVec().push_back(returnValues[i]); + for (size_t i = 0; i < returnValues.size(); ++i) { + node->GetReturnVec().push_back(returnValues[i]); } - nd->SetNumOpnds(GetNopndSize()); - return nd; + node->SetNumOpnds(GetNopndSize()); + return node; } PUIdx GetPUIdx() const { @@ -2797,8 +2787,8 @@ class CallNode : public NaryStmtNode { } private: - PUIdx puIdx; - TyIdx tyIdx; + PUIdx puIdx = 0; + TyIdx tyIdx = TyIdx(0); CallReturnVector returnValues; }; @@ -2825,21 +2815,21 @@ class IcallNode : public NaryStmtNode { IcallNode(IcallNode &node) = delete; IcallNode &operator=(const IcallNode &node) = delete; - ~IcallNode() = default; + virtual ~IcallNode() = default; virtual void Dump(const MIRModule &mod, int32 indent, bool newline) const; bool Verify() const; MIRType *GetCallReturnType(); IcallNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(allocator, *this); - for (size_t i = 0; i < GetNopndSize(); i++) { - nd->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); + auto *node = allocator.GetMemPool()->New(allocator, *this); + for (size_t i = 0; i < GetNopndSize(); ++i) { + node->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); } - for (size_t i = 0; i < returnValues.size(); i++) { - nd->returnValues.push_back(returnValues[i]); + for (size_t i = 0; i < returnValues.size(); ++i) { + node->returnValues.push_back(returnValues[i]); } - nd->SetNumOpnds(GetNopndSize()); - return nd; + node->SetNumOpnds(GetNopndSize()); + return node; } TyIdx GetRetTyIdx() const { @@ -2906,22 +2896,22 @@ class IntrinsiccallNode : public NaryStmtNode { IntrinsiccallNode(IntrinsiccallNode &node) = delete; IntrinsiccallNode &operator=(const IntrinsiccallNode &node) = delete; - ~IntrinsiccallNode() = default; + virtual ~IntrinsiccallNode() = default; virtual void Dump(const MIRModule &mod, int32 indent, bool newline) const; bool Verify() const; MIRType *GetCallReturnType(); IntrinsiccallNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(allocator, *this); - for (size_t i = 0; i < GetNopndSize(); i++) { - nd->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); + auto *node = allocator.GetMemPool()->New(allocator, *this); + for (size_t i = 0; i < GetNopndSize(); ++i) { + node->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); } - for (size_t i = 0; i < returnValues.size(); i++) { - nd->GetReturnVec().push_back(returnValues[i]); + for (size_t i = 0; i < returnValues.size(); ++i) { + node->GetReturnVec().push_back(returnValues[i]); } - nd->SetNumOpnds(GetNopndSize()); - return nd; + node->SetNumOpnds(GetNopndSize()); + return node; } MIRIntrinsicID GetIntrinsic() const { @@ -2995,7 +2985,7 @@ class CallinstantNode : public CallNode { CallinstantNode(CallinstantNode &node) = delete; CallinstantNode &operator=(const CallinstantNode &node) = delete; - ~CallinstantNode() = default; + virtual ~CallinstantNode() = default; virtual void Dump(const MIRModule &mod, int32 indent, bool newline) const; virtual void Dump(const MIRModule &mod, int32 indent) const { @@ -3003,15 +2993,15 @@ class CallinstantNode : public CallNode { } CallinstantNode *CloneTree(MapleAllocator &allocator) const { - auto *nd = allocator.GetMemPool()->New(allocator, *this); - for (size_t i = 0; i < GetNopndSize(); i++) { - nd->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); + auto *node = allocator.GetMemPool()->New(allocator, *this); + for (size_t i = 0; i < GetNopndSize(); ++i) { + node->GetNopnd().push_back(GetNopndAt(i)->CloneTree(allocator)); } - for (size_t i = 0; i < GetReturnVec().size(); i++) { - nd->GetReturnVec().push_back(GetNthReturnVec(i)); + for (size_t i = 0; i < GetReturnVec().size(); ++i) { + node->GetReturnVec().push_back(GetNthReturnVec(i)); } - nd->SetNumOpnds(GetNopndSize()); - return nd; + node->SetNumOpnds(GetNopndSize()); + return node; } CallReturnVector *GetCallReturnVector() { @@ -3029,7 +3019,7 @@ class AssertStmtNode : public BinaryStmtNode { isLt = (op == OP_assertlt); } - ~AssertStmtNode() = default; + virtual ~AssertStmtNode() = default; void Dump(const MIRModule &mod, int32 indent) const; @@ -3039,11 +3029,11 @@ class AssertStmtNode : public BinaryStmtNode { class LabelNode : public StmtNode { public: - LabelNode() : StmtNode(OP_label), labelIdx(0) {} + LabelNode() : StmtNode(OP_label) {} explicit LabelNode(LabelIdx idx) : StmtNode(OP_label), labelIdx(idx) {} - ~LabelNode() = default; + virtual ~LabelNode() = default; void Dump(const MIRModule &mod, int32 indent) const override; @@ -3062,7 +3052,7 @@ class LabelNode : public StmtNode { } private: - LabelIdx labelIdx; + LabelIdx labelIdx = 0; }; class CommentNode : public StmtNode { @@ -3084,7 +3074,7 @@ class CommentNode : public StmtNode { CommentNode(CommentNode &node) = delete; CommentNode &operator=(const CommentNode &node) = delete; - ~CommentNode() = default; + virtual ~CommentNode() = default; void Dump(const MIRModule &mod, int32 indent) const; diff --git a/src/maple_ir/include/mir_parser.h b/src/maple_ir/include/mir_parser.h index 95918e9033867414c4b10da84432963926db27ee..6fd6a2b649832d4b26ac82d145ff85cd88640597 100644 --- a/src/maple_ir/include/mir_parser.h +++ b/src/maple_ir/include/mir_parser.h @@ -28,24 +28,9 @@ using BlockNodePtr = BlockNode*; class MIRParser { public: explicit MIRParser(MIRModule &md) - : paramOpForStmt(kOpUndef), - paramTokenKindForStmt(kTkInvalid), - paramCurrFuncForParseStmtBlock(nullptr), - lexer(md), + : lexer(md), mod(md), - options(kKeepFirst), - definedLabels(mod.GetMPAllocator().Adapter()), - dummyFunction(nullptr), - curFunc(nullptr), - lastFileNum(0), - lastLineNum(0), - firstLineNum(0), - maxPregNo(0), - paramParseLocalType(false), - paramFileIdx(0), - paramIsIPA(false), - paramIsComb(false), - paramTokenKind(kTkInvalid) {} + definedLabels(mod.GetMPAllocator().Adapter()) {} ~MIRParser() = default; @@ -248,14 +233,11 @@ class MIRParser { static std::map InitFuncPtrMapForParseExpr(); // func and param for ParseStmt - Opcode paramOpForStmt; - TokenKind paramTokenKindForStmt; using FuncPtrParseStmt = bool (MIRParser::*)(StmtNodePtr &stmt); static std::map funcPtrMapForParseStmt; static std::map InitFuncPtrMapForParseStmt(); // func and param for ParseStmtBlock - MIRFunction *paramCurrFuncForParseStmtBlock; using FuncPtrParseStmtBlock = bool (MIRParser::*)(); static std::map funcPtrMapForParseStmtBlock; static std::map InitFuncPtrMapForParseStmtBlock(); @@ -279,28 +261,33 @@ class MIRParser { // common func void SetSrcPos(StmtNodePtr stmt, uint32 mplNum); + // func for ParseExpr + Opcode paramOpForStmt = kOpUndef; + TokenKind paramTokenKindForStmt = kTkInvalid; + // func and param for ParseStmtBlock + MIRFunction *paramCurrFuncForParseStmtBlock = nullptr; MIRLexer lexer; MIRModule &mod; std::string message; std::string warningMessage; - uint32 options; + uint32 options = kKeepFirst; MapleVector definedLabels; // true if label at labidx is defined - MIRFunction *dummyFunction; - MIRFunction *curFunc; - uint16 lastFileNum; // to remember first number after LOC - uint32 lastLineNum; // to remember second number after LOC - uint32 firstLineNum; // to track function starting line + MIRFunction *dummyFunction = nullptr; + MIRFunction *curFunc = nullptr; + uint16 lastFileNum = 0; // to remember first number after LOC + uint32 lastLineNum = 0; // to remember second number after LOC + uint32 firstLineNum = 0; // to track function starting line std::map typeDefIdxMap; // map previous declared tyIdx - uint32 maxPregNo; // max pregNo seen so far in current function + uint32 maxPregNo = 0; // max pregNo seen so far in current function // param for ParseTypedef - bool paramParseLocalType; + bool paramParseLocalType = false; // param for ParseMIR() - uint32 paramFileIdx; - bool paramIsIPA; - bool paramIsComb; - TokenKind paramTokenKind; + uint32 paramFileIdx = 0; + bool paramIsIPA = false; + bool paramIsComb = false; + TokenKind paramTokenKind = kTkInvalid; std::vector paramImportFileList; }; } // namespace maple diff --git a/src/maple_ir/include/mir_preg.h b/src/maple_ir/include/mir_preg.h index d507bc7366fb3f83d23aef21964b35035e40acc0..d3a5f3bca2c355a923449cc9685bdba99293ed0a 100644 --- a/src/maple_ir/include/mir_preg.h +++ b/src/maple_ir/include/mir_preg.h @@ -34,11 +34,9 @@ enum SpecialReg : signed int { #if MIR_FEATURE_FULL class MIRPreg { public: - explicit MIRPreg(uint32 n = 0) : primType(kPtyInvalid), isRef(false), needRC(false), pregNo(n), mirType(nullptr) {} + explicit MIRPreg(uint32 n = 0) : MIRPreg(n, nullptr) {} - MIRPreg(uint32 n, MIRType *mType) : MIRPreg(n) { - mirType = mType; - } + MIRPreg(uint32 n, MIRType *mType) : pregNo(n), mirType(mType) {} ~MIRPreg() = default; void SetNeedRC(bool needRC = true) { @@ -82,9 +80,9 @@ class MIRPreg { } private: - PrimType primType; - bool isRef; - bool needRC; + PrimType primType = kPtyInvalid; + bool isRef = false; + bool needRC = false; int32 pregNo; // the number in maple IR after the % MIRType *mirType; }; @@ -93,8 +91,7 @@ class MIRPregTable { public: static constexpr uint32 kMaxUserPregIndex = 10000; MIRPregTable(MIRModule *mod, MapleAllocator *allocator) - : pregIndex(kMaxUserPregIndex), - pregNoToPregIdxMap(std::less(), allocator->Adapter()), + : pregNoToPregIdxMap(allocator->Adapter()), pregTable(allocator->Adapter()), module(mod), mAllocator(allocator) { @@ -106,7 +103,7 @@ class MIRPregTable { specPregTable[kSregThrownval].SetPregNo(-kSregThrownval); specPregTable[kSregMethodhdl].SetPregNo(-kSregMethodhdl); specPregTable[kSregRetval0].SetPregNo(-kSregRetval0); - for (uint32 i = 0; i < kSregLast; i++) { + for (uint32 i = 0; i < kSregLast; ++i) { specPregTable[i].SetPrimType(PTY_unknown); } } @@ -193,7 +190,7 @@ class MIRPregTable { } private: - uint32 pregIndex; // user(maple_ir)'s preg must less than this value + uint32 pregIndex = kMaxUserPregIndex; // user(maple_ir)'s preg must less than this value MapleMap pregNoToPregIdxMap; // for quick lookup based on pregno MapleVector pregTable; MIRPreg specPregTable[kSregLast]; // for the MIRPreg nodes corresponding to special registers diff --git a/src/maple_ir/include/mir_symbol.h b/src/maple_ir/include/mir_symbol.h index 21ffe33304db7c26cf6467605c114f2810e7b283..375044238470d1609612fd64789075a8a15e2002 100644 --- a/src/maple_ir/include/mir_symbol.h +++ b/src/maple_ir/include/mir_symbol.h @@ -29,10 +29,10 @@ enum MIRSymKind { kStConst, kStJavaClass, kStJavaInterface, - kStPreg, + kStPreg }; -enum MIRStorageClass : std::uint8_t { +enum MIRStorageClass : uint8 { kScInvalid, kScAuto, kScAliased, @@ -57,7 +57,7 @@ class MIRSymbol { MIRPreg *preg; // the MIRSymKind must be kStPreg }; - MIRSymbol() : stIdx(0, 0) {} + MIRSymbol() = default; MIRSymbol(uint32 idx, uint8 scp) : stIdx(scp, idx) {} ~MIRSymbol() = default; @@ -105,7 +105,7 @@ class MIRSymbol { this->inferredTyIdx = inferredTyIdx; } - const TyIdx &GetInferredTyIdx() const { + TyIdx GetInferredTyIdx() const { return inferredTyIdx; } @@ -113,7 +113,7 @@ class MIRSymbol { this->stIdx = stIdx; } - const StIdx &GetStIdx() const { + StIdx GetStIdx() const { return stIdx; } @@ -194,8 +194,8 @@ class MIRSymbol { return typeAttrs.GetAttr(ATTR_localrefvar); } - void SetNameStrIdx(const GStrIdx &stridx) { - nameStrIdx = stridx; + void SetNameStrIdx(GStrIdx strIdx) { + nameStrIdx = strIdx; } void SetNameStrIdx(const std::string &name); @@ -213,7 +213,7 @@ class MIRSymbol { } bool IsReadOnly() const { - return (kScFstatic == storageClass && kStConst == sKind); + return kScFstatic == storageClass && kStConst == sKind; } bool IsConst() const { @@ -296,7 +296,7 @@ class MIRSymbol { } bool IsEhIndex() const { - return GetName().compare("__eh_index__") == 0; + return GetName() == "__eh_index__"; } bool HasAddrOfValues() const; @@ -367,7 +367,7 @@ class MIRSymbol { bool isDeleted = false; // tell if it is deleted, NOT serialized bool instrumented = false; // a local ref pointer instrumented by RC opt, NOT serialized bool isImported = false; - StIdx stIdx; + StIdx stIdx { 0, 0 }; TypeAttrs typeAttrs; GStrIdx nameStrIdx{ 0 }; SymbolType value = { nullptr }; @@ -389,16 +389,19 @@ class MIRSymbolTable { return idx < symbolTable.size(); } - MIRSymbol *GetSymbolFromStIdx(uint32 idx, bool checkFirst = false) const { + const MIRSymbol *GetSymbolFromStIdx(uint32 idx, bool checkFirst = false) const { if (checkFirst && idx >= symbolTable.size()) { return nullptr; } CHECK_FATAL(IsValidIdx(idx), "symbol table index out of range"); return symbolTable[idx]; } + MIRSymbol *GetSymbolFromStIdx(uint32 idx, bool checkFirst = false) { + return const_cast(const_cast(this)->GetSymbolFromStIdx(idx, checkFirst)); + } MIRSymbol *CreateSymbol(uint8 scopeID) { - MIRSymbol *st = mAllocator.GetMemPool()->New(symbolTable.size(), scopeID); + auto *st = mAllocator.GetMemPool()->New(symbolTable.size(), scopeID); symbolTable.push_back(st); return st; } diff --git a/src/maple_ir/include/mir_symbol_builder.h b/src/maple_ir/include/mir_symbol_builder.h index 709f9aa665775dd890dd6cb984c39eeb026c6667..cac65e9bd4ff8868a9d22a84e7e90075c26fabb8 100644 --- a/src/maple_ir/include/mir_symbol_builder.h +++ b/src/maple_ir/include/mir_symbol_builder.h @@ -40,7 +40,7 @@ class MIRSymbolBuilder { return builder; } - MIRSymbol *GetLocalDecl(const MIRSymbolTable &symbolTable, GStrIdx strIdx) const; + MIRSymbol *GetLocalDecl(MIRSymbolTable &symbolTable, GStrIdx strIdx) const; MIRSymbol *CreateLocalDecl(MIRSymbolTable &symbolTable, GStrIdx strIdx, const MIRType &type) const; MIRSymbol *GetGlobalDecl(GStrIdx strIdx) const; MIRSymbol *CreateGlobalDecl(GStrIdx strIdx, const MIRType &type, MIRStorageClass sc) const; @@ -60,4 +60,4 @@ class MIRSymbolBuilder { }; } // maple -#endif // MAPLEIR_INCLUDE_MIRSYMBOLBUILDER_H \ No newline at end of file +#endif // MAPLEIR_INCLUDE_MIRSYMBOLBUILDER_H diff --git a/src/maple_ir/include/mir_type.h b/src/maple_ir/include/mir_type.h index 065e9072f9e60092e75951bda6ee306d1948452d..226e5d8bdee3fd963693f9336cda6ab667caaf67 100644 --- a/src/maple_ir/include/mir_type.h +++ b/src/maple_ir/include/mir_type.h @@ -620,12 +620,12 @@ class MIRArrayType : public MIRType { size_t GetHashIndex() const override { constexpr uint8 idxShift = 2; - size_t hidx = (eTyIdx.GetIdx() << idxShift) + (typeKind << kShiftNumOfTypeKind); + size_t hIdx = (eTyIdx.GetIdx() << idxShift) + (typeKind << kShiftNumOfTypeKind); for (size_t i = 0; i < dim; ++i) { CHECK_FATAL(i < kMaxArrayDim, "array index out of range"); - hidx += (sizeArray[i] << i); + hIdx += (sizeArray[i] << i); } - return hidx % kTypeHashLength; + return hIdx % kTypeHashLength; } std::string GetMplTypeName() const override; @@ -1035,16 +1035,16 @@ class MIRJarrayType : public MIRFarrayType { } size_t GetHashIndex() const override { - constexpr uint8 kIdxShift = 5; - return ((GetElemTyIdx().GetIdx() << kIdxShift) + (typeKind << kShiftNumOfTypeKind)) % kTypeHashLength; + constexpr uint8 idxShift = 5; + return ((GetElemTyIdx().GetIdx() << idxShift) + (typeKind << kShiftNumOfTypeKind)) % kTypeHashLength; } private: + void DetermineName(); // determine the internal name of this type TyIdx parentTyIdx{ 0 }; // since Jarray is also an object, this is java.lang.Object GStrIdx javaNameStrIdx{ 0 }; // for internal java name of Jarray. nameStrIdx is used for other purpose bool fromPrimitive = false; // the lowest dimension is primitive type int dim = 0; // the dimension if decidable at compile time. otherwise 0 - void DetermineName(); // determine the internal name of this type }; // used by kTypeClass, kTypeClassIncomplete @@ -1125,7 +1125,8 @@ class MIRClassType : public MIRStructType { ASSERT(i < interfacesImplemented.size(), "array index out of range"); return interfacesImplemented.at(i); } - void SetNthInterfaceImplemented(uint32 i, TyIdx tyIdx) { + + void SetNthInterfaceImplemented(size_t i, TyIdx tyIdx) { ASSERT(i < interfacesImplemented.size(), "array index out of range"); interfacesImplemented.at(i) = tyIdx; } @@ -1386,6 +1387,11 @@ class MIRFuncType : public MIRType { return paramAttrsList[i]; } + TypeAttrs &GetNthParamAttrs(size_t i) { + ASSERT(i < paramAttrsList.size(), "array index out of range"); + return paramAttrsList[i]; + } + void SetParamAttrsList(const std::vector &list) { paramAttrsList = list; } @@ -1404,11 +1410,11 @@ class MIRFuncType : public MIRType { } size_t GetHashIndex() const override { - constexpr uint8 kIdxShift = 6; - size_t hidx = (retTyIdx.GetIdx() << kIdxShift) + (typeKind << kShiftNumOfTypeKind); + constexpr uint8 idxShift = 6; + size_t hIdx = (retTyIdx.GetIdx() << idxShift) + (typeKind << kShiftNumOfTypeKind); size_t size = paramTypeList.size(); - hidx += (size ? (paramTypeList[0].GetIdx() + size) : 0) << 4; - return hidx % kTypeHashLength; + hIdx += (size ? (paramTypeList[0].GetIdx() + size) : 0) << 4; + return hIdx % kTypeHashLength; } private: @@ -1439,8 +1445,8 @@ class MIRTypeByName : public MIRType { } // size unknown size_t GetHashIndex() const override { - constexpr uint8 kIdxShift = 2; - return ((nameStrIdx.GetIdx() << kIdxShift) + nameIsLocal + (typeKind << kShiftNumOfTypeKind)) % kTypeHashLength; + constexpr uint8 idxShift = 2; + return ((nameStrIdx.GetIdx() << idxShift) + nameIsLocal + (typeKind << kShiftNumOfTypeKind)) % kTypeHashLength; } }; @@ -1468,8 +1474,8 @@ class MIRTypeParam : public MIRType { } size_t GetHashIndex() const override { - constexpr uint8 kIdxShift = 3; - return ((nameStrIdx.GetIdx() << kIdxShift) + (typeKind << kShiftNumOfTypeKind)) % kTypeHashLength; + constexpr uint8 idxShift = 3; + return ((nameStrIdx.GetIdx() << idxShift) + (typeKind << kShiftNumOfTypeKind)) % kTypeHashLength; } }; @@ -1504,11 +1510,11 @@ class MIRInstantVectorType : public MIRType { } size_t GetHashIndex() const override { - uint32 hidx = typeKind << kShiftNumOfTypeKind; + uint32 hIdx = typeKind << kShiftNumOfTypeKind; for (const TypePair &typePair : instantVec) { - hidx += (typePair.first.GetIdx() + typePair.second.GetIdx()) << 3; + hIdx += (typePair.first.GetIdx() + typePair.second.GetIdx()) << 3; } - return hidx % kTypeHashLength; + return hIdx % kTypeHashLength; } protected: @@ -1544,12 +1550,12 @@ class MIRGenericInstantType : public MIRInstantVectorType { } size_t GetHashIndex() const override { - constexpr uint8 kIdxShift = 2; - uint32 hidx = (genericTyIdx.GetIdx() << kIdxShift) + (typeKind << kShiftNumOfTypeKind); + constexpr uint8 idxShift = 2; + uint32 hIdx = (genericTyIdx.GetIdx() << idxShift) + (typeKind << kShiftNumOfTypeKind); for (const TypePair &typePair : instantVec) { - hidx += (typePair.first.GetIdx() + typePair.second.GetIdx()) << 3; + hIdx += (typePair.first.GetIdx() + typePair.second.GetIdx()) << 3; } - return hidx % kTypeHashLength; + return hIdx % kTypeHashLength; } private: diff --git a/src/maple_ir/include/option.h b/src/maple_ir/include/option.h index 3a8496f477eec2fd2602088f0c20fb63e2c97ef5..f5a6e4482e52d54ad893d31b43f79c3bfcb887ea 100644 --- a/src/maple_ir/include/option.h +++ b/src/maple_ir/include/option.h @@ -27,7 +27,7 @@ constexpr uint32 kConservativeDecouple = 1; constexpr uint32 kRadicalDecouple = 2; class Options { public: - explicit Options(maple::MemPool &memPool) : optionAlloc(&memPool) {} + explicit Options(MemPool &memPool) : optionAlloc(&memPool) {} bool ParseOptions(int argc, char **argv, std::string &fileName) const; ~Options() = default; @@ -37,8 +37,8 @@ class Options { return phaseSeq; } - const std::string LastPhaseName() const { - return phaseSeq.empty() ? "noopt" : phaseSeq[phaseSeq.size() - 1].c_str(); + std::string LastPhaseName() const { + return phaseSeq.empty() ? "noopt" : phaseSeq[phaseSeq.size() - 1]; } static bool dumpBefore; diff --git a/src/maple_ir/src/bin_mpl_export.cpp b/src/maple_ir/src/bin_mpl_export.cpp index 2d70deed0cdb58c5e38ad6b3cb2fcbb4393392f8..f60eca3ce8a4a24e33705789e34f2e6e3009f24c 100644 --- a/src/maple_ir/src/bin_mpl_export.cpp +++ b/src/maple_ir/src/bin_mpl_export.cpp @@ -603,7 +603,6 @@ void BinaryMplExport::OutputFunction(PUIdx puIdx) { return; } MIRFunction *func = GlobalTables::GetFunctionTable().GetFunctionFromPuidx(puIdx); - ASSERT(func != nullptr, "Cannot get MIRFunction."); size_t mark = funcMark.size(); funcMark[func] = mark; MIRFunction *savedFunc = mod.CurFunction(); diff --git a/src/maple_ir/src/driver.cpp b/src/maple_ir/src/driver.cpp index c952ad628a0c87f86fc43abfd25380e647bb2249..20298bf4b2b4c3248b1ee585a162f5b04bebe807 100644 --- a/src/maple_ir/src/driver.cpp +++ b/src/maple_ir/src/driver.cpp @@ -23,22 +23,20 @@ using namespace maple; #if MIR_FEATURE_FULL -void ConstantFoldModule(maple::MIRModule &module) { - MapleVector &funcList = module.GetFunctionList(); +void ConstantFoldModule(MIRModule &module) { + MapleVector &funcList = module.GetFunctionList(); for (auto it = funcList.begin(); it != funcList.end(); ++it) { - maple::MIRFunction *curFunc = *it; + MIRFunction *curFunc = *it; module.SetCurFunction(curFunc); } } -/* hello.mpl - flavor 1 - srclang 3 - - type $person }> - var $BOB i32 = 8 -*/ +// hello.mpl +// flavor 1 +// srclang 3 +// type $person }> +// var $BOB i32 = 8 int main(int argc, char **argv) { constexpr int judgeNumber = 2; if (argc < judgeNumber) { @@ -49,7 +47,7 @@ int main(int argc, char **argv) { exit(1); } char flag = '\0'; - maple::int32 i = 1; + int32 i = 1; if (argv[1][0] == 'i' && argv[1][1] == '\0') { flag = 'i'; i = judgeNumber; @@ -58,25 +56,25 @@ int main(int argc, char **argv) { i = judgeNumber; } while (i < argc) { - maple::MIRModule module{ argv[i] }; + MIRModule module{ argv[i] }; if (flag == '\0') { - maple::MIRParser theParser(module); + MIRParser theParser(module); if (theParser.ParseMIR()) { ConstantFoldModule(module); module.OutputAsciiMpl(".irb"); } else { - theParser.EmitError(module.GetFileName().c_str()); + theParser.EmitError(module.GetFileName()); return 1; } } else if (flag == 'e') { - maple::MIRParser theParser(module); + MIRParser theParser(module); if (theParser.ParseMIR()) { ConstantFoldModule(module); BinaryMplt binMplt(module); - std::string modID = module.GetFileName(); + const std::string &modID = module.GetFileName(); binMplt.Export("bin." + modID); } else { - theParser.EmitError(module.GetFileName().c_str()); + theParser.EmitError(module.GetFileName()); return 1; } } else if (flag == 'i') { @@ -84,7 +82,7 @@ int main(int argc, char **argv) { module.SetSrcLang(kSrcLangJava); BinaryMplImport binMplt(module); binMplt.SetImported(false); - std::string modID = module.GetFileName(); + const std::string &modID = module.GetFileName(); binMplt.Import(modID, true); module.OutputAsciiMpl(".irb"); } diff --git a/src/maple_ir/src/global_tables.cpp b/src/maple_ir/src/global_tables.cpp index 3437a786d72e43e10e0e43b62566c53b7363a3c5..705d1b8c3b37c5c38356115b088094cfb1d38ed5 100644 --- a/src/maple_ir/src/global_tables.cpp +++ b/src/maple_ir/src/global_tables.cpp @@ -80,17 +80,20 @@ MIRType *TypeTable::GetOrCreatePointerType(const MIRType &pointTo, PrimType prim return GetOrCreatePointerType(pointTo.GetTypeIndex(), primType); } -MIRType *TypeTable::GetPointedTypeIfApplicable(MIRType &type) const { +const MIRType *TypeTable::GetPointedTypeIfApplicable(MIRType &type) const { if (type.GetKind() != kTypePointer) { return &type; } auto &ptrType = static_cast(type); return GetTypeFromTyIdx(ptrType.GetPointedTyIdx()); } +MIRType *TypeTable::GetPointedTypeIfApplicable(MIRType &type) { + return const_cast(const_cast(this)->GetPointedTypeIfApplicable(type)); +} MIRArrayType *TypeTable::GetOrCreateArrayType(const MIRType &elem, uint8 dim, const uint32 *sizeArray) { std::vector sizeVector; - for (uint8 i = 0; i < dim; ++i) { + for (size_t i = 0; i < dim; ++i) { sizeVector.push_back(sizeArray != nullptr ? sizeArray[i] : 0); } MIRArrayType arrayType(elem.GetTypeIndex(), sizeVector); @@ -119,9 +122,9 @@ MIRType *TypeTable::GetOrCreateJarrayType(const MIRType &elem) { return typeTable.at(tyIdx.GetIdx()); } -MIRType *TypeTable::GetOrCreateFunctionType(MIRModule &module, TyIdx retTyidx, const std::vector &vecType, +MIRType *TypeTable::GetOrCreateFunctionType(MIRModule &module, TyIdx retTyIdx, const std::vector &vecType, const std::vector &vecAttrs, bool isVarg, bool isSimpCreate) { - auto *funcType = module.GetMemPool()->New(retTyidx, vecType, vecAttrs); + auto *funcType = module.GetMemPool()->New(retTyIdx, vecType, vecAttrs); funcType->SetVarArgs(isVarg); if (isSimpCreate) { return funcType; @@ -132,43 +135,43 @@ MIRType *TypeTable::GetOrCreateFunctionType(MIRModule &module, TyIdx retTyidx, c } MIRType *TypeTable::GetOrCreateStructOrUnion(const std::string &name, const FieldVector &fields, - const FieldVector &prntFields, MIRModule &module, bool forStruct) { - GStrIdx stridx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(name); - MIRStructType type(forStruct ? kTypeStruct : kTypeUnion, stridx); + const FieldVector &printFields, MIRModule &module, bool forStruct) { + GStrIdx strIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(name); + MIRStructType type(forStruct ? kTypeStruct : kTypeUnion, strIdx); type.GetFields() = fields; - type.GetParentFields() = prntFields; - TyIdx tyidx = GetOrCreateMIRType(&type); + type.GetParentFields() = printFields; + TyIdx tyIdx = GetOrCreateMIRType(&type); // Global? - module.GetTypeNameTab()->SetGStrIdxToTyIdx(stridx, tyidx); - module.PushbackTypeDefOrder(stridx); - ASSERT(tyidx.GetIdx() < typeTable.size(), "index out of range in TypeTable::GetOrCreateStructOrUnion"); - return typeTable.at(tyidx.GetIdx()); + module.GetTypeNameTab()->SetGStrIdxToTyIdx(strIdx, tyIdx); + module.PushbackTypeDefOrder(strIdx); + ASSERT(tyIdx.GetIdx() < typeTable.size(), "index out of range in TypeTable::GetOrCreateStructOrUnion"); + return typeTable.at(tyIdx.GetIdx()); } void TypeTable::PushIntoFieldVector(FieldVector &fields, const std::string &name, MIRType &type) { - GStrIdx stridx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(name); - fields.push_back(FieldPair(stridx, TyIdxFieldAttrPair(type.GetTypeIndex(), FieldAttrs()))); + GStrIdx strIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(name); + fields.push_back(FieldPair(strIdx, TyIdxFieldAttrPair(type.GetTypeIndex(), FieldAttrs()))); } MIRType *TypeTable::GetOrCreateClassOrInterface(const std::string &name, MIRModule &module, bool forClass) { - GStrIdx stridx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(name); - TyIdx tyidx = module.GetTypeNameTab()->GetTyIdxFromGStrIdx(stridx); - if (!tyidx.GetIdx()) { + GStrIdx strIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(name); + TyIdx tyIdx = module.GetTypeNameTab()->GetTyIdxFromGStrIdx(strIdx); + if (!tyIdx.GetIdx()) { if (forClass) { - MIRClassType type(kTypeClassIncomplete, stridx); // for class type - tyidx = GetOrCreateMIRType(&type); + MIRClassType type(kTypeClassIncomplete, strIdx); // for class type + tyIdx = GetOrCreateMIRType(&type); } else { - MIRInterfaceType type(kTypeInterfaceIncomplete, stridx); // for interface type - tyidx = GetOrCreateMIRType(&type); + MIRInterfaceType type(kTypeInterfaceIncomplete, strIdx); // for interface type + tyIdx = GetOrCreateMIRType(&type); } - module.PushbackTypeDefOrder(stridx); - module.GetTypeNameTab()->SetGStrIdxToTyIdx(stridx, tyidx); - if (typeTable[tyidx.GetIdx()]->GetNameStrIdx() == 0) { - typeTable[tyidx.GetIdx()]->SetNameStrIdx(stridx); + module.PushbackTypeDefOrder(strIdx); + module.GetTypeNameTab()->SetGStrIdxToTyIdx(strIdx, tyIdx); + if (typeTable[tyIdx.GetIdx()]->GetNameStrIdx() == 0) { + typeTable[tyIdx.GetIdx()]->SetNameStrIdx(strIdx); } } - ASSERT(tyidx.GetIdx() < typeTable.size(), "index out of range in TypeTable::GetOrCreateClassOrInterface"); - return typeTable.at(tyidx.GetIdx()); + ASSERT(tyIdx.GetIdx() < typeTable.size(), "index out of range in TypeTable::GetOrCreateClassOrInterface"); + return typeTable.at(tyIdx.GetIdx()); } void TypeTable::AddFieldToStructType(MIRStructType &structType, const std::string &fieldName, MIRType &fieldType) { @@ -191,46 +194,45 @@ void FPConstTable::PostInit() { minusZeroDoubleConst = new MIRDoubleConst(-0.0, typeDouble); } -MIRFloatConst *FPConstTable::GetOrCreateFloatConst(float fval) { - if (std::isnan(fval)) { +MIRFloatConst *FPConstTable::GetOrCreateFloatConst(float floatVal) { + if (std::isnan(floatVal)) { return nanFloatConst; } - if (std::isinf(fval)) { - return (fval < 0) ? minusInfFloatConst : infFloatConst; + if (std::isinf(floatVal)) { + return (floatVal < 0) ? minusInfFloatConst : infFloatConst; } - if (fval == 0.0 && std::signbit(fval)) { + if (floatVal == 0.0 && std::signbit(floatVal)) { return minusZeroFloatConst; } - const auto it = floatConstTable.find(fval); + const auto it = floatConstTable.find(floatVal); if (it == floatConstTable.cend()) { // create a new one - auto *fconst = new MIRFloatConst(fval, *GlobalTables::GetTypeTable().GetTypeFromTyIdx(TyIdx{ PTY_f32 })); - floatConstTable[fval] = fconst; - return fconst; - } else { - return it->second; + auto *floatConst = new MIRFloatConst(floatVal, *GlobalTables::GetTypeTable().GetTypeFromTyIdx(TyIdx{ PTY_f32 })); + floatConstTable[floatVal] = floatConst; + return floatConst; } + return it->second; } -MIRDoubleConst *FPConstTable::GetOrCreateDoubleConst(double fval) { - if (std::isnan(fval)) { +MIRDoubleConst *FPConstTable::GetOrCreateDoubleConst(double floatVal) { + if (std::isnan(floatVal)) { return nanDoubleConst; } - if (std::isinf(fval)) { - return (fval < 0) ? minusInfDoubleConst : infDoubleConst; + if (std::isinf(floatVal)) { + return (floatVal < 0) ? minusInfDoubleConst : infDoubleConst; } - if (fval == 0.0 && std::signbit(fval)) { + if (floatVal == 0.0 && std::signbit(floatVal)) { return minusZeroDoubleConst; } - const auto it = doubleConstTable.find(fval); + const auto it = doubleConstTable.find(floatVal); if (it == doubleConstTable.cend()) { // create a new one - MIRDoubleConst *dconst = new MIRDoubleConst(fval, *GlobalTables::GetTypeTable().GetTypeFromTyIdx((TyIdx)PTY_f64)); - doubleConstTable[fval] = dconst; - return dconst; - } else { - return it->second; + auto *doubleConst = new MIRDoubleConst(floatVal, + *GlobalTables::GetTypeTable().GetTypeFromTyIdx((TyIdx)PTY_f64)); + doubleConstTable[floatVal] = doubleConst; + return doubleConst; } + return it->second; } FPConstTable::~FPConstTable() { diff --git a/src/maple_ir/src/lexer.cpp b/src/maple_ir/src/lexer.cpp index a370ece79d8c9ee05adae91b20ac753b0cffb897..bcc537939ea925fb53d49584a4f6fa7b56be3e29 100644 --- a/src/maple_ir/src/lexer.cpp +++ b/src/maple_ir/src/lexer.cpp @@ -33,12 +33,11 @@ static uint8 Char2num(char c) { return ret; } -/* Read (next) line from the MIR (text) file, and return the read - number of chars. - if the line is empty (nothing but a newline), returns 0. - if EOF, return -1. - The trailing new-line character has been removed. - */ +// Read (next) line from the MIR (text) file, and return the read +// number of chars. +// if the line is empty (nothing but a newline), returns 0. +// if EOF, return -1. +// The trailing new-line character has been removed. int MIRLexer::ReadALine() { if (airFile == nullptr) { line = ""; @@ -60,17 +59,7 @@ int MIRLexer::ReadALine() { MIRLexer::MIRLexer(MIRModule &mod) : module(mod), - theIntVal(0), - theFloatVal(0.0f), - theDoubleVal(0), seenComments(mod.GetMPAllocator().Adapter()), - airFile(nullptr), - lineBufSize(0), - currentLineSize(0), - curIdx(0), - lineNum(0), - kind(kTkInvalid), - name(""), keywordMap(mod.GetMPAllocator().Adapter()) { // initialize keywordMap keywordMap.clear(); @@ -102,7 +91,7 @@ void MIRLexer::PrepareForFile(const std::string &filename) { void MIRLexer::PrepareForString(const std::string &src) { line = src; RemoveReturnInline(line); - currentLineSize = line.length(); + currentLineSize = line.size(); curIdx = 0; NextToken(); } @@ -159,8 +148,8 @@ TokenKind MIRLexer::GetConstVal(){ } TokenKind MIRLexer::GetSpecialFloatConst() { - const uint32 lenSpecFloat = 4; - const uint32 lenSpecDouble = 3; + constexpr uint32 lenSpecFloat = 4; + constexpr uint32 lenSpecDouble = 3; if (line.compare(curIdx, lenSpecFloat, "inff") == 0 && !isalnum(GetCharAtWithUpperCheck(curIdx + lenSpecFloat))) { curIdx += lenSpecFloat; theFloatVal = -INFINITY; @@ -237,7 +226,7 @@ TokenKind MIRLexer::GetIntConst(uint32 valStart, bool negative) { if (c == 'l' || c == 'L') { c = GetNextCurrentCharWithUpperCheck(); if (c == 'l' || c == 'L' || c == 'u' || c == 'U') { - curIdx++; + ++curIdx; } } name = line.substr(valStart, curIdx - valStart); @@ -278,7 +267,7 @@ TokenKind MIRLexer::GetFloatConst(uint32 valStart, uint32 startIdx, bool negativ } if (c == 'l' || c == 'L') { MIR_ERROR("warning: not yet support long double\n"); - curIdx++; + ++curIdx; } std::string floatStr = line.substr(startIdx, curIdx - startIdx); @@ -341,16 +330,17 @@ TokenKind MIRLexer::GetTokenWithPrefixPercent() { } name = line.substr(valStart, curIdx - valStart); return kTkPreg; - } else if (isalpha(c) || c == '_' || c == '$') { + } + if (isalpha(c) || c == '_' || c == '$') { GenName(); return kTkLname; - } else if (c == '%' && isalpha(GetCharAtWithUpperCheck(curIdx + 1))) { - curIdx++; + } + if (c == '%' && isalpha(GetCharAtWithUpperCheck(curIdx + 1))) { + ++curIdx; GenName(); return kTkSpecialreg; - } else { - return kTkInvalid; } + return kTkInvalid; } TokenKind MIRLexer::GetTokenWithPrefixAmpersand() { @@ -359,12 +349,11 @@ TokenKind MIRLexer::GetTokenWithPrefixAmpersand() { if (isalpha(c) || c == '_') { GenName(); return kTkFname; - } else { - // for error reporting. - const uint32 printLength = 2; - name = line.substr(curIdx - 1, printLength); - return kTkInvalid; } + // for error reporting. + constexpr uint32 printLength = 2; + name = line.substr(curIdx - 1, printLength); + return kTkInvalid; } TokenKind MIRLexer::GetTokenWithPrefixAtOrCircumflex(char prefix) { @@ -374,12 +363,10 @@ TokenKind MIRLexer::GetTokenWithPrefixAtOrCircumflex(char prefix) { GenName(); if (prefix == '@') { return TK_label; - } else { - return kTkPrntfield; } - } else { - return kTkInvalid; + return kTkPrntfield; } + return kTkInvalid; } TokenKind MIRLexer::GetTokenWithPrefixExclamation() { @@ -388,12 +375,11 @@ TokenKind MIRLexer::GetTokenWithPrefixExclamation() { if (isalpha(c)) { GenName(); return kTkTypeparam; - } else { - // for error reporting. - const uint32 printLength = 2; - name = line.substr(curIdx - 1, printLength); - return kTkInvalid; } + // for error reporting. + const uint32 printLength = 2; + name = line.substr(curIdx - 1, printLength); + return kTkInvalid; } TokenKind MIRLexer::GetTokenWithPrefixQuotation() { @@ -401,9 +387,8 @@ TokenKind MIRLexer::GetTokenWithPrefixQuotation() { theIntVal = GetCharAtWithUpperCheck(curIdx); curIdx += 2; return kTkIntconst; - } else { - return kTkInvalid; } + return kTkInvalid; } TokenKind MIRLexer::GetTokenWithPrefixDoubleQuotation() { @@ -481,7 +466,7 @@ TokenKind MIRLexer::GetTokenWithPrefixDoubleQuotation() { } default: line[curIdx - shift] = '\\'; - shift--; + --shift; line[curIdx - shift] = c; break; } @@ -499,12 +484,12 @@ TokenKind MIRLexer::GetTokenWithPrefixDoubleQuotation() { } else { name = line.substr(startIdx, curIdx - startIdx - shift); } - curIdx++; + ++curIdx; return kTkString; } TokenKind MIRLexer::GetTokenSpecial() { - curIdx--; + --curIdx; char c = GetCharAtWithLowerCheck(curIdx); if (isalpha(c) || c < 0 || c == '_') { GenName(); @@ -544,7 +529,7 @@ TokenKind MIRLexer::LexToken() { if (ReadALine() < 0) { return kTkEof; } - lineNum++; // a new line readed. + ++lineNum; // a new line readed. // skip spaces c = GetCurrentCharWithUpperCheck(); while (c == ' ' || c == '\t') { @@ -552,7 +537,7 @@ TokenKind MIRLexer::LexToken() { } } char curChar = c; - curIdx++; + ++curIdx; switch (curChar) { case '\n': return kTkNewline; @@ -598,7 +583,7 @@ TokenKind MIRLexer::LexToken() { case '8': case '9': case '-': - curIdx--; + --curIdx; return GetConstVal(); case '$': return GetTokenWithPrefixDollar(); diff --git a/src/maple_ir/src/mir_builder.cpp b/src/maple_ir/src/mir_builder.cpp index faa8b7610e4eb48a21820011b9d5bf7057264870..8a836a3cd91b814b40a346bff3831af10ea4df11 100644 --- a/src/maple_ir/src/mir_builder.cpp +++ b/src/maple_ir/src/mir_builder.cpp @@ -14,13 +14,12 @@ */ #include "mir_builder.h" #include -#include #include "mir_symbol_builder.h" namespace maple { // This is for compiler-generated metadata 1-level struct void MIRBuilder::AddIntFieldConst(const MIRStructType &sType, MIRAggConst &newConst, uint32 fieldID, int64 constValue) { - MIRConst *fieldConst = mirModule->GetMemPool()->New(constValue, *sType.GetElemType(fieldID - 1), fieldID); + auto *fieldConst = mirModule->GetMemPool()->New(constValue, *sType.GetElemType(fieldID - 1), fieldID); newConst.PushBack(fieldConst); } @@ -28,7 +27,7 @@ void MIRBuilder::AddIntFieldConst(const MIRStructType &sType, MIRAggConst &newCo void MIRBuilder::AddAddrofFieldConst(const MIRStructType &structType, MIRAggConst &newConst, uint32 fieldID, const MIRSymbol &fieldSymbol) { AddrofNode *fieldExpr = CreateExprAddrof(0, fieldSymbol, mirModule->GetMemPool()); - MIRConst *fieldConst = mirModule->GetMemPool()->New(fieldExpr->GetStIdx(), fieldExpr->GetFieldID(), + auto *fieldConst = mirModule->GetMemPool()->New(fieldExpr->GetStIdx(), fieldExpr->GetFieldID(), *structType.GetElemType(fieldID - 1)); fieldConst->SetFieldID(fieldID); newConst.PushBack(fieldConst); @@ -65,9 +64,9 @@ void MIRBuilder::TraverseToNamedFieldWithType(MIRStructType &structType, GStrIdx } // process parent if (structType.GetKind() == kTypeClass || structType.GetKind() == kTypeClassIncomplete) { - MIRClassType &classType = static_cast(structType); + auto &classType = static_cast(structType); MIRType *type = GlobalTables::GetTypeTable().GetTypeFromTyIdx(classType.GetParentTyIdx()); - MIRStructType *parentType = static_cast(type); + auto *parentType = static_cast(type); if (parentType != nullptr) { ++fieldID; TraverseToNamedFieldWithType(*parentType, nameIdx, typeIdx, fieldID, idx); @@ -90,7 +89,7 @@ void MIRBuilder::TraverseToNamedFieldWithType(MIRStructType &structType, GStrIdx } if (fieldType->IsStructType()) { - MIRStructType *subStructType = static_cast(fieldType); + auto *subStructType = static_cast(fieldType); TraverseToNamedFieldWithType(*subStructType, nameIdx, typeIdx, fieldID, idx); } } @@ -112,26 +111,26 @@ bool MIRBuilder::TraverseToNamedFieldWithTypeAndMatchStyle(MIRStructType &struct } if (matchStyle & kParentFirst) { // process parent - if (structType.GetKind() == kTypeClass || structType.GetKind() == kTypeClassIncomplete) { - MIRClassType &classType = static_cast(structType); - MIRType *type = GlobalTables::GetTypeTable().GetTypeFromTyIdx(classType.GetParentTyIdx()); - MIRStructType *parentType = static_cast(type); - if (parentType != nullptr) { - ++fieldID; - if (matchStyle == (kFoundInChild | kParentFirst | kUpdateFieldID)) { - matchStyle = kParentFirst; - uint32 idxBackup = nameIdx.GetIdx(); - nameIdx.SetIdx(0); - // do not match but traverse to update fieldID, traverse parent first - TraverseToNamedFieldWithTypeAndMatchStyle(*parentType, nameIdx, typeIdx, fieldID, matchStyle); - nameIdx.SetIdx(idxBackup); - } else if (TraverseToNamedFieldWithTypeAndMatchStyle(*parentType, nameIdx, typeIdx, fieldID, matchStyle)) { - return true; - } - } - } else { + if ((structType.GetKind() != kTypeClass) && (structType.GetKind() != kTypeClassIncomplete)) { return false; } + + auto &classType = static_cast(structType); + MIRType *type = GlobalTables::GetTypeTable().GetTypeFromTyIdx(classType.GetParentTyIdx()); + auto *parentType = static_cast(type); + if (parentType != nullptr) { + ++fieldID; + if (matchStyle == (kFoundInChild | kParentFirst | kUpdateFieldID)) { + matchStyle = kParentFirst; + uint32 idxBackup = nameIdx.GetIdx(); + nameIdx.SetIdx(0); + // do not match but traverse to update fieldID, traverse parent first + TraverseToNamedFieldWithTypeAndMatchStyle(*parentType, nameIdx, typeIdx, fieldID, matchStyle); + nameIdx.SetIdx(idxBackup); + } else if (TraverseToNamedFieldWithTypeAndMatchStyle(*parentType, nameIdx, typeIdx, fieldID, matchStyle)) { + return true; + } + } } for (uint32 fieldIdx = 0; fieldIdx < structType.GetFieldsSize(); ++fieldIdx) { ++fieldID; @@ -146,7 +145,7 @@ bool MIRBuilder::TraverseToNamedFieldWithTypeAndMatchStyle(MIRStructType &struct } unsigned int style = matchStyle & kMatchAnyField; if (fieldType->IsStructType()) { - MIRStructType *subStructType = static_cast(fieldType); + auto *subStructType = static_cast(fieldType); if (TraverseToNamedFieldWithTypeAndMatchStyle(*subStructType, nameIdx, typeIdx, fieldID, style)) { return true; } @@ -157,7 +156,7 @@ bool MIRBuilder::TraverseToNamedFieldWithTypeAndMatchStyle(MIRStructType &struct FieldID MIRBuilder::GetStructFieldIDFromNameAndType(MIRType &type, const std::string &name, TyIdx idx, unsigned int matchStyle) { - MIRStructType &structType = static_cast(type); + auto &structType = static_cast(type); uint32 fieldID = 0; GStrIdx strIdx = GetStringIndex(name); if (TraverseToNamedFieldWithTypeAndMatchStyle(structType, strIdx, idx, fieldID, matchStyle)) { @@ -191,9 +190,8 @@ FieldID MIRBuilder::GetStructFieldIDFromFieldNameParentFirst(MIRType *type, cons return GetStructFieldIDFromNameAndType(*type, name, TyIdx(0), kParentFirst); } -void MIRBuilder::SetStructFieldIDFromFieldName(MIRType &structtype, const std::string &name, GStrIdx newStrIdx, +void MIRBuilder::SetStructFieldIDFromFieldName(MIRStructType &structType, const std::string &name, GStrIdx newStrIdx, const MIRType &newFieldType) { - MIRStructType &structType = static_cast(structtype); uint32 fieldID = 0; GStrIdx strIdx = GetStringIndex(name); while (true) { @@ -224,10 +222,10 @@ MIRFunction *MIRBuilder::GetOrCreateFunction(const std::string &str, TyIdx retTy strIdx = GetOrCreateStringIndex(str); funcSt = CreateSymbol(TyIdx(0), strIdx, kStFunc, kScText, nullptr, kScopeGlobal); } - MIRFunction *fn = mirModule->GetMemPool()->New(mirModule, funcSt->GetStIdx()); + auto *fn = mirModule->GetMemPool()->New(mirModule, funcSt->GetStIdx()); fn->Init(); fn->SetPuidx(GlobalTables::GetFunctionTable().GetFuncTable().size()); - MIRFuncType *funcType = mirModule->GetMemPool()->New(); + auto *funcType = mirModule->GetMemPool()->New(); fn->SetMIRFuncType(funcType); fn->SetReturnTyIdx(retTyIdx); GlobalTables::GetFunctionTable().GetFuncTable().push_back(fn); @@ -235,7 +233,7 @@ MIRFunction *MIRBuilder::GetOrCreateFunction(const std::string &str, TyIdx retTy return fn; } -MIRFunction *MIRBuilder::GetFunctionFromSymbol(const MIRSymbol &funcSymbol) const { +MIRFunction *MIRBuilder::GetFunctionFromSymbol(const MIRSymbol &funcSymbol) { ASSERT(funcSymbol.GetSKind() == kStFunc, "Symbol %s is not a function symbol", funcSymbol.GetName().c_str()); return funcSymbol.GetFunction(); } @@ -254,7 +252,6 @@ MIRFunction *MIRBuilder::GetFunctionFromStidx(StIdx stIdx) { MIRFunction *MIRBuilder::CreateFunction(const std::string &name, const MIRType &returnType, const ArgVector &arguments, bool isVarg, bool createBody) const { MIRSymbol *funcSymbol = GlobalTables::GetGsymTable().CreateSymbol(kScopeGlobal); - CHECK_FATAL(funcSymbol != nullptr, "Failed to create MIRSymbol"); GStrIdx strIdx = GetOrCreateStringIndex(name.c_str()); funcSymbol->SetNameStrIdx(strIdx); if (!GlobalTables::GetGsymTable().AddToStringSymbolMap(*funcSymbol)) { @@ -262,7 +259,7 @@ MIRFunction *MIRBuilder::CreateFunction(const std::string &name, const MIRType & } funcSymbol->SetStorageClass(kScText); funcSymbol->SetSKind(kStFunc); - MIRFunction *fn = mirModule->GetMemPool()->New(mirModule, funcSymbol->GetStIdx()); + auto *fn = mirModule->GetMemPool()->New(mirModule, funcSymbol->GetStIdx()); fn->Init(); fn->SetPuidx(GlobalTables::GetFunctionTable().GetFuncTable().size()); GlobalTables::GetFunctionTable().GetFuncTable().push_back(fn); @@ -270,7 +267,7 @@ MIRFunction *MIRBuilder::CreateFunction(const std::string &name, const MIRType & std::vector funcVecAttrs; for (size_t i = 0; i < arguments.size(); ++i) { MIRSymbol *argSymbol = fn->GetSymTab()->CreateSymbol(kScopeLocal); - argSymbol->SetNameStrIdx(GetOrCreateStringIndex(arguments[i].first.c_str())); + argSymbol->SetNameStrIdx(GetOrCreateStringIndex(arguments[i].first)); MIRType *ty = arguments[i].second; argSymbol->SetTyIdx(ty->GetTypeIndex()); argSymbol->SetStorageClass(kScFormal); @@ -282,7 +279,7 @@ MIRFunction *MIRBuilder::CreateFunction(const std::string &name, const MIRType & } funcSymbol->SetTyIdx(GlobalTables::GetTypeTable().GetOrCreateFunctionType( *mirModule, returnType.GetTypeIndex(), funcVecType, funcVecAttrs, isVarg)->GetTypeIndex()); - MIRFuncType *funcType = static_cast(funcSymbol->GetType()); + auto *funcType = static_cast(funcSymbol->GetType()); fn->SetMIRFuncType(funcType); funcSymbol->SetFunction(fn); if (createBody) { @@ -291,26 +288,26 @@ MIRFunction *MIRBuilder::CreateFunction(const std::string &name, const MIRType & return fn; } -MIRFunction *MIRBuilder::CreateFunction(const StIdx stIdx, bool addToTable) const { - MIRFunction *fn = mirModule->GetMemPool()->New(mirModule, stIdx); +MIRFunction *MIRBuilder::CreateFunction(StIdx stIdx, bool addToTable) const { + auto *fn = mirModule->GetMemPool()->New(mirModule, stIdx); fn->Init(); fn->SetPuidx(GlobalTables::GetFunctionTable().GetFuncTable().size()); if (addToTable) { GlobalTables::GetFunctionTable().GetFuncTable().push_back(fn); } - MIRFuncType *funcType = mirModule->GetMemPool()->New(); + auto *funcType = mirModule->GetMemPool()->New(); fn->SetMIRFuncType(funcType); return fn; } -MIRSymbol *MIRBuilder::GetOrCreateGlobalDecl(const std::string &str, const TyIdx &tyIdx, bool &created) const { +MIRSymbol *MIRBuilder::GetOrCreateGlobalDecl(const std::string &str, TyIdx tyIdx, bool &created) const { GStrIdx strIdx = GetStringIndex(str); if (strIdx != 0) { - StIdx stidx = GlobalTables::GetGsymTable().GetStIdxFromStrIdx(strIdx); - if (stidx.Idx() != 0) { + StIdx stIdx = GlobalTables::GetGsymTable().GetStIdxFromStrIdx(strIdx); + if (stIdx.Idx() != 0) { created = false; - return GlobalTables::GetGsymTable().GetSymbolFromStidx(stidx.Idx()); + return GlobalTables::GetGsymTable().GetSymbolFromStidx(stIdx.Idx()); } } created = true; @@ -322,14 +319,14 @@ MIRSymbol *MIRBuilder::GetOrCreateGlobalDecl(const std::string &str, const TyIdx return st; } -MIRSymbol *MIRBuilder::GetOrCreateLocalDecl(const std::string &str, const TyIdx &tyIdx, MIRSymbolTable &symbolTable, +MIRSymbol *MIRBuilder::GetOrCreateLocalDecl(const std::string &str, TyIdx tyIdx, MIRSymbolTable &symbolTable, bool &created) const { GStrIdx strIdx = GetStringIndex(str); if (strIdx != 0) { - StIdx stidx = symbolTable.GetStIdxFromStrIdx(strIdx); - if (stidx.Idx() != 0) { + StIdx stIdx = symbolTable.GetStIdxFromStrIdx(strIdx); + if (stIdx.Idx() != 0) { created = false; - return symbolTable.GetSymbolFromStIdx(stidx.Idx()); + return symbolTable.GetSymbolFromStIdx(stIdx.Idx()); } } created = true; @@ -376,16 +373,16 @@ MIRSymbol *MIRBuilder::GetLocalDecl(const std::string &str) { // search the scope hierarchy MIRSymbol *MIRBuilder::GetDecl(const std::string &str) { - GStrIdx stridx = GetStringIndex(str); + GStrIdx strIdx = GetStringIndex(str); MIRSymbol *sym = nullptr; - if (stridx != 0) { + if (strIdx != 0) { // try to find the decl in local scope first MIRFunction *currentFunctionInner = GetCurrentFunction(); if (currentFunctionInner != nullptr) { - sym = currentFunctionInner->GetSymTab()->GetSymbolFromStrIdx(stridx); + sym = currentFunctionInner->GetSymTab()->GetSymbolFromStrIdx(strIdx); } if (sym == nullptr) { - sym = GlobalTables::GetGsymTable().GetSymbolFromStrIdx(stridx); + sym = GlobalTables::GetGsymTable().GetSymbolFromStrIdx(strIdx); } } return sym; @@ -470,88 +467,88 @@ MIRSymbol *MIRBuilder::CreatePregFormalSymbol(TyIdx tyIdx, PregIdx pRegIdx, MIRF ConstvalNode *MIRBuilder::CreateIntConst(int64 val, PrimType pty) { MIRFunction *currentFunctionInner = GetCurrentFunctionNotNull(); - MIRIntConst *mirConst = + auto *mirConst = currentFunctionInner->GetDataMemPool()->New(val, *GlobalTables::GetTypeTable().GetPrimType(pty)); return GetCurrentFuncCodeMp()->New(pty, mirConst); } ConstvalNode *MIRBuilder::CreateFloatConst(float val) { MIRFunction *currentFunctionInner = GetCurrentFunctionNotNull(); - MIRFloatConst *mirConst = currentFunctionInner->GetDataMemPool()->New( + auto *mirConst = currentFunctionInner->GetDataMemPool()->New( val, *GlobalTables::GetTypeTable().GetPrimType(PTY_f32)); return GetCurrentFuncCodeMp()->New(PTY_f32, mirConst); } ConstvalNode *MIRBuilder::CreateDoubleConst(double val) { MIRFunction *currentFunctionInner = GetCurrentFunctionNotNull(); - MIRDoubleConst *mirConst = currentFunctionInner->GetDataMemPool()->New( + auto *mirConst = currentFunctionInner->GetDataMemPool()->New( val, *GlobalTables::GetTypeTable().GetPrimType(PTY_f64)); return GetCurrentFuncCodeMp()->New(PTY_f64, mirConst); } ConstvalNode *MIRBuilder::CreateFloat128Const(const uint64 *val) { MIRFunction *currentFunctionInner = GetCurrentFunctionNotNull(); - MIRFloat128Const *mirConst = currentFunctionInner->GetDataMemPool()->New( + auto *mirConst = currentFunctionInner->GetDataMemPool()->New( *val, *GlobalTables::GetTypeTable().GetPrimType(PTY_f128)); return GetCurrentFuncCodeMp()->New(PTY_f128, mirConst); } -ConstvalNode *MIRBuilder::GetConstInt(MemPool &memPool, int i) { - MIRIntConst *mirConst = memPool.New(i, *GlobalTables::GetTypeTable().GetInt64()); +ConstvalNode *MIRBuilder::GetConstInt(MemPool &memPool, int val) { + auto *mirConst = memPool.New(val, *GlobalTables::GetTypeTable().GetInt64()); return memPool.New(PTY_i32, mirConst); } -ConstvalNode *MIRBuilder::CreateAddrofConst(BaseNode &e) { - ASSERT(e.GetOpCode() == OP_addrof, "illegal op for addrof const"); +ConstvalNode *MIRBuilder::CreateAddrofConst(BaseNode &node) { + ASSERT(node.GetOpCode() == OP_addrof, "illegal op for addrof const"); MIRFunction *currentFunctionInner = GetCurrentFunctionNotNull(); - // determine the type of 'e' and create a pointer type, accordingly - AddrofNode &aNode = static_cast(e); + // determine the type of 'node' and create a pointer type, accordingly + auto &aNode = static_cast(node); const MIRSymbol *var = currentFunctionInner->GetLocalOrGlobalSymbol(aNode.GetStIdx()); TyIdx ptyIdx = var->GetTyIdx(); MIRPtrType ptrType(ptyIdx); ptyIdx = GlobalTables::GetTypeTable().GetOrCreateMIRType(&ptrType); - MIRType &exprty = *GlobalTables::GetTypeTable().GetTypeFromTyIdx(ptyIdx); - MIRAddrofConst *temp = mirModule->GetMemPool()->New(aNode.GetStIdx(), aNode.GetFieldID(), exprty); + MIRType &exprType = *GlobalTables::GetTypeTable().GetTypeFromTyIdx(ptyIdx); + auto *temp = mirModule->GetMemPool()->New(aNode.GetStIdx(), aNode.GetFieldID(), exprType); return GetCurrentFuncCodeMp()->New(PTY_ptr, temp); } -ConstvalNode *MIRBuilder::CreateAddroffuncConst(const BaseNode &e) { - ASSERT(e.GetOpCode() == OP_addroffunc, "illegal op for addroffunc const"); +ConstvalNode *MIRBuilder::CreateAddroffuncConst(const BaseNode &node) { + ASSERT(node.GetOpCode() == OP_addroffunc, "illegal op for addroffunc const"); - const AddroffuncNode &aNode = static_cast(e); + const auto &aNode = static_cast(node); MIRFunction *f = GlobalTables::GetFunctionTable().GetFunctionFromPuidx(aNode.GetPUIdx()); TyIdx ptyIdx = f->GetFuncSymbol()->GetTyIdx(); MIRPtrType ptrType(ptyIdx); ptyIdx = GlobalTables::GetTypeTable().GetOrCreateMIRType(&ptrType); - MIRType *exprty = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ptyIdx); - MIRAddroffuncConst *mirConst = mirModule->GetMemPool()->New(aNode.GetPUIdx(), *exprty); + MIRType *exprType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ptyIdx); + auto *mirConst = mirModule->GetMemPool()->New(aNode.GetPUIdx(), *exprType); return GetCurrentFuncCodeMp()->New(PTY_ptr, mirConst); } -ConstvalNode *MIRBuilder::CreateStrConst(const BaseNode &e) { - ASSERT(e.GetOpCode() == OP_conststr, "illegal op for conststr const"); - UStrIdx strIdx = static_cast(e).GetStrIdx(); +ConstvalNode *MIRBuilder::CreateStrConst(const BaseNode &node) { + ASSERT(node.GetOpCode() == OP_conststr, "illegal op for conststr const"); + UStrIdx strIdx = static_cast(node).GetStrIdx(); CHECK_FATAL(PTY_u8 < GlobalTables::GetTypeTable().GetTypeTable().size(), "index is out of range in MIRBuilder::CreateStrConst"); - TyIdx ptyidx = GlobalTables::GetTypeTable().GetTypeFromTyIdx(TyIdx(PTY_u8))->GetTypeIndex(); - MIRPtrType ptrType(ptyidx); - ptyidx = GlobalTables::GetTypeTable().GetOrCreateMIRType(&ptrType); - MIRType *exprType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ptyidx); - MIRStrConst *mirConst = mirModule->GetMemPool()->New(strIdx, *exprType); + TyIdx tyIdx = GlobalTables::GetTypeTable().GetTypeFromTyIdx(TyIdx(PTY_u8))->GetTypeIndex(); + MIRPtrType ptrType(tyIdx); + tyIdx = GlobalTables::GetTypeTable().GetOrCreateMIRType(&ptrType); + MIRType *exprType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(tyIdx); + auto *mirConst = mirModule->GetMemPool()->New(strIdx, *exprType); return GetCurrentFuncCodeMp()->New(PTY_ptr, mirConst); } -ConstvalNode *MIRBuilder::CreateStr16Const(const BaseNode &e) { - ASSERT(e.GetOpCode() == OP_conststr16, "illegal op for conststr16 const"); - U16StrIdx strIdx = static_cast(e).GetStrIdx(); +ConstvalNode *MIRBuilder::CreateStr16Const(const BaseNode &node) { + ASSERT(node.GetOpCode() == OP_conststr16, "illegal op for conststr16 const"); + U16StrIdx strIdx = static_cast(node).GetStrIdx(); CHECK_FATAL(PTY_u16 < GlobalTables::GetTypeTable().GetTypeTable().size(), "index out of range in MIRBuilder::CreateStr16Const"); TyIdx ptyIdx = GlobalTables::GetTypeTable().GetTypeFromTyIdx(TyIdx(PTY_u16))->GetTypeIndex(); MIRPtrType ptrType(ptyIdx); ptyIdx = GlobalTables::GetTypeTable().GetOrCreateMIRType(&ptrType); - MIRType *exprty = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ptyIdx); - MIRStr16Const *mirConst = mirModule->GetMemPool()->New(strIdx, *exprty); + MIRType *exprType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ptyIdx); + auto *mirConst = mirModule->GetMemPool()->New(strIdx, *exprType); return GetCurrentFuncCodeMp()->New(PTY_ptr, mirConst); } @@ -582,11 +579,11 @@ AddroffuncNode *MIRBuilder::CreateExprAddroffunc(PUIdx puIdx, MemPool *memPool) } AddrofNode *MIRBuilder::CreateExprDread(const MIRType &type, FieldID fieldID, const MIRSymbol &symbol) { - AddrofNode *drn = GetCurrentFuncCodeMp()->New(OP_dread, kPtyInvalid, symbol.GetStIdx(), fieldID); + auto *node = GetCurrentFuncCodeMp()->New(OP_dread, kPtyInvalid, symbol.GetStIdx(), fieldID); CHECK(type.GetTypeIndex().GetIdx() < GlobalTables::GetTypeTable().GetTypeTable().size(), "index out of range in MIRBuilder::CreateExprDread"); - drn->SetPrimType(GlobalTables::GetTypeTable().GetPrimTypeFromTyIdx(type.GetTypeIndex())); - return drn; + node->SetPrimType(GlobalTables::GetTypeTable().GetPrimTypeFromTyIdx(type.GetTypeIndex())); + return node; } RegreadNode *MIRBuilder::CreateExprRegread(PrimType pty, PregIdx regIdx) { @@ -610,7 +607,7 @@ AddrofNode *MIRBuilder::CreateExprDread(MIRSymbol &symbol) { } AddrofNode *MIRBuilder::CreateExprDread(PregIdx pregID, PrimType pty) { - AddrofNode *dread = GetCurrentFuncCodeMp()->New(OP_dread, pty); + auto *dread = GetCurrentFuncCodeMp()->New(OP_dread, pty); dread->SetStFullIdx(pregID); return dread; } @@ -649,22 +646,22 @@ UnaryNode *MIRBuilder::CreateExprUnary(Opcode opcode, const MIRType &type, BaseN return GetCurrentFuncCodeMp()->New(opcode, type.GetPrimType(), opnd); } -GCMallocNode *MIRBuilder::CreateExprGCMalloc(Opcode opcode, const MIRType &ptype, const MIRType &type) { - return GetCurrentFuncCodeMp()->New(opcode, ptype.GetPrimType(), type.GetTypeIndex()); +GCMallocNode *MIRBuilder::CreateExprGCMalloc(Opcode opcode, const MIRType &pType, const MIRType &type) { + return GetCurrentFuncCodeMp()->New(opcode, pType.GetPrimType(), type.GetTypeIndex()); } -JarrayMallocNode *MIRBuilder::CreateExprJarrayMalloc(Opcode opcode, const MIRType &ptype, const MIRType &type, +JarrayMallocNode *MIRBuilder::CreateExprJarrayMalloc(Opcode opcode, const MIRType &pType, const MIRType &type, BaseNode *opnd) { - return GetCurrentFuncCodeMp()->New(opcode, ptype.GetPrimType(), type.GetTypeIndex(), opnd); + return GetCurrentFuncCodeMp()->New(opcode, pType.GetPrimType(), type.GetTypeIndex(), opnd); } TypeCvtNode *MIRBuilder::CreateExprTypeCvt(Opcode o, const MIRType &type, const MIRType &fromType, BaseNode *opnd) { return GetCurrentFuncCodeMp()->New(o, type.GetPrimType(), fromType.GetPrimType(), opnd); } -ExtractbitsNode *MIRBuilder::CreateExprExtractbits(Opcode o, const MIRType &type, uint32 bOffset, uint32 bsize, +ExtractbitsNode *MIRBuilder::CreateExprExtractbits(Opcode o, const MIRType &type, uint32 bOffset, uint32 bSize, BaseNode *opnd) { - return GetCurrentFuncCodeMp()->New(o, type.GetPrimType(), bOffset, bsize, opnd); + return GetCurrentFuncCodeMp()->New(o, type.GetPrimType(), bOffset, bSize, opnd); } RetypeNode *MIRBuilder::CreateExprRetype(const MIRType &type, const MIRType &fromType, BaseNode *opnd) { @@ -688,8 +685,8 @@ CompareNode *MIRBuilder::CreateExprCompare(Opcode opcode, const MIRType &type, c ArrayNode *MIRBuilder::CreateExprArray(const MIRType &arrayType) { MIRType *addrType = GlobalTables::GetTypeTable().GetOrCreatePointerType(arrayType); ASSERT(addrType != nullptr, "addrType is null"); - ArrayNode *arrayNode = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), - addrType->GetPrimType(), addrType->GetTypeIndex()); + auto *arrayNode = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), + addrType->GetPrimType(), addrType->GetTypeIndex()); arrayNode->SetNumOpnds(0); return arrayNode; } @@ -710,7 +707,7 @@ ArrayNode *MIRBuilder::CreateExprArray(const MIRType &arrayType, BaseNode *op1, IntrinsicopNode *MIRBuilder::CreateExprIntrinsicop(MIRIntrinsicID idx, Opcode opCode, const MIRType &type, const MapleVector &ops) { - IntrinsicopNode *expr = + auto *expr = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), opCode, type.GetPrimType()); expr->SetIntrinsic(idx); expr->SetNOpnd(ops); @@ -746,7 +743,7 @@ IassignFPoffNode *MIRBuilder::CreateStmtIassignFPoff(PrimType pty, int32 offset, } CallNode *MIRBuilder::CreateStmtCall(PUIdx puIdx, const MapleVector &args, Opcode opCode) { - CallNode *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), opCode, puIdx, TyIdx()); + auto *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), opCode, puIdx, TyIdx()); stmt->SetNOpnd(args); stmt->SetNumOpnds(args.size()); return stmt; @@ -762,7 +759,7 @@ CallNode *MIRBuilder::CreateStmtCall(const std::string &callee, const MapleVecto } IcallNode *MIRBuilder::CreateStmtIcall(const MapleVector &args) { - IcallNode *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), OP_icall); + auto *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), OP_icall); ASSERT(stmt != nullptr, "stmt is null"); stmt->SetOpnds(args); return stmt; @@ -770,7 +767,7 @@ IcallNode *MIRBuilder::CreateStmtIcall(const MapleVector &args) { IntrinsiccallNode *MIRBuilder::CreateStmtIntrinsicCall(MIRIntrinsicID idx, const MapleVector &arguments, TyIdx tyIdx) { - IntrinsiccallNode *stmt = GetCurrentFuncCodeMp()->New( + auto *stmt = GetCurrentFuncCodeMp()->New( *GetCurrentFuncCodeMpAllocator(), tyIdx == 0 ? OP_intrinsiccall : OP_intrinsiccallwithtype, idx); stmt->SetTyIdx(tyIdx); stmt->SetOpnds(arguments); @@ -778,7 +775,7 @@ IntrinsiccallNode *MIRBuilder::CreateStmtIntrinsicCall(MIRIntrinsicID idx, const } IntrinsiccallNode *MIRBuilder::CreateStmtXintrinsicCall(MIRIntrinsicID idx, const MapleVector &arguments) { - IntrinsiccallNode *stmt = + auto *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), OP_xintrinsiccall, idx); ASSERT(stmt != nullptr, "stmt is null"); stmt->SetOpnds(arguments); @@ -786,7 +783,7 @@ IntrinsiccallNode *MIRBuilder::CreateStmtXintrinsicCall(MIRIntrinsicID idx, cons } CallNode *MIRBuilder::CreateStmtCallAssigned(PUIdx puIdx, const MIRSymbol *ret, Opcode op) { - CallNode *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), op, puIdx); + auto *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), op, puIdx); if (ret) { ASSERT(IsValidCallReturn(*ret), "Not Excepted ret"); stmt->GetReturnVec().push_back(CallReturnPair(ret->GetStIdx(), RegFieldPair(0, 0))); @@ -796,7 +793,7 @@ CallNode *MIRBuilder::CreateStmtCallAssigned(PUIdx puIdx, const MIRSymbol *ret, CallNode *MIRBuilder::CreateStmtCallAssigned(PUIdx puIdx, const MapleVector &args, const MIRSymbol *ret, Opcode opcode, TyIdx tyIdx) { - CallNode *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), opcode, puIdx, tyIdx); + auto *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), opcode, puIdx, tyIdx); ASSERT(stmt != nullptr, "stmt is null"); stmt->SetOpnds(args); if (ret != nullptr) { @@ -806,30 +803,30 @@ CallNode *MIRBuilder::CreateStmtCallAssigned(PUIdx puIdx, const MapleVectorNew(*GetCurrentFuncCodeMpAllocator(), opcode, puIdx); +CallNode *MIRBuilder::CreateStmtCallRegassigned(PUIdx puIdx, PregIdx pRegIdx, Opcode opcode, BaseNode *arg) { + auto *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), opcode, puIdx); stmt->GetNopnd().push_back(arg); stmt->SetNumOpnds(stmt->GetNopndSize()); - if (pRegIdxt > 0) { - stmt->GetReturnVec().push_back(CallReturnPair(StIdx(), RegFieldPair(0, pRegIdxt))); + if (pRegIdx > 0) { + stmt->GetReturnVec().push_back(CallReturnPair(StIdx(), RegFieldPair(0, pRegIdx))); } return stmt; } -CallNode *MIRBuilder::CreateStmtCallRegassigned(PUIdx puIdx, const MapleVector &args, PregIdx pRegIdxt, +CallNode *MIRBuilder::CreateStmtCallRegassigned(PUIdx puIdx, const MapleVector &args, PregIdx pRegIdx, Opcode opcode) { - CallNode *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), opcode, puIdx); + auto *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), opcode, puIdx); ASSERT(stmt != nullptr, "stmt is null"); stmt->SetOpnds(args); - if (pRegIdxt > 0) { - stmt->GetReturnVec().push_back(CallReturnPair(StIdx(), RegFieldPair(0, pRegIdxt))); + if (pRegIdx > 0) { + stmt->GetReturnVec().push_back(CallReturnPair(StIdx(), RegFieldPair(0, pRegIdx))); } return stmt; } IntrinsiccallNode *MIRBuilder::CreateStmtIntrinsicCallAssigned(MIRIntrinsicID idx, const MapleVector &args, PregIdx retPregIdx) { - IntrinsiccallNode *stmt = + auto *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), OP_intrinsiccallassigned, idx); ASSERT(stmt != nullptr, "stmt is null"); stmt->SetOpnds(args); @@ -841,7 +838,7 @@ IntrinsiccallNode *MIRBuilder::CreateStmtIntrinsicCallAssigned(MIRIntrinsicID id IntrinsiccallNode *MIRBuilder::CreateStmtIntrinsicCallAssigned(MIRIntrinsicID idx, const MapleVector &args, const MIRSymbol *ret, TyIdx tyIdx) { - IntrinsiccallNode *stmt = GetCurrentFuncCodeMp()->New( + auto *stmt = GetCurrentFuncCodeMp()->New( *GetCurrentFuncCodeMpAllocator(), tyIdx == 0 ? OP_intrinsiccallassigned : OP_intrinsiccallwithtypeassigned, idx); stmt->SetTyIdx(tyIdx); stmt->SetOpnds(args); @@ -856,7 +853,7 @@ IntrinsiccallNode *MIRBuilder::CreateStmtIntrinsicCallAssigned(MIRIntrinsicID id IntrinsiccallNode *MIRBuilder::CreateStmtXintrinsicCallAssigned(MIRIntrinsicID idx, const MapleVector &args, const MIRSymbol *ret) { - IntrinsiccallNode *stmt = + auto *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), OP_xintrinsiccallassigned, idx); ASSERT(stmt != nullptr, "stmt is null"); stmt->SetOpnds(args); @@ -870,21 +867,21 @@ IntrinsiccallNode *MIRBuilder::CreateStmtXintrinsicCallAssigned(MIRIntrinsicID i } NaryStmtNode *MIRBuilder::CreateStmtReturn(BaseNode *rVal) { - NaryStmtNode *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), OP_return); + auto *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), OP_return); ASSERT(stmt != nullptr, "stmt is null"); stmt->PushOpnd(rVal); return stmt; } NaryStmtNode *MIRBuilder::CreateStmtNary(Opcode op, const MapleVector &rVals) { - NaryStmtNode *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), op); + auto *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), op); ASSERT(stmt != nullptr, "stmt is null"); stmt->SetOpnds(rVals); return stmt; } NaryStmtNode *MIRBuilder::CreateStmtNary(Opcode op, BaseNode *rVal) { - NaryStmtNode *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), op); + auto *stmt = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), op); ASSERT(stmt != nullptr, "stmt is null"); stmt->PushOpnd(rVal); return stmt; @@ -899,7 +896,7 @@ UnaryStmtNode *MIRBuilder::CreateStmtThrow(BaseNode *rVal) { } IfStmtNode *MIRBuilder::CreateStmtIf(BaseNode *cond) { - IfStmtNode *ifStmt = GetCurrentFuncCodeMp()->New(); + auto *ifStmt = GetCurrentFuncCodeMp()->New(); ifStmt->SetOpnd(cond); BlockNode *thenBlock = GetCurrentFuncCodeMp()->New(); ifStmt->SetThenPart(thenBlock); @@ -907,11 +904,11 @@ IfStmtNode *MIRBuilder::CreateStmtIf(BaseNode *cond) { } IfStmtNode *MIRBuilder::CreateStmtIfThenElse(BaseNode *cond) { - IfStmtNode *ifStmt = GetCurrentFuncCodeMp()->New(); + auto *ifStmt = GetCurrentFuncCodeMp()->New(); ifStmt->SetOpnd(cond); - BlockNode *thenBlock = GetCurrentFuncCodeMp()->New(); + auto *thenBlock = GetCurrentFuncCodeMp()->New(); ifStmt->SetThenPart(thenBlock); - BlockNode *elseBlock = GetCurrentFuncCodeMp()->New(); + auto *elseBlock = GetCurrentFuncCodeMp()->New(); ifStmt->SetElsePart(elseBlock); ifStmt->SetNumOpnds(3); return ifStmt; @@ -924,8 +921,8 @@ DoloopNode *MIRBuilder::CreateStmtDoloop(StIdx doVarStIdx, bool isPReg, BaseNode } SwitchNode *MIRBuilder::CreateStmtSwitch(BaseNode *opnd, LabelIdx defaultLabel, const CaseVector &switchTable) { - SwitchNode *switchNode = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), - defaultLabel, opnd); + auto *switchNode = GetCurrentFuncCodeMp()->New(*GetCurrentFuncCodeMpAllocator(), + defaultLabel, opnd); switchNode->SetSwitchTable(switchTable); switchNode->SetNumOpnds(switchTable.size()); return switchNode; @@ -968,21 +965,21 @@ CondGotoNode *MIRBuilder::CreateStmtCondGoto(BaseNode *cond, Opcode op, LabelIdx } LabelIdx MIRBuilder::GetOrCreateMIRLabel(const std::string &name) { - GStrIdx stridx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(name); + GStrIdx strIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(name); MIRFunction *currentFunctionInner = GetCurrentFunctionNotNull(); - LabelIdx labidx = currentFunctionInner->GetLabelTab()->GetStIdxFromStrIdx(stridx); - if (labidx == 0) { - labidx = currentFunctionInner->GetLabelTab()->CreateLabel(); - currentFunctionInner->GetLabelTab()->SetSymbolFromStIdx(labidx, stridx); - currentFunctionInner->GetLabelTab()->AddToStringLabelMap(labidx); + LabelIdx lableIdx = currentFunctionInner->GetLabelTab()->GetStIdxFromStrIdx(strIdx); + if (lableIdx == 0) { + lableIdx = currentFunctionInner->GetLabelTab()->CreateLabel(); + currentFunctionInner->GetLabelTab()->SetSymbolFromStIdx(lableIdx, strIdx); + currentFunctionInner->GetLabelTab()->AddToStringLabelMap(lableIdx); } - return labidx; + return lableIdx; } LabelIdx MIRBuilder::CreateLabIdx(MIRFunction &mirFunc) { - LabelIdx lidx = mirFunc.GetLabelTab()->CreateLabel(); - mirFunc.GetLabelTab()->AddToStringLabelMap(lidx); - return lidx; + LabelIdx lableIdx = mirFunc.GetLabelTab()->CreateLabel(); + mirFunc.GetLabelTab()->AddToStringLabelMap(lableIdx); + return lableIdx; } void MIRBuilder::AddStmtInCurrentFunctionBody(StmtNode &stmt) { diff --git a/src/maple_ir/src/mir_const.cpp b/src/maple_ir/src/mir_const.cpp index 19f2d92f2af845302f406ca2d3f73d072d2d36ec..36c292884e6a9d627bbefdc948d73a31cc42388a 100644 --- a/src/maple_ir/src/mir_const.cpp +++ b/src/maple_ir/src/mir_const.cpp @@ -15,7 +15,6 @@ #include "mir_const.h" #include #include -#include "mir_nodes.h" #include "mir_function.h" #include "global_tables.h" #include "printing.h" @@ -38,14 +37,14 @@ void MIRIntConst::Dump() const { } } -bool MIRIntConst::operator==(MIRConst &rhs) const { +bool MIRIntConst::operator==(const MIRConst &rhs) const { if (&rhs == this) { return true; } if (GetKind() != rhs.GetKind()) { return false; } - auto &intConst = static_cast(rhs); + const auto &intConst = static_cast(rhs); return ((&intConst.GetType() == &GetType()) && (intConst.value == value)); } @@ -60,14 +59,14 @@ void MIRAddrofConst::Dump() const { } } -bool MIRAddrofConst::operator==(MIRConst &rhs) const { +bool MIRAddrofConst::operator==(const MIRConst &rhs) const { if (&rhs == this) { return true; } if (GetKind() != rhs.GetKind()) { return false; } - auto &rhsA = static_cast(rhs); + const auto &rhsA = static_cast(rhs); if (&GetType() != &rhs.GetType()) { return false; } @@ -81,36 +80,36 @@ void MIRAddroffuncConst::Dump() const { LogInfo::MapleLogger() << " &" << GlobalTables::GetGsymTable().GetSymbolFromStidx(func->GetStIdx().Idx())->GetName(); } -bool MIRAddroffuncConst::operator==(MIRConst &rhs) const { +bool MIRAddroffuncConst::operator==(const MIRConst &rhs) const { if (&rhs == this) { return true; } if (GetKind() != rhs.GetKind()) { return false; } - auto &rhsAf = static_cast(rhs); + const auto &rhsAf = static_cast(rhs); return (&GetType() == &rhs.GetType()) && (puIdx == rhsAf.puIdx); } -bool MIRLblConst::operator==(MIRConst &rhs) const { +bool MIRLblConst::operator==(const MIRConst &rhs) const { if (&rhs == this) { return true; } if (GetKind() != rhs.GetKind()) { return false; } - auto &lblConst = static_cast(rhs); + const auto &lblConst = static_cast(rhs); return (lblConst.value == value); } -bool MIRFloatConst::operator==(MIRConst &rhs) const { +bool MIRFloatConst::operator==(const MIRConst &rhs) const { if (&rhs == this) { return true; } if (GetKind() != rhs.GetKind()) { return false; } - auto &floatConst = static_cast(rhs); + const auto &floatConst = static_cast(rhs); if (std::isnan(floatConst.value.floatValue)) { return std::isnan(value.floatValue); } @@ -120,14 +119,14 @@ bool MIRFloatConst::operator==(MIRConst &rhs) const { return (fabs(floatConst.value.floatValue - value.floatValue) <= 1e-6); } -bool MIRDoubleConst::operator==(MIRConst &rhs) const { +bool MIRDoubleConst::operator==(const MIRConst &rhs) const { if (&rhs == this) { return true; } if (GetKind() != rhs.GetKind()) { return false; } - auto &floatConst = static_cast(rhs); + const auto &floatConst = static_cast(rhs); if (std::isnan(floatConst.value.dValue)) { return std::isnan(value.dValue); } @@ -137,28 +136,28 @@ bool MIRDoubleConst::operator==(MIRConst &rhs) const { return (fabs(floatConst.value.dValue - value.dValue) <= 1e-15); } -bool MIRFloat128Const::operator==(MIRConst &rhs) const { +bool MIRFloat128Const::operator==(const MIRConst &rhs) const { if (&rhs == this) { return true; } if (GetKind() != rhs.GetKind()) { return false; } - auto &floatConst = static_cast(rhs); + const auto &floatConst = static_cast(rhs); if ((value[0] == floatConst.value[0]) && (value[1] == floatConst.value[1])) { return true; } return false; } -bool MIRAggConst::operator==(MIRConst &rhs) const { +bool MIRAggConst::operator==(const MIRConst &rhs) const { if (&rhs == this) { return true; } if (GetKind() != rhs.GetKind()) { return false; } - auto &aggregateConst = static_cast(rhs); + const auto &aggregateConst = static_cast(rhs); if (aggregateConst.constVec.size() != constVec.size()) { return false; } @@ -211,18 +210,18 @@ MIRStrConst::MIRStrConst(const std::string &str, MIRType &type) void MIRStrConst::Dump() const { MIRConst::Dump(); LogInfo::MapleLogger() << "conststr " << GetPrimTypeName(GetType().GetPrimType()); - const std::string dumpStr = GlobalTables::GetUStrTable().GetStringFromStrIdx(value); + const std::string &dumpStr = GlobalTables::GetUStrTable().GetStringFromStrIdx(value); PrintString(dumpStr); } -bool MIRStrConst::operator==(MIRConst &rhs) const { +bool MIRStrConst::operator==(const MIRConst &rhs) const { if (&rhs == this) { return true; } if (GetKind() != rhs.GetKind()) { return false; } - auto &rhsCs = static_cast(rhs); + const auto &rhsCs = static_cast(rhs); return (&rhs.GetType() == &GetType()) && (value == rhsCs.value); } @@ -241,14 +240,14 @@ void MIRStr16Const::Dump() const { PrintString(str); } -bool MIRStr16Const::operator==(MIRConst &rhs) const { +bool MIRStr16Const::operator==(const MIRConst &rhs) const { if (&rhs == this) { return true; } if (GetKind() != rhs.GetKind()) { return false; } - auto &rhsCs = static_cast(rhs); + const auto &rhsCs = static_cast(rhs); return (&GetType() == &rhs.GetType()) && (value == rhsCs.value); } } // namespace maple diff --git a/src/maple_ir/src/mir_function.cpp b/src/maple_ir/src/mir_function.cpp index 2e9a318f1af1f52cd43f44681c4c769014fa17a4..57f9840c831752373bf7f0c9c9017094b59176ea 100644 --- a/src/maple_ir/src/mir_function.cpp +++ b/src/maple_ir/src/mir_function.cpp @@ -14,10 +14,8 @@ */ #include "mir_function.h" #include -#include #include #include "mir_nodes.h" -#include "class_hierarchy.h" #include "printing.h" #include "string_utils.h" @@ -269,7 +267,7 @@ void MIRFunction::Dump(bool withoutBody) { if (codeMemPool == nullptr) { LogInfo::MapleLogger() << '\n'; LogInfo::MapleLogger() << "# [WARNING] skipped dumping because codeMemPool is nullptr " << '\n'; - } else if (GetBody() && !withoutBody && symbol->GetStorageClass() != kScExtern) { + } else if (GetBody() != nullptr && !withoutBody && symbol->GetStorageClass() != kScExtern) { ResetInfoPrinted(); // this ensures funcinfo will be printed GetBody()->Dump(*module, 0, module->GetFlavor() < kMmpl ? GetSymTab() : nullptr, module->GetFlavor() < kMmpl ? GetPregTab() : nullptr, false, true); // Dump body @@ -288,7 +286,7 @@ void MIRFunction::DumpUpFormal(int32 indent) const { if (localWordsTypeTagged != nullptr) { PrintIndentation(indent + 1); LogInfo::MapleLogger() << "formalWordsTypeTagged = [ "; - const uint32 *p = reinterpret_cast(localWordsTypeTagged); + const auto *p = reinterpret_cast(localWordsTypeTagged); LogInfo::MapleLogger() << std::hex; while (p < reinterpret_cast(localWordsTypeTagged + BlockSize2BitVectorSize(GetUpFormalSize()))) { LogInfo::MapleLogger() << std::hex << "0x" << *p << " "; @@ -400,11 +398,11 @@ bool MIRFunction::IsEmpty() const { } bool MIRFunction::IsClinit() const { - const std::string clInitPostfix = "_7C_3Cclinit_3E_7C_28_29V"; + const std::string clinitPostfix = "_7C_3Cclinit_3E_7C_28_29V"; const std::string &funcName = this->GetName(); // this does not work for smali files like art/test/511-clinit-interface/smali/BogusInterface.smali, // which is decorated without "constructor". - return StringUtils::EndsWith(funcName, clInitPostfix); + return StringUtils::EndsWith(funcName, clinitPostfix); } uint32 MIRFunction::GetInfo(GStrIdx strIdx) const { @@ -450,12 +448,12 @@ void MIRFunction::SetBaseClassFuncNames(GStrIdx strIdx) { if (pos != std::string::npos && pos > 0) { const std::string className = name.substr(0, pos); baseClassStrIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(className); - std::string funcNameWithtype = name.substr(pos + width, name.length() - pos - width); - baseFuncWithTypeStrIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(funcNameWithtype); + std::string funcNameWithType = name.substr(pos + width, name.length() - pos - width); + baseFuncWithTypeStrIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(funcNameWithType); size_t index = name.find(NameMangler::kRigthBracketStr); ASSERT(index != std::string::npos, "Invalid name, cannot find '_29' in name"); size_t posEnd = index + (std::string(NameMangler::kRigthBracketStr)).length(); - funcNameWithtype = name.substr(pos + width, posEnd - pos - width); + funcNameWithType = name.substr(pos + width, posEnd - pos - width); size_t newPos = name.find(delimiter, pos + width); while (newPos != std::string::npos && (name[newPos - 1] == '_' && name[newPos - 2] != '_')) { newPos = name.find(delimiter, newPos + width); @@ -500,7 +498,7 @@ void MIRFunction::NewBody() { // from module mempool to function mempool. MIRSymbolTable *oldSymTable = GetSymTab(); MIRPregTable *oldPregTable = GetPregTab(); - MIRTypeNameTable *oldTypenameTable = typeNameTab; + MIRTypeNameTable *oldTypeNameTable = typeNameTab; MIRLabelTable *oldLabelTable = GetLabelTab(); symTab = dataMemPool->New(dataMPAllocator); SetPregTab(dataMemPool->New(module, &dataMPAllocator)); @@ -512,12 +510,12 @@ void MIRFunction::NewBody() { } } if (oldPregTable != nullptr) { - for (size_t i = 1; i < oldPregTable->Size(); i++) { + for (size_t i = 1; i < oldPregTable->Size(); ++i) { GetPregTab()->AddPreg(oldPregTable->PregFromPregIdx(i)); } } - if (oldTypenameTable != nullptr) { - ASSERT(oldTypenameTable->Size() == typeNameTab->Size(), + if (oldTypeNameTable != nullptr) { + ASSERT(oldTypeNameTable->Size() == typeNameTab->Size(), "Does not expect to process typeNameTab in MIRFunction::NewBody"); } if (oldLabelTable != nullptr) { diff --git a/src/maple_ir/src/mir_lower.cpp b/src/maple_ir/src/mir_lower.cpp index 163251d350793ab69f1f7a57c63c6edfdedc5ae5..f4afac516082320a4ec822e1b638db70ff690b20 100644 --- a/src/maple_ir/src/mir_lower.cpp +++ b/src/maple_ir/src/mir_lower.cpp @@ -13,20 +13,19 @@ * See the Mulan PSL v1 for more details. */ #include "mir_lower.h" -#include "vtable_impl.h" #define DO_LT_0_CHECK 1 namespace maple { LabelIdx MIRLower::CreateCondGotoStmt(Opcode op, BlockNode &blk, const IfStmtNode &ifStmt) { - CondGotoNode *brStmt = mirModule.CurFuncCodeMemPool()->New(op); + auto *brStmt = mirModule.CurFuncCodeMemPool()->New(op); brStmt->SetOpnd(ifStmt.Opnd()); brStmt->SetSrcPos(ifStmt.GetSrcPos()); LabelIdx lableIdx = mirModule.CurFunction()->GetLabelTab()->CreateLabel(); (void)mirModule.CurFunction()->GetLabelTab()->AddToStringLabelMap(lableIdx); brStmt->SetOffset(lableIdx); blk.AddStatement(brStmt); - bool thenEmpty = ifStmt.GetThenPart() == nullptr || ifStmt.GetThenPart()->GetFirst() == nullptr; + bool thenEmpty = (ifStmt.GetThenPart() == nullptr) || (ifStmt.GetThenPart()->GetFirst() == nullptr); if (thenEmpty) { blk.AppendStatementsFromBlock(*ifStmt.GetElsePart()); } else { @@ -37,14 +36,14 @@ LabelIdx MIRLower::CreateCondGotoStmt(Opcode op, BlockNode &blk, const IfStmtNod void MIRLower::CreateBrFalseStmt(BlockNode &blk, const IfStmtNode &ifStmt) { LabelIdx labelIdx = CreateCondGotoStmt(OP_brfalse, blk, ifStmt); - LabelNode *lableStmt = mirModule.CurFuncCodeMemPool()->New(); + auto *lableStmt = mirModule.CurFuncCodeMemPool()->New(); lableStmt->SetLabelIdx(labelIdx); blk.AddStatement(lableStmt); } void MIRLower::CreateBrTrueStmt(BlockNode &blk, const IfStmtNode &ifStmt) { LabelIdx labelIdx = CreateCondGotoStmt(OP_brtrue, blk, ifStmt); - LabelNode *lableStmt = mirModule.CurFuncCodeMemPool()->New(); + auto *lableStmt = mirModule.CurFuncCodeMemPool()->New(); lableStmt->SetLabelIdx(labelIdx); blk.AddStatement(lableStmt); } @@ -58,13 +57,13 @@ void MIRLower::CreateBrFalseAndGotoStmt(BlockNode &blk, const IfStmtNode &ifStmt bool fallThroughFromThen = !IfStmtNoFallThrough(ifStmt); LabelIdx gotoLableIdx = 0; if (fallThroughFromThen) { - GotoNode *gotoStmt = mirModule.CurFuncCodeMemPool()->New(OP_goto); + auto *gotoStmt = mirModule.CurFuncCodeMemPool()->New(OP_goto); gotoLableIdx = mirModule.CurFunction()->GetLabelTab()->CreateLabel(); (void)mirModule.CurFunction()->GetLabelTab()->AddToStringLabelMap(gotoLableIdx); gotoStmt->SetOffset(gotoLableIdx); blk.AddStatement(gotoStmt); } - LabelNode *lableStmt = mirModule.CurFuncCodeMemPool()->New(); + auto *lableStmt = mirModule.CurFuncCodeMemPool()->New(); lableStmt->SetLabelIdx(labelIdx); blk.AddStatement(lableStmt); blk.AppendStatementsFromBlock(*ifStmt.GetElsePart()); @@ -76,8 +75,8 @@ void MIRLower::CreateBrFalseAndGotoStmt(BlockNode &blk, const IfStmtNode &ifStmt } BlockNode *MIRLower::LowerIfStmt(IfStmtNode &ifStmt, bool recursive) { - bool thenEmpty = ifStmt.GetThenPart() == nullptr || ifStmt.GetThenPart()->GetFirst() == nullptr; - bool elseEmpty = ifStmt.GetElsePart() == nullptr || ifStmt.GetElsePart()->GetFirst() == nullptr; + bool thenEmpty = (ifStmt.GetThenPart() == nullptr) || (ifStmt.GetThenPart()->GetFirst() == nullptr); + bool elseEmpty = (ifStmt.GetElsePart() == nullptr) || (ifStmt.GetElsePart()->GetFirst() == nullptr); if (recursive) { if (!thenEmpty) { ifStmt.SetThenPart(LowerBlock(*ifStmt.GetThenPart())); @@ -86,10 +85,10 @@ BlockNode *MIRLower::LowerIfStmt(IfStmtNode &ifStmt, bool recursive) { ifStmt.SetElsePart(LowerBlock(*ifStmt.GetElsePart())); } } - BlockNode *blk = mirModule.CurFuncCodeMemPool()->New(); + auto *blk = mirModule.CurFuncCodeMemPool()->New(); if (thenEmpty && elseEmpty) { // generate EVAL statement - UnaryStmtNode *evalStmt = mirModule.CurFuncCodeMemPool()->New(OP_eval); + auto *evalStmt = mirModule.CurFuncCodeMemPool()->New(OP_eval); evalStmt->SetOpnd(ifStmt.Opnd()); evalStmt->SetSrcPos(ifStmt.GetSrcPos()); blk->AddStatement(evalStmt); @@ -125,8 +124,8 @@ BlockNode *MIRLower::LowerIfStmt(IfStmtNode &ifStmt, bool recursive) { BlockNode *MIRLower::LowerWhileStmt(WhileStmtNode &whileStmt) { ASSERT(whileStmt.GetBody() != nullptr, "nullptr check"); whileStmt.SetBody(LowerBlock(*whileStmt.GetBody())); - BlockNode *blk = mirModule.CurFuncCodeMemPool()->New(); - CondGotoNode *brFalseStmt = mirModule.CurFuncCodeMemPool()->New(OP_brfalse); + auto *blk = mirModule.CurFuncCodeMemPool()->New(); + auto *brFalseStmt = mirModule.CurFuncCodeMemPool()->New(OP_brfalse); brFalseStmt->SetOpnd(whileStmt.Opnd()); brFalseStmt->SetSrcPos(whileStmt.GetSrcPos()); LabelIdx lalbeIdx = mirModule.CurFunction()->GetLabelTab()->CreateLabel(); @@ -135,11 +134,11 @@ BlockNode *MIRLower::LowerWhileStmt(WhileStmtNode &whileStmt) { blk->AddStatement(brFalseStmt); LabelIdx bodyLableIdx = mirModule.CurFunction()->GetLabelTab()->CreateLabel(); (void)mirModule.CurFunction()->GetLabelTab()->AddToStringLabelMap(bodyLableIdx); - LabelNode *lableStmt = mirModule.CurFuncCodeMemPool()->New(); + auto *lableStmt = mirModule.CurFuncCodeMemPool()->New(); lableStmt->SetLabelIdx(bodyLableIdx); blk->AddStatement(lableStmt); blk->AppendStatementsFromBlock(*whileStmt.GetBody()); - CondGotoNode *brTrueStmt = mirModule.CurFuncCodeMemPool()->New(OP_brtrue); + auto *brTrueStmt = mirModule.CurFuncCodeMemPool()->New(OP_brtrue); brTrueStmt->SetOpnd(whileStmt.Opnd()->CloneTree(mirModule.GetCurFuncCodeMPAllocator())); brTrueStmt->SetOffset(bodyLableIdx); blk->AddStatement(brTrueStmt); @@ -161,26 +160,26 @@ BlockNode *MIRLower::LowerWhileStmt(WhileStmtNode &whileStmt) { BlockNode *MIRLower::LowerDoloopStmt(DoloopNode &doloop) { ASSERT(doloop.GetDoBody() != nullptr, "nullptr check"); doloop.SetDoBody(LowerBlock(*doloop.GetDoBody())); - BlockNode *blk = mirModule.CurFuncCodeMemPool()->New(); + auto *blk = mirModule.CurFuncCodeMemPool()->New(); if (doloop.IsPreg()) { PregIdx regIdx = (PregIdx)doloop.GetDoVarStIdx().FullIdx(); - MIRPreg *mirPReg = mirModule.CurFunction()->GetPregTab()->PregFromPregIdx(regIdx); - PrimType primType = mirPReg->GetPrimType(); + MIRPreg *mirPreg = mirModule.CurFunction()->GetPregTab()->PregFromPregIdx(regIdx); + PrimType primType = mirPreg->GetPrimType(); ASSERT(primType != kPtyInvalid, "runtime check error"); - RegassignNode *startRegassign = mirModule.CurFuncCodeMemPool()->New(); + auto *startRegassign = mirModule.CurFuncCodeMemPool()->New(); startRegassign->SetRegIdx(regIdx); startRegassign->SetPrimType(primType); startRegassign->SetOpnd(doloop.GetStartExpr()); startRegassign->SetSrcPos(doloop.GetSrcPos()); blk->AddStatement(startRegassign); } else { - DassignNode *startDassign = mirModule.CurFuncCodeMemPool()->New(); + auto *startDassign = mirModule.CurFuncCodeMemPool()->New(); startDassign->SetStIdx(doloop.GetDoVarStIdx()); startDassign->SetRHS(doloop.GetStartExpr()); startDassign->SetSrcPos(doloop.GetSrcPos()); blk->AddStatement(startDassign); } - CondGotoNode *brFalseStmt = mirModule.CurFuncCodeMemPool()->New(OP_brfalse); + auto *brFalseStmt = mirModule.CurFuncCodeMemPool()->New(OP_brfalse); brFalseStmt->SetOpnd(doloop.GetCondExpr()); LabelIdx lIdx = mirModule.CurFunction()->GetLabelTab()->CreateLabel(); (void)mirModule.CurFunction()->GetLabelTab()->AddToStringLabelMap(lIdx); @@ -188,7 +187,7 @@ BlockNode *MIRLower::LowerDoloopStmt(DoloopNode &doloop) { blk->AddStatement(brFalseStmt); LabelIdx bodyLabelIdx = mirModule.CurFunction()->GetLabelTab()->CreateLabel(); (void)mirModule.CurFunction()->GetLabelTab()->AddToStringLabelMap(bodyLabelIdx); - LabelNode *labelStmt = mirModule.CurFuncCodeMemPool()->New(); + auto *labelStmt = mirModule.CurFuncCodeMemPool()->New(); labelStmt->SetLabelIdx(bodyLabelIdx); blk->AddStatement(labelStmt); blk->AppendStatementsFromBlock(*doloop.GetDoBody()); @@ -197,12 +196,12 @@ BlockNode *MIRLower::LowerDoloopStmt(DoloopNode &doloop) { MIRPreg *mirPreg = mirModule.CurFunction()->GetPregTab()->PregFromPregIdx(regIdx); PrimType doVarPType = mirPreg->GetPrimType(); ASSERT(doVarPType != kPtyInvalid, "runtime check error"); - RegreadNode *readDoVar = mirModule.CurFuncCodeMemPool()->New(); + auto *readDoVar = mirModule.CurFuncCodeMemPool()->New(); readDoVar->SetRegIdx(regIdx); readDoVar->SetPrimType(doVarPType); - BinaryNode *add = + auto *add = mirModule.CurFuncCodeMemPool()->New(OP_add, doVarPType, doloop.GetIncrExpr(), readDoVar); - RegassignNode *endRegassign = mirModule.CurFuncCodeMemPool()->New(); + auto *endRegassign = mirModule.CurFuncCodeMemPool()->New(); endRegassign->SetRegIdx(regIdx); endRegassign->SetPrimType(doVarPType); endRegassign->SetOpnd(add); @@ -210,16 +209,16 @@ BlockNode *MIRLower::LowerDoloopStmt(DoloopNode &doloop) { } else { const MIRSymbol *doVarSym = mirModule.CurFunction()->GetLocalOrGlobalSymbol(doloop.GetDoVarStIdx()); PrimType doVarPType = doVarSym->GetType()->GetPrimType(); - DreadNode *readDovar = + auto *readDovar = mirModule.CurFuncCodeMemPool()->New(OP_dread, doVarPType, doloop.GetDoVarStIdx(), 0); - BinaryNode *add = + auto *add = mirModule.CurFuncCodeMemPool()->New(OP_add, doVarPType, doloop.GetIncrExpr(), readDovar); - DassignNode *endDassign = mirModule.CurFuncCodeMemPool()->New(); + auto *endDassign = mirModule.CurFuncCodeMemPool()->New(); endDassign->SetStIdx(doloop.GetDoVarStIdx()); endDassign->SetRHS(add); blk->AddStatement(endDassign); } - CondGotoNode *brTrueStmt = mirModule.CurFuncCodeMemPool()->New(OP_brtrue); + auto *brTrueStmt = mirModule.CurFuncCodeMemPool()->New(OP_brtrue); brTrueStmt->SetOpnd(doloop.GetCondExpr()->CloneTree(mirModule.GetCurFuncCodeMPAllocator())); brTrueStmt->SetOffset(bodyLabelIdx); blk->AddStatement(brTrueStmt); @@ -237,14 +236,14 @@ BlockNode *MIRLower::LowerDoloopStmt(DoloopNode &doloop) { BlockNode *MIRLower::LowerDowhileStmt(WhileStmtNode &doWhileStmt) { ASSERT(doWhileStmt.GetBody() != nullptr, "nullptr check"); doWhileStmt.SetBody(LowerBlock(*doWhileStmt.GetBody())); - BlockNode *blk = mirModule.CurFuncCodeMemPool()->New(); + auto *blk = mirModule.CurFuncCodeMemPool()->New(); LabelIdx lIdx = mirModule.CurFunction()->GetLabelTab()->CreateLabel(); (void)mirModule.CurFunction()->GetLabelTab()->AddToStringLabelMap(lIdx); - LabelNode *labelStmt = mirModule.CurFuncCodeMemPool()->New(); + auto *labelStmt = mirModule.CurFuncCodeMemPool()->New(); labelStmt->SetLabelIdx(lIdx); blk->AddStatement(labelStmt); blk->AppendStatementsFromBlock(*doWhileStmt.GetBody()); - CondGotoNode *brTrueStmt = mirModule.CurFuncCodeMemPool()->New(OP_brtrue); + auto *brTrueStmt = mirModule.CurFuncCodeMemPool()->New(OP_brtrue); brTrueStmt->SetOpnd(doWhileStmt.Opnd()); brTrueStmt->SetOffset(lIdx); blk->AddStatement(brTrueStmt); @@ -252,7 +251,7 @@ BlockNode *MIRLower::LowerDowhileStmt(WhileStmtNode &doWhileStmt) { } BlockNode *MIRLower::LowerBlock(BlockNode &block) { - BlockNode *newBlock = mirModule.CurFuncCodeMemPool()->New(); + auto *newBlock = mirModule.CurFuncCodeMemPool()->New(); BlockNode *tmp = nullptr; if (block.GetFirst() == nullptr) { return newBlock; @@ -265,7 +264,6 @@ BlockNode *MIRLower::LowerBlock(BlockNode &block) { switch (stmt->GetOpCode()) { case OP_if: tmp = LowerIfStmt(static_cast(*stmt), true); - ASSERT(tmp != nullptr, "null ptr check"); newBlock->AppendStatementsFromBlock(*tmp); break; case OP_while: @@ -279,7 +277,6 @@ BlockNode *MIRLower::LowerBlock(BlockNode &block) { break; case OP_block: tmp = LowerBlock(static_cast(*stmt)); - ASSERT(tmp != nullptr, "null ptr check "); newBlock->AppendStatementsFromBlock(*tmp); break; default: @@ -308,7 +305,7 @@ void MIRLower::LowerBrCondition(BlockNode &block) { (stmt->GetOpCode() == OP_brtrue && cond->GetOpCode() == OP_cior)) { // short-circuit target label is same as original condGoto stmt condGoto->SetOpnd(cond->GetBOpnd(0)); - CondGotoNode *newCondGoto = mirModule.CurFuncCodeMemPool()->New(Opcode(stmt->GetOpCode())); + auto *newCondGoto = mirModule.CurFuncCodeMemPool()->New(Opcode(stmt->GetOpCode())); newCondGoto->SetOpnd(cond->GetBOpnd(1)); newCondGoto->SetOffset(condGoto->GetOffset()); block.InsertAfter(newCondGoto, condGoto); @@ -326,7 +323,7 @@ void MIRLower::LowerBrCondition(BlockNode &block) { labelStmt->SetLabelIdx(lIdx); block.InsertAfter(condGoto, labelStmt); } - CondGotoNode *newCondGoto = mirModule.CurFuncCodeMemPool()->New( + auto *newCondGoto = mirModule.CurFuncCodeMemPool()->New( stmt->GetOpCode() == OP_brfalse ? OP_brtrue : OP_brfalse); newCondGoto->SetOpnd(cond->GetBOpnd(0)); newCondGoto->SetOffset(lIdx); @@ -391,10 +388,10 @@ void MIRLower::AddArrayMrtMpl(BaseNode &exp, BlockNode &newBlock) { AddArrayMrtMpl(*exp.Opnd(i), newBlock); } if (exp.GetOpCode() == OP_array) { - auto *arrayNode = static_cast(&exp); - if (arrayNode->GetBoundsCheck()) { - BaseNode *arrAddr = arrayNode->Opnd(0); - BaseNode *index = arrayNode->Opnd(1); + auto &arrayNode = static_cast(exp); + if (arrayNode.GetBoundsCheck()) { + BaseNode *arrAddr = arrayNode.Opnd(0); + BaseNode *index = arrayNode.Opnd(1); ASSERT(index != nullptr, "null ptr check"); MIRType *indexType = GlobalTables::GetTypeTable().GetPrimType(index->GetPrimType()); UnaryStmtNode *nullCheck = builder->CreateStmtUnary(OP_assertnonnull, arrAddr); @@ -434,7 +431,7 @@ void MIRLower::AddArrayMrtMpl(BaseNode &exp, BlockNode &newBlock) { } BlockNode *MIRLower::ExpandArrayMrtBlock(BlockNode &block) { - BlockNode *newBlock = mirModule.CurFuncCodeMemPool()->New(); + auto *newBlock = mirModule.CurFuncCodeMemPool()->New(); if (block.GetFirst() == nullptr) { return newBlock; } diff --git a/src/maple_ir/src/mir_module.cpp b/src/maple_ir/src/mir_module.cpp index d2ac7cc9e11b4f8c32eaa744fccf2d5efc5984ba..adbb307cc0b75bd67f36644876c209f7e2b1ac5c 100644 --- a/src/maple_ir/src/mir_module.cpp +++ b/src/maple_ir/src/mir_module.cpp @@ -135,10 +135,10 @@ void MIRModule::DumpGlobals(bool emitStructureType) const { } LogInfo::MapleLogger() << std::dec << "]\n"; } - LogInfo::MapleLogger() << "numfuncs " << numFuncs << std::endl; + LogInfo::MapleLogger() << "numfuncs " << numFuncs << '\n'; if (!importFiles.empty()) { // Output current module's mplt on top, imported ones at below - for (auto it = importFiles.rbegin(); it != importFiles.rend(); it++) { + for (auto it = importFiles.rbegin(); it != importFiles.rend(); ++it) { LogInfo::MapleLogger() << "import \"" << GlobalTables::GetStrTable().GetStringFromStrIdx(*it) << "\"\n"; } } @@ -207,7 +207,7 @@ void MIRModule::DumpGlobals(bool emitStructureType) const { LogInfo::MapleLogger() << std::dec; } if (flavor < kMmpl) { - for (auto it = typeDefOrder.begin(); it != typeDefOrder.end(); it++) { + for (auto it = typeDefOrder.begin(); it != typeDefOrder.end(); ++it) { TyIdx tyIdx = typeNameTab->GetTyIdxFromGStrIdx(*it); const std::string &name = GlobalTables::GetStrTable().GetStringFromStrIdx(*it); MIRType *type = GlobalTables::GetTypeTable().GetTypeFromTyIdx(tyIdx); @@ -232,7 +232,7 @@ void MIRModule::DumpGlobals(bool emitStructureType) const { } else { type->Dump(1); } - LogInfo::MapleLogger() << std::endl; + LogInfo::MapleLogger() << '\n'; } if (someSymbolNeedForwDecl) { // an extra pass thru the global symbol table to print forward decl @@ -371,15 +371,15 @@ const std::string &MIRModule::GetFileNameFromFileNum(uint32 fileNum) const { void MIRModule::DumpClassToFile(const std::string &path) const { - std::string spath(path); - spath.append("/"); + std::string strPath(path); + strPath.append("/"); for (auto it : typeNameTab->GetGStrIdxToTyIdxMap()) { const std::string &name = GlobalTables::GetStrTable().GetStringFromStrIdx(it.first); MIRType *type = GlobalTables::GetTypeTable().GetTypeFromTyIdx(it.second); std::string outClassFile(name); /* replace class name / with - */ std::replace(outClassFile.begin(), outClassFile.end(), '/', '-'); - outClassFile.insert(0, spath); + outClassFile.insert(0, strPath); outClassFile.append(".mpl"); std::ofstream mplFile; mplFile.open(outClassFile.c_str(), std::ios::trunc); diff --git a/src/maple_ir/src/mir_nodes.cpp b/src/maple_ir/src/mir_nodes.cpp index 05bbfd857142dda31ae0f1365b1d32262cca9526..84908695cf7aff922dedc636055ab4e6eee9035f 100644 --- a/src/maple_ir/src/mir_nodes.cpp +++ b/src/maple_ir/src/mir_nodes.cpp @@ -22,7 +22,7 @@ #include "name_mangler.h" namespace maple { -MIRModule *theModule; +MIRModule *theMIRModule = nullptr; uint32 StmtNode::stmtIDNext = 1; // 0 is reserved uint32 StmtNode::lastPrintedLineNum = 0; @@ -30,8 +30,8 @@ const char *GetIntrinsicName(MIRIntrinsicID intrn) { switch (intrn) { default: #define DEF_MIR_INTRINSIC(STR, NAME, INTRN_CLASS, RETURN_TYPE, ...) \ - case INTRN_##STR: \ - return #STR; + case INTRN_##STR: \ + return #STR; #include "intrinsics.def" #undef DEF_MIR_INTRINSIC } @@ -56,7 +56,7 @@ bool BaseNode::MayThrowException() { return true; } } - for (size_t i = 0; i < NumOpnds(); i++) { + for (size_t i = 0; i < NumOpnds(); ++i) { if (Opnd(i)->MayThrowException()) { return true; } @@ -72,9 +72,8 @@ bool AddrofNode::CheckNode(const MIRModule &mod) const { #ifdef DYNAMICLANG if (GetPrimType() == PTY_dynany) { return true; - } else { - return IsPrimitiveScalar(GetPrimType()); } + return IsPrimitiveScalar(GetPrimType()); #else return IsPrimitiveScalar(GetPrimType()); #endif @@ -87,44 +86,41 @@ bool AddrofNode::CheckNode(const MIRModule &mod) const { case kTypeStructIncomplete: { if (GetFieldID() == 0) { return GetPrimType() == PTY_agg; - } else { - auto *structType = static_cast(ty); - TyIdx ftyidx = structType->GetFieldTyIdx(fieldID); - MIRType *subType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ftyidx); - MIRTypeKind subKind = subType->GetKind(); - return (subKind == kTypeBitField && VerifyPrimType(subType->GetPrimType(), GetPrimType())) || - (subKind == kTypeScalar && IsPrimitiveScalar(GetPrimType())) || - (subKind == kTypePointer && IsPrimitivePoint(GetPrimType())) || - (subKind == kTypeStruct && GetPrimType() == PTY_agg) || (ftyidx != 0 && GetPrimType() == PTY_agg); } + auto *structType = static_cast(ty); + TyIdx fTyIdx = structType->GetFieldTyIdx(fieldID); + MIRType *subType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(fTyIdx); + MIRTypeKind subKind = subType->GetKind(); + return (subKind == kTypeBitField && VerifyPrimType(subType->GetPrimType(), GetPrimType())) || + (subKind == kTypeScalar && IsPrimitiveScalar(GetPrimType())) || + (subKind == kTypePointer && IsPrimitivePoint(GetPrimType())) || + (subKind == kTypeStruct && GetPrimType() == PTY_agg) || (fTyIdx != 0 && GetPrimType() == PTY_agg); } case kTypeClass: case kTypeClassIncomplete: { if (fieldID == 0) { return GetPrimType() == PTY_agg; - } else { - auto *classType = static_cast(ty); - MIRType *subType = classType->GetFieldType(fieldID); - MIRTypeKind subKind = subType->GetKind(); - return (subKind == kTypeBitField && VerifyPrimType(subType->GetPrimType(), GetPrimType())) || - (subKind == kTypeScalar && IsPrimitiveScalar(GetPrimType())) || - (subKind == kTypePointer && IsPrimitivePoint(GetPrimType())) || - (subKind == kTypeStruct && GetPrimType() == PTY_agg); } + auto *classType = static_cast(ty); + MIRType *subType = classType->GetFieldType(fieldID); + MIRTypeKind subKind = subType->GetKind(); + return (subKind == kTypeBitField && VerifyPrimType(subType->GetPrimType(), GetPrimType())) || + (subKind == kTypeScalar && IsPrimitiveScalar(GetPrimType())) || + (subKind == kTypePointer && IsPrimitivePoint(GetPrimType())) || + (subKind == kTypeStruct && GetPrimType() == PTY_agg); } case kTypeInterface: case kTypeInterfaceIncomplete: { if (fieldID == 0) { return GetPrimType() == PTY_agg; - } else { - auto *interfaceType = static_cast(ty); - MIRType *subty = interfaceType->GetFieldType(fieldID); - MIRTypeKind subKind = subty->GetKind(); - return (subKind == kTypeBitField && VerifyPrimType(subty->GetPrimType(), GetPrimType())) || - (subKind == kTypeScalar && IsPrimitiveScalar(GetPrimType())) || - (subKind == kTypePointer && IsPrimitivePoint(GetPrimType())) || - (subKind == kTypeStruct && GetPrimType() == PTY_agg); } + auto *interfaceType = static_cast(ty); + MIRType *subType = interfaceType->GetFieldType(fieldID); + MIRTypeKind subKind = subType->GetKind(); + return (subKind == kTypeBitField && VerifyPrimType(subType->GetPrimType(), GetPrimType())) || + (subKind == kTypeScalar && IsPrimitiveScalar(GetPrimType())) || + (subKind == kTypePointer && IsPrimitivePoint(GetPrimType())) || + (subKind == kTypeStruct && GetPrimType() == PTY_agg); } case kTypePointer: return IsPrimitivePoint(GetPrimType()); @@ -208,7 +204,7 @@ void CatchNode::Dump(const MIRModule &mod, int32 indent) const { PrintIndentation(indent); LogInfo::MapleLogger() << kOpcodeInfo.GetTableItemAt(GetOpCode()).name << " {"; size_t size = exceptionTyIdxVec.size(); - for (size_t i = 0; i < size; i++) { + for (size_t i = 0; i < size; ++i) { LogInfo::MapleLogger() << " "; GlobalTables::GetTypeTable().GetTypeFromTyIdx(exceptionTyIdxVec[i])->Dump(indent + 1); } @@ -373,14 +369,14 @@ void NaryOpnds::Dump(const MIRModule &mod, int32 indent) const { GetNopndAt(0)->Dump(mod, indent); } else { bool allisLeaf = true; - for (size_t i = 0; i < GetNopndSize(); i++) + for (size_t i = 0; i < GetNopndSize(); ++i) if (!GetNopndAt(i)->IsLeaf()) { allisLeaf = false; break; } if (allisLeaf) { GetNopndAt(0)->Dump(mod, 0); - for (size_t i = 1; i < GetNopndSize(); i++) { + for (size_t i = 1; i < GetNopndSize(); ++i) { LogInfo::MapleLogger() << ", "; GetNopndAt(i)->Dump(mod, 0); } @@ -388,7 +384,7 @@ void NaryOpnds::Dump(const MIRModule &mod, int32 indent) const { LogInfo::MapleLogger() << '\n'; PrintIndentation(indent + 1); GetNopndAt(0)->Dump(mod, indent + 1); - for (size_t i = 1; i < GetNopndSize(); i++) { + for (size_t i = 1; i < GetNopndSize(); ++i) { LogInfo::MapleLogger() << ",\n"; PrintIndentation(indent + 1); GetNopndAt(i)->Dump(mod, indent + 1); @@ -400,7 +396,7 @@ void NaryOpnds::Dump(const MIRModule &mod, int32 indent) const { bool NaryOpnds::VerifyOpnds() const { bool nOpndsVerify = true; - for (size_t i = 0; i < GetNopndSize(); i++) { + for (size_t i = 0; i < GetNopndSize(); ++i) { if (!GetNopndAt(i)->Verify()) { nOpndsVerify = false; break; @@ -414,18 +410,24 @@ void NaryNode::Dump(const MIRModule &mod, int32 indent) const { NaryOpnds::Dump(mod, indent); } -MIRType *ArrayNode::GetArrayType(const TypeTable &tt) const { - MIRType *type = tt.GetTypeFromTyIdx(tyIdx); +const MIRType *ArrayNode::GetArrayType(const TypeTable &tt) const { + const MIRType *type = tt.GetTypeFromTyIdx(tyIdx); CHECK_FATAL(type->GetKind() == kTypePointer, "expect array type pointer"); - auto *pointType = static_cast(type); + const auto *pointType = static_cast(type); return tt.GetTypeFromTyIdx(pointType->GetPointedTyIdx()); } +MIRType *ArrayNode::GetArrayType(const TypeTable &tt) { + return const_cast(const_cast(this)->GetArrayType(tt)); +} -BaseNode *ArrayNode::GetDim(const MIRModule &mod, const TypeTable &tt, int i) const { - auto *arrayType = static_cast(GetArrayType(tt)); +const BaseNode *ArrayNode::GetDim(const MIRModule &mod, TypeTable &tt, int i) const { + const auto *arrayType = static_cast(GetArrayType(tt)); auto *mirConst = mod.CurFuncCodeMemPool()->New(*tt.GetTypeFromTyIdx(arrayType->GetElemTyIdx())); return mod.CurFuncCodeMemPool()->New(mirConst); } +BaseNode *ArrayNode::GetDim(const MIRModule &mod, TypeTable &tt, int i) { + return const_cast(const_cast(this)->GetDim(mod, tt, i)); +} void ArrayNode::Dump(const MIRModule &mod, int32 indent) const { PrintIndentation(0); @@ -514,22 +516,29 @@ void RegreadNode::Dump(const MIRModule &mod, int32 indent) const { if (regIdx >= 0) { LogInfo::MapleLogger() << " %" << mod.CurFunction()->GetPregTab()->PregFromPregIdx(static_cast(regIdx))->GetPregNo(); - } else { - LogInfo::MapleLogger() << " %%"; - if (regIdx == -kSregSp) { + return; + } + LogInfo::MapleLogger() << " %%"; + switch (regIdx) { + case -kSregSp: LogInfo::MapleLogger() << "SP"; - } else if (regIdx == -kSregFp) { + break; + case -kSregFp: LogInfo::MapleLogger() << "FP"; - } else if (regIdx == -kSregGp) { + break; + case -kSregGp: LogInfo::MapleLogger() << "GP"; - } else if (regIdx == -kSregThrownval) { + break; + case -kSregThrownval: LogInfo::MapleLogger() << "thrownval"; - } else if (regIdx == -kSregMethodhdl) { + break; + case -kSregMethodhdl: LogInfo::MapleLogger() << "methodhdl"; - } else { + break; + default: int32 retValIdx = (-regIdx) - kSregRetval0; LogInfo::MapleLogger() << "retval" << retValIdx; - } + break; } } @@ -617,18 +626,28 @@ void RegassignNode::Dump(const MIRModule &mod, int32 indent) const { << " %" << mod.CurFunction()->GetPregTab()->PregFromPregIdx(static_cast(regIdx))->GetPregNo(); } else { LogInfo::MapleLogger() << " %%"; - if (regIdx == -kSregSp) { - LogInfo::MapleLogger() << "SP"; - } else if (regIdx == -kSregFp) { - LogInfo::MapleLogger() << "FP"; - } else if (regIdx == -kSregGp) { - LogInfo::MapleLogger() << "GP"; - } else if (regIdx == -kSregThrownval) { - LogInfo::MapleLogger() << "thrownval"; - } else if (regIdx == -kSregMethodhdl) { - LogInfo::MapleLogger() << "methodhdl"; - } else if (regIdx == -kSregRetval0) { - LogInfo::MapleLogger() << "retval0"; + switch (regIdx) { + case -kSregSp: + LogInfo::MapleLogger() << "SP"; + break; + case -kSregFp: + LogInfo::MapleLogger() << "FP"; + break; + case -kSregGp: + LogInfo::MapleLogger() << "GP"; + break; + case -kSregThrownval: + LogInfo::MapleLogger() << "thrownval"; + break; + case -kSregMethodhdl: + LogInfo::MapleLogger() << "methodhdl"; + break; + case -kSregRetval0: + LogInfo::MapleLogger() << "retval0"; + break; + // no default + default: + break; } } LogInfo::MapleLogger() << " ("; @@ -697,7 +716,7 @@ void JsTryNode::Dump(const MIRModule &mod, int32 indent) const { void TryNode::Dump(const MIRModule &mod, int32 indent) const { StmtNode::DumpBase(mod, indent); LogInfo::MapleLogger() << " {"; - for (size_t i = 0; i < offsets.size(); i++) { + for (size_t i = 0; i < offsets.size(); ++i) { int64 offset = offsets[i]; LogInfo::MapleLogger() << " @" << mod.CurFunction()->GetLabelName((LabelIdx)offset); } @@ -928,8 +947,8 @@ void DumpCallReturns(const MIRModule &mod, CallReturnVector nrets, int32 indent) LogInfo::MapleLogger() << (stIdx.Islocal() ? " %" : " $"); LogInfo::MapleLogger() << st->GetName() << " " << fieldID << '\n'; } else { - PregIdx16 regidx = regFieldPair.GetPregIdx(); - const MIRPreg *mirPreg = mirFunc->GetPregItem(static_cast(regidx)); + PregIdx16 regIdx = regFieldPair.GetPregIdx(); + const MIRPreg *mirPreg = mirFunc->GetPregItem(static_cast(regIdx)); ASSERT(mirPreg != nullptr, "mirPreg is null"); LogInfo::MapleLogger() << "regassign" << " " << GetPrimTypeName(mirPreg->GetPrimType()); @@ -952,10 +971,10 @@ const MIRSymbol *CallNode::GetCallReturnSymbol(const MIRModule &mod) const { if (!kOpcodeInfo.IsCallAssigned(GetOpCode())) { return nullptr; } - const CallReturnVector &nrets = this->GetReturnVec(); - if (nrets.size() == 1) { - StIdx stIdx = nrets.begin()->first; - RegFieldPair regFieldPair = nrets.begin()->second; + const CallReturnVector &nRets = this->GetReturnVec(); + if (nRets.size() == 1) { + StIdx stIdx = nRets.begin()->first; + RegFieldPair regFieldPair = nRets.begin()->second; if (!regFieldPair.IsReg()) { const MIRFunction *mirFunc = mod.CurFunction();; const MIRSymbol *st = mirFunc->GetLocalOrGlobalSymbol(stIdx); @@ -1127,7 +1146,7 @@ bool ArithTypeVerify(const BaseNode &opnd) { bool verifyResult = ExcludeSmallIntTypeVerify(opnd); if (!verifyResult) { LogInfo::MapleLogger() << "\n#Error:u1,i8,u8,i16,u16 should not be used as types of arithmetic operations\n"; - opnd.Dump(*theModule); + opnd.Dump(*theMIRModule); } return verifyResult; } @@ -1137,25 +1156,25 @@ inline bool ReadTypeVerify(const BaseNode &opnd) { if (!verifyResult) { LogInfo::MapleLogger() << "\n#Error:u1,i8,u8,i16,u16 should not be used as result types for dread/iread/regread/ireadoff/ireadfpoff\n"; - opnd.Dump(*theModule); + opnd.Dump(*theMIRModule); } return verifyResult; } -inline bool IntTypeVerify(PrimType ptyp) { - return ptyp == PTY_i32 || ptyp == PTY_u32 || ptyp == PTY_i64 || ptyp == PTY_u64; +inline bool IntTypeVerify(PrimType pTyp) { + return pTyp == PTY_i32 || pTyp == PTY_u32 || pTyp == PTY_i64 || pTyp == PTY_u64; } -inline bool UnaryTypeVerify0(PrimType ptyp) { - bool verifyResult = IntTypeVerify(ptyp); +inline bool UnaryTypeVerify0(PrimType pTyp) { + bool verifyResult = IntTypeVerify(pTyp); if (!verifyResult) { LogInfo::MapleLogger() << "\n#Error:result type of bnot,extractbits,sext,zext must be in [i32,u32,i64,u64]\n"; } return verifyResult; } -bool ArithResTypeVerify(PrimType ptyp) { - switch (ptyp) { +bool ArithResTypeVerify(PrimType pTyp) { + switch (pTyp) { case PTY_i32: case PTY_u32: case PTY_i64: @@ -1166,31 +1185,31 @@ bool ArithResTypeVerify(PrimType ptyp) { case PTY_a32: case PTY_a64: case PTY_ptr: - return theModule->IsCModule(); + return theMIRModule->IsCModule(); default: break; } return false; } -inline bool UnaryTypeVerify1(PrimType ptyp) { - bool verifyResult = ArithResTypeVerify(ptyp); +inline bool UnaryTypeVerify1(PrimType pType) { + bool verifyResult = ArithResTypeVerify(pType); if (!verifyResult) { LogInfo::MapleLogger() << "\n#Error:result type of abs,neg must be in [i32,u32,i64,u64,f32,f64]\n"; } return verifyResult; } -inline bool UnaryTypeVerify2(PrimType ptyp) { - bool verifyResult = IsPrimitiveFloat(ptyp); +inline bool UnaryTypeVerify2(PrimType pType) { + bool verifyResult = IsPrimitiveFloat(pType); if (!verifyResult) { LogInfo::MapleLogger() << "\n#Error:result-type of recip,sqrt must be in [f32,f64]\n"; } return verifyResult; } -inline bool BinaryTypeVerify(PrimType ptyp) { - return ArithResTypeVerify(ptyp) || IsPrimitiveDynType(ptyp); +inline bool BinaryTypeVerify(PrimType pType) { + return ArithResTypeVerify(pType) || IsPrimitiveDynType(pType); } inline bool BinaryGenericVerify(const BaseNode &bOpnd0, const BaseNode &bOpnd1) { @@ -1260,14 +1279,14 @@ bool CompatibleTypeVerify(const BaseNode &opnd1, const BaseNode &opnd2) { uint8 groupID1 = GetCompGroupID(opnd1); uint8 groupID2 = GetCompGroupID(opnd2); Opcode opCode2 = opnd2.GetOpCode(); - bool verifyResult = groupID1 == groupID2; + bool verifyResult = (groupID1 == groupID2); if (opCode2 == OP_gcmallocjarray || opCode2 == OP_gcpermallocjarray) { - verifyResult = groupID1 == kPTYGi32u32a32; + verifyResult = (groupID1 == kPTYGi32u32a32); } if (!verifyResult) { LogInfo::MapleLogger() << "\n#Error:incompatible operand types :\n"; - opnd1.Dump(*theModule); - opnd2.Dump(*theModule); + opnd1.Dump(*theMIRModule); + opnd2.Dump(*theMIRModule); } return verifyResult; } @@ -1285,7 +1304,7 @@ bool FloatIntCvtTypeVerify(PrimType resPType, PrimType opndPType) { } inline MIRTypeKind GetTypeKind(StIdx stIdx) { - const MIRSymbol *var = theModule->CurFunction()->GetLocalOrGlobalSymbol(stIdx); + const MIRSymbol *var = theMIRModule->CurFunction()->GetLocalOrGlobalSymbol(stIdx); ASSERT(var != nullptr, "null ptr check"); MIRType *type = var->GetType(); ASSERT(type != nullptr, "null ptr check"); @@ -1311,7 +1330,7 @@ inline MIRTypeKind GetPointedTypeKind(TyIdx tyIdx) { return pointedType->GetKind(); } -bool GetFieldType(MIRSrcLang srcLang, const MIRStructType *structType, FieldID targetFid, TyIdx &tid) { +bool GetFieldType(MIRSrcLang srcLang, const MIRStructType *structType, FieldID targetFid, TyIdx &tyIdx) { if (structType == nullptr) { return false; } @@ -1322,8 +1341,7 @@ bool GetFieldType(MIRSrcLang srcLang, const MIRStructType *structType, FieldID t std::stack inheritChain; TyIdx parentTyIdx = classType->GetParentTyIdx(); while (parentTyIdx.GetIdx() > 0) { - auto *parentType = - static_cast(GlobalTables::GetTypeTable().GetTypeFromTyIdx(parentTyIdx)); + auto *parentType = static_cast(GlobalTables::GetTypeTable().GetTypeFromTyIdx(parentTyIdx)); inheritChain.push(parentType); parentTyIdx = static_cast(parentType)->GetParentTyIdx(); } @@ -1331,7 +1349,7 @@ bool GetFieldType(MIRSrcLang srcLang, const MIRStructType *structType, FieldID t while (!inheritChain.empty()) { auto *curClassType = static_cast(inheritChain.top()); if (static_cast(targetFid) > 0 && static_cast(targetFid) <= curClassType->GetFieldsSize()) { - tid = curClassType->GetFieldsElemt(targetFid - 1).second.first; + tyIdx = curClassType->GetFieldsElemt(targetFid - 1).second.first; return true; } else { targetFid -= curClassType->GetFieldsSize(); @@ -1339,7 +1357,7 @@ bool GetFieldType(MIRSrcLang srcLang, const MIRStructType *structType, FieldID t inheritChain.pop(); } if (static_cast(targetFid) > 0 && static_cast(targetFid) <= classType->GetFieldsSize()) { - tid = classType->GetFieldsElemt(targetFid - 1).second.first; + tyIdx = classType->GetFieldsElemt(targetFid - 1).second.first; return true; } } @@ -1350,7 +1368,7 @@ bool GetFieldType(MIRSrcLang srcLang, const MIRStructType *structType, FieldID t MIRTypeKind GetFieldTypeKind(const MIRStructType *structType, FieldID fieldId) { TyIdx fieldTyIdx; if (fieldId > 0) { - bool isValid = GetFieldType(theModule->GetSrcLang(), structType, fieldId, fieldTyIdx); + bool isValid = GetFieldType(theMIRModule->GetSrcLang(), structType, fieldId, fieldTyIdx); // when mpl does not have complete class info if (!isValid) { LogInfo::MapleLogger() << "\n#Error:field not found, must have complete class info\n"; @@ -1369,21 +1387,17 @@ inline bool IsStructureTypeKind(MIRTypeKind kind) { } inline bool IsStructureVerify(FieldID fieldID, StIdx stIdx) { - if (fieldID != 0) { - if (!IsStructureTypeKind(GetTypeKind(stIdx))) { - LogInfo::MapleLogger() << "\n#Error:if fieldID is not 0, the variable must be a structure\n"; - return false; - } + if ((fieldID != 0) && (!IsStructureTypeKind(GetTypeKind(stIdx)))) { + LogInfo::MapleLogger() << "\n#Error:if fieldID is not 0, the variable must be a structure\n"; + return false; } return true; } inline bool IsStructureVerify(FieldID fieldID, TyIdx tyIdx) { - if (fieldID != 0) { - if (!IsStructureTypeKind(GetTypeKind(tyIdx))) { - LogInfo::MapleLogger() << "\n#Error:if fieldID is not 0, the variable must be a structure\n"; - return false; - } + if ((fieldID != 0) && (!IsStructureTypeKind(GetTypeKind(tyIdx)))) { + LogInfo::MapleLogger() << "\n#Error:if fieldID is not 0, the variable must be a structure\n"; + return false; } return true; } @@ -1488,9 +1502,9 @@ bool IreadNode::Verify() const { LogInfo::MapleLogger() << "\n#Error:If field-id is not 0, then type must specify pointer to a structure\n"; } else { MIRType *type = GetPointedMIRType(tyIdx); - auto *stty = static_cast(type); - if (GetOpCode() == OP_iread && stty->GetFieldsSize() != 0) { - if (IsStructureTypeKind(GetFieldTypeKind(stty, fieldID))) { + auto *stTy = static_cast(type); + if (GetOpCode() == OP_iread && stTy->GetFieldsSize() != 0) { + if (IsStructureTypeKind(GetFieldTypeKind(stTy, fieldID))) { if (GetPrimType() != PTY_agg) { pTypeVerf = false; LogInfo::MapleLogger() << "\n#Error:If the field itself is a structure, prim-type should specify agg\n"; @@ -1534,18 +1548,18 @@ bool ExtractbitsNode::Verify() const { bool BinaryNode::Verify() const { bool opndsVerf = BinaryGenericVerify(*GetBOpnd(0), *GetBOpnd(1)); bool resTypeVerf = BinaryTypeVerify(GetPrimType()); - if (!resTypeVerf && theModule->IsCModule()) { + if (!resTypeVerf && theMIRModule->IsCModule()) { if ((IsAddress(GetBOpnd(0)->GetPrimType()) && !IsAddress(GetBOpnd(1)->GetPrimType())) || (!IsAddress(GetBOpnd(0)->GetPrimType()) && IsAddress(GetBOpnd(1)->GetPrimType()))) { resTypeVerf = true; // don't print the same kind of error message twice if (GetOpCode() != OP_add && GetOpCode() != OP_sub) { LogInfo::MapleLogger() << "\n#Error: Only add and sub are allowed for pointer arithemetic\n"; - this->Dump(*theModule); + this->Dump(*theMIRModule); } else if (!IsAddress(GetPrimType())) { LogInfo::MapleLogger() << "\n#Error: Adding an offset to a pointer or subtracting one from a pointer should result in a pointer " "value\n"; - this->Dump(*theModule); + this->Dump(*theMIRModule); } } } @@ -1553,7 +1567,7 @@ bool BinaryNode::Verify() const { LogInfo::MapleLogger() << "\n#Error:result type of [add,div,sub,mul,max,min] and [ashr,band,bior,bxor,land,lior,lshr,shl,rem] must " "be in [i32,u32,i64,u64,f32,f64,dynamic-type]\n"; - this->Dump(*theModule); + this->Dump(*theMIRModule); } bool comp0Verf = CompatibleTypeVerify(*GetBOpnd(0), *this); bool comp1Verf = CompatibleTypeVerify(*GetBOpnd(1), *this); @@ -1577,7 +1591,7 @@ bool CompareNode::Verify() const { bool compVerf = CompatibleTypeVerify(*GetBOpnd(0), *GetBOpnd(1)); bool resTypeVerf = CompareTypeVerify(GetPrimType()); if (!resTypeVerf) { - this->Dump(*theModule); + this->Dump(*theMIRModule); } bool signVerf = true; bool typeVerf = compVerf && resTypeVerf; @@ -1630,7 +1644,7 @@ bool ArrayNode::Verify() const { if (!opnd0TypeVerf) { LogInfo::MapleLogger() << "\n#Error:result-type of array-opnd0 must be in [ptr,ref,a32,a64]\n"; } - for (size_t i = 1; i < NumOpnds(); i++) { + for (size_t i = 1; i < NumOpnds(); ++i) { if (!IntTypeVerify(GetNopndAt(i)->GetPrimType())) { opndsTypeVerf = false; LogInfo::MapleLogger() << "\n#Error:result of the array index operands must be in [i32,u32,i64,u64]\n"; @@ -1657,10 +1671,10 @@ bool AddrofNode::Verify() const { } } if (fieldID != 0 && structVerf) { - const MIRSymbol *var = theModule->CurFunction()->GetLocalOrGlobalSymbol(GetStIdx()); + const MIRSymbol *var = theMIRModule->CurFunction()->GetLocalOrGlobalSymbol(GetStIdx()); MIRType *type = var->GetType(); - auto *stty = static_cast(type); - if (IsStructureTypeKind(GetFieldTypeKind(stty, fieldID))) { + auto *stTy = static_cast(type); + if (IsStructureTypeKind(GetFieldTypeKind(stTy, fieldID))) { if (GetPrimType() != PTY_agg) { pTypeVerf = false; LogInfo::MapleLogger() << "\n#Error:if the field itself is a structure, prim-type should specify agg\n"; @@ -1816,7 +1830,7 @@ bool CallNode::Verify() const { bool IcallNode::Verify() const { bool nOpndsVerf = true; - for (size_t i = 0; i < NumOpnds(); i++) { + for (size_t i = 0; i < NumOpnds(); ++i) { if (!GetNopndAt(i)->Verify()) { nOpndsVerf = false; break; diff --git a/src/maple_ir/src/mir_parser.cpp b/src/maple_ir/src/mir_parser.cpp index df1a3e9ea0af67674ff46a62d01226f0567ad447..622a8eb9e90c34db5f484adb77c07f842e58e365 100644 --- a/src/maple_ir/src/mir_parser.cpp +++ b/src/maple_ir/src/mir_parser.cpp @@ -41,11 +41,11 @@ bool MIRParser::ParseStmtDassign(StmtNodePtr &stmt) { } auto *assignStmt = mod.CurFuncCodeMemPool()->New(); assignStmt->SetStIdx(stidx); - TokenKind ntk = lexer.NextToken(); + TokenKind nextToken = lexer.NextToken(); // parse field id - if (ntk == kTkIntconst) { // may be a field id + if (nextToken == kTkIntconst) { // may be a field id assignStmt->SetFieldID(lexer.GetTheIntVal()); - ntk = lexer.NextToken(); + (void)lexer.NextToken(); } // parse expression like (constval i32 0) BaseNode *expr = nullptr; @@ -232,7 +232,7 @@ bool MIRParser::ParseStmtDoloop(StmtNodePtr &stmt) { return false; } if (doLoopNode->IsPreg()) { - PregIdx regIdx = (PregIdx)doLoopNode->GetDoVarStIdx().FullIdx(); + auto regIdx = static_cast(doLoopNode->GetDoVarStIdx().FullIdx()); MIRPreg *mpReg = mod.CurFunction()->GetPregTab()->PregFromPregIdx(regIdx); if (mpReg->GetPrimType() == kPtyInvalid) { CHECK_FATAL(start != nullptr, "null ptr check"); @@ -921,7 +921,7 @@ bool MIRParser::ParseStmtIntrinsiccallassigned(StmtNodePtr &stmt) { } bool MIRParser::ParseStmtIntrinsiccallwithtype(StmtNodePtr &stmt, bool isAssigned) { - Opcode o = !isAssigned ? OP_intrinsiccallwithtype : OP_intrinsiccallwithtypeassigned; + Opcode o = (!isAssigned) ? OP_intrinsiccallwithtype : OP_intrinsiccallwithtypeassigned; IntrinsiccallNode *intrnCallNode = mod.CurFuncCodeMemPool()->New(mod, o); TokenKind tk = lexer.NextToken(); TyIdx tyIdx(0); @@ -1007,7 +1007,7 @@ bool MIRParser::ParseCallReturns(CallReturnVector &retsvec) { ASSERT(lSym != nullptr, "lsym MIRSymbol is null"); if (lSym->GetName().find("L_STR") == 0) { MIRType *ty = GlobalTables::GetTypeTable().GetTypeFromTyIdx(lSym->GetTyIdx()); - MIRPtrType *ptrTy = static_cast(ty->CopyMIRTypeNode()); + auto *ptrTy = static_cast(ty->CopyMIRTypeNode()); ASSERT(ptrTy != nullptr, "null ptr check"); ptrTy->SetPrimType(PTY_ptr); TyIdx newTyidx = GlobalTables::GetTypeTable().GetOrCreateMIRType(ptrTy); @@ -1020,9 +1020,9 @@ bool MIRParser::ParseCallReturns(CallReturnVector &retsvec) { return false; } uint16 fieldId = 0; - TokenKind ntk = lexer.NextToken(); + TokenKind nextToken = lexer.NextToken(); // parse field id - if (ntk == kTkIntconst) { + if (nextToken == kTkIntconst) { fieldId = lexer.GetTheIntVal(); } else { Error("expect a fieldID parsing ParseCallAssignedStmts. "); @@ -1438,7 +1438,7 @@ bool MIRParser::ParseStmtBlock(BlockNodePtr &blk) { void MIRParser::ParseStmtBlockForSeenComment(BlockNodePtr blk, uint32 mplNum) { // collect accumulated comments into comment statement nodes if (!lexer.seenComments.empty()) { - for (size_t i = 0; i < lexer.seenComments.size(); i++) { + for (size_t i = 0; i < lexer.seenComments.size(); ++i) { auto *cmnt = mod.CurFuncCodeMemPool()->New(mod); cmnt->SetComment(lexer.seenComments[i]); SetSrcPos(cmnt, mplNum); @@ -2636,8 +2636,8 @@ bool MIRParser::ParseConstAddrLeafExpr(MIRConstPtr &cexpr, MIRType &type) { return false; } if (expr->GetOpCode() == OP_addrof) { - AddrofNode *anode = static_cast(expr); - MIRFunction *currFn = static_cast(mod.CurFunction()); + auto *anode = static_cast(expr); + auto *currFn = static_cast(mod.CurFunction()); MIRSymbol *var = currFn->GetLocalOrGlobalSymbol(anode->GetStIdx()); var->SetNeedForwDecl(); mod.SetSomeSymbolNeedForDecl(true); @@ -2647,7 +2647,7 @@ bool MIRParser::ParseConstAddrLeafExpr(MIRConstPtr &cexpr, MIRType &type) { MIRType *exprTy = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ptyIdx); cexpr = mod.CurFuncCodeMemPool()->New(anode->GetStIdx(), anode->GetFieldID(), *exprTy); } else if (expr->GetOpCode() == OP_addroffunc) { - AddroffuncNode *aof = static_cast(expr); + auto *aof = static_cast(expr); MIRFunction *f = GlobalTables::GetFunctionTable().GetFunctionFromPuidx(aof->GetPUIdx()); const MIRSymbol *fName = f->GetFuncSymbol(); TyIdx ptyIdx = fName->GetTyIdx(); @@ -2656,7 +2656,7 @@ bool MIRParser::ParseConstAddrLeafExpr(MIRConstPtr &cexpr, MIRType &type) { MIRType *exprTy = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ptyIdx); cexpr = mod.CurFuncCodeMemPool()->New(aof->GetPUIdx(), *exprTy); } else if (expr->GetOpCode() == OP_conststr) { - ConststrNode *cs = static_cast(expr); + auto *cs = static_cast(expr); UStrIdx stridx = cs->GetStrIdx(); TyIdx ptyIdx = GlobalTables::GetTypeTable().GetTypeFromTyIdx(TyIdx(PTY_u8))->GetTypeIndex(); MIRPtrType ptrtype(ptyIdx); @@ -2664,7 +2664,7 @@ bool MIRParser::ParseConstAddrLeafExpr(MIRConstPtr &cexpr, MIRType &type) { MIRType *exprty = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ptyIdx); cexpr = mod.CurFuncCodeMemPool()->New(stridx, *exprty); } else { - Conststr16Node *cs = static_cast(expr); + auto *cs = static_cast(expr); U16StrIdx stridx = cs->GetStrIdx(); TyIdx ptyIdx = GlobalTables::GetTypeTable().GetTypeFromTyIdx(TyIdx(PTY_u16))->GetTypeIndex(); MIRPtrType ptrType(ptyIdx); diff --git a/src/maple_ir/src/mir_symbol.cpp b/src/maple_ir/src/mir_symbol.cpp index 27465360fb99179a281f39ef2fec4a6e897b09de..985f0b1df196b4c2cb2376eb837ecb25aef11339 100644 --- a/src/maple_ir/src/mir_symbol.cpp +++ b/src/maple_ir/src/mir_symbol.cpp @@ -22,6 +22,7 @@ #include "printing.h" #include "native_stub_func.h" #include "literal_str_name.h" +#include "string_utils.h" namespace maple { using namespace NameMangler; @@ -31,18 +32,20 @@ void MIRSymbol::SetNameStrIdx(const std::string &name) { } bool MIRSymbol::HasAddrOfValues() const { - return (GetName().find(VTAB_PREFIX_STR) == 0 || GetName().find(ITAB_PREFIX_STR) == 0 || - GetName().find(kVtabOffsetTabStr) == 0 || IsClassInitBridge() || IsReflectionInfo() || - IsReflectionHashTabBucket() || IsReflectionStrTab() || IsITabConflictInfo() || IsRegJNITab() || - IsRegJNIFuncTab() || IsLiteral()); + return StringUtils::StartsWith(GetName(), VTAB_PREFIX_STR) || + StringUtils::StartsWith(GetName(), ITAB_PREFIX_STR) || + StringUtils::StartsWith(GetName(), kVtabOffsetTabStr) || + IsClassInitBridge() || IsReflectionInfo() || IsReflectionHashTabBucket() || + IsReflectionStrTab() || IsITabConflictInfo() || IsRegJNITab() || + IsRegJNIFuncTab() || IsLiteral(); } bool MIRSymbol::IsLiteral() const { - return GetName().find(kConstString) == 0; + return StringUtils::StartsWith(GetName(), kConstString); } bool MIRSymbol::IsLiteralPtr() const { - return GetName().find(kConstStringPtr) == 0; + return StringUtils::StartsWith(GetName(), kConstStringPtr); } MIRType *MIRSymbol::GetType() const { @@ -66,27 +69,27 @@ bool MIRSymbol::IsConstString() const { } bool MIRSymbol::IsReflectionStrTab() const { - return (GetName().find(kReflectionStrtabPrefixStr) == 0) || - (GetName().find(kReflectionStartHotStrtabPrefixStr) == 0) || - (GetName().find(kReflectionBothHotStrTabPrefixStr) == 0) || - (GetName().find(kReflectionRunHotStrtabPrefixStr) == 0) || - (GetName().find(kReflectionNoEmitStrtabPrefixStr) == 0); + return StringUtils::StartsWith(GetName(), kReflectionStrtabPrefixStr) || + StringUtils::StartsWith(GetName(), kReflectionStartHotStrtabPrefixStr) || + StringUtils::StartsWith(GetName(), kReflectionBothHotStrTabPrefixStr) || + StringUtils::StartsWith(GetName(), kReflectionRunHotStrtabPrefixStr) || + StringUtils::StartsWith(GetName(), kReflectionNoEmitStrtabPrefixStr); } bool MIRSymbol::IsRegJNITab() const { - return GetName().find(kRegJNITabPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kRegJNITabPrefixStr); } bool MIRSymbol::IsRegJNIFuncTab() const { - return GetName().find(kRegJNIFuncTabPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kRegJNIFuncTabPrefixStr); } bool MIRSymbol::IsMuidTab() const { - return GetName().find(kMuidPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kMuidPrefixStr); } bool MIRSymbol::IsCodeLayoutInfo() const { - return GetName().find(kFunctionLayoutStr) == 0; + return StringUtils::StartsWith(GetName(), kFunctionLayoutStr); } std::string MIRSymbol::GetMuidTabName() const { @@ -98,59 +101,59 @@ std::string MIRSymbol::GetMuidTabName() const { } bool MIRSymbol::IsMuidFuncDefTab() const { - return GetName().find(kMuidFuncDefTabPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kMuidFuncDefTabPrefixStr); } bool MIRSymbol::IsMuidFuncDefOrigTab() const { - return GetName().find(kMuidFuncDefOrigTabPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kMuidFuncDefOrigTabPrefixStr); } bool MIRSymbol::IsMuidFuncInfTab() const { - return GetName().find(kMuidFuncInfTabPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kMuidFuncInfTabPrefixStr); } bool MIRSymbol::IsMuidFuncUndefTab() const { - return GetName().find(kMuidFuncUndefTabPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kMuidFuncUndefTabPrefixStr); } bool MIRSymbol::IsMuidDataDefTab() const { - return GetName().find(kMuidDataDefTabPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kMuidDataDefTabPrefixStr); } bool MIRSymbol::IsMuidDataDefOrigTab() const { - return GetName().find(kMuidDataDefOrigTabPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kMuidDataDefOrigTabPrefixStr); } bool MIRSymbol::IsMuidDataUndefTab() const { - return GetName().find(kMuidDataUndefTabPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kMuidDataUndefTabPrefixStr); } bool MIRSymbol::IsMuidFuncDefMuidTab() const { - return GetName().find(kMuidFuncDefMuidTabPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kMuidFuncDefMuidTabPrefixStr); } bool MIRSymbol::IsMuidFuncUndefMuidTab() const { - return GetName().find(kMuidFuncUndefMuidTabPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kMuidFuncUndefMuidTabPrefixStr); } bool MIRSymbol::IsMuidDataDefMuidTab() const { - return GetName().find(kMuidDataDefMuidTabPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kMuidDataDefMuidTabPrefixStr); } bool MIRSymbol::IsMuidDataUndefMuidTab() const { - return GetName().find(kMuidDataUndefMuidTabPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kMuidDataUndefMuidTabPrefixStr); } bool MIRSymbol::IsMuidRangeTab() const { - return GetName().find(kMuidRangeTabPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kMuidRangeTabPrefixStr); } bool MIRSymbol::IsClassInitBridge() const { - return GetName().find(CLASS_INIT_BRIDGE_PREFIX_STR) == 0; + return StringUtils::StartsWith(GetName(), CLASS_INIT_BRIDGE_PREFIX_STR); } bool MIRSymbol::IsReflectionHashTabBucket() const { - return GetName().compare(0, strlen(kMuidClassMetadataBucketPrefixStr), kMuidClassMetadataBucketPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kMuidClassMetadataBucketPrefixStr); } bool MIRSymbol::IsReflectionInfo() const { @@ -160,59 +163,59 @@ bool MIRSymbol::IsReflectionInfo() const { } bool MIRSymbol::IsReflectionFieldsInfo() const { - return GetName().find(kFieldsInfoPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kFieldsInfoPrefixStr); } bool MIRSymbol::IsReflectionFieldsInfoCompact() const { - return GetName().find(kFieldsInfoCompactPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kFieldsInfoCompactPrefixStr); } bool MIRSymbol::IsReflectionSuperclassInfo() const { - return GetName().find(SUPERCLASSINFO_PREFIX_STR) == 0; + return StringUtils::StartsWith(GetName(), SUPERCLASSINFO_PREFIX_STR); } bool MIRSymbol::IsReflectionFieldOffsetData() const { - return (GetName().find(kFieldOffsetDataPrefixStr) == 0); + return StringUtils::StartsWith(GetName(), kFieldOffsetDataPrefixStr); } bool MIRSymbol::IsReflectionClassInfo() const { - return GetName().find(CLASSINFO_PREFIX_STR) == 0; + return StringUtils::StartsWith(GetName(), CLASSINFO_PREFIX_STR); } bool MIRSymbol::IsReflectionArrayClassInfo() const { - return GetName().find(kArrayClassInfoPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kArrayClassInfoPrefixStr); } bool MIRSymbol::IsReflectionClassInfoPtr() const { - return GetName().find(kClassINfoPtrPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kClassINfoPtrPrefixStr); } bool MIRSymbol::IsReflectionClassInfoRO() const { - return GetName().find(CLASSINFO_RO_PREFIX_STR) == 0; + return StringUtils::StartsWith(GetName(), CLASSINFO_RO_PREFIX_STR); } bool MIRSymbol::IsITabConflictInfo() const { - return GetName().find(ITAB_CONFLICT_PREFIX_STR) == 0; + return StringUtils::StartsWith(GetName(), ITAB_CONFLICT_PREFIX_STR); } bool MIRSymbol::IsVTabInfo() const { - return GetName().find(VTAB_PREFIX_STR) == 0; + return StringUtils::StartsWith(GetName(), VTAB_PREFIX_STR); } bool MIRSymbol::IsITabInfo() const { - return GetName().find(ITAB_PREFIX_STR) == 0; + return StringUtils::StartsWith(GetName(), ITAB_PREFIX_STR); } bool MIRSymbol::IsReflectionPrimitiveClassInfo() const { - return GetName().find(PRIMITIVECLASSINFO_PREFIX_STR) == 0; + return StringUtils::StartsWith(GetName(), PRIMITIVECLASSINFO_PREFIX_STR); } bool MIRSymbol::IsReflectionMethodsInfo() const { - return GetName().find(kMethodsInfoPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kMethodsInfoPrefixStr); } bool MIRSymbol::IsReflectionMethodsInfoCompact() const { - return GetName().find(kMethodsInfoCompactPrefixStr) == 0; + return StringUtils::StartsWith(GetName(), kMethodsInfoCompactPrefixStr); } bool MIRSymbol::IsPrimordialObject() const { @@ -220,7 +223,7 @@ bool MIRSymbol::IsPrimordialObject() const { } bool MIRSymbol::IsGctibSym() const { - return GetName().find(GCTIB_PREFIX_STR) == 0; + return StringUtils::StartsWith(GetName(), GCTIB_PREFIX_STR); } // [Note] @@ -353,8 +356,7 @@ bool MIRLabelTable::AddToStringLabelMap(LabelIdx labelIdx) { // generate a label name based on lab_idx std::ostringstream labelNameStream; labelNameStream << "@" << labelIdx; - std::string labelName; - labelName = labelNameStream.str(); + std::string labelName = labelNameStream.str(); labelTable[labelIdx] = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(labelName); } GStrIdx strIdx = labelTable[labelIdx]; diff --git a/src/maple_ir/src/mir_symbol_builder.cpp b/src/maple_ir/src/mir_symbol_builder.cpp index 425c1b9a8fe76a1b5e44a743b988c4186519f1f2..81b1c883457ae38dd22c72d131ff9e04ef4453bf 100644 --- a/src/maple_ir/src/mir_symbol_builder.cpp +++ b/src/maple_ir/src/mir_symbol_builder.cpp @@ -17,7 +17,7 @@ #include namespace maple { -MIRSymbol *MIRSymbolBuilder::GetLocalDecl(const MIRSymbolTable &symbolTable, GStrIdx strIdx) const { +MIRSymbol *MIRSymbolBuilder::GetLocalDecl(MIRSymbolTable &symbolTable, GStrIdx strIdx) const { if (strIdx != 0) { StIdx stIdx = symbolTable.GetStIdxFromStrIdx(strIdx); if (stIdx.FullIdx() != 0) { diff --git a/src/maple_ir/src/mir_type.cpp b/src/maple_ir/src/mir_type.cpp index 629d4afdd7b967ac8e68e45775a236565715092b..4ac0a5ccccd2b170df6c17de2be9753094e2adc8 100644 --- a/src/maple_ir/src/mir_type.cpp +++ b/src/maple_ir/src/mir_type.cpp @@ -13,9 +13,7 @@ * See the Mulan PSL v1 for more details. */ #include "mir_type.h" -#include #include -#include #include #include "mir_symbol.h" #include "printing.h" @@ -427,12 +425,12 @@ bool MIRType::IsOfSameType(MIRType &type) { return GlobalTables::GetTypeTable().GetTypeFromTyIdx(ptrType.GetPointedTyIdx())->IsOfSameType(mirTypeIt); } } else if (typeKind == kTypeJArray) { - auto &atype1 = static_cast(*this); - auto &atype2 = static_cast(type); - if (atype1.GetDim() != atype2.GetDim()) { + auto &arrType1 = static_cast(*this); + auto &arrType2 = static_cast(type); + if (arrType1.GetDim() != arrType2.GetDim()) { return false; } - return atype1.GetElemType()->IsOfSameType(*atype2.GetElemType()); + return arrType1.GetElemType()->IsOfSameType(*arrType2.GetElemType()); } else { return tyIdx == type.tyIdx; } @@ -477,7 +475,7 @@ void MIRArrayType::Dump(int indent, bool dontUseName) const { return; } LogInfo::MapleLogger() << "<"; - for (uint16 i = 0; i < dim; i++) { + for (uint16 i = 0; i < dim; ++i) { LogInfo::MapleLogger() << "[" << GetSizeArrayItem(i) << "]"; } LogInfo::MapleLogger() << " "; @@ -540,15 +538,15 @@ void MIRJarrayType::DetermineName() { fromPrimitive = true; break; } else if (elemType->GetKind() == kTypePointer) { - auto *ptype = static_cast(elemType)->GetPointedType(); - ASSERT(ptype != nullptr, "ptype is null in MIRJarrayType::DetermineName"); - if (ptype->GetKind() == kTypeByName || ptype->GetKind() == kTypeClass || ptype->GetKind() == kTypeInterface || - ptype->GetKind() == kTypeClassIncomplete || ptype->GetKind() == kTypeInterfaceIncomplete) { - baseName = static_cast(ptype)->GetName(); + auto *pType = static_cast(elemType)->GetPointedType(); + ASSERT(pType != nullptr, "pType is null in MIRJarrayType::DetermineName"); + if (pType->GetKind() == kTypeByName || pType->GetKind() == kTypeClass || pType->GetKind() == kTypeInterface || + pType->GetKind() == kTypeClassIncomplete || pType->GetKind() == kTypeInterfaceIncomplete) { + baseName = static_cast(pType)->GetName(); fromPrimitive = false; break; - } else if (ptype->GetKind() == kTypeJArray) { - auto *tmpPtype = static_cast(ptype); + } else if (pType->GetKind() == kTypeJArray) { + auto *tmpPtype = static_cast(pType); elemType = tmpPtype->GetElemType(); ASSERT(elemType != nullptr, "elemType is null in MIRJarrayType::DetermineName"); ++dim; @@ -560,7 +558,7 @@ void MIRJarrayType::DetermineName() { } } std::string name; - for (int i = dim; i > 0; i--) { + for (int i = dim; i > 0; --i) { name += JARRAY_PREFIX_STR; } name += baseName; @@ -672,8 +670,8 @@ static void DumpClassOrInterfaceInfo(const MIRStructType &type, int indent) { const std::vector &info = type.GetInfo(); std::vector infoIsString = type.GetInfoIsString(); size_t size = info.size(); - for (size_t i = 0; i < size; i++) { - LogInfo::MapleLogger() << std::endl; + for (size_t i = 0; i < size; ++i) { + LogInfo::MapleLogger() << '\n'; PrintIndentation(indent); LogInfo::MapleLogger() << "@" << GlobalTables::GetStrTable().GetStringFromStrIdx(info[i].first) << " "; if (!infoIsString[i]) { @@ -730,7 +728,7 @@ static void DumpStaticValue(const MIREncodedArray &staticValue, int indent) { if (staticValue.empty()) { return; } - LogInfo::MapleLogger() << std::endl; + LogInfo::MapleLogger() << '\n'; PrintIndentation(indent); LogInfo::MapleLogger() << "@staticvalue"; constexpr uint32 typeLen = 5; @@ -743,7 +741,7 @@ static void DumpStaticValue(const MIREncodedArray &staticValue, int indent) { constexpr uint32 simpleOffset = 1; constexpr uint32 aggOffSet = 2; valueArg = (valueType == kValueNull || valueType == kValueBoolean) ? simpleOffset : valueArg + aggOffSet; - for (uint32 k = 0; k < valueArg; k++) { + for (uint32 k = 0; k < valueArg; ++k) { LogInfo::MapleLogger() << static_cast(value.encodedValue[k]); if (k != static_cast(valueArg - 1)) { LogInfo::MapleLogger() << " "; @@ -755,8 +753,8 @@ static void DumpStaticValue(const MIREncodedArray &staticValue, int indent) { static void DumpFields(FieldVector fields, int indent, bool otherFields = false) { size_t size = fields.size(); - for (size_t i = 0; i < size; i++) { - LogInfo::MapleLogger() << std::endl; + for (size_t i = 0; i < size; ++i) { + LogInfo::MapleLogger() << '\n'; PrintIndentation(indent); LogInfo::MapleLogger() << ((!otherFields) ? "@" : "^") << GlobalTables::GetStrTable().GetStringFromStrIdx(fields[i].first) << " "; @@ -778,7 +776,6 @@ static void DumpFields(FieldVector fields, int indent, bool otherFields = false) LogInfo::MapleLogger() << ","; } } - return; } static void DumpFieldsAsCxx(const FieldVector &fields, int indent) { @@ -793,14 +790,14 @@ static void DumpFieldsAsCxx(const FieldVector &fields, int indent) { GlobalTables::GetTypeTable().GetTypeFromTyIdx(f.second.first)->Dump(indent + 1); LogInfo::MapleLogger() << " */ "; GlobalTables::GetTypeTable().GetTypeFromTyIdx(f.second.first)->DumpAsCxx(indent + 1); - LogInfo::MapleLogger() << " " << GlobalTables::GetStrTable().GetStringFromStrIdx(f.first) << ";" << std::endl; + LogInfo::MapleLogger() << " " << GlobalTables::GetStrTable().GetStringFromStrIdx(f.first) << ";" << '\n'; } } static void DumpMethods(MethodVector methods, int indent) { size_t size = methods.size(); - for (size_t i = 0; i < size; i++) { - LogInfo::MapleLogger() << std::endl; + for (size_t i = 0; i < size; ++i) { + LogInfo::MapleLogger() << '\n'; PrintIndentation(indent); LogInfo::MapleLogger() << "&" << GlobalTables::GetGsymTable().GetSymbolFromStidx(methods[i].first.Idx())->GetName(); methods[i].second.second.DumpAttributes(); @@ -808,7 +805,7 @@ static void DumpMethods(MethodVector methods, int indent) { auto *funcType = static_cast(GlobalTables::GetTypeTable().GetTypeFromTyIdx(methods[i].second.first)); size_t parmListSize = funcType->GetParamTypeList().size(); - for (size_t j = 0; j < parmListSize; j++) { + for (size_t j = 0; j < parmListSize; ++j) { GlobalTables::GetTypeTable().GetTypeFromTyIdx(funcType->GetNthParamType(j))->Dump(indent + 1); if (j != parmListSize - 1) { LogInfo::MapleLogger() << ","; @@ -844,19 +841,19 @@ static void DumpConstructorsAsCxx(MethodVector methods, int indent) { if (j != paramTypeListSize - 1) { LogInfo::MapleLogger() << ", "; } - j++; + ++j; } if (funcType->IsVarargs()) { LogInfo::MapleLogger() << ", ..."; } LogInfo::MapleLogger() << ") "; GlobalTables::GetTypeTable().GetTypeFromTyIdx(funcType->GetRetTyIdx())->Dump(indent + 1); - LogInfo::MapleLogger() << " */" << std::endl; + LogInfo::MapleLogger() << " */" << '\n'; PrintIndentation(indent); LogInfo::MapleLogger() << "/* "; LogInfo::MapleLogger() << NameMangler::DecodeName( GlobalTables::GetGsymTable().GetSymbolFromStidx(m.first.Idx())->GetName()); - LogInfo::MapleLogger() << " */" << std::endl; + LogInfo::MapleLogger() << " */" << '\n'; PrintIndentation(indent); LogInfo::MapleLogger() << "extern \"C\" "; // return type @@ -868,22 +865,22 @@ static void DumpConstructorsAsCxx(MethodVector methods, int indent) { if (j != paramTypeListSize - 1) { LogInfo::MapleLogger() << ", "; } - j++; + ++j; } if (funcType->IsVarargs()) { LogInfo::MapleLogger() << ", ..."; } LogInfo::MapleLogger() << ")"; if (methods.size() - 1 != i++) { - LogInfo::MapleLogger() << ";" << std::endl; + LogInfo::MapleLogger() << ";" << '\n'; } } } static void DumpInterfaces(std::vector interfaces, int indent) { size_t size = interfaces.size(); - for (size_t i = 0; i < size; i++) { - LogInfo::MapleLogger() << std::endl; + for (size_t i = 0; i < size; ++i) { + LogInfo::MapleLogger() << '\n'; PrintIndentation(indent); GStrIdx stridx = GlobalTables::GetTypeTable().GetTypeFromTyIdx(interfaces[i])->GetNameStrIdx(); LogInfo::MapleLogger() << "$" << GlobalTables::GetStrTable().GetStringFromStrIdx(stridx); @@ -979,7 +976,7 @@ static void DumpInfoPragmaStaticValue(const std::vector &info, cons LogInfo::MapleLogger() << ","; } size_t size = pragmaVec.size(); - for (size_t i = 0; i < size; i++) { + for (size_t i = 0; i < size; ++i) { pragmaVec[i]->Dump(indent); if (i != size - 1) { LogInfo::MapleLogger() << ","; @@ -1225,7 +1222,7 @@ FieldPair MIRStructType::TraverseToFieldRef(FieldID &fieldID) const { uint32 fieldIdx = 0; FieldPair curPair = fields[0]; while (fieldID > 1) { - fieldID--; + --fieldID; MIRType *curFieldType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(curPair.second.first); MIRStructType *curFieldStructType = nullptr; switch (curFieldType->GetKind()) { @@ -1244,7 +1241,7 @@ FieldPair MIRStructType::TraverseToFieldRef(FieldID &fieldID) const { default: break; } - fieldIdx++; + ++fieldIdx; if (fieldIdx == fields.size()) { return FieldPair(GStrIdx(0), TyIdxFieldAttrPair(TyIdx(0), FieldAttrs())); } @@ -1389,7 +1386,7 @@ TyIdxFieldAttrPair MIRPtrType::GetPointedTyIdxFldAttrPairWithFieldID(FieldID fie MIRType *pointedType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(pointedTyIdx); CHECK_FATAL(pointedType->IsStructType(), "MIRPtrType::GetPointedTyIdxWithFieldID(): cannot have non-zero fieldID for something other than a struct"); - MIRStructType *structType = static_cast(pointedType); + auto *structType = static_cast(pointedType); return structType->GetFieldTyIdxAttrPair(fieldID); } @@ -1441,11 +1438,11 @@ TypeAttrs FieldAttrs::ConvertToTypeAttrs() { TypeAttrs GenericAttrs::ConvertToTypeAttrs() { TypeAttrs attr; constexpr uint32 maxAttrNum = 64; - for (uint32 i = 0; i < maxAttrNum; i++) { + for (uint32 i = 0; i < maxAttrNum; ++i) { if ((attrFlag & (1ULL << i)) == 0) { continue; } - GenericAttrKind tA = static_cast(i); + auto tA = static_cast(i); switch (tA) { #define TYPE_ATTR #define ATTR(STR) \ @@ -1466,11 +1463,11 @@ TypeAttrs GenericAttrs::ConvertToTypeAttrs() { FuncAttrs GenericAttrs::ConvertToFuncAttrs() { FuncAttrs attr; constexpr uint32 maxAttrNum = 64; - for (uint32 i = 0; i < maxAttrNum; i++) { + for (uint32 i = 0; i < maxAttrNum; ++i) { if ((attrFlag & (1ULL << i)) == 0) { continue; } - GenericAttrKind tA = static_cast(i); + auto tA = static_cast(i); switch (tA) { #define FUNC_ATTR #define ATTR(STR) \ @@ -1491,11 +1488,11 @@ FuncAttrs GenericAttrs::ConvertToFuncAttrs() { FieldAttrs GenericAttrs::ConvertToFieldAttrs() { FieldAttrs attr; constexpr uint32 maxAttrNum = 64; - for (uint32 i = 0; i < maxAttrNum; i++) { + for (uint32 i = 0; i < maxAttrNum; ++i) { if ((attrFlag & (1ULL << i)) == 0) { continue; } - GenericAttrKind tA = static_cast(i); + auto tA = static_cast(i); switch (tA) { #define FIELD_ATTR #define ATTR(STR) \ diff --git a/src/maple_ir/src/option.cpp b/src/maple_ir/src/option.cpp index 42b6ba76a300ffbe215e67dc75954849021e8478..f0078d8ac6163a0b9b447f8cec074de2722c027b 100644 --- a/src/maple_ir/src/option.cpp +++ b/src/maple_ir/src/option.cpp @@ -19,7 +19,7 @@ #include "mpl_logging.h" #include "option_parser.h" -using namespace maple; +namespace maple { using namespace mapleOption; bool Options::dumpBefore = false; @@ -184,7 +184,7 @@ bool Options::ParseOptions(int argc, char **argv, std::string &fileName) const { for (const auto &optionArg : optionParser.GetNonOptions()) { LogInfo::MapleLogger(kLlErr) << optionArg << " "; } - LogInfo::MapleLogger(kLlErr) << std::endl; + LogInfo::MapleLogger(kLlErr) << "\n"; result = false; } @@ -204,5 +204,6 @@ void Options::DumpOptions() const { LogInfo::MapleLogger() << " " << phaseSeq[i].c_str(); } } - LogInfo::MapleLogger() << std::endl; + LogInfo::MapleLogger() << "\n"; } +}; // namespace maple diff --git a/src/maple_ir/src/parser.cpp b/src/maple_ir/src/parser.cpp index 17e6f3f51348d4e293cbb98e175272f604048d23..3cb28b8289bb68652a9f9f920f91b69f47d09ddc 100644 --- a/src/maple_ir/src/parser.cpp +++ b/src/maple_ir/src/parser.cpp @@ -25,18 +25,53 @@ #include "option.h" #include "string_utils.h" -namespace maple { +namespace { +using namespace maple; constexpr char kLexerStringSp[] = "SP"; constexpr char kLexerStringFp[] = "FP"; constexpr char kLexerStringGp[] = "GP"; constexpr char kLexerStringThrownval[] = "thrownval"; constexpr char kLexerStringRetval[] = "retval"; +const std::map pregMapIdx = { { kLexerStringSp, kSregSp }, + { kLexerStringFp, kSregFp }, + { kLexerStringGp, kSregGp }, + { kLexerStringThrownval, kSregThrownval }, + { kLexerStringRetval, kSregRetval0 } }; + +const std::map tkPragmaKind = { { TK_class, kPragmaClass }, + { TK_func, kPragmaFunc }, + { TK_var, kPragmaVar }, + { TK_param, kPragmaParam }, + { TK_func_ex, kPragmaFuncExecptioni }, + { TK_func_var, kPragmaFuncVar } }; + +const std::map tkPragmaValType = { { TK_i8, kValueByte }, + { TK_i16, kValueShort }, + { TK_u16, kValueChar }, + { TK_i32, kValueInt }, + { TK_i64, kValueLong }, + { TK_f32, kValueFloat }, + { TK_f64, kValueDouble }, + { TK_retype, kValueMethodType }, + { TK_ref, kValueMethodHandle }, + { TK_ptr, kValueString }, + { TK_type, kValueType }, + { TK_var, kValueField }, + { TK_func, kValueMethod }, + { TK_enum, kValueEnum }, + { TK_array, kValueArray }, + { TK_annotation, kValueAnnotation }, + { TK_const, kValueNull }, + { TK_u1, kValueBoolean } }; +} // namespace + +namespace maple { std::map MIRParser::funcPtrMapForParseMIR = MIRParser::InitFuncPtrMapForParseMIR(); MIRFunction *MIRParser::CreateDummyFunction() { GStrIdx strIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName("__$$__"); - maple::MIRBuilder mirBuilder(&mod); + MIRBuilder mirBuilder(&mod); MIRSymbol *funcSt = mirBuilder.CreateSymbol(TyIdx(0), strIdx, kStFunc, kScUnused, nullptr, kScopeGlobal); CHECK_FATAL(funcSt != nullptr, "Failed to create MIRSymbol"); // Don't add the function to the function table. @@ -53,11 +88,11 @@ MIRFunction *MIRParser::CreateDummyFunction() { } void MIRParser::ResetMaxPregNo(MIRFunction &func) { - for (uint32 i = 0; i < func.GetFormalCount(); i++) { + for (uint32 i = 0; i < func.GetFormalCount(); ++i) { MIRSymbol *formalSt = func.GetFormal(i); if (formalSt->IsPreg()) { - uint32 pRegNO = - static_cast(formalSt->GetPreg()->GetPregNo()); // no special register appears in the formals + // no special register appears in the formals + uint32 pRegNO = static_cast(formalSt->GetPreg()->GetPregNo()); if (pRegNO > maxPregNo) { maxPregNo = pRegNO; } @@ -195,7 +230,7 @@ bool MIRParser::ParseSpecialReg(PregIdx &pRegIdx) { if (strncmp(lexName.c_str(), kLexerStringRetval, retValSize) == 0 && (lexSize > retValSize) && isdigit(lexName[retValSize])) { int32 retValNo = lexName[retValSize] - '0'; - for (int32 i = retValSize + 1; (i < lexSize) && isdigit(lexName[i]); i++) { + for (int32 i = retValSize + 1; (i < lexSize) && isdigit(lexName[i]); ++i) { retValNo = retValNo * 10 + lexName[i] - '0'; } pRegIdx = -kSregRetval0 - retValNo; @@ -203,13 +238,9 @@ bool MIRParser::ParseSpecialReg(PregIdx &pRegIdx) { return true; } - std::map pregMapIdx = { { kLexerStringSp, kSregSp }, - { kLexerStringFp, kSregFp }, - { kLexerStringGp, kSregGp }, - { kLexerStringThrownval, kSregThrownval }, - { kLexerStringRetval, kSregRetval0 } }; - if (pregMapIdx.find(lexName) != pregMapIdx.end()) { - pRegIdx = -pregMapIdx[lexName]; + auto it = pregMapIdx.find(lexName); + if (it != pregMapIdx.end()) { + pRegIdx = -(it->second); lexer.NextToken(); return true; } @@ -366,22 +397,12 @@ bool MIRParser::ParseBitFieldType(TyIdx &fieldTyIdx) { bool MIRParser::ParsePragmaElement(MIRPragmaElement &elem) { TokenKind tk = lexer.GetTokenKind(); lexer.NextToken(); - std::map tkPragmaValType = { - { TK_i8, kValueByte }, { TK_i16, kValueShort }, - { TK_u16, kValueChar }, { TK_i32, kValueInt }, - { TK_i64, kValueLong }, { TK_f32, kValueFloat }, - { TK_f64, kValueDouble }, { TK_retype, kValueMethodType }, - { TK_ref, kValueMethodHandle }, { TK_ptr, kValueString }, - { TK_type, kValueType }, { TK_var, kValueField }, - { TK_func, kValueMethod }, { TK_enum, kValueEnum }, - { TK_array, kValueArray }, { TK_annotation, kValueAnnotation }, - { TK_const, kValueNull }, { TK_u1, kValueBoolean } - }; - if (tkPragmaValType.find(tk) == tkPragmaValType.end()) { + auto it = tkPragmaValType.find(tk); + if (it == tkPragmaValType.end()) { Error("parsing pragma error: wrong element type"); return false; } - elem.SetType(tkPragmaValType[tk]); + elem.SetType(it->second); switch (tk) { case TK_i8: @@ -450,7 +471,7 @@ bool MIRParser::ParsePragmaElementForArray(MIRPragmaElement &elem) { Error("parsing pragma error: expecting , but get "); return false; } - for (int64 i = 0; i < size; i++) { + for (int64 i = 0; i < size; ++i) { auto *e0 = mod.GetMemPool()->New(mod); tk = lexer.NextToken(); if (!ParsePragmaElement(*e0)) { @@ -497,7 +518,7 @@ bool MIRParser::ParsePragmaElementForAnnotation(MIRPragmaElement &elem) { Error("parsing pragma error: expecting , but get "); return false; } - for (int i = 0; i < size; i++) { + for (int i = 0; i < size; ++i) { auto *e0 = mod.GetMemPool()->New(mod); tk = lexer.NextToken(); if (tk != TK_label) { @@ -525,17 +546,12 @@ bool MIRParser::ParsePragma(MIRStructType &type) { p->SetVisibility(lexer.GetTheIntVal()); TokenKind tk = lexer.NextToken(); - std::map tkPragmaKind = { { TK_class, kPragmaClass }, - { TK_func, kPragmaFunc }, - { TK_var, kPragmaVar }, - { TK_param, kPragmaParam }, - { TK_func_ex, kPragmaFuncExecptioni }, - { TK_func_var, kPragmaFuncVar } }; - if (tkPragmaKind.find(tk) == tkPragmaKind.end()) { + auto it = tkPragmaKind.find(tk); + if (it == tkPragmaKind.end()) { Error("parsing pragma error: wrong kind "); return false; } - p->SetKind(tkPragmaKind[tk]); + p->SetKind(it->second); if (tk == TK_param) { tk = lexer.NextToken(); @@ -872,7 +888,7 @@ bool MIRParser::ParseClassType(TyIdx &styidx) { } else { styidx = GlobalTables::GetTypeTable().GetOrCreateMIRType(&classType); // set up classTyIdx for methods - for (size_t i = 0; i < classType.GetMethods().size(); i++) { + for (size_t i = 0; i < classType.GetMethods().size(); ++i) { StIdx stIdx = classType.GetMethodsElement(i).first; MIRSymbol *st = GlobalTables::GetGsymTable().GetSymbolFromStidx(stIdx.Idx()); ASSERT(st->GetSKind() == kStFunc, "unexpected st->sKind"); @@ -915,7 +931,7 @@ bool MIRParser::ParseInterfaceType(TyIdx &sTyIdx) { } else { sTyIdx = GlobalTables::GetTypeTable().GetOrCreateMIRType(&interfaceType); // set up classTyIdx for methods - for (size_t i = 0; i < interfaceType.GetMethods().size(); i++) { + for (size_t i = 0; i < interfaceType.GetMethods().size(); ++i) { StIdx stIdx = interfaceType.GetMethodsElement(i).first; MIRSymbol *st = GlobalTables::GetGsymTable().GetSymbolFromStidx(stIdx.Idx()); ASSERT(st != nullptr, "st is null"); @@ -1367,7 +1383,7 @@ bool MIRParser::ParseDerivedType(TyIdx &tyIdx, MIRTypeKind kind) { } void MIRParser::FixupForwardReferencedTypeByMap() { - for (size_t i = 1; i < GlobalTables::GetTypeTable().GetTypeTable().size(); i++) { + for (size_t i = 1; i < GlobalTables::GetTypeTable().GetTypeTable().size(); ++i) { MIRType *type = GlobalTables::GetTypeTable().GetTypeFromTyIdx(TyIdx(i)); if (type->GetKind() == kTypePointer) { auto *ptrType = static_cast(type); @@ -1385,7 +1401,7 @@ void MIRParser::FixupForwardReferencedTypeByMap() { if (it != typeDefIdxMap.end()) { classType->SetParentTyIdx(it->second); } - for (size_t j = 0; j < classType->GetInterfaceImplemented().size(); j++) { + for (size_t j = 0; j < classType->GetInterfaceImplemented().size(); ++j) { std::map::iterator it2 = typeDefIdxMap.find(classType->GetNthInterfaceImplemented(j)); if (it2 != typeDefIdxMap.end()) { classType->SetNthInterfaceImplemented(j, it2->second); @@ -1393,7 +1409,7 @@ void MIRParser::FixupForwardReferencedTypeByMap() { } } else if (type->GetKind() == kTypeInterface || type->GetKind() == kTypeInterfaceIncomplete) { auto *interfaceType = static_cast(type); - for (uint32 j = 0; j < interfaceType->GetParentsTyIdx().size(); j++) { + for (uint32 j = 0; j < interfaceType->GetParentsTyIdx().size(); ++j) { std::map::iterator it = typeDefIdxMap.find(interfaceType->GetParentsElementTyIdx(j)); if (it != typeDefIdxMap.end()) { interfaceType->SetParentsElementTyIdx(j, it->second); @@ -1401,21 +1417,21 @@ void MIRParser::FixupForwardReferencedTypeByMap() { } } auto *structType = static_cast(type); - for (uint32 j = 0; j < structType->GetFieldsSize(); j++) { + for (uint32 j = 0; j < structType->GetFieldsSize(); ++j) { TyIdx fieldTyIdx = structType->GetElemTyIdx(j); std::map::iterator it = typeDefIdxMap.find(fieldTyIdx); if (it != typeDefIdxMap.end()) { structType->SetElemtTyIdx(j, it->second); } } - for (size_t j = 0; j < structType->GetStaticFields().size(); j++) { + for (size_t j = 0; j < structType->GetStaticFields().size(); ++j) { TyIdx fieldTyIdx = structType->GetStaticElemtTyIdx(j); std::map::iterator it = typeDefIdxMap.find(fieldTyIdx); if (it != typeDefIdxMap.end()) { structType->SetStaticElemtTyIdx(j, it->second); } } - for (size_t j = 0; j < structType->GetMethods().size(); j++) { + for (size_t j = 0; j < structType->GetMethods().size(); ++j) { TyIdx methodTyIdx = structType->GetMethodsElement(j).second.first; std::map::iterator it = typeDefIdxMap.find(methodTyIdx); if (it != typeDefIdxMap.end()) { @@ -1963,7 +1979,7 @@ bool MIRParser::ParseInitValue(MIRConstPtr &theConst, TyIdx tyIdx) { theConst = mirConst; } else { // aggregates if (type.GetKind() == kTypeArray) { - MIRArrayType &arrayType = static_cast(type); + auto &arrayType = static_cast(type); MIRType *elemType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(arrayType.GetElemTyIdx()); MIRAggConst *newConst = mod.GetMemPool()->New(mod, type); theConst = newConst; @@ -1995,7 +2011,7 @@ bool MIRParser::ParseInitValue(MIRConstPtr &theConst, TyIdx tyIdx) { } else { std::vector sizeSubArray; ASSERT(arrayType.GetDim() > 1, "array dim must large then 1"); - for (uint16 i = 1; i < arrayType.GetDim(); i++) { + for (uint16 i = 1; i < arrayType.GetDim(); ++i) { sizeSubArray.push_back(arrayType.GetSizeArrayItem(i)); } MIRArrayType subArrayType(elemType->GetTypeIndex(), sizeSubArray); @@ -2173,7 +2189,7 @@ uint8 *MIRParser::ParseWordsInfo(uint32 size) { } uint8 *origp = static_cast(mod.GetMemPool()->Malloc(BlockSize2BitVectorSize(size))); // initialize it based on the input - for (uint32 *p = reinterpret_cast(origp); lexer.NextToken() == kTkIntconst; p++) { + for (uint32 *p = reinterpret_cast(origp); lexer.NextToken() == kTkIntconst; ++p) { *p = static_cast(lexer.GetTheIntVal()); } if (lexer.GetTokenKind() != kTkRbrack) { @@ -2249,7 +2265,7 @@ bool MIRParser::ParseMIR(uint32 fileIdx, uint32 option, bool isIPA, bool isComb) FixupForwardReferencedTypeByMap(); // check if any global type name is undefined for (auto it = mod.GetTypeNameTab()->GetGStrIdxToTyIdxMap().begin(); - it != mod.GetTypeNameTab()->GetGStrIdxToTyIdxMap().end(); it++) { + it != mod.GetTypeNameTab()->GetGStrIdxToTyIdxMap().end(); ++it) { MIRType *type = GlobalTables::GetTypeTable().GetTypeFromTyIdx(it->second); CHECK_FATAL(type != nullptr, "type is null"); if (type->GetKind() == kTypeByName) { @@ -2263,7 +2279,7 @@ bool MIRParser::ParseMIR(uint32 fileIdx, uint32 option, bool isIPA, bool isComb) } } if (!isIPA && isComb) { - for (auto it = paramImportFileList.begin(); it != paramImportFileList.end(); it++) { + for (auto it = paramImportFileList.begin(); it != paramImportFileList.end(); ++it) { BinaryMplt binMplt(mod); std::string importFilename = *it; if (!binMplt.Import(importFilename, false, true)) { // not a binary mplt @@ -2431,7 +2447,7 @@ bool MIRParser::ParseMIRForGlobalMemMap() { } mod.SetGlobalBlockMap(static_cast(mod.GetMemPool()->Malloc(mod.GetGlobalMemSize()))); // initialize globalblkmap based on the input - for (uint32 *p = reinterpret_cast(mod.GetGlobalBlockMap()); lexer.NextToken() == kTkIntconst; p++) { + for (uint32 *p = reinterpret_cast(mod.GetGlobalBlockMap()); lexer.NextToken() == kTkIntconst; ++p) { *p = static_cast(lexer.GetTheIntVal()); } if (lexer.GetTokenKind() != kTkRbrack) { diff --git a/src/maple_ir/src/printing.cpp b/src/maple_ir/src/printing.cpp index 10d6bef899a25fa9428aefb9b4f754a6daba9ddb..481e289a95ba0c53e76e5a4d71e36b9cfadf3516 100644 --- a/src/maple_ir/src/printing.cpp +++ b/src/maple_ir/src/printing.cpp @@ -30,7 +30,7 @@ void PrintIndentation(int32 indent) { } void PrintString(const std::string &str) { - uint32 i = 0; + size_t i = 0; LogInfo::MapleLogger() << " \""; while (i < str.length()) { unsigned char c = str[i++]; diff --git a/src/maple_me/include/alias_analysis_table.h b/src/maple_me/include/alias_analysis_table.h index 2ed17ac37c4a0460a5fca5c4e97b28acfba1b6dc..33c8f8fabc16a9598f6d9294011a799aa5cb6e36 100644 --- a/src/maple_me/include/alias_analysis_table.h +++ b/src/maple_me/include/alias_analysis_table.h @@ -30,14 +30,15 @@ class AliasAnalysisTable { memPool(ssaTab.GetMempool()), klassHierarchy(kh) {} + ~AliasAnalysisTable() = default; + OriginalSt *GetPrevLevelNode(const OriginalSt &ost); MapleVector *GetNextLevelNodes(const OriginalSt &ost); OriginalSt *FindOrCreateAddrofSymbolOriginalSt(OriginalSt &ost); OriginalSt *FindOrCreateExtraLevOriginalSt(OriginalSt &ost, TyIdx ptyidx, FieldID fld); - ~AliasAnalysisTable() = default; private: - OriginalSt *FindOrCreateExtraLevSymOrRegOriginalSt(OriginalSt &ost, TyIdx ptyidx, FieldID fld); + OriginalSt *FindOrCreateExtraLevSymOrRegOriginalSt(OriginalSt &ost, TyIdx tyIdx, FieldID fld); OriginalSt *FindExtraLevOriginalSt(const MapleVector &nextLevelOsts, FieldID fld); SSATab &ssaTab; MapleAllocator alloc; diff --git a/src/maple_me/include/alias_class.h b/src/maple_me/include/alias_class.h index 7bf49e13aeb5f22f715c701c983baa6d36e6e0d8..96584d11e9bb5a720864dacab42d5deab1432437 100644 --- a/src/maple_me/include/alias_class.h +++ b/src/maple_me/include/alias_class.h @@ -28,15 +28,11 @@ class AliasElem { public: AliasElem(uint32 i, OriginalSt &origst) : id(i), - ost(origst), - notAllDefsSeen(false), - nextLevNotAllDefsSeen(false), - classSet(nullptr), - assignSet(nullptr) {} + ost(origst) {} ~AliasElem() = default; - void Dump(MIRModule &mod) const; + void Dump(const MIRModule &mod) const; uint32 GetClassID() const { return id; @@ -52,7 +48,6 @@ class AliasElem { bool IsNotAllDefsSeen() const { return notAllDefsSeen; } - void SetNotAllDefsSeen(bool allDefsSeen) { notAllDefsSeen = allDefsSeen; } @@ -60,7 +55,6 @@ class AliasElem { bool IsNextLevNotAllDefsSeen() const { return nextLevNotAllDefsSeen; } - void SetNextLevNotAllDefsSeen(bool allDefsSeen) { nextLevNotAllDefsSeen = allDefsSeen; } @@ -82,23 +76,24 @@ class AliasElem { private: uint32 id; // the original alias class id, before any union; start from 0 OriginalSt &ost; - bool notAllDefsSeen; // applied to current level; unused for lev -1 - bool nextLevNotAllDefsSeen; // remember that next level's elements need to be made notAllDefsSeen - MapleSet *classSet; // points to the set of members of its class; nullptr for single-member classes - MapleSet *assignSet; // points to the set of members that have assignments among themselves + bool notAllDefsSeen = false; // applied to current level; unused for lev -1 + bool nextLevNotAllDefsSeen = false; // remember that next level's elements need to be made notAllDefsSeen + MapleSet *classSet = nullptr; // points to the set of members of its class; nullptr for + // single-member classes + MapleSet *assignSet = nullptr; // points to the set of members that have assignments among themselves }; class AliasClass : public AnalysisResult { public: - AliasClass(MemPool &memPool, MIRModule &mod, SSATab &ssatb, bool lessThrowAliasParam, bool ignoreIPA, + AliasClass(MemPool &memPool, MIRModule &mod, SSATab &ssaTabParam, bool lessThrowAliasParam, bool ignoreIPA, bool setCalleeHasSideEffect = false, KlassHierarchy *kh = nullptr) : AnalysisResult(&memPool), mirModule(mod), acMemPool(memPool), acAlloc(&memPool), - ssaTab(ssatb), + ssaTab(ssaTabParam), unionFind(memPool), - osym2Elem(ssatb.GetOriginalStTableSize(), nullptr, acAlloc.Adapter()), + osym2Elem(ssaTabParam.GetOriginalStTableSize(), nullptr, acAlloc.Adapter()), id2Elem(acAlloc.Adapter()), notAllDefsSeenClassSetRoots(acAlloc.Adapter()), globalsAffectedByCalls(std::less(), acAlloc.Adapter()), @@ -106,10 +101,9 @@ class AliasClass : public AnalysisResult { lessThrowAlias(lessThrowAliasParam), ignoreIPA(ignoreIPA), calleeHasSideEffect(setCalleeHasSideEffect), - klassHierarchy(kh), - aliasAnalysisTable(nullptr) {} + klassHierarchy(kh) {} - ~AliasClass() = default; + ~AliasClass() override = default; AliasAnalysisTable *GetAliasAnalysisTable() { if (aliasAnalysisTable == nullptr) { @@ -118,15 +112,21 @@ class AliasClass : public AnalysisResult { return aliasAnalysisTable; } - AliasElem *FindAliasElem(const OriginalSt &ost) const { + const AliasElem *FindAliasElem(const OriginalSt &ost) const { return osym2Elem.at(ost.GetIndex().idx); } + AliasElem *FindAliasElem(const OriginalSt &ost) { + return const_cast(const_cast(this)->FindAliasElem(ost)); + } size_t GetAliasElemCount() const { return osym2Elem.size(); } - AliasElem *FindID2Elem(size_t id) const { + const AliasElem *FindID2Elem(size_t id) const { + return id2Elem.at(id); + } + AliasElem *FindID2Elem(size_t id) { return id2Elem.at(id); } @@ -146,37 +146,22 @@ class AliasClass : public AnalysisResult { void CollectRootIDOfNextLevelNodes(const OriginalSt &ost, std::set &rootIDOfNADSs); void UnionForNotAllDefsSeen(); void CollectAliasGroups(std::map> &aliasGroups); - bool AliasAccordingToType(TyIdx tyidxA, TyIdx tyidxB); + bool AliasAccordingToType(TyIdx tyIdxA, TyIdx tyIdxB); bool AliasAccordingToFieldID(const OriginalSt &ostA, const OriginalSt &ostB); void ReconstructAliasGroups(); void CollectNotAllDefsSeenAes(); void CreateClassSets(); void DumpClassSets(); - void InsertMayDefUseCall(StmtNode &stmt, BBId bbid, bool hasSideEffect, bool hasNoPrivateDefEffect); - void GenericInsertMayDefUse(StmtNode &stmt, BBId bbid); + void InsertMayDefUseCall(StmtNode &stmt, BBId bbID, bool hasSideEffect, bool hasNoPrivateDefEffect); + void GenericInsertMayDefUse(StmtNode &stmt, BBId bbID); protected: - MIRModule &mirModule; virtual bool InConstructorLikeFunc() const { return true; } + MIRModule &mirModule; private: - MemPool &acMemPool; - MapleAllocator acAlloc; - SSATab &ssaTab; - UnionFind unionFind; - MapleVector osym2Elem; // index is OStIdx - MapleVector id2Elem; // index is the id - MapleVector notAllDefsSeenClassSetRoots; // root of the not_all_defs_seen class sets - MapleSet globalsAffectedByCalls; // set of class ids of globals - // aliased at calls; needed only when wholeProgramScope is true - MapleSet globalsMayAffectedByClinitCheck; - bool lessThrowAlias; - bool ignoreIPA; // whether to ignore information provided by IPA - bool calleeHasSideEffect; - KlassHierarchy *klassHierarchy; - AliasAnalysisTable *aliasAnalysisTable; bool CallHasNoSideEffectOrPrivateDefEffect(const CallNode &stmt, FuncAttrKind attrKind) const; bool CallHasSideEffect(const CallNode &stmt) const; bool CallHasNoPrivateDefEffect(const CallNode &stmt) const; @@ -184,7 +169,7 @@ class AliasClass : public AnalysisResult { AliasElem *FindOrCreateExtraLevAliasElem(BaseNode &expr, TyIdx tyIdx, FieldID fieldId); AliasElem *CreateAliasElemsExpr(BaseNode &expr); void SetNotAllDefsSeenForMustDefs(const StmtNode &callas); - void SetPtrOpndNextLevNADS(const BaseNode &opnd, AliasElem *ae, bool hasNoPrivateDefEffect); + void SetPtrOpndNextLevNADS(const BaseNode &opnd, AliasElem *aliasElem, bool hasNoPrivateDefEffect); void SetPtrOpndsNextLevNADS(unsigned int start, unsigned int end, MapleVector &opnds, bool hasNoPrivateDefEffect); void ApplyUnionForDassignCopy(const AliasElem &lhsAe, const AliasElem *rhsAe, const BaseNode &rhs); @@ -194,7 +179,7 @@ class AliasClass : public AnalysisResult { void CollectMayDefForMustDefs(const StmtNode &stmt, std::set &mayDefOsts); void CollectMayUseForCallOpnd(const StmtNode &stmt, std::set &mayUseOsts); void InsertMayDefNodeForCall(std::set &mayDefOsts, MapleMap &mayDefNodes, - StmtNode &stmt, BBId bbid, bool hasNoPrivateDefEffect); + StmtNode &stmt, BBId bbID, bool hasNoPrivateDefEffect); void InsertMayUseExpr(BaseNode &expr); void CollectMayUseFromGlobalsAffectedByCalls(std::set &mayUseOsts); void CollectMayUseFromNADS(std::set &mayUseOsts); @@ -204,24 +189,39 @@ class AliasClass : public AnalysisResult { void InsertReturnOpndMayUse(const StmtNode &stmt); void InsertMayUseAll(const StmtNode &stmt); void CollectMayDefForDassign(const StmtNode &stmt, std::set &mayDefOsts); - void InsertMayDefNode(std::set &mayDefOsts, MapleMap &mayDefNodes, StmtNode &stmt, - BBId bbid); - void InsertMayDefDassign(StmtNode &stmt, BBId bbid); + void InsertMayDefNode(std::set &mayDefOsts, MapleMap &mayDefNodes, StmtNode &stmt); + void InsertMayDefDassign(StmtNode &stmt); bool IsEquivalentField(TyIdx tyIdxA, FieldID fldA, TyIdx tyIdxB, FieldID fldB) const; void CollectMayDefForIassign(StmtNode &stmt, std::set &mayDefOsts); void InsertMayDefNodeExcludeFinalOst(std::set &mayDefOsts, MapleMap &mayDefNodes, StmtNode &stmt); - void InsertMayDefIassign(StmtNode &stmt, BBId bbid); - void InsertMayDefUseSyncOps(StmtNode &stmt, BBId bbid); + void InsertMayDefIassign(StmtNode &stmt); + void InsertMayDefUseSyncOps(StmtNode &stmt); void InsertMayUseNodeExcludeFinalOst(const std::set &mayUseOsts, MapleMap &mayUseNodes); - void InsertMayDefUseIntrncall(StmtNode &stmt, BBId bbid); - void InsertMayDefUseClinitCheck(IntrinsiccallNode &stmt, BBId bbid); + void InsertMayDefUseIntrncall(StmtNode &stmt); + void InsertMayDefUseClinitCheck(IntrinsiccallNode &stmt); virtual BB *GetBB(BBId id) = 0; void ProcessIdsAliasWithRoot(const std::set &idsAliasWithRoot, std::vector &newGroups); void UpdateNextLevelNodes(std::vector &nextLevelOsts, const AliasElem &aliasElem); void UnionNodes(std::vector &nextLevelOsts); - int GetOffset(const Klass &super, Klass &base) const; + int GetOffset(const Klass &super, const Klass &base) const; + + MemPool &acMemPool; + MapleAllocator acAlloc; + SSATab &ssaTab; + UnionFind unionFind; + MapleVector osym2Elem; // index is OStIdx + MapleVector id2Elem; // index is the id + MapleVector notAllDefsSeenClassSetRoots; // root of the not_all_defs_seen class sets + MapleSet globalsAffectedByCalls; // set of class ids of globals + // aliased at calls; needed only when wholeProgramScope is true + MapleSet globalsMayAffectedByClinitCheck; + bool lessThrowAlias; + bool ignoreIPA; // whether to ignore information provided by IPA + bool calleeHasSideEffect; + KlassHierarchy *klassHierarchy; + AliasAnalysisTable *aliasAnalysisTable = nullptr; }; } // namespace maple #endif // MAPLE_ME_INCLUDE_ALIAS_CLASS_H diff --git a/src/maple_me/include/bb.h b/src/maple_me/include/bb.h index 0efa356e186e6ab53ec072416f29a477bb71cc20..1710f162da8d02eacc9ca20a7e7c10900082018e 100644 --- a/src/maple_me/include/bb.h +++ b/src/maple_me/include/bb.h @@ -66,9 +66,9 @@ class BB { pred(kBBVectorInitialSize, nullptr, alloc->Adapter()), succ(kBBVectorInitialSize, nullptr, alloc->Adapter()), phiList(versAlloc->Adapter()), - mevarPhiList(alloc->Adapter()), - meregPhiList(alloc->Adapter()), - mevarPaiList(alloc->Adapter()) { + meVarPhiList(alloc->Adapter()), + meRegPhiList(alloc->Adapter()), + meVarPaiList(alloc->Adapter()) { pred.pop_back(); pred.pop_back(); succ.pop_back(); @@ -80,9 +80,9 @@ class BB { pred(kBBVectorInitialSize, nullptr, alloc->Adapter()), succ(kBBVectorInitialSize, nullptr, alloc->Adapter()), phiList(versAlloc->Adapter()), - mevarPhiList(alloc->Adapter()), - meregPhiList(alloc->Adapter()), - mevarPaiList(alloc->Adapter()), + meVarPhiList(alloc->Adapter()), + meRegPhiList(alloc->Adapter()), + meVarPaiList(alloc->Adapter()), stmtNodeList(firstStmt, lastStmt) { pred.pop_back(); pred.pop_back(); @@ -90,6 +90,8 @@ class BB { succ.pop_back(); } + virtual ~BB() = default; + bool GetAttributes(uint32 attrKind) const { return (attributes & attrKind) != 0; } @@ -211,15 +213,15 @@ class BB { } void InsertPai(BB &bb, PaiassignMeStmt &s) { - if (mevarPaiList.find(&bb) == mevarPaiList.end()) { + if (meVarPaiList.find(&bb) == meVarPaiList.end()) { std::vector tmp; - mevarPaiList[&bb] = tmp; + meVarPaiList[&bb] = tmp; } - mevarPaiList[&bb].push_back(&s); + meVarPaiList[&bb].push_back(&s); } - MapleMap>& GetPaiList() { - return mevarPaiList; + MapleMap> &GetPaiList() { + return meVarPaiList; } bool IsMeStmtEmpty() const { @@ -257,8 +259,6 @@ class BB { return meStmtList; } - virtual ~BB() = default; - LabelIdx GetBBLabel() const { return bbLabel; } @@ -340,19 +340,19 @@ class BB { } MapleMap &GetMevarPhiList() { - return mevarPhiList; + return meVarPhiList; } const MapleMap &GetMevarPhiList() const { - return mevarPhiList; + return meVarPhiList; } MapleMap &GetMeRegPhiList() { - return meregPhiList; + return meRegPhiList; } const MapleMap &GetMeRegPhiList() const { - return meregPhiList; + return meRegPhiList; } private: @@ -361,9 +361,9 @@ class BB { MapleVector pred; // predecessor list MapleVector succ; // successor list MapleMap phiList; - MapleMap mevarPhiList; - MapleMap meregPhiList; - MapleMap> mevarPaiList; + MapleMap meVarPhiList; + MapleMap meRegPhiList; + MapleMap> meVarPaiList; uint32 frequency = 0; BBKind kind = kBBUnknown; uint32 attributes = 0; diff --git a/src/maple_me/include/dominance.h b/src/maple_me/include/dominance.h index 32a66d99eba47628836492041ff6bc7e5e97e3c3..d201d851a8577249a770ccfef63480ae9c432330 100644 --- a/src/maple_me/include/dominance.h +++ b/src/maple_me/include/dominance.h @@ -33,12 +33,12 @@ class Dominance : public AnalysisResult { pdomPostOrderIDVec(bbVec.size(), -1, tmpAllocator.Adapter()), pdomReversePostOrder(tmpAllocator.Adapter()), pdoms(bbVec.size(), nullptr, domAllocator.Adapter()), - domFrontier(bbVec.size(), MapleSet(std::less(), domAllocator.Adapter()), domAllocator.Adapter()), - domChildren(bbVec.size(), MapleSet(std::less(), domAllocator.Adapter()), domAllocator.Adapter()), + domFrontier(bbVec.size(), MapleSet(domAllocator.Adapter()), domAllocator.Adapter()), + domChildren(bbVec.size(), MapleSet(domAllocator.Adapter()), domAllocator.Adapter()), dtPreOrder(bbVec.size(), BBId(0), domAllocator.Adapter()), dtDfn(bbVec.size(), -1, domAllocator.Adapter()), - pdomFrontier(bbVec.size(), MapleSet(std::less(), domAllocator.Adapter()), domAllocator.Adapter()), - pdomChildren(bbVec.size(), MapleSet(std::less(), domAllocator.Adapter()), domAllocator.Adapter()), + pdomFrontier(bbVec.size(), MapleSet(domAllocator.Adapter()), domAllocator.Adapter()), + pdomChildren(bbVec.size(), MapleSet(domAllocator.Adapter()), domAllocator.Adapter()), pdtPreOrder(bbVec.size(), BBId(0), domAllocator.Adapter()), pdtDfn(bbVec.size(), -1, domAllocator.Adapter()) {} diff --git a/src/maple_me/include/me_alias_class.h b/src/maple_me/include/me_alias_class.h index b927a8d5e6336125b406e22566b0a1421d5f4277..a38ac08122c2731a87ddef5778e3195946ded714 100644 --- a/src/maple_me/include/me_alias_class.h +++ b/src/maple_me/include/me_alias_class.h @@ -27,11 +27,10 @@ class MeAliasClass : public AliasClass { func(func), enabledDebug(debug) {} virtual ~MeAliasClass() = default; + void DoAliasAnalysis(); private: - MeFunction &func; - bool enabledDebug; BB *GetBB(BBId id) override { if (func.GetAllBBs().size() < id) { return nullptr; @@ -44,6 +43,9 @@ class MeAliasClass : public AliasClass { } bool HasWriteToStaticFinal() const; + + MeFunction &func; + bool enabledDebug; }; class MeDoAliasClass : public MeFuncPhase { @@ -51,7 +53,9 @@ class MeDoAliasClass : public MeFuncPhase { explicit MeDoAliasClass(MePhaseID id) : MeFuncPhase(id) {} virtual ~MeDoAliasClass() = default; + AnalysisResult *Run(MeFunction *func, MeFuncResultMgr *funcResMgr, ModuleResultMgr *moduleResMgr) override; + std::string PhaseName() const override { return "aliasclass"; } diff --git a/src/maple_me/include/me_bb_layout.h b/src/maple_me/include/me_bb_layout.h index cadec2c4e01e7f83a75b62f5a907f9e4ac707246..1aeef886bb062d95dc12499e0ee96770892c53e6 100644 --- a/src/maple_me/include/me_bb_layout.h +++ b/src/maple_me/include/me_bb_layout.h @@ -25,10 +25,7 @@ class BBLayout : public AnalysisResult { func(f), layoutAlloc(&memPool), layoutBBs(layoutAlloc.Adapter()), - curBBId(0), - bbCreated(false), laidOut(func.GetAllBBs().size(), false, layoutAlloc.Adapter()), - tryOutstanding(false), enabledDebug(enabledDebug) { laidOut[func.GetCommonEntryBB()->GetBBId()] = true; laidOut[func.GetCommonExitBB()->GetBBId()] = true; @@ -37,13 +34,13 @@ class BBLayout : public AnalysisResult { virtual ~BBLayout() = default; BB *NextBB() { // return the next BB following strictly program input order - curBBId++; + ++curBBId; while (curBBId < func.GetAllBBs().size()) { BB *nextBB = func.GetBBFromID(curBBId); if (nextBB != nullptr && !laidOut[nextBB->GetBBId()]) { return nextBB; } - curBBId++; + ++curBBId; } return nullptr; } @@ -62,7 +59,7 @@ class BBLayout : public AnalysisResult { return layoutBBs; } - const bool IsNewBBInLayout() const { + bool IsNewBBInLayout() const { return bbCreated; } @@ -90,11 +87,11 @@ class BBLayout : public AnalysisResult { MeFunction &func; MapleAllocator layoutAlloc; MapleVector layoutBBs; // gives the determined layout order - BBId curBBId; // to index into func.bb_vec_ to return the next BB - bool bbCreated; // new create bb will change mefunction::bb_vec_ and + BBId curBBId { 0 }; // to index into func.bb_vec_ to return the next BB + bool bbCreated = false; // new create bb will change mefunction::bb_vec_ and // related analysis result - MapleVector laidOut; // indexed by bbid to tell if has been laid out - bool tryOutstanding; // true if a try laid out but not its endtry + MapleVector laidOut; // indexed by bbid to tell if has been laid out + bool tryOutstanding = false; // true if a try laid out but not its endtry bool enabledDebug; }; diff --git a/src/maple_me/include/me_cfg.h b/src/maple_me/include/me_cfg.h index e6f05f7c4fa17b926053ccfba5522355728c05e5..d5f7a2966d08d52e72ab69f3033449b0de397cf8 100644 --- a/src/maple_me/include/me_cfg.h +++ b/src/maple_me/include/me_cfg.h @@ -57,8 +57,8 @@ class MeCFG { void ConvertMevarPhiList2IdentityAssigns(BB &meBB) const; void ConvertMeregphiList2IdentityAssigns(BB &meBB) const; - MeFunction &func; - bool hasDoWhile = false; + MeFunction &func; + bool hasDoWhile = false; }; } // namespace maple #endif // MAPLE_ME_INCLUDE_ME_CFG_H diff --git a/src/maple_me/include/me_const.h b/src/maple_me/include/me_const.h index 2daf525f3978a9ec2bad5103901b8ccf78b413f5..41260af41e9014e3e7ea4ff0604aafc9429376fa 100644 --- a/src/maple_me/include/me_const.h +++ b/src/maple_me/include/me_const.h @@ -12,15 +12,12 @@ * FIT FOR A PARTICULAR PURPOSE. * See the Mulan PSL v1 for more details. */ -/** - * - * define consts used by maple_me - * - */ + #ifndef MAPLE_ME_INCLUDE_ME_CONST_H #define MAPLE_ME_INCLUDE_ME_CONST_H #include +// define consts used by maple_me namespace maple { const std::string kStrThisPointer = "_this"; } diff --git a/src/maple_me/include/me_function.h b/src/maple_me/include/me_function.h index 627fa5828a75cdb7f6245fec72cbf9cf18139a9f..c13a152e7bf0e9056ae3d3485686e83258f1c16e 100644 --- a/src/maple_me/include/me_function.h +++ b/src/maple_me/include/me_function.h @@ -150,6 +150,18 @@ class MeFunction : public FuncEmit { using BBPtrHolder = MapleVector; public: + using value_type = BBPtrHolder::value_type; + using size_type = BBPtrHolder::size_type; + using difference_type = BBPtrHolder::difference_type; + using pointer = BBPtrHolder::pointer; + using const_pointer = BBPtrHolder::const_pointer; + using reference = BBPtrHolder::reference; + using const_reference = BBPtrHolder::const_reference; + using iterator = BBPtrHolder::iterator; + using const_iterator = BBPtrHolder::const_iterator; + using reverse_iterator = BBPtrHolder::reverse_iterator; + using const_reverse_iterator = BBPtrHolder::const_reverse_iterator; + MeFunction(MIRModule *mod, MIRFunction *func, MemPool *memPool, MemPool *versMemPool, const std::string &fileName) : memPool(memPool), @@ -169,18 +181,6 @@ class MeFunction : public FuncEmit { ~MeFunction() override = default; - using value_type = BBPtrHolder::value_type; - using size_type = BBPtrHolder::size_type; - using difference_type = BBPtrHolder::difference_type; - using pointer = BBPtrHolder::pointer; - using const_pointer = BBPtrHolder::const_pointer; - using reference = BBPtrHolder::reference; - using const_reference = BBPtrHolder::const_reference; - using iterator = BBPtrHolder::iterator; - using const_iterator = BBPtrHolder::const_iterator; - using reverse_iterator = BBPtrHolder::reverse_iterator; - using const_reverse_iterator = BBPtrHolder::const_reverse_iterator; - iterator begin() { return bbVec.begin(); } @@ -396,7 +396,7 @@ class MeFunction : public FuncEmit { const MapleUnorderedMap &GetEndTryBB2TryBB() const { return endTryBB2TryBB; } - const BB* GetTryBBFromEndTryBB(BB *endTryBB) const { + const BB *GetTryBBFromEndTryBB(BB *endTryBB) const { auto it = endTryBB2TryBB.find(endTryBB); return it == endTryBB2TryBB.end() ? nullptr : it->second; } diff --git a/src/maple_me/include/me_option.h b/src/maple_me/include/me_option.h index 18be4d30e5b4cd2c8b3c0a6a80e5bc470a69513b..b86d376ba1cb514a035f319db6be6999353022a8 100644 --- a/src/maple_me/include/me_option.h +++ b/src/maple_me/include/me_option.h @@ -23,20 +23,31 @@ namespace maple { class MeOption { public: + enum Level { + kLevelZero = 0, + kLevelOne = 1, + kLevelTwo = 2, + kLevelThree = 3 + }; + explicit MeOption(MemPool &memPool) : optionAlloc(&memPool) {} ~MeOption() = default; void ParseOptions(int argc, char **argv, std::string &fileName); + void SplitPhases(const std::string &str, std::unordered_set &set) const; + void SplitSkipPhases(const std::string &str) { + SplitPhases(str, skipPhases); + } + void GetRange(const std::string &str) const; + + const std::unordered_set &GetSkipPhases() const { + return skipPhases; + } + static bool DumpPhase(const std::string &phase); static std::unordered_set dumpPhases; - enum Level { - kLevelZero = 0, - kLevelOne = 1, - kLevelTwo = 2, - kLevelThree = 3 - }; static bool dumpAfter; static constexpr int kRangeArrayLen = 2; static unsigned long range[kRangeArrayLen]; @@ -53,16 +64,6 @@ class MeOption { static bool ignoreIPA; static bool lessThrowAlias; static bool regreadAtReturn; - void SplitPhases(const std::string &str, std::unordered_set &set) const; - void SplitSkipPhases(const std::string &str) { - SplitPhases(str, skipPhases); - } - void GetRange(const std::string &str) const; - - const std::unordered_set &GetSkipPhases() const { - return skipPhases; - } - private: std::unordered_set skipPhases; MapleAllocator optionAlloc; diff --git a/src/maple_me/include/me_phase.h b/src/maple_me/include/me_phase.h index 198920ad126bbcc38b81711c61ca9baaba1d407d..12ecd694ee44156909af2ad3e60f3fd05e1b0c70 100644 --- a/src/maple_me/include/me_phase.h +++ b/src/maple_me/include/me_phase.h @@ -35,9 +35,7 @@ class MeFunction; // circular dependency exists, no other choice using MeFuncResultMgr = AnalysisResultManager; class MeFuncPhase : public Phase { public: - explicit MeFuncPhase(MePhaseID id) : Phase() { - phaseID = id; - } + explicit MeFuncPhase(MePhaseID id) : Phase(), phaseID(id) {} virtual ~MeFuncPhase() = default; diff --git a/src/maple_me/include/me_phase_manager.h b/src/maple_me/include/me_phase_manager.h index d2aeea409ae7a11b62fe2be2760578db7e0a9a9a..6b214b4c715596aaa90566214b488f99bc26f463 100644 --- a/src/maple_me/include/me_phase_manager.h +++ b/src/maple_me/include/me_phase_manager.h @@ -21,9 +21,14 @@ #include "phase_manager.h" #include "mir_module.h" #include "me_phase.h" +#include "mir_function.h" namespace maple { -enum MePhaseType { kMePhaseInvalid, kMePhaseMainopt, kMePhaseLno }; +enum MePhaseType { + kMePhaseInvalid, + kMePhaseMainopt, + kMePhaseLno +}; // driver of Me class MeFuncPhaseManager : public PhaseManager { @@ -85,7 +90,7 @@ class MeFuncPhaseManager : public PhaseManager { private: // analysis phase result manager - MeFuncResultMgr arFuncManager{GetMemAllocator()}; + MeFuncResultMgr arFuncManager{ GetMemAllocator() }; MIRModule &mirModule; ModuleResultMgr *modResMgr; MePhaseType mePhaseType = kMePhaseInvalid; diff --git a/src/maple_me/include/me_rc_lowering.h b/src/maple_me/include/me_rc_lowering.h index 521ef198da33df72d8b5a58c4e01e4c136c517e0..0cbbbaf15af886879e5392a83b4e1eb96f2c3370 100644 --- a/src/maple_me/include/me_rc_lowering.h +++ b/src/maple_me/include/me_rc_lowering.h @@ -90,7 +90,7 @@ class RCLowering { std::vector rets{}; // std::vector of return statement unsigned int tmpCount = 0; bool needSpecialHandleException = false; - std::set assignedPtrSym; + std::set assignedPtrSym; std::set tmpLocalRefVars; std::set gcMallocObjects{}; std::map cleanUpVars{}; diff --git a/src/maple_me/include/orig_symbol.h b/src/maple_me/include/orig_symbol.h index 608ea8b7a9dee8a050fe0a8294cf69445495dedb..652c057b9ca5970c3e60d78ac84844c8a4d5c9a7 100644 --- a/src/maple_me/include/orig_symbol.h +++ b/src/maple_me/include/orig_symbol.h @@ -34,7 +34,7 @@ struct OStIdx { } bool operator!=(const OStIdx &x) const { - return idx != x.idx; + return !(*this == x); } bool operator<(const OStIdx &x) const { @@ -46,29 +46,14 @@ constexpr int kInitVersion = 0; class VarMeExpr; // circular dependency exists, no other choice class OriginalSt { public: - OriginalSt(OStIdx index, MapleAllocator &alloc, bool local, bool isFormal, FieldID fieldIDPara) - : ostType(kUnkonwnOst), - index(index), - versionsIndex(alloc.Adapter()), - fieldID(fieldIDPara), - isLocal(local), - isFormal(isFormal), - symOrPreg() {} - OriginalSt(uint32 index, PregIdx rIdx, PUIdx pIdx, MapleAllocator &alloc) - : OriginalSt(OStIdx(index), alloc, true, false, 0) { - ostType = kPregOst; - symOrPreg.pregIdx = rIdx; - puIdx = pIdx; - } + : OriginalSt(OStIdx(index), alloc, true, false, 0, pIdx, kPregOst, false, { .pregIdx = rIdx }) {} - OriginalSt(uint32 index, MIRSymbol &mirSt, PUIdx pIdx, FieldID fieldIDPara, MapleAllocator &alloc) - : OriginalSt(OStIdx(index), alloc, mirSt.IsLocal(), mirSt.GetStorageClass() == kScFormal, fieldIDPara) { - ostType = kSymbolOst; - symOrPreg.mirSt = &mirSt; - puIdx = pIdx; - ignoreRC = mirSt.IgnoreRC(); - } + OriginalSt(uint32 index, MIRSymbol &mirSt, PUIdx pIdx, FieldID fieldID, MapleAllocator &alloc) + : OriginalSt(OStIdx(index), alloc, mirSt.IsLocal(), mirSt.GetStorageClass() == kScFormal, fieldID, pIdx, + kSymbolOst, mirSt.IgnoreRC(), { .mirSt = &mirSt }) {} + + ~OriginalSt() = default; void Dump() const; PregIdx GetPregIdx() const { @@ -107,25 +92,22 @@ class OriginalSt { bool IsFormal() const { return isFormal; } - - void SetIsFormal(bool isFormalPara = true) { - this->isFormal = isFormalPara; + void SetIsFormal(bool isFormal) { + this->isFormal = isFormal; } bool IsFinal() const { return isFinal; } - - void SetIsFinal(bool isFinalPara = true) { - this->isFinal = isFinalPara; + void SetIsFinal(bool isFinal = true) { + this->isFinal = isFinal; } bool IsPrivate() const { return isPrivate; } - - void SetIsPrivate(bool isPrivatePara = true) { - this->isPrivate = isPrivatePara; + void SetIsPrivate(bool isPrivate) { + this->isPrivate = isPrivate; } bool IsVolatile() const { @@ -158,12 +140,10 @@ class OriginalSt { return indirectLev; } - void SetIndirectLev(int8 idl) { - this->indirectLev = idl; + void SetIndirectLev(int8 level) { + indirectLev = level; } - ~OriginalSt() = default; - OStIdx GetIndex() const { return index; } @@ -200,8 +180,8 @@ class OriginalSt { return fieldID; } - void SetFieldID(FieldID fieldIDPara) { - fieldID = fieldIDPara; + void SetFieldID(FieldID fieldID) { + this->fieldID = fieldID; } bool IsIgnoreRC() const { @@ -229,8 +209,24 @@ class OriginalSt { kUnkonwnOst, kSymbolOst, kPregOst - } ostType; + }; + union SymOrPreg { + PregIdx pregIdx; + MIRSymbol *mirSt; + }; + OriginalSt(OStIdx index, MapleAllocator &alloc, bool local, bool isFormal, FieldID fieldID, PUIdx pIdx, + OSTType ostType, bool ignoreRC, SymOrPreg sysOrPreg) + : ostType(ostType), + index(index), + versionsIndex(alloc.Adapter()), + fieldID(fieldID), + isLocal(local), + isFormal(isFormal), + ignoreRC(ignoreRC), + symOrPreg(sysOrPreg), + puIdx(pIdx) {} + OSTType ostType; OStIdx index; // index number in originalStVector MapleVector versionsIndex; // the i-th element refers the index of versionst in versionst table size_t zeroVersionIndex = 0; // same as versionsIndex[0] @@ -244,11 +240,7 @@ class OriginalSt { bool isPrivate = false; // if the field has private attribute, only when fieldID != 0 bool ignoreRC = false; // base on MIRSymbol's IgnoreRC() bool epreLocalRefVar = false; // is a localrefvar temp created by epre phase - union { - PregIdx pregIdx; - MIRSymbol *mirSt; - } symOrPreg; - + SymOrPreg symOrPreg; PUIdx puIdx; }; @@ -271,11 +263,7 @@ class OriginalStTable { return originalStVector[id.idx]; } OriginalSt *GetOriginalStFromID(OStIdx id, bool checkFirst = false) { - if (checkFirst && id.idx >= originalStVector.size()) { - return nullptr; - } - ASSERT(id.idx < originalStVector.size(), "symbol table index out of range"); - return originalStVector[id.idx]; + return const_cast(const_cast(this)->GetOriginalStFromID(id, checkFirst)); } size_t Size() const { @@ -287,8 +275,7 @@ class OriginalStTable { return ost.GetMIRSymbol(); } MIRSymbol *GetMIRSymbolFromOriginalSt(OriginalSt &ost) { - ASSERT(ost.IsRealSymbol(), "runtime check error"); - return ost.GetMIRSymbol(); + return const_cast(const_cast(this)->GetMIRSymbolFromOriginalSt(ost)); } const MIRSymbol *GetMIRSymbolFromID(OStIdx id) const { diff --git a/src/maple_me/include/ssa.h b/src/maple_me/include/ssa.h index 8e5f8e5826560ec17cff6c21d73a56ca0f41e5ae..6bfc00b8090d26a039f471b1b851f38e734a04b5 100644 --- a/src/maple_me/include/ssa.h +++ b/src/maple_me/include/ssa.h @@ -57,7 +57,7 @@ class PhiNode { phiOpnds[index] = &opnd; } - void SetPhiOpnds(MapleVector phiOpndsPara) { + void SetPhiOpnds(const MapleVector &phiOpndsPara) { phiOpnds = phiOpndsPara; } diff --git a/src/maple_me/include/ssa_mir_nodes.h b/src/maple_me/include/ssa_mir_nodes.h index 606e7896877c98c915af97c053fe7b4092860341..a4bd41981196a989a7ac220d3d5dbab876aaaa02 100644 --- a/src/maple_me/include/ssa_mir_nodes.h +++ b/src/maple_me/include/ssa_mir_nodes.h @@ -418,9 +418,9 @@ class StmtsSSAPart { } void SetSSAPartOf(const StmtNode &s, VersionSt *vst) { - auto *vStSSAPart = GetSSAPartMp()->New(); - vStSSAPart->SetSSAVar(*vst); - ssaPart[s.GetStmtID()] = vStSSAPart; + auto *vstSSAPart = GetSSAPartMp()->New(); + vstSSAPart->SetSSAVar(*vst); + ssaPart[s.GetStmtID()] = vstSSAPart; } MemPool *GetSSAPartMp() { @@ -440,10 +440,10 @@ class StmtsSSAPart { // The following expression nodes need extra fields to represent SSA class AddrofSSANode : public AddrofNode { public: - explicit AddrofSSANode(const AddrofNode *addrnode) : AddrofNode(addrnode->GetOpCode()) { - SetPrimType(addrnode->GetPrimType()); - SetStIdx(addrnode->GetStIdx()); - SetFieldID(addrnode->GetFieldID()); + explicit AddrofSSANode(const AddrofNode *addrofNode) : AddrofNode(addrofNode->GetOpCode()) { + SetPrimType(addrofNode->GetPrimType()); + SetStIdx(addrofNode->GetStIdx()); + SetFieldID(addrofNode->GetFieldID()); ssaVar = nullptr; } @@ -459,11 +459,9 @@ class AddrofSSANode : public AddrofNode { const VersionSt *GetSSAVar() const { return ssaVar; } - VersionSt *GetSSAVar() { return ssaVar; } - void SetSSAVar(VersionSt *ssaVarPara) { ssaVar = ssaVarPara; } @@ -474,11 +472,11 @@ class AddrofSSANode : public AddrofNode { class IreadSSANode : public IreadNode { public: - IreadSSANode(MapleAllocator *alloc, IreadNode *inode) : IreadNode(inode->GetOpCode()), ssaVar(nullptr) { - SetPrimType(inode->GetPrimType()); - tyIdx = inode->GetTyIdx(); - fieldID = inode->GetFieldID(); - SetOpnd(inode->Opnd()); + IreadSSANode(MapleAllocator *alloc, IreadNode *iNode) : IreadNode(iNode->GetOpCode()), ssaVar(nullptr) { + SetPrimType(iNode->GetPrimType()); + tyIdx = iNode->GetTyIdx(); + fieldID = iNode->GetFieldID(); + SetOpnd(iNode->Opnd()); } ~IreadSSANode() override = default; @@ -504,9 +502,9 @@ class IreadSSANode : public IreadNode { class RegreadSSANode : public RegreadNode { public: - explicit RegreadSSANode(const RegreadNode *rreadnode) : RegreadNode() { - SetPrimType(rreadnode->GetPrimType()); - SetRegIdx(rreadnode->GetRegIdx()); + explicit RegreadSSANode(const RegreadNode *readNode) : RegreadNode() { + SetPrimType(readNode->GetPrimType()); + SetRegIdx(readNode->GetRegIdx()); } ~RegreadSSANode() override = default; diff --git a/src/maple_me/src/alias_analysis_table.cpp b/src/maple_me/src/alias_analysis_table.cpp index 190f7ee79ccf84cd854ab8c3b7edfa86ecda545f..325cd4a3a23024ce4dc11ab8c91c2ce174cb2b12 100644 --- a/src/maple_me/src/alias_analysis_table.cpp +++ b/src/maple_me/src/alias_analysis_table.cpp @@ -24,19 +24,21 @@ OriginalSt *AliasAnalysisTable::GetPrevLevelNode(const OriginalSt &ost) { } MapleVector *AliasAnalysisTable::GetNextLevelNodes(const OriginalSt &ost) { - auto findNode = nextLevelNodes.find(ost.GetIndex()); - if (findNode == nextLevelNodes.end()) { - MapleVector *newOriginalStVec = - alloc.GetMemPool()->New>(alloc.Adapter()); - nextLevelNodes.insert(std::make_pair(ost.GetIndex(), newOriginalStVec)); - return newOriginalStVec; + auto it = nextLevelNodes.find(ost.GetIndex()); + if (it != nextLevelNodes.end()) { + return it->second; } - return findNode->second; + + MapleVector *newOriginalStVec = + alloc.GetMemPool()->New>(alloc.Adapter()); + nextLevelNodes.insert(std::make_pair(ost.GetIndex(), newOriginalStVec)); + return newOriginalStVec; } OriginalSt *AliasAnalysisTable::FindOrCreateAddrofSymbolOriginalSt(OriginalSt &ost) { - if (prevLevelNode.find(ost.GetIndex()) != prevLevelNode.end()) { - return prevLevelNode[ost.GetIndex()]; + auto it = prevLevelNode.find(ost.GetIndex()); + if (it != prevLevelNode.end()) { + return it->second; } // create a new node OriginalStTable &originalStTab = ssaTab.GetOriginalStTable(); @@ -48,19 +50,19 @@ OriginalSt *AliasAnalysisTable::FindOrCreateAddrofSymbolOriginalSt(OriginalSt &o TyIdx newTyIdx = GlobalTables::GetTypeTable().GetOrCreateMIRType(&pointType); prevLevelOst->SetTyIdx(newTyIdx); prevLevelOst->SetFieldID(ost.GetFieldID()); - GetNextLevelNodes(*prevLevelOst)->push_back(const_cast(&ost)); + GetNextLevelNodes(*prevLevelOst)->push_back(&ost); prevLevelNode.insert(std::make_pair(ost.GetIndex(), prevLevelOst)); return prevLevelOst; } -OriginalSt *AliasAnalysisTable::FindOrCreateExtraLevSymOrRegOriginalSt(OriginalSt &ost, TyIdx ptyIdx, FieldID fld) { - TyIdx ptyIdxOfOSt = ost.GetTyIdx(); - FieldID fldIDInOSt = fld; - if (ptyIdxOfOSt != ptyIdx) { - (void)klassHierarchy.UpdateFieldID(ptyIdx, ptyIdxOfOSt, fldIDInOSt); +OriginalSt *AliasAnalysisTable::FindOrCreateExtraLevSymOrRegOriginalSt(OriginalSt &ost, TyIdx tyIdx, FieldID fld) { + TyIdx ptyIdxOfOst = ost.GetTyIdx(); + FieldID fldIDInOst = fld; + if (ptyIdxOfOst != tyIdx) { + (void)klassHierarchy.UpdateFieldID(tyIdx, ptyIdxOfOst, fldIDInOst); } MapleVector *nextLevelOsts = GetNextLevelNodes(ost); - OriginalSt *nextLevOst = FindExtraLevOriginalSt(*nextLevelOsts, fldIDInOSt); + OriginalSt *nextLevOst = FindExtraLevOriginalSt(*nextLevelOsts, fldIDInOst); if (nextLevOst != nullptr) { return nextLevOst; } @@ -69,7 +71,7 @@ OriginalSt *AliasAnalysisTable::FindOrCreateExtraLevSymOrRegOriginalSt(OriginalS OriginalStTable &originalStTab = ssaTab.GetOriginalStTable(); if (ost.IsSymbolOst()) { nextLevOst = memPool->New(originalStTab.Size(), *ost.GetMIRSymbol(), - ost.GetPuIdx(), fldIDInOSt, originalStTab.GetAlloc()); + ost.GetPuIdx(), fldIDInOst, originalStTab.GetAlloc()); } else { nextLevOst = memPool->New(originalStTab.Size(), ost.GetPregIdx(), ost.GetPuIdx(), originalStTab.GetAlloc()); @@ -78,12 +80,12 @@ OriginalSt *AliasAnalysisTable::FindOrCreateExtraLevSymOrRegOriginalSt(OriginalS CHECK_FATAL(ost.GetIndirectLev() < INT8_MAX, "boundary check"); nextLevOst->SetIndirectLev(ost.GetIndirectLev() + 1); prevLevelNode.insert(std::make_pair(nextLevOst->GetIndex(), &ost)); - ptyIdx = (ptyIdx == 0) ? ost.GetTyIdx() : ptyIdx; - if (ptyIdx != 0) { + tyIdx = (tyIdx == 0) ? ost.GetTyIdx() : tyIdx; + if (tyIdx != 0) { // use the tyIdx info from the instruction - MIRType *mirType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ptyIdx); + const MIRType *mirType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(tyIdx); if (mirType->GetKind() == kTypePointer) { - MIRPtrType *ptType = static_cast(mirType); + const auto *ptType = static_cast(mirType); TyIdxFieldAttrPair fieldPair = ptType->GetPointedTyIdxFldAttrPairWithFieldID(fld); nextLevOst->SetTyIdx(fieldPair.first); nextLevOst->SetIsFinal(fieldPair.second.GetAttr(FLDATTR_final) && !mirModule.CurFunction()->IsConstructor()); diff --git a/src/maple_me/src/alias_class.cpp b/src/maple_me/src/alias_class.cpp index cb1ae2be7c3bafefe2cb519b13e445047e1085c8..7ab4faf2ff2f7a6b0962657e9f18aacb68d1d4b1 100644 --- a/src/maple_me/src/alias_class.cpp +++ b/src/maple_me/src/alias_class.cpp @@ -16,21 +16,23 @@ #include "mpl_logging.h" #include "opcode_info.h" #include "ssa_mir_nodes.h" -#include "ssa_tab.h" #include "mir_function.h" #include "mir_builder.h" namespace { -} +using namespace maple; -namespace maple { -static inline bool IsReadOnlyOst(const OriginalSt &ost) { + +inline bool IsReadOnlyOst(const OriginalSt &ost) { return ost.GetMIRSymbol()->HasAddrOfValues(); } -static inline bool IsPotentialAddress(PrimType ptyp) { - return IsAddress(ptyp) || IsPrimitiveDynType(ptyp); + +inline bool IsPotentialAddress(PrimType pType) { + return IsAddress(pType) || IsPrimitiveDynType(pType); } +} // namespace +namespace maple { bool AliasClass::CallHasNoSideEffectOrPrivateDefEffect(const CallNode &stmt, FuncAttrKind attrKind) const { ASSERT(attrKind == FUNCATTR_nosideeffect || attrKind == FUNCATTR_noprivate_defeffect, "Not supportted attrKind"); MIRFunction *callee = GlobalTables::GetFunctionTable().GetFunctionFromPuidx(stmt.GetPUIdx()); @@ -56,30 +58,30 @@ AliasElem *AliasClass::FindOrCreateAliasElem(OriginalSt &ost) { OStIdx ostIdx = ost.GetIndex(); CHECK_FATAL(ostIdx.idx > 0, "Invalid ost index"); CHECK_FATAL(ostIdx.idx < osym2Elem.size(), "Index out of range"); - AliasElem *aelem = osym2Elem[ostIdx.idx]; - if (aelem != nullptr) { - return aelem; + AliasElem *aliasElem = osym2Elem[ostIdx.idx]; + if (aliasElem != nullptr) { + return aliasElem; } - aelem = acMemPool.New(id2Elem.size(), ost); + aliasElem = acMemPool.New(id2Elem.size(), ost); if (ost.IsSymbolOst() && ost.GetIndirectLev() >= 0) { - MIRSymbol *sym = ost.GetMIRSymbol(); + const MIRSymbol *sym = ost.GetMIRSymbol(); if (sym->IsGlobal() && !sym->HasAddrOfValues() && !sym->GetIsTmp()) { globalsMayAffectedByClinitCheck.insert(ostIdx); if (!sym->IsReflectionClassInfo()) { if (!ost.IsFinal() || InConstructorLikeFunc()) { - globalsAffectedByCalls.insert(aelem->GetClassID()); + globalsAffectedByCalls.insert(aliasElem->GetClassID()); } - aelem->SetNextLevNotAllDefsSeen(true); + aliasElem->SetNextLevNotAllDefsSeen(true); } } } - if (aelem->GetOriginalSt().IsFormal() || ost.GetIndirectLev() > 0) { - aelem->SetNextLevNotAllDefsSeen(true); + if (aliasElem->GetOriginalSt().IsFormal() || ost.GetIndirectLev() > 0) { + aliasElem->SetNextLevNotAllDefsSeen(true); } - id2Elem.push_back(aelem); - osym2Elem[ostIdx.idx] = aelem; + id2Elem.push_back(aliasElem); + osym2Elem[ostIdx.idx] = aliasElem; unionFind.NewMember(); - return aelem; + return aliasElem; } AliasElem *AliasClass::FindOrCreateExtraLevAliasElem(BaseNode &expr, TyIdx tyIdx, FieldID fieldId) { @@ -112,19 +114,19 @@ AliasElem *AliasClass::CreateAliasElemsExpr(BaseNode &expr) { return &FindOrCreateAliasElemOfAddrofOSt(oSt); } case OP_dread: { - OriginalSt &oSt = *static_cast(expr).GetSSAVar()->GetOrigSt(); - return FindOrCreateAliasElem(oSt); + OriginalSt &ost = *static_cast(expr).GetSSAVar()->GetOrigSt(); + return FindOrCreateAliasElem(ost); } case OP_regread: { OriginalSt &oSt = *static_cast(expr).GetSSAVar()->GetOrigSt(); return (oSt.IsSpecialPreg()) ? nullptr : FindOrCreateAliasElem(oSt); } case OP_iread: { - IreadNode &iread = static_cast(expr); + auto &iread = static_cast(expr); return FindOrCreateExtraLevAliasElem(*iread.Opnd(0), iread.GetTyIdx(), iread.GetFieldID()); } case OP_iaddrof: { - IreadNode &iread = static_cast(expr); + auto &iread = static_cast(expr); AliasElem *ae = FindOrCreateExtraLevAliasElem(*iread.Opnd(0), iread.GetTyIdx(), iread.GetFieldID()); return &FindOrCreateAliasElemOfAddrofOSt(ae->GetOriginalSt()); } @@ -134,13 +136,13 @@ AliasElem *AliasClass::CreateAliasElemsExpr(BaseNode &expr) { case OP_add: case OP_sub: case OP_array: { - for (size_t i = 1; i < expr.NumOpnds(); i++) { + for (size_t i = 1; i < expr.NumOpnds(); ++i) { CreateAliasElemsExpr(*expr.Opnd(i)); } return CreateAliasElemsExpr(*expr.Opnd(0)); } case OP_intrinsicop: { - IntrinsicopNode &intrn = static_cast(expr); + auto &intrn = static_cast(expr); if (intrn.GetIntrinsic() == INTRN_JAVA_MERGE && intrn.NumOpnds() == 1 && intrn.GetNopndAt(0)->GetOpCode() == OP_dread) { return CreateAliasElemsExpr(*intrn.GetNopndAt(0)); @@ -148,7 +150,7 @@ AliasElem *AliasClass::CreateAliasElemsExpr(BaseNode &expr) { // fall-through } default: - for (size_t i = 0; i < expr.NumOpnds(); i++) { + for (size_t i = 0; i < expr.NumOpnds(); ++i) { CreateAliasElemsExpr(*expr.Opnd(i)); } } @@ -158,7 +160,7 @@ AliasElem *AliasClass::CreateAliasElemsExpr(BaseNode &expr) { // when a mustDef is a pointer, set its pointees' notAllDefsSeen flag to true void AliasClass::SetNotAllDefsSeenForMustDefs(const StmtNode &callas) { MapleVector &mustDefs = ssaTab.GetStmtsSSAPart().GetMustDefNodesOf(callas); - for (MustDefNode mustDef : mustDefs) { + for (auto &mustDef : mustDefs) { AliasElem *aliasElem = FindOrCreateAliasElem(*mustDef.GetResult()->GetOrigSt()); aliasElem->SetNextLevNotAllDefsSeen(true); } @@ -166,8 +168,8 @@ void AliasClass::SetNotAllDefsSeenForMustDefs(const StmtNode &callas) { void AliasClass::ApplyUnionForDassignCopy(const AliasElem &lhsAe, const AliasElem *rhsAe, const BaseNode &rhs) { if (rhsAe == nullptr || rhsAe->GetOriginalSt().GetIndirectLev() > 0 || rhsAe->IsNotAllDefsSeen()) { - AliasElem *ae = FindAliasElem(lhsAe.GetOriginalSt()); - ae->SetNextLevNotAllDefsSeen(true); + AliasElem *aliasElem = FindAliasElem(lhsAe.GetOriginalSt()); + aliasElem->SetNextLevNotAllDefsSeen(true); return; } if (!IsPotentialAddress(rhs.GetPrimType()) || kOpcodeInfo.NotPure(rhs.GetOpCode()) || @@ -177,19 +179,19 @@ void AliasClass::ApplyUnionForDassignCopy(const AliasElem &lhsAe, const AliasEle unionFind.Union(lhsAe.GetClassID(), rhsAe->GetClassID()); } -void AliasClass::SetPtrOpndNextLevNADS(const BaseNode &opnd, AliasElem *ae, bool hasNoPrivateDefEffect) { - if (IsPotentialAddress(opnd.GetPrimType()) && ae != nullptr && - !(hasNoPrivateDefEffect && ae->GetOriginalSt().IsPrivate()) && - !(opnd.GetOpCode() == OP_addrof && IsReadOnlyOst(ae->GetOriginalSt()))) { - ae->SetNextLevNotAllDefsSeen(true); +void AliasClass::SetPtrOpndNextLevNADS(const BaseNode &opnd, AliasElem *aliasElem, bool hasNoPrivateDefEffect) { + if (IsPotentialAddress(opnd.GetPrimType()) && aliasElem != nullptr && + !(hasNoPrivateDefEffect && aliasElem->GetOriginalSt().IsPrivate()) && + !(opnd.GetOpCode() == OP_addrof && IsReadOnlyOst(aliasElem->GetOriginalSt()))) { + aliasElem->SetNextLevNotAllDefsSeen(true); } } -// Set ae of the pointer-type opnds of a call as next_level_not_all_defines_seen +// Set aliasElem of the pointer-type opnds of a call as next_level_not_all_defines_seen void AliasClass::SetPtrOpndsNextLevNADS(unsigned int start, unsigned int end, MapleVector &opnds, bool hasNoPrivateDefEffect) { - for (unsigned int i = start; i < end; i++) { + for (size_t i = start; i < end; ++i) { BaseNode *opnd = opnds[i]; SetPtrOpndNextLevNADS(*opnd, CreateAliasElemsExpr(*opnd), hasNoPrivateDefEffect); } @@ -211,11 +213,11 @@ void AliasClass::ApplyUnionForCopies(StmtNode &stmt) { return; } case OP_iassign: { - IassignNode &iass = static_cast(stmt); - AliasElem *rhsAe = CreateAliasElemsExpr(*iass.Opnd(1)); - AliasElem *lhsAe = FindOrCreateExtraLevAliasElem(*iass.Opnd(0), iass.GetTyIdx(), iass.GetFieldID()); - ASSERT(lhsAe != nullptr, "aliaselem of lhs should not be null"); - ApplyUnionForDassignCopy(*lhsAe, rhsAe, *iass.Opnd(1)); + auto &iass = static_cast(stmt); + AliasElem *rhsAliasElem = CreateAliasElemsExpr(*iass.Opnd(1)); + AliasElem *lhsAliasElem = FindOrCreateExtraLevAliasElem(*iass.Opnd(0), iass.GetTyIdx(), iass.GetFieldID()); + ASSERT(lhsAliasElem != nullptr, "aliaselem of lhs should not be null"); + ApplyUnionForDassignCopy(*lhsAliasElem, rhsAliasElem, *iass.Opnd(1)); return; } case OP_throw: { @@ -224,7 +226,7 @@ void AliasClass::ApplyUnionForCopies(StmtNode &stmt) { } case OP_call: case OP_callassigned: { - CallNode &call = static_cast(stmt); + auto &call = static_cast(stmt); ASSERT(call.GetPUIdx() < GlobalTables::GetFunctionTable().GetFuncTable().size(), "index out of range in AliasClass::ApplyUnionForCopies"); SetPtrOpndsNextLevNADS(0, call.NumOpnds(), call.GetNopnd(), false); @@ -246,7 +248,7 @@ void AliasClass::ApplyUnionForCopies(StmtNode &stmt) { case OP_interfaceicallassigned: case OP_customcallassigned: case OP_polymorphiccallassigned: { - CallNode &call = static_cast(stmt); + auto &call = static_cast(stmt); if (CallHasSideEffect(call)) { SetPtrOpndsNextLevNADS(1, call.NumOpnds(), call.GetNopnd(), CallHasNoPrivateDefEffect(call)); } @@ -254,15 +256,15 @@ void AliasClass::ApplyUnionForCopies(StmtNode &stmt) { } case OP_intrinsiccall: case OP_intrinsiccallassigned: { - IntrinsiccallNode &innode = static_cast(stmt); - if (innode.GetIntrinsic() == INTRN_JAVA_POLYMORPHIC_CALL) { - SetPtrOpndsNextLevNADS(0, innode.NumOpnds(), innode.GetNopnd(), false); + auto &intrnNode = static_cast(stmt); + if (intrnNode.GetIntrinsic() == INTRN_JAVA_POLYMORPHIC_CALL) { + SetPtrOpndsNextLevNADS(0, intrnNode.NumOpnds(), intrnNode.GetNopnd(), false); break; } // fallthrough; } default: - for (size_t i = 0; i < stmt.NumOpnds(); i++) { + for (size_t i = 0; i < stmt.NumOpnds(); ++i) { CreateAliasElemsExpr(*stmt.Opnd(i)); } } @@ -273,14 +275,13 @@ void AliasClass::ApplyUnionForCopies(StmtNode &stmt) { void AliasClass::CreateAssignSets() { // iterate through all the alias elems - for (AliasElem *aliasElem : id2Elem) { + for (auto *aliasElem : id2Elem) { unsigned int id = aliasElem->GetClassID(); unsigned int rootID = unionFind.Root(id); if (unionFind.GetElementsNumber(rootID) > 1) { // only root id's have assignset if (id2Elem[rootID]->GetAssignSet() == nullptr) { - id2Elem[rootID]->assignSet = acMemPool.New>(std::less(), - acAlloc.Adapter()); + id2Elem[rootID]->assignSet = acMemPool.New>(acAlloc.Adapter()); } id2Elem[rootID]->AddAssignToSet(id); } @@ -289,7 +290,7 @@ void AliasClass::CreateAssignSets() { void AliasClass::DumpAssignSets() { LogInfo::MapleLogger() << "/////// assign sets ///////\n"; - for (AliasElem *aliasElem : id2Elem) { + for (auto *aliasElem : id2Elem) { if (unionFind.Root(aliasElem->GetClassID()) != aliasElem->GetClassID()) { continue; } @@ -314,19 +315,19 @@ bool AliasClass::IsPointedTo(OriginalSt &oSt) { void AliasClass::UnionAllPointedTos() { std::vector pointedTos; - for (AliasElem *aliasElem : id2Elem) { + for (auto *aliasElem : id2Elem) { if (IsPointedTo(aliasElem->GetOriginalSt())) { aliasElem->SetNotAllDefsSeen(true); pointedTos.push_back(aliasElem); } } - for (size_t i = 1; i < pointedTos.size(); i++) { + for (size_t i = 1; i < pointedTos.size(); ++i) { unionFind.Union(pointedTos[0]->GetClassID(), pointedTos[i]->GetClassID()); } } void AliasClass::UpdateNextLevelNodes(std::vector &nextLevelOsts, const AliasElem &aliasElem) { - for (unsigned int elemID : *(aliasElem.GetAssignSet())) { + for (size_t elemID : *(aliasElem.GetAssignSet())) { for (OriginalSt *nextLevelNode : *(GetAliasAnalysisTable()->GetNextLevelNodes(id2Elem[elemID]->GetOriginalSt()))) { nextLevelOsts.push_back(nextLevelNode); } @@ -334,9 +335,9 @@ void AliasClass::UpdateNextLevelNodes(std::vector &nextLevelOsts, c } void AliasClass::UnionNodes(std::vector &nextLevelOsts) { - for (size_t i = 0; i < nextLevelOsts.size(); i++) { + for (size_t i = 0; i < nextLevelOsts.size(); ++i) { OriginalSt *ost1 = nextLevelOsts[i]; - for (size_t j = i + 1; j < nextLevelOsts.size(); j++) { + for (size_t j = i + 1; j < nextLevelOsts.size(); ++j) { OriginalSt *ost2 = nextLevelOsts[j]; if ((ost1->GetFieldID() == 0 || ost2->GetFieldID() == 0 || ost1->GetFieldID() == ost2->GetFieldID()) && !(ost1->IsFinal() || ost2->IsFinal())) { @@ -349,7 +350,7 @@ void AliasClass::UnionNodes(std::vector &nextLevelOsts) { // process the union among the pointed's of assignsets void AliasClass::ApplyUnionForPointedTos() { - for (AliasElem *aliasElem : id2Elem) { + for (auto *aliasElem : id2Elem) { if (aliasElem->GetAssignSet() == nullptr) { continue; } @@ -372,17 +373,17 @@ void AliasClass::CollectRootIDOfNextLevelNodes(const OriginalSt &ost, void AliasClass::UnionForNotAllDefsSeen() { std::set rootIDOfNADSs; - for (AliasElem *ae : id2Elem) { - if (ae->GetAssignSet() == nullptr) { - if (ae->IsNotAllDefsSeen() || ae->IsNextLevNotAllDefsSeen()) { - CollectRootIDOfNextLevelNodes(ae->GetOriginalSt(), rootIDOfNADSs); + for (auto *aliasElem : id2Elem) { + if (aliasElem->GetAssignSet() == nullptr) { + if (aliasElem->IsNotAllDefsSeen() || aliasElem->IsNextLevNotAllDefsSeen()) { + CollectRootIDOfNextLevelNodes(aliasElem->GetOriginalSt(), rootIDOfNADSs); } continue; } - for (unsigned int elemIdA : *(ae->GetAssignSet())) { + for (size_t elemIdA : *(aliasElem->GetAssignSet())) { AliasElem *aeA = id2Elem[elemIdA]; if (aeA->IsNotAllDefsSeen() || aeA->IsNextLevNotAllDefsSeen()) { - for (unsigned int elemIdB : *(ae->GetAssignSet())) { + for (unsigned int elemIdB : *(aliasElem->GetAssignSet())) { CollectRootIDOfNextLevelNodes(id2Elem[elemIdB]->GetOriginalSt(), rootIDOfNADSs); } break; @@ -392,12 +393,12 @@ void AliasClass::UnionForNotAllDefsSeen() { if (!rootIDOfNADSs.empty()) { unsigned int elemIdA = *(rootIDOfNADSs.begin()); rootIDOfNADSs.erase(rootIDOfNADSs.begin()); - for (unsigned int elemIdB : rootIDOfNADSs) { + for (size_t elemIdB : rootIDOfNADSs) { unionFind.Union(elemIdA, elemIdB); } - for (AliasElem *ae : id2Elem) { - if (unionFind.Root(ae->GetClassID()) == unionFind.Root(elemIdA)) { - ae->SetNotAllDefsSeen(true); + for (auto *aliasElem : id2Elem) { + if (unionFind.Root(aliasElem->GetClassID()) == unionFind.Root(elemIdA)) { + aliasElem->SetNotAllDefsSeen(true); } } } @@ -405,9 +406,9 @@ void AliasClass::UnionForNotAllDefsSeen() { // fabricate the imaginary not_all_def_seen AliasElem AliasElem *AliasClass::FindOrCreateDummyNADSAe() { - MIRSymbol *dummySym = mirModule.GetMIRBuilder()->GetOrCreateSymbol((TyIdx)PTY_i32, "__nads_dummysym__", kStVar, - kScGlobal, nullptr, kScopeGlobal, false); - ASSERT(dummySym != nullptr, "nullptr check"); + MIRSymbol *dummySym = mirModule.GetMIRBuilder()->GetOrCreateSymbol(TyIdx(PTY_i32), "__nads_dummysym__", kStVar, + kScGlobal, nullptr, kScopeGlobal, false); + ASSERT_NOT_NULL(dummySym); dummySym->SetIsTmp(true); dummySym->SetIsDeleted(); OriginalSt *dummyOst = ssaTab.GetOriginalStTable().CreateSymbolOriginalSt(*dummySym, 0, 0); @@ -426,8 +427,8 @@ AliasElem *AliasClass::FindOrCreateDummyNADSAe() { // Collect the alias groups. Each alias group is a map that maps the rootId to the ids aliasing with the root. void AliasClass::CollectAliasGroups(std::map> &aliasGroups) { // key is the root id. The set contains ids of aes that alias with the root. - for (AliasElem *ae : id2Elem) { - unsigned int id = ae->GetClassID(); + for (AliasElem *aliasElem : id2Elem) { + unsigned int id = aliasElem->GetClassID(); unsigned int rootID = unionFind.Root(id); if (id == rootID) { continue; @@ -441,9 +442,9 @@ void AliasClass::CollectAliasGroups(std::mapGetKlassFromTyIdx(mirTypeA->GetTypeIndex()); - CHECK_FATAL(klassA != nullptr, "null ptr check"); + CHECK_NULL_FATAL(klassA); Klass *klassB = klassHierarchy->GetKlassFromTyIdx(mirTypeB->GetTypeIndex()); - CHECK_FATAL(klassB != nullptr, "null ptr check"); + CHECK_NULL_FATAL(klassB); return (klassA == klassB || klassA->GetKlassName() == NameMangler::kJavaLangObjectStr || klassB->GetKlassName() == NameMangler::kJavaLangObjectStr || klassHierarchy->IsSuperKlass(klassA, klassB) || klassHierarchy->IsSuperKlass(klassB, klassA)); } case kTypePointer: { - MIRType *pointedTypeA = (static_cast(mirTypeA))->GetPointedType(); - MIRType *pointedTypeB = (static_cast(mirTypeB))->GetPointedType(); + auto *pointedTypeA = (static_cast(mirTypeA))->GetPointedType(); + auto *pointedTypeB = (static_cast(mirTypeB))->GetPointedType(); return AliasAccordingToType(pointedTypeA->GetTypeIndex(), pointedTypeB->GetTypeIndex()); } case kTypeJArray: { - MIRJarrayType *mirJarrayTypeA = static_cast(mirTypeA); - MIRJarrayType *mirJarrayTypeB = static_cast(mirTypeB); + auto *mirJarrayTypeA = static_cast(mirTypeA); + auto *mirJarrayTypeB = static_cast(mirTypeB); return AliasAccordingToType(mirJarrayTypeA->GetElemTyIdx(), mirJarrayTypeB->GetElemTyIdx()); } default: @@ -478,14 +479,14 @@ bool AliasClass::AliasAccordingToType(TyIdx tyidxA, TyIdx tyidxB) { } } -int AliasClass::GetOffset(const Klass &super, Klass &base) const { +int AliasClass::GetOffset(const Klass &super, const Klass &base) const { int offset = 0; const Klass *superPtr = &super; const Klass *basePtr = &base; while (basePtr != superPtr) { basePtr = basePtr->GetSuperKlass(); - ASSERT(basePtr != nullptr, "null ptr check"); - offset++; + ASSERT_NOT_NULL(basePtr); + ++offset; } return offset; } @@ -531,7 +532,7 @@ void AliasClass::ProcessIdsAliasWithRoot(const std::set &idsAliasW } void AliasClass::ReconstructAliasGroups() { - // map the root id to the set contains the ae-id that alias with the root. + // map the root id to the set contains the aliasElem-id that alias with the root. std::map> aliasGroups; CollectAliasGroups(aliasGroups); unionFind.Reinit(); @@ -546,9 +547,9 @@ void AliasClass::ReconstructAliasGroups() { } void AliasClass::CollectNotAllDefsSeenAes() { - for (AliasElem *ae : id2Elem) { - if (ae->IsNotAllDefsSeen() && ae->GetClassID() == unionFind.Root(ae->GetClassID())) { - notAllDefsSeenClassSetRoots.push_back(ae); + for (AliasElem *aliasElem : id2Elem) { + if (aliasElem->IsNotAllDefsSeen() && aliasElem->GetClassID() == unionFind.Root(aliasElem->GetClassID())) { + notAllDefsSeenClassSetRoots.push_back(aliasElem); } } } @@ -560,8 +561,7 @@ void AliasClass::CreateClassSets() { unsigned int rootID = unionFind.Root(id); if (unionFind.GetElementsNumber(rootID) > 1) { if (id2Elem[rootID]->GetClassSet() == nullptr) { - id2Elem[rootID]->classSet = acMemPool.New>(std::less(), - acAlloc.Adapter()); + id2Elem[rootID]->classSet = acMemPool.New>(acAlloc.Adapter()); } aliasElem->classSet = id2Elem[rootID]->classSet; aliasElem->AddClassToSet(id); @@ -579,7 +579,7 @@ void AliasClass::CreateClassSets() { #endif } -void AliasElem::Dump(MIRModule &mod) const { +void AliasElem::Dump(const MIRModule &mod) const { ost.Dump(); LogInfo::MapleLogger() << "id" << id << ((notAllDefsSeen) ? "? " : " "); } @@ -607,7 +607,7 @@ void AliasClass::DumpClassSets() { // here starts pass 2 code void AliasClass::InsertMayUseExpr(BaseNode &expr) { - for (size_t i = 0; i < expr.NumOpnds(); i++) { + for (size_t i = 0; i < expr.NumOpnds(); ++i) { InsertMayUseExpr(*expr.Opnd(i)); } if (expr.GetOpCode() != OP_iread) { @@ -617,7 +617,7 @@ void AliasClass::InsertMayUseExpr(BaseNode &expr) { if (rhsAe == nullptr) { rhsAe = FindOrCreateDummyNADSAe(); } - IreadSSANode &ireadNode = static_cast(expr); + auto &ireadNode = static_cast(expr); ireadNode.SetSSAVar(ssaTab.GetVersionStTable().GetVersionStFromID(rhsAe->GetOriginalSt().GetZeroVersionIndex())); ASSERT(ireadNode.GetSSAVar() != nullptr, "AliasClass::InsertMayUseExpr(): iread cannot have empty mayuse"); } @@ -669,12 +669,12 @@ void AliasClass::InsertMayUseReturn(const StmtNode &stmt) { // collect next_level_nodes of the ost of ReturnOpnd into mayUseOsts void AliasClass::CollectPtsToOfReturnOpnd(const OriginalSt &ost, std::set &mayUseOsts) { for (OriginalSt *nextLevelOst : *(GetAliasAnalysisTable()->GetNextLevelNodes(ost))) { - AliasElem *indAe = FindAliasElem(*nextLevelOst); - if (!indAe->IsNotAllDefsSeen() && !indAe->GetOriginalSt().IsFinal()) { - if (indAe->GetClassSet() == nullptr) { - mayUseOsts.insert(&indAe->GetOriginalSt()); + AliasElem *aliasElem = FindAliasElem(*nextLevelOst); + if (!aliasElem->IsNotAllDefsSeen() && !aliasElem->GetOriginalSt().IsFinal()) { + if (aliasElem->GetClassSet() == nullptr) { + mayUseOsts.insert(&aliasElem->GetOriginalSt()); } else { - for (unsigned int elemID : *(indAe->GetClassSet())) { + for (unsigned int elemID : *(aliasElem->GetClassSet())) { mayUseOsts.insert(&id2Elem[elemID]->GetOriginalSt()); } } @@ -686,15 +686,15 @@ void AliasClass::CollectPtsToOfReturnOpnd(const OriginalSt &ost, std::setGetPrimType()) && ae != nullptr && !ae->IsNextLevNotAllDefsSeen() && - !(retv->GetOpCode() == OP_addrof && IsReadOnlyOst(ae->GetOriginalSt()))) { + BaseNode *retValue = stmt.Opnd(0); + AliasElem *aliasElem = CreateAliasElemsExpr(*retValue); + if (IsPotentialAddress(retValue->GetPrimType()) && aliasElem != nullptr && !aliasElem->IsNextLevNotAllDefsSeen() && + !(retValue->GetOpCode() == OP_addrof && IsReadOnlyOst(aliasElem->GetOriginalSt()))) { std::set mayUseOsts; - if (ae->GetAssignSet() == nullptr) { - CollectPtsToOfReturnOpnd(ae->GetOriginalSt(), mayUseOsts); + if (aliasElem->GetAssignSet() == nullptr) { + CollectPtsToOfReturnOpnd(aliasElem->GetOriginalSt(), mayUseOsts); } else { - for (unsigned int elemID : *(ae->GetAssignSet())) { + for (unsigned int elemID : *(aliasElem->GetAssignSet())) { CollectPtsToOfReturnOpnd(id2Elem[elemID]->GetOriginalSt(), mayUseOsts); } } @@ -707,11 +707,11 @@ void AliasClass::InsertReturnOpndMayUse(const StmtNode &stmt) { void AliasClass::InsertMayUseAll(const StmtNode &stmt) { MapleMap &mayUseNodes = ssaTab.GetStmtsSSAPart().GetMayUseNodesOf(stmt); - for (AliasElem *ae : id2Elem) { - if (ae->GetOriginalSt().GetIndirectLev() >= 0 && !ae->GetOriginalSt().IsPregOst()) { + for (AliasElem *aliasElem : id2Elem) { + if (aliasElem->GetOriginalSt().GetIndirectLev() >= 0 && !aliasElem->GetOriginalSt().IsPregOst()) { mayUseNodes.insert(std::make_pair( - ae->GetOriginalSt().GetIndex(), - MayUseNode(ssaTab.GetVersionStTable().GetVersionStFromID(ae->GetOriginalSt().GetZeroVersionIndex())))); + aliasElem->GetOriginalSt().GetIndex(), + MayUseNode(ssaTab.GetVersionStTable().GetVersionStFromID(aliasElem->GetOriginalSt().GetZeroVersionIndex())))); } } } @@ -732,7 +732,7 @@ void AliasClass::CollectMayDefForDassign(const StmtNode &stmt, std::set &mayDefOsts, MapleMap &mayDefNodes, - StmtNode &stmt, BBId bbID) { + StmtNode &stmt) { for (OriginalSt *mayDefOst : mayDefOsts) { mayDefNodes.insert(std::make_pair( mayDefOst->GetIndex(), @@ -740,11 +740,11 @@ void AliasClass::InsertMayDefNode(std::set &mayDefOsts, MapleMap mayDefOsts; CollectMayDefForDassign(stmt, mayDefOsts); MapleMap &mayDefNodes = ssaTab.GetStmtsSSAPart().GetMayDefNodesOf(stmt); - InsertMayDefNode(mayDefOsts, mayDefNodes, stmt, bbID); + InsertMayDefNode(mayDefOsts, mayDefNodes, stmt); } bool AliasClass::IsEquivalentField(TyIdx tyIdxA, FieldID fldA, TyIdx tyIdxB, FieldID fldB) const { @@ -755,14 +755,14 @@ bool AliasClass::IsEquivalentField(TyIdx tyIdxA, FieldID fldA, TyIdx tyIdxB, Fie } void AliasClass::CollectMayDefForIassign(StmtNode &stmt, std::set &mayDefOsts) { - IassignNode &iass = static_cast(stmt); - AliasElem *baseAe = CreateAliasElemsExpr(*iass.Opnd(0)); + auto &iassignNode = static_cast(stmt); + AliasElem *baseAe = CreateAliasElemsExpr(*iassignNode.Opnd(0)); AliasElem *lhsAe = nullptr; if (baseAe != nullptr) { // get the next-level-ost that will be assigned to OriginalSt *lhsOst = nullptr; - TyIdx tyIdxOfIass = iass.GetTyIdx(); - FieldID fldOfIass = iass.GetFieldID(); + TyIdx tyIdxOfIass = iassignNode.GetTyIdx(); + FieldID fldOfIass = iassignNode.GetFieldID(); OriginalSt &ostOfBaseExpr = baseAe->GetOriginalSt(); TyIdx tyIdxOfBaseOSt = ostOfBaseExpr.GetTyIdx(); for (OriginalSt *nextLevelNode : *(GetAliasAnalysisTable()->GetNextLevelNodes(ostOfBaseExpr))) { @@ -777,7 +777,7 @@ void AliasClass::CollectMayDefForIassign(StmtNode &stmt, std::set & } else { lhsAe = FindOrCreateDummyNADSAe(); } - // lhsAe does not alias with any ae + // lhsAe does not alias with any aliasElem if (lhsAe->GetClassSet() == nullptr) { mayDefOsts.insert(&lhsAe->GetOriginalSt()); return; @@ -800,28 +800,28 @@ void AliasClass::InsertMayDefNodeExcludeFinalOst(std::set &mayDefOs } } -void AliasClass::InsertMayDefIassign(StmtNode &stmt, BBId bbID) { +void AliasClass::InsertMayDefIassign(StmtNode &stmt) { std::set mayDefOsts; CollectMayDefForIassign(stmt, mayDefOsts); MapleMap &mayDefNodes = ssaTab.GetStmtsSSAPart().GetMayDefNodesOf(stmt); if (mayDefOsts.size() == 1) { - InsertMayDefNode(mayDefOsts, mayDefNodes, stmt, bbID); + InsertMayDefNode(mayDefOsts, mayDefNodes, stmt); } else { InsertMayDefNodeExcludeFinalOst(mayDefOsts, mayDefNodes, stmt); } ASSERT(!mayDefNodes.empty(), "AliasClass::InsertMayUseIassign(): iassign cannot have empty maydef"); } -void AliasClass::InsertMayDefUseSyncOps(StmtNode &stmt, BBId bbID) { +void AliasClass::InsertMayDefUseSyncOps(StmtNode &stmt) { std::set aliasSet; // collect the full alias set first - for (size_t i = 0; i < stmt.NumOpnds(); i++) { + for (size_t i = 0; i < stmt.NumOpnds(); ++i) { BaseNode *addrBase = stmt.Opnd(i); if (addrBase->GetOpCode() == OP_addrof || addrBase->GetOpCode() == OP_dread || addrBase->GetOpCode() == OP_regread) { OriginalSt *ost = (addrBase->GetOpCode() == OP_regread) - ? static_cast(addrBase)->GetSSAVar()->GetOrigSt() - : static_cast(addrBase)->GetSSAVar()->GetOrigSt(); + ? static_cast(addrBase)->GetSSAVar()->GetOrigSt() + : static_cast(addrBase)->GetSSAVar()->GetOrigSt(); if (addrBase->GetOpCode() != OP_addrof) { for (OriginalSt *nextLevelOst : *(GetAliasAnalysisTable()->GetNextLevelNodes(*ost))) { AliasElem *opndAE = osym2Elem[nextLevelOst->GetIndex().idx]; @@ -842,8 +842,8 @@ void AliasClass::InsertMayDefUseSyncOps(StmtNode &stmt, BBId bbID) { } // do the insertion according to aliasSet AccessSSANodes *theSSAPart = ssaTab.GetStmtsSSAPart().SSAPartOf(stmt); - for (unsigned int elemid : aliasSet) { - AliasElem *aliasElem = id2Elem[elemid]; + for (unsigned int elemID : aliasSet) { + AliasElem *aliasElem = id2Elem[elemID]; OriginalSt &ostOfAliasAE = aliasElem->GetOriginalSt(); if (!ostOfAliasAE.IsFinal()) { OStIdx ostIdx = ostOfAliasAE.GetIndex(); @@ -857,7 +857,7 @@ void AliasClass::InsertMayDefUseSyncOps(StmtNode &stmt, BBId bbID) { // collect mayDefs caused by mustDefs void AliasClass::CollectMayDefForMustDefs(const StmtNode &stmt, std::set &mayDefOsts) { MapleVector &mustDefs = ssaTab.GetStmtsSSAPart().GetMustDefNodesOf(stmt); - for (MustDefNode mustDef : mustDefs) { + for (MustDefNode &mustDef : mustDefs) { VersionSt *vst = mustDef.GetResult(); OriginalSt *ost = vst->GetOrigSt(); AliasElem *lhsAe = osym2Elem[ost->GetIndex().idx]; @@ -865,17 +865,17 @@ void AliasClass::CollectMayDefForMustDefs(const StmtNode &stmt, std::setGetClassSet())) { - AliasElem *ae = id2Elem[elemID]; + AliasElem *aliasElem = id2Elem[elemID]; if (elemID != lhsAe->GetClassID() && - ae->GetOriginalSt().GetTyIdx() == lhsAe->GetOriginalSt().GetMIRSymbol()->GetTyIdx()) { - mayDefOsts.insert(&ae->GetOriginalSt()); + aliasElem->GetOriginalSt().GetTyIdx() == lhsAe->GetOriginalSt().GetMIRSymbol()->GetTyIdx()) { + mayDefOsts.insert(&aliasElem->GetOriginalSt()); } } } } void AliasClass::CollectMayUseForCallOpnd(const StmtNode &stmt, std::set &mayUseOsts) { - for (size_t i = 0; i < stmt.NumOpnds(); i++) { + for (size_t i = 0; i < stmt.NumOpnds(); ++i) { BaseNode *expr = stmt.Opnd(i); InsertMayUseExpr(*expr); @@ -883,16 +883,16 @@ void AliasClass::CollectMayUseForCallOpnd(const StmtNode &stmt, std::setIsNextLevNotAllDefsSeen()) { + AliasElem *aliasElem = CreateAliasElemsExpr(*expr); + if (aliasElem == nullptr || aliasElem->IsNextLevNotAllDefsSeen()) { continue; } - if (GlobalTables::GetTypeTable().GetTypeFromTyIdx(ae->GetOriginalSt().GetTyIdx())->PointsToConstString()) { + if (GlobalTables::GetTypeTable().GetTypeFromTyIdx(aliasElem->GetOriginalSt().GetTyIdx())->PointsToConstString()) { continue; } - for (OriginalSt *nextLevelOst : *(GetAliasAnalysisTable()->GetNextLevelNodes(ae->GetOriginalSt()))) { + for (OriginalSt *nextLevelOst : *(GetAliasAnalysisTable()->GetNextLevelNodes(aliasElem->GetOriginalSt()))) { AliasElem *indAe = FindAliasElem(*nextLevelOst); if (indAe->GetOriginalSt().IsFinal()) { @@ -925,7 +925,7 @@ void AliasClass::InsertMayDefNodeForCall(std::set &mayDefOsts, Mapl // Four kinds of mayDefs and mayUses are inserted, which are caused by callee // opnds, not_all_def_seen_ae, globalsAffectedByCalls, and mustDefs. void AliasClass::InsertMayDefUseCall(StmtNode &stmt, BBId bbID, bool hasSideEffect, bool hasNoPrivateDefEffect) { - MayDefMayUsePart *theSSAPart = static_cast(ssaTab.GetStmtsSSAPart().SSAPartOf(stmt)); + auto *theSSAPart = static_cast(ssaTab.GetStmtsSSAPart().SSAPartOf(stmt)); std::set mayDefUseOstsA; // 1. collect mayDefs and mayUses caused by callee-opnds CollectMayUseForCallOpnd(stmt, mayDefUseOstsA); @@ -966,9 +966,9 @@ void AliasClass::InsertMayUseNodeExcludeFinalOst(const std::set &ma // Insert mayDefs and mayUses for intrinsiccall. // Four kinds of mayDefs and mayUses are inserted, which are caused by callee // opnds, not_all_def_seen_ae, globalsAffectedByCalls, and mustDefs. -void AliasClass::InsertMayDefUseIntrncall(StmtNode &stmt, BBId bbID) { - MayDefMayUsePart *theSSAPart = static_cast(ssaTab.GetStmtsSSAPart().SSAPartOf(stmt)); - IntrinsiccallNode &intrinNode = static_cast(stmt); +void AliasClass::InsertMayDefUseIntrncall(StmtNode &stmt) { + auto *theSSAPart = static_cast(ssaTab.GetStmtsSSAPart().SSAPartOf(stmt)); + auto &intrinNode = static_cast(stmt); IntrinDesc *intrinDesc = &IntrinDesc::intrinTable[intrinNode.GetIntrinsic()]; std::set mayDefUseOsts; // 1. collect mayDefs and mayUses caused by not_all_defs_seen_ae @@ -987,11 +987,11 @@ void AliasClass::InsertMayDefUseIntrncall(StmtNode &stmt, BBId bbID) { } } -void AliasClass::InsertMayDefUseClinitCheck(IntrinsiccallNode &stmt, BBId bbID) { +void AliasClass::InsertMayDefUseClinitCheck(IntrinsiccallNode &stmt) { MapleMap &mayDefNodes = ssaTab.GetStmtsSSAPart().GetMayDefNodesOf(stmt); for (OStIdx ostIdx : globalsMayAffectedByClinitCheck) { - AliasElem *ae = osym2Elem[ostIdx.idx]; - OriginalSt &ostOfAE = ae->GetOriginalSt(); + AliasElem *aliasElem = osym2Elem[ostIdx.idx]; + OriginalSt &ostOfAE = aliasElem->GetOriginalSt(); std::string typeNameOfOst = ostOfAE.GetMIRSymbol()->GetName(); std::string typeNameOfStmt = GlobalTables::GetTypeTable().GetTypeFromTyIdx(stmt.GetTyIdx())->GetName(); if (typeNameOfOst.find(typeNameOfStmt) != std::string::npos) { @@ -1000,7 +1000,6 @@ void AliasClass::InsertMayDefUseClinitCheck(IntrinsiccallNode &stmt, BBId bbID) MayDefNode(ssaTab.GetVersionStTable().GetVersionStFromID(ostOfAE.GetZeroVersionIndex()), &stmt))); } } - return; } void AliasClass::GenericInsertMayDefUse(StmtNode &stmt, BBId bbID) { @@ -1051,11 +1050,11 @@ void AliasClass::GenericInsertMayDefUse(StmtNode &stmt, BBId bbID) { return; } case OP_intrinsiccallwithtype: { - IntrinsiccallNode &innode = static_cast(stmt); - if (innode.GetIntrinsic() == INTRN_JAVA_CLINIT_CHECK) { - InsertMayDefUseClinitCheck(innode, bbID); + auto &intrnNode = static_cast(stmt); + if (intrnNode.GetIntrinsic() == INTRN_JAVA_CLINIT_CHECK) { + InsertMayDefUseClinitCheck(intrnNode); } - InsertMayDefUseIntrncall(stmt, bbID); + InsertMayDefUseIntrncall(stmt); break; } case OP_intrinsiccall: @@ -1063,22 +1062,23 @@ void AliasClass::GenericInsertMayDefUse(StmtNode &stmt, BBId bbID) { case OP_intrinsiccallassigned: case OP_xintrinsiccallassigned: case OP_intrinsiccallwithtypeassigned: { - InsertMayDefUseIntrncall(stmt, bbID); + InsertMayDefUseIntrncall(stmt); break; } case OP_maydassign: case OP_dassign: { - InsertMayDefDassign(stmt, bbID); + InsertMayDefDassign(stmt); break; } case OP_iassign: { - InsertMayDefIassign(stmt, bbID); + InsertMayDefIassign(stmt); break; } case OP_syncenter: - case OP_syncexit: - InsertMayDefUseSyncOps(stmt, bbID); - // fall-through + case OP_syncexit: { + InsertMayDefUseSyncOps(stmt); + break; + } default: break; } diff --git a/src/maple_me/src/bb.cpp b/src/maple_me/src/bb.cpp index 3a949948ace65268a6f0be5d714705ec75a5f0e4..1e91c4bc853e0c583311200d26541d9caa725e1a 100644 --- a/src/maple_me/src/bb.cpp +++ b/src/maple_me/src/bb.cpp @@ -114,7 +114,7 @@ const PhiNode *BB::PhiofVerStInserted(const VersionSt &versionSt) const { void BB::InsertPhi(MapleAllocator *alloc, VersionSt *versionSt) { PhiNode phiNode(*alloc, *versionSt); - for (auto prevIt = pred.begin(); prevIt != pred.end(); prevIt++) { + for (auto prevIt = pred.begin(); prevIt != pred.end(); ++prevIt) { phiNode.GetPhiOpnds().push_back(versionSt); } phiList.insert(std::make_pair(versionSt->GetOrigSt(), phiNode)); @@ -153,11 +153,11 @@ void BB::RemoveBBFromPred(BB *bb) { ASSERT(phi.second.GetPhiOpnds().size() > index, "index out of range in BB::RemoveBBFromPred"); phi.second.GetPhiOpnds().erase(phi.second.GetPhiOpnds().cbegin() + index); } - for (auto &phi : mevarPhiList) { + for (auto &phi : meVarPhiList) { ASSERT(phi.second->GetOpnds().size() > index, "index out of range in BB::RemoveBBFromPred"); phi.second->GetOpnds().erase(phi.second->GetOpnds().cbegin() + index); } - for (auto &phi : meregPhiList) { + for (auto &phi : meRegPhiList) { ASSERT(phi.second->GetOpnds().size() > index, "index out of range in BB::RemoveBBFromPred"); phi.second->GetOpnds().erase(phi.second->GetOpnds().cbegin() + index); } @@ -344,11 +344,11 @@ void BB::DumpMeBB(IRMap &irMap) { } void BB::DumpMeVarPaiList(IRMap *irMap) { - if (mevarPaiList.empty()) { + if (meVarPaiList.empty()) { return; } std::cout << "<<<<<<<<<<<<<< PAI Node Start >>>>>>>>>>>>>>>>>>\n"; - for (const auto &pair : mevarPaiList) { + for (const auto &pair : meVarPaiList) { BB *bb = pair.first; std::cout << "Frome BB : " << bb->GetBBId() << '\n'; for (const auto *stmt : pair.second) { @@ -360,18 +360,18 @@ void BB::DumpMeVarPaiList(IRMap *irMap) { void BB::DumpMeVarPhiList(IRMap *irMap) { int count = 0; - for (const auto &phi : mevarPhiList) { + for (const auto &phi : meVarPhiList) { phi.second->Dump(irMap); int dumpVsyNum = DumpOptions::GetDumpVsyNum(); if (dumpVsyNum > 0 && ++count >= dumpVsyNum) { break; } - ASSERT(count >= 0, "mevarPhiList too large"); + ASSERT(count >= 0, "meVarPhiList too large"); } } void BB::DumpMeRegPhiList(IRMap *irMap) { - for (const auto &phi : meregPhiList) { + for (const auto &phi : meRegPhiList) { phi.second->Dump(irMap); } } diff --git a/src/maple_me/src/dominance.cpp b/src/maple_me/src/dominance.cpp index fa7c8e27773d725145819babeb3a4d3356410b00..36788aaabfdcdaff3296ed434c180b0ff5d45e14 100644 --- a/src/maple_me/src/dominance.cpp +++ b/src/maple_me/src/dominance.cpp @@ -73,7 +73,7 @@ bool Dominance::CommonEntryBBIsPred(const BB &bb) const { // Figure 3 in "A Simple, Fast Dominance Algorithm" by Keith Cooper et al. void Dominance::ComputeDominance() { doms.at(commonEntryBB.GetBBId()) = &commonEntryBB; - bool changed = false; + bool changed; do { changed = false; for (size_t i = 1; i < reversePostOrder.size(); ++i) { @@ -148,7 +148,7 @@ void Dominance::ComputeDtPreorder(const BB &bb, size_t &num) { } void Dominance::ComputeDtDfn() { - for (uint32 i = 0; i < dtPreOrder.size(); ++i) { + for (size_t i = 0; i < dtPreOrder.size(); ++i) { dtDfn[dtPreOrder[i]] = i; } } @@ -200,7 +200,7 @@ void Dominance::PdomGenPostOrderID() { // initialize pdomReversePostOrder int32 maxPostOrderID = postOrderID - 1; pdomReversePostOrder.resize(maxPostOrderID + 1); - for (size_t i = 0; i < pdomPostOrderIDVec.size(); i++) { + for (size_t i = 0; i < pdomPostOrderIDVec.size(); ++i) { int32 postOrderNo = pdomPostOrderIDVec[i]; if (postOrderNo == -1) { continue; @@ -303,7 +303,7 @@ void Dominance::ComputePdtPreorder(const BB &bb, size_t &num) { } void Dominance::ComputePdtDfn() { - for (uint32 i = 0; i < pdtPreOrder.size(); ++i) { + for (size_t i = 0; i < pdtPreOrder.size(); ++i) { pdtDfn[pdtPreOrder[i]] = i; } } diff --git a/src/maple_me/src/irmap_emit.cpp b/src/maple_me/src/irmap_emit.cpp index 5debbf0afcbc83d9b87596d76093ed4afb99e5e9..33554fb9c6596129528c70e9cfeb25c7e9621d85 100644 --- a/src/maple_me/src/irmap_emit.cpp +++ b/src/maple_me/src/irmap_emit.cpp @@ -34,7 +34,7 @@ BaseNode &VarMeExpr::EmitExpr(SSATab &ssaTab) { if (symbol->IsLocal()) { symbol->ResetIsDeleted(); } - AddrofNode *addrofNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( + auto *addrofNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( OP_dread, PrimType(GetPrimType()), symbol->GetStIdx(), GetFieldID()); ASSERT(addrofNode->GetPrimType() != kPtyInvalid, "runtime check error"); ASSERT(IsValidVerIdx(ssaTab), "runtime check error"); @@ -42,7 +42,7 @@ BaseNode &VarMeExpr::EmitExpr(SSATab &ssaTab) { } BaseNode &RegMeExpr::EmitExpr(SSATab &ssaTab) { - RegreadNode *regRead = ssaTab.GetModule().CurFunction()->GetCodeMemPool()->New(); + auto *regRead = ssaTab.GetModule().CurFunction()->GetCodeMemPool()->New(); regRead->SetPrimType(GetPrimType()); regRead->SetRegIdx(regIdx); ASSERT(regIdx < 0 || @@ -52,38 +52,38 @@ BaseNode &RegMeExpr::EmitExpr(SSATab &ssaTab) { } BaseNode &ConstMeExpr::EmitExpr(SSATab &ssaTab) { - ConstvalNode *exprConst = + auto *exprConst = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType()), constVal); // if int const has been promoted from dyn int const, remove the type tag if (IsPrimitiveInteger(exprConst->GetPrimType())) { - MIRIntConst *intConst = static_cast(exprConst->GetConstVal()); + auto *intConst = static_cast(exprConst->GetConstVal()); intConst->SetValue(intConst->GetValueUnderType()); } return *exprConst; } BaseNode &ConststrMeExpr::EmitExpr(SSATab &ssaTab) { - ConststrNode *exprConst = + auto *exprConst = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType()), strIdx); return *exprConst; } BaseNode &Conststr16MeExpr::EmitExpr(SSATab &ssaTab) { - Conststr16Node *exprConst = + auto *exprConst = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType()), strIdx); return *exprConst; } BaseNode &SizeoftypeMeExpr::EmitExpr(SSATab &ssaTab) { - SizeoftypeNode *exprSizeoftype = + auto *exprSizeoftype = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType()), tyIdx); return *exprSizeoftype; } BaseNode &FieldsDistMeExpr::EmitExpr(SSATab &ssaTab) { - FieldsDistNode *exprSizeoftype = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( + auto *exprSizeofType = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( PrimType(GetPrimType()), tyIdx, fieldID1, fieldID2); - return *exprSizeoftype; + return *exprSizeofType; } BaseNode &AddrofMeExpr::EmitExpr(SSATab &ssaTab) { @@ -91,21 +91,21 @@ BaseNode &AddrofMeExpr::EmitExpr(SSATab &ssaTab) { if (symbol->IsLocal()) { symbol->ResetIsDeleted(); } - AddrofNode *addrofNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( + auto *addrofNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( OP_addrof, PrimType(GetPrimType()), symbol->GetStIdx(), fieldID); return *addrofNode; } BaseNode &AddroffuncMeExpr::EmitExpr(SSATab &ssaTab) { - AddroffuncNode *addroffuncNode = + auto *addroffuncNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType()), puIdx); return *addroffuncNode; } BaseNode &GcmallocMeExpr::EmitExpr(SSATab &ssaTab) { - GCMallocNode *gcmallocNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( + auto *gcMallocNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( Opcode(GetOp()), PrimType(GetPrimType()), tyIdx); - return *gcmallocNode; + return *gcMallocNode; } BaseNode &OpMeExpr::EmitExpr(SSATab &ssaTab) { @@ -125,7 +125,7 @@ BaseNode &OpMeExpr::EmitExpr(SSATab &ssaTab) { case OP_rem: case OP_shl: case OP_sub: { - BinaryNode *binaryNode = + auto *binaryNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp()), PrimType(GetPrimType())); binaryNode->SetBOpnd(&opnds[0]->EmitExpr(ssaTab), 0); @@ -141,7 +141,7 @@ BaseNode &OpMeExpr::EmitExpr(SSATab &ssaTab) { case OP_cmpl: case OP_cmpg: case OP_cmp: { - CompareNode *cmpNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( + auto *cmpNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( Opcode(GetOp()), PrimType(GetPrimType())); cmpNode->SetBOpnd(&opnds[0]->EmitExpr(ssaTab), 0); cmpNode->SetBOpnd(&opnds[1]->EmitExpr(ssaTab), 1); @@ -156,7 +156,7 @@ BaseNode &OpMeExpr::EmitExpr(SSATab &ssaTab) { case OP_sqrt: case OP_alloca: case OP_malloc: { - UnaryNode *unaryNode = + auto *unaryNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp()), PrimType(GetPrimType())); unaryNode->SetOpnd(&opnds[0]->EmitExpr(ssaTab)); return *unaryNode; @@ -164,7 +164,7 @@ BaseNode &OpMeExpr::EmitExpr(SSATab &ssaTab) { case OP_sext: case OP_zext: case OP_extractbits: { - ExtractbitsNode *unode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( + auto *unode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( Opcode(GetOp()), PrimType(GetPrimType())); unode->SetOpnd(&opnds[0]->EmitExpr(ssaTab)); unode->SetBitsOffset(bitsOffset); @@ -172,7 +172,7 @@ BaseNode &OpMeExpr::EmitExpr(SSATab &ssaTab) { return *unode; } case OP_select: { - TernaryNode *ternaryNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( + auto *ternaryNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( Opcode(GetOp()), PrimType(GetPrimType())); constexpr size_t kOpndNumOfTernary = 3; for (size_t i = 0; i < kOpndNumOfTernary; ++i) { @@ -184,14 +184,14 @@ BaseNode &OpMeExpr::EmitExpr(SSATab &ssaTab) { case OP_cvt: case OP_floor: case OP_trunc: { - TypeCvtNode *cvtNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( + auto *cvtNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( Opcode(GetOp()), PrimType(GetPrimType())); cvtNode->SetOpnd(&opnds[0]->EmitExpr(ssaTab)); cvtNode->SetFromType(opndType); return *cvtNode; } case OP_retype: { - RetypeNode *cvtNode = + auto *cvtNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(PrimType(GetPrimType())); cvtNode->SetOpnd(&opnds[0]->EmitExpr(ssaTab)); cvtNode->SetFromType(opndType); @@ -200,7 +200,7 @@ BaseNode &OpMeExpr::EmitExpr(SSATab &ssaTab) { } case OP_gcmallocjarray: case OP_gcpermallocjarray: { - JarrayMallocNode *arrayMalloc = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( + auto *arrayMalloc = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( Opcode(GetOp()), PrimType(GetPrimType())); arrayMalloc->SetOpnd(&opnds[0]->EmitExpr(ssaTab)); arrayMalloc->SetTyIdx(tyIdx); @@ -208,15 +208,15 @@ BaseNode &OpMeExpr::EmitExpr(SSATab &ssaTab) { } case OP_resolveinterfacefunc: case OP_resolvevirtualfunc: { - ResolveFuncNode *resolveNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( + auto *resolveNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( Opcode(GetOp()), PrimType(GetPrimType())); resolveNode->SetBOpnd(&opnds[0]->EmitExpr(ssaTab), 0); resolveNode->SetBOpnd(&opnds[1]->EmitExpr(ssaTab), 1); - resolveNode->SetPuIdx(fieldID); + resolveNode->SetPUIdx(fieldID); return *resolveNode; } case OP_iaddrof: { - IaddrofNode *iaddrof = + auto *iaddrof = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(OP_iaddrof, PrimType(GetPrimType())); iaddrof->SetOpnd(&opnds[0]->EmitExpr(ssaTab)); iaddrof->SetTyIdx(tyIdx); @@ -232,14 +232,14 @@ BaseNode &NaryMeExpr::EmitExpr(SSATab &ssaTab) { BaseNode *nodeToReturn = nullptr; NaryOpnds *nopndPart = nullptr; if (GetOp() == OP_array) { - ArrayNode *arrayNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( + auto *arrayNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( ssaTab.GetModule(), PrimType(GetPrimType()), tyIdx); arrayNode->SetNumOpnds(GetNumOpnds()); arrayNode->SetBoundsCheck(GetBoundCheck()); nopndPart = arrayNode; nodeToReturn = arrayNode; } else { - IntrinsicopNode *intrinNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( + auto *intrinNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New( ssaTab.GetModule(), GetOp(), PrimType(GetPrimType()), tyIdx); intrinNode->SetNumOpnds(GetNumOpnds()); intrinNode->SetIntrinsic(intrinsic); @@ -253,7 +253,7 @@ BaseNode &NaryMeExpr::EmitExpr(SSATab &ssaTab) { } BaseNode &IvarMeExpr::EmitExpr(SSATab &ssaTab) { - IreadNode *ireadNode = + auto *ireadNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(OP_iread, PrimType(GetPrimType())); ireadNode->SetOpnd(&base->EmitExpr(ssaTab)); ireadNode->SetFieldID(fieldID); @@ -265,13 +265,13 @@ BaseNode &IvarMeExpr::EmitExpr(SSATab &ssaTab) { } StmtNode &MeStmt::EmitStmt(SSATab &ssaTab) { - StmtNode *stmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp())); + auto *stmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp())); stmt->SetSrcPos(GetSrcPosition()); return *stmt; } StmtNode &DassignMeStmt::EmitStmt(SSATab &ssaTab) { - DassignNode *dassignStmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(); + auto *dassignStmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(); MIRSymbol *symbol = ssaTab.GetMIRSymbolFromID(GetVarLHS()->GetOStIdx()); if (symbol->IsLocal()) { symbol->ResetIsDeleted(); @@ -291,7 +291,7 @@ StmtNode &RegassignMeStmt::EmitStmt(SSATab &ssaTab) { } StmtNode &MaydassignMeStmt::EmitStmt(SSATab &ssaTab) { - DassignNode *dassignStmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(); + auto *dassignStmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(); MIRSymbol *symbol = mayDSSym->GetMIRSymbol(); if (symbol->IsLocal()) { symbol->ResetIsDeleted(); @@ -319,7 +319,7 @@ void MeStmt::EmitCallReturnVector(SSATab &ssaTab, CallReturnVector &nRets) { } StmtNode &IassignMeStmt::EmitStmt(SSATab &ssaTab) { - IassignNode *iassignNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(); + auto *iassignNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(); iassignNode->SetTyIdx(tyIdx); iassignNode->SetFieldID(lhsVar->GetFieldID()); iassignNode->SetAddrExpr(&lhsVar->GetBase()->EmitExpr(ssaTab)); @@ -338,7 +338,7 @@ MIRFunction &CallMeStmt::GetTargetFunction() { StmtNode &CallMeStmt::EmitStmt(SSATab &ssaTab) { if (GetOp() != OP_icall && GetOp() != OP_icallassigned) { - CallNode *callNode = + auto *callNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(ssaTab.GetModule(), Opcode(GetOp())); callNode->SetPUIdx(puIdx); callNode->SetTyIdx(tyIdx); @@ -363,41 +363,40 @@ StmtNode &CallMeStmt::EmitStmt(SSATab &ssaTab) { } } return *callNode; - } else { - IcallNode *icallNode = - ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(ssaTab.GetModule(), Opcode(GetOp())); - icallNode->GetNopnd().resize(NumMeStmtOpnds()); - for (size_t i = 0; i < NumMeStmtOpnds(); ++i) { - icallNode->SetOpnd(&GetOpnd(i)->EmitExpr(ssaTab), i); - } - icallNode->SetNumOpnds(icallNode->GetNopndSize()); - icallNode->SetSrcPos(GetSrcPosition()); - if (kOpcodeInfo.IsCallAssigned(GetOp())) { - EmitCallReturnVector(ssaTab, icallNode->GetReturnVec()); - icallNode->SetRetTyIdx(TyIdx(PTY_void)); - for (size_t j = 0; j < icallNode->GetReturnVec().size(); ++j) { - CallReturnPair retPair = icallNode->GetReturnVec()[j]; - if (!retPair.second.IsReg()) { - StIdx stIdx = retPair.first; - MIRSymbolTable *symbolTab = ssaTab.GetModule().CurFunction()->GetSymTab(); - MIRSymbol *symbol = symbolTab->GetSymbolFromStIdx(stIdx.Idx()); - icallNode->SetRetTyIdx(symbol->GetType()->GetTypeIndex()); - if (stIdx.Islocal()) { - symbol->ResetIsDeleted(); - } - } else { - PregIdx pregIdx = (PregIdx)retPair.second.GetPregIdx(); - MIRPreg *preg = ssaTab.GetModule().CurFunction()->GetPregTab()->PregFromPregIdx(pregIdx); - icallNode->SetRetTyIdx(TyIdx(preg->GetPrimType())); + } + auto *icallNode = + ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(ssaTab.GetModule(), Opcode(GetOp())); + icallNode->GetNopnd().resize(NumMeStmtOpnds()); + for (size_t i = 0; i < NumMeStmtOpnds(); ++i) { + icallNode->SetOpnd(&GetOpnd(i)->EmitExpr(ssaTab), i); + } + icallNode->SetNumOpnds(icallNode->GetNopndSize()); + icallNode->SetSrcPos(GetSrcPosition()); + if (kOpcodeInfo.IsCallAssigned(GetOp())) { + EmitCallReturnVector(ssaTab, icallNode->GetReturnVec()); + icallNode->SetRetTyIdx(TyIdx(PTY_void)); + for (size_t j = 0; j < icallNode->GetReturnVec().size(); ++j) { + CallReturnPair retPair = icallNode->GetReturnVec()[j]; + if (!retPair.second.IsReg()) { + StIdx stIdx = retPair.first; + MIRSymbolTable *symbolTab = ssaTab.GetModule().CurFunction()->GetSymTab(); + MIRSymbol *symbol = symbolTab->GetSymbolFromStIdx(stIdx.Idx()); + icallNode->SetRetTyIdx(symbol->GetType()->GetTypeIndex()); + if (stIdx.Islocal()) { + symbol->ResetIsDeleted(); } + } else { + PregIdx pregIdx = (PregIdx)retPair.second.GetPregIdx(); + MIRPreg *preg = ssaTab.GetModule().CurFunction()->GetPregTab()->PregFromPregIdx(pregIdx); + icallNode->SetRetTyIdx(TyIdx(preg->GetPrimType())); } } - return *icallNode; } + return *icallNode; } StmtNode &IcallMeStmt::EmitStmt(SSATab &ssaTab) { - IcallNode *icallNode = + auto *icallNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(ssaTab.GetModule(), Opcode(GetOp())); icallNode->GetNopnd().resize(NumMeStmtOpnds()); for (size_t i = 0; i < NumMeStmtOpnds(); ++i) { @@ -429,9 +428,9 @@ StmtNode &IcallMeStmt::EmitStmt(SSATab &ssaTab) { } StmtNode &IntrinsiccallMeStmt::EmitStmt(SSATab &ssaTab) { - IntrinsiccallNode *callNode = + auto *callNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(ssaTab.GetModule(), - Opcode(GetOp())); + Opcode(GetOp())); callNode->SetIntrinsic(intrinsic); callNode->SetTyIdx(tyIdx); callNode->GetNopnd().resize(NumMeStmtOpnds()); @@ -458,7 +457,7 @@ StmtNode &IntrinsiccallMeStmt::EmitStmt(SSATab &ssaTab) { } StmtNode &NaryMeStmt::EmitStmt(SSATab &ssaTab) { - NaryStmtNode *naryStmt = + auto *naryStmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(ssaTab.GetModule(), Opcode(GetOp())); naryStmt->GetNopnd().resize(NumMeStmtOpnds()); for (size_t i = 0; i < NumMeStmtOpnds(); ++i) { @@ -470,21 +469,21 @@ StmtNode &NaryMeStmt::EmitStmt(SSATab &ssaTab) { } StmtNode &UnaryMeStmt::EmitStmt(SSATab &ssaTab) { - UnaryStmtNode *unaryStmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp())); + auto *unaryStmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp())); unaryStmt->SetOpnd(&opnd->EmitExpr(ssaTab), 0); unaryStmt->SetSrcPos(GetSrcPosition()); return *unaryStmt; } StmtNode &GotoMeStmt::EmitStmt(SSATab &ssaTab) { - GotoNode *gotoNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(OP_goto); + auto *gotoNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(OP_goto); gotoNode->SetOffset(offset); gotoNode->SetSrcPos(GetSrcPosition()); return *gotoNode; } StmtNode &CondGotoMeStmt::EmitStmt(SSATab &ssaTab) { - CondGotoNode *cgNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp())); + auto *cgNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp())); cgNode->SetOffset(offset); cgNode->SetOpnd(&GetOpnd()->EmitExpr(ssaTab)); cgNode->SetSrcPos(GetSrcPosition()); @@ -492,7 +491,7 @@ StmtNode &CondGotoMeStmt::EmitStmt(SSATab &ssaTab) { } StmtNode &JsTryMeStmt::EmitStmt(SSATab &ssaTab) { - JsTryNode *jtNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(); + auto *jtNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(); jtNode->SetCatchOffset(catchOffset); jtNode->SetFinallyOffset(finallyOffset); jtNode->SetSrcPos(GetSrcPosition()); @@ -500,7 +499,7 @@ StmtNode &JsTryMeStmt::EmitStmt(SSATab &ssaTab) { } StmtNode &TryMeStmt::EmitStmt(SSATab &ssaTab) { - TryNode *tryNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(ssaTab.GetModule()); + auto *tryNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(ssaTab.GetModule()); tryNode->ResizeOffsets(offsets.size()); for (size_t i = 0; i < offsets.size(); ++i) { tryNode->SetOffset(offsets[i], i); @@ -510,14 +509,14 @@ StmtNode &TryMeStmt::EmitStmt(SSATab &ssaTab) { } StmtNode &CatchMeStmt::EmitStmt(SSATab &ssaTab) { - CatchNode *catchNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(ssaTab.GetModule()); + auto *catchNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(ssaTab.GetModule()); catchNode->SetExceptionTyIdxVec(exceptionTyIdxVec); catchNode->SetSrcPos(GetSrcPosition()); return *catchNode; } StmtNode &SwitchMeStmt::EmitStmt(SSATab &ssaTab) { - SwitchNode *switchNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(ssaTab.GetModule()); + auto *switchNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(ssaTab.GetModule()); switchNode->SetDefaultLabel(defaultLabel); switchNode->SetSwitchTable(switchTable); switchNode->SetSwitchOpnd(&GetOpnd()->EmitExpr(ssaTab)); @@ -526,7 +525,7 @@ StmtNode &SwitchMeStmt::EmitStmt(SSATab &ssaTab) { } StmtNode &CommentMeStmt::EmitStmt(SSATab &ssaTab) { - CommentNode *commentNode = + auto *commentNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(ssaTab.GetModule()); commentNode->SetComment(comment); commentNode->SetSrcPos(GetSrcPosition()); @@ -534,21 +533,21 @@ StmtNode &CommentMeStmt::EmitStmt(SSATab &ssaTab) { } StmtNode &ThrowMeStmt::EmitStmt(SSATab &ssaTab) { - UnaryStmtNode *unaryStmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(OP_throw); + auto *unaryStmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(OP_throw); unaryStmt->SetOpnd(&opnd->EmitExpr(ssaTab), 0); unaryStmt->SetSrcPos(GetSrcPosition()); return *unaryStmt; } StmtNode &GosubMeStmt::EmitStmt(SSATab &ssaTab) { - GotoNode *gosubNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(OP_gosub); + auto *gosubNode = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(OP_gosub); gosubNode->SetOffset(offset); gosubNode->SetSrcPos(GetSrcPosition()); return *gosubNode; } StmtNode &AssertMeStmt::EmitStmt(SSATab &ssaTab) { - AssertStmtNode *assertStmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp())); + auto *assertStmt = ssaTab.GetModule().CurFunction()->GetCodeMempool()->New(Opcode(GetOp())); assertStmt->SetBOpnd(&opnds[0]->EmitExpr(ssaTab), 0); assertStmt->SetBOpnd(&opnds[1]->EmitExpr(ssaTab), 1); assertStmt->SetSrcPos(GetSrcPosition()); diff --git a/src/maple_me/src/me_alias_class.cpp b/src/maple_me/src/me_alias_class.cpp index da409010a242557dfbf001e3a27e03bb1acacb52..fd632bf0a10fc763c77a50db8dea31538a476d6e 100644 --- a/src/maple_me/src/me_alias_class.cpp +++ b/src/maple_me/src/me_alias_class.cpp @@ -13,7 +13,6 @@ * See the Mulan PSL v1 for more details. */ #include "me_alias_class.h" -#include #include "me_option.h" #include "mpl_logging.h" #include "ssa_mir_nodes.h" @@ -25,13 +24,12 @@ namespace maple { // This phase performs alias analysis based on Steensgaard's algorithm and // represent the resulting alias relationships in the Maple IR representation bool MeAliasClass::HasWriteToStaticFinal() const { - auto eIt = func.valid_end(); - for (auto bIt = func.valid_begin(); bIt != eIt; ++bIt) { - for (auto &stmt : (*bIt)->GetStmtNodes()) { + for (auto bIt = func.valid_begin(); bIt != func.valid_end(); ++bIt) { + for (const auto &stmt : (*bIt)->GetStmtNodes()) { if (stmt.GetOpCode() == OP_dassign) { - DassignNode &dass = static_cast(stmt); - if (dass.GetStIdx().IsGlobal()) { - const MIRSymbol *sym = mirModule.CurFunction()->GetLocalOrGlobalSymbol(dass.GetStIdx()); + const auto &dassignNode = static_cast(stmt); + if (dassignNode.GetStIdx().IsGlobal()) { + const MIRSymbol *sym = mirModule.CurFunction()->GetLocalOrGlobalSymbol(dassignNode.GetStIdx()); if (sym->IsFinal()) { return true; } @@ -43,8 +41,8 @@ bool MeAliasClass::HasWriteToStaticFinal() const { } void MeAliasClass::DoAliasAnalysis() { - auto eIt = func.valid_end(); - for (auto bIt = func.valid_begin(); bIt != eIt; ++bIt) { + + for (auto bIt = func.valid_begin(); bIt != func.valid_end(); ++bIt) { for (auto &stmt : (*bIt)->GetStmtNodes()) { ApplyUnionForCopies(stmt); } @@ -73,8 +71,7 @@ void MeAliasClass::DoAliasAnalysis() { LogInfo::MapleLogger() << "\n============ Alias Classification Pass 2 ============" << '\n'; } - eIt = func.valid_end(); - for (auto bIt = func.valid_begin(); bIt != eIt; ++bIt) { + for (auto bIt = func.valid_begin(); bIt != func.valid_end(); ++bIt) { auto *bb = *bIt; for (auto &stmt : bb->GetStmtNodes()) { GenericInsertMayDefUse(stmt, bb->GetBBId()); @@ -87,9 +84,9 @@ AnalysisResult *MeDoAliasClass::Run(MeFunction *func, MeFuncResultMgr *funcResMg timer.Start(); (void)funcResMgr->GetAnalysisResult(MeFuncPhase_SSATAB, func); MemPool *aliasClassMp = NewMemPool(); - KlassHierarchy *kh = static_cast(moduleResMgr->GetAnalysisResult( + auto *kh = static_cast(moduleResMgr->GetAnalysisResult( MoPhase_CHA, &func->GetMIRModule())); - MeAliasClass *aliasClass = aliasClassMp->New( + auto *aliasClass = aliasClassMp->New( *aliasClassMp, func->GetMIRModule(), *func->GetMeSSATab(), *func, MeOption::lessThrowAlias, MeOption::ignoreIPA, DEBUGFUNC(func), MeOption::setCalleeHasSideEffect, kh); // pass 1 through the program statements diff --git a/src/maple_me/src/me_bb_layout.cpp b/src/maple_me/src/me_bb_layout.cpp index b28a8964d0d0a8bdcbebb592ad0d1420980897fa..e3665c04fe9c558960265a6c76e6010a6ed20f74 100644 --- a/src/maple_me/src/me_bb_layout.cpp +++ b/src/maple_me/src/me_bb_layout.cpp @@ -38,11 +38,11 @@ static void CreateGoto(BB &bb, MeFunction &func, BB &fallthru) { LabelIdx label = func.GetOrCreateBBLabel(fallthru); if (func.GetIRMap() != nullptr) { GotoNode stmt(OP_goto); - GotoMeStmt *newGoto = func.GetIRMap()->New(&stmt); + auto *newGoto = func.GetIRMap()->New(&stmt); newGoto->SetOffset(label); bb.AddMeStmtLast(newGoto); } else { - GotoNode *newGoto = func.GetMirFunc()->GetCodeMempool()->New(OP_goto); + auto *newGoto = func.GetMirFunc()->GetCodeMempool()->New(OP_goto); newGoto->SetOffset(label); bb.AddStmtNode(newGoto); } @@ -57,9 +57,8 @@ bool BBLayout::BBEmptyAndFallthru(const BB &bb) { if (bb.GetKind() == kBBFallthru) { if (func.GetIRMap() != nullptr) { return bb.IsMeStmtEmpty(); - } else { - return bb.IsEmpty(); } + return bb.IsEmpty(); } return false; } @@ -81,24 +80,23 @@ bool BBLayout::BBContainsOnlyCondGoto(const BB &bb) const { } } return meStmts.back().IsCondBr(); - } else { - auto &stmtNodes = bb.GetStmtNodes(); - if (stmtNodes.empty()) { + } + auto &stmtNodes = bb.GetStmtNodes(); + if (stmtNodes.empty()) { + return false; + } + for (auto itStmt = stmtNodes.begin(); itStmt != stmtNodes.rbegin().base(); ++itStmt) { + if (!itStmt->IsCondBr() && itStmt->GetOpCode() != OP_comment) { return false; } - for (auto itStmt = stmtNodes.begin(); itStmt != stmtNodes.rbegin().base(); ++itStmt) { - if (!itStmt->IsCondBr() && itStmt->GetOpCode() != OP_comment) { - return false; - } - } - return bb.GetStmtNodes().back().IsCondBr(); } + return bb.GetStmtNodes().back().IsCondBr(); } // Return the opposite opcode for condition/compare opcode. -static Opcode GetOppositeOp(Opcode opc1) { +static Opcode GetOppositeOp(Opcode opcInput) { Opcode opc = kOpUndef; - switch (opc1) { + switch (opcInput) { case OP_brtrue: opc = OP_brfalse; break; @@ -145,18 +143,17 @@ bool BBLayout::BBContainsOnlyGoto(const BB &bb) const { } } return meStmts.back().GetOp() == OP_goto; - } else { - auto &stmtNodes = bb.GetStmtNodes(); - if (stmtNodes.empty()) { + } + auto &stmtNodes = bb.GetStmtNodes(); + if (stmtNodes.empty()) { + return false; + } + for (auto itStmt = stmtNodes.begin(); itStmt != stmtNodes.rbegin().base(); ++itStmt) { + if (itStmt->GetOpCode() != OP_goto && itStmt->GetOpCode() != OP_comment) { return false; } - for (auto itStmt = stmtNodes.begin(); itStmt != stmtNodes.rbegin().base(); ++itStmt) { - if (itStmt->GetOpCode() != OP_goto && itStmt->GetOpCode() != OP_comment) { - return false; - } - } - return bb.GetStmtNodes().back().GetOpCode() == OP_goto; } + return bb.GetStmtNodes().back().GetOpCode() == OP_goto; } // Return true if all the following are satisfied: @@ -186,8 +183,8 @@ bool BBLayout::HasSameBranchCond(BB &bb1, BB &bb2) const { if(func.GetIRMap() == nullptr) { return false; } - CondGotoMeStmt &meStmt1 = static_cast(bb1.GetMeStmts().back()); - CondGotoMeStmt &meStmt2 = static_cast(bb2.GetMeStmts().back()); + auto &meStmt1 = static_cast(bb1.GetMeStmts().back()); + auto &meStmt2 = static_cast(bb2.GetMeStmts().back()); MeExpr *expr1 = meStmt1.GetOpnd(); MeExpr *expr2 = meStmt2.GetOpnd(); // Compare the opcode: brtrue/brfalse @@ -198,8 +195,8 @@ bool BBLayout::HasSameBranchCond(BB &bb1, BB &bb2) const { if (!(expr1->GetMeOp() == expr2->GetMeOp() && expr1->GetMeOp() == kMeOpOp)) { return false; } - OpMeExpr *opMeExpr1 = static_cast(expr1); - OpMeExpr *opMeExpr2 = static_cast(expr2); + auto *opMeExpr1 = static_cast(expr1); + auto *opMeExpr2 = static_cast(expr2); // Compare the two operands to make sure they are both equal. if (opMeExpr1->GetOpnd(0) != opMeExpr2->GetOpnd(0)) { return false; @@ -256,22 +253,22 @@ void BBLayout::OptimizeBranchTarget(BB &bb) { if (func.GetIRMap() != nullptr) { auto &lastStmt = bb.GetMeStmts().back(); if (lastStmt.GetOp() == OP_goto) { - GotoMeStmt &gotoMeStmt = static_cast(lastStmt); + auto &gotoMeStmt = static_cast(lastStmt); ASSERT(brTargetBB->GetBBLabel() == gotoMeStmt.GetOffset(), "OptimizeBranchTarget: wrong branch target BB"); gotoMeStmt.SetOffset(newTargetLabel); } else { - CondGotoMeStmt &gotoMeStmt = static_cast(lastStmt); + auto &gotoMeStmt = static_cast(lastStmt); ASSERT(brTargetBB->GetBBLabel() == gotoMeStmt.GetOffset(), "OptimizeBranchTarget: wrong branch target BB"); gotoMeStmt.SetOffset(newTargetLabel); } } else { StmtNode &lastStmt = bb.GetStmtNodes().back(); if (lastStmt.GetOpCode() == OP_goto) { - GotoNode &gotoNode = static_cast(lastStmt); + auto &gotoNode = static_cast(lastStmt); ASSERT(brTargetBB->GetBBLabel() == gotoNode.GetOffset(), "OptimizeBranchTarget: wrong branch target BB"); gotoNode.SetOffset(newTargetLabel); } else { - CondGotoNode &gotoNode = static_cast(lastStmt); + auto &gotoNode = static_cast(lastStmt); ASSERT(brTargetBB->GetBBLabel() == gotoNode.GetOffset(), "OptimizeBranchTarget: wrong branch target BB"); gotoNode.SetOffset(newTargetLabel); } @@ -317,7 +314,6 @@ void BBLayout::AddBB(BB &bb) { if (enabledDebug) { LogInfo::MapleLogger() << '\n'; } - return; } BB *BBLayout::GetFallThruBBSkippingEmpty(BB &bb) { @@ -383,7 +379,7 @@ void BBLayout::ResolveUnconditionalFallThru(BB &bb, BB &nextBB) { AnalysisResult *MeDoBBLayout::Run(MeFunction *func, MeFuncResultMgr *funcResMgr, ModuleResultMgr *moduleResMgr) { // mempool used in analysisresult MemPool *layoutMp = NewMemPool(); - BBLayout *bbLayout = layoutMp->New(*layoutMp, *func, DEBUGFUNC(func)); + auto *bbLayout = layoutMp->New(*layoutMp, *func, DEBUGFUNC(func)); // assume common_entry_bb is always bb 0 ASSERT(func->front() == func->GetCommonEntryBB(), "assume bb[0] is the commont entry bb"); BB *bb = func->GetFirstBB(); @@ -419,12 +415,12 @@ AnalysisResult *MeDoBBLayout::Run(MeFunction *func, MeFuncResultMgr *funcResMgr, // flip the sense of the condgoto and lay out brTargetBB right here LabelIdx fallthruLabel = func->GetOrCreateBBLabel(*fallthru); if (func->GetIRMap() != nullptr) { - CondGotoMeStmt &condGotoMeStmt = static_cast(bb->GetMeStmts().back()); + auto &condGotoMeStmt = static_cast(bb->GetMeStmts().back()); ASSERT(brTargetBB->GetBBLabel() == condGotoMeStmt.GetOffset(), "bbLayout: wrong branch target BB"); condGotoMeStmt.SetOffset(fallthruLabel); condGotoMeStmt.SetOp((condGotoMeStmt.GetOp() == OP_brtrue) ? OP_brfalse : OP_brtrue); } else { - CondGotoNode &condGotoNode = static_cast(bb->GetStmtNodes().back()); + auto &condGotoNode = static_cast(bb->GetStmtNodes().back()); ASSERT(brTargetBB->GetBBLabel() == condGotoNode.GetOffset(), "bbLayout: wrong branch target BB"); condGotoNode.SetOffset(fallthruLabel); condGotoNode.SetOpCode((condGotoNode.GetOpCode() == OP_brtrue) ? OP_brfalse : OP_brtrue); @@ -447,17 +443,17 @@ AnalysisResult *MeDoBBLayout::Run(MeFunction *func, MeFuncResultMgr *funcResMgr, LabelIdx fallthruLabel = func->GetOrCreateBBLabel(*fallthru); if (func->GetIRMap() != nullptr) { GotoNode stmt(OP_goto); - GotoMeStmt *newGoto = func->GetIRMap()->New(&stmt); + auto *newGoto = func->GetIRMap()->New(&stmt); newGoto->SetOffset(fallthruLabel); newFallthru->SetFirstMe(newGoto); newFallthru->SetLastMe(to_ptr(newFallthru->GetMeStmts().begin())); } else { - GotoNode *newGoto = func->GetMirFunc()->GetCodeMempool()->New(OP_goto); + auto *newGoto = func->GetMirFunc()->GetCodeMempool()->New(OP_goto); newGoto->SetOffset(fallthruLabel); newFallthru->SetFirst(newGoto); newFallthru->SetLast(newFallthru->GetStmtNodes().begin().d()); } - /* replace pred and succ */ + // replace pred and succ bb->ReplaceSucc(fallthru, newFallthru); fallthru->ReplacePred(bb, newFallthru); newFallthru->GetPred().push_back(bb); diff --git a/src/maple_me/src/me_cfg.cpp b/src/maple_me/src/me_cfg.cpp index 2767e8a57cb1be6c6a3ea879b28c135953416fcc..36cce7f93d8e408a51e06df3c7515e29ed3a64c0 100644 --- a/src/maple_me/src/me_cfg.cpp +++ b/src/maple_me/src/me_cfg.cpp @@ -14,7 +14,6 @@ */ #include "me_cfg.h" #include -#include #include #include "bb.h" #include "ssa_mir_nodes.h" @@ -82,7 +81,7 @@ void MeCFG::BuildMirCFG() { BB *mirBB = func.GetLabelBBAt(lblIdx); bb->GetSucc().push_back(mirBB); mirBB->GetPred().push_back(bb); - for (size_t j = 0; j < switchStmt.GetSwitchTable().size(); j++) { + for (size_t j = 0; j < switchStmt.GetSwitchTable().size(); ++j) { lblIdx = switchStmt.GetCasePair(j).second; BB *meBB = func.GetLabelBBAt(lblIdx); // Avoid duplicate succs. @@ -210,7 +209,7 @@ bool MeCFG::FindUse(const StmtNode &stmt, StIdx stIdx) const { case OP_intrinsiccallwithtypeassigned: case OP_syncenter: case OP_syncexit: { - for (size_t i = 0; i < stmt.NumOpnds(); i++) { + for (size_t i = 0; i < stmt.NumOpnds(); ++i) { BaseNode *argExpr = stmt.Opnd(i); if (FindExprUse(*argExpr, stIdx)) { return true; @@ -258,12 +257,12 @@ bool MeCFG::FindDef(const StmtNode &stmt, StIdx stIdx) const { const auto &dassStmt = static_cast(stmt); return dassStmt.GetStIdx() == stIdx; } - const auto &cnode = static_cast(stmt); - const CallReturnVector &nrets = cnode.GetReturnVec(); - if (!nrets.empty()) { - ASSERT(nrets.size() == 1, "Single Ret value for now."); - StIdx idx = nrets[0].first; - RegFieldPair regFieldPair = nrets[0].second; + const auto &cNode = static_cast(stmt); + const CallReturnVector &nRets = cNode.GetReturnVec(); + if (!nRets.empty()) { + ASSERT(nRets.size() == 1, "Single Ret value for now."); + StIdx idx = nRets[0].first; + RegFieldPair regFieldPair = nRets[0].second; if (!regFieldPair.IsReg()) { return idx == stIdx; } @@ -316,15 +315,15 @@ void MeCFG::FixMirCFG() { MIRSymbol *targetSt = builder->GetOrCreateLocalDecl(tempStr.c_str(), *sym->GetType()); targetSt->ResetIsDeleted(); if (stmt->GetOpCode() == OP_dassign) { - BaseNode *rhs = static_cast(stmt)->GetRHS(); + auto *rhs = static_cast(stmt)->GetRHS(); StmtNode *dassign = builder->CreateStmtDassign(*targetSt, 0, rhs); bb->ReplaceStmt(stmt, dassign); stmt = dassign; } else { - auto *cnode = static_cast(stmt); - CallReturnPair retPair = cnode->GetReturnPair(0); + auto *cNode = static_cast(stmt); + CallReturnPair retPair = cNode->GetReturnPair(0); retPair.first = targetSt->GetStIdx(); - cnode->SetReturnPair(retPair, 0); + cNode->SetReturnPair(retPair, 0); } StmtNode *dassign = builder->CreateStmtDassign(*sym, 0, builder->CreateExprDread(*targetSt)); if (stmt->GetNext() != nullptr) { @@ -404,9 +403,8 @@ void MeCFG::FixMirCFG() { // fast path StmtNode *stmt = bb->GetTheOnlyStmtNode(); if (stmt != nullptr) { - size_t si = 0; // simplify the cfg removing all succs of this bb - for (; si < bb->GetSucc().size(); ++si) { + for (size_t si = 0; si < bb->GetSucc().size(); ++si) { BB *sucBB = bb->GetSucc(si); if (sucBB->GetAttributes(kBBAttrIsCatch)) { sucBB->RemoveBBFromPred(bb); @@ -429,8 +427,7 @@ void MeCFG::FixMirCFG() { newBBIt, std::bind(FilterNullPtr::const_iterator>, std::placeholders::_1, func.end())); eIt = func.valid_end(); // redirect all succs of new bb to bb - size_t si = 0; - for (; si < newBB.GetSucc().size(); si++) { + for (size_t si = 0; si < newBB.GetSucc().size(); ++si) { BB *sucBB = newBB.GetSucc(si); if (sucBB->GetAttributes(kBBAttrIsCatch)) { sucBB->ReplacePred(&newBB, bb); @@ -507,13 +504,13 @@ void MeCFG::ConvertMeregphiList2IdentityAssigns(BB &meBB) const { // replace phi with identify assignment as it only has 1 opnd const OriginalSt *ost = func.GetMeSSATab()->GetOriginalStFromID(regPhiIt->first); if (ost->IsSymbolOst() && ost->GetIndirectLev() == 0) { - auto *regass = func.GetIRMap()->New(); + auto *regAss = func.GetIRMap()->New(); MeRegPhiNode *regPhi = regPhiIt->second; - regass->SetLHS(regPhi->GetLHS()); - regass->SetRHS(regPhi->GetOpnd(0)); - regass->SetBB(regPhi->GetDefBB()); - regass->SetIsLive(regPhi->GetIsLive()); - meBB.PrependMeStmt(regass); + regAss->SetLHS(regPhi->GetLHS()); + regAss->SetRHS(regPhi->GetOpnd(0)); + regAss->SetBB(regPhi->GetDefBB()); + regAss->SetIsLive(regPhi->GetIsLive()); + meBB.PrependMeStmt(regAss); } ++regPhiIt; } @@ -613,26 +610,27 @@ void MeCFG::WontExitAnalysis() { } auto *bb = *bIt; BBId idx = bb->GetBBId(); - if (!visitedBBs[idx]) { - bb->SetAttributes(kBBAttrWontExit); - if (!MeOption::quiet) { - LogInfo::MapleLogger() << "#### BB " << idx << " wont exit\n"; - } - if (bb->GetKind() == kBBGoto) { - // create artificial BB to transition to common_exit_bb - BB *newBB = func.NewBasicBlock(); - // update bIt & eIt - auto newBBIt = std::find(func.cbegin(), func.cend(), bb); - bIt = build_filter_iterator( - newBBIt, std::bind(FilterNullPtr::const_iterator>, std::placeholders::_1, func.end())); - eIt = func.valid_end(); - newBB->SetKind(kBBReturn); - newBB->SetAttributes(kBBAttrIsExit); - newBB->SetAttributes(kBBAttrArtificial); - bb->GetSucc().push_back(newBB); - newBB->GetPred().push_back(bb); - func.GetCommonExitBB()->GetPred().push_back(newBB); - } + if (visitedBBs[idx]) { + continue; + } + bb->SetAttributes(kBBAttrWontExit); + if (!MeOption::quiet) { + LogInfo::MapleLogger() << "#### BB " << idx << " wont exit\n"; + } + if (bb->GetKind() == kBBGoto) { + // create artificial BB to transition to common_exit_bb + BB *newBB = func.NewBasicBlock(); + // update bIt & eIt + auto newBBIt = std::find(func.cbegin(), func.cend(), bb); + bIt = build_filter_iterator( + newBBIt, std::bind(FilterNullPtr::const_iterator>, std::placeholders::_1, func.end())); + eIt = func.valid_end(); + newBB->SetKind(kBBReturn); + newBB->SetAttributes(kBBAttrIsExit); + newBB->SetAttributes(kBBAttrArtificial); + bb->GetSucc().push_back(newBB); + newBB->GetPred().push_back(bb); + func.GetCommonExitBB()->GetPred().push_back(newBB); } } } @@ -702,7 +700,7 @@ void MeCFG::VerifyLabels() const { LabelIdx targetLabIdx = switchStmt.GetDefaultLabel(); BB *bb = func.GetLabelBBAt(targetLabIdx); ASSERT(bb->GetBBLabel() == targetLabIdx, "undefined label in switch"); - for (size_t j = 0; j < switchStmt.GetSwitchTable().size(); j++) { + for (size_t j = 0; j < switchStmt.GetSwitchTable().size(); ++j) { targetLabIdx = switchStmt.GetCasePair(j).second; bb = func.GetLabelBBAt(targetLabIdx); ASSERT(bb->GetBBLabel() == targetLabIdx, "undefined switch target label"); diff --git a/src/maple_me/src/me_function.cpp b/src/maple_me/src/me_function.cpp index 07224214447cace6a58f2173be0b3c062d530701..a7295b6fc25db25a3f0a148a26b0c101b31ad92c 100644 --- a/src/maple_me/src/me_function.cpp +++ b/src/maple_me/src/me_function.cpp @@ -14,10 +14,8 @@ */ #include "me_function.h" #include -#include #include #include "ssa_mir_nodes.h" -#include "me_ssa.h" #include "me_cfg.h" #include "mir_lower.h" #include "mir_builder.h" @@ -286,15 +284,15 @@ void MeFunction::CreateBasicBlocks() { auto *catchNode = static_cast(stmt); const MapleVector &exceptionTyIdxVec = catchNode->GetExceptionTyIdxVec(); - for (TyIdx excepIdx : exceptionTyIdxVec) { - MIRType *eType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(excepIdx); + for (TyIdx exceptIdx : exceptionTyIdxVec) { + MIRType *eType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(exceptIdx); ASSERT(eType != nullptr && (eType->GetPrimType() == PTY_ptr || eType->GetPrimType() == PTY_ref), "wrong exception type"); - auto *epType = static_cast(eType); - MIRType *pointType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(epType->GetPointedTyIdx()); - const std::string &ename = GlobalTables::GetStrTable().GetStringFromStrIdx(pointType->GetNameStrIdx()); - if ((pointType->GetPrimType() == PTY_void) || (ename == "Ljava/lang/Throwable;") || - (ename == "Ljava/lang/Exception;")) { + auto *exceptType = static_cast(eType); + MIRType *pointType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(exceptType->GetPointedTyIdx()); + const std::string &eName = GlobalTables::GetStrTable().GetStringFromStrIdx(pointType->GetNameStrIdx()); + if ((pointType->GetPrimType() == PTY_void) || (eName == "Ljava/lang/Throwable;") || + (eName == "Ljava/lang/Exception;")) { // "Ljava/lang/Exception;" is risk to set isJavaFinally because it // only deal with "throw exception". if throw error, it's wrong curBB->SetAttributes(kBBAttrIsJavaFinally); // this is a start of finally handler @@ -303,8 +301,8 @@ void MeFunction::CreateBasicBlocks() { break; } case OP_label: { - auto *lblNode = static_cast(stmt); - LabelIdx labidx = lblNode->GetLabelIdx(); + auto *labelNode = static_cast(stmt); + LabelIdx labelIdx = labelNode->GetLabelIdx(); if (!curBB->IsEmpty() || curBB->GetBBLabel() != 0) { // prepare a new bb StmtNode *lastStmt = stmt->GetPrev(); @@ -337,8 +335,8 @@ void MeFunction::CreateBasicBlocks() { } curBB = newBB; } - labelBBIdMap[labidx] = curBB; - curBB->SetBBLabel(labidx); + labelBBIdMap[labelIdx] = curBB; + curBB->SetBBLabel(labelIdx); break; } case OP_jscatch: { @@ -532,7 +530,7 @@ BB &MeFunction::SplitBB(BB &bb, StmtNode &splitPoint, BB *newBB) { auto eIt = end(); // update bb's idx for (auto it = newIt; it != eIt; ++it) { - idx++; + ++idx; if ((*it) != nullptr) { (*it)->SetBBId(BBId(idx)); } @@ -653,7 +651,7 @@ void MeFunction::BuildSCCDFS(BB &bb, uint32 &visitIndex, std::vector stackTopId = visitStack.top(); visitStack.pop(); inStack[stackTopId] = false; - BB *topBB = static_cast(GetAllBBs()[stackTopId]); + auto *topBB = static_cast(GetAllBBs()[stackTopId]); sccNode->AddBBNode(topBB); sccOfBB[stackTopId] = sccNode; } while (stackTopId != id); diff --git a/src/maple_me/src/me_ir.cpp b/src/maple_me/src/me_ir.cpp index 2e2664af3594258f672b4daeb912721a2f741098..aae72090fe0af01b707665b8eb36cbc8f86cb923 100644 --- a/src/maple_me/src/me_ir.cpp +++ b/src/maple_me/src/me_ir.cpp @@ -936,11 +936,11 @@ MeStmt *MeStmt::GetNextMeStmt() const { void PaiassignMeStmt::Dump(IRMap *irMap) const { LogInfo::MapleLogger() << "||MEIR PAI|| " << kOpcodeInfo.GetTableItemAt(GetOp()).name << " "; lhs->Dump(irMap); - LogInfo::MapleLogger() << std::endl; + LogInfo::MapleLogger() << '\n'; PrintIndentation(kDefaultPrintIndentNum); LogInfo::MapleLogger() << "rhs = "; rhs->Dump(irMap, kDefaultPrintIndentNum); - LogInfo::MapleLogger() << std::endl; + LogInfo::MapleLogger() << '\n'; } void DassignMeStmt::Dump(IRMap *irMap) const { diff --git a/src/maple_me/src/me_option.cpp b/src/maple_me/src/me_option.cpp index fe6872b298a2ecb2d84752aa9c83647393facd47..69d0b1ad938c42496bbf4e6058667545188e31b3 100644 --- a/src/maple_me/src/me_option.cpp +++ b/src/maple_me/src/me_option.cpp @@ -40,7 +40,7 @@ bool MeOption::lessThrowAlias = true; bool MeOption::regreadAtReturn = true; void MeOption::SplitPhases(const std::string &str, std::unordered_set &set) const { - std::string s{str}; + std::string s{ str }; if (s.compare("*") == 0) { set.insert(s); @@ -50,7 +50,7 @@ void MeOption::SplitPhases(const std::string &str, std::unordered_set &phas void MeFuncPhaseManager::AddPhases(const std::unordered_set &skipPhases) { auto addPhase = [&](const std::string &phase) { - std::unordered_set::const_iterator it = skipPhases.find(phase); + auto it = skipPhases.find(phase); if (it == skipPhases.end()) { PhaseManager::AddPhase(phase); } @@ -98,10 +98,7 @@ void MeFuncPhaseManager::AddPhases(const std::unordered_set &skipPh // match sub string of function name bool MeFuncPhaseManager::FuncFilter(const std::string &filter, const std::string &name) { - if (filter.compare("*") == 0 || name.find(filter.c_str()) != std::string::npos) { - return true; - } - return false; + return (filter == "*") || (name.find(filter) != std::string::npos); } void MeFuncPhaseManager::IPACleanUp(MeFunction *func) { @@ -133,7 +130,7 @@ void MeFuncPhaseManager::Run(MIRFunction *mirFunc, uint64 rangeNum, const std::s size_t phaseIndex = 0; for (auto it = PhaseSequenceBegin(); it != PhaseSequenceEnd(); ++it, ++phaseIndex) { PhaseID id = GetPhaseId(it); - MeFuncPhase *p = static_cast(GetPhase(id)); + auto *p = static_cast(GetPhase(id)); p->SetPreviousPhaseName(phaseName); // prev phase name is for filename used in emission after phase phaseName = p->PhaseName(); // new phase name bool dumpPhase = MeOption::DumpPhase(phaseName); @@ -171,7 +168,7 @@ void MeFuncPhaseManager::Run(MIRFunction *mirFunc, uint64 rangeNum, const std::s function.Prepare(rangeNum); for (auto it = PhaseSequenceBegin(); it != PhaseSequenceEnd(); ++it) { PhaseID id = GetPhaseId(it); - MeFuncPhase *p = static_cast(GetPhase(id)); + auto *p = static_cast(GetPhase(id)); if (p == changeCFGPhase) { continue; } diff --git a/src/maple_me/src/me_rc_lowering.cpp b/src/maple_me/src/me_rc_lowering.cpp index ae1b3c6286ce3ea3afd7972e082e89d3f1eff19c..ff94ccb0042945501d6ccf997b06777b13113cc5 100644 --- a/src/maple_me/src/me_rc_lowering.cpp +++ b/src/maple_me/src/me_rc_lowering.cpp @@ -223,7 +223,7 @@ void RCLowering::HandleCallAssignedMeStmt(MeStmt &stmt, MeExpr *pendingDec) { if (!ost->IsSymbolOst()) { return; } - MIRSymbol *retSym = ost->GetMIRSymbol(); + const MIRSymbol *retSym = ost->GetMIRSymbol(); if (retSym == nullptr) { return; } @@ -293,7 +293,7 @@ void RCLowering::PreprocessAssignMeStmt(MeStmt &stmt) { if (lhs->GetMeOp() != kMeOpVar) { return; } - MIRSymbol *lsym = ssaTab.GetMIRSymbolFromID(stmt.GetVarLHS()->GetOStIdx()); + const MIRSymbol *lsym = ssaTab.GetMIRSymbolFromID(stmt.GetVarLHS()->GetOStIdx()); if (stmt.GetOp() == OP_dassign && (lsym->GetStorageClass() == kScAuto || lsym->GetStorageClass() == kScFormal)) { assignedPtrSym.insert(lsym); } @@ -321,7 +321,7 @@ void RCLowering::HandleAssignMeStmtRegLHS(MeStmt &stmt) { } void RCLowering::HandleAssignMeStmtVarLHS(MeStmt &stmt, MeExpr *pendingDec) { - MIRSymbol *lsym = ssaTab.GetMIRSymbolFromID(stmt.GetVarLHS()->GetOStIdx()); + const MIRSymbol *lsym = ssaTab.GetMIRSymbolFromID(stmt.GetVarLHS()->GetOStIdx()); if (lsym->IsGlobal()) { // decref could be optimized away after if null check HandleAssignToGlobalVar(stmt); diff --git a/src/maple_me/src/orig_symbol.cpp b/src/maple_me/src/orig_symbol.cpp index bf51773dfb3964a08b538aa23440b19ac8e53bc7..e20e6afa34cf7cc8b5a45e139106bf73aad4508d 100644 --- a/src/maple_me/src/orig_symbol.cpp +++ b/src/maple_me/src/orig_symbol.cpp @@ -65,7 +65,7 @@ void OriginalStTable::Dump() { } OriginalSt *OriginalStTable::FindOrCreateSymbolOriginalSt(MIRSymbol &mirst, PUIdx pidx, FieldID fld) { - MapleUnorderedMap::iterator it = mirSt2Ost.find(&mirst); + auto it = mirSt2Ost.find(&mirst); if (it == mirSt2Ost.end()) { // create a new OriginalSt return CreateSymbolOriginalSt(mirst, pidx, fld); @@ -76,12 +76,12 @@ OriginalSt *OriginalStTable::FindOrCreateSymbolOriginalSt(MIRSymbol &mirst, PUId } OriginalSt *OriginalStTable::FindOrCreatePregOriginalSt(PregIdx regidx, PUIdx pidx) { - MapleUnorderedMap::iterator it = preg2Ost.find(regidx); + auto it = preg2Ost.find(regidx); return (it == preg2Ost.end()) ? CreatePregOriginalSt(regidx, pidx) : originalStVector.at(it->second.idx); } OriginalSt *OriginalStTable::CreateSymbolOriginalSt(MIRSymbol &mirst, PUIdx pidx, FieldID fld) { - OriginalSt *ost = alloc.GetMemPool()->New(originalStVector.size(), mirst, pidx, fld, alloc); + auto *ost = alloc.GetMemPool()->New(originalStVector.size(), mirst, pidx, fld, alloc); if (fld == 0) { ost->SetTyIdx(mirst.GetTyIdx()); ost->SetIsFinal(mirst.IsFinal()); @@ -100,7 +100,7 @@ OriginalSt *OriginalStTable::CreateSymbolOriginalSt(MIRSymbol &mirst, PUIdx pidx } OriginalSt *OriginalStTable::CreatePregOriginalSt(PregIdx regidx, PUIdx pidx) { - OriginalSt *ost = alloc.GetMemPool()->New(originalStVector.size(), regidx, pidx, alloc); + auto *ost = alloc.GetMemPool()->New(originalStVector.size(), regidx, pidx, alloc); if (regidx < 0) { ost->SetTyIdx(TyIdx(PTY_unknown)); } else { @@ -112,7 +112,7 @@ OriginalSt *OriginalStTable::CreatePregOriginalSt(PregIdx regidx, PUIdx pidx) { } OriginalSt *OriginalStTable::FindSymbolOriginalSt(MIRSymbol &mirst) { - MapleUnorderedMap::iterator it = mirSt2Ost.find(&mirst); + auto it = mirSt2Ost.find(&mirst); if (it == mirSt2Ost.end()) { return nullptr; } diff --git a/src/maple_me/src/ssa.cpp b/src/maple_me/src/ssa.cpp index 07d3e36c000ebbb8fea3713386fd674a0a17a37b..cb7b8b745f520a3b8a91bc195875682214bf3348 100644 --- a/src/maple_me/src/ssa.cpp +++ b/src/maple_me/src/ssa.cpp @@ -23,7 +23,7 @@ void SSA::InitRenameStack(OriginalStTable &oTable, size_t bbSize, VersionStTable vstStacks.resize(oTable.Size()); vstVersions.resize(oTable.Size(), 0); bbRenamed.resize(bbSize, false); - for (size_t i = 1; i < oTable.Size(); i++) { + for (size_t i = 1; i < oTable.Size(); ++i) { MapleStack *vStack = ssaAlloc.GetMemPool()->New>(ssaAlloc.Adapter()); const OriginalSt *ost = oTable.GetOriginalStFromID(OStIdx(i)); VersionSt *temp = (ost->GetIndirectLev() >= 0) ? verStTab.GetVersionStFromID(ost->GetZeroVersionIndex(), true) @@ -48,7 +48,7 @@ VersionSt *SSA::CreateNewVersion(VersionSt &vSym, BB &defBB) { } void SSA::RenamePhi(BB &bb) { - for (auto phiIt = bb.GetPhiList().begin(); phiIt != bb.GetPhiList().end(); phiIt++) { + for (auto phiIt = bb.GetPhiList().begin(); phiIt != bb.GetPhiList().end(); ++phiIt) { VersionSt *vSym = (*phiIt).second.GetResult(); // It shows that this BB has been renamed. if (vSym->GetVersion() > 0) { @@ -100,7 +100,7 @@ void SSA::RenameMustDefs(const StmtNode &stmt, BB &defBB) { void SSA::RenameMayUses(BaseNode &node) { if (node.GetOpCode() == OP_iread) { - IreadSSANode &iRead = static_cast(node); + auto &iRead = static_cast(node); VersionSt *vSym = iRead.GetSSAVar(); CHECK_FATAL(vSym != nullptr, "SSA::RenameMayUses: iRead has no mayUse opnd"); CHECK_FATAL(vSym->GetOrigIdx().idx < vstStacks.size(), "index out of range in SSA::RenameMayUses"); @@ -119,21 +119,23 @@ void SSA::RenameMayUses(BaseNode &node) { void SSA::RenameExpr(BaseNode &expr) { if (expr.GetOpCode() == OP_addrof || expr.GetOpCode() == OP_dread) { - AddrofSSANode &addrofNode = static_cast(expr); + auto &addrofNode = static_cast(expr); VersionSt *vSym = addrofNode.GetSSAVar(); CHECK_FATAL(vSym->GetOrigIdx().idx < vstStacks.size(), "index out of range in SSA::RenameExpr"); addrofNode.SetSSAVar(vstStacks[vSym->GetOrigIdx().idx]->top()); return; - } else if (expr.GetOpCode() == OP_regread) { - RegreadSSANode ®Node = static_cast(expr); + } + if (expr.GetOpCode() == OP_regread) { + auto ®Node = static_cast(expr); VersionSt *vSym = regNode.GetSSAVar(); CHECK_FATAL(vSym->GetOrigIdx().idx < vstStacks.size(), "index out of range in SSA::RenameExpr"); regNode.SetSSAVar(vstStacks[vSym->GetOrigIdx().idx]->top()); return; - } else if (expr.GetOpCode() == OP_iread) { + } + if (expr.GetOpCode() == OP_iread) { RenameMayUses(expr); } - for (size_t i = 0; i < expr.NumOpnds(); i++) { + for (size_t i = 0; i < expr.NumOpnds(); ++i) { RenameExpr(*expr.Opnd(i)); } } @@ -142,7 +144,7 @@ void SSA::RenameUses(StmtNode &stmt) { if (kOpcodeInfo.HasSSAUse(stmt.GetOpCode())) { RenameMayUses(stmt); } - for (int i = 0; i < stmt.NumOpnds(); i++) { + for (int i = 0; i < stmt.NumOpnds(); ++i) { RenameExpr(*stmt.Opnd(i)); } } @@ -159,7 +161,7 @@ void SSA::RenamePhiUseInSucc(BB &bb) { } CHECK_FATAL(index < succBB->GetPred().size(), "RenamePhiUseInSucc: cannot find corresponding pred"); // rename the phiOpnds[index] in all the phis in succ_bb - for (auto phiIt = succBB->GetPhiList().begin(); phiIt != succBB->GetPhiList().end(); phiIt++) { + for (auto phiIt = succBB->GetPhiList().begin(); phiIt != succBB->GetPhiList().end(); ++phiIt) { PhiNode &phiNode = phiIt->second; CHECK_FATAL(phiNode.GetPhiOpnd(index)->GetOrigIdx().idx < vstStacks.size(), "out of range SSA::RenamePhiUseInSucc"); @@ -171,7 +173,7 @@ void SSA::RenamePhiUseInSucc(BB &bb) { void PhiNode::Dump(const MIRModule *mod) { GetResult()->Dump(mod); LogInfo::MapleLogger() << " = PHI("; - for (size_t i = 0; i < GetPhiOpnds().size(); i++) { + for (size_t i = 0; i < GetPhiOpnds().size(); ++i) { GetPhiOpnd(i)->Dump(mod); if (i < GetPhiOpnds().size() - 1) { LogInfo::MapleLogger() << ','; diff --git a/src/maple_me/src/ssa_mir_nodes.cpp b/src/maple_me/src/ssa_mir_nodes.cpp index c8294fe75dc681000a1fb902175fa5caa3e620c9..8eb4ba98fcac0bf3c4d96b77fd58366bd3b3b571 100644 --- a/src/maple_me/src/ssa_mir_nodes.cpp +++ b/src/maple_me/src/ssa_mir_nodes.cpp @@ -72,15 +72,15 @@ static MapleMap *SSAGenericGetMayDefsFromVersionSt(VersionSt if (vst.GetDefType() == VersionSt::kPhi) { PhiNode *phi = vst.GetPhi(); for (size_t i = 0; i < phi->GetPhiOpnds().size(); ++i) { - VersionSt *vsym = phi->GetPhiOpnd(i); - MapleMap *mayDefs = SSAGenericGetMayDefsFromVersionSt(*vsym, stmtsSSAPart, visited); + VersionSt *vSym = phi->GetPhiOpnd(i); + MapleMap *mayDefs = SSAGenericGetMayDefsFromVersionSt(*vSym, stmtsSSAPart, visited); if (mayDefs != nullptr) { return mayDefs; } } } else if (vst.GetDefType() == VersionSt::kMayDef) { - MayDefNode *maydef = vst.GetMayDef(); - return &stmtsSSAPart.GetMayDefNodesOf(*maydef->GetStmt()); + MayDefNode *mayDef = vst.GetMayDef(); + return &stmtsSSAPart.GetMayDefNodesOf(*mayDef->GetStmt()); } return nullptr; } diff --git a/src/maple_me/src/ssa_tab.cpp b/src/maple_me/src/ssa_tab.cpp index d775cac6a39bf179ae8f8d2bbe708a6622371e0e..1b79368c6dee87520db5db34e46a942dd1356a17 100644 --- a/src/maple_me/src/ssa_tab.cpp +++ b/src/maple_me/src/ssa_tab.cpp @@ -27,23 +27,25 @@ namespace maple { BaseNode *SSATab::CreateSSAExpr(BaseNode &expr) { if (expr.GetOpCode() == OP_addrof || expr.GetOpCode() == OP_dread) { - AddrofNode &addrofNode = static_cast(expr); + auto &addrofNode = static_cast(expr); AddrofSSANode *ssaNode = mirModule.CurFunction()->GetCodeMemPool()->New(&addrofNode); MIRSymbol *st = mirModule.CurFunction()->GetLocalOrGlobalSymbol(ssaNode->GetStIdx()); OriginalSt *ost = FindOrCreateSymbolOriginalSt(*st, mirModule.CurFunction()->GetPuidx(), ssaNode->GetFieldID()); VersionSt *vst = versionStTable.FindOrCreateVersionSt(ost, kInitVersion); ssaNode->SetSSAVar(vst); return ssaNode; - } else if (expr.GetOpCode() == OP_regread) { - RegreadNode ®ReadNode = static_cast(expr); + } + if (expr.GetOpCode() == OP_regread) { + auto ®ReadNode = static_cast(expr); RegreadSSANode *ssaNode = mirModule.CurFunction()->GetCodeMemPool()->New(®ReadNode); OriginalSt *ost = originalStTable.FindOrCreatePregOriginalSt(ssaNode->GetRegIdx(), mirModule.CurFunction()->GetPuidx()); VersionSt *vst = versionStTable.FindOrCreateVersionSt(ost, kInitVersion); ssaNode->SetSSAVar(vst); return ssaNode; - } else if (expr.GetOpCode() == OP_iread) { - IreadNode &ireadNode = static_cast(expr); + } + if (expr.GetOpCode() == OP_iread) { + auto &ireadNode = static_cast(expr); IreadSSANode *ssaNode = mirModule.CurFunction()->GetCodeMempool()->New( mirModule.CurFuncCodeMemPoolAllocator(), &ireadNode); BaseNode *newOpnd = CreateSSAExpr(*expr.Opnd(0)); @@ -51,19 +53,18 @@ BaseNode *SSATab::CreateSSAExpr(BaseNode &expr) { ssaNode->SetOpnd(newOpnd, 0); } return ssaNode; - } else { - for (size_t i = 0; i < expr.NumOpnds(); i++) { - BaseNode *newOpnd = CreateSSAExpr(*expr.Opnd(i)); - if (newOpnd != nullptr) { - expr.SetOpnd(newOpnd, i); - } + } + for (size_t i = 0; i < expr.NumOpnds(); ++i) { + BaseNode *newOpnd = CreateSSAExpr(*expr.Opnd(i)); + if (newOpnd != nullptr) { + expr.SetOpnd(newOpnd, i); } - return nullptr; } + return nullptr; } void SSATab::CreateSSAStmt(StmtNode &stmt, const BB &curbb) { - for (size_t i = 0; i < stmt.NumOpnds(); i++) { + for (size_t i = 0; i < stmt.NumOpnds(); ++i) { BaseNode *newOpnd = CreateSSAExpr(*stmt.Opnd(i)); if (newOpnd != nullptr) { stmt.SetOpnd(newOpnd, i); @@ -116,7 +117,7 @@ void SSATab::CreateSSAStmt(StmtNode &stmt, const BB &curbb) { stmtsSSAPart.GetSSAPartMp()->New(&stmtsSSAPart.GetSSAPartAlloc()); stmtsSSAPart.SetSSAPartOf(stmt, theSSAPart); // insert the mustdefs - CallReturnVector *nrets = static_cast(stmt).GetCallReturnVector(); + auto *nrets = static_cast(stmt).GetCallReturnVector(); CHECK_FATAL(nrets != nullptr, "CreateSSAStmt: failed to retrieve call return vector"); if (nrets->empty()) { return; @@ -140,6 +141,5 @@ void SSATab::CreateSSAStmt(StmtNode &stmt, const BB &curbb) { } } } - return; } } // namespace maple diff --git a/src/maple_me/src/ver_symbol.cpp b/src/maple_me/src/ver_symbol.cpp index 325b7028444d97fb46692fe9ece67e6acb8359d2..47be24c8fd678993e1d845e50fcc7e480415dfde 100644 --- a/src/maple_me/src/ver_symbol.cpp +++ b/src/maple_me/src/ver_symbol.cpp @@ -44,7 +44,7 @@ void VersionSt::DumpDefStmt(const MIRModule *mod) const { VersionSt *VersionStTable::CreateVersionSt(OriginalSt *ost, size_t version) { ASSERT(ost != nullptr, "nullptr check"); ASSERT(ost->GetVersionsIndex().size() == version, "ssa version need to be created incrementally!"); - VersionSt *vst = vstAlloc.GetMemPool()->New(versionStVector.size(), version, ost); + auto *vst = vstAlloc.GetMemPool()->New(versionStVector.size(), version, ost); versionStVector.push_back(vst); ost->PushbackVersionIndex(vst->GetIndex()); if (version == kInitVersion) { @@ -61,9 +61,8 @@ VersionSt *VersionStTable::FindOrCreateVersionSt(OriginalSt *ost, size_t version size_t versionIndex = ost->GetVersionIndex(version); ASSERT(versionStVector.size() > versionIndex, "versionStVector out of range"); return versionStVector.at(versionIndex); - } else { - return CreateVersionSt(ost, version); } + return CreateVersionSt(ost, version); } void VersionStTable::Dump(MIRModule *mod) const { diff --git a/src/maple_phase/include/phase.h b/src/maple_phase/include/phase.h index c7d4b6b4f75930a64af27bfddf3dbdb1f1d313fd..6b5067de2d65d336709b1d87c73e8b683948b9c1 100644 --- a/src/maple_phase/include/phase.h +++ b/src/maple_phase/include/phase.h @@ -22,9 +22,9 @@ #include "mempool_allocator.h" #include "option.h" +namespace maple { using PhaseID = int; -namespace maple { // base class of analysisPhase's result class AnalysisResult { public: @@ -33,6 +33,8 @@ class AnalysisResult { memPool = memPoolParam; } + virtual ~AnalysisResult() = default; + MemPool *GetMempool() { return memPool; } @@ -41,8 +43,6 @@ class AnalysisResult { memPoolCtrler.DeleteMemPool(memPool); } - virtual ~AnalysisResult() = default; - private: MemPool *memPool; }; @@ -51,6 +51,8 @@ class Phase { public: Phase() = default; + virtual ~Phase() = default; + virtual std::string PhaseName() const { ASSERT(false, "The base Phase::PhaseName should not be called"); return ""; @@ -80,8 +82,6 @@ class Phase { memPools.shrink_to_fit(); } - virtual ~Phase() = default; - private: unsigned int memPoolCount = 0; std::vector memPools; @@ -91,10 +91,9 @@ template class AnalysisResultManager { public: explicit AnalysisResultManager(MapleAllocator *alloc) - : analysisResults(std::less(), alloc->Adapter()), - analysisPhases(std::less(), alloc->Adapter()) { - allocator = alloc; - } + : allocator(alloc), + analysisResults(alloc->Adapter()), + analysisPhases(alloc->Adapter()) {} virtual ~AnalysisResultManager() { // global variable mirModule which use same mempool control is not delete yet @@ -110,19 +109,19 @@ class AnalysisResultManager { } PhaseT *anaPhase = GetAnalysisPhase(id); - if (std::string(anaPhase->PhaseName()) != Options::skipPhase) { - AnalysisResult *result = anaPhase->Run(ir, this); - // allow invoke phases whose return value is nullptr using GetAnalysisResult - if (result == nullptr) { - anaPhase->ReleaseMemPool(nullptr); - return nullptr; - } - anaPhase->ReleaseMemPool(result->GetMempool()); - analysisResults[key] = result; // add r to analysisResults - return result; - } else { + if (std::string(anaPhase->PhaseName()) == Options::skipPhase) { + return nullptr; + } + + AnalysisResult *result = anaPhase->Run(ir, this); + // allow invoke phases whose return value is nullptr using GetAnalysisResult + if (result == nullptr) { + anaPhase->ReleaseMemPool(nullptr); return nullptr; } + anaPhase->ReleaseMemPool(result->GetMempool()); + analysisResults[key] = result; // add r to analysisResults + return result; } void AddResult(PhaseIDT id, UnitIR &ir, AnalysisResult &ar) { @@ -166,11 +165,11 @@ class AnalysisResultManager { } PhaseT *GetAnalysisPhase(PhaseIDT id) { - if (analysisPhases.find(id) != analysisPhases.end()) { - return analysisPhases[id]; + auto it = analysisPhases.find(id); + if (it != analysisPhases.end()) { + return it->second; } CHECK_FATAL(false, "Invalid analysis phase"); - return nullptr; } void ClearAnalysisPhase() { diff --git a/src/maple_phase/include/phase_impl.h b/src/maple_phase/include/phase_impl.h index 72174a1fecff2ed7c96f477c9d1af77624bb8da8..e4beacecd0cd2e596ede15494c6c0c0901f35afa 100644 --- a/src/maple_phase/include/phase_impl.h +++ b/src/maple_phase/include/phase_impl.h @@ -67,7 +67,7 @@ class FuncOptimizeIterator { }; #define OPT_TEMPLATE(OPT_NAME) \ - KlassHierarchy *kh = static_cast(mrm->GetAnalysisResult(MoPhase_CHA, mod)); \ + auto *kh = static_cast(mrm->GetAnalysisResult(MoPhase_CHA, mod)); \ ASSERT(kh, "null ptr check"); \ FuncOptimizeIterator opt(PhaseName(), new OPT_NAME(mod, kh, TRACE_PHASE)); \ opt.Run(); diff --git a/src/maple_phase/include/phase_manager.h b/src/maple_phase/include/phase_manager.h index f516523dd373d1cb231714aa8d0149b54b9f913b..2c06bf240078431e277c352a93a74e4060daa440 100644 --- a/src/maple_phase/include/phase_manager.h +++ b/src/maple_phase/include/phase_manager.h @@ -95,7 +95,7 @@ class PhaseManager { } const std::string GetPhaseName(iterator it) { - return (*it).second->PhaseName(); + return it->second->PhaseName(); } const std::string &GetMgrName() const { @@ -103,7 +103,7 @@ class PhaseManager { } PhaseID GetPhaseId(iterator it) const { - return (*it).first; + return it->first; } // iterator for phaseSeq @@ -141,7 +141,7 @@ class PhaseManager { LogInfo::MapleLogger() << std::left << std::setw(25) << registeredPhases[phaseSequences[i]]->PhaseName() << std::setw(10) << std::right << std::fixed << std::setprecision(2) << (100.0 * phaseTimers[i] / total) << "%" << std::setw(10) << std::setprecision(0) - << (phaseTimers[i] / 1000.0) << "ms" << std::endl; + << (phaseTimers[i] / 1000.0) << "ms" << '\n'; LogInfo::MapleLogger().flags(f); } return total; diff --git a/src/maple_util/include/name_mangler.h b/src/maple_util/include/name_mangler.h index 6d0c3131be9f8125528c858adb71c9ee1c14a136..1ac9a706b22186b21abfdd9f407363236fc2c712 100644 --- a/src/maple_util/include/name_mangler.h +++ b/src/maple_util/include/name_mangler.h @@ -89,7 +89,6 @@ static constexpr const char kMethodsInfoCompactPrefixStr[] = "__methods_infocomp static constexpr const char kFieldsInfoPrefixStr[] = "__fields_info__"; static constexpr const char kFieldsInfoCompactPrefixStr[] = "__fields_infocompact__"; static constexpr const char kFieldOffsetDataPrefixStr[] = "__fieldOffsetData__"; -static constexpr const char kMethodAddrDataPrefixStr[] = "__methodAddrData__"; static constexpr const char kRegJNITabPrefixStr[] = "__reg_jni_tab"; static constexpr const char kRegJNIFuncTabPrefixStr[] = "__reg_jni_func_tab"; static constexpr const char kReflectionStrtabPrefixStr[] = "__reflection_strtab"; diff --git a/src/mempool/include/maple_string.h b/src/mempool/include/maple_string.h index d261330493aa406a4b4098a9d715a1aab66cf9a3..54119e3b110c1358ac70aa28cd47808bd5f19c4d 100644 --- a/src/mempool/include/maple_string.h +++ b/src/mempool/include/maple_string.h @@ -23,17 +23,15 @@ namespace maple { class MapleString { public: - MapleString() : data(nullptr), memPool(nullptr), dataLength(0) {} - - explicit MapleString(MemPool *currMp) : data(nullptr), memPool(currMp), dataLength(0) {} - + MapleString() = default; + explicit MapleString(MemPool *currMp) : memPool(currMp) {} + MapleString(const MapleString &str); MapleString(const char *str, MemPool *memPool); MapleString(const char *str, size_t size, MemPool *memPool); // copyin MapleString(unsigned int size, MemPool *memPool); MapleString(const MapleString &str, MemPool *memPool); MapleString(const std::string &str, MemPool *memPool); - MapleString(const MapleString &str); - ~MapleString() {} + ~MapleString() = default; unsigned int length() const { return dataLength; @@ -142,7 +140,7 @@ class MapleString { CHECK_FATAL(oldSize <= UINT_MAX - 1, "str too large"); data = static_cast(memPool->Realloc(data, oldSize * sizeof(char), (dataLength + 1 + 1) * sizeof(char))); - dataLength++; + ++dataLength; data[dataLength - 1] = c; data[dataLength] = '\0'; return *this; @@ -253,9 +251,9 @@ class MapleString { friend bool operator==(const char*, const MapleString&); friend bool operator<(const MapleString &str1, const MapleString &str2); - char *data; - MemPool *memPool; - unsigned int dataLength; + char *data = nullptr; + MemPool *memPool = nullptr; + unsigned int dataLength = 0; }; // global operators diff --git a/src/mempool/include/mempool_allocator.h b/src/mempool/include/mempool_allocator.h index 1ad5bf6ac965c35c047f4f21592e6445a00dfabf..f06dd54e6308ab41c963600e4b63a60087ef9c81 100644 --- a/src/mempool/include/mempool_allocator.h +++ b/src/mempool/include/mempool_allocator.h @@ -14,7 +14,7 @@ */ #ifndef MEMPOOL_INCLUDE_MEMPOOL_ALLOCATOR_H #define MEMPOOL_INCLUDE_MEMPOOL_ALLOCATOR_H -#include +#include #include #include #include @@ -37,7 +37,7 @@ class MapleAllocator { // Get adapter for use in STL containers. See arena_containers.h . MapleAllocatorAdapter Adapter(); void *Alloc(size_t bytes) { - return (memPool ? memPool->Malloc(bytes) : nullptr); + return (memPool != nullptr) ? memPool->Malloc(bytes) : nullptr; } MemPool *GetMemPool() { @@ -56,10 +56,13 @@ class MapleAllocator { template class MapleAllocatorAdapter; // circular dependency exists, no other choice + template using MapleQueue = std::deque>; + template using MapleVector = std::vector>; + template class MapleStack { public: @@ -112,20 +115,28 @@ class MapleStack { template using MapleList = std::list>; + template using MapleForwardList = std::forward_list>; + template > using MapleSet = std::set>; + template , typename Equal = std::equal_to> using MapleUnorderedSet = std::unordered_set>; + template > using MapleMap = std::map>>; + template > using MapleMultiMap = std::multimap>>; + template , typename Equal = std::equal_to> using MapleUnorderedMap = std::unordered_map>>; + template , typename Equal = std::equal_to> using MapleUnorderedMultiMap = std::unordered_multimap>>; + // Implementation details below. template <> class MapleAllocatorAdapter { diff --git a/src/mpl2mpl/include/class_hierarchy.h b/src/mpl2mpl/include/class_hierarchy.h index bd280b4d57ba96c3827f599a2b63873301acf28b..df9084b9cc52264bdbf426ba422db193988f0be3 100644 --- a/src/mpl2mpl/include/class_hierarchy.h +++ b/src/mpl2mpl/include/class_hierarchy.h @@ -20,24 +20,23 @@ namespace maple { class KlassHierarchy; // circular dependency exists, no other choice // should be consistent with runtime -static constexpr uint32 kClassPrim = 0x0001; -static constexpr uint32 kClassArray = 0x0002; -static constexpr uint32 kClassHasFinalizer = 0x0004; -static constexpr uint32 kClassSoftreference = 0x0008; -static constexpr uint32 kClassWeakreference = 0x0010; -static constexpr uint32 kClassPhantomreference = 0x0020; -static constexpr uint32 kClassFinalizereference = 0x0040; -static constexpr uint32 kClassCleaner = 0x0080; -static constexpr uint32 kClassFinalizerreferenceSentinel = 0x0100; -static constexpr uint32 kClassIsExceptionKlass = 0x0200; -static constexpr uint32 kClassIsanonymousclass = 0x0400; -static constexpr uint32 kClassIscoldclass = 0x0800; -static constexpr uint32 kClassNeedDecouple = 0x1000; -static constexpr uint32 kClassLazyBindingClass = 0x2000; -static constexpr char kJavaLangNoMethodStr[] = "Ljava_2Flang_2FNoSuchMethodException_3B"; - -#define CLASS_REFERENCE \ - (kClassSoftreference | kClassWeakreference | kClassCleaner | kClassFinalizereference | kClassPhantomreference) +constexpr uint32 kClassPrim = 0x0001; +constexpr uint32 kClassArray = 0x0002; +constexpr uint32 kClassHasFinalizer = 0x0004; +constexpr uint32 kClassSoftreference = 0x0008; +constexpr uint32 kClassWeakreference = 0x0010; +constexpr uint32 kClassPhantomreference = 0x0020; +constexpr uint32 kClassFinalizereference = 0x0040; +constexpr uint32 kClassCleaner = 0x0080; +constexpr uint32 kClassFinalizerreferenceSentinel = 0x0100; +constexpr uint32 kClassIsExceptionKlass = 0x0200; +constexpr uint32 kClassIsanonymousclass = 0x0400; +constexpr uint32 kClassIscoldclass = 0x0800; +constexpr uint32 kClassNeedDecouple = 0x1000; +constexpr uint32 kClassLazyBindingClass = 0x2000; +constexpr char kJavaLangNoMethodStr[] = "Ljava_2Flang_2FNoSuchMethodException_3B"; +constexpr uint32 kClassReference = (kClassSoftreference | kClassWeakreference | kClassCleaner | + kClassFinalizereference | kClassPhantomreference); // Klass is the basic node for building class hierarchy class Klass { public: @@ -63,7 +62,7 @@ class Klass { // Return true if found in the member methods bool IsKlassMethod(const MIRFunction *func) const; // Return MIRFunction if has method - const MIRFunction *HasMethod(const std::string &funcname); + const MIRFunction *HasMethod(const std::string &funcname) const; const MapleList &GetMethods() const { return methods; } @@ -118,7 +117,7 @@ class Klass { } bool HasFlag(uint32 flag) const { - return static_cast(GetFlag(flag) != 0); + return GetFlag(flag) != 0; } bool IsExceptionKlass() const { @@ -150,7 +149,7 @@ class Klass { } bool IsReference() const { - return HasFlag(CLASS_REFERENCE); + return HasFlag(kClassReference); } bool IsArray() const { @@ -176,7 +175,6 @@ class Klass { const MIRFunction * const GetClinit() const { return clinitMethod; } - void SetClinit(MIRFunction *m) { clinitMethod = m; } @@ -244,6 +242,12 @@ class Klass { void Dump() const; private: + void DumpKlassImplInterfaces() const; + void DumpKlassImplKlasses() const; + void DumpKlassSuperKlasses() const; + void DumpKlassSubKlasses() const; + void DumpKlassMethods() const; + bool IsVirtualMethod(const MIRFunction &func) const; // structType can be class or interface MIRStructType *structType; MapleAllocator *alloc; @@ -260,22 +264,16 @@ class Klass { MapleList methods; // A mapping to track every method to its baseFuncNameWithType MapleMap strIdx2Method; - MIRFunction *clinitMethod; - MIRSymbol *classInitBridge; + MIRFunction *clinitMethod = nullptr; + MIRSymbol *classInitBridge = nullptr; // A mapping to track possible implementations for each virtual function MapleMap*> strIdx2CandidateMap; // flags of this class. // Now contains whether this class is exception, reference or has finalizer. - uint32 flags; - bool isPrivateInnerAndNoSubClassFlag; - bool hasNativeMethods; - bool needDecoupling; - void DumpKlassImplInterfaces() const; - void DumpKlassImplKlasses() const; - void DumpKlassSuperKlasses() const; - void DumpKlassSubKlasses() const; - void DumpKlassMethods() const; - bool IsVirtualMethod(const MIRFunction &func) const; + uint32 flags = 0; + bool isPrivateInnerAndNoSubClassFlag = false; + bool hasNativeMethods = false; + bool needDecoupling = true; }; // Some well known types like java.lang.Object. They may be commonly referenced. @@ -284,42 +282,41 @@ class Klass { // jlr - java lang reflect class WKTypes { public: - static void Init(); class Util { public: static bool MayRefString(const BaseNode &n, MIRType &type); static bool MayRefMeta(const BaseNode &n, MIRType &type); static bool MayNotRefCyclicly(const BaseNode &n, MIRType &type); static MIRType *GetJavaLangObjectType() { - return javalangObject; + return javaLangObject; } private: static bool NotCyclicType(MIRType &type, std::set &workList); }; + static void Init(); private: - static MIRType *javalangObject; - static MIRType *jlString; - static MIRType *javalangobjectSerializable; - static MIRType *javalangComparable; - static MIRType *javalangCharSequence; - static MIRType *javalangClass; - static MIRType *javalangrefGenericDeclaration; - static MIRType *javalangrefAnnotatedElement; - static MIRType *jlrType; - static MIRType *javalangrefMethod; - static MIRType *javalangrefExecutable; - static MIRType *javalangrefAccessibleObject; - static MIRType *javalangrefMember; - static MIRType *javalangrefField; - static MIRType *javalangrefConstructor; + static MIRType *javaLangObject; + static MIRType *javaLangString; + static MIRType *javaLangObjectSerializable; + static MIRType *javaLangComparable; + static MIRType *javaLangCharSequence; + static MIRType *javaLangClass; + static MIRType *javaLangRefGenericDeclaration; + static MIRType *javaLangRefAnnotatedElement; + static MIRType *javaLangRefType; + static MIRType *javaLangRefMethod; + static MIRType *javaLangRefExecutable; + static MIRType *javaLangRefAccessibleObject; + static MIRType *javaLangRefMember; + static MIRType *javaLangRefField; + static MIRType *javaLangRefConstructor; }; // data structure to represent class information defined in the module class KlassHierarchy : public AnalysisResult { public: - static bool traceFlag; KlassHierarchy(MIRModule *mirmodule, MemPool *memPool); virtual ~KlassHierarchy() = default; @@ -334,7 +331,7 @@ class KlassHierarchy : public AnalysisResult { } // Get lowest common ancestor for two classes - Klass *GetLCA(Klass *k1, Klass *k2) const; + Klass *GetLCA(Klass *klass1, Klass *klass2) const; TyIdx GetLCA(TyIdx ty1, TyIdx ty2) const; GStrIdx GetLCA(GStrIdx str1, GStrIdx str2) const; const std::string &GetLCA(const std::string &name1, const std::string &name2) const; @@ -343,9 +340,9 @@ class KlassHierarchy : public AnalysisResult { bool IsInterfaceImplemented(Klass *interface, const Klass *base) const; bool UpdateFieldID(TyIdx baseTypeIdx, TyIdx targetTypeIdx, FieldID &fldID) const; // return true if class, its super or interfaces have at least one clinit function - bool NeedClinitCheckRecursively(Klass &kl); + bool NeedClinitCheckRecursively(const Klass &kl) const; - void CountVirtualMethods(); + void CountVirtualMethods() const; void BuildHierarchy(); void Dump() const; @@ -356,18 +353,8 @@ class KlassHierarchy : public AnalysisResult { const MIRModule *GetModule() const { return mirModule; } - + static bool traceFlag; private: - MapleAllocator alloc; - MIRModule *mirModule; - // Map from class name to klass. Use name as the key because the type - // information is incomplete, e.g. - // method to class link, e.g. - // class A { void foo(); void bar(); } - // class B extends A { void foo(); } - // In this case, there is no link from B.bar to B in the maple file. - MapleMap strIdx2KlassMap; - MapleVector topoWorkList; // New all klass void AddKlasses(); // Add superklass/subclass edge and class methods for each class @@ -384,6 +371,16 @@ class KlassHierarchy : public AnalysisResult { int GetFieldIDOffsetBetweenClasses(const Klass &super, const Klass &base) const; void TopologicalSortKlasses(); void MarkClassFlags(); + MapleAllocator alloc; + MIRModule *mirModule; + // Map from class name to klass. Use name as the key because the type + // information is incomplete, e.g. + // method to class link, e.g. + // class A { void foo(); void bar(); } + // class B extends A { void foo(); } + // In this case, there is no link from B.bar to B in the maple file. + MapleMap strIdx2KlassMap; + MapleVector topoWorkList; }; } // namespace maple #endif // MPL2MPL_INCLUDE_CLASS_HIERARCHY_H diff --git a/src/mpl2mpl/include/class_init.h b/src/mpl2mpl/include/class_init.h index 946ce2a9b22c6967f002d6f2742077475eeeb512..f68b963233937af795d90d2db1de017fddfdb6b9 100644 --- a/src/mpl2mpl/include/class_init.h +++ b/src/mpl2mpl/include/class_init.h @@ -19,8 +19,6 @@ #include "class_hierarchy.h" namespace maple { -static constexpr char kMCCPreClinitCheck[] = "MCC_PreClinitCheck"; -static constexpr char kMCCPostClinitCheck[] = "MCC_PostClinitCheck"; class ClassInit : public FuncOptimizeImpl { public: ClassInit(MIRModule *mod, KlassHierarchy *kh, bool dump); @@ -33,11 +31,11 @@ class ClassInit : public FuncOptimizeImpl { void ProcessFunc(MIRFunction *func) override; private: - void GenClassInitCheckProfile(MIRFunction &func, MIRSymbol &classinfo, StmtNode *clinit) const; - void GenPreClassInitCheck(MIRFunction &func, const MIRSymbol &classinfo, StmtNode *clinit); - void GenPostClassInitCheck(MIRFunction &func, const MIRSymbol &classinfo, StmtNode *clinit); + void GenClassInitCheckProfile(MIRFunction &func, const MIRSymbol &classInfo, StmtNode *clinit) const; + void GenPreClassInitCheck(MIRFunction &func, const MIRSymbol &classInfo, StmtNode *clinit) const; + void GenPostClassInitCheck(MIRFunction &func, const MIRSymbol &classInfo, StmtNode *clinit) const; MIRSymbol *GetClassInfo(const std::string &classname); - bool CanRemoveClinitCheck(const std::string &clinitClassname); + bool CanRemoveClinitCheck(const std::string &clinitClassname) const; }; class DoClassInit : public ModulePhase { diff --git a/src/mpl2mpl/include/gen_check_cast.h b/src/mpl2mpl/include/gen_check_cast.h index 8a827114775b70a6c55f4d4f049a80227796dd29..dea7a64ef29bd1857921fa68b18d4432e1bcdf5d 100644 --- a/src/mpl2mpl/include/gen_check_cast.h +++ b/src/mpl2mpl/include/gen_check_cast.h @@ -19,10 +19,6 @@ #include "phase_impl.h" namespace maple { -static constexpr char kMCCReflectThrowCastException[] = "MCC_Reflect_ThrowCastException"; -static constexpr char kMCCReflectCheckCastingNoArray[] = "MCC_Reflect_Check_Casting_NoArray"; -static constexpr char kMCCReflectCheckCastingArray[] = "MCC_Reflect_Check_Casting_Array"; - class CheckCastGenerator : public FuncOptimizeImpl { public: @@ -36,19 +32,18 @@ class CheckCastGenerator : public FuncOptimizeImpl { void ProcessFunc(MIRFunction *func) override; private: + void InitTypes(); + void InitFuncs(); + void GenAllCheckCast(); + void GenCheckCast(StmtNode &stmt); + BaseNode *GetObjectShadow(BaseNode *opnd); + MIRSymbol *GetOrCreateClassInfoSymbol(const std::string &className); MIRType *pointerObjType = nullptr; MIRType *pointerClassMetaType = nullptr; MIRType *classinfoType = nullptr; MIRFunction *throwCastException = nullptr; MIRFunction *checkCastingNoArray = nullptr; MIRFunction *checkCastingArray = nullptr; - - void InitTypes(); - void InitFuncs(); - void GenAllCheckCast(); - void GenCheckCast(BaseNode &stmt); - BaseNode *GetObjectShadow(BaseNode *opnd); - MIRSymbol *GetOrCreateClassInfoSymbol(const std::string &className); }; class DoCheckCastGeneration : public ModulePhase { diff --git a/src/mpl2mpl/include/muid_replacement.h b/src/mpl2mpl/include/muid_replacement.h index 58ee09c7a711355e8885fb44201efa61af7dd183..dd2c0cef4e38330024d23ed27178b26728be3b17 100644 --- a/src/mpl2mpl/include/muid_replacement.h +++ b/src/mpl2mpl/include/muid_replacement.h @@ -28,13 +28,6 @@ constexpr uint32 kDataDefAddrIndex = 0; constexpr uint32 kFuncDefSizeIndex = 0; constexpr uint32 kFuncDefNameIndex = 1; constexpr uint32 kRangeBeginIndex = 0; -// Version for the mpl linker -static constexpr char kMplLinkerVersionNumber[] = "MPL-LINKER V1.1"; -static constexpr char kMuidFuncPtrStr[] = "__muid_funcptr"; -static constexpr char kMuidSymPtrStr[] = "__muid_symptr"; - -static constexpr uint64 kFromUndefIndexMask = 0x4000000000000000; -static constexpr uint64 kFromDefIndexMask = 0x2000000000000000; enum RangeIdx { // 0,1 entry is reserved for a stamp @@ -75,35 +68,18 @@ class MUIDReplacement : public FuncOptimizeImpl { } private: - bool isLibcore = false; - MIRSymbol *funcDefTabSym = nullptr; - MIRSymbol *funcDefOrigTabSym = nullptr; - MIRSymbol *funcInfTabSym = nullptr; - MIRSymbol *funcUndefTabSym = nullptr; - MIRSymbol *dataDefTabSym = nullptr; - MIRSymbol *dataDefOrigTabSym = nullptr; - MIRSymbol *dataUndefTabSym = nullptr; - MIRSymbol *funcDefMuidTabSym = nullptr; - MIRSymbol *funcUndefMuidTabSym = nullptr; - MIRSymbol *dataDefMuidTabSym = nullptr; - MIRSymbol *dataUndefMuidTabSym = nullptr; - MIRSymbol *funcMuidIdxTabSym = nullptr; - MIRSymbol *rangeTabSym = nullptr; - MIRSymbol *funcProfileTabSym = nullptr; - static MUID mplMuid; - std::string mplMuidStr; using SymIdxPair = std::pair; - std::map funcDefMap; - std::map dataDefMap; - std::map funcUndefMap; - std::map dataUndefMap; - std::map defMuidIdxMap; + enum LazyBindingOption : uint32 { + kNoLazyBinding = 0, + kConservativeLazyBinding = 1, + kRadicalLazyBinding = 2 + }; - void GenericTables(); - void GenericFuncDefTable(); - void GenericDataDefTable(); - void GenericUnifiedUndefTable(); - void GenericRangeTable(); + void GenerateTables(); + void GenerateFuncDefTable(); + void GenerateDataDefTable(); + void GenerateUnifiedUndefTable(); + void GenerateRangeTable(); uint32 FindIndexFromDefTable(const MIRSymbol &mirSymbol, bool isFunc); uint32 FindIndexFromUndefTable(const MIRSymbol &mirSymbol, bool isFunc); void ReplaceAddroffuncConst(MIRConst *&entry, uint32 fieldID, bool isVtab); @@ -119,12 +95,12 @@ class MUIDReplacement : public FuncOptimizeImpl { void CollectDread(MIRFunction ¤tFunc, StmtNode &stmt, BaseNode &opnd); void DumpMUIDFile(bool isFunc); void ReplaceStmts(); - void GenericGlobalRootList(); + void GenerateGlobalRootList(); void CollectImplicitUndefClassInfo(StmtNode &stmt); void CollectFuncAndDataFromKlasses(); void CollectFuncAndDataFromGlobalTab(); void CollectFuncAndDataFromFuncList(); - void GenericCompilerVersionNum(); + void GenerateCompilerVersionNum(); static MIRSymbol *GetSymbolFromName(const std::string &name); // The following sets are for internal uses. Sorting order does not matter here. std::unordered_set funcDefSet; @@ -157,6 +133,28 @@ class MUIDReplacement : public FuncOptimizeImpl { #undef __MRT_MAGIC_PASTE const std::unordered_set reflectionList = { }; + bool isLibcore = false; + MIRSymbol *funcDefTabSym = nullptr; + MIRSymbol *funcDefOrigTabSym = nullptr; + MIRSymbol *funcInfTabSym = nullptr; + MIRSymbol *funcUndefTabSym = nullptr; + MIRSymbol *dataDefTabSym = nullptr; + MIRSymbol *dataDefOrigTabSym = nullptr; + MIRSymbol *dataUndefTabSym = nullptr; + MIRSymbol *funcDefMuidTabSym = nullptr; + MIRSymbol *funcUndefMuidTabSym = nullptr; + MIRSymbol *dataDefMuidTabSym = nullptr; + MIRSymbol *dataUndefMuidTabSym = nullptr; + MIRSymbol *funcMuidIdxTabSym = nullptr; + MIRSymbol *rangeTabSym = nullptr; + MIRSymbol *funcProfileTabSym = nullptr; + std::map funcDefMap; + std::map dataDefMap; + std::map funcUndefMap; + std::map dataUndefMap; + std::map defMuidIdxMap; + static MUID mplMuid; + std::string mplMuidStr; }; class DoMUIDReplacement : public ModulePhase { diff --git a/src/mpl2mpl/include/native_stub_func.h b/src/mpl2mpl/include/native_stub_func.h index 6d2a3912b47319cfe91d773cf41a0274ea6711fd..722e73bf659f4dd1a907a62f25fbaa91636d0930 100644 --- a/src/mpl2mpl/include/native_stub_func.h +++ b/src/mpl2mpl/include/native_stub_func.h @@ -18,24 +18,23 @@ #include "phase_impl.h" namespace maple { -static constexpr int kSlownativeFuncnum = 9; -static constexpr int kJniTypeNormal = 0; -static constexpr int kJniTypeMapleCriticalNative = 1; -static constexpr int kJnitTypeCriticalNative = 2; -static constexpr int kInvalidCode = 0xFF; - -static constexpr char kPreNativeFunc[] = "MCC_PreNativeCall"; -static constexpr char kPostNativeFunc[] = "MCC_PostNativeCall"; -static constexpr char kDecodeRefFunc[] = "MCC_DecodeReference"; -static constexpr char kFindNativeFunc[] = "MCC_FindNativeMethodPtr"; -static constexpr char kFindNativeFuncNoeh[] = "MCC_FindNativeMethodPtrWithoutException"; -static constexpr char kDummyNativeFunc[] = "MCC_DummyNativeMethodPtr"; -static constexpr char kCheckThrowPendingExceptionFunc[] = "MCC_CheckThrowPendingException"; -static constexpr char kCallFastNativeFunc[] = "MCC_CallFastNative"; -static constexpr char kCallFastNativeExtFunc[] = "MCC_CallFastNativeExt"; -static constexpr char kCallSlowNativeExtFunc[] = "MCC_CallSlowNativeExt"; -static constexpr char kSetReliableUnwindContextFunc[] = "MCC_SetReliableUnwindContext"; +constexpr int kSlownativeFuncnum = 9; +constexpr int kJniTypeNormal = 0; +constexpr int kJniTypeMapleCriticalNative = 1; +constexpr int kJnitTypeCriticalNative = 2; +constexpr int kInvalidCode = 0xFF; +constexpr char kPreNativeFunc[] = "MCC_PreNativeCall"; +constexpr char kPostNativeFunc[] = "MCC_PostNativeCall"; +constexpr char kDecodeRefFunc[] = "MCC_DecodeReference"; +constexpr char kFindNativeFunc[] = "MCC_FindNativeMethodPtr"; +constexpr char kFindNativeFuncNoeh[] = "MCC_FindNativeMethodPtrWithoutException"; +constexpr char kDummyNativeFunc[] = "MCC_DummyNativeMethodPtr"; +constexpr char kCheckThrowPendingExceptionFunc[] = "MCC_CheckThrowPendingException"; +constexpr char kCallFastNativeFunc[] = "MCC_CallFastNative"; +constexpr char kCallFastNativeExtFunc[] = "MCC_CallFastNativeExt"; +constexpr char kCallSlowNativeExtFunc[] = "MCC_CallSlowNativeExt"; +constexpr char kSetReliableUnwindContextFunc[] = "MCC_SetReliableUnwindContext"; class NativeFuncProperty { public: NativeFuncProperty() = default; @@ -47,21 +46,42 @@ class NativeFuncProperty { std::string nativeFunc; int jniType = kJniTypeNormal; - friend class GenericNativeStubFunc; + friend class NativeStubFuncGeneration; }; -class GenericNativeStubFunc : public FuncOptimizeImpl { +class NativeStubFuncGeneration : public FuncOptimizeImpl { public: - GenericNativeStubFunc(MIRModule *mod, KlassHierarchy *kh, bool dump); - ~GenericNativeStubFunc() = default; + NativeStubFuncGeneration(MIRModule *mod, KlassHierarchy *kh, bool dump); + ~NativeStubFuncGeneration() = default; void ProcessFunc(MIRFunction *func) override; void Finish() override; FuncOptimizeImpl *Clone() override { - return new GenericNativeStubFunc(*this); + return new NativeStubFuncGeneration(*this); } private: + bool IsStaticBindingListMode() const; + bool ReturnsJstr(TyIdx retType) { + return retType == jstrPointerTypeIdx; + } + void InitStaticBindingMethodList(); + bool IsStaticBindingMethod(const std::string &methodName) const; + MIRFunction &GetOrCreateDefaultNativeFunc(MIRFunction &stubFunc); + void GenerateRegisteredNativeFuncCall(MIRFunction &func, const MIRFunction &nativeFunc, MapleVector &args, + const MIRSymbol *ret, bool needNativeCall, CallNode &preNativeFuncCall, + CallNode &postNativeFuncCall); + StmtNode *CreateNativeWrapperCallNode(MIRFunction &func, BaseNode *funcPtr, MapleVector &args, + const MIRSymbol *ret); + void GenerateNativeWrapperFuncCall(MIRFunction &func, const MIRFunction &nativeFunc, MapleVector &args, + const MIRSymbol *ret); + void GenerateHelperFuncDecl(); + void GenerateRegTabEntry(const MIRFunction &func); + void GenerateRegTableEntryType(); + void GenerateRegTable(); + void GenerateRegFuncTabEntryType(); + void GenerateRegFuncTabEntry(); + void GenerateRegFuncTab(); // a static binding function list std::unordered_set staticBindingMethodsSet; TyIdx jstrPointerTypeIdx = TyIdx(0); @@ -77,45 +97,21 @@ class GenericNativeStubFunc : public FuncOptimizeImpl { MIRFunction *MRTCallSlowNativeFunc[kSlownativeFuncnum] = { nullptr }; // for native func which args <=8, use x0-x7 MIRFunction *MRTCallSlowNativeExtFunc = nullptr; MIRFunction *MCCSetReliableUnwindContextFunc = nullptr; - const std::string callSlowNativeFuncs[kSlownativeFuncnum] = { - "MCC_CallSlowNative0", "MCC_CallSlowNative1", "MCC_CallSlowNative2", "MCC_CallSlowNative3", "MCC_CallSlowNative4", - "MCC_CallSlowNative5", "MCC_CallSlowNative6", "MCC_CallSlowNative7", "MCC_CallSlowNative8" - }; - bool IsStaticBindingListMode() const; - inline bool ReturnsJstr(TyIdx retType) { - return (retType == jstrPointerTypeIdx); - } - void InitStaticBindingMethodList(); - bool IsStaticBindingMethod(const std::string &methodName) const; - MIRFunction &GetOrCreateDefaultNativeFunc(MIRFunction &stubFunc); - void GenericRegisteredNativeFuncCall(MIRFunction &func, const MIRFunction &nativeFunc, MapleVector &args, - const MIRSymbol *ret, bool needNativeCall, CallNode &prevNativeFuncCall, - CallNode &postNativeFuncCall); - StmtNode *CreateNativeWrapperCallNode(MIRFunction &func, BaseNode *funcPtr, MapleVector &args, - const MIRSymbol *ret); - void GenericNativeWrapperFuncCall(MIRFunction &func, const MIRFunction &nativeFunc, MapleVector &args, - const MIRSymbol *ret); - void GenericHelperFuncDecl(); - void GenericRegTabEntry(const MIRFunction &func); - void GenericRegTableEntryType(); - void GenericRegTable(); - void GenericRegFuncTabEntryType(); - void GenericRegFuncTabEntry(); - void GenericRegFuncTab(); + static const std::string callSlowNativeFuncs[kSlownativeFuncnum]; }; -class DoGenericNativeStubFunc : public ModulePhase { +class DoGenerateNativeStubFunc : public ModulePhase { public: - explicit DoGenericNativeStubFunc(ModulePhaseID id) : ModulePhase(id) {} + explicit DoGenerateNativeStubFunc(ModulePhaseID id) : ModulePhase(id) {} - ~DoGenericNativeStubFunc() = default; + ~DoGenerateNativeStubFunc() = default; std::string PhaseName() const override { return "GenNativeStubFunc"; } AnalysisResult *Run(MIRModule *mod, ModuleResultMgr *mrm) override { - OPT_TEMPLATE(GenericNativeStubFunc); + OPT_TEMPLATE(NativeStubFuncGeneration); return nullptr; } }; diff --git a/src/mpl2mpl/include/reflection_analysis.h b/src/mpl2mpl/include/reflection_analysis.h index 831f78bc77b97dedc47f263ae44d5a8047648352..7e4c4b7850707f2f9f17e450120c05efaa4cfc7f 100644 --- a/src/mpl2mpl/include/reflection_analysis.h +++ b/src/mpl2mpl/include/reflection_analysis.h @@ -17,93 +17,17 @@ #include "class_hierarchy.h" namespace maple { -// +1 is needed here because our field id starts with 0 pointing to the struct itself -#define OBJ_KLASS_FIELDID (static_cast(ClassProperty::kShadow) + 1) -#define METADATA_KLASS_FIELDID (static_cast(ClassProperty::kShadow) + 1) -static constexpr bool kRADebug = false; -static constexpr int64 kTBDValue = 0xABCD; -static constexpr uint32 kMethodFieldHashSize = 1022; -static constexpr uint16 kHashConflictFlag = 1023; - -static constexpr char kModStr[] = "mod"; -static constexpr char kAddrStr[] = "addr"; -static constexpr char kFlagStr[] = "flag"; -static constexpr char kItabStr[] = "itab"; -static constexpr char kVtabStr[] = "vtab"; -static constexpr char kGctibStr[] = "gctib"; -static constexpr char kIndexStr[] = "index"; -static constexpr char kOffsetStr[] = "offset"; -static constexpr char kShadowStr[] = "shadow"; -static constexpr char kClassSuffix[] = "_3B"; -static constexpr char kArgsizeStr[] = "argsize"; -static constexpr char kIfieldsStr[] = "ifields"; -static constexpr char kMethodsStr[] = "methods"; -static constexpr char kMonitorStr[] = "monitor"; -static constexpr char kObjsizeStr[] = "objsize"; -static constexpr char kPaddingStr[] = "padding"; -static constexpr char kTypeNameStr[] = "typeName"; -static constexpr char kClassnameStr[] = "classname"; -static constexpr char kFieldnameStr[] = "fieldname"; -static constexpr char kAccessFlags[] = "accessFlags"; -static constexpr char kAnnotationStr[] = "annotation"; -static constexpr char kClinitAddrStr[] = "clinitAddr"; -static constexpr char kMethodnameStr[] = "methodname"; -static constexpr char kInitFuntionStr[] = "_3Cinit_3E"; -static constexpr char kClassinforoStr[] = "classinforo"; -static constexpr char kClassloaderStr[] = "classloader"; -static constexpr char kINFOFileName[] = "INFO_filename"; -static constexpr char kLebPadding0Str[] = "lebPadding0"; -static constexpr char kNumoffieldsStr[] = "numoffields"; -static constexpr char kClinitbridgeStr[] = "clinitbridge"; -static constexpr char kNumofmethodsStr[] = "numofmethods"; -static constexpr char kSignaturenameStr[] = "signaturename"; -static constexpr char kDeclaringclassStr[] = "declaringclass"; -static constexpr char kFieldInfoTypeName[] = "__field_info__"; -static constexpr char kINFOAccessFlags[] = "INFO_access_flags"; -static constexpr char kSuperclassinfoStr[] = "superclassinfo"; -static constexpr char kFieldOffsetDataStr[] = "fieldOffsetData"; -static constexpr char kAnnotationvalueStr[] = "annotationvalue"; -static constexpr char kMethodInfoTypeName[] = "__method_info__"; -static constexpr char kClinitSuffixStr[] = "_3Cclinit_3E_7C_28_29V"; -static constexpr char kJavaLangEnumStr[] = "Ljava_2Flang_2FEnum_3B"; -static constexpr char kNumofsuperclassesStr[] = "numofsuperclasses"; -static constexpr char kClassMetadataRoTypeName[] = "__class_meta_ro__"; -static constexpr char kMethodInVtabIndexStr[] = "method_in_vtab_index"; -static constexpr char kClassStateInitializedStr[] = "classStateInitialized"; -static constexpr char kSuperclassMetadataTypeName[] = "__superclass_meta__"; -static constexpr char kFieldOffsetDataTypeName[] = "__fieldOffsetDataType__"; -static constexpr char kFieldInfoCompactTypeName[] = "__field_info_compact__"; -static constexpr char kClassInitProtectRegionStr[] = "classInitProtectRegion"; -static constexpr char kMethodInfoCompactTypeName[] = "__method_info_compact__"; -static constexpr char kReflectionFieldPrefixStr[] = "Ljava_2Flang_2Freflect_2FField_3B"; -static constexpr char kReflectionProxyPrefixStr[] = "Ljava_2Flang_2Freflect_2FProxy_3B"; -static constexpr char kReflectionMethodPrefixStr[] = "Ljava_2Flang_2Freflect_2FMethod_3B"; -static constexpr char kSuperclassOrComponentclassStr[] = "superclass_or_componentclass"; -static constexpr char kReflectionReferencePrefixStr[] = "Ljava_2Flang_2Fref_2FReference_3B"; -static constexpr char kReflectionProxy241PrefixStr[] = "Ljava_2Flang_2Freflect_2FProxy_241_3B"; -static constexpr char kReflectionMethon241PrefixStr[] = "Ljava_2Flang_2Freflect_2FMethod_241_3B"; -static constexpr char kReflectionExecutablePrefixStr[] = "Ljava_2Flang_2Freflect_2FExecutable_3B"; -static constexpr char kReflectionConstructorPrefixStr[] = "Ljava_2Flang_2Freflect_2FConstructor_3B"; -static constexpr char kJavaLangAnnotationRetentionStr[] = "Ljava_2Flang_2Fannotation_2FRetention_3B"; -static constexpr char kReflectionAccessibleobjectPrefixStr[] = "Ljava_2Flang_2Freflect_2FAccessibleObject_3B"; - -static constexpr int kAnonymousClassIndex = 5; -static constexpr char kAnonymousClassSuffix[] = "30"; -static constexpr char kAnonymousClassPrefix[] = "Lark/annotation/InnerClass;"; -static constexpr char kInnerClassPrefix[] = "Lark/annotation/EnclosingClass;"; -static constexpr char kArkAnnotationEnclosingClassStr[] = "Lark_2Fannotation_2FEnclosingClass_3B"; - // maple field index definition -enum struct ClassRO : uint32 { - kClassname, +enum class ClassRO : uint32 { + kClassName, kIfields, kMethods, kSuperclass, - kNumoffields, + kNumOfFields, kNumofMethods, #ifndef USE_32BIT_REF kFlag, - kNumofsup, + kNumOfSup, kPadding, #endif //! USE_32BIT_REF kMod, @@ -111,7 +35,7 @@ enum struct ClassRO : uint32 { kClinitAddr }; -enum struct ClassProperty : uint32 { +enum class ClassProperty : uint32 { kShadow, kMonitor, kClassloader, @@ -127,13 +51,13 @@ enum struct ClassProperty : uint32 { kClint }; -enum struct MethodProperty : uint32 { +enum class MethodProperty : uint32 { kVtabIndex, kDeclarclass, kAddr, kMod, - kMethodname, - kSigname, + kMethodName, + kSigName, kAnnotation, kFlag, kArgsize, @@ -142,12 +66,12 @@ enum struct MethodProperty : uint32 { #endif }; -enum struct MethodInfoCompact : uint32 { +enum class MethodInfoCompact : uint32 { kVtabIndex, kAddr }; -enum struct FieldProperty : uint32 { +enum class FieldProperty : uint32 { kPOffset, kMod, kFlag, @@ -158,7 +82,7 @@ enum struct FieldProperty : uint32 { kDeclarclass }; -enum struct FieldPropertyCompact : uint32 { +enum class FieldPropertyCompact : uint32 { kPOffset, kMod, kTypeName, @@ -167,29 +91,17 @@ enum struct FieldPropertyCompact : uint32 { kAnnotation }; -// If needed, we can make field type in two bits. -static constexpr uint64 kFieldPrim = 0x00000001; -static constexpr uint64 kFieldArray = 0x00000002; -static constexpr uint64 kFieldInterface = 0x00000004; -static constexpr uint64 kFieldStatic = 0x00000008; -static constexpr uint64 kMethodNotVirtual = 0x00000001; -static constexpr uint64 kMethodFinalize = 0x00000002; -static constexpr uint64 kMethodMetaCompact = 0x00000004; -static constexpr uint64 kMethodAbstract = 0x00000010; -static constexpr uint64 kFieldReadOnly = 0x00000001; - class ReflectionAnalysis : public AnalysisResult { public: ReflectionAnalysis(MIRModule *mod, MemPool *memPool, KlassHierarchy *kh, MIRBuilder &builder) : AnalysisResult(memPool), mirModule(mod), allocator(memPool), - klassh(kh), + klassH(kh), mirBuilder(builder), - classTab(allocator.Adapter()) { - isLibcore = -1; - } + classTab(allocator.Adapter()) {} ~ReflectionAnalysis() = default; + static void GenStrTab(MIRModule &mirmodule); static uint32 FindOrInsertRepeatString(const std::string &str, bool isHot = false, uint8 hotType = kLayoutUnused); static BaseNode *GenClassInfoAddr(BaseNode *obj, MIRBuilder &builder); @@ -200,31 +112,6 @@ class ReflectionAnalysis : public AnalysisResult { } private: - MIRModule *mirModule; - MapleAllocator allocator; - KlassHierarchy *klassh; - MIRBuilder &mirBuilder; - MapleVector classTab; - int isLibcore; - std::string reflectionMuidStr; - static const char *klassPtrName; - static TyIdx classMetadataTyIdx; - static TyIdx classMetadataRoTyIdx; - static TyIdx methodsInfoTyIdx; - static TyIdx methodsInfoCompactTyIdx; - static TyIdx fieldsInfoTyIdx; - static TyIdx fieldsInfoCompactTyIdx; - static TyIdx superclassMetadataTyIdx; - static TyIdx fieldOffsetDataTyIdx; - static std::string strTab; - static std::unordered_map str2IdxMap; - static std::string strTabStartHot; - static std::string strTabBothHot; - static std::string strTabRunHot; - static bool strTabInited; - static TyIdx invalidIdx; - static constexpr uint16 kNoHashBits = 6u; - static std::unordered_map &GetStr2IdxMap() { return str2IdxMap; } @@ -289,46 +176,71 @@ class ReflectionAnalysis : public AnalysisResult { MIRSymbol &funcSym, MIRAggConst &aggConst, std::unordered_map &baseNameMp, std::unordered_map &fullNameMp); - uint32 GetMethodModifier(const Klass &klass, MIRFunction &func); - uint32 GetMethodFlag(MIRFunction &func); + uint32 GetMethodModifier(const Klass &klass, const MIRFunction &func) const; + uint32 GetMethodFlag(const MIRFunction &func) const; static void GenMetadataType(MIRModule &mirModule); - static MIRType *GetRefFieldType(MIRBuilder &mirBuilder); + static MIRType *GetRefFieldType(); static TyIdx GenMetaStructType(MIRModule &mirModule, MIRStructType &metaType, const std::string &str); - int64 GetHashIndex(const std::string &strname); + int64 GetHashIndex(const std::string &strName); static void GenHotClassNameString(const Klass &klass); uint32 FindOrInsertReflectString(const std::string &str); static void InitReflectString(); - int64 BKDRHash(const std::string &strname, uint32 seed); + int64 BKDRHash(const std::string &strName, uint32 seed); void GenClassHashMetaData(); void MarkWeakMethods(); bool VtableFunc(const MIRFunction &func) const; void GenPrimitiveClass(); - bool RootClassDefined(); // wether current module defines root classes + bool RootClassDefined(); // whether current module defines root classes void GenAllMethodHash(std::vector> &methodInfoVec, std::unordered_map &baseNameMap, std::unordered_map &fullNameMap); - void GenAllFieldHash(std::vector> &fieldV); - void GeneAnnotation(std::map &idxNumMap, std::string &annoArr, MIRClassType &classType, + void GenAllFieldHash(std::vector> &fieldV) const; + void GenAnnotation(std::map &idxNumMap, std::string &annoArr, MIRClassType &classType, PragmaKind paragKind, const std::string ¶gName, TyIdx fieldTypeIdx, std::map *paramNumArray = nullptr, int *paramIndex = nullptr); void AppendValueByType(std::string &annoArr, const MIRPragmaElement &elem); void SetAnnoFieldConst(const MIRStructType &metadataRoType, MIRAggConst &newConst, uint32 fieldID, std::map &idxNumMap, const std::string &annoArr); bool IsAnonymousClass(const std::string &annotationString); - bool IsPrivateClass(MIRClassType &classType) const; - bool IsStaticClass(MIRClassType &classType) const; + bool IsPrivateClass(const MIRClassType &classType) const; + bool IsStaticClass(const MIRClassType &classType) const; int8 JudgePara(MIRClassType &ctype); void CheckPrivateInnerAndNoSubClass(Klass &clazz, const std::string &annoArr); void ConvertMapleClassName(const std::string &mplClassName, std::string &javaDsp); int GetDeflateStringIdx(const std::string &subStr); uint32 GetAnnoCstrIndex(std::map &idxNumMap, const std::string &annoArr); - uint32 GetMethodInVtabIndex(const Klass &clazz, const MIRFunction &func); + uint32 GetMethodInVtabIndex(const Klass &clazz, const MIRFunction &func) const; void GetSignatureTypeNames(std::string &signature, std::vector &typeNames); MIRSymbol *GetClinitFuncSymbol(const Klass &klass); int SolveAnnotation(MIRClassType &classType, MIRFunction &func); - uint32 GetTypeNameIdxFromType(MIRType &type, const Klass &klass, const std::string &fieldName); + uint32 GetTypeNameIdxFromType(const MIRType &type, const Klass &klass, const std::string &fieldName); + + MIRModule *mirModule; + MapleAllocator allocator; + KlassHierarchy *klassH; + MIRBuilder &mirBuilder; + MapleVector classTab; + int isLibcore = -1; + std::string reflectionMuidStr; + static const char *klassPtrName; + static TyIdx classMetadataTyIdx; + static TyIdx classMetadataRoTyIdx; + static TyIdx methodsInfoTyIdx; + static TyIdx methodsInfoCompactTyIdx; + static TyIdx fieldsInfoTyIdx; + static TyIdx fieldsInfoCompactTyIdx; + static TyIdx superclassMetadataTyIdx; + static TyIdx fieldOffsetDataTyIdx; + static std::string strTab; + static std::unordered_map str2IdxMap; + static std::string strTabStartHot; + static std::string strTabBothHot; + static std::string strTabRunHot; + static bool strTabInited; + static TyIdx invalidIdx; + static constexpr uint16 kNoHashBits = 6u; static constexpr char annoDelimiterPrefix = '`'; static constexpr char annoDelimiter = '!'; static constexpr char annoArrayStartDelimiter = '{'; @@ -341,7 +253,7 @@ class DoReflectionAnalysis : public ModulePhase { ~DoReflectionAnalysis() = default; - AnalysisResult *Run(MIRModule *module, ModuleResultMgr *m) override; + AnalysisResult *Run(MIRModule *module, ModuleResultMgr *moduleResultMgr) override; std::string PhaseName() const override { return "reflectionanalysis"; } diff --git a/src/mpl2mpl/include/vtable_analysis.h b/src/mpl2mpl/include/vtable_analysis.h index 08712b2bc25d14ad1292beeb68373ca4ca8218ea..981c7972af480958d5c0afcb265e97ac023edcbf 100644 --- a/src/mpl2mpl/include/vtable_analysis.h +++ b/src/mpl2mpl/include/vtable_analysis.h @@ -19,15 +19,11 @@ namespace maple { #ifdef USE_32BIT_REF -static constexpr unsigned int kTabEntrySize = 4; +constexpr unsigned int kTabEntrySize = 4; #else // !USE_32BIT_REF -static constexpr unsigned int kTabEntrySize = 8; +constexpr unsigned int kTabEntrySize = 8; #endif // USE_32BIT_REF -// +1 is needed here because our field id starts with 0 pointing to the struct itself -#define KLASS_ITAB_FIELDID (static_cast(ClassProperty::kItab) + 1) -#define KLASS_VTAB_FIELDID (static_cast(ClassProperty::kVtab) + 1) - class VtableAnalysis : public FuncOptimizeImpl { public: VtableAnalysis(MIRModule *mod, KlassHierarchy *kh, bool dump); @@ -39,24 +35,25 @@ class VtableAnalysis : public FuncOptimizeImpl { } private: - std::unordered_map puidxToVtabIndex; - MIRType *voidPtrType; - MIRIntConst *zeroConst; - MIRIntConst *oneConst; bool IsVtableCandidate(const MIRFunction &func) const; bool CheckOverrideForCrossPackage(const MIRFunction &baseMethod, const MIRFunction &currMethod) const; - void AddMethodToTable(MethodPtrVector &methodTable, MethodPair &methodpair); + void AddMethodToTable(MethodPtrVector &methodTable, MethodPair &methodPair); void GenVtableList(const Klass &klass); - void DumpVtableList(const Klass *klass) const; - void GenTableSymbol(const std::string &prefix, const std::string klassName, MIRAggConst &newconst); + void DumpVtableList(const Klass &klass) const; + void GenTableSymbol(const std::string &prefix, const std::string klassName, MIRAggConst &newConst) const; void GenVtableDefinition(const Klass &klass); void GenItableDefinition(const Klass &klass); - BaseNode *GenVtabItabBaseAddr(BaseNode *obj, bool isVirtual); + BaseNode *GenVtabItabBaseAddr(BaseNode &obj, bool isVirtual); void ReplaceVirtualInvoke(CallNode &stmt); void ReplaceInterfaceInvoke(CallNode &stmt); void ReplaceSuperclassInvoke(CallNode &stmt); void ReplacePolymorphicInvoke(CallNode &stmt); + + std::unordered_map puidxToVtabIndex; + MIRType *voidPtrType; + MIRIntConst *zeroConst; + MIRIntConst *oneConst; }; class DoVtableAnalysis : public ModulePhase { diff --git a/src/mpl2mpl/include/vtable_impl.h b/src/mpl2mpl/include/vtable_impl.h index e5faab35a8393564110925b9246c952dbeb9f802..afbf28acf9f47cf512bf7cfc2c9224c0decf829c 100644 --- a/src/mpl2mpl/include/vtable_impl.h +++ b/src/mpl2mpl/include/vtable_impl.h @@ -18,18 +18,12 @@ #include "phase_impl.h" namespace maple { -static constexpr int kNumOfMCCParas = 5; enum CallKind { kStaticCall = 0, kVirtualCall = 1, kSuperCall = 2 }; -#ifdef USE_32BIT_REF -static constexpr char kInterfaceMethod[] = "MCC_getFuncPtrFromItab"; -#else -static constexpr char kInterfaceMethod[] = "MCC_getFuncPtrFromItabSecondHash64"; -#endif class VtableImpl : public FuncOptimizeImpl { public: @@ -42,10 +36,9 @@ class VtableImpl : public FuncOptimizeImpl { } private: + void ReplaceResolveInterface(StmtNode &stmt, const ResolveFuncNode &resolveNode); MIRModule *mirModule; - KlassHierarchy *klassHierarchy; MIRFunction *mccItabFunc; - void ReplaceResolveInterface(StmtNode &stmt, const ResolveFuncNode &resolveNode); }; class DoVtableImpl : public ModulePhase { diff --git a/src/mpl2mpl/src/class_hierarchy.cpp b/src/mpl2mpl/src/class_hierarchy.cpp index fc39a7e0a3ee79e62afe85876e91a58ec84e4b41..3b0af45410274a07f01b3d8cef1371a1a2bcaa89 100644 --- a/src/mpl2mpl/src/class_hierarchy.cpp +++ b/src/mpl2mpl/src/class_hierarchy.cpp @@ -17,30 +17,28 @@ #include #include "option.h" -/* - * Class Hierarchy Analysis - * This phase is a foundation phase of compilation. This phase build - * the class hierarchy for both this module and all modules it depends - * on. So many phases rely on this phase's analysis result, such as - * call graph, ssa and so on. - * The main procedure shows as following. - * A. Based on the information read from mplts, it collects all class that - * declared in modules. And creates a Klass for each class. - * B. Fill class method info. Connect superclass<->subclass and - * interface->implementation edges. - * C. Tag All Throwable class and its child class. - * D. In the case of "class C implements B; interface B extends A;", - * we need to add a link between C and A. So we recursively traverse - * Klass and collect all interfaces it implements. - * E. Topological Sort - * F. Based on Topological Sort Order, for each virtual method in a class, - * we collect all its potential implementation. If the number of - * potential implementations is 1, it means all virtual calls to this - * method can be easily devirtualized. - */ - +// Class Hierarchy Analysis +// This phase is a foundation phase of compilation. This phase build +// the class hierarchy for both this module and all modules it depends +// on. So many phases rely on this phase's analysis result, such as +// call graph, ssa and so on. +// The main procedure shows as following. +// A. Based on the information read from mplts, it collects all class that +// declared in modules. And creates a Klass for each class. +// B. Fill class method info. Connect superclass<->subclass and +// interface->implementation edges. +// C. Tag All Throwable class and its child class. +// D. In the case of "class C implements B; interface B extends A;", +// we need to add a link between C and A. So we recursively traverse +// Klass and collect all interfaces it implements. +// E. Topological Sort +// F. Based on Topological Sort Order, for each virtual method in a class, +// we collect all its potential implementation. If the number of +// potential implementations is 1, it means all virtual calls to this +// method can be easily devirtualized. namespace maple { bool KlassHierarchy::traceFlag = false; + Klass::Klass(MIRStructType *type, MapleAllocator *alc) : structType(type), alloc(alc), @@ -49,16 +47,10 @@ Klass::Klass(MIRStructType *type, MapleAllocator *alc) implKlasses(alloc->Adapter()), implInterfaces(alloc->Adapter()), methods(alloc->Adapter()), - strIdx2Method(std::less(), alloc->Adapter()), - clinitMethod(nullptr), - classInitBridge(nullptr), - strIdx2CandidateMap(std::less(), alloc->Adapter()), - flags(0), - isPrivateInnerAndNoSubClassFlag(false), - hasNativeMethods(false), - needDecoupling(true) { + strIdx2Method(alloc->Adapter()), + strIdx2CandidateMap(alloc->Adapter()) { ASSERT(type != nullptr, "type is nullptr in Klass::Klass!"); - ASSERT(type->GetKind() == kTypeClass || type->GetKind() == kTypeInterface, "runtime check error"); + ASSERT(type->GetKind() == kTypeClass || type->GetKind() == kTypeInterface, "type error"); } void Klass::DumpKlassMethods() const { @@ -66,12 +58,12 @@ void Klass::DumpKlassMethods() const { return; } LogInfo::MapleLogger() << " class member methods:\n"; - for (MIRFunction * const &method : methods) { + for (MIRFunction *method : methods) { LogInfo::MapleLogger() << " \t" << method->GetName() << " , "; method->GetFuncSymbol()->GetAttrs().DumpAttributes(); LogInfo::MapleLogger() << "\n"; } - for (auto const &m2cPair : strIdx2CandidateMap) { + for (const auto &m2cPair : strIdx2CandidateMap) { LogInfo::MapleLogger() << " \t" << GlobalTables::GetStrTable().GetStringFromStrIdx(m2cPair.first) << " , # of target:" << m2cPair.second->size() << "\n"; } @@ -82,7 +74,7 @@ void Klass::DumpKlassImplKlasses() const { return; } LogInfo::MapleLogger() << " implemented by:\n"; - for (Klass * const &implKlass : implKlasses) { + for (Klass *implKlass : implKlasses) { LogInfo::MapleLogger() << " \t@implbyclass_idx " << implKlass->structType->GetTypeIndex().GetIdx() << "\n"; } } @@ -92,7 +84,7 @@ void Klass::DumpKlassImplInterfaces() const { return; } LogInfo::MapleLogger() << " implements:\n"; - for (Klass * const &interface : implInterfaces) { + for (Klass *interface : implInterfaces) { LogInfo::MapleLogger() << " \t@implinterface_idx " << interface->structType->GetTypeIndex().GetIdx() << "\n"; } } @@ -102,7 +94,7 @@ void Klass::DumpKlassSuperKlasses() const { return; } LogInfo::MapleLogger() << " superclasses:\n"; - for (Klass * const &superKlass : superKlasses) { + for (Klass *superKlass : superKlasses) { LogInfo::MapleLogger() << " \t@superclass_idx " << superKlass->structType->GetTypeIndex().GetIdx() << "\n"; } } @@ -112,7 +104,7 @@ void Klass::DumpKlassSubKlasses() const { return; } LogInfo::MapleLogger() << " subclasses:\n"; - for (Klass * const &subKlass : subKlasses) { + for (Klass *subKlass : subKlasses) { LogInfo::MapleLogger() << " \t@subclass_idx " << subKlass->structType->GetTypeIndex().GetIdx() << "\n"; } } @@ -128,8 +120,8 @@ void Klass::Dump() const { DumpKlassMethods(); } -MIRFunction *Klass::GetClosestMethod(GStrIdx funcnamewithtype) const { - MapleVector *cands = GetCandidates(funcnamewithtype); +MIRFunction *Klass::GetClosestMethod(GStrIdx funcName) const { + MapleVector *cands = GetCandidates(funcName); if (cands != nullptr && !cands->empty()) { return cands->at(0); } @@ -140,7 +132,7 @@ void Klass::DelMethod(const MIRFunction &func) { if (GetMethod(func.GetBaseFuncNameWithTypeStrIdx()) == &func) { strIdx2Method.erase(func.GetBaseFuncNameWithTypeStrIdx()); } - for (auto it = methods.begin(); it != methods.end(); it++) { + for (auto it = methods.begin(); it != methods.end(); ++it) { if (*it == &func) { methods.erase(it--); return; @@ -158,7 +150,6 @@ Klass *Klass::GetSuperKlass() const { default: LogInfo::MapleLogger() << GetKlassName() << "\n"; CHECK_FATAL(false, "GetSuperKlass expects less than one super class"); - return nullptr; } } @@ -166,7 +157,7 @@ bool Klass::IsKlassMethod(const MIRFunction *func) const { if (func == nullptr) { return false; } - for (MIRFunction * const &method : methods) { + for (MIRFunction *method : methods) { if (method == func) { return true; } @@ -178,14 +169,13 @@ bool Klass::ImplementsKlass() const { if (IsInterface()) { return false; } - MIRClassType *ctype = GetMIRClassType(); - ASSERT(ctype != nullptr, "null ptr check"); - return (!ctype->GetInterfaceImplemented().empty()); + MIRClassType *classType = GetMIRClassType(); + ASSERT(classType != nullptr, "null ptr check"); + return (!classType->GetInterfaceImplemented().empty()); } MapleVector *Klass::GetCandidates(GStrIdx mnameNoklassStrIdx) const { - MapleMap*>::const_iterator it; - it = strIdx2CandidateMap.find(mnameNoklassStrIdx); + auto it = strIdx2CandidateMap.find(mnameNoklassStrIdx); return ((it != strIdx2CandidateMap.end()) ? (it->second) : nullptr); } @@ -193,8 +183,7 @@ MIRFunction *Klass::GetUniqueMethod(GStrIdx mnameNoklassStrIdx) const { if (structType->IsIncomplete()) { return nullptr; } - MapleMap*>::const_iterator it; - it = strIdx2CandidateMap.find(mnameNoklassStrIdx); + auto it = strIdx2CandidateMap.find(mnameNoklassStrIdx); if (it != strIdx2CandidateMap.end()) { MapleVector *fv = it->second; if (fv != nullptr && fv->size() == 1) { @@ -212,23 +201,23 @@ bool Klass::IsVirtualMethod(const MIRFunction &func) const { void Klass::CountVirtMethTopDown(const KlassHierarchy &kh) { MapleVector *vec, *pvec; GStrIdx strIdx; - MapleVector *superAndImplClasses = alloc->GetMemPool()->New>(alloc->Adapter()); + auto *superAndImplClasses = alloc->GetMemPool()->New>(alloc->Adapter()); // Add default methods of interface. Add them first because they have lowest // priorities compared with methods defined in classes - for (TyIdx const &tyIdx : GetMIRClassType()->GetInterfaceImplemented()) { + for (TyIdx tyIdx : GetMIRClassType()->GetInterfaceImplemented()) { Klass *interface = kh.GetKlassFromTyIdx(tyIdx); if (interface != nullptr) { superAndImplClasses->push_back(interface); } } // Then add methods from superclasses - for (Klass * const &superKlass : superKlasses) { + for (Klass *superKlass : superKlasses) { superAndImplClasses->push_back(superKlass); } // Initialize strIdx2CandidateMap based on the superclass methods - for (Klass * const &superAndImplClass : *superAndImplClasses) { + for (Klass *superAndImplClass : *superAndImplClasses) { ASSERT(superAndImplClass != nullptr, "Not a valid super class of interface"); - for (auto const &pair : superAndImplClass->strIdx2CandidateMap) { + for (const auto &pair : superAndImplClass->strIdx2CandidateMap) { strIdx = pair.first; pvec = pair.second; ASSERT(pvec->size() == 1, "Expect exactly one method definition from parent class"); @@ -257,7 +246,7 @@ void Klass::CountVirtMethTopDown(const KlassHierarchy &kh) { } } // Initialize mstridx2count_map based on the current class methods - for (MIRFunction * const &method : methods) { + for (MIRFunction *method : methods) { ASSERT(method != nullptr, "null ptr check!"); if (!IsVirtualMethod(*method)) { continue; @@ -281,9 +270,9 @@ void Klass::CountVirtMethTopDown(const KlassHierarchy &kh) { void Klass::CountVirtMethBottomUp() { MapleVector *vec; GStrIdx strIdx; - for (Klass * const &subKlass : subKlasses) { + for (Klass *subKlass : subKlasses) { CHECK_FATAL(subKlass != nullptr, "nullptr check failed"); - for (auto const &pair : subKlass->strIdx2CandidateMap) { + for (const auto &pair : subKlass->strIdx2CandidateMap) { strIdx = pair.first; if (strIdx2CandidateMap.find(strIdx) == strIdx2CandidateMap.end()) { continue; @@ -301,7 +290,7 @@ void Klass::CountVirtMethBottomUp() { } } -const MIRFunction *Klass::HasMethod(const std::string &funcname) { +const MIRFunction *Klass::HasMethod(const std::string &funcname) const { for (auto *method : methods) { if (method->GetBaseFuncNameWithType().find(funcname) != std::string::npos) { return method; @@ -311,7 +300,7 @@ const MIRFunction *Klass::HasMethod(const std::string &funcname) { } Klass *KlassHierarchy::GetKlassFromStrIdx(GStrIdx strIdx) const { - MapleMap::const_iterator it = strIdx2KlassMap.find(strIdx); + auto it = strIdx2KlassMap.find(strIdx); return ((it != strIdx2KlassMap.end()) ? (it->second) : nullptr); } @@ -356,7 +345,7 @@ bool KlassHierarchy::IsSuperKlassForInterface(const Klass *super, const Klass *b } std::vector tmpVector; tmpVector.push_back(base); - for (size_t idx = 0; idx < tmpVector.size(); idx++) { + for (size_t idx = 0; idx < tmpVector.size(); ++idx) { if (tmpVector[idx] == super) { return true; } @@ -415,8 +404,8 @@ bool KlassHierarchy::UpdateFieldID(TyIdx baseTypeIdx, TyIdx targetTypeIdx, Field return false; } -bool KlassHierarchy::NeedClinitCheckRecursively(Klass &kl) { - Klass *klass = &kl; +bool KlassHierarchy::NeedClinitCheckRecursively(const Klass &kl) const { + const Klass *klass = &kl; if (klass->IsClass()) { while (klass != nullptr) { if (klass->GetClinit()) { @@ -434,29 +423,29 @@ bool KlassHierarchy::NeedClinitCheckRecursively(Klass &kl) { } } return false; - } else if (klass->IsInterface()) { + } + if (klass->IsInterface()) { return klass->GetClinit(); - } else { - return true; } + return true; } // Get lowest common ancestor for two classes -Klass *KlassHierarchy::GetLCA(Klass *k1, Klass *k2) const { +Klass *KlassHierarchy::GetLCA(Klass *klass1, Klass *klass2) const { std::vector v1, v2; - while (k1 != nullptr) { - v1.push_back(k1); - k1 = k1->GetSuperKlass(); + while (klass1 != nullptr) { + v1.push_back(klass1); + klass1 = klass1->GetSuperKlass(); } - while (k2 != nullptr) { - v2.push_back(k2); - k2 = k2->GetSuperKlass(); + while (klass2 != nullptr) { + v2.push_back(klass2); + klass2 = klass2->GetSuperKlass(); } Klass *result = nullptr; size_t size1 = v1.size(); size_t size2 = v2.size(); size_t min = (size1 < size2) ? size1 : size2; - for (size_t i = 1; i <= min; i++) { + for (size_t i = 1; i <= min; ++i) { if (v1[size1 - i] != v2[size2 - i]) { break; } @@ -509,7 +498,7 @@ void KlassHierarchy::ExceptionFlagProp(Klass &klass) { } void KlassHierarchy::AddKlassRelationAndMethods() { - for (auto const &pair : strIdx2KlassMap) { + for (const auto &pair : strIdx2KlassMap) { Klass *klass = pair.second; ASSERT(klass, "null ptr check"); Klass *superKlass = nullptr; @@ -517,7 +506,7 @@ void KlassHierarchy::AddKlassRelationAndMethods() { MIRInterfaceType *itype = klass->GetMIRInterfaceType(); ASSERT(itype != nullptr, "null ptr check"); // Java interface supports multiple inheritance - for (TyIdx const &superTyIdx : itype->GetParentsTyIdx()) { + for (TyIdx superTyIdx : itype->GetParentsTyIdx()) { superKlass = GetKlassFromTyIdx(superTyIdx); if (superKlass != nullptr) { klass->AddSuperKlass(superKlass); @@ -526,17 +515,17 @@ void KlassHierarchy::AddKlassRelationAndMethods() { } } else { // Class - MIRClassType *ctype = klass->GetMIRClassType(); - ASSERT(ctype != nullptr, "null ptr check"); + MIRClassType *classType = klass->GetMIRClassType(); + ASSERT(classType != nullptr, "null ptr check"); // Add interface relationship - for (TyIdx const &intfTyIdx : ctype->GetInterfaceImplemented()) { + for (TyIdx intfTyIdx : classType->GetInterfaceImplemented()) { Klass *intfKlass = GetKlassFromTyIdx(intfTyIdx); if (intfKlass != nullptr) { intfKlass->AddImplKlass(klass); klass->AddImplInterface(intfKlass); } } - superKlass = GetKlassFromTyIdx(ctype->GetParentTyIdx()); + superKlass = GetKlassFromTyIdx(classType->GetParentTyIdx()); // Add superclass/subclass for each class. if (superKlass != nullptr) { klass->AddSuperKlass(superKlass); @@ -549,8 +538,8 @@ void KlassHierarchy::AddKlassRelationAndMethods() { } } // Add method info - for (auto const &mpair : klass->GetMIRStructType()->GetMethods()) { - MIRSymbol *funcSym = GlobalTables::GetGsymTable().GetSymbolFromStidx(mpair.first.Idx()); + for (const auto &methodPair : klass->GetMIRStructType()->GetMethods()) { + MIRSymbol *funcSym = GlobalTables::GetGsymTable().GetSymbolFromStidx(methodPair.first.Idx()); MIRFunction *method = funcSym->GetFunction(); klass->AddMethod(method); if (method->GetName().compare(klass->GetKlassName() + NameMangler::kClinitSuffix) == 0) { @@ -573,7 +562,7 @@ void KlassHierarchy::TagThrowableKlasses() { if (throwable == nullptr) { return; } - for (auto const &pair : strIdx2KlassMap) { + for (const auto &pair : strIdx2KlassMap) { Klass *klass = pair.second; ASSERT(klass != nullptr, "unexpeced null klass"); if (!klass->IsInterface() && IsSuperKlass(throwable, klass)) { @@ -602,7 +591,7 @@ static void CollectImplInterfaces(const Klass &klass, std::set &implInte } void KlassHierarchy::UpdateImplementedInterfaces() { - for (auto const &pair : strIdx2KlassMap) { + for (const auto &pair : strIdx2KlassMap) { Klass *klass = pair.second; ASSERT(klass != nullptr, "null ptr check"); if (!klass->IsInterface()) { @@ -641,7 +630,7 @@ void KlassHierarchy::GetChildKlasses(const Klass &klass, std::vector &ch void KlassHierarchy::TopologicalSortKlasses() { std::set inQueue; // Local variable, no need to use MapleSet - for (auto const &pair : strIdx2KlassMap) { + for (const auto &pair : strIdx2KlassMap) { Klass *klass = pair.second; ASSERT(klass != nullptr, "klass can not be nullptr"); if (!klass->HasSuperKlass() && !klass->ImplementsKlass()) { @@ -650,7 +639,7 @@ void KlassHierarchy::TopologicalSortKlasses() { } } // Top-down iterates all nodes - for (size_t i = 0; i < topoWorkList.size(); i++) { + for (size_t i = 0; i < topoWorkList.size(); ++i) { Klass *klass = topoWorkList[i]; std::vector childklasses; ASSERT(klass != nullptr, "null ptr check!"); @@ -678,13 +667,13 @@ void KlassHierarchy::TopologicalSortKlasses() { } } -void KlassHierarchy::CountVirtualMethods() { +void KlassHierarchy::CountVirtualMethods() const { // Top-down iterates all klass nodes - for (size_t i = 0; i < topoWorkList.size(); i++) { - topoWorkList[i]->CountVirtMethTopDown(*this); + for (Klass *klass : topoWorkList) { + klass->CountVirtMethTopDown(*this); } // Bottom-up iterates all klass nodes - for (size_t i = topoWorkList.size(); i != 0; i--) { + for (size_t i = topoWorkList.size(); i != 0; --i) { topoWorkList[i - 1]->CountVirtMethBottomUp(); } } @@ -721,7 +710,7 @@ void KlassHierarchy::MarkClassFlags() { // sun.misc.Cleaner's superclass is PhantomReference. // Break this chain to process Cleaner correctly. if (super != nullptr && super->IsReference() && klass != cleanerKlass) { - klass->SetFlag(super->GetFlag(CLASS_REFERENCE)); + klass->SetFlag(super->GetFlag(kClassReference)); } // Mark Finalizer if (super != nullptr && super->HasFinalizer()) { @@ -775,42 +764,42 @@ KlassHierarchy::KlassHierarchy(MIRModule *mirmodule, MemPool *memPool) strIdx2KlassMap(std::less(), alloc.Adapter()), topoWorkList(alloc.Adapter()) {} -MIRType *WKTypes::javalangObject; -MIRType *WKTypes::jlString; -MIRType *WKTypes::javalangobjectSerializable; -MIRType *WKTypes::javalangComparable; -MIRType *WKTypes::javalangCharSequence; -MIRType *WKTypes::javalangClass; -MIRType *WKTypes::javalangrefGenericDeclaration; -MIRType *WKTypes::javalangrefAnnotatedElement; -MIRType *WKTypes::jlrType; -MIRType *WKTypes::javalangrefMethod; -MIRType *WKTypes::javalangrefExecutable; -MIRType *WKTypes::javalangrefAccessibleObject; -MIRType *WKTypes::javalangrefMember; -MIRType *WKTypes::javalangrefField; -MIRType *WKTypes::javalangrefConstructor; +MIRType *WKTypes::javaLangObject; +MIRType *WKTypes::javaLangString; +MIRType *WKTypes::javaLangObjectSerializable; +MIRType *WKTypes::javaLangComparable; +MIRType *WKTypes::javaLangCharSequence; +MIRType *WKTypes::javaLangClass; +MIRType *WKTypes::javaLangRefGenericDeclaration; +MIRType *WKTypes::javaLangRefAnnotatedElement; +MIRType *WKTypes::javaLangRefType; +MIRType *WKTypes::javaLangRefMethod; +MIRType *WKTypes::javaLangRefExecutable; +MIRType *WKTypes::javaLangRefAccessibleObject; +MIRType *WKTypes::javaLangRefMember; +MIRType *WKTypes::javaLangRefField; +MIRType *WKTypes::javaLangRefConstructor; inline static MIRType *GetMIRTypeFromName(const std::string &name) { GStrIdx gStrIdx = GlobalTables::GetStrTable().GetStrIdxFromName(NameMangler::GetInternalNameLiteral(name)); return GlobalTables::GetTypeTable().GetTypeFromTyIdx(GlobalTables::GetTypeNameTable().GetTyIdxFromGStrIdx(gStrIdx)); } void WKTypes::Init() { - javalangObject = GetMIRTypeFromName(NameMangler::kJavaLangObjectStr); - jlString = GetMIRTypeFromName("Ljava_2Flang_2FString_3B"); - javalangobjectSerializable = GetMIRTypeFromName("Ljava_2Fio_2FSerializable_3B"); - javalangComparable = GetMIRTypeFromName("Ljava_2Flang_2FComparable_3B"); - javalangCharSequence = GetMIRTypeFromName("Ljava_2Flang_2FCharSequence_3B"); - javalangClass = GetMIRTypeFromName("Ljava_2Flang_2FClass_3B"); - javalangrefGenericDeclaration = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FGenericDeclaration_3B"); - javalangrefAnnotatedElement = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FAnnotatedElement_3B"); - jlrType = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FType_3B"); - javalangrefMethod = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FMethod_3B"); - javalangrefExecutable = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FExecutable_3B"); - javalangrefAccessibleObject = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FAccessibleObject_3B"); - javalangrefMember = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FMember_3B"); - javalangrefField = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FField_3B"); - javalangrefConstructor = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FConstructor_3B"); + javaLangObject = GetMIRTypeFromName(NameMangler::kJavaLangObjectStr); + javaLangString = GetMIRTypeFromName("Ljava_2Flang_2FString_3B"); + javaLangObjectSerializable = GetMIRTypeFromName("Ljava_2Fio_2FSerializable_3B"); + javaLangComparable = GetMIRTypeFromName("Ljava_2Flang_2FComparable_3B"); + javaLangCharSequence = GetMIRTypeFromName("Ljava_2Flang_2FCharSequence_3B"); + javaLangClass = GetMIRTypeFromName("Ljava_2Flang_2FClass_3B"); + javaLangRefGenericDeclaration = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FGenericDeclaration_3B"); + javaLangRefAnnotatedElement = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FAnnotatedElement_3B"); + javaLangRefType = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FType_3B"); + javaLangRefMethod = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FMethod_3B"); + javaLangRefExecutable = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FExecutable_3B"); + javaLangRefAccessibleObject = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FAccessibleObject_3B"); + javaLangRefMember = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FMember_3B"); + javaLangRefField = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FField_3B"); + javaLangRefConstructor = GetMIRTypeFromName("Ljava_2Flang_2Freflect_2FConstructor_3B"); } // Return true if node n may point to a String object. @@ -822,8 +811,8 @@ bool WKTypes::Util::MayRefString(const BaseNode &n, MIRType &type) { if ((n.GetPrimType() == PTY_ref || n.GetPrimType() == PTY_ptr) && type.GetKind() == kTypePointer) { auto *pointType = static_cast(&type); MIRType *pointedType = pointType->GetPointedType(); - if (pointedType == jlString || pointedType == javalangobjectSerializable || pointedType == javalangComparable || - pointedType == javalangCharSequence || pointedType == javalangObject) { + if (pointedType == javaLangString || pointedType == javaLangObjectSerializable || + pointedType == javaLangComparable || pointedType == javaLangCharSequence || pointedType == javaLangObject) { return true; } } @@ -837,52 +826,44 @@ bool WKTypes::Util::MayRefMeta(const BaseNode &n, MIRType &type) { if ((n.GetPrimType() == PTY_ref || n.GetPrimType() == PTY_ptr) && type.GetKind() == kTypePointer) { auto *pointType = static_cast(&type); MIRType *pointedType = pointType->GetPointedType(); - /* - Definition of java.lang.Class: - public final class Class implements java.io.Serializable, - GenericDeclaration, - Type, - AnnotatedElement {...} - public interface Serializable {} - public interface GenericDeclaration extends AnnotatedElement {...} - public interface AnnotatedElement {...} - public interface Type {...} - public interface AnnotatedElement {...} - */ - if (pointedType == javalangClass || pointedType == javalangobjectSerializable || - pointedType == javalangrefGenericDeclaration || pointedType == javalangrefAnnotatedElement || - pointedType == jlrType || pointedType == javalangObject) { + // Definition of java.lang.Class: + // public final class Class implements java.io.Serializable, + // GenericDeclaration, + // Type, + // AnnotatedElement {...} + // public interface Serializable {} + // public interface GenericDeclaration extends AnnotatedElement {...} + // public interface AnnotatedElement {...} + // public interface Type {...} + // public interface AnnotatedElement {...} + if (pointedType == javaLangClass || pointedType == javaLangObjectSerializable || + pointedType == javaLangRefGenericDeclaration || pointedType == javaLangRefAnnotatedElement || + pointedType == javaLangRefType || pointedType == javaLangObject) { return true; } - /* - Definition of java.lang.reflect.Method: - public final class Method extends Executable {...} - public abstract class Executable extends AccessibleObject - implements Member, GenericDeclaration {...} - public class AccessibleObject implements AnnotatedElement {...} - public interface AnnotatedElement {...} - public interface Member {...} - public interface GenericDeclaration extends AnnotatedElement {...} - public interface AnnotatedElement {...} - */ - if (pointedType == javalangrefMethod || pointedType == javalangrefExecutable || - pointedType == javalangrefAccessibleObject || - pointedType == javalangrefMember || pointedType == javalangrefGenericDeclaration || - pointedType == javalangrefAnnotatedElement || pointedType == javalangObject) { + // Definition of java.lang.reflect.Method: + // public final class Method extends Executable {...} + // public abstract class Executable extends AccessibleObject + // implements Member, GenericDeclaration {...} + // public class AccessibleObject implements AnnotatedElement {...} + // public interface AnnotatedElement {...} + // public interface Member {...} + // public interface GenericDeclaration extends AnnotatedElement {...} + // public interface AnnotatedElement {...} + if (pointedType == javaLangRefMethod || pointedType == javaLangRefExecutable || + pointedType == javaLangRefAccessibleObject || + pointedType == javaLangRefMember || pointedType == javaLangRefGenericDeclaration || + pointedType == javaLangRefAnnotatedElement || pointedType == javaLangObject) { return true; } - /* - Definition of java.lang.reflect.Field: - public final class Field extends AccessibleObject implements Member {...} - */ - if (pointedType == javalangrefField) { // super classes/interfaces are checked by javalangrefMethod + // Definition of java.lang.reflect.Field: + // public final class Field extends AccessibleObject implements Member {...} + if (pointedType == javaLangRefField) { // super classes/interfaces are checked by javaLangRefMethod return true; } - /* - Definition of java.lang.reflect.Constructor: - public final class Constructor extends Executable {...} - */ - if (pointedType == javalangrefConstructor) { // super classes are checked by javalangrefMethod + // Definition of java.lang.reflect.Constructor: + // public final class Constructor extends Executable {...} + if (pointedType == javaLangRefConstructor) { // super classes are checked by javaLangRefMethod return true; } } @@ -902,21 +883,24 @@ bool WKTypes::Util::MayNotRefCyclicly(const BaseNode &n, MIRType &type) { // Helper function of WKTypes::Util::MayNotRefCyclicly. bool WKTypes::Util::NotCyclicType(MIRType &type, std::set &workList) { // Fast path for special cases: String, Class - if (&type == jlString || &type == javalangClass) { + if (&type == javaLangString || &type == javaLangClass) { return true; } if (type.GetKind() == kTypeScalar) { // primitive type return true; - } else if (type.GetKind() == kTypePointer) { + } + if (type.GetKind() == kTypePointer) { auto *pointedType = static_cast(&type)->GetPointedType(); ASSERT(pointedType != nullptr, "null ptr check!"); return NotCyclicType(*pointedType, workList); - } else if (type.GetKind() == kTypeJArray) { + } + if (type.GetKind() == kTypeJArray) { MIRType *elemType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(static_cast(&type)->GetElemTyIdx()); ASSERT(elemType != nullptr, "null ptr check!"); return NotCyclicType(*elemType, workList); - } else if (type.GetKind() == kTypeClass) { + } + if (type.GetKind() == kTypeClass) { auto *classType = static_cast(&type); if (!classType->IsFinal()) { // Not sure what actual class it refers to return false; @@ -957,7 +941,8 @@ bool WKTypes::Util::NotCyclicType(MIRType &type, std::set &workList) { } } return true; - } else if (type.GetKind() == kTypeInterface) { + } + if (type.GetKind() == kTypeInterface) { // Perhaps something more can do. return false; } diff --git a/src/mpl2mpl/src/class_init.cpp b/src/mpl2mpl/src/class_init.cpp index bae479b6dce88f63340417957ffb768e71ba0853..05a91875f9787c39a257fb22fd4f444cb5482418 100644 --- a/src/mpl2mpl/src/class_init.cpp +++ b/src/mpl2mpl/src/class_init.cpp @@ -16,45 +16,50 @@ #include #include +namespace { +constexpr char kMCCPreClinitCheck[] = "MCC_PreClinitCheck"; +constexpr char kMCCPostClinitCheck[] = "MCC_PostClinitCheck"; + +} // namespace + // This phase does two things. // 1. Insert clinit(class initialization) check, a intrinsic call INTRN_MPL_CLINIT_CHECK // for place where needed. // Insert clinit check for static native methods which are not private. // 2. Lower JAVA_CLINIT_CHECK to MPL_CLINIT_CHECK. - namespace maple { ClassInit::ClassInit(MIRModule *mod, KlassHierarchy *kh, bool dump) : FuncOptimizeImpl(mod, kh, dump) { } -bool ClassInit::CanRemoveClinitCheck(const std::string &clinitClassname) { +bool ClassInit::CanRemoveClinitCheck(const std::string &clinitClassname) const { return false; } #undef CLINIT_CHECK -void ClassInit::GenClassInitCheckProfile(MIRFunction &func, MIRSymbol &classinfo, StmtNode *clinit) const { +void ClassInit::GenClassInitCheckProfile(MIRFunction &func, const MIRSymbol &classInfo, StmtNode *clinit) const { #ifdef CLINIT_CHECK - GenPreClassInitCheck(func, classinfo, clinit); - GenPostClassInitCheck(func, classinfo, clinit); + GenPreClassInitCheck(func, classInfo, clinit); + GenPostClassInitCheck(func, classInfo, clinit); #endif // CLINIT_CHECK } -void ClassInit::GenPreClassInitCheck(MIRFunction &func, const MIRSymbol &classinfo, StmtNode *clinit) { +void ClassInit::GenPreClassInitCheck(MIRFunction &func, const MIRSymbol &classInfo, StmtNode *clinit) const { MIRFunction *preClinit = builder->GetOrCreateFunction(kMCCPreClinitCheck, (TyIdx)(PTY_void)); - BaseNode *classInfoNode = builder->CreateExprAddrof(0, classinfo); + BaseNode *classInfoNode = builder->CreateExprAddrof(0, classInfo); MapleVector args(builder->GetCurrentFuncCodeMpAllocator()->Adapter()); args.push_back(classInfoNode); CallNode *callPreclinit = builder->CreateStmtCall(preClinit->GetPuidx(), args); func.GetBody()->InsertBefore(clinit, callPreclinit); } -void ClassInit::GenPostClassInitCheck(MIRFunction &func, const MIRSymbol &classinfo, StmtNode *clinit) { +void ClassInit::GenPostClassInitCheck(MIRFunction &func, const MIRSymbol &classInfo, StmtNode *clinit) const { MIRFunction *postClinit = builder->GetOrCreateFunction(kMCCPostClinitCheck, (TyIdx)(PTY_void)); - BaseNode *classInfoNode = builder->CreateExprAddrof(0, classinfo); + BaseNode *classInfoNode = builder->CreateExprAddrof(0, classInfo); MapleVector args(builder->GetCurrentFuncCodeMpAllocator()->Adapter()); args.push_back(classInfoNode); - CallNode *callPostclinit = builder->CreateStmtCall(postClinit->GetPuidx(), args); - func.GetBody()->InsertAfter(clinit, callPostclinit); + CallNode *callPostClinit = builder->CreateStmtCall(postClinit->GetPuidx(), args); + func.GetBody()->InsertAfter(clinit, callPostClinit); } void ClassInit::ProcessFunc(MIRFunction *func) { diff --git a/src/mpl2mpl/src/gen_check_cast.cpp b/src/mpl2mpl/src/gen_check_cast.cpp index 929f1cd4a18d04e7bee62ef085aee4dcbc7f5fd1..96acefa6d072ac4e6f9683e292e9870fe975d738 100644 --- a/src/mpl2mpl/src/gen_check_cast.cpp +++ b/src/mpl2mpl/src/gen_check_cast.cpp @@ -18,6 +18,12 @@ #include "reflection_analysis.h" #include "mir_lower.h" +namespace { +constexpr char kMCCReflectThrowCastException[] = "MCC_Reflect_ThrowCastException"; +constexpr char kMCCReflectCheckCastingNoArray[] = "MCC_Reflect_Check_Casting_NoArray"; +constexpr char kMCCReflectCheckCastingArray[] = "MCC_Reflect_Check_Casting_Array"; +} // namespace + // This phase does two things: // #1 implement the opcode check-cast vx, type_id // according to the check-cast definition: @@ -27,7 +33,6 @@ // in our case check if object can be cast or insert MCC_Reflect_ThrowCastException // before the stmt. // #2 optimise instance-of && cast - namespace maple { CheckCastGenerator::CheckCastGenerator(MIRModule *mod, KlassHierarchy *kh, bool dump) : FuncOptimizeImpl(mod, kh, dump) { @@ -55,7 +60,7 @@ void CheckCastGenerator::InitFuncs() { MIRSymbol *CheckCastGenerator::GetOrCreateClassInfoSymbol(const std::string &className) { std::string classInfoName = CLASSINFO_PREFIX_STR + className; - MIRSymbol *classInfoSymbol = builder->GetGlobalDecl(classInfoName.c_str()); + MIRSymbol *classInfoSymbol = builder->GetGlobalDecl(classInfoName); if (classInfoSymbol == nullptr) { GStrIdx gStrIdx = GlobalTables::GetStrTable().GetStrIdxFromName(className); MIRType *classType = @@ -63,12 +68,12 @@ MIRSymbol *CheckCastGenerator::GetOrCreateClassInfoSymbol(const std::string &cla MIRStorageClass sclass = (classType != nullptr && static_cast(classType)->IsLocal()) ? kScGlobal : kScExtern; // Creating global symbol needs synchronization. - classInfoSymbol = builder->CreateGlobalDecl(classInfoName.c_str(), *GlobalTables::GetTypeTable().GetPtr(), sclass); + classInfoSymbol = builder->CreateGlobalDecl(classInfoName, *GlobalTables::GetTypeTable().GetPtr(), sclass); } return classInfoSymbol; } -void CheckCastGenerator::GenCheckCast(BaseNode &stmt) { +void CheckCastGenerator::GenCheckCast(StmtNode &stmt) { // Handle the special case like (Type)null, we don't need a checkcast. if (stmt.GetOpCode() == OP_intrinsiccallwithtypeassigned) { auto *callNode = static_cast(&stmt); @@ -87,7 +92,7 @@ void CheckCastGenerator::GenCheckCast(BaseNode &stmt) { MIRPreg *mirPreg = currFunc->GetPregTab()->PregFromPregIdx(pregIdx); assignReturnTypeNode = builder->CreateStmtRegassign(mirPreg->GetPrimType(), pregIdx, opnd); } - currFunc->GetBody()->ReplaceStmt1WithStmt2(static_cast(&stmt), assignReturnTypeNode); + currFunc->GetBody()->ReplaceStmt1WithStmt2(&stmt, assignReturnTypeNode); return; } } @@ -99,8 +104,8 @@ void CheckCastGenerator::GenCheckCast(BaseNode &stmt) { Klass *checkKlass = klassHierarchy->GetKlassFromTyIdx(static_cast(checkType)->GetPointedTyIdx()); { - if (checkKlass != nullptr && strcmp("", checkKlass->GetKlassName().c_str())) { - if (!strcmp(checkKlass->GetKlassName().c_str(), NameMangler::kJavaLangObjectStr)) { + if ((checkKlass != nullptr) && (checkKlass->GetKlassName() != "")) { + if (checkKlass->GetKlassName() == NameMangler::kJavaLangObjectStr) { const size_t callNodeNopndSize1 = callNode->GetNopndSize(); CHECK_FATAL(callNodeNopndSize1 > 0, "container check"); if (callNode->GetNopndAt(0)->GetPrimType() != PTY_ref && callNode->GetNopndAt(0)->GetPrimType() != PTY_ptr) { @@ -112,17 +117,17 @@ void CheckCastGenerator::GenCheckCast(BaseNode &stmt) { args.push_back(callNode->GetNopndAt(0)); args.push_back(builder->CreateIntConst(0, PTY_ptr)); StmtNode *dassignStmt = builder->CreateStmtCall(throwCastException->GetPuidx(), args); - currFunc->GetBody()->InsertBefore(static_cast(&stmt), dassignStmt); + currFunc->GetBody()->InsertBefore(&stmt, dassignStmt); } } else { MIRSymbol *classSt = GetOrCreateClassInfoSymbol(checkKlass->GetKlassName()); BaseNode *valueExpr = builder->CreateExprAddrof(0, *classSt); - BaseNode *nullPtr = builder->CreateIntConst(0, PTY_ptr); + BaseNode *nullPtrConst = builder->CreateIntConst(0, PTY_ptr); const size_t callNodeNopndSize2 = callNode->GetNopndSize(); CHECK_FATAL(callNodeNopndSize2 > 0, "container check"); BaseNode *cond = builder->CreateExprCompare(OP_ne, *GlobalTables::GetTypeTable().GetUInt1(), - *GlobalTables::GetTypeTable().GetPtr(), callNode->GetNopndAt(0), nullPtr); + *GlobalTables::GetTypeTable().GetPtr(), callNode->GetNopndAt(0), nullPtrConst); auto *ifStmt = static_cast(builder->CreateStmtIf(cond)); MIRType *mVoidPtr = GlobalTables::GetTypeTable().GetVoidPtr(); CHECK_FATAL(mVoidPtr != nullptr, "builder->GetVoidPtr() is null in CheckCastGenerator::GenCheckCast"); @@ -137,7 +142,7 @@ void CheckCastGenerator::GenCheckCast(BaseNode &stmt) { StmtNode *dassignStmt = builder->CreateStmtCall(checkCastingNoArray->GetPuidx(), args); innerIfStmt->GetThenPart()->AddStatement(dassignStmt); ifStmt->GetThenPart()->AddStatement(innerIfStmt); - currFunc->GetBody()->InsertBefore(static_cast(&stmt), ifStmt); + currFunc->GetBody()->InsertBefore(&stmt, ifStmt); } } else { MIRType *pointedType = @@ -148,7 +153,7 @@ void CheckCastGenerator::GenCheckCast(BaseNode &stmt) { std::string arrayName = jarrayType->GetJavaName(); int dim = 0; while (arrayName[dim] == 'A') { - dim++; + ++dim; } MIRSymbol *elemClassSt = nullptr; std::string elementName = arrayName.substr(dim, arrayName.size() - dim); @@ -158,16 +163,16 @@ void CheckCastGenerator::GenCheckCast(BaseNode &stmt) { elementName == "S" || elementName == "J" || elementName == "D" || elementName == "Z" || elementName == "V") { std::string primClassinfoName = PRIMITIVECLASSINFO_PREFIX_STR + elementName; - elemClassSt = builder->GetGlobalDecl(primClassinfoName.c_str()); + elemClassSt = builder->GetGlobalDecl(primClassinfoName); if (elemClassSt == nullptr) { - elemClassSt = builder->CreateGlobalDecl(primClassinfoName.c_str(), *GlobalTables::GetTypeTable().GetPtr()); + elemClassSt = builder->CreateGlobalDecl(primClassinfoName, *GlobalTables::GetTypeTable().GetPtr()); } } else { elemClassSt = GetOrCreateClassInfoSymbol(elementName); } BaseNode *valueExpr = builder->CreateExprAddrof(0, *elemClassSt); - UStrIdx stridx = GlobalTables::GetUStrTable().GetOrCreateStrIdxFromName(jarrayType->GetJavaName()); - ConststrNode *signatureNode = currFunc->GetCodeMempool()->New(stridx); + UStrIdx strIdx = GlobalTables::GetUStrTable().GetOrCreateStrIdxFromName(jarrayType->GetJavaName()); + auto *signatureNode = currFunc->GetCodeMempool()->New(strIdx); signatureNode->SetPrimType(PTY_ptr); MapleVector opnds(currFunc->GetCodeMempoolAllocator().Adapter()); opnds.push_back(valueExpr); @@ -177,7 +182,7 @@ void CheckCastGenerator::GenCheckCast(BaseNode &stmt) { opnds.push_back(builder->CreateIntConst(dim, PTY_ptr)); opnds.push_back(signatureNode); StmtNode *dassignStmt = builder->CreateStmtCall(checkCastingArray->GetPuidx(), opnds); - currFunc->GetBody()->InsertBefore(static_cast(&stmt), dassignStmt); + currFunc->GetBody()->InsertBefore(&stmt, dassignStmt); } else { MIRTypeKind kd = pointedType->GetKind(); if (kd == kTypeStructIncomplete || kd == kTypeClassIncomplete || kd == kTypeInterfaceIncomplete) { @@ -235,7 +240,7 @@ void CheckCastGenerator::GenCheckCast(BaseNode &stmt) { ASSERT((fromType->GetPrimType() == maple::PTY_ptr || fromType->GetPrimType() == maple::PTY_ref), "unknown fromType! check it!"); ASSERT(GlobalTables::GetTypeTable().GetTypeFromTyIdx(callNode->GetTyIdx())->GetPrimType() == maple::PTY_ptr || - GlobalTables::GetTypeTable().GetTypeFromTyIdx(callNode->GetTyIdx())->GetPrimType() == maple::PTY_ref, + GlobalTables::GetTypeTable().GetTypeFromTyIdx(callNode->GetTyIdx())->GetPrimType() == maple::PTY_ref, "unknown fromType! check it!"); CHECK_FATAL(!callNode->GetReturnVec().empty(), "container check"); CallReturnPair callReturnPair = callNode->GetReturnVec()[0]; @@ -247,7 +252,7 @@ void CheckCastGenerator::GenCheckCast(BaseNode &stmt) { MIRPreg *mirPreg = currFunc->GetPregTab()->PregFromPregIdx(pregIdx); assignReturnTypeNode = builder->CreateStmtRegassign(mirPreg->GetPrimType(), pregIdx, opnd); } - currFunc->GetBody()->ReplaceStmt1WithStmt2(static_cast(&stmt), assignReturnTypeNode); + currFunc->GetBody()->ReplaceStmt1WithStmt2(&stmt, assignReturnTypeNode); } void CheckCastGenerator::GenAllCheckCast() { diff --git a/src/mpl2mpl/src/java_eh_lower.cpp b/src/mpl2mpl/src/java_eh_lower.cpp index 31e84695f78a6541109f1eae0fbd545f0287b32e..55b05dfe5916fec29b8205aee4f083d479e30ca1 100644 --- a/src/mpl2mpl/src/java_eh_lower.cpp +++ b/src/mpl2mpl/src/java_eh_lower.cpp @@ -18,6 +18,13 @@ #include "global_tables.h" #include "option.h" +namespace { +const std::string strDivOpnd = "__div_opnd1"; +const std::string strDivRes = "__div_res"; +const std::string strMCCThrowArrayIndexOutOfBoundsException = "MCC_ThrowArrayIndexOutOfBoundsException"; +const std::string strMCCThrowNullPointerException = "MCC_ThrowNullPointerException"; +} // namespace + // Do exception handling runtime insertion of runtime function call // scan the entire function body once to lookup expression that // could potentially raise exceptions such as division, @@ -28,73 +35,67 @@ // if b == 0, // call MCC_ThrowArithmeticException() // x = a/b - namespace maple { -JavaEHLowerer::JavaEHLowerer(MIRModule *mod, KlassHierarchy *kh, bool dump) : FuncOptimizeImpl(mod, kh, dump) { - useRegTmp = Options::usePreg; - divSTIndex = 0; -} - BaseNode *JavaEHLowerer::DoLowerDiv(BinaryNode &expr, BlockNode &blknode) { PrimType ptype = expr.GetPrimType(); MIRBuilder *mirBuilder = GetMIRModule().GetMIRBuilder(); MIRFunction *func = GetMIRModule().CurFunction(); - if (IsPrimitiveInteger(ptype)) { - // Store divopnd to a tmp st if not a leaf node. - BaseNode *divOpnd = expr.Opnd(1); - if (!divOpnd->IsLeaf()) { - std::string opnd1name(strDivOpnd); - opnd1name.append(std::to_string(divSTIndex)); - if (useRegTmp) { - PregIdx pregIdx = func->GetPregTab()->CreatePreg(ptype); - RegassignNode *regassDivnode = mirBuilder->CreateStmtRegassign(ptype, pregIdx, divOpnd); - blknode.AddStatement(regassDivnode); - divOpnd = mirBuilder->CreateExprRegread(ptype, pregIdx); - } else { - MIRSymbol *divOpndSymbol = mirBuilder->CreateSymbol(TyIdx(ptype), opnd1name.c_str(), kStVar, kScAuto, - GetMIRModule().CurFunction(), kScopeLocal); - DassignNode *dssDivNode = mirBuilder->CreateStmtDassign(*divOpndSymbol, 0, divOpnd); - blknode.AddStatement(dssDivNode); - divOpnd = mirBuilder->CreateExprDread(*divOpndSymbol); - } - expr.SetBOpnd(divOpnd, 1); - } - BaseNode *retExprNode = nullptr; - StmtNode *divStmt = nullptr; + if (!IsPrimitiveInteger(ptype)) { + return &expr; + } + + // Store divopnd to a tmp st if not a leaf node. + BaseNode *divOpnd = expr.Opnd(1); + if (!divOpnd->IsLeaf()) { + std::string opnd1name(strDivOpnd); + opnd1name.append(std::to_string(divSTIndex)); if (useRegTmp) { - PregIdx resPregIdx = func->GetPregTab()->CreatePreg(ptype); - divStmt = mirBuilder->CreateStmtRegassign(ptype, resPregIdx, &expr); - retExprNode = GetMIRModule().GetMIRBuilder()->CreateExprRegread(ptype, resPregIdx); + PregIdx pregIdx = func->GetPregTab()->CreatePreg(ptype); + RegassignNode *regassDivnode = mirBuilder->CreateStmtRegassign(ptype, pregIdx, divOpnd); + blknode.AddStatement(regassDivnode); + divOpnd = mirBuilder->CreateExprRegread(ptype, pregIdx); } else { - std::string resName(strDivRes); - resName.append(std::to_string(divSTIndex++)); - MIRSymbol *divResSymbol = mirBuilder->CreateSymbol(TyIdx(ptype), resName.c_str(), kStVar, kScAuto, - GetMIRModule().CurFunction(), kScopeLocal); - // Put expr result to dssnode. - divStmt = mirBuilder->CreateStmtDassign(*divResSymbol, 0, &expr); - retExprNode = GetMIRModule().GetMIRBuilder()->CreateExprDread(*divResSymbol, 0); + MIRSymbol *divOpndSymbol = mirBuilder->CreateSymbol(TyIdx(ptype), opnd1name.c_str(), kStVar, kScAuto, + GetMIRModule().CurFunction(), kScopeLocal); + DassignNode *dssDivNode = mirBuilder->CreateStmtDassign(*divOpndSymbol, 0, divOpnd); + blknode.AddStatement(dssDivNode); + divOpnd = mirBuilder->CreateExprDread(*divOpndSymbol); } - // Check if the second operand of the div expression is 0. - // Inser if statement for high level ir. - CompareNode *cmpNode = mirBuilder->CreateExprCompare(OP_eq, *GlobalTables::GetTypeTable().GetInt32(), - *GlobalTables::GetTypeTable().GetTypeFromTyIdx((TyIdx)ptype), - divOpnd, mirBuilder->CreateIntConst(0, ptype)); - IfStmtNode *ifStmtNode = mirBuilder->CreateStmtIf(cmpNode); - blknode.AddStatement(ifStmtNode); - // Call the MCC_ThrowArithmeticException() that will never return. - MapleVector args(GetMIRModule().GetMIRBuilder()->GetCurrentFuncCodeMpAllocator()->Adapter()); - IntrinsiccallNode *intrinCallNode = mirBuilder->CreateStmtIntrinsicCall(INTRN_JAVA_THROW_ARITHMETIC, args); - ifStmtNode->GetThenPart()->AddStatement(intrinCallNode); - blknode.AddStatement(divStmt); - // Make dread from the divresst and return it as new expression for this function. - return retExprNode; + expr.SetBOpnd(divOpnd, 1); + } + BaseNode *retExprNode = nullptr; + StmtNode *divStmt = nullptr; + if (useRegTmp) { + PregIdx resPregIdx = func->GetPregTab()->CreatePreg(ptype); + divStmt = mirBuilder->CreateStmtRegassign(ptype, resPregIdx, &expr); + retExprNode = GetMIRModule().GetMIRBuilder()->CreateExprRegread(ptype, resPregIdx); } else { - return &expr; + std::string resName(strDivRes); + resName.append(std::to_string(divSTIndex++)); + MIRSymbol *divResSymbol = mirBuilder->CreateSymbol(TyIdx(ptype), resName.c_str(), kStVar, kScAuto, + GetMIRModule().CurFunction(), kScopeLocal); + // Put expr result to dssnode. + divStmt = mirBuilder->CreateStmtDassign(*divResSymbol, 0, &expr); + retExprNode = GetMIRModule().GetMIRBuilder()->CreateExprDread(*divResSymbol, 0); } + // Check if the second operand of the div expression is 0. + // Inser if statement for high level ir. + CompareNode *cmpNode = mirBuilder->CreateExprCompare(OP_eq, *GlobalTables::GetTypeTable().GetInt32(), + *GlobalTables::GetTypeTable().GetTypeFromTyIdx((TyIdx)ptype), + divOpnd, mirBuilder->CreateIntConst(0, ptype)); + IfStmtNode *ifStmtNode = mirBuilder->CreateStmtIf(cmpNode); + blknode.AddStatement(ifStmtNode); + // Call the MCC_ThrowArithmeticException() that will never return. + MapleVector args(GetMIRModule().GetMIRBuilder()->GetCurrentFuncCodeMpAllocator()->Adapter()); + IntrinsiccallNode *intrinCallNode = mirBuilder->CreateStmtIntrinsicCall(INTRN_JAVA_THROW_ARITHMETIC, args); + ifStmtNode->GetThenPart()->AddStatement(intrinCallNode); + blknode.AddStatement(divStmt); + // Make dread from the divresst and return it as new expression for this function. + return retExprNode; } BaseNode *JavaEHLowerer::DoLowerExpr(BaseNode &expr, BlockNode &curblk) { - for (size_t i = 0; i < expr.NumOpnds(); i++) { + for (size_t i = 0; i < expr.NumOpnds(); ++i) { expr.SetOpnd(DoLowerExpr(*(expr.Opnd(i)), curblk), i); } switch (expr.GetOpCode()) { @@ -213,7 +214,7 @@ BlockNode *JavaEHLowerer::DoLowerBlock(BlockNode &block) { // fallthrough; } default: { - for (size_t i = 0; i < stmt->NumOpnds(); i++) { + for (size_t i = 0; i < stmt->NumOpnds(); ++i) { stmt->SetOpnd(DoLowerExpr(*(stmt->Opnd(i)), *newBlock), i); } newBlock->AddStatement(stmt); diff --git a/src/mpl2mpl/src/java_intrn_lowering.cpp b/src/mpl2mpl/src/java_intrn_lowering.cpp index db129b87386861900d5e19f8dc2e25188a020910..0ab64f31bdf7b41393a51ca0dcbfa616028ab670 100644 --- a/src/mpl2mpl/src/java_intrn_lowering.cpp +++ b/src/mpl2mpl/src/java_intrn_lowering.cpp @@ -17,19 +17,22 @@ #include #include +namespace { +} // namespace + // JavaIntrnLowering lowers several kinds of intrinsics: // 1. INTRN_JAVA_MERGE // Check if INTRN_JAVA_MERGE is legal: // if yes, turn it into a Retype or CvtType; if no, assert // 2. INTRN_JAVA_FILL_NEW_ARRAY // Turn it into a jarray malloc and jarray element-wise assignment - namespace maple { -inline bool IsConstvalZero(BaseNode &n) { - return (n.GetOpCode() == OP_constval && static_cast(&n)->GetConstVal()->IsZero()); +inline bool IsConstvalZero(BaseNode &node) { + return (node.GetOpCode() == OP_constval) && (static_cast(node).GetConstVal()->IsZero()); } -JavaIntrnLowering::JavaIntrnLowering(MIRModule *mod, KlassHierarchy *kh, bool dump) : FuncOptimizeImpl(mod, kh, dump) { +JavaIntrnLowering::JavaIntrnLowering(MIRModule *mod, KlassHierarchy *kh, bool dump) + : FuncOptimizeImpl(mod, kh, dump) { } @@ -112,33 +115,33 @@ BaseNode *JavaIntrnLowering::JavaIntrnMergeToCvtType(PrimType destType, PrimType if (IsPrimitiveInteger(srcType) && IsPrimitiveFloat(destType)) { if (GetPrimTypeBitSize(srcType) == GetPrimTypeBitSize(destType)) { return builder->CreateExprRetype(*toType, *fromType, src); - } else { - return builder->CreateExprTypeCvt(OP_cvt, *toType, *fromType, src); } + return builder->CreateExprTypeCvt(OP_cvt, *toType, *fromType, src); } else if (IsPrimitiveInteger(srcType) && IsPrimitiveInteger(destType)) { if (GetPrimTypeBitSize(srcType) >= GetPrimTypeBitSize(destType)) { if (destType == PTY_u1) { // e.g., type _Bool. return builder->CreateExprCompare(OP_ne, *toType, *fromType, src, builder->CreateIntConst(0, srcType)); - } else if (GetPrimTypeBitSize(srcType) > GetPrimTypeBitSize(destType)) { + } + if (GetPrimTypeBitSize(srcType) > GetPrimTypeBitSize(destType)) { return builder->CreateExprTypeCvt(OP_cvt, *toType, *fromType, src); - } else if (IsSignedInteger(srcType) != IsSignedInteger(destType)) { + } + if (IsSignedInteger(srcType) != IsSignedInteger(destType)) { return builder->CreateExprTypeCvt(OP_cvt, *toType, *fromType, src); - } else { - src->SetPrimType(destType); - return src; } - // Force type cvt here because we currently do not run constant folding - // or contanst propagation before CG. We may revisit this decision later. - } else if (GetPrimTypeBitSize(srcType) < GetPrimTypeBitSize(destType)) { + src->SetPrimType(destType); + return src; + } + // Force type cvt here because we currently do not run constant folding + // or contanst propagation before CG. We may revisit this decision later. + if (GetPrimTypeBitSize(srcType) < GetPrimTypeBitSize(destType)) { return builder->CreateExprTypeCvt(OP_cvt, *toType, *fromType, src); - } else if (IsConstvalZero(*src)) { + } + if (IsConstvalZero(*src)) { return builder->CreateIntConst(0, destType); - } else { - CHECK_FATAL(false, "NYI. Don't know what to do"); } - } else { CHECK_FATAL(false, "NYI. Don't know what to do"); } + CHECK_FATAL(false, "NYI. Don't know what to do"); } void JavaIntrnLowering::ProcessJavaIntrnFillNewArray(IntrinsiccallNode &intrinCall) { @@ -156,8 +159,9 @@ void JavaIntrnLowering::ProcessJavaIntrnFillNewArray(IntrinsiccallNode &intrinCa "Dst preg needs to be a pointer or reference type"); retType = mirPreg->GetMIRType(); } - CHECK_FATAL(retType->GetKind() == kTypePointer, "Return type of INTRN_JAVA_FILL_NEW_ARRAY should point to a Jarray"); - MIRType *arrayType = static_cast(retType)->GetPointedType(); + CHECK_FATAL(retType->GetKind() == kTypePointer, + "Return type of INTRN_JAVA_FILL_NEW_ARRAY should point to a Jarray"); + auto *arrayType = static_cast(retType)->GetPointedType(); BaseNode *lenNode = builder->CreateIntConst(intrinCall.NumOpnds(), PTY_i32); JarrayMallocNode *newArrayNode = builder->CreateExprJarrayMalloc(OP_gcmallocjarray, *retType, *arrayType, lenNode); // Then fill each array element one by one. @@ -177,7 +181,7 @@ void JavaIntrnLowering::ProcessJavaIntrnFillNewArray(IntrinsiccallNode &intrinCa } assignStmt->SetSrcPos(intrinCall.GetSrcPos()); StmtNode *stmt = assignStmt; - for (int i = 0; i < intrinCall.NumOpnds(); i++) { + for (int i = 0; i < intrinCall.NumOpnds(); ++i) { ArrayNode *arrayexpr = builder->CreateExprArray(*arrayType, addrExpr, builder->CreateIntConst(i, PTY_i32)); arrayexpr->SetBoundsCheck(false); StmtNode *storeStmt = builder->CreateStmtIassign(*retType, 0, arrayexpr, intrinCall.Opnd(i)); diff --git a/src/mpl2mpl/src/muid_replacement.cpp b/src/mpl2mpl/src/muid_replacement.cpp index abaa1faf65e75c56ac69be77a33ea567fb32b74b..cc504221a8bd38fc6b831d90f18d1b8371b77fb0 100644 --- a/src/mpl2mpl/src/muid_replacement.cpp +++ b/src/mpl2mpl/src/muid_replacement.cpp @@ -17,6 +17,16 @@ #include "vtable_analysis.h" #include "reflection_analysis.h" +namespace { +// Version for the mpl linker +constexpr char kMplLinkerVersionNumber[] = "MPL-LINKER V1.1"; +constexpr char kMuidFuncPtrStr[] = "__muid_funcptr"; +constexpr char kMuidSymPtrStr[] = "__muid_symptr"; + +constexpr maple::uint64 kFromUndefIndexMask = 0x4000000000000000; +constexpr maple::uint64 kFromDefIndexMask = 0x2000000000000000; +} // namespace + // MUIDReplacement // This phase is mainly to enable the maple linker about the text and data structure. // It will do the following things: @@ -25,19 +35,13 @@ // // B) It will replace the relevant reference about the methods and static variable with def or undef // table.And then we can close these symbols to reduce the code size. - namespace maple { MUID MUIDReplacement::mplMuid; MUIDReplacement::MUIDReplacement(MIRModule *mod, KlassHierarchy *kh, bool dump) - : FuncOptimizeImpl(mod, kh, dump), - funcDefMap(std::less()), - dataDefMap(std::less()), - funcUndefMap(std::less()), - dataUndefMap(std::less()), - defMuidIdxMap(std::less()) { + : FuncOptimizeImpl(mod, kh, dump) { isLibcore = (GetSymbolFromName(NameMangler::GetInternalNameLiteral(NameMangler::kJavaLangObjectStr)) != nullptr); - GenericTables(); + GenerateTables(); } MIRSymbol *MUIDReplacement::GetSymbolFromName(const std::string &name) { @@ -120,7 +124,7 @@ void MUIDReplacement::CollectFuncAndDataFromKlasses() { void MUIDReplacement::CollectFuncAndDataFromGlobalTab() { // Iterate global symbols - for (size_t i = 1; i < GlobalTables::GetGsymTable().GetSymbolTableSize(); i++) { + for (size_t i = 1; i < GlobalTables::GetGsymTable().GetSymbolTableSize(); ++i) { // entry 0 is reserved as nullptr MIRSymbol *mirSymbol = GlobalTables::GetGsymTable().GetSymbolFromStidx(i); CHECK_FATAL(mirSymbol != nullptr, "Invalid global data symbol at index %u", i); @@ -175,7 +179,6 @@ void MUIDReplacement::CollectFuncAndDataFromFuncList() { } if (puidx != 0) { MIRFunction *undefMIRFunc = GlobalTables::GetFunctionTable().GetFunctionFromPuidx(puidx); - ASSERT(undefMIRFunc != nullptr, "Invalid MIRFunction"); if (undefMIRFunc->GetBody() == nullptr && (undefMIRFunc->IsJava() || !undefMIRFunc->GetBaseClassName().empty())) { AddUndefFunc(undefMIRFunc); @@ -192,15 +195,15 @@ void MUIDReplacement::CollectImplicitUndefClassInfo(StmtNode &stmt) { BaseNode *rhs = nullptr; std::vector classTyVec; if (stmt.GetOpCode() == OP_dassign) { - DassignNode *dnode = static_cast(&stmt); - rhs = dnode->GetRHS(); + auto *dNode = static_cast(&stmt); + rhs = dNode->GetRHS(); } else if (stmt.GetOpCode() == OP_regassign) { - RegassignNode *rnode = static_cast(&stmt); - rhs = rnode->Opnd(); + auto *rNode = static_cast(&stmt); + rhs = rNode->Opnd(); } else if (stmt.GetOpCode() == OP_catch) { - CatchNode *jnode = static_cast(&stmt); - for (TyIdx typeIdx : jnode->GetExceptionTyIdxVec()) { - MIRPtrType *pointerType = static_cast(GlobalTables::GetTypeTable().GetTypeFromTyIdx(typeIdx)); + auto *jNode = static_cast(&stmt); + for (TyIdx typeIdx : jNode->GetExceptionTyIdxVec()) { + auto *pointerType = static_cast(GlobalTables::GetTypeTable().GetTypeFromTyIdx(typeIdx)); MIRType *type = pointerType->GetPointedType(); if (type != nullptr) { if (type->GetKind() == kTypeClass || type->GetKind() == kTypeInterface) { @@ -216,13 +219,13 @@ void MUIDReplacement::CollectImplicitUndefClassInfo(StmtNode &stmt) { } if (rhs != nullptr && rhs->GetOpCode() == OP_gcmalloc) { // GCMalloc may require more classinfo than what we have seen so far - GCMallocNode *gcMalloc = static_cast(rhs); + auto *gcMalloc = static_cast(rhs); classTyVec.push_back( static_cast(GlobalTables::GetTypeTable().GetTypeFromTyIdx(gcMalloc->GetTyIdx()))); } else if (rhs != nullptr && rhs->GetOpCode() == OP_intrinsicopwithtype) { - IntrinsicopNode *intrinNode = static_cast(rhs); + auto *intrinNode = static_cast(rhs); if (intrinNode->GetIntrinsic() == INTRN_JAVA_CONST_CLASS || intrinNode->GetIntrinsic() == INTRN_JAVA_INSTANCE_OF) { - MIRPtrType *pointerType = + auto *pointerType = static_cast(GlobalTables::GetTypeTable().GetTypeFromTyIdx(intrinNode->GetTyIdx())); MIRType *type = pointerType->GetPointedType(); if (type != nullptr && (type->GetKind() == kTypeClass || type->GetKind() == kTypeInterface)) { @@ -245,7 +248,7 @@ void MUIDReplacement::CollectImplicitUndefClassInfo(StmtNode &stmt) { } -void MUIDReplacement::GenericFuncDefTable() { +void MUIDReplacement::GenerateFuncDefTable() { // Use funcDefMap to make sure funcDefTab is sorted by an increasing order of MUID for (MIRFunction *mirFunc : funcDefSet) { MUID muid = GetMUID(mirFunc->GetName()); @@ -309,15 +312,15 @@ void MUIDReplacement::GenericFuncDefTable() { funcDefArray.push_back(std::make_pair(mirFunc->GetFuncSymbol(), muid)); // Create muidIdxTab to store the index in funcDefTab and funcDefMuidTab // With muidIdxTab, we can use index sorted by muid to find the index in funcDefTab and funcDefMuidTab - // Use the left 1 bit of muidIdx to mark wether the function is weak or not. 1 is for weak + // Use the left 1 bit of muidIdx to mark whether the function is weak or not. 1 is for weak uint32 muidIdx = iter->second.second; constexpr uint32 weakFuncFlag = 0x80000000; // 0b10000000 00000000 00000000 00000000 - MIRIntConst *indexConst = static_cast(muidIdxTabConst->GetConstVecItem(muidIdx)); + auto *indexConst = static_cast(muidIdxTabConst->GetConstVecItem(muidIdx)); uint32 tempIdx = (indexConst->GetValue() & weakFuncFlag) | idx; indexConst = GetMIRModule().GetMemPool()->New(tempIdx, *GlobalTables::GetTypeTable().GetUInt32()); muidIdxTabConst->SetConstVecItem(muidIdx, *indexConst); if (reflectionList.find(mirFunc->GetName()) != reflectionList.end()) { - MIRIntConst *tempConst = static_cast(muidIdxTabConst->GetConstVecItem(idx)); + auto *tempConst = static_cast(muidIdxTabConst->GetConstVecItem(idx)); tempIdx = weakFuncFlag | tempConst->GetValue(); tempConst = GetMIRModule().GetMemPool()->New(tempIdx, *GlobalTables::GetTypeTable().GetUInt32()); muidIdxTabConst->SetConstVecItem(idx, *tempConst); @@ -386,7 +389,7 @@ void MUIDReplacement::GenericFuncDefTable() { } } -void MUIDReplacement::GenericDataDefTable() { +void MUIDReplacement::GenerateDataDefTable() { // Use dataDefMap to make sure dataDefTab is sorted by an increasing order of MUID for (MIRSymbol *mirSymbol : dataDefSet) { MUID muid = GetMUID(mirSymbol->GetName()); @@ -458,7 +461,7 @@ void MUIDReplacement::GenericDataDefTable() { } } -void MUIDReplacement::GenericUnifiedUndefTable() { +void MUIDReplacement::GenerateUnifiedUndefTable() { for (MIRFunction *mirFunc : funcUndefSet) { MUID muid = GetMUID(mirFunc->GetName()); CHECK_FATAL(funcUndefMap.find(muid) == funcUndefMap.end(), "MUID has been used before, possible collision"); @@ -582,12 +585,12 @@ void MUIDReplacement::GenericUnifiedUndefTable() { } // RangeTable stores begin and end of all MUID tables -void MUIDReplacement::GenericRangeTable() { +void MUIDReplacement::GenerateRangeTable() { FieldVector parentFields; FieldVector fields; GlobalTables::GetTypeTable().PushIntoFieldVector(fields, "tabBegin", *GlobalTables::GetTypeTable().GetVoidPtr()); GlobalTables::GetTypeTable().PushIntoFieldVector(fields, "tabEnd", *GlobalTables::GetTypeTable().GetVoidPtr()); - MIRStructType &rangeTabEntryType = static_cast( + auto &rangeTabEntryType = static_cast( *GlobalTables::GetTypeTable().GetOrCreateStructType("MUIDRangeTabEntry", fields, parentFields, GetMIRModule())); MIRArrayType &rangeArrayType = *GlobalTables::GetTypeTable().GetOrCreateArrayType(rangeTabEntryType, 0); MIRAggConst *rangeTabConst = GetMIRModule().GetMemPool()->New(GetMIRModule(), rangeArrayType); @@ -603,7 +606,7 @@ void MUIDReplacement::GenericRangeTable() { builder->AddIntFieldConst(rangeTabEntryType, *entryConst, fieldID++, mplMd5.data.words[1]); rangeTabConst->PushBack(entryConst); } - for (uint32 i = RangeIdx::kVtab; i < RangeIdx::kMaxNum; i++) { + for (uint32 i = RangeIdx::kVtab; i < RangeIdx::kMaxNum; ++i) { // Use an integer to mark which entry is for which table MIRAggConst *entryConst = GetMIRModule().GetMemPool()->New(GetMIRModule(), rangeTabEntryType); uint32 fieldID = 1; @@ -693,7 +696,6 @@ void MUIDReplacement::ClearVtabItab(const std::string &name) { return; } static_cast(oldConst)->GetConstVec().clear(); - return; } void MUIDReplacement::ReplaceFuncTable(const std::string &name) { @@ -712,7 +714,7 @@ void MUIDReplacement::ReplaceFuncTable(const std::string &name) { for (auto *&oldTabEntry : static_cast(oldConst)->GetConstVec()) { if (oldTabEntry->GetKind() == kConstAggConst) { auto *aggrC = static_cast(oldTabEntry); - for (size_t i = 0; i < aggrC->GetConstVec().size(); i++) { + for (size_t i = 0; i < aggrC->GetConstVec().size(); ++i) { ReplaceAddroffuncConst(aggrC->GetConstVecItem(i), i + 1, isVtab); } } else if (oldTabEntry->GetKind() == kConstAddrofFunc) { @@ -728,7 +730,6 @@ void MUIDReplacement::ReplaceAddroffuncConst(MIRConst *&entry, uint32 fieldID, b MIRType &voidType = *GlobalTables::GetTypeTable().GetVoidPtr(); auto *funcAddr = static_cast(entry); MIRFunction *func = GlobalTables::GetFunctionTable().GetFunctionFromPuidx(funcAddr->GetValue()); - ASSERT(func != nullptr, "Invalid MIRFunction"); uint64 offset = 0; MIRIntConst *constNode = nullptr; constexpr uint64 reservedBits = 2u; @@ -771,7 +772,7 @@ void MUIDReplacement::ReplaceDataTable(const std::string &name) { ASSERT(oldTabEntry != nullptr, "null ptr check!"); if (oldTabEntry->GetKind() == kConstAggConst) { auto *aggrC = static_cast(oldTabEntry); - for (size_t i = 0; i < aggrC->GetConstVec().size(); i++) { + for (size_t i = 0; i < aggrC->GetConstVec().size(); ++i) { ASSERT(aggrC->GetConstVecItem(i) != nullptr, "null ptr check!"); ReplaceAddrofConst(aggrC->GetConstVecItem(i)); aggrC->GetConstVecItem(i)->SetFieldID(i + 1); @@ -829,7 +830,7 @@ void MUIDReplacement::ReplaceDirectInvokeOrAddroffunc(MIRFunction ¤tFunc, CHECK_FATAL(false, "unexpected stmt type in ReplaceDirectInvokeOrAddroffunc"); } MIRFunction *calleeFunc = GlobalTables::GetFunctionTable().GetFunctionFromPuidx(puidx); - if (calleeFunc == nullptr || (!calleeFunc->IsJava() && calleeFunc->GetBaseClassName().empty())) { + if (!calleeFunc->IsJava() && calleeFunc->GetBaseClassName().empty()) { return; } // Load the function pointer @@ -887,7 +888,7 @@ void MUIDReplacement::ReplaceDirectInvokeOrAddroffunc(MIRFunction ¤tFunc, icallNode->SetNumOpnds(callNode->GetNumOpnds() + 1); icallNode->GetNopnd().resize(icallNode->GetNumOpnds()); icallNode->SetNOpndAt(0, readFuncPtr); - for (size_t i = 1; i < icallNode->GetNopndSize(); i++) { + for (size_t i = 1; i < icallNode->GetNopndSize(); ++i) { icallNode->SetNOpndAt(i, callNode->GetNopnd()[i - 1]->CloneTree(GetMIRModule().GetCurFuncCodeMPAllocator())); } icallNode->SetRetTyIdx(calleeFunc->GetReturnTyIdx()); @@ -962,27 +963,27 @@ void MUIDReplacement::ReplaceDreadStmt(MIRFunction *currentFunc, StmtNode *stmt) } switch (stmt->GetOpCode()) { case OP_if: { - auto *inode = static_cast(stmt); - inode->SetOpnd(ReplaceDreadExpr(currentFunc, stmt, inode->Opnd(0)), 0); - ReplaceDreadStmt(currentFunc, inode->GetThenPart()); - ReplaceDreadStmt(currentFunc, inode->GetElsePart()); + auto *iNode = static_cast(stmt); + iNode->SetOpnd(ReplaceDreadExpr(currentFunc, stmt, iNode->Opnd(0)), 0); + ReplaceDreadStmt(currentFunc, iNode->GetThenPart()); + ReplaceDreadStmt(currentFunc, iNode->GetElsePart()); break; } case OP_while: { - auto *wnode = static_cast(stmt); - wnode->SetOpnd(ReplaceDreadExpr(currentFunc, stmt, wnode->Opnd(0)), 0); - ReplaceDreadStmt(currentFunc, wnode->GetBody()); + auto *wNode = static_cast(stmt); + wNode->SetOpnd(ReplaceDreadExpr(currentFunc, stmt, wNode->Opnd(0)), 0); + ReplaceDreadStmt(currentFunc, wNode->GetBody()); break; } case OP_block: { - auto *bnode = static_cast(stmt); - for (auto &s : bnode->GetStmtNodes()) { + auto *bNode = static_cast(stmt); + for (auto &s : bNode->GetStmtNodes()) { ReplaceDreadStmt(currentFunc, &s); } break; } default: { - for (size_t i = 0; i < stmt->NumOpnds(); i++) { + for (size_t i = 0; i < stmt->NumOpnds(); ++i) { stmt->SetOpnd(ReplaceDreadExpr(currentFunc, stmt, stmt->Opnd(i)), i); } break; @@ -1007,7 +1008,7 @@ BaseNode *MUIDReplacement::ReplaceDreadExpr(MIRFunction *currentFunc, StmtNode * } case OP_select: { topnds = static_cast(expr); - for (i = 0; i < topnds->NumOpnds(); i++) { + for (i = 0; i < topnds->NumOpnds(); ++i) { topnds->SetOpnd(ReplaceDreadExpr(currentFunc, stmt, topnds->Opnd(i)), i); } break; @@ -1018,11 +1019,11 @@ BaseNode *MUIDReplacement::ReplaceDreadExpr(MIRFunction *currentFunc, StmtNode * uOpnd->SetOpnd(ReplaceDreadExpr(currentFunc, stmt, uOpnd->Opnd()), i); } else if (expr->IsBinaryNode()) { bopnds = static_cast(expr); - for (i = 0; i < bopnds->NumOpnds(); i++) { + for (i = 0; i < bopnds->NumOpnds(); ++i) { bopnds->SetOpnd(ReplaceDreadExpr(currentFunc, stmt, bopnds->GetBOpnd(i)), i); } } else { - for (i = 0; i < expr->NumOpnds(); i++) { + for (i = 0; i < expr->NumOpnds(); ++i) { expr->SetOpnd(ReplaceDreadExpr(currentFunc, stmt, expr->Opnd(i)), i); } } @@ -1101,7 +1102,7 @@ void MUIDReplacement::ProcessFunc(MIRFunction *func) { } // Create GC Root -void MUIDReplacement::GenericGlobalRootList() { +void MUIDReplacement::GenerateGlobalRootList() { MIRType *voidType = GlobalTables::GetTypeTable().GetVoidPtr(); MIRArrayType *arrayType = GlobalTables::GetTypeTable().GetOrCreateArrayType(*voidType, 0); MIRAggConst *newConst = GetMIRModule().GetMemPool()->New(GetMIRModule(), *arrayType); @@ -1144,7 +1145,7 @@ void MUIDReplacement::GenericGlobalRootList() { } } -void MUIDReplacement::GenericCompilerVersionNum() { +void MUIDReplacement::GenerateCompilerVersionNum() { MIRType *ptrType = GlobalTables::GetTypeTable().GetVoidPtr(); MIRArrayType &arrayType = *GlobalTables::GetTypeTable().GetOrCreateArrayType(*ptrType, 0); MIRAggConst *newConst = GetMIRModule().GetMemPool()->New(GetMIRModule(), arrayType); @@ -1158,15 +1159,15 @@ void MUIDReplacement::GenericCompilerVersionNum() { versionNum->SetKonst(newConst); } -void MUIDReplacement::GenericTables() { - GenericGlobalRootList(); +void MUIDReplacement::GenerateTables() { + GenerateGlobalRootList(); CollectFuncAndDataFromKlasses(); CollectFuncAndDataFromGlobalTab(); CollectFuncAndDataFromFuncList(); - GenericFuncDefTable(); - GenericDataDefTable(); - GenericUnifiedUndefTable(); - GenericRangeTable(); + GenerateFuncDefTable(); + GenerateDataDefTable(); + GenerateUnifiedUndefTable(); + GenerateRangeTable(); // When MapleLinker is enabled, MUIDReplacement becomes the last // phase that updates the reflection string table, thus the table // is emitted here. @@ -1179,6 +1180,6 @@ void MUIDReplacement::GenericTables() { ReplaceFuncTable(ITAB_CONFLICT_PREFIX_STR + klass->GetKlassName()); } ReplaceDataTable(NameMangler::kGcRootList); - GenericCompilerVersionNum(); + GenerateCompilerVersionNum(); } } // namespace maple diff --git a/src/mpl2mpl/src/native_stub_func.cpp b/src/mpl2mpl/src/native_stub_func.cpp index 35567ffdcdcbf89458a4ed1969b163c565b157c3..0f17c7e2baf1409d8fd150c2f01c585426e40c2c 100644 --- a/src/mpl2mpl/src/native_stub_func.cpp +++ b/src/mpl2mpl/src/native_stub_func.cpp @@ -25,20 +25,20 @@ // for the preparations before the actual native function is called, // including the parameter mapping, GC preparation, and so on. namespace maple { -GenericNativeStubFunc::GenericNativeStubFunc(MIRModule *mod, KlassHierarchy *kh, bool dump) +NativeStubFuncGeneration::NativeStubFuncGeneration(MIRModule *mod, KlassHierarchy *kh, bool dump) : FuncOptimizeImpl(mod, kh, dump) { MIRType *jstrType = GlobalTables::GetTypeTable().GetOrCreateClassType( NameMangler::GetInternalNameLiteral(NameMangler::kJavaLangStringStr), *mod); - MIRPtrType *jstrPointerType = + auto *jstrPointerType = static_cast(GlobalTables::GetTypeTable().GetOrCreatePointerType(*jstrType, PTY_ref)); jstrPointerTypeIdx = jstrPointerType->GetTypeIndex(); - GenericRegTableEntryType(); - GenericHelperFuncDecl(); - GenericRegFuncTabEntryType(); + GenerateRegTableEntryType(); + GenerateHelperFuncDecl(); + GenerateRegFuncTabEntryType(); InitStaticBindingMethodList(); } -MIRFunction &GenericNativeStubFunc::GetOrCreateDefaultNativeFunc(MIRFunction &stubFunc) { +MIRFunction &NativeStubFuncGeneration::GetOrCreateDefaultNativeFunc(MIRFunction &stubFunc) { // If only support dynamic binding , we won't stub any weak symbols if (Options::regNativeDynamicOnly && !(IsStaticBindingListMode() && IsStaticBindingMethod(stubFunc.GetName()))) { return stubFunc; @@ -77,7 +77,7 @@ MIRFunction &GenericNativeStubFunc::GetOrCreateDefaultNativeFunc(MIRFunction &st // fatal message parameter std::string nativeSymbolName = stubFunc.GetName().c_str(); UStrIdx strIdx = GlobalTables::GetUStrTable().GetOrCreateStrIdxFromName(nativeSymbolName); - ConststrNode *signatureNode = nativeFunc->GetCodeMempool()->New(strIdx); + auto *signatureNode = nativeFunc->GetCodeMempool()->New(strIdx); signatureNode->SetPrimType(PTY_ptr); MapleVector args(builder->GetCurrentFuncCodeMpAllocator()->Adapter()); args.push_back(signatureNode); @@ -102,23 +102,20 @@ MIRFunction &GenericNativeStubFunc::GetOrCreateDefaultNativeFunc(MIRFunction &st // // in the end and before return to Java frame, check pending exception // callassigned &MCC_CheckThrowPendingException () {} -void GenericNativeStubFunc::ProcessFunc(MIRFunction *func) { +void NativeStubFuncGeneration::ProcessFunc(MIRFunction *func) { // FUNCATTR_bridge for function to exclude ASSERT(func != nullptr, "null ptr check!"); - if ((!func->GetAttr(FUNCATTR_native) && !func->GetAttr(FUNCATTR_fast_native) && - !func->GetAttr(FUNCATTR_critical_native)) || - func->GetAttr(FUNCATTR_bridge)) { + if (func->GetBody() == nullptr || func->GetAttr(FUNCATTR_bridge) || + (!func->GetAttr(FUNCATTR_native) && + !func->GetAttr(FUNCATTR_fast_native) && + !func->GetAttr(FUNCATTR_critical_native))) { return; } SetCurrentFunction(*func); if (trace) { LogInfo::MapleLogger(kLlErr) << "Create stub func: " << func->GetName() << "\n"; } - if (func->GetBody()) { - func->GetBody()->ResetBlock(); - } else { - func->SetBody(func->GetCodeMempool()->New()); - } + func->GetBody()->ResetBlock(); NativeFuncProperty funcProperty; bool needNativeCall = (!func->GetAttr(FUNCATTR_critical_native)) && (funcProperty.jniType == kJniTypeNormal); bool needCheckThrowPendingExceptionFunc = needNativeCall; @@ -204,7 +201,7 @@ void GenericNativeStubFunc::ProcessFunc(MIRFunction *func) { allocCallArgs.push_back(builder->CreateExprAddrof(0, *classObjSymbol)); } } - for (uint32 i = 0; i < func->GetFormalCount(); i++) { + for (uint32 i = 0; i < func->GetFormalCount(); ++i) { auto argSt = func->GetFormal(i); BaseNode *argExpr = nullptr; if (argSt->GetSKind() == kStPreg) { @@ -223,10 +220,10 @@ void GenericNativeStubFunc::ProcessFunc(MIRFunction *func) { MIRFunction &nativeFunc = GetOrCreateDefaultNativeFunc(*func); if (Options::regNativeFunc) { - GenericRegisteredNativeFuncCall(*func, nativeFunc, allocCallArgs, stubFuncRet, needNativeCall, *preFuncCall, - *postFuncCall); + GenerateRegisteredNativeFuncCall(*func, nativeFunc, allocCallArgs, stubFuncRet, needNativeCall, *preFuncCall, + *postFuncCall); } else if (Options::nativeWrapper) { - GenericNativeWrapperFuncCall(*func, nativeFunc, allocCallArgs, stubFuncRet); + GenerateNativeWrapperFuncCall(*func, nativeFunc, allocCallArgs, stubFuncRet); } else { CallNode *callAssign = builder->CreateStmtCallAssigned(nativeFunc.GetPuidx(), allocCallArgs, stubFuncRet, OP_callassigned); @@ -286,7 +283,7 @@ void GenericNativeStubFunc::ProcessFunc(MIRFunction *func) { } } -void GenericNativeStubFunc::GenericRegFuncTabEntryType() { +void NativeStubFuncGeneration::GenerateRegFuncTabEntryType() { MIRArrayType &arrayType = *GlobalTables::GetTypeTable().GetOrCreateArrayType(*GlobalTables::GetTypeTable().GetVoidPtr(), 0); regFuncTabConst = GetMIRModule().GetMemPool()->New(GetMIRModule(), arrayType); @@ -295,23 +292,23 @@ void GenericNativeStubFunc::GenericRegFuncTabEntryType() { kScGlobal, nullptr, kScopeGlobal); } -void GenericNativeStubFunc::GenericRegFuncTabEntry() { +void NativeStubFuncGeneration::GenerateRegFuncTabEntry() { constexpr int locIdxShift = 4; constexpr uint64 locIdxMask = 0xFF00000000000000; uint64 locIdx = regFuncTabConst->GetConstVec().size(); - MIRConst *newConst = + auto *newConst = GetMIRModule().GetMemPool()->New(static_cast((locIdx << locIdxShift) | locIdxMask), *GlobalTables::GetTypeTable().GetVoidPtr()); regFuncTabConst->PushBack(newConst); } -void GenericNativeStubFunc::GenericRegFuncTab() { - MIRArrayType &arrayType = static_cast(regFuncTabConst->GetType()); +void NativeStubFuncGeneration::GenerateRegFuncTab() { + auto &arrayType = static_cast(regFuncTabConst->GetType()); arrayType.SetSizeArrayItem(0, regFuncTabConst->GetConstVec().size()); regFuncSymbol->SetKonst(regFuncTabConst); } -void GenericNativeStubFunc::GenericRegTabEntry(const MIRFunction &func) { +void NativeStubFuncGeneration::GenerateRegTabEntry(const MIRFunction &func) { std::string tmp = func.GetName(); tmp = NameMangler::DecodeName(tmp); std::string base = func.GetBaseClassName(); @@ -322,21 +319,21 @@ void GenericNativeStubFunc::GenericRegTabEntry(const MIRFunction &func) { uint32 nameIdx = ReflectionAnalysis::FindOrInsertRepeatString(tmp, true); // always used uint32 classIdx = ReflectionAnalysis::FindOrInsertRepeatString(base, true); // always used // Using MIRIntConst instead of MIRStruct for RegTable. - MIRConst *baseConst = + auto *baseConst = GetMIRModule().GetMemPool()->New(classIdx, *GlobalTables::GetTypeTable().GetVoidPtr()); regTableConst->PushBack(baseConst); - MIRConst *newConst = GetMIRModule().GetMemPool()->New(nameIdx, - *GlobalTables::GetTypeTable().GetVoidPtr()); + auto *newConst = GetMIRModule().GetMemPool()->New(nameIdx, + *GlobalTables::GetTypeTable().GetVoidPtr()); regTableConst->PushBack(newConst); } -void GenericNativeStubFunc::GenericRegisteredNativeFuncCall(MIRFunction &func, const MIRFunction &nativeFunc, - MapleVector &args, const MIRSymbol *ret, - bool needNativeCall, CallNode &preNativeFuncCall, - CallNode &postNativeFuncCall) { +void NativeStubFuncGeneration::GenerateRegisteredNativeFuncCall(MIRFunction &func, const MIRFunction &nativeFunc, + MapleVector &args, const MIRSymbol *ret, + bool needNativeCall, CallNode &preNativeFuncCall, + CallNode &postNativeFuncCall) { // Generate registration table entry. - GenericRegTabEntry(func); - GenericRegFuncTabEntry(); + GenerateRegTabEntry(func); + GenerateRegFuncTabEntry(); CallReturnVector nrets(func.GetCodeMempoolAllocator().Adapter()); if (ret != nullptr) { CHECK_FATAL((ret->GetStorageClass() == kScAuto || ret->GetStorageClass() == kScFormal || @@ -345,7 +342,7 @@ void GenericNativeStubFunc::GenericRegisteredNativeFuncCall(MIRFunction &func, c nrets.push_back(CallReturnPair(ret->GetStIdx(), RegFieldPair(0, 0))); } size_t loc = regFuncTabConst->GetConstVec().size(); - MIRArrayType ®ArrayType = static_cast(regFuncTabConst->GetType()); + auto ®ArrayType = static_cast(regFuncTabConst->GetType()); AddrofNode *regFuncExpr = builder->CreateExprAddrof(0, *regFuncSymbol); ArrayNode *arrayExpr = builder->CreateExprArray(regArrayType, regFuncExpr, builder->CreateIntConst(loc - 1, PTY_i32)); arrayExpr->SetBoundsCheck(false); @@ -445,7 +442,7 @@ void GenericNativeStubFunc::GenericRegisteredNativeFuncCall(MIRFunction &func, c CallNode *callGetExceptFunc = builder->CreateStmtCallAssigned(MRTCheckThrowPendingExceptionFunc->GetPuidx(), opnds, nullptr, OP_callassigned); ifStmt->GetThenPart()->AddStatement(callGetExceptFunc); - BlockNode *elseBlock = func.GetCodeMempool()->New(); + auto *elseBlock = func.GetCodeMempool()->New(); ifStmt->SetElsePart(elseBlock); ifStmt->SetNumOpnds(kOperandNumTernary); wrapperCall = CreateNativeWrapperCallNode(func, readFuncPtr, args, ret); @@ -481,11 +478,11 @@ void GenericNativeStubFunc::GenericRegisteredNativeFuncCall(MIRFunction &func, c return; } // Without native wrapper - IcallNode *icall = func.GetCodeMempool()->New(GetMIRModule(), OP_icallassigned); + auto *icall = func.GetCodeMempool()->New(GetMIRModule(), OP_icallassigned); icall->SetNumOpnds(args.size() + 1); icall->GetNopnd().resize(icall->GetNumOpnds()); icall->SetReturnVec(nrets); - for (size_t i = 1; i < icall->GetNopndSize(); i++) { + for (size_t i = 1; i < icall->GetNopndSize(); ++i) { icall->SetNOpndAt(i, args[i - 1]->CloneTree(GetMIRModule().GetCurFuncCodeMPAllocator())); } icall->SetNOpndAt(0, readFuncPtr); @@ -507,8 +504,8 @@ void GenericNativeStubFunc::GenericRegisteredNativeFuncCall(MIRFunction &func, c func.GetBody()->AddStatement(icall); } -StmtNode *GenericNativeStubFunc::CreateNativeWrapperCallNode(MIRFunction &func, BaseNode *funcPtr, - MapleVector &args, const MIRSymbol *ret) { +StmtNode *NativeStubFuncGeneration::CreateNativeWrapperCallNode(MIRFunction &func, BaseNode *funcPtr, + MapleVector &args, const MIRSymbol *ret) { MIRFunction *wrapperFunc = nullptr; MapleVector wrapperArgs(func.GetCodeMPAllocator().Adapter()); // The first arg is the natvie function pointer. @@ -519,7 +516,7 @@ StmtNode *GenericNativeStubFunc::CreateNativeWrapperCallNode(MIRFunction &func, // if num_of_args < 8 constexpr size_t numOfArgs = 8; if (func.GetAttr(FUNCATTR_critical_native) && args.size() < numOfArgs) { - IcallNode *icall = func.GetCodeMempool()->New(GetMIRModule(), OP_icallassigned); + auto *icall = func.GetCodeMempool()->New(GetMIRModule(), OP_icallassigned); CallReturnVector nrets(func.GetCodeMempoolAllocator().Adapter()); if (ret != nullptr) { CHECK_FATAL((ret->GetStorageClass() == kScAuto || ret->GetStorageClass() == kScFormal || @@ -530,7 +527,7 @@ StmtNode *GenericNativeStubFunc::CreateNativeWrapperCallNode(MIRFunction &func, icall->SetNumOpnds(args.size() + 1); icall->GetNopnd().resize(icall->GetNumOpnds()); icall->SetReturnVec(nrets); - for (size_t i = 1; i < icall->GetNopndSize(); i++) { + for (size_t i = 1; i < icall->GetNopndSize(); ++i) { icall->SetNOpndAt(i, args[i - 1]->CloneTree(GetMIRModule().GetCurFuncCodeMPAllocator())); } icall->SetNOpndAt(0, funcPtr); @@ -558,20 +555,20 @@ StmtNode *GenericNativeStubFunc::CreateNativeWrapperCallNode(MIRFunction &func, } } -void GenericNativeStubFunc::GenericNativeWrapperFuncCall(MIRFunction &func, const MIRFunction &nativeFunc, - MapleVector &args, const MIRSymbol *ret) { +void NativeStubFuncGeneration::GenerateNativeWrapperFuncCall(MIRFunction &func, const MIRFunction &nativeFunc, + MapleVector &args, const MIRSymbol *ret) { func.GetBody()->AddStatement( CreateNativeWrapperCallNode(func, builder->CreateExprAddroffunc(nativeFunc.GetPuidx()), args, ret)); } -void GenericNativeStubFunc::GenericRegTableEntryType() { +void NativeStubFuncGeneration::GenerateRegTableEntryType() { // Use MIRIntType instead of MIRStructType in RegTableEntry MIRArrayType &arrayType = *GlobalTables::GetTypeTable().GetOrCreateArrayType(*GlobalTables::GetTypeTable().GetVoidPtr(), 0); regTableConst = GetMIRModule().GetMemPool()->New(GetMIRModule(), arrayType); } -void GenericNativeStubFunc::GenericHelperFuncDecl() { +void NativeStubFuncGeneration::GenerateHelperFuncDecl() { MIRType *voidType = GlobalTables::GetTypeTable().GetVoid(); MIRType *voidPointerType = GlobalTables::GetTypeTable().GetVoidPtr(); MIRType *refType = GlobalTables::GetTypeTable().GetRef(); @@ -579,27 +576,29 @@ void GenericNativeStubFunc::GenericHelperFuncDecl() { MRTCheckThrowPendingExceptionFunc = builder->GetOrCreateFunction(kCheckThrowPendingExceptionFunc, voidType->GetTypeIndex()); CHECK_FATAL(MRTCheckThrowPendingExceptionFunc != nullptr, - "MRTCheckThrowPendingExceptionFunc is null in GenericNativeStubFunc::GenericHelperFuncDecl"); + "MRTCheckThrowPendingExceptionFunc is null in NativeStubFuncGeneration::GenerateHelperFuncDecl"); MRTCheckThrowPendingExceptionFunc->SetAttr(FUNCATTR_nosideeffect); MRTCheckThrowPendingExceptionFunc->SetBody(nullptr); // MRT_PreNativeCall ArgVector preArgs(GetMIRModule().GetMPAllocator().Adapter()); preArgs.push_back(ArgPair("caller", refType)); MRTPreNativeFunc = builder->CreateFunction(kPreNativeFunc, *voidPointerType, preArgs); - CHECK_FATAL(MRTPreNativeFunc != nullptr, "MRTPreNativeFunc is null in GenericNativeStubFunc::GenericHelperFuncDecl"); + CHECK_FATAL(MRTPreNativeFunc != nullptr, + "MRTPreNativeFunc is null in NativeStubFuncGeneration::GenerateHelperFuncDecl"); MRTPreNativeFunc->SetBody(nullptr); // MRT_PostNativeCall ArgVector postArgs(GetMIRModule().GetMPAllocator().Adapter()); postArgs.push_back(ArgPair("env", voidPointerType)); MRTPostNativeFunc = builder->CreateFunction(kPostNativeFunc, *voidType, postArgs); CHECK_FATAL(MRTPostNativeFunc != nullptr, - "MRTPostNativeFunc is null in GenericNativeStubFunc::GenericHelperFuncDecl"); + "MRTPostNativeFunc is null in NativeStubFuncGeneration::GenerateHelperFuncDecl"); MRTPostNativeFunc->SetBody(nullptr); // MRT_DecodeReference ArgVector decodeArgs(GetMIRModule().GetMPAllocator().Adapter()); decodeArgs.push_back(ArgPair("obj", refType)); MRTDecodeRefFunc = builder->CreateFunction(kDecodeRefFunc, *refType, decodeArgs); - CHECK_FATAL(MRTDecodeRefFunc != nullptr, "MRTDecodeRefFunc is null in GenericNativeStubFunc::GenericHelperFuncDecl"); + CHECK_FATAL(MRTDecodeRefFunc != nullptr, + "MRTDecodeRefFunc is null in NativeStubFuncGeneration::GenerateHelperFuncDecl"); MRTDecodeRefFunc->SetAttr(FUNCATTR_nosideeffect); MRTDecodeRefFunc->SetBody(nullptr); // MCC_CallFastNative @@ -607,13 +606,13 @@ void GenericNativeStubFunc::GenericHelperFuncDecl() { callArgs.push_back(ArgPair("func", voidPointerType)); MRTCallFastNativeFunc = builder->CreateFunction(kCallFastNativeFunc, *voidPointerType, callArgs); CHECK_FATAL(MRTCallFastNativeFunc != nullptr, - "MRTCallFastNativeFunc is null in GenericNativeStubFunc::GenericHelperFuncDecl"); + "MRTCallFastNativeFunc is null in NativeStubFuncGeneration::GenerateHelperFuncDecl"); MRTCallFastNativeFunc->SetBody(nullptr); // MCC_CallSlowNative - for (int i = 0; i < kSlownativeFuncnum; i++) { + for (int i = 0; i < kSlownativeFuncnum; ++i) { MRTCallSlowNativeFunc[i] = builder->CreateFunction(callSlowNativeFuncs[i], *voidPointerType, callArgs); CHECK_FATAL(MRTCallSlowNativeFunc[i] != nullptr, - "MRTCallSlowNativeFunc is null in GenericNativeStubFunc::GenericHelperFuncDecl"); + "MRTCallSlowNativeFunc is null in NativeStubFuncGeneration::GenerateHelperFuncDecl"); MRTCallSlowNativeFunc[i]->SetBody(nullptr); } // MCC_CallFastNativeExt @@ -621,24 +620,24 @@ void GenericNativeStubFunc::GenericHelperFuncDecl() { callExtArgs.push_back(ArgPair("func", voidPointerType)); MRTCallFastNativeExtFunc = builder->CreateFunction(kCallFastNativeExtFunc, *voidPointerType, callExtArgs); CHECK_FATAL(MRTCallFastNativeExtFunc != nullptr, - "MRTCallFastNativeExtFunc is null in GenericNativeStubFunc::GenericHelperFuncDecl"); + "MRTCallFastNativeExtFunc is null in NativeStubFuncGeneration::GenerateHelperFuncDecl"); MRTCallFastNativeExtFunc->SetBody(nullptr); // MCC_CallSlowNativeExt MRTCallSlowNativeExtFunc = builder->CreateFunction(kCallSlowNativeExtFunc, *voidPointerType, callExtArgs); CHECK_FATAL(MRTCallSlowNativeExtFunc != nullptr, - "MRTCallSlowNativeExtFunc is null in GenericNativeStubFunc::GenericHelperFuncDecl"); + "MRTCallSlowNativeExtFunc is null in NativeStubFuncGeneration::GenerateHelperFuncDecl"); MRTCallSlowNativeExtFunc->SetBody(nullptr); // MCC_SetReliableUnwindContext MCCSetReliableUnwindContextFunc = builder->GetOrCreateFunction(kSetReliableUnwindContextFunc, voidType->GetTypeIndex()); CHECK_FATAL(MCCSetReliableUnwindContextFunc != nullptr, - "MCCSetReliableUnwindContextFunc is null in GenericNativeStubFunc::GenericHelperFuncDecl"); + "MCCSetReliableUnwindContextFunc is null in NativeStubFuncGeneration::GenerateHelperFuncDecl"); MCCSetReliableUnwindContextFunc->SetAttr(FUNCATTR_nosideeffect); MCCSetReliableUnwindContextFunc->SetBody(nullptr); } -void GenericNativeStubFunc::GenericRegTable() { - MIRArrayType &arrayType = static_cast(regTableConst->GetType()); +void NativeStubFuncGeneration::GenerateRegTable() { + auto &arrayType = static_cast(regTableConst->GetType()); arrayType.SetSizeArrayItem(0, regTableConst->GetConstVec().size()); std::string regJniTabName = NameMangler::kRegJNITabPrefixStr + GetMIRModule().GetFileNameAsPostfix(); MIRSymbol *regJNISt = builder->CreateSymbol(regTableConst->GetType().GetTypeIndex(), regJniTabName.c_str(), kStVar, @@ -646,11 +645,11 @@ void GenericNativeStubFunc::GenericRegTable() { regJNISt->SetKonst(regTableConst); } -bool GenericNativeStubFunc::IsStaticBindingListMode() const { +bool NativeStubFuncGeneration::IsStaticBindingListMode() const { return (Options::staticBindingList != "" && Options::staticBindingList.length()); } -void GenericNativeStubFunc::InitStaticBindingMethodList() { +void NativeStubFuncGeneration::InitStaticBindingMethodList() { if (!IsStaticBindingListMode()) { return; } @@ -661,20 +660,25 @@ void GenericNativeStubFunc::InitStaticBindingMethodList() { } } -bool GenericNativeStubFunc::IsStaticBindingMethod(const std::string &methodName) const { +bool NativeStubFuncGeneration::IsStaticBindingMethod(const std::string &methodName) const { return (staticBindingMethodsSet.find(NameMangler::NativeJavaName(methodName.c_str())) != staticBindingMethodsSet.end()); } -void GenericNativeStubFunc::Finish() { +void NativeStubFuncGeneration::Finish() { if (!regTableConst->GetConstVec().empty()) { - GenericRegTable(); - GenericRegFuncTab(); + GenerateRegTable(); + GenerateRegFuncTab(); } if (!Options::mapleLinker) { // If use maplelinker, we postpone this generation to MUIDReplacement ReflectionAnalysis::GenStrTab(GetMIRModule()); } } + +const std::string NativeStubFuncGeneration::callSlowNativeFuncs[kSlownativeFuncnum] = { + "MCC_CallSlowNative0", "MCC_CallSlowNative1", "MCC_CallSlowNative2", "MCC_CallSlowNative3", "MCC_CallSlowNative4", + "MCC_CallSlowNative5", "MCC_CallSlowNative6", "MCC_CallSlowNative7", "MCC_CallSlowNative8" +}; } // namespace maple diff --git a/src/mpl2mpl/src/reflection_analysis.cpp b/src/mpl2mpl/src/reflection_analysis.cpp index ad3c881b2bd186ba925e256c14d265d445b472fd..68f0412fb81a2c7ed306dcb134fc5173afc2ebfd 100644 --- a/src/mpl2mpl/src/reflection_analysis.cpp +++ b/src/mpl2mpl/src/reflection_analysis.cpp @@ -28,6 +28,102 @@ #include "string_utils.h" #include "metadata_layout.h" +namespace { +using namespace maple; +// If needed, we can make field type in two bits. +constexpr uint64 kMethodNotVirtual = 0x00000001; +constexpr uint64 kMethodFinalize = 0x00000002; +constexpr uint64 kMethodAbstract = 0x00000010; +constexpr uint64 kFieldReadOnly = 0x00000001; + +constexpr int kModPublic = 1; // 0x00000001 +constexpr int kModPrivate = 2; // 0x00000002 +constexpr int kModProtected = 3; // 0x00000004 +constexpr int kModStatic = 4; // 0x00000008 +constexpr int kModFinal = 5; // 0x00000010 +constexpr int kModSynchronized = 6; // 0x00000020 +constexpr int kModVolatile = 7; // 0x00000040 +constexpr int kModTransient = 8; // 0x00000080 +constexpr int kModNative = 9; // 0x00000100 +constexpr int kModAbstract = 11; // 0x00000400 +constexpr int kModStrict = 12; // 0x00000800 +constexpr int kModSynthetic = 13; // 0x00001000 +constexpr int kModConstructor = 17; // 0x00010000 +constexpr int kModDefault = 22; // 0x00400000 +constexpr int kModBridge = 7; // 0x00000040 +constexpr int kModVarargs = 8; // 0x00000080 +constexpr int kModEnum = 15; // 0x00004000 +constexpr int kModDeclaredSynchronized = 18; // 0x00020000 +constexpr int kModifierRCUnowned = 24; // 0x00800000 +constexpr int kModifierRCWeak = 25; // 0x01000000 +constexpr int kModifierHiddenApiGrey = 26; // 0x02000000 +constexpr int kModifierHiddenApiBlack = 27; // 0x04000000 + +// +1 is needed here because our field id starts with 0 pointing to the struct itself +constexpr uint32 kObjKlassFieldID = static_cast(ClassProperty::kShadow) + 1; +constexpr uint32 kMetaDataKlassFieldID = static_cast(ClassProperty::kShadow) + 1; +constexpr bool kRADebug = false; +constexpr uint32 kMethodFieldHashSize = 1022; +constexpr uint16 kHashConflictFlag = 1023; + +constexpr char kModStr[] = "mod"; +constexpr char kAddrStr[] = "addr"; +constexpr char kFlagStr[] = "flag"; +constexpr char kItabStr[] = "itab"; +constexpr char kVtabStr[] = "vtab"; +constexpr char kGctibStr[] = "gctib"; +constexpr char kIndexStr[] = "index"; +constexpr char kOffsetStr[] = "offset"; +constexpr char kShadowStr[] = "shadow"; +constexpr char kClassSuffix[] = "_3B"; +constexpr char kArgsizeStr[] = "argsize"; +constexpr char kIfieldsStr[] = "ifields"; +constexpr char kMethodsStr[] = "methods"; +constexpr char kMonitorStr[] = "monitor"; +constexpr char kObjsizeStr[] = "objsize"; +constexpr char kPaddingStr[] = "padding"; +constexpr char kTypeNameStr[] = "typeName"; +constexpr char kClassNameStr[] = "classname"; +constexpr char kFieldNameStr[] = "fieldname"; +constexpr char kAccessFlags[] = "accessFlags"; +constexpr char kAnnotationStr[] = "annotation"; +constexpr char kClinitAddrStr[] = "clinitAddr"; +constexpr char kMethodNameStr[] = "methodname"; +constexpr char kInitFuntionStr[] = "_3Cinit_3E"; +constexpr char kClassinforoStr[] = "classinforo"; +constexpr char kClassloaderStr[] = "classloader"; +constexpr char kLebPadding0Str[] = "lebPadding0"; +constexpr char kNumOfFieldsStr[] = "numoffields"; +constexpr char kClinitbridgeStr[] = "clinitbridge"; +constexpr char kNumOfMethodsStr[] = "numofmethods"; +constexpr char kSignatureNameStr[] = "signaturename"; +constexpr char kDeclaringclassStr[] = "declaringclass"; +constexpr char kFieldInfoTypeName[] = "__field_info__"; +constexpr char kINFOAccessFlags[] = "INFO_access_flags"; +constexpr char kSuperclassinfoStr[] = "superclassinfo"; +constexpr char kFieldOffsetDataStr[] = "fieldOffsetData"; +constexpr char kAnnotationvalueStr[] = "annotationvalue"; +constexpr char kMethodInfoTypeName[] = "__method_info__"; +constexpr char kClinitSuffixStr[] = "_3Cclinit_3E_7C_28_29V"; +constexpr char kJavaLangEnumStr[] = "Ljava_2Flang_2FEnum_3B"; +constexpr char kNumOfSuperclassesStr[] = "numofsuperclasses"; +constexpr char kClassMetadataRoTypeName[] = "__class_meta_ro__"; +constexpr char kMethodInVtabIndexStr[] = "method_in_vtab_index"; +constexpr char kClassStateInitializedStr[] = "classStateInitialized"; +constexpr char kSuperclassMetadataTypeName[] = "__superclass_meta__"; +constexpr char kFieldOffsetDataTypeName[] = "__fieldOffsetDataType__"; +constexpr char kFieldInfoCompactTypeName[] = "__field_info_compact__"; +constexpr char kMethodInfoCompactTypeName[] = "__method_info_compact__"; +constexpr char kSuperclassOrComponentclassStr[] = "superclass_or_componentclass"; +constexpr char kReflectionReferencePrefixStr[] = "Ljava_2Flang_2Fref_2FReference_3B"; +constexpr char kJavaLangAnnotationRetentionStr[] = "Ljava_2Flang_2Fannotation_2FRetention_3B"; +constexpr int kAnonymousClassIndex = 5; +constexpr char kAnonymousClassSuffix[] = "30"; +constexpr char kAnonymousClassPrefix[] = "Lark/annotation/InnerClass;"; +constexpr char kInnerClassPrefix[] = "Lark/annotation/EnclosingClass;"; +constexpr char kArkAnnotationEnclosingClassStr[] = "Lark_2Fannotation_2FEnclosingClass_3B"; +} // namespace + // Reflection metadata // This file is used to generate the classmetadata and classhashmetadata. // @@ -35,7 +131,6 @@ // and we generates these data according to the structure which defined in // the reflection_analysis.h && metadata_layout.h and then add their address // to mirbuilder. - namespace maple { std::string ReflectionAnalysis::strTab = std::string(1, '\0'); std::unordered_map ReflectionAnalysis::str2IdxMap; @@ -43,38 +138,40 @@ std::string ReflectionAnalysis::strTabStartHot = std::string(1, '\0'); std::string ReflectionAnalysis::strTabBothHot = std::string(1, '\0'); std::string ReflectionAnalysis::strTabRunHot = std::string(1, '\0'); bool ReflectionAnalysis::strTabInited = false; + int ReflectionAnalysis::GetDeflateStringIdx(const std::string &subStr) { return FindOrInsertReflectString("1!" + subStr); } uint32 ReflectionAnalysis::FirstFindOrInsertRepeatString(const std::string &str, bool isHot, uint8 hotType) { - uint32 index = 0; - constexpr uint32 lengthShift = 2u; auto it = ReflectionAnalysis::GetStr2IdxMap().find(str); if (it != ReflectionAnalysis::GetStr2IdxMap().end()) { - index = it->second; - } else { - if (isHot) { - if (hotType == kLayoutBootHot) { - uint32 length = ReflectionAnalysis::GetStrTabStartHot().length(); - index = (length << lengthShift) | (kLayoutBootHot + kCStringShift); // Use the LSB to indicate hotness. - ReflectionAnalysis::AddStrTabStartHot(str + '\0'); - } else if (hotType == kLayoutBothHot) { - uint32 length = ReflectionAnalysis::GetStrTabBothHot().length(); - index = (length << lengthShift) | (kLayoutBothHot + kCStringShift); // Use the LSB to indicate hotness. - ReflectionAnalysis::AddStrTabBothHot(str + '\0'); - } else { - uint32 length = ReflectionAnalysis::GetStrTabRunHot().length(); - index = (length << lengthShift) | (kLayoutRunHot + kCStringShift); // Use the LSB to indicate hotness. - ReflectionAnalysis::AddStrTabRunHot(str + '\0'); - } + return it->second; + } + + uint32 index = 0; + constexpr uint32 lengthShift = 2u; + if (isHot) { + if (hotType == kLayoutBootHot) { + uint32 length = ReflectionAnalysis::GetStrTabStartHot().length(); + index = (length << lengthShift) | (kLayoutBootHot + kCStringShift); // Use the LSB to indicate hotness. + ReflectionAnalysis::AddStrTabStartHot(str + '\0'); + } else if (hotType == kLayoutBothHot) { + uint32 length = ReflectionAnalysis::GetStrTabBothHot().length(); + index = (length << lengthShift) | (kLayoutBothHot + kCStringShift); // Use the LSB to indicate hotness. + ReflectionAnalysis::AddStrTabBothHot(str + '\0'); } else { - uint32 length = ReflectionAnalysis::GetStrTab().length(); - index = length << lengthShift; - ReflectionAnalysis::AddStrTab(str + '\0'); + uint32 length = ReflectionAnalysis::GetStrTabRunHot().length(); + index = (length << lengthShift) | (kLayoutRunHot + kCStringShift); // Use the LSB to indicate hotness. + ReflectionAnalysis::AddStrTabRunHot(str + '\0'); } - ReflectionAnalysis::SetStr2IdxMap(str, index); + } else { + uint32 length = ReflectionAnalysis::GetStrTab().length(); + index = length << lengthShift; + ReflectionAnalysis::AddStrTab(str + '\0'); } + ReflectionAnalysis::SetStr2IdxMap(str, index); + return index; } @@ -100,14 +197,14 @@ BaseNode *ReflectionAnalysis::GenClassInfoAddr(BaseNode *obj, MIRBuilder &builde if (objectType != nullptr && objectType->GetKind() != kTypeClassIncomplete) { classinfoAddress = builder.CreateExprIread(*GlobalTables::GetTypeTable().GetRef(), *GlobalTables::GetTypeTable().GetOrCreatePointerType(*objectType), - OBJ_KLASS_FIELDID, obj); + kObjKlassFieldID, obj); } else { // If java.lang.Object type is not defined, fall back to use the classinfo struct to retrieve the first field. auto *classMetadataType = static_cast( GlobalTables::GetTypeTable().GetTypeFromTyIdx(ReflectionAnalysis::classMetadataTyIdx)); classinfoAddress = builder.CreateExprIread(*GlobalTables::GetTypeTable().GetRef(), *GlobalTables::GetTypeTable().GetOrCreatePointerType(*classMetadataType), - METADATA_KLASS_FIELDID, obj); + kMetaDataKlassFieldID, obj); } return classinfoAddress; } @@ -122,32 +219,9 @@ TyIdx ReflectionAnalysis::fieldsInfoCompactTyIdx = TyIdx(0); TyIdx ReflectionAnalysis::superclassMetadataTyIdx = TyIdx(0); TyIdx ReflectionAnalysis::fieldOffsetDataTyIdx = TyIdx(0); TyIdx ReflectionAnalysis::invalidIdx = TyIdx(-1); -namespace { -constexpr int kModPublic = 1; // 0x00000001 -constexpr int kModPrivate = 2; // 0x00000002 -constexpr int kModProtected = 3; // 0x00000004 -constexpr int kModStatic = 4; // 0x00000008 -constexpr int kModFinal = 5; // 0x00000010 -constexpr int kModSynchronized = 6; // 0x00000020 -constexpr int kModVolatile = 7; // 0x00000040 -constexpr int kModTransient = 8; // 0x00000080 -constexpr int kModNative = 9; // 0x00000100 -constexpr int kModAbstract = 11; // 0x00000400 -constexpr int kModStrict = 12; // 0x00000800 -constexpr int kModSynthetic = 13; // 0x00001000 -constexpr int kModConstructor = 17; // 0x00010000 -constexpr int kModDefault = 22; // 0x00400000 -constexpr int kModBridge = 7; // 0x00000040 -constexpr int kModVarargs = 8; // 0x00000080 -constexpr int kModEnum = 15; // 0x00004000 -constexpr int kModDeclaredSynchronized = 18; // 0x00020000 -constexpr int kModifierRCUnowned = 24; // 0x00800000 -constexpr int kModifierRCWeak = 25; // 0x01000000 -} - -uint32 ReflectionAnalysis::GetMethodModifier(const Klass &klass, MIRFunction &func) { - FuncAttrs fa = func.GetFuncAttrs(); +uint32 ReflectionAnalysis::GetMethodModifier(const Klass &klass, const MIRFunction &func) const { + const FuncAttrs &fa = func.GetFuncAttrs(); uint32 mod = (static_cast(fa.GetAttr(FUNCATTR_public)) << (kModPublic - 1)) | (static_cast(fa.GetAttr(FUNCATTR_protected)) << (kModProtected - 1)) | @@ -162,7 +236,9 @@ uint32 ReflectionAnalysis::GetMethodModifier(const Klass &klass, MIRFunction &fu (static_cast(fa.GetAttr(FUNCATTR_synthetic)) << (kModSynthetic - 1)) | (static_cast(fa.GetAttr(FUNCATTR_bridge)) << (kModBridge - 1)) | (static_cast(fa.GetAttr(FUNCATTR_constructor)) << (kModConstructor - 1)) | - (static_cast(fa.GetAttr(FUNCATTR_varargs)) << (kModVarargs - 1)); + (static_cast(fa.GetAttr(FUNCATTR_varargs)) << (kModVarargs - 1)) | + (static_cast(fa.GetAttr(FUNCATTR_hiddenapigrey)) << (kModifierHiddenApiGrey - 1)) | + (static_cast(fa.GetAttr(FUNCATTR_hiddenapiblack)) << (kModifierHiddenApiBlack - 1)); // Add default attribute. if (klass.IsInterface() && !func.GetAttr(FUNCATTR_abstract) && !func.GetAttr(FUNCATTR_static)) { mod |= (1 << (kModDefault)); @@ -170,7 +246,7 @@ uint32 ReflectionAnalysis::GetMethodModifier(const Klass &klass, MIRFunction &fu return mod; } -uint32 GetFieldModifier(FieldAttrs fa) { +uint32 GetFieldModifier(const FieldAttrs &fa) { return (static_cast(fa.GetAttr(FLDATTR_public)) << (kModPublic - 1)) | (static_cast(fa.GetAttr(FLDATTR_protected)) << (kModProtected - 1)) | (static_cast(fa.GetAttr(FLDATTR_private)) << (kModPrivate - 1)) | @@ -181,16 +257,18 @@ uint32 GetFieldModifier(FieldAttrs fa) { (static_cast(fa.GetAttr(FLDATTR_synthetic)) << (kModSynthetic - 1)) | (static_cast(fa.GetAttr(FLDATTR_enum)) << (kModEnum - 1)) | (static_cast(fa.GetAttr(FLDATTR_rcunowned)) << (kModifierRCUnowned - 1)) | - (static_cast(fa.GetAttr(FLDATTR_rcweak)) << (kModifierRCWeak - 1)); + (static_cast(fa.GetAttr(FLDATTR_rcweak)) << (kModifierRCWeak - 1)) | + (static_cast(fa.GetAttr(FLDATTR_hiddenapigrey)) << (kModifierHiddenApiGrey - 1)) | + (static_cast(fa.GetAttr(FLDATTR_hiddenapiblack)) << (kModifierHiddenApiBlack - 1)); } -uint32 GetClassAccessFlags(MIRClassType &classType) { +uint32 GetClassAccessFlags(const MIRClassType &classType) { int32 accessFlag = 0; - for (MIRPragma *prag : classType.GetPragmaVec()) { + for (const MIRPragma *prag : classType.GetPragmaVec()) { if (prag->GetKind() == kPragmaClass) { - MapleVector elemVector = prag->GetElementVector(); + const MapleVector elemVector = prag->GetElementVector(); for (MIRPragmaElement *elem : elemVector) { - std::string name = GlobalTables::GetStrTable().GetStringFromStrIdx(elem->GetNameStrIdx()); + const std::string &name = GlobalTables::GetStrTable().GetStringFromStrIdx(elem->GetNameStrIdx()); if (name == kAccessFlags) { accessFlag = elem->GetI32Val(); return static_cast(accessFlag); @@ -199,7 +277,7 @@ uint32 GetClassAccessFlags(MIRClassType &classType) { } } size_t size = classType.GetInfo().size(); - for (size_t i = 0; i < size; i++) { + for (size_t i = 0; i < size; ++i) { if (GlobalTables::GetStrTable().GetStringFromStrIdx(classType.GetInfoElemt(i).first) == kINFOAccessFlags) { return classType.GetInfoElemt(i).second; } @@ -207,11 +285,11 @@ uint32 GetClassAccessFlags(MIRClassType &classType) { return 0; } -bool ReflectionAnalysis::IsStaticClass(MIRClassType &classType) const { +bool ReflectionAnalysis::IsStaticClass(const MIRClassType &classType) const { return GetClassAccessFlags(classType) & 0x00000008; // # Modifier_Static 0x00000008; } -bool ReflectionAnalysis::IsPrivateClass(MIRClassType &classType) const { +bool ReflectionAnalysis::IsPrivateClass(const MIRClassType &classType) const { return GetClassAccessFlags(classType) & 0x00000002; // # Modifier_Private 0x00000002; } @@ -227,22 +305,21 @@ static std::string GetSignatureFromFullName(const std::string &fullname) { size_t pos = fullname.find("|"); if (pos != std::string::npos) { return fullname.substr(pos + 1); - } else { - FATAL(kLncFatal, "can not find \"|\" in fullname"); } + FATAL(kLncFatal, "can not find \"|\" in fullname"); } int ReflectionAnalysis::SolveAnnotation(MIRClassType &classType, MIRFunction &func) { std::string annoArray1; std::map idxNumMap; - GeneAnnotation(idxNumMap, annoArray1, classType, kPragmaFunc, func.GetName(), invalidIdx); + GenAnnotation(idxNumMap, annoArray1, classType, kPragmaFunc, func.GetName(), invalidIdx); // Parameter annotation. std::string annoArray2; std::map paramNumArray; int paramIndex = 0; std::map paramIdxNumMap; - GeneAnnotation(paramIdxNumMap, annoArray2, classType, kPragmaParam, func.GetName(), invalidIdx, ¶mNumArray, - ¶mIndex); + GenAnnotation(paramIdxNumMap, annoArray2, classType, kPragmaParam, func.GetName(), invalidIdx, ¶mNumArray, + ¶mIndex); std::string subStr = ""; if (idxNumMap.empty() && paramIdxNumMap.empty()) { subStr += "0"; @@ -262,7 +339,7 @@ int ReflectionAnalysis::SolveAnnotation(MIRClassType &classType, MIRFunction &fu subStr += std::to_string(p.second); subStr += "!"; }); - for (int z = 0; z < paramIndex; z++) { + for (int z = 0; z < paramIndex; ++z) { subStr += std::to_string(paramNumArray[z]); subStr += "!"; } @@ -271,7 +348,8 @@ int ReflectionAnalysis::SolveAnnotation(MIRClassType &classType, MIRFunction &fu return GetDeflateStringIdx(subStr); } -uint32 ReflectionAnalysis::GetTypeNameIdxFromType(MIRType &type, const Klass &klass, const std::string &fieldName) { +uint32 ReflectionAnalysis::GetTypeNameIdxFromType(const MIRType &type, const Klass &klass, + const std::string &fieldName) { uint32 typeNameIdx = 0; switch (type.GetKind()) { case kTypeScalar: { @@ -280,10 +358,10 @@ uint32 ReflectionAnalysis::GetTypeNameIdxFromType(MIRType &type, const Klass &kl break; } case kTypePointer: { - auto *ptype = static_cast(&type)->GetPointedType(); + auto *ptype = static_cast(type).GetPointedType(); if (ptype->GetKind() == kTypeArray || ptype->GetKind() == kTypeJArray) { - CHECK_FATAL(static_cast(ptype) != nullptr, "null ptr check"); - std::string javaName = static_cast(ptype)->GetJavaName(); + CHECK_NULL_FATAL(ptype); + const std::string &javaName = static_cast(ptype)->GetJavaName(); std::string klassJavaDescriptor; NameMangler::DecodeMapleNameToJavaDescriptor(javaName, klassJavaDescriptor); typeNameIdx = FindOrInsertReflectString(klassJavaDescriptor); @@ -309,13 +387,13 @@ uint32 ReflectionAnalysis::GetTypeNameIdxFromType(MIRType &type, const Klass &kl void ReflectionAnalysis::CheckPrivateInnerAndNoSubClass(Klass &clazz, const std::string &annoArr) { // LMain_24A_3B `EC!`VL!24!LMain_3B!`IC!`AF!4!2!name!23!A! - uint32_t idx = ReflectionAnalysis::FindOrInsertReflectString(kInnerClassPrefix); + uint32_t idx = FindOrInsertReflectString(kInnerClassPrefix); std::string target = annoDelimiterPrefix + std::to_string(idx) + annoDelimiter; size_t pos = annoArr.find(kInnerClassPrefix, 0); if (pos == std::string::npos) { return; } - ASSERT(clazz.GetMIRClassType() != nullptr, "null ptr check!"); + ASSERT_NOT_NULL(clazz.GetMIRClassType()); if (!IsPrivateClass(*clazz.GetMIRClassType())) { return; // Check private. } @@ -342,7 +420,7 @@ uint16 GenMethodHashIndex(const std::string &name, const std::string &signature) void ReflectionAnalysis::ConvertMethodSig(std::string &signature) { size_t signatureSize = signature.size(); - for (size_t i = 1; i < signatureSize; i++) { + for (size_t i = 1; i < signatureSize; ++i) { if (signature[i] == 'L') { while (signature[++i] != ';') {} // eg. Ljava/io/InputStream; so we do not check the boundary. } else if (signature[i] == 'A') { @@ -386,7 +464,7 @@ void ReflectionAnalysis::GenAllMethodHash(std::vector> &fieldV) { +void ReflectionAnalysis::GenAllFieldHash(std::vector> &fieldV) const { std::vector methodVector; std::vector hashVector; for (auto &field : fieldV) { @@ -402,9 +480,9 @@ void ReflectionAnalysis::GenAllFieldHash(std::vector> &fieldV, FieldPair fieldSources) { - for (auto &field : fieldV) { - FieldPair f = field.first; +uint16 GetFieldHash(const std::vector> &fieldV, const FieldPair &fieldSources) { + for (const auto &field : fieldV) { + const FieldPair &f = field.first; if (f == fieldSources) { return field.second; } @@ -415,7 +493,7 @@ uint16 GetFieldHash(std::vector> &fieldV, FieldPair bool ReflectionAnalysis::RootClassDefined() { if (isLibcore < 0) { // Check whether this module defines root classes including Class/Object/Fields/Methods. - Klass *objectKlass = klassh->GetKlassFromLiteral(NameMangler::kJavaLangObjectStr); + Klass *objectKlass = klassH->GetKlassFromLiteral(NameMangler::kJavaLangObjectStr); isLibcore = 0; if (objectKlass != nullptr && objectKlass->GetMIRStructType()->IsLocal()) { isLibcore = 1; @@ -435,7 +513,7 @@ MIRSymbol *ReflectionAnalysis::GetOrCreateSymbol(const std::string &name, TyIdx // Set classinfo symbol as extern if not defined locally. if (StringUtils::StartsWith(name, CLASSINFO_PREFIX_STR)) { std::string className = name.substr(strlen(CLASSINFO_PREFIX_STR)); - Klass *klass = klassh->GetKlassFromName(className); + Klass *klass = klassH->GetKlassFromName(className); if (klass != nullptr && !klass->GetMIRStructType()->IsLocal()) { st->SetStorageClass(kScExtern); } @@ -493,25 +571,24 @@ bool RtRetentionPolicyCheck(const MIRSymbol &clInfo) { std::string retentionType = GlobalTables::GetStrTable().GetStringFromStrIdx(strIdx); if (retentionType != "RUNTIME") { return false; - } else { - return true; } + return true; } } return false; } -uint32 ReflectionAnalysis::GetMethodInVtabIndex(const Klass &klass, const MIRFunction &func) { +uint32 ReflectionAnalysis::GetMethodInVtabIndex(const Klass &klass, const MIRFunction &func) const { int methodInVtabIndex = 0; bool findMethod = false; - MIRClassType *classType = klass.GetMIRClassType(); - MIRSymbol *vtableSymbol = GlobalTables::GetGsymTable().GetSymbolFromStrIdx( + const MIRClassType *classType = klass.GetMIRClassType(); + const MIRSymbol *vtableSymbol = GlobalTables::GetGsymTable().GetSymbolFromStrIdx( GlobalTables::GetStrTable().GetStrIdxFromName(VTAB_PREFIX_STR + klass.GetKlassName())); if (klass.IsClass() && vtableSymbol != nullptr) { - MIRAggConst *vtableConst = static_cast(vtableSymbol->GetKonst()); - for (MIRConstPtr &node : vtableConst->GetConstVec()) { + const auto *vtableConst = static_cast(vtableSymbol->GetKonst()); + for (const MIRConstPtr &node : vtableConst->GetConstVec()) { if (node->GetKind() == kConstAddrofFunc) { - auto *addr = static_cast(node); + const auto *addr = static_cast(node); MIRFunction *vtableFunc = GlobalTables::GetFunctionTable().GetFunctionFromPuidx(addr->GetValue()); // NOTE: In VtableAnalysis::AddMethodToTable, a abstract method will not // be added to the vtable if there is already an abstract method of the @@ -524,18 +601,18 @@ uint32 ReflectionAnalysis::GetMethodInVtabIndex(const Klass &klass, const MIRFun break; } } - methodInVtabIndex++; + ++methodInVtabIndex; } } else if (klass.IsInterface()) { methodInVtabIndex = 0; - for (MethodPair &methodPair : classType->GetMethods()) { - MIRSymbol *currSym = GlobalTables::GetGsymTable().GetSymbolFromStidx(methodPair.first.Idx()); - MIRFunction *currFunc = currSym->GetFunction(); + for (const MethodPair &methodPair : classType->GetMethods()) { + const MIRSymbol *currSym = GlobalTables::GetGsymTable().GetSymbolFromStidx(methodPair.first.Idx()); + const MIRFunction *currFunc = currSym->GetFunction(); if (func.GetNameStrIdx() == currFunc->GetNameStrIdx()) { findMethod = true; break; } - methodInVtabIndex++; + ++methodInVtabIndex; } } if (!findMethod) { @@ -556,7 +633,7 @@ void ReflectionAnalysis::GetSignatureTypeNames(std::string &signature, std::vect int sigLen = signature.length(); int i = 0; const char *methodSignature = signature.c_str(); - i++; + ++i; while (i < sigLen && methodSignature[i] != ')') { std::string descriptor; if (methodSignature[i] != 'L' && methodSignature[i] != '[') { @@ -577,40 +654,41 @@ void ReflectionAnalysis::GetSignatureTypeNames(std::string &signature, std::vect } } typeNames.push_back(descriptor); - i++; + ++i; } // Return type. - i++; + ++i; typeNames.push_back(methodSignature + i); } struct HashCodeComparator { - std::unordered_map &basenameMp; - std::unordered_map &fullnameMp; - HashCodeComparator(std::unordered_map &arg1, std::unordered_map &arg2) + const std::unordered_map &basenameMp; + const std::unordered_map &fullnameMp; + HashCodeComparator(const std::unordered_map &arg1, + const std::unordered_map &arg2) : basenameMp(arg1), fullnameMp(arg2) {} bool operator()(std::pair a, std::pair b) { - MIRSymbol *funcSymA = GlobalTables::GetGsymTable().GetSymbolFromStidx(a.first->first.Idx()); - MIRFunction *funcA = funcSymA->GetFunction(); + const MIRSymbol *funcSymA = GlobalTables::GetGsymTable().GetSymbolFromStidx(a.first->first.Idx()); + const MIRFunction *funcA = funcSymA->GetFunction(); auto itB = basenameMp.find(funcA->GetBaseFuncNameStrIdx().GetIdx()); ASSERT(itB != basenameMp.end(), "check funcAname!"); - std::string funcAName = itB->second; + const std::string &funcAName = itB->second; auto itF = fullnameMp.find(funcA->GetBaseFuncNameWithTypeStrIdx().GetIdx()); ASSERT(itF != fullnameMp.end(), "check funcAname!"); - std::string fullNameA = itF->second; + const std::string &fullNameA = itF->second; CHECK_FATAL(fullNameA.find("|") != fullNameA.npos, "not found |"); - std::string signatureA = fullNameA.substr(fullNameA.find("|") + 1); - MIRSymbol *funcSymB = GlobalTables::GetGsymTable().GetSymbolFromStidx(b.first->first.Idx()); - MIRFunction *funcB = funcSymB->GetFunction(); + const std::string &signatureA = fullNameA.substr(fullNameA.find("|") + 1); + const MIRSymbol *funcSymB = GlobalTables::GetGsymTable().GetSymbolFromStidx(b.first->first.Idx()); + const MIRFunction *funcB = funcSymB->GetFunction(); itB = basenameMp.find(funcB->GetBaseFuncNameStrIdx().GetIdx()); ASSERT(itB != basenameMp.end(), "check funcBname!"); - std::string funcBName = itB->second; + const std::string &funcBName = itB->second; itF = fullnameMp.find(funcB->GetBaseFuncNameWithTypeStrIdx().GetIdx()); ASSERT(itF != fullnameMp.end(), "check funcBname!"); - std::string fullNameB = itF->second; + const std::string &fullNameB = itF->second; CHECK_FATAL(fullNameB.find("|") != std::string::npos, "not found |"); - std::string signatureB = fullNameB.substr(fullNameB.find("|") + 1); + const std::string &signatureB = fullNameB.substr(fullNameB.find("|") + 1); // Make bridge the end. if ((funcA->GetHashCode() == kHashConflictFlag) && (funcB->GetHashCode() == kHashConflictFlag)) { // Only deal with return type is different. @@ -632,7 +710,7 @@ struct HashCodeComparator { } }; -uint32 ReflectionAnalysis::GetMethodFlag(MIRFunction &func) { +uint32 ReflectionAnalysis::GetMethodFlag(const MIRFunction &func) const { uint32 flag = 0; if (!VtableFunc(func)) { flag |= kMethodNotVirtual; @@ -702,7 +780,7 @@ MIRSymbol *ReflectionAnalysis::GenMethodsMeta(const Klass &klass, std::unordered_map &fullNameMp) { MIRClassType *classType = klass.GetMIRClassType(); size_t arraySize = classType->GetMethods().size(); - MIRStructType &methodsInfoType = + auto &methodsInfoType = static_cast(*GlobalTables::GetTypeTable().GetTypeFromTyIdx(methodsInfoTyIdx)); MIRArrayType &arrayType = *GlobalTables::GetTypeTable().GetOrCreateArrayType(methodsInfoType, arraySize); MIRAggConst *aggConst = mirModule->GetMemPool()->New(*mirModule, arrayType); @@ -743,7 +821,7 @@ void ReflectionAnalysis::GenFieldOffsetData(const Klass &klass, std::vector> &fieldOffsetVector) { size_t size = fieldOffsetVector.size(); MIRModule &module = *mirModule; - MIRStructType &fieldOffsetType = + auto &fieldOffsetType = static_cast(*GlobalTables::GetTypeTable().GetTypeFromTyIdx(fieldOffsetDataTyIdx)); MIRArrayType &fieldOffsetArrayType = *GlobalTables::GetTypeTable().GetOrCreateArrayType(fieldOffsetType, size); MIRAggConst *aggConst = module.GetMemPool()->New(module, fieldOffsetArrayType); @@ -788,15 +866,15 @@ void ReflectionAnalysis::GenFieldOffsetData(const Klass &klass, MIRSymbol *ReflectionAnalysis::GenSuperClassMetaData(const Klass &klass, std::list superClassList) { MIRModule &module = *mirModule; size_t size = superClassList.size(); - MIRStructType &superclassMetadataType = + auto &superclassMetadataType = static_cast(*GlobalTables::GetTypeTable().GetTypeFromTyIdx(superclassMetadataTyIdx)); MIRArrayType &arrayType = *GlobalTables::GetTypeTable().GetOrCreateArrayType(superclassMetadataType, size); MIRAggConst *aggconst = module.GetMemPool()->New(module, arrayType); for (auto it = superClassList.begin(); it != superClassList.end(); ++it) { MIRSymbol *dklassSt = GetOrCreateSymbol(CLASSINFO_PREFIX_STR + (*it)->GetKlassName(), classMetadataTyIdx); - MIRAggConst *newconst = module.GetMemPool()->New(module, superclassMetadataType); - mirBuilder.AddAddrofFieldConst(superclassMetadataType, *newconst, 1, *dklassSt); - aggconst->PushBack(newconst); + MIRAggConst *newConst = module.GetMemPool()->New(module, superclassMetadataType); + mirBuilder.AddAddrofFieldConst(superclassMetadataType, *newConst, 1, *dklassSt); + aggconst->PushBack(newConst); } MIRSymbol *superclassArraySt = GetOrCreateSymbol(SUPERCLASSINFO_PREFIX_STR + klass.GetKlassName(), arrayType.GetTypeIndex(), true); @@ -858,7 +936,7 @@ void ReflectionAnalysis::GenFieldMeta(const Klass &klass, MIRStructType &fieldsI MIRClassType *classType = klass.GetMIRClassType(); std::string annoArr; std::map idxNumMap; - GeneAnnotation(idxNumMap, annoArr, *classType, kPragmaVar, fieldName, ty->GetTypeIndex()); + GenAnnotation(idxNumMap, annoArr, *classType, kPragmaVar, fieldName, ty->GetTypeIndex()); uint32 annotationIdx = GetAnnoCstrIndex(idxNumMap, annoArr); mirBuilder.AddIntFieldConst(fieldsInfoType, *newConst, fieldID++, annotationIdx); // @declaring class @@ -870,7 +948,7 @@ void ReflectionAnalysis::GenFieldMeta(const Klass &klass, MIRStructType &fieldsI MIRSymbol *ReflectionAnalysis::GenFieldsMeta(const Klass &klass, std::vector> &fieldsVector, std::vector> &fieldHashvec) { size_t size = fieldsVector.size(); - MIRStructType &fieldsInfoType = + auto &fieldsInfoType = static_cast(*GlobalTables::GetTypeTable().GetTypeFromTyIdx(fieldsInfoTyIdx)); MIRArrayType *arraytype = GlobalTables::GetTypeTable().GetOrCreateArrayType(fieldsInfoType, size); MIRAggConst *aggConst = mirModule->GetMemPool()->New(*mirModule, *arraytype); @@ -905,13 +983,13 @@ MIRSymbol *ReflectionAnalysis::GenFieldsMetaData(const Klass &klass) { } std::vector> fieldHashvec(size); size_t i = 0; - for (; i < fields.size(); i++) { + for (; i < fields.size(); ++i) { std::string fieldname = GlobalTables::GetStrTable().GetStringFromStrIdx(fields[i].first); ConvertFieldName(fieldname, false); uint32 hashcode = GetCharHashIndex(fieldname.c_str()); fieldHashvec[i] = std::make_pair(fields[i], hashcode); } - for (size_t j = 0; j < staticFields.size(); j++) { + for (size_t j = 0; j < staticFields.size(); ++j) { std::string fieldname = GlobalTables::GetStrTable().GetStringFromStrIdx(staticFields[j].first); ConvertFieldName(fieldname, true); uint32 hashcode = GetCharHashIndex(fieldname.c_str()); @@ -935,7 +1013,7 @@ MIRSymbol *ReflectionAnalysis::GenFieldsMetaData(const Klass &klass) { } else { fieldinfoVec[j] = std::make_pair(f, k++); } - j++; + ++j; } ASSERT(i == size, "In class %s: %d fields seen, BUT %d fields declared", klass.GetKlassName().c_str(), i, size); MIRSymbol *fieldsArraySt = GenFieldsMeta(klass, fieldinfoVec, fieldHashvec); @@ -1089,9 +1167,9 @@ std::string ReflectionAnalysis::GetAnnoValueNoArray(const MIRPragmaElement &anno return annoArray; } -void ReflectionAnalysis::GeneAnnotation(std::map &idxNumMap, std::string &annoArr, MIRClassType &classType, - PragmaKind paragKind, const std::string ¶gName, TyIdx fieldTypeIdx, - std::map *paramnumArray, int *paramIndex) { +void ReflectionAnalysis::GenAnnotation(std::map &idxNumMap, std::string &annoArr, MIRClassType &classType, + PragmaKind paragKind, const std::string ¶gName, TyIdx fieldTypeIdx, + std::map *paramnumArray, int *paramIndex) { int annoNum = 0; std::string cmpString = ""; for (MIRPragma *prag : classType.GetPragmaVec()) { @@ -1160,8 +1238,8 @@ uint32 ReflectionAnalysis::GetAnnoCstrIndex(std::map &idxNumMap, const return signatureIdx; } -int64 ReflectionAnalysis::BKDRHash(const std::string &strname, uint32 seed) { - const char *name = strname.c_str(); +int64 ReflectionAnalysis::BKDRHash(const std::string &strName, uint32 seed) { + const char *name = strName.c_str(); int64 hash = 0; while (*name) { hash = hash * seed + (*name++); @@ -1169,9 +1247,9 @@ int64 ReflectionAnalysis::BKDRHash(const std::string &strname, uint32 seed) { return hash; } -int64 ReflectionAnalysis::GetHashIndex(const std::string &strname) { +int64 ReflectionAnalysis::GetHashIndex(const std::string &strName) { constexpr int hashSeed = 211; - return BKDRHash(strname, hashSeed); + return BKDRHash(strName, hashSeed); } void ReflectionAnalysis::GenHotClassNameString(const Klass &klass) { @@ -1231,13 +1309,13 @@ void ReflectionAnalysis::GenClassMetaData(Klass &klass) { LogInfo::MapleLogger(kLlErr) << "========= Gen Class: " << klassJavaDescriptor << " (" << hashIndex << ") ========\n"; } - MIRStructType &classMetadataROType = + auto &classMetadataROType = static_cast(*GlobalTables::GetTypeTable().GetTypeFromTyIdx(classMetadataRoTyIdx)); - MIRAggConst *newconst = module.GetMemPool()->New(module, classMetadataROType); + MIRAggConst *newConst = module.GetMemPool()->New(module, classMetadataROType); uint32 fieldID = 1; // @classname uint32 nameIdx = FindOrInsertReflectString(klassJavaDescriptor); - mirBuilder.AddIntFieldConst(classMetadataROType, *newconst, fieldID++, nameIdx); + mirBuilder.AddIntFieldConst(classMetadataROType, *newConst, fieldID++, nameIdx); // @iFields: All instance fields. int numOfFields = 0; bool hasAdded = false; @@ -1246,7 +1324,7 @@ void ReflectionAnalysis::GenClassMetaData(Klass &klass) { NameMangler::kFieldsInfoPrefixStr + NameMangler::GetInternalNameLiteral(NameMangler::kJavaLangObjectStr)); MIRSymbol *fieldsSt = GlobalTables::GetGsymTable().GetSymbolFromStrIdx(stridx); if (fieldsSt != nullptr) { - mirBuilder.AddAddrofFieldConst(classMetadataROType, *newconst, fieldID++, *fieldsSt); + mirBuilder.AddAddrofFieldConst(classMetadataROType, *newConst, fieldID++, *fieldsSt); hasAdded = true; } } @@ -1255,9 +1333,9 @@ void ReflectionAnalysis::GenClassMetaData(Klass &klass) { if (fieldsSt != nullptr) { numOfFields = static_cast(fieldsSt->GetKonst())->GetConstVec().size(); // All meta data will be weak if dummy constructors. - mirBuilder.AddAddrofFieldConst(classMetadataROType, *newconst, fieldID++, *fieldsSt); + mirBuilder.AddAddrofFieldConst(classMetadataROType, *newConst, fieldID++, *fieldsSt); } else { - mirBuilder.AddIntFieldConst(classMetadataROType, *newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(classMetadataROType, *newConst, fieldID++, 0); } } // @methods: All methods. @@ -1266,119 +1344,115 @@ void ReflectionAnalysis::GenClassMetaData(Klass &klass) { methodsSt = GenMethodsMetaData(klass); if (methodsSt != nullptr) { numOfMethods = static_cast(methodsSt->GetKonst())->GetConstVec().size(); - mirBuilder.AddAddrofFieldConst(classMetadataROType, *newconst, fieldID++, *methodsSt); + mirBuilder.AddAddrofFieldConst(classMetadataROType, *newConst, fieldID++, *methodsSt); } else { - mirBuilder.AddIntFieldConst(classMetadataROType, *newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(classMetadataROType, *newConst, fieldID++, 0); } // @superclass: Super class and a list of implemented interfaces. std::list superClassList; - bool missingSuper = false; for (Klass *superClass : klass.GetSuperKlasses()) { superClassList.push_back(superClass); } for (TyIdx const kTyIdx : classType->GetInterfaceImplemented()) { - Klass *interface = klassh->GetKlassFromTyIdx(kTyIdx); + Klass *interface = klassH->GetKlassFromTyIdx(kTyIdx); if (interface == nullptr) { - missingSuper = true; MIRType *type = GlobalTables::GetTypeTable().GetTypeFromTyIdx(kTyIdx); LogInfo::MapleLogger() << "Error: Interface " << static_cast(type)->GetName() << " is not found" << "\n"; + LogInfo::MapleLogger(kLlErr) << "Error: Missing interface for " << klass.GetKlassName() << "\n"; + CHECK_FATAL(false, "Missing interface"); } std::list::iterator it = std::find(superClassList.begin(), superClassList.end(), interface); if (it == superClassList.end()) { superClassList.push_back(interface); } } - if (missingSuper) { - LogInfo::MapleLogger(kLlErr) << "Error: Missing interface for " << klass.GetKlassName() << "\n"; - CHECK_FATAL(0, "Missing interface"); - } size_t superClassSize = superClassList.size(); if (superClassSize >= 1) { MIRSymbol *superClassSymbolType = GenSuperClassMetaData(klass, superClassList); - mirBuilder.AddAddrofFieldConst(classMetadataROType, *newconst, fieldID++, *superClassSymbolType); + mirBuilder.AddAddrofFieldConst(classMetadataROType, *newConst, fieldID++, *superClassSymbolType); } else { - mirBuilder.AddIntFieldConst(classMetadataROType, *newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(classMetadataROType, *newConst, fieldID++, 0); } // @numoffields: Num of fields (own). CHECK_FATAL(numOfFields <= 0xffff, "Error:the num of fields is too large"); - mirBuilder.AddIntFieldConst(classMetadataROType, *newconst, fieldID++, numOfFields); + mirBuilder.AddIntFieldConst(classMetadataROType, *newConst, fieldID++, numOfFields); // @numofmethods: Num of methods in vtable. CHECK_FATAL(numOfMethods <= 0xffff, "Error:the num of methods is too large"); - mirBuilder.AddIntFieldConst(classMetadataROType, *newconst, fieldID++, numOfMethods); + mirBuilder.AddIntFieldConst(classMetadataROType, *newConst, fieldID++, numOfMethods); // Do annotation. std::string annoArray; std::map idxNumMap; - GeneAnnotation(idxNumMap, annoArray, *classType, kPragmaClass, klass.GetKlassName(), invalidIdx); + GenAnnotation(idxNumMap, annoArray, *classType, kPragmaClass, klass.GetKlassName(), invalidIdx); bool isAnonymous = IsAnonymousClass(annoArray); CheckPrivateInnerAndNoSubClass(klass, annoArray); #ifndef USE_32BIT_REF // @flag // Array class and primitive class is not generated by compiler. - uint32 flag = klass.GetFlag(kClassHasFinalizer | CLASS_REFERENCE | kClassFinalizerreferenceSentinel); + uint32 flag = klass.GetFlag(kClassHasFinalizer | kClassReference | kClassFinalizerreferenceSentinel); flag = isAnonymous ? (flag | kClassIsanonymousclass) : flag; - mirBuilder.AddIntFieldConst(classMetadataROType, *newconst, fieldID++, flag); + mirBuilder.AddIntFieldConst(classMetadataROType, *newConst, fieldID++, flag); // @numofsuperclasses CHECK_FATAL(superClassSize <= 0xffff, "Error:the size of superClass is too big"); - mirBuilder.AddIntFieldConst(classMetadataROType, *newconst, fieldID++, superClassSize); + mirBuilder.AddIntFieldConst(classMetadataROType, *newConst, fieldID++, superClassSize); // @padding - mirBuilder.AddIntFieldConst(classMetadataROType, *newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(classMetadataROType, *newConst, fieldID++, 0); #endif // USE_32BIT_REF // @modifier: For class fill ClassAccessFlags. uint32 modifier = GetClassAccessFlags(*classType); - mirBuilder.AddIntFieldConst(classMetadataROType, *newconst, fieldID++, modifier); + mirBuilder.AddIntFieldConst(classMetadataROType, *newConst, fieldID++, modifier); // @annotation: Set annotation field. - SetAnnoFieldConst(classMetadataROType, *newconst, fieldID++, idxNumMap, annoArray); + SetAnnoFieldConst(classMetadataROType, *newConst, fieldID++, idxNumMap, annoArray); // @ClinitFuncAddr MIRSymbol *clinitFuncSym = GetClinitFuncSymbol(klass); if (clinitFuncSym != nullptr) { - mirBuilder.AddAddroffuncFieldConst(classMetadataROType, *newconst, fieldID++, *clinitFuncSym); + mirBuilder.AddAddroffuncFieldConst(classMetadataROType, *newConst, fieldID++, *clinitFuncSym); } else { - mirBuilder.AddIntFieldConst(classMetadataROType, *newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(classMetadataROType, *newConst, fieldID++, 0); } MIRSymbol *classMetadataROSymbolType = GetOrCreateSymbol(CLASSINFO_RO_PREFIX_STR + klass.GetKlassName(), classMetadataRoTyIdx, true); classMetadataROSymbolType->SetStorageClass(kScFstatic); - classMetadataROSymbolType->SetKonst(newconst); + classMetadataROSymbolType->SetKonst(newConst); // Class Metadata definition start here. - MIRStructType &classMetadataType = + auto &classMetadataType = static_cast(*GlobalTables::GetTypeTable().GetTypeFromTyIdx(classMetadataTyIdx)); - newconst = module.GetMemPool()->New(module, classMetadataType); + newConst = module.GetMemPool()->New(module, classMetadataType); fieldID = 1; // @shadow: multiplex used for def index. - mirBuilder.AddIntFieldConst(classMetadataType, *newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(classMetadataType, *newConst, fieldID++, 0); // @monitor: multiplex used for class hash. - mirBuilder.AddIntFieldConst(classMetadataType, *newconst, fieldID++, hashIndex); + mirBuilder.AddIntFieldConst(classMetadataType, *newConst, fieldID++, hashIndex); // @class loader: Use maximum value unsigned(-1) as non-initialized flag. - mirBuilder.AddIntFieldConst(classMetadataType, *newconst, fieldID++, static_cast(-1)); + mirBuilder.AddIntFieldConst(classMetadataType, *newConst, fieldID++, static_cast(-1)); // @objsize: Fill this in the CG. - mirBuilder.AddIntFieldConst(classMetadataType, *newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(classMetadataType, *newConst, fieldID++, 0); #ifdef USE_32BIT_REF // @flag // Array class and primitive class is not generated by compiler. - uint32 flag = klass.GetFlag(kClassHasFinalizer | CLASS_REFERENCE | kClassFinalizerreferenceSentinel); + uint32 flag = klass.GetFlag(kClassHasFinalizer | kClassReference | kClassFinalizerreferenceSentinel); flag = isAnonymous ? (flag | kClassIsanonymousclass) : flag; - mirBuilder.AddIntFieldConst(classMetadataType, *newconst, fieldID++, flag); + mirBuilder.AddIntFieldConst(classMetadataType, *newConst, fieldID++, flag); // @numofsuperclasses CHECK_FATAL(superClassSize <= 0xffff, "Error:the size of superClass is too big"); - mirBuilder.AddIntFieldConst(classMetadataType, *newconst, fieldID++, superClassSize); + mirBuilder.AddIntFieldConst(classMetadataType, *newConst, fieldID++, superClassSize); #endif // USE_32BIT_REF // @itab GStrIdx strIdx = GlobalTables::GetStrTable().GetStrIdxFromName(ITAB_PREFIX_STR + klass.GetKlassName()); if (strIdx != 0) { MIRSymbol *itableSymbolType = GlobalTables::GetGsymTable().GetSymbolFromStrIdx(strIdx); - mirBuilder.AddAddrofFieldConst(classMetadataType, *newconst, fieldID++, *itableSymbolType); + mirBuilder.AddAddrofFieldConst(classMetadataType, *newConst, fieldID++, *itableSymbolType); } else { - mirBuilder.AddIntFieldConst(classMetadataType, *newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(classMetadataType, *newConst, fieldID++, 0); } // @vtab strIdx = GlobalTables::GetStrTable().GetStrIdxFromName(VTAB_PREFIX_STR + klass.GetKlassName()); if (strIdx != 0) { MIRSymbol *vtableSymbolType = GlobalTables::GetGsymTable().GetSymbolFromStrIdx(strIdx); - mirBuilder.AddAddrofFieldConst(classMetadataType, *newconst, fieldID++, *vtableSymbolType); + mirBuilder.AddAddrofFieldConst(classMetadataType, *newConst, fieldID++, *vtableSymbolType); } else { - mirBuilder.AddIntFieldConst(classMetadataType, *newconst, fieldID++, 0); + mirBuilder.AddIntFieldConst(classMetadataType, *newConst, fieldID++, 0); } // @gctib MIRSymbol *gctibSt = GetOrCreateSymbol(GCTIB_PREFIX_STR + klass.GetKlassName(), @@ -1387,34 +1461,34 @@ void ReflectionAnalysis::GenClassMetaData(Klass &klass) { // Direct access to gctib is only possible within a .so, for most classes. gctibSt->SetStorageClass(kScFstatic); } - mirBuilder.AddAddrofFieldConst(classMetadataType, *newconst, fieldID++, *gctibSt); + mirBuilder.AddAddrofFieldConst(classMetadataType, *newConst, fieldID++, *gctibSt); // @classinfo ro. - mirBuilder.AddAddrofFieldConst(classMetadataType, *newconst, fieldID++, *classMetadataROSymbolType); + mirBuilder.AddAddrofFieldConst(classMetadataType, *newConst, fieldID++, *classMetadataROSymbolType); // Set default value to class initialization state. - if (klassh->NeedClinitCheckRecursively(klass)) { - mirBuilder.AddIntFieldConst(classMetadataType, *newconst, fieldID++, kSEGVAddrForClassUninitialized); + if (klassH->NeedClinitCheckRecursively(klass)) { + mirBuilder.AddIntFieldConst(classMetadataType, *newConst, fieldID++, kSEGVAddrForClassUninitialized); } else { // If this class and its parents do not have method, we do not do clinit-check for this class, // thus the class initialization state is modified to "Initialized", i.e., some readable address. MIRType *clinitState = GlobalTables::GetTypeTable().GetUInt64(); MIRSymbol *classInfo = mirBuilder.GetOrCreateGlobalDecl(kClassStateInitializedStr, *clinitState); - mirBuilder.AddAddrofFieldConst(classMetadataType, *newconst, fieldID++, *classInfo); + mirBuilder.AddAddrofFieldConst(classMetadataType, *newConst, fieldID++, *classInfo); } // Finally generate class metadata here. MIRSymbol *classSt = GetOrCreateSymbol(CLASSINFO_PREFIX_STR + klass.GetKlassName(), classMetadataTyIdx, true); - classSt->SetKonst(newconst); + classSt->SetKonst(newConst); classTab.push_back(classSt); } -void ReflectionAnalysis::SetAnnoFieldConst(const MIRStructType &metadataRoType, MIRAggConst &newconst, uint32 fieldid, +void ReflectionAnalysis::SetAnnoFieldConst(const MIRStructType &metadataRoType, MIRAggConst &newConst, uint32 fieldid, std::map &idxNumMap, const std::string &annoArr) { size_t annoNum = idxNumMap.size(); if (annoNum == 0) { std::string subStr = "0!0"; uint32 signatureIdx = FindOrInsertReflectString(subStr); - mirBuilder.AddIntFieldConst(metadataRoType, newconst, fieldid, signatureIdx); + mirBuilder.AddIntFieldConst(metadataRoType, newConst, fieldid, signatureIdx); } else { std::string subStr = std::to_string(annoNum); subStr += "!"; @@ -1424,7 +1498,7 @@ void ReflectionAnalysis::SetAnnoFieldConst(const MIRStructType &metadataRoType, }); subStr += annoArr; uint32 signatureIdx = GetDeflateStringIdx(subStr); - mirBuilder.AddIntFieldConst(metadataRoType, newconst, fieldid, signatureIdx); + mirBuilder.AddIntFieldConst(metadataRoType, newConst, fieldid, signatureIdx); } } @@ -1474,7 +1548,7 @@ TyIdx ReflectionAnalysis::GenMetaStructType(MIRModule &mirModule, MIRStructType return tyIdx; } -MIRType *ReflectionAnalysis::GetRefFieldType(MIRBuilder &mirbuilder) { +MIRType *ReflectionAnalysis::GetRefFieldType() { #ifdef USE_32BIT_REF return GlobalTables::GetTypeTable().GetUInt32(); #else @@ -1486,7 +1560,6 @@ void ReflectionAnalysis::GenMetadataType(MIRModule &mirModule) { if (classMetadataTyIdx != 0) { // Types have been generated. return; } - MIRBuilder &mirBuilder = *(mirModule.GetMIRBuilder()); // ClassMetaType MIRType *typeU8 = GlobalTables::GetTypeTable().GetUInt8(); MIRType *typeU16 = GlobalTables::GetTypeTable().GetUInt16(); @@ -1498,13 +1571,13 @@ void ReflectionAnalysis::GenMetadataType(MIRModule &mirModule) { #endif MIRType *typeVoidPtr = GlobalTables::GetTypeTable().GetVoidPtr(); MIRStructType classMetadataType(kTypeStruct); - GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataType, kShadowStr, *GetRefFieldType(mirBuilder)); + GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataType, kShadowStr, *GetRefFieldType()); GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataType, kMonitorStr, *typeI32); GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataType, kClassloaderStr, *typeU16); GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataType, kObjsizeStr, *typeU16); #ifdef USE_32BIT_REF GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataType, kFlagStr, *typeU16); - GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataType, kNumofsuperclassesStr, *typeU16); + GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataType, kNumOfSuperclassesStr, *typeU16); #endif // USE_32BIT_REF GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataType, kItabStr, *typeVoidPtr); GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataType, kVtabStr, *typeVoidPtr); @@ -1513,17 +1586,17 @@ void ReflectionAnalysis::GenMetadataType(MIRModule &mirModule) { GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataType, kClinitbridgeStr, *typeVoidPtr); classMetadataTyIdx = GenMetaStructType(mirModule, classMetadataType, NameMangler::kClassMetadataTypeName); MIRStructType classMetadataROType(kTypeStruct); - GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataROType, kClassnameStr, *typeVoidPtr); + GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataROType, kClassNameStr, *typeVoidPtr); GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataROType, kIfieldsStr, *typeVoidPtr); GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataROType, kMethodsStr, *typeVoidPtr); // For array, this is component class; For primitive type, this is nullptr; // For general class, this is superclass (only one superclass), this is a pointer to a superclass&interface array. GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataROType, kSuperclassOrComponentclassStr, *typeVoidPtr); - GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataROType, kNumoffieldsStr, *typeU16); - GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataROType, kNumofmethodsStr, *typeU16); + GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataROType, kNumOfFieldsStr, *typeU16); + GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataROType, kNumOfMethodsStr, *typeU16); #ifndef USE_32BIT_REF GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataROType, kFlagStr, *typeU16); - GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataROType, kNumofsuperclassesStr, *typeU16); + GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataROType, kNumOfSuperclassesStr, *typeU16); GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataROType, kPaddingStr, *typeU32); #endif // USE_32BIT_REF GlobalTables::GetTypeTable().AddFieldToStructType(classMetadataROType, kModStr, *typeI32); @@ -1542,8 +1615,8 @@ void ReflectionAnalysis::GenMetadataType(MIRModule &mirModule) { GlobalTables::GetTypeTable().AddFieldToStructType(methodInfoType, kAddrStr, *typeI64); #endif GlobalTables::GetTypeTable().AddFieldToStructType(methodInfoType, kModStr, *typeI32); - GlobalTables::GetTypeTable().AddFieldToStructType(methodInfoType, kMethodnameStr, *typeI32); - GlobalTables::GetTypeTable().AddFieldToStructType(methodInfoType, kSignaturenameStr, *typeI32); + GlobalTables::GetTypeTable().AddFieldToStructType(methodInfoType, kMethodNameStr, *typeI32); + GlobalTables::GetTypeTable().AddFieldToStructType(methodInfoType, kSignatureNameStr, *typeI32); GlobalTables::GetTypeTable().AddFieldToStructType(methodInfoType, kAnnotationvalueStr, *typeI32); GlobalTables::GetTypeTable().AddFieldToStructType(methodInfoType, kFlagStr, *typeU16); GlobalTables::GetTypeTable().AddFieldToStructType(methodInfoType, kArgsizeStr, *typeU16); @@ -1572,9 +1645,9 @@ void ReflectionAnalysis::GenMetadataType(MIRModule &mirModule) { #else GlobalTables::GetTypeTable().AddFieldToStructType(fieldInfoType, kTypeNameStr, *typeI32); #endif // USE_32BIT_REF - GlobalTables::GetTypeTable().AddFieldToStructType(fieldInfoType, kFieldnameStr, *typeU32); + GlobalTables::GetTypeTable().AddFieldToStructType(fieldInfoType, kFieldNameStr, *typeU32); GlobalTables::GetTypeTable().AddFieldToStructType(fieldInfoType, kAnnotationStr, *typeU32); - GlobalTables::GetTypeTable().AddFieldToStructType(fieldInfoType, kDeclaringclassStr, *GetRefFieldType(mirBuilder)); + GlobalTables::GetTypeTable().AddFieldToStructType(fieldInfoType, kDeclaringclassStr, *GetRefFieldType()); fieldsInfoTyIdx = GenMetaStructType(mirModule, fieldInfoType, kFieldInfoTypeName); // FieldInfoType Compact. MIRStructType fieldInfoCompactType(kTypeStruct); @@ -1589,7 +1662,6 @@ void ReflectionAnalysis::GenMetadataType(MIRModule &mirModule) { MIRStructType fieldOffsetDataType(kTypeStruct); GlobalTables::GetTypeTable().AddFieldToStructType(fieldOffsetDataType, kFieldOffsetDataStr, *typeVoidPtr); fieldOffsetDataTyIdx = GenMetaStructType(mirModule, fieldOffsetDataType, kFieldOffsetDataTypeName); - } void ReflectionAnalysis::GenClassHashMetaData() { @@ -1612,34 +1684,34 @@ void ReflectionAnalysis::GenClassHashMetaData() { } for (MIRSymbol *classSt : classTab) { AddrofNode *classExpr = mirBuilder.CreateExprAddrof(0, *classSt); - MIRType &ptrType = *GlobalTables::GetTypeTable().GetTypeTable()[PTY_ptr]; + MIRType *ptrType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(PTY_ptr); MIRConst *classConst = - module.GetMemPool()->New(classExpr->GetStIdx(), classExpr->GetFieldID(), ptrType); + module.GetMemPool()->New(classExpr->GetStIdx(), classExpr->GetFieldID(), *ptrType); bucketAggconst->PushBack(classConst); } bucketSt->SetKonst(bucketAggconst); } static void ReflectionAnalysisGenStrTab(MIRModule &mirModule, const std::string &strTab, - const std::string &strtabName) { - MIRBuilder &mirBuilder = *(mirModule.GetMIRBuilder()); - size_t strtabSize = strTab.length(); - if (strtabSize == 1) { + const std::string &strTabName) { + MIRBuilder *mirBuilder = mirModule.GetMIRBuilder(); + size_t strTabSize = strTab.length(); + if (strTabSize == 1) { return; } - MIRArrayType &strtabType = - *GlobalTables::GetTypeTable().GetOrCreateArrayType(*GlobalTables::GetTypeTable().GetUInt8(), strtabSize); - MIRSymbol *strtabSt = mirBuilder.CreateGlobalDecl(strtabName.c_str(), strtabType); - MIRAggConst *strtabAggconst = mirModule.GetMemPool()->New(mirModule, strtabType); - if (strtabAggconst == nullptr) { + MIRArrayType &strTabType = + *GlobalTables::GetTypeTable().GetOrCreateArrayType(*GlobalTables::GetTypeTable().GetUInt8(), strTabSize); + MIRSymbol *strTabSt = mirBuilder->CreateGlobalDecl(strTabName, strTabType); + MIRAggConst *strTabAggconst = mirModule.GetMemPool()->New(mirModule, strTabType); + if (strTabAggconst == nullptr) { return; } - strtabSt->SetStorageClass(kScFstatic); - for (const char &c : strTab) { - MIRConst *newconst = mirModule.GetMemPool()->New(c, *GlobalTables::GetTypeTable().GetUInt8()); - strtabAggconst->PushBack(newconst); + strTabSt->SetStorageClass(kScFstatic); + for (char c : strTab) { + MIRConst *newConst = mirModule.GetMemPool()->New(c, *GlobalTables::GetTypeTable().GetUInt8()); + strTabAggconst->PushBack(newConst); } - strtabSt->SetKonst(strtabAggconst); + strTabSt->SetKonst(strTabAggconst); } void ReflectionAnalysis::GenStrTab(MIRModule &mirModule) { @@ -1651,8 +1723,8 @@ void ReflectionAnalysis::GenStrTab(MIRModule &mirModule) { hotStrtabName = NameMangler::kReflectionRunHotStrtabPrefixStr + mirModule.GetFileNameAsPostfix(); ReflectionAnalysisGenStrTab(mirModule, strTabRunHot, hotStrtabName); // Cold string tab. - std::string strtabName = NameMangler::kReflectionStrtabPrefixStr + mirModule.GetFileNameAsPostfix(); - ReflectionAnalysisGenStrTab(mirModule, strTab, strtabName); + std::string strTabName = NameMangler::kReflectionStrtabPrefixStr + mirModule.GetFileNameAsPostfix(); + ReflectionAnalysisGenStrTab(mirModule, strTab, strTabName); } void ReflectionAnalysis::MarkWeakMethods() { @@ -1660,12 +1732,12 @@ void ReflectionAnalysis::MarkWeakMethods() { GetOrCreateGStrIdxFromName(NameMangler::kJavaLangObjectStr), GetOrCreateGStrIdxFromName(kReflectionReferencePrefixStr) }; for (GStrIdx nameIdx : classNames) { - Klass *klass = klassh->GetKlassFromStrIdx(nameIdx); + Klass *klass = klassH->GetKlassFromStrIdx(nameIdx); if (klass == nullptr) { continue; } MIRClassType *classType = klass->GetMIRClassType(); - for (MethodPair const &methodPair : classType->GetMethods()) { + for (const MethodPair &methodPair : classType->GetMethods()) { MIRSymbol *funcSym = GlobalTables::GetGsymTable().GetSymbolFromStidx(methodPair.first.Idx()); MIRFunction *mirfunc = funcSym->GetFunction(); if (RootClassDefined()) { @@ -1677,16 +1749,17 @@ void ReflectionAnalysis::MarkWeakMethods() { } } + void ReflectionAnalysis::Run() { MarkWeakMethods(); GenMetadataType(*mirModule); - const MapleVector &klasses = klassh->GetTopoSortedKlasses(); + const MapleVector &klasses = klassH->GetTopoSortedKlasses(); if (kRADebug) { LogInfo::MapleLogger(kLlErr) << "========= Gen Class: Total " << klasses.size() << " ========\n"; } // Cluster classname together in reflection string table to improve the locality. for (Klass *klass : klasses) { - ASSERT(klass != nullptr, "null ptr check!"); + ASSERT_NOT_NULL(klass); GenHotClassNameString(*klass); } for (Klass *klass : klasses) { @@ -1701,9 +1774,9 @@ void ReflectionAnalysis::Run() { GenClassHashMetaData(); } -AnalysisResult *DoReflectionAnalysis::Run(MIRModule *module, ModuleResultMgr *mrm) { +AnalysisResult *DoReflectionAnalysis::Run(MIRModule *module, ModuleResultMgr *moduleResultMgr) { MemPool *memPool = memPoolCtrler.NewMemPool("ReflectionAnalysis mempool"); - auto *kh = static_cast(mrm->GetAnalysisResult(MoPhase_CHA, module)); + auto *kh = static_cast(moduleResultMgr->GetAnalysisResult(MoPhase_CHA, module)); maple::MIRBuilder mirBuilder(module); ReflectionAnalysis *rv = memPool->New(module, memPool, kh, mirBuilder); if (rv == nullptr) { diff --git a/src/mpl2mpl/src/vtable_analysis.cpp b/src/mpl2mpl/src/vtable_analysis.cpp index 8c338609c1e0551b7707e3f06abce294e000c5a4..9d25d3af947d54608a19ee059c62c43c30b7ca04 100644 --- a/src/mpl2mpl/src/vtable_analysis.cpp +++ b/src/mpl2mpl/src/vtable_analysis.cpp @@ -16,6 +16,13 @@ #include "reflection_analysis.h" #include "itab_util.h" +namespace { +using namespace maple; +// +1 is needed here because our field id starts with 0 pointing to the struct itself +constexpr uint32 kKlassItabFieldID = static_cast(ClassProperty::kItab) + 1; +constexpr uint32 kKlassVtabFieldID = static_cast(ClassProperty::kVtab) + 1; +} // namespace + // Vtableanalysis // This phase is mainly to generate the virtual table && iterface table. // The virtual table just store the virtual method address. And the interface @@ -23,7 +30,6 @@ // and function address.And we also move the hot function to the front iterface // table.If the hash number is conflicted,we stored the whole completed methodname at the // end of interface table. - namespace maple { VtableAnalysis::VtableAnalysis(MIRModule *mod, KlassHierarchy *kh, bool dump) : FuncOptimizeImpl(mod, kh, dump) { voidPtrType = GlobalTables::GetTypeTable().GetVoidPtr(); @@ -40,17 +46,18 @@ VtableAnalysis::VtableAnalysis(MIRModule *mod, KlassHierarchy *kh, bool dump) : GenItableDefinition(*klass); } if (trace) { - DumpVtableList(klass); + DumpVtableList(*klass); } } } bool VtableAnalysis::IsVtableCandidate(const MIRFunction &func) const { - return (func.GetAttr(FUNCATTR_virtual) && !func.GetAttr(FUNCATTR_private) && !func.GetAttr(FUNCATTR_static)); + return func.GetAttr(FUNCATTR_virtual) && !func.GetAttr(FUNCATTR_private) && !func.GetAttr(FUNCATTR_static); } // Return true if virtual functions can be set override relationship cross package -bool VtableAnalysis::CheckOverrideForCrossPackage(const MIRFunction &baseMethod, const MIRFunction &currMethod) const { +bool VtableAnalysis::CheckOverrideForCrossPackage(const MIRFunction &baseMethod, + const MIRFunction &currMethod) const { const std::string &baseClassName = baseMethod.GetBaseClassName(); size_t basePos = baseClassName.rfind(NameMangler::kPackageNameSplitterStr); std::string basePackageName = (basePos != std::string::npos) ? baseClassName.substr(0, basePos) : ""; @@ -59,31 +66,31 @@ bool VtableAnalysis::CheckOverrideForCrossPackage(const MIRFunction &baseMethod, std::string currPackageName = (currPos != std::string::npos) ? currClassName.substr(0, currPos) : ""; // For the corss package inheritance, only if the base func is declared // as either 'public' or 'protected', we shall set override relationship. - return ((currPackageName == basePackageName) || baseMethod.GetAttr(FUNCATTR_public) || - baseMethod.GetAttr(FUNCATTR_protected)); + return (currPackageName == basePackageName) || baseMethod.GetAttr(FUNCATTR_public) || + baseMethod.GetAttr(FUNCATTR_protected); } // If the method is not in method_table yet, add it in, otherwise update it. // Note: the method to add should already pass VtableCandidate test -void VtableAnalysis::AddMethodToTable(MethodPtrVector &methodTable, MethodPair &methodpair) { - MIRFunction *method = builder->GetFunctionFromStidx(methodpair.first); - ASSERT(method != nullptr, "null ptr check!"); +void VtableAnalysis::AddMethodToTable(MethodPtrVector &methodTable, MethodPair &methodPair) { + MIRFunction *method = builder->GetFunctionFromStidx(methodPair.first); + ASSERT_NOT_NULL(method); GStrIdx strIdx = method->GetBaseFuncNameWithTypeStrIdx(); - for (size_t i = 0; i < methodTable.size(); i++) { + for (size_t i = 0; i < methodTable.size(); ++i) { MIRFunction *currFunc = builder->GetFunctionFromStidx(methodTable[i]->first); - ASSERT(currFunc != nullptr, "null ptr check!"); + ASSERT_NOT_NULL(currFunc); GStrIdx currStrIdx = currFunc->GetBaseFuncNameWithTypeStrIdx(); if (strIdx == currStrIdx) { if (CheckOverrideForCrossPackage(*currFunc, *method)) { // only update when it's not an abstract method if (!method->IsAbstract()) { - methodTable[i] = &methodpair; + methodTable[i] = &methodPair; } return; } } } - methodTable.push_back(&methodpair); + methodTable.push_back(&methodPair); } void VtableAnalysis::GenVtableList(const Klass &klass) { @@ -93,7 +100,7 @@ void VtableAnalysis::GenVtableList(const Klass &klass) { for (const Klass *parentKlass : klass.GetSuperKlasses()) { MIRInterfaceType *parentInterfaceType = parentKlass->GetMIRInterfaceType(); for (MethodPair *methodPair : parentInterfaceType->GetVTableMethods()) { - ASSERT(methodPair != nullptr, "null ptr check!"); + ASSERT_NOT_NULL(methodPair); AddMethodToTable(iType->GetVTableMethods(), *methodPair); } } @@ -112,14 +119,14 @@ void VtableAnalysis::GenVtableList(const Klass &klass) { } // vtable from implemented interfaces, need to merge in. both default or none-default // Note, all interface methods are also virtual methods, need to be in vtable too. - for (TyIdx const &tyIdx : curType->GetInterfaceImplemented()) { + for (TyIdx tyIdx : curType->GetInterfaceImplemented()) { auto *iType = static_cast(GlobalTables::GetTypeTable().GetTypeFromTyIdx(tyIdx)); for (MethodPair *methodPair : iType->GetVTableMethods()) { MIRFunction *method = builder->GetFunctionFromStidx(methodPair->first); GStrIdx strIdx = method->GetBaseFuncNameWithTypeStrIdx(); Klass *iklass = klassHierarchy->GetKlassFromFunc(method); bool found = false; - for (size_t i = 0; i < curType->GetVTableMethods().size(); i++) { + for (size_t i = 0; i < curType->GetVTableMethods().size(); ++i) { MIRFunction *curMethod = builder->GetFunctionFromStidx(curType->GetVTableMethods()[i]->first); GStrIdx currStrIdx = curMethod->GetBaseFuncNameWithTypeStrIdx(); Klass *currKlass = klassHierarchy->GetKlassFromFunc(curMethod); @@ -139,11 +146,11 @@ void VtableAnalysis::GenVtableList(const Klass &klass) { } } // then methods defined in this class - for (MethodPair &methodpair : curType->GetMethods()) { - MIRFunction *curMethod = builder->GetFunctionFromStidx(methodpair.first); - ASSERT(curMethod != nullptr, "null ptr check!"); + for (MethodPair &methodPair : curType->GetMethods()) { + MIRFunction *curMethod = builder->GetFunctionFromStidx(methodPair.first); + ASSERT_NOT_NULL(curMethod); if (IsVtableCandidate(*curMethod)) { - AddMethodToTable(curType->GetVTableMethods(), methodpair); + AddMethodToTable(curType->GetVTableMethods(), methodPair); } // Optimization: mark private methods as local if (curType->IsLocal() && curMethod->IsPrivate() && !curMethod->IsConstructor()) { @@ -151,9 +158,9 @@ void VtableAnalysis::GenVtableList(const Klass &klass) { } } // Create initial cached vtable mapping - for (size_t i = 0; i < curType->GetVTableMethods().size(); i++) { + for (size_t i = 0; i < curType->GetVTableMethods().size(); ++i) { MIRFunction *curMethod = builder->GetFunctionFromStidx(curType->GetVTableMethods()[i]->first); - ASSERT(curMethod != nullptr, "null ptr check!"); + ASSERT_NOT_NULL(curMethod); puidxToVtabIndex[curMethod->GetPuidx()] = i; } } @@ -161,15 +168,16 @@ void VtableAnalysis::GenVtableList(const Klass &klass) { void VtableAnalysis::GenVtableDefinition(const Klass &klass) { MIRStructType *curType = klass.GetMIRStructType(); - MIRAggConst *newconst = GetMIRModule().GetMemPool()->New(GetMIRModule(), *voidPtrType); - ASSERT(newconst != nullptr, "null ptr check!"); + auto *newConst = GetMIRModule().GetMemPool()->New(GetMIRModule(), *voidPtrType); + ASSERT_NOT_NULL(newConst); for (MethodPair *methodPair : curType->GetVTableMethods()) { MIRFunction *vtabMethod = builder->GetFunctionFromStidx(methodPair->first); - ASSERT(vtabMethod != nullptr, "null ptr check!"); - AddroffuncNode *addrofFuncNode = builder->CreateExprAddroffunc(vtabMethod->GetPuidx(), GetMIRModule().GetMemPool()); - MIRConst *constNode = GetMIRModule().GetMemPool()->New(addrofFuncNode->GetPUIdx(), - *voidPtrType); - newconst->PushBack(constNode); + ASSERT_NOT_NULL(vtabMethod); + AddroffuncNode *addrofFuncNode = builder->CreateExprAddroffunc(vtabMethod->GetPuidx(), + GetMIRModule().GetMemPool()); + auto *constNode = GetMIRModule().GetMemPool()->New(addrofFuncNode->GetPUIdx(), + *voidPtrType); + newConst->PushBack(constNode); } // We also need to generate vtable and itable even if the class does not // have any virtual method, or does not implement any interface. Such a @@ -179,14 +187,14 @@ void VtableAnalysis::GenVtableDefinition(const Klass &klass) { // convey this information is having a trivial table. Alternatively, we can // postpone this step to mplcg, where mplcg discovers all classes that does // not have any vtable or itable. - if (newconst->GetConstVec().empty()) { - newconst->PushBack(zeroConst); + if (newConst->GetConstVec().empty()) { + newConst->PushBack(zeroConst); } - GenTableSymbol(VTAB_PREFIX_STR, klass.GetKlassName(), *newconst); + GenTableSymbol(VTAB_PREFIX_STR, klass.GetKlassName(), *newConst); } std::string VtableAnalysis::DecodeBaseNameWithType(const MIRFunction &func) { - std::string baseName = NameMangler::DecodeName(func.GetBaseFuncName().c_str()); + const std::string &baseName = NameMangler::DecodeName(func.GetBaseFuncName().c_str()); std::string signatureName = NameMangler::DecodeName(func.GetSignature().c_str()); ReflectionAnalysis::ConvertMethodSig(signatureName); std::string baseNameWithType = baseName + "|" + signatureName; @@ -205,7 +213,7 @@ void VtableAnalysis::GenItableDefinition(const Klass &klass) { MIRInterfaceType *interfaceType = implInterface->GetMIRInterfaceType(); for (MethodPair &methodPair : interfaceType->GetMethods()) { MIRFunction *interfaceMethod = builder->GetFunctionFromStidx(methodPair.first); - ASSERT(interfaceMethod != nullptr, "null ptr check!"); + ASSERT_NOT_NULL(interfaceMethod); int64 hashCode = GetHashIndex(DecodeBaseNameWithType(*interfaceMethod).c_str()); GStrIdx interfaceMethodStridx = interfaceMethod->GetBaseFuncNameWithTypeStrIdx(); if (signatureVisited.find(interfaceMethodStridx) == signatureVisited.end()) { @@ -267,7 +275,7 @@ void VtableAnalysis::GenItableDefinition(const Klass &klass) { } if (count == 0) { // If no conflict exists, reduce the unnecessary zero element at the end - for (int i = kItabFirstHashSize - 1; i >= 0; i--) { + for (int i = kItabFirstHashSize - 1; i >= 0; --i) { if (!firstItabVec[i] && !firstConflictFlag[i]) { firstItabVec.pop_back(); } else { @@ -276,8 +284,8 @@ void VtableAnalysis::GenItableDefinition(const Klass &klass) { } } // Create the first-level itable, which is directly accessed as an array - MIRAggConst *firstItabEmitArray = GetMIRModule().GetMemPool()->New(GetMIRModule(), *voidPtrType); - ASSERT(firstItabEmitArray != nullptr, "null ptr check!"); + auto *firstItabEmitArray = GetMIRModule().GetMemPool()->New(GetMIRModule(), *voidPtrType); + ASSERT_NOT_NULL(firstItabEmitArray); for (MIRFunction *func : firstItabVec) { if (func != nullptr) { firstItabEmitArray->PushBack( @@ -288,11 +296,11 @@ void VtableAnalysis::GenItableDefinition(const Klass &klass) { } // initialize conflict solution array if (count != 0) { - MIRAggConst *secondItabEmitArray = GetMIRModule().GetMemPool()->New(GetMIRModule(), *voidPtrType); + auto *secondItabEmitArray = GetMIRModule().GetMemPool()->New(GetMIRModule(), *voidPtrType); // remember count in secondItabVec secondItabEmitArray->PushBack(GetMIRModule().GetMemPool()->New(count, *voidPtrType)); secondItabEmitArray->PushBack(oneConst); // padding - for (uint32 i = 0; i < kItabSecondHashSize; i++) { + for (uint32 i = 0; i < kItabSecondHashSize; ++i) { if (!secondItab[i] && !secondConflictFlag[i]) { continue; } else { @@ -307,7 +315,7 @@ void VtableAnalysis::GenItableDefinition(const Klass &klass) { } } for (MIRFunction *func : secondConflictList) { - ASSERT(func != nullptr, "null ptr check!"); + ASSERT_NOT_NULL(func); const std::string &signatureName = DecodeBaseNameWithType(*func); uint32 nameIdx = ReflectionAnalysis::FindOrInsertRepeatString(signatureName); secondItabEmitArray->PushBack(GetMIRModule().GetMemPool()->New(nameIdx, *voidPtrType)); @@ -324,23 +332,24 @@ void VtableAnalysis::GenItableDefinition(const Klass &klass) { GenTableSymbol(ITAB_PREFIX_STR, klass.GetKlassName(), *firstItabEmitArray); } -void VtableAnalysis::GenTableSymbol(const std::string &prefix, const std::string klassName, MIRAggConst &newconst) { - size_t arraySize = newconst.GetConstVec().size(); - MIRArrayType &arrayType = *GlobalTables::GetTypeTable().GetOrCreateArrayType(*voidPtrType, arraySize); - MIRSymbol *vtabSt = builder->CreateGlobalDecl((prefix + klassName).c_str(), arrayType); +void VtableAnalysis::GenTableSymbol(const std::string &prefix, const std::string klassName, + MIRAggConst &newConst) const { + size_t arraySize = newConst.GetConstVec().size(); + MIRArrayType *arrayType = GlobalTables::GetTypeTable().GetOrCreateArrayType(*voidPtrType, arraySize); + MIRSymbol *vtabSt = builder->CreateGlobalDecl((prefix + klassName).c_str(), *arrayType); if (klassName == NameMangler::GetInternalNameLiteral(NameMangler::kJavaLangObjectStr)) { vtabSt->SetStorageClass(kScGlobal); } else { vtabSt->SetStorageClass(kScFstatic); } - vtabSt->SetKonst(&newconst); + vtabSt->SetKonst(&newConst); } -void VtableAnalysis ::DumpVtableList(const Klass *klass) const { - LogInfo::MapleLogger() << "=========" << klass->GetKlassName() << "========\n"; - for (MethodPair *vtableMethod : klass->GetMIRStructType()->GetVTableMethods()) { +void VtableAnalysis ::DumpVtableList(const Klass &klass) const { + LogInfo::MapleLogger() << "=========" << klass.GetKlassName() << "========\n"; + for (MethodPair *vtableMethod : klass.GetMIRStructType()->GetVTableMethods()) { MIRFunction *method = builder->GetFunctionFromStidx(vtableMethod->first); - ASSERT(method != nullptr, "null ptr check!"); + ASSERT_NOT_NULL(method); LogInfo::MapleLogger() << method->GetName() << "\n"; } } @@ -413,8 +422,8 @@ void VtableAnalysis::ReplaceSuperclassInvoke(CallNode &stmt) { } void VtableAnalysis::ReplacePolymorphicInvoke(CallNode &stmt) { - IntrinsiccallNode *intrinCall = - GetMIRModule().CurFuncCodeMemPool()->New(GetMIRModule(), OP_xintrinsiccallassigned); + auto *intrinCall = + GetMIRModule().CurFuncCodeMemPool()->New(GetMIRModule(), OP_xintrinsiccallassigned); intrinCall->SetIntrinsic(INTRN_JAVA_POLYMORPHIC_CALL); intrinCall->SetNumOpnds(stmt.GetNumOpnds()); intrinCall->SetReturnVec(stmt.GetReturnVec()); @@ -422,20 +431,19 @@ void VtableAnalysis::ReplacePolymorphicInvoke(CallNode &stmt) { currFunc->GetBody()->ReplaceStmt1WithStmt2(&stmt, intrinCall); } -BaseNode *VtableAnalysis::GenVtabItabBaseAddr(BaseNode *obj, bool isVirtual) { - ASSERT(builder != nullptr, "null ptr check!"); - BaseNode *classInfoAddress = ReflectionAnalysis::GenClassInfoAddr(obj, *builder); +BaseNode *VtableAnalysis::GenVtabItabBaseAddr(BaseNode &obj, bool isVirtual) { + ASSERT_NOT_NULL(builder); + BaseNode *classInfoAddress = ReflectionAnalysis::GenClassInfoAddr(&obj, *builder); auto *classMetadataType = static_cast( GlobalTables::GetTypeTable().GetTypeFromTyIdx(ReflectionAnalysis::GetClassMetaDataTyIdx())); return builder->CreateExprIread(*voidPtrType, *GlobalTables::GetTypeTable().GetOrCreatePointerType(*classMetadataType), - (isVirtual ? KLASS_VTAB_FIELDID : KLASS_ITAB_FIELDID), classInfoAddress); + (isVirtual ? kKlassVtabFieldID : kKlassItabFieldID), classInfoAddress); } void VtableAnalysis::ReplaceVirtualInvoke(CallNode &stmt) { MIRFunction *callee = GlobalTables::GetFunctionTable().GetFunctionFromPuidx(stmt.GetPUIdx()); - ASSERT(callee != nullptr, "null ptr check!"); CHECK_FATAL(callee->GetParamSize() != 0, "container check"); auto *firstFormalArgType = static_cast(callee->GetNthParamType(0)); MIRType *pointedType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(firstFormalArgType->GetPointedTyIdx()); @@ -454,12 +462,12 @@ void VtableAnalysis::ReplaceVirtualInvoke(CallNode &stmt) { } else { GStrIdx calleeStridx = callee->GetBaseFuncNameWithTypeStrIdx(); ASSERT(structType != nullptr, "null ptr check!"); - for (size_t id1 = 0; id1 < structType->GetVTableMethods().size(); id1++) { - MIRFunction *vtableMethod = builder->GetFunctionFromStidx(structType->GetVTableMethods()[id1]->first); + for (size_t id = 0; id < structType->GetVTableMethods().size(); ++id) { + MIRFunction *vtableMethod = builder->GetFunctionFromStidx(structType->GetVTableMethods()[id]->first); ASSERT(vtableMethod != nullptr, "null ptr check!"); if (calleeStridx == vtableMethod->GetBaseFuncNameWithTypeStrIdx()) { - entryOffset = id1; - puidxToVtabIndex[callee->GetPuidx()] = id1; + entryOffset = id; + puidxToVtabIndex[callee->GetPuidx()] = id; break; } } @@ -469,7 +477,7 @@ void VtableAnalysis::ReplaceVirtualInvoke(CallNode &stmt) { } BaseNode *offsetNode = builder->CreateIntConst(entryOffset * kTabEntrySize, PTY_u32); CHECK_FATAL(!stmt.GetNopnd().empty(), "container check"); - BaseNode *tabBaseAddress = GenVtabItabBaseAddr(stmt.GetNopndAt(0), true); + BaseNode *tabBaseAddress = GenVtabItabBaseAddr(*stmt.GetNopndAt(0), true); BaseNode *addrNode = builder->CreateExprBinary(OP_add, *GlobalTables::GetTypeTable().GetPtr(), tabBaseAddress, offsetNode); BaseNode *readFuncPtr = builder->CreateExprIread( @@ -482,11 +490,11 @@ void VtableAnalysis::ReplaceVirtualInvoke(CallNode &stmt) { void VtableAnalysis::ReplaceInterfaceInvoke(CallNode &stmt) { - CHECK_FATAL(stmt.GetNopnd().empty() == false, "container check"); - BaseNode *tabBaseAddress = GenVtabItabBaseAddr(stmt.GetNopndAt(0), false); + CHECK_FATAL(!stmt.GetNopnd().empty(), "container check"); + BaseNode *tabBaseAddress = GenVtabItabBaseAddr(*stmt.GetNopndAt(0), false); MemPool *currentFuncMp = builder->GetCurrentFuncCodeMp(); - ASSERT(currentFuncMp != nullptr, "null ptr check!"); - ResolveFuncNode *resolveNode = currentFuncMp->New( + ASSERT_NOT_NULL(currentFuncMp); + auto *resolveNode = currentFuncMp->New( OP_resolveinterfacefunc, GlobalTables::GetTypeTable().GetCompactPtr()->GetPrimType(), stmt.GetPUIdx(), tabBaseAddress, builder->GetConstUInt32(0)); stmt.SetOpCode(OP_interfaceicallassigned); diff --git a/src/mpl2mpl/src/vtable_impl.cpp b/src/mpl2mpl/src/vtable_impl.cpp index 5ac571d71f24eb9d2607e7fcecbed01d744ae81b..93eb360e52651bc0588e6eb37f7daf702116ab3a 100644 --- a/src/mpl2mpl/src/vtable_impl.cpp +++ b/src/mpl2mpl/src/vtable_impl.cpp @@ -19,11 +19,17 @@ // This phase is mainly to lower interfacecall into icall +namespace { +#ifdef USE_32BIT_REF +constexpr char kInterfaceMethod[] = "MCC_getFuncPtrFromItab"; +#else +constexpr char kInterfaceMethod[] = "MCC_getFuncPtrFromItabSecondHash64"; +#endif +} // namespace + namespace maple { VtableImpl::VtableImpl(MIRModule *mod, KlassHierarchy *kh, bool dump) - : FuncOptimizeImpl(mod, kh, dump), - mirModule(mod) { - klassHierarchy = kh; + : FuncOptimizeImpl(mod, kh, dump), mirModule(mod) { mccItabFunc = builder->GetOrCreateFunction(kInterfaceMethod, TyIdx(PTY_ptr)); mccItabFunc->SetAttr(FUNCATTR_nosideeffect); } @@ -42,8 +48,8 @@ void VtableImpl::ProcessFunc(MIRFunction *func) { case OP_regassign: { auto *regassign = static_cast(stmt); BaseNode *rhs = regassign->Opnd(); - ASSERT(rhs != nullptr, "null ptr check!"); - if (rhs->GetOpCode() == maple::OP_resolveinterfacefunc) { + ASSERT_NOT_NULL(rhs); + if (rhs->GetOpCode() == OP_resolveinterfacefunc) { ReplaceResolveInterface(*stmt, *(static_cast(rhs))); } break; @@ -60,7 +66,7 @@ void VtableImpl::ProcessFunc(MIRFunction *func) { icallNode->SetSrcPos(callNode->GetSrcPos()); icallNode->GetNopnd().resize(callNode->GetNopndSize()); icallNode->SetNumOpnds(icallNode->GetNopndSize()); - for (size_t i = 0; i < callNode->GetNopndSize(); i++) { + for (size_t i = 0; i < callNode->GetNopndSize(); ++i) { icallNode->SetOpnd(callNode->GetNopndAt(i)->CloneTree(mirModule->GetCurFuncCodeMPAllocator()), i); } currFunc->GetBody()->ReplaceStmt1WithStmt2(stmt, icallNode); @@ -70,7 +76,7 @@ void VtableImpl::ProcessFunc(MIRFunction *func) { case OP_icallassigned: { auto *icall = static_cast(stmt); BaseNode *firstParm = icall->GetNopndAt(0); - ASSERT(firstParm != nullptr, "null ptr check!"); + ASSERT_NOT_NULL(firstParm); if (firstParm->GetOpCode() == maple::OP_resolveinterfacefunc) { ReplaceResolveInterface(*stmt, *(static_cast(firstParm))); } @@ -103,7 +109,6 @@ void VtableImpl::ProcessFunc(MIRFunction *func) { void VtableImpl::ReplaceResolveInterface(StmtNode &stmt, const ResolveFuncNode &resolveNode) { MIRFunction *func = GlobalTables::GetFunctionTable().GetFunctionFromPuidx(resolveNode.GetPuIdx()); - ASSERT(func != nullptr, "null ptr check!"); std::string signature = VtableAnalysis::DecodeBaseNameWithType(*func); int64 hashCode = GetHashIndex(signature.c_str()); PregIdx pregItabAddress = currFunc->GetPregTab()->CreatePreg(PTY_ptr);