diff --git a/doc/Programming_Specifications.md b/doc/Programming_Specifications.md index b6b00fb859b0f85870839416f11aa1128989b660..4d598b81fd231888956ec55d5625f9dd83163b54 100644 --- a/doc/Programming_Specifications.md +++ b/doc/Programming_Specifications.md @@ -557,7 +557,7 @@ default: // Bad: default 未缩进 // 假设下面第一行已经不满足行宽要求 ```cpp if (currentValue > threshold && - someConditionsion) { + someConditionsion) { DoSomething(); ... } @@ -1069,7 +1069,7 @@ FIXME 注释一般用来描述已知缺陷 头文件应当职责单一。头文件过于复杂,依赖过于复杂还是导致编译时间过长的主要原因。 ### 建议5.1.1 每一个.cpp文件应有一个对应的.h文件,用于声明需要对外公开的类与接口 -通常情况下,每个.cpp文件都有一个相应的.h,用于放置对外提供的函数声明、宏定义、类型定义等。 +通常情况下,每个.cpp文件都有一个相应的.h,用于放置对外提供的函数声明、宏定义、类型定义等。另外,可根据实际情况添加对应的.inline.h文件优化代码。 如果一个.cpp文件不需要对外公布任何接口,则其就不应当存在。 例外:__程序的入口(如main函数所在的文件),单元测试代码,动态库代码。__ @@ -1575,7 +1575,7 @@ int main(void) { 说明:如果用户不定义,编译器默认会生成拷贝构造函数和拷贝赋值操作符, 移动构造和移动赋值操作符(移动语义的函数C++11以后才有)。 如果我们不要使用拷贝构造函数,或者赋值操作符,请明确拒绝: -1. 将拷贝构造函数或者赋值操作符设置为private,并且不实现: +1.将拷贝构造函数或者赋值操作符设置为private,并且不实现: ```cpp class Foo { @@ -1584,12 +1584,20 @@ class Foo { Foo& operator=(const Foo&); }; ``` -2. 使用C++11提供的delete, 请参见后面现代C++的相关章节。 -3. 静态方法类,禁用构造函数,防止创建实例 +2.使用C++11提供的delete: ```cpp -class Helper -{ +// 同时禁止, 使用C++11的delete +class Foo { + public: + Foo(Foo&&) = delete; + Foo& operator=(Foo&&) = delete; +}; +``` +3.静态方法类,禁用构造函数,防止创建实例 + +```cpp +class Helper { public: static bool DoSomething(); @@ -1597,25 +1605,26 @@ class Helper Helper(); }; ``` -4. 单例类,禁用构造函数,拷贝构造函数,防止创建实例 +4.单例类,禁用构造函数,拷贝构造函数,防止创建实例 ```cpp class Foo { private: - static Foo *instance_; + static Foo *instance; Foo() {} Foo(const Foo &a); Foo& operator=(const Foo &a); public: - static Foo &instance() { - if (!instance_) - instance_ = new Foo(); - return *instance_; + static Foo &Instance() { + if (!instance) { + instance = new Foo(); + } + return *instance; } }; ``` -5. 析构函数通过裸指针释放资源的,禁用拷贝构造、拷贝赋值,防止重复释放 +5.析构函数通过裸指针释放资源的,禁用拷贝构造、拷贝赋值,防止重复释放 ```cpp class Foo { @@ -1633,8 +1642,7 @@ class Foo { } }; - -Foo* Foo::instance_ = nullptr; +Foo* Foo::instance = nullptr; ``` ### 规则7.1.4 拷贝构造和拷贝赋值操作符应该是成对出现或者禁止 diff --git a/src/BUILD.gn b/src/BUILD.gn index 6d5231e842923c4347a6dd93e94316c529a39e16..cab2a1b79d3541c98bbae37bddacb7b414c6771f 100644 --- a/src/BUILD.gn +++ b/src/BUILD.gn @@ -32,5 +32,6 @@ config("mapleallcompilecfg") { group("mapleall") { deps = [ "${MAPLEALL_ROOT}/maple_driver:maple", + "${MAPLEALL_ROOT}/maple_ir:irbuild", ] } diff --git a/src/bin/jbc2mpl b/src/bin/jbc2mpl index c6fb0c159eec2691f5650a38165543d16c12961b..51eaf158335be60db30f8dc54f1d816e7073d01a 100755 Binary files a/src/bin/jbc2mpl and b/src/bin/jbc2mpl differ diff --git a/src/bin/maple b/src/bin/maple index 24f6c41ff53f701a150e89423934db0a43c849e5..3c894dc2065639965f7246dbd6880f6dba0d8731 100755 Binary files a/src/bin/maple and b/src/bin/maple differ diff --git a/src/bin/mplcg b/src/bin/mplcg index eadd67e6a2b0907a52d0c5a0ed77cc7e80bb3311..152930e4d0a333c61f7b0185f16d2f5ae9a5058b 100755 Binary files a/src/bin/mplcg and b/src/bin/mplcg differ diff --git a/src/deplibs/libmaple_driverutil.a b/src/deplibs/libmaple_driverutil.a index 8d75632400f7345efa44a50cab20629a04fbf0a8..2b49fd1e96ee2b8bbbf3732a55788b347c86d190 100644 Binary files a/src/deplibs/libmaple_driverutil.a and b/src/deplibs/libmaple_driverutil.a differ diff --git a/src/deplibs/libmplutil.a b/src/deplibs/libmplutil.a index 1870e9609bf3cc5dd868278603caa5bba58c4ad8..8ac35620d909d91934585a1ad68f288e133a356f 100644 Binary files a/src/deplibs/libmplutil.a and b/src/deplibs/libmplutil.a differ diff --git a/src/maple_driver/include/usages.h b/src/maple_driver/include/usages.h index de543715afb988833810fedb06a5d71e22a6e686..f466bdc3694e21433fe71d51cb1f48b10f78f275 100644 --- a/src/maple_driver/include/usages.h +++ b/src/maple_driver/include/usages.h @@ -27,6 +27,9 @@ enum OptionIndex { kRun, kOption, kAllDebug, + // ----------jbc2mpl begin------- + kUseStringFactory, + kJbc2mplOutMpl, //-------- comb begin-------- -- kCombTimePhases, kGenMeMpl, @@ -66,6 +69,12 @@ enum OptionIndex { kMpl2MplMapleLinker, kMplnkDumpMuid, kEmitVtableImpl, + //----------mplcg begin--------- + kCGQuiet, + kPie, + kPic, + kVerbose, + kCGMapleLinker, }; enum EnabledIndex { kDisable, kEnable }; @@ -242,6 +251,31 @@ const static mapleOption::Descriptor USAGES[] = { " --debug \tPrint debug info.\n", "all", { { nullptr } } }, + // jbc2mpl + { kUseStringFactory, + 0, + nullptr, + "use-string-factory", + nullptr, + false, + nullptr, + mapleOption::BuildType::kBuildTypeAll, + mapleOption::ArgCheckPolicy::kArgCheckPolicyNone, + " -use-string-factory \tReplace String. by StringFactory call\n", + "jbc2mpl", + { { nullptr } } }, + { kJbc2mplOutMpl, + 0, + "o", + "out", + nullptr, + false, + nullptr, + mapleOption::BuildType::kBuildTypeDebug, + mapleOption::ArgCheckPolicy::kArgCheckPolicyRequired, + " -o, -out=output.mpl \toutput mpl name\n", + "jbc2mpl", + { { nullptr } } }, // me { kMeHelp, 0, @@ -672,6 +706,115 @@ const static mapleOption::Descriptor USAGES[] = { "mpl2mpl", { { nullptr } } }, #endif + // mplcg + { kPie, + kEnable, + nullptr, + "pie", + nullptr, + false, + nullptr, + mapleOption::BuildType::kBuildTypeAll, + mapleOption::ArgCheckPolicy::kArgCheckPolicyNone, + " --pie \tGenerate position-independent executable\n", + "mplcg", + { { nullptr } } }, + { kPie, + kDisable, + nullptr, + "no-pie", + nullptr, + false, + nullptr, + mapleOption::BuildType::kBuildTypeAll, + mapleOption::ArgCheckPolicy::kArgCheckPolicyNone, + " --no-pie\n", + "mplcg", + { { nullptr } } }, + { kPic, + kEnable, + nullptr, + "fpic", + nullptr, + false, + nullptr, + mapleOption::BuildType::kBuildTypeAll, + mapleOption::ArgCheckPolicy::kArgCheckPolicyNone, + " --fpic \tGenerate position-independent shared library\n", + "mplcg", + { { nullptr } } }, + { kPic, + kDisable, + nullptr, + "no-fpic", + nullptr, + false, + nullptr, + mapleOption::BuildType::kBuildTypeAll, + mapleOption::ArgCheckPolicy::kArgCheckPolicyNone, + " --no-fpic\n", + "mplcg", + { { nullptr } } }, + { kVerbose, + kEnable, + nullptr, + "verbose-asm", + nullptr, + false, + nullptr, + mapleOption::BuildType::kBuildTypeAll, + mapleOption::ArgCheckPolicy::kArgCheckPolicyNone, + " --verbose-asm \tAdd comments to asm output\n", + "mplcg", + { { nullptr } } }, + { kVerbose, + kDisable, + nullptr, + "no-verbose-asm", + nullptr, + false, + nullptr, + mapleOption::BuildType::kBuildTypeAll, + mapleOption::ArgCheckPolicy::kArgCheckPolicyNone, + " --no-verbose-asm\n", + "mplcg", + { { nullptr } } }, + { kCGMapleLinker, + kEnable, + nullptr, + "maplelinker", + nullptr, + false, + nullptr, + mapleOption::BuildType::kBuildTypeAll, + mapleOption::ArgCheckPolicy::kArgCheckPolicyNone, + " --maplelinker \tGenerate the MapleLinker .s format\n", + "mplcg", + { { nullptr } } }, + { kCGQuiet, + kEnable, + nullptr, + "quiet", + nullptr, + false, + nullptr, + mapleOption::BuildType::kBuildTypeAll, + mapleOption::ArgCheckPolicy::kArgCheckPolicyNone, + " --quiet \tBe quiet (don't output debug messages)\n", + "mplcg", + { { nullptr } } }, + { kCGQuiet, + kDisable, + nullptr, + "no-quiet", + nullptr, + false, + nullptr, + mapleOption::BuildType::kBuildTypeAll, + mapleOption::ArgCheckPolicy::kArgCheckPolicyNone, + " --no-quiet\n", + "mplcg", + { { nullptr } } }, // End { kUnknown, diff --git a/src/maple_driver/src/maple_comb_compiler.cpp b/src/maple_driver/src/maple_comb_compiler.cpp index 0373f6b819b795865e6a75e224eac641dbe66a04..8578aa3340038e6c83f04e1040a86fd1abe286fa 100644 --- a/src/maple_driver/src/maple_comb_compiler.cpp +++ b/src/maple_driver/src/maple_comb_compiler.cpp @@ -59,11 +59,11 @@ void MapleCombCompiler::PrintCommand(const MplOptions &options) const { } else { runStr += "mpl2mpl"; } - } - auto inputMpl2mplOptions = options.exeOptions.find(kBinNameMpl2mpl); - for (auto &opt : inputMpl2mplOptions->second) { - connectSym = opt.Args() != "" ? "=" : ""; - optionStr += " --" + opt.OptionKey() + connectSym + opt.Args(); + auto inputMpl2mplOptions = options.exeOptions.find(kBinNameMpl2mpl); + for (auto &opt : inputMpl2mplOptions->second) { + connectSym = opt.Args() != "" ? "=" : ""; + optionStr += " --" + opt.OptionKey() + connectSym + opt.Args(); + } } optionStr += "\""; LogInfo::MapleLogger() << "Starting:" << options.exeFolder << "maple " << runStr << " " << optionStr << " " diff --git a/src/maple_driver/src/mpl_options.cpp b/src/maple_driver/src/mpl_options.cpp index 869d50e89fe4e8c5276df600fe548ed168298989..8b770293f3bb2656f4cec9189fa41ad91b3e717a 100644 --- a/src/maple_driver/src/mpl_options.cpp +++ b/src/maple_driver/src/mpl_options.cpp @@ -39,6 +39,7 @@ int MplOptions::Parse(int argc, char **argv) { if (ret != ErrorCode::kErrorNoError) { return ErrorCode::kErrorInvalidParameter; } + auto options = optionParser->GetOptions(); // We should recognize O0, O2 and run options firstly to decide the real options for (auto opt : optionParser->GetOptions()) { switch (opt.Index()) { @@ -264,43 +265,29 @@ ErrorCode MplOptions::UpdateExtraOptionOpt(const std::string &args) { } auto settingExe = runningExes.begin(); for (const auto &tempIt : temp) { - bool ret = true; + ErrorCode ret = ErrorCode::kErrorNoError; std::vector tmpArgs; // Split options with ' ' StringUtils::Split(tempIt, tmpArgs, ' '); auto &exeOption = exeOptions[*settingExe]; + ret = optionParser->HandleInputArgs(tmpArgs, *settingExe, exeOption); + if (ret != ErrorCode::kErrorNoError) { + return ret; + } + // Fill extraOption // For compiler bins called by system() auto &extraOption = extras[*settingExe]; - for (const auto &argsIt : tmpArgs) { + for (int i = 0; i < exeOption.size(); i++) { MplOption mplOption; - // If "=" is not in the string, indicates that it is an option without value - if (argsIt.find("=") == std::string::npos) { - if (!argsIt.empty()) { - // Set key only - mplOption.init(argsIt, "", " ", false, ""); - ret &= optionParser->SetOption(argsIt, "", *settingExe, exeOption); - } else { - continue; - } + if (exeOption[i].Args() != "") { + mplOption.init("-" + exeOption[i].OptionKey(), exeOption[i].Args(), "=", false, ""); } else { - // If "=" is in the string, indicates that it is an option with value - std::vector arg; - StringUtils::Split(argsIt, arg, '='); - if (arg.size() > 1) { - // Set key and value - mplOption.init(arg.at(0), arg.at(1), "=", false, ""); - ret &= optionParser->SetOption(arg.at(0), arg.at(1), *settingExe, exeOption); - } else { - WARN(kLncWarn, "warning no args after \'=\' for " + arg.at(0)); - continue; - } + mplOption.init("-" + exeOption[i].OptionKey(), "", " ", false, ""); } extraOption.push_back(mplOption); } - if (!ret) { - return ErrorCode::kErrorInvalidParameter; - } + settingExe++; } return ErrorCode::kErrorNoError; diff --git a/src/maple_ir/BUILD.gn b/src/maple_ir/BUILD.gn index 7566b5664f389acd53b301269b0496adb26f5ef6..0d5fa07eb62f6ee8ae1c0403c77a65038d3553d8 100644 --- a/src/maple_ir/BUILD.gn +++ b/src/maple_ir/BUILD.gn @@ -31,6 +31,8 @@ src_libmplir = [ "src/bin_mpl_export.cpp", ] +src_irbuild = [ "src/driver.cpp" ] + configs = [ "${MAPLEALL_ROOT}:mapleallcompilecfg" ] cflags_cc += [ "-DSTORE_BACK_VTABLE_REF_AFTER_LOAD=1" ] @@ -42,3 +44,19 @@ static_library("libmplir") { libs = [] libs += [ "${OPENSOURCE_DEPS}/libmplutil.a" ] } + +executable("irbuild") { + sources = src_irbuild + include_dirs = include_directories + deps = [ + ":libmplir", + "${MAPLEALL_ROOT}/huawei_secure_c:libHWSecureC", + "${MAPLEALL_ROOT}/mpl2mpl:libmpl2mpl", + ] + libs = [] + libs += [ + "${OPENSOURCE_DEPS}/libmplphase.a", + "${OPENSOURCE_DEPS}/libmempool.a", + "${OPENSOURCE_DEPS}/libmaple_driverutil.a", + ] +} diff --git a/src/maple_ir/include/intrinsics.def b/src/maple_ir/include/intrinsics.def index 6b4c23eb736a58dbab9e8a3c115960a43e22090b..c8fe2c60fdc5d5ae711a641377db1b057473ba85 100644 --- a/src/maple_ir/include/intrinsics.def +++ b/src/maple_ir/include/intrinsics.def @@ -25,6 +25,8 @@ DEF_MIR_INTRINSIC(MPL_GET_VTAB_FUNC,\ "MCC_getFuncPtrFromVtab", kIntrnUndef, kArgTyA64, kArgTyDynany, kArgTyDynany, kArgTyUndef, kArgTyUndef, kArgTyUndef, kArgTyUndef) DEF_MIR_INTRINSIC(MPL_READ_OVTABLE_ENTRY,\ "__mpl_const_offset", INTRNISPURE, kArgTyA32, kArgTyDynany, kArgTyUndef, kArgTyUndef, kArgTyUndef, kArgTyUndef, kArgTyUndef) +DEF_MIR_INTRINSIC(MPL_READ_OVTABLE_ENTRY_LAZY,\ + "__mpl_const_offset_lazy", INTRNNOSIDEEFFECT, kArgTyA32, kArgTyDynany, kArgTyUndef, kArgTyUndef, kArgTyUndef, kArgTyUndef, kArgTyUndef) DEF_MIR_INTRINSIC(MPL_READ_OVTABLE_ENTRY_VTAB_LAZY,\ "__mpl_const_offset_vtab_lazy", INTRNISPURE, kArgTyA32, kArgTyDynany, kArgTyDynany, kArgTyUndef, kArgTyUndef, kArgTyUndef, kArgTyUndef) DEF_MIR_INTRINSIC(MPL_READ_OVTABLE_ENTRY_FIELD_LAZY,\ diff --git a/src/maple_ir/include/mir_builder.h b/src/maple_ir/include/mir_builder.h index 88c994ffcc38b78f6deab2901f16d2df5bf4a967..001da552876368554420bd650bb26bc0aac0e03e 100644 --- a/src/maple_ir/include/mir_builder.h +++ b/src/maple_ir/include/mir_builder.h @@ -291,6 +291,10 @@ class MIRBuilder { private: MIRSymbol *GetOrCreateDecl(const std::string &str, const MIRType *type, MIRFunction *func, bool isLocal, bool &created); + bool IsValidCallReturn(const MIRSymbol &ret) const { + return ret.GetStorageClass() == kScAuto || ret.GetStorageClass() == kScFormal || + ret.GetStorageClass() == kScExtern || ret.GetStorageClass() == kScGlobal; + } }; } // namespace maple diff --git a/src/maple_ir/include/mir_nodes.h b/src/maple_ir/include/mir_nodes.h index 274475b71aa41e7dca8852555ccf17b5b35b1ea2..370391ef25623818419f95c37c40b8c62236c35e 100644 --- a/src/maple_ir/include/mir_nodes.h +++ b/src/maple_ir/include/mir_nodes.h @@ -274,6 +274,9 @@ class RetypeNode : public TypeCvtNode { explicit RetypeNode(PrimType typ) : TypeCvtNode(OP_retype, typ), tyIdx(0) {} + RetypeNode(PrimType typ, PrimType fromtyp, TyIdx idx, BaseNode *expr) + : TypeCvtNode(OP_retype, typ, fromtyp, expr), tyIdx(idx) {} + ~RetypeNode() = default; void Dump(const MIRModule *mod, int32 indent) const; @@ -380,6 +383,8 @@ class JarrayMallocNode : public UnaryNode { 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; void Dump(const MIRModule *mod, int32 indent) const; @@ -463,6 +468,8 @@ class IreadoffNode : public UnaryNode { 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; void Dump(const MIRModule *mod, int32 indent) const; @@ -882,7 +889,7 @@ class NaryNode : public BaseNode, public NaryOpnds { class IntrinsicopNode : public NaryNode { public: explicit IntrinsicopNode(MapleAllocator *allocator, Opcode o, TyIdx typeIdx = TyIdx()) - : NaryNode(allocator, 0), intrinsic(INTRN_UNDEFINED), tyIdx(typeIdx) {} + : NaryNode(allocator, o), intrinsic(INTRN_UNDEFINED), tyIdx(typeIdx) {} explicit IntrinsicopNode(const MIRModule *mod, Opcode o, TyIdx typeIdx = TyIdx()) : IntrinsicopNode(mod->CurFuncCodeMemPoolAllocator(), o, typeIdx) {} @@ -1185,6 +1192,8 @@ class AddrofNode : public BaseNode { public: explicit AddrofNode(Opcode o) : BaseNode(o), stIdx(), fieldID(0) {} + 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; @@ -1232,6 +1241,10 @@ class RegreadNode : public BaseNode { RegreadNode(PregIdx pIdx) : BaseNode(OP_regread), regIdx(pIdx) {} + RegreadNode(PrimType primType, PregIdx pIdx) : RegreadNode(pIdx) { + ptyp = primType; + } + ~RegreadNode() = default; virtual void Dump(const MIRModule *mod, int32 indent) const; @@ -1454,7 +1467,10 @@ class StmtNode : public BaseNode, public PtrListNodeBase { class IassignNode : public StmtNode { public: - IassignNode() : StmtNode(OP_iassign), tyIdx(0), fieldID(0), addrExpr(nullptr), rhs(nullptr) { + IassignNode() : IassignNode(TyIdx(0), 0, nullptr, nullptr) {} + + IassignNode(TyIdx tyIdx, FieldID fieldID, BaseNode *addrOpnd, BaseNode *rhsOpnd) + : StmtNode(OP_iassign), tyIdx(tyIdx), fieldID(fieldID), addrExpr(addrOpnd), rhs(rhsOpnd) { SetNumOpnds(2); } @@ -1607,6 +1623,8 @@ class TryNode : public StmtNode { public: explicit TryNode(MapleAllocator *allocator) : StmtNode(OP_try), offsets(allocator->Adapter()) {} + TryNode(MapleAllocator *allocator, const MapleVector &offsets) : StmtNode(OP_try), offsets(offsets) {} + explicit TryNode(const MIRModule *mod) : TryNode(mod->CurFuncCodeMemPoolAllocator()) {} TryNode(TryNode &node) = delete; @@ -1642,6 +1660,19 @@ class TryNode : public StmtNode { return offsets.size(); } + MapleVector::iterator GetOffsetsBegin() { + return offsets.begin(); + } + + MapleVector::iterator GetOffsetsEnd() { + return offsets.end(); + } + + void OffsetsInsert(MapleVector::iterator a, MapleVector::iterator b, + MapleVector::iterator c) { + offsets.insert(a, b, c); + } + TryNode *CloneTree(MapleAllocator *allocator) const { TryNode *nd = allocator->GetMemPool()->New(allocator); nd->SetStmtID(stmtIDNext++); @@ -1660,6 +1691,9 @@ class CatchNode : public StmtNode { public: explicit CatchNode(MapleAllocator *allocator) : StmtNode(OP_catch), exceptionTyIdxVec(allocator->Adapter()) {} + CatchNode(MapleAllocator *allocator, const MapleVector &tyIdxVec) + : StmtNode(OP_catch), exceptionTyIdxVec(tyIdxVec) {} + explicit CatchNode(const MIRModule *mod) : CatchNode(mod->CurFuncCodeMemPoolAllocator()) {} CatchNode(CatchNode &node) = delete; @@ -1718,8 +1752,10 @@ class SwitchNode : public StmtNode { explicit SwitchNode(const MIRModule *mod) : SwitchNode(mod->CurFuncCodeMemPoolAllocator()) {} - SwitchNode(MapleAllocator *allocator, LabelIdx label) - : StmtNode(OP_switch, 1), switchOpnd(nullptr), defaultLabel(label), switchTable(allocator->Adapter()) {} + SwitchNode(MapleAllocator *allocator, LabelIdx label) : SwitchNode(allocator, label, nullptr) {} + + SwitchNode(MapleAllocator *allocator, LabelIdx label, BaseNode *opnd) + : StmtNode(OP_switch, 1), switchOpnd(opnd), defaultLabel(label), switchTable(allocator->Adapter()) {} SwitchNode(const MIRModule *mod, LabelIdx label) : SwitchNode(mod->CurFuncCodeMemPoolAllocator(), label) {} @@ -1929,6 +1965,8 @@ class DassignNode : public UnaryStmtNode { 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; void Dump(const MIRModule *mod, int32 indent) const; @@ -1990,6 +2028,9 @@ class RegassignNode : public UnaryStmtNode { 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; void Dump(const MIRModule *mod, int32 indent) const; @@ -2029,7 +2070,9 @@ class RegassignNode : public UnaryStmtNode { // brtrue and brfalse class CondGotoNode : public UnaryStmtNode { public: - explicit CondGotoNode(Opcode o) : UnaryStmtNode(o), offset(0) { + explicit CondGotoNode(Opcode o) : CondGotoNode(o, 0, nullptr) {} + + CondGotoNode(Opcode o, uint32 offset, BaseNode *opnd) : UnaryStmtNode(o, kPtyInvalid, opnd), offset(offset) { SetNumOpnds(1); } @@ -2311,14 +2354,16 @@ class WhileStmtNode : public UnaryStmtNode { class DoloopNode : public StmtNode { public: - DoloopNode() + DoloopNode() : DoloopNode(StIdx(), false, nullptr, nullptr, nullptr, nullptr) {} + + DoloopNode(StIdx doVarStIdx, bool isPReg, BaseNode *startExp, BaseNode *contExp, BaseNode *incrExp, BlockNode *doBody) : StmtNode(OP_doloop, 4), - doVarStIdx(), - isPreg(false), - startExpr(nullptr), - condExpr(nullptr), - incrExpr(nullptr), - doBody(nullptr) {} + doVarStIdx(doVarStIdx), + isPreg(isPReg), + startExpr(startExp), + condExpr(contExp), + incrExpr(incrExp), + doBody(doBody) {} ~DoloopNode() = default; @@ -2527,6 +2572,12 @@ class IassignoffNode : public BinaryStmtNode { explicit IassignoffNode(int32 ofst) : BinaryStmtNode(OP_iassignoff), offset(ofst) {} + IassignoffNode(PrimType primType, int32 offset, BaseNode *addrOpnd, BaseNode *srcOpnd) : IassignoffNode(offset) { + SetPrimType(primType); + SetBOpnd(addrOpnd, 0); + SetBOpnd(srcOpnd, 1); + } + ~IassignoffNode() = default; void Dump(const MIRModule *mod, int32 indent) const; @@ -2547,6 +2598,11 @@ class IassignFPoffNode : public UnaryStmtNode { explicit IassignFPoffNode(int32 ofst) : UnaryStmtNode(OP_iassignfpoff), offset(ofst) {} + IassignFPoffNode(PrimType primType, int32 offset, BaseNode *src) : IassignFPoffNode(offset) { + SetPrimType(primType); + SetOpnd(src); + } + ~IassignFPoffNode() = default; void Dump(const MIRModule *mod, int32 indent) const; @@ -2613,6 +2669,18 @@ class NaryStmtNode : public StmtNode, public NaryOpnds { ASSERT(numopnds == GetNopndSize(), "NaryStmtNode has wrong numopnds field"); return GetNopndSize(); } + + void SetOpnds(const MapleVector &arguments) { + SetNOpnd(arguments); + SetNumOpnds(arguments.size()); + } + + void PushOpnd(BaseNode *node) { + if (node != nullptr) { + GetNopnd().push_back(node); + } + SetNumOpnds(GetNopndSize()); + } }; class ReturnValuePart { @@ -2635,6 +2703,8 @@ class CallNode : public NaryStmtNode { CallNode(MapleAllocator *allocator, Opcode o) : NaryStmtNode(allocator, o), puIdx(0), tyIdx(0), returnValues(allocator->Adapter()) {} + CallNode(MapleAllocator *allocator, Opcode o, PUIdx idx) : CallNode(allocator, o, idx, TyIdx()) {} + CallNode(MapleAllocator *allocator, Opcode o, PUIdx idx, TyIdx tdx) : NaryStmtNode(allocator, o), puIdx(idx), tyIdx(tdx), returnValues(allocator->Adapter()) {} diff --git a/src/maple_ir/include/mir_symbol.h b/src/maple_ir/include/mir_symbol.h index 928db876c11ce5c4ee0e07379482feb887ce8158..c8cd04df6ba7a8868f10f4807e880da9410ce561 100644 --- a/src/maple_ir/include/mir_symbol.h +++ b/src/maple_ir/include/mir_symbol.h @@ -533,6 +533,14 @@ class MIRLabelTable { labelTable[idx] = strIdx; } + MapleVector GetLabelTable() { + return labelTable; + } + + MapleMap &GetStrIdxToLabelIdxMap() { + return strIdxToLabIdxMap; + } + private: static constexpr uint32 kDummyLabel = 0; MapleAllocator *mAllocator; diff --git a/src/maple_ir/src/driver.cpp b/src/maple_ir/src/driver.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c4c23b62b2daa7eee1c25742d879898b4c5a3aa9 --- /dev/null +++ b/src/maple_ir/src/driver.cpp @@ -0,0 +1,97 @@ +/* + * Copyright (c) [2019] Huawei Technologies Co.,Ltd.All rights reserved. + * + * OpenArkCompiler is licensed under the Mulan PSL v1. + * You can use this software according to the terms and conditions of the Mulan PSL v1. + * You may obtain a copy of Mulan PSL v1 at: + * + * http://license.coscl.org.cn/MulanPSL + * + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR + * FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v1 for more details. + */ +#include +#include +#include +#include "mir_parser.h" +#include "bin_mplt.h" +#include "opcode_info.h" +#include "mir_function.h" +#include "mir_type.h" + +using namespace maple; +#if MIR_FEATURE_FULL +void ConstantFoldModule(maple::MIRModule *module) { + MapleVector &funcList = module->GetFunctionList(); + for (auto it = funcList.begin(); it != funcList.end(); it++) { + maple::MIRFunction *curfun = *it; + module->SetCurFunction(curfun); + } +} + +int main(int argc, char **argv) { + if (argc < 2) { + MIR_PRINTF( + "usage: ./irbuild [i|e] \n\n" + "The optional 'i' flag will convert the binary mplt input file to ascii\n\n" + "The optional 'e' flag will convert the textual mplt input file to binary\n"); + exit(1); + } + char flag = '\0'; + maple::int32 i = 1; + if (argv[1][0] == 'i' && argv[1][1] == '\0') { + flag = 'i'; + i = 2; + } else if (argv[1][0] == 'e' && argv[1][1] == '\0') { + flag = 'e'; + i = 2; + } + while (i < argc) { + maple::MIRModule module{ argv[i] }; + if (flag == '\0') { + maple::MIRParser theparser(module); + if (theparser.ParseMIR()) { + ConstantFoldModule(&module); + module.OutputAsciiMpl(".irb"); + } else { + theparser.EmitError(module.GetFileName().c_str()); + return 1; + } + } else if (flag == 'e') { + maple::MIRParser theparser(module); + if (theparser.ParseMIR()) { + ConstantFoldModule(&module); + BinaryMplt binmplt(module); + std::string modid = module.GetFileName(); + binmplt.Export("bin." + modid); + } else { + theparser.EmitError(module.GetFileName().c_str()); + return 1; + } + } else if (flag == 'i') { + module.SetFlavor(kFeProduced); + module.SetSrcLang(kSrcLangJava); + BinaryMplImport binmplt(module); + binmplt.SetImported(false); + std::string modid = module.GetFileName(); + binmplt.Import(modid, true); + module.OutputAsciiMpl(".irb"); + } + i++; + } + return 0; +} + +/* hello.mpl + flavor 1 + srclang 3 + + type $person }> + var $BOB i32 = 8 + */ +#else +#warning "this module is compiled without MIR_FEATURE_FULL=1 defined" +#endif // MIR_FEATURE_FULL diff --git a/src/maple_ir/src/mir_builder.cpp b/src/maple_ir/src/mir_builder.cpp index d14f26e32f37e7dd5e15ed23b75614235544a775..f73b0360cf8202e4626c7280845788e097372ce5 100644 --- a/src/maple_ir/src/mir_builder.cpp +++ b/src/maple_ir/src/mir_builder.cpp @@ -20,10 +20,9 @@ namespace maple { // This is for compiler-generated metadata 1-level struct void MIRBuilder::AddIntFieldConst(const MIRStructType *sType, MIRAggConst *newConst, uint32 fieldID, int64 constValue) { if (sType != nullptr && newConst != nullptr) { - MIRConst *fieldConst = mirModule->GetMemPool()->New(constValue, sType->GetElemType(fieldID - 1)); - MapleVector &constVec = newConst->GetConstVec(); - fieldConst->SetFieldID(fieldID); - constVec.push_back(fieldConst); + MIRConst *fieldConst = mirModule->GetMemPool()->New(constValue, + sType->GetElemType(fieldID - 1), fieldID); + newConst->GetConstVec().push_back(fieldConst); } } @@ -34,9 +33,8 @@ void MIRBuilder::AddAddrofFieldConst(const MIRStructType *structType, MIRAggCons AddrofNode *fieldExpr = CreateExprAddrof(0, fieldSymbol, mirModule->GetMemPool()); MIRConst *fieldConst = mirModule->GetMemPool()->New(fieldExpr->GetStIdx(), fieldExpr->GetFieldID(), structType->GetElemType(fieldID - 1)); - MapleVector &constVec = newConst->GetConstVec(); fieldConst->SetFieldID(fieldID); - constVec.push_back(fieldConst); + newConst->GetConstVec().push_back(fieldConst); } } @@ -47,16 +45,14 @@ void MIRBuilder::AddAddroffuncFieldConst(const MIRStructType *structType, MIRAgg MIRConst *fieldConst = nullptr; MIRFunction *vMethod = funcSymbol->GetFunction(); if (vMethod->IsAbstract()) { - fieldConst = mirModule->GetMemPool()->New(0, structType->GetElemType(fieldID - 1)); + fieldConst = mirModule->GetMemPool()->New(0, structType->GetElemType(fieldID - 1), fieldID); } else { AddroffuncNode *addrofFuncExpr = CreateExprAddroffunc(funcSymbol->GetFunction()->GetPuidx(), mirModule->GetMemPool()); fieldConst = mirModule->GetMemPool()->New(addrofFuncExpr->GetPUIdx(), - structType->GetElemType(fieldID - 1)); + structType->GetElemType(fieldID - 1), fieldID); } - fieldConst->SetFieldID(fieldID); - MapleVector &constVec = newConst->GetConstVec(); - constVec.push_back(fieldConst); + newConst->GetConstVec().push_back(fieldConst); } } @@ -454,94 +450,72 @@ MIRSymbol *MIRBuilder::GetOrCreateGlobalDecl(const std::string &str, const MIRTy } ConstvalNode *MIRBuilder::CreateIntConst(int64 val, PrimType pty) { - ConstvalNode *constvalNode = GetCurrentFuncCodeMp()->New(); MIRFunction *currentFunctionInner = GetCurrentFunction(); ASSERT(currentFunctionInner != nullptr, "null ptr check"); - MIRIntConst *intConst = + MIRIntConst *mirConst = currentFunctionInner->GetDataMemPool()->New(val, GlobalTables::GetTypeTable().GetPrimType(pty)); - constvalNode->SetPrimType(pty); - constvalNode->SetConstVal(intConst); - return constvalNode; + return GetCurrentFuncCodeMp()->New(pty, mirConst); } ConstvalNode *MIRBuilder::CreateFloatConst(float val) { - ConstvalNode *constvalNode = GetCurrentFuncCodeMp()->New(); MIRFunction *currentFunctionInner = GetCurrentFunction(); ASSERT(currentFunctionInner != nullptr, "null ptr check"); - MIRFloatConst *floatConst = currentFunctionInner->GetDataMemPool()->New( + MIRFloatConst *mirConst = currentFunctionInner->GetDataMemPool()->New( val, GlobalTables::GetTypeTable().GetPrimType(PTY_f32)); - constvalNode->SetPrimType(PTY_f32); - constvalNode->SetConstVal(floatConst); - return constvalNode; + return GetCurrentFuncCodeMp()->New(PTY_f32, mirConst); } ConstvalNode *MIRBuilder::CreateDoubleConst(double val) { - ConstvalNode *constvalNode = GetCurrentFuncCodeMp()->New(); MIRFunction *currentFunctionInner = GetCurrentFunction(); ASSERT(currentFunctionInner != nullptr, "null ptr check"); - MIRDoubleConst *dblConst = currentFunctionInner->GetDataMemPool()->New( + MIRDoubleConst *mirConst = currentFunctionInner->GetDataMemPool()->New( val, GlobalTables::GetTypeTable().GetPrimType(PTY_f64)); - constvalNode->SetPrimType(PTY_f64); - constvalNode->SetConstVal(dblConst); - return constvalNode; + return GetCurrentFuncCodeMp()->New(PTY_f64, mirConst); } ConstvalNode *MIRBuilder::CreateFloat128Const(const uint64 *val) { - ConstvalNode *constvalNode = GetCurrentFuncCodeMp()->New(); MIRFunction *currentFunctionInner = GetCurrentFunction(); ASSERT(currentFunctionInner != nullptr, "null ptr check"); - MIRFloat128Const *f128Const = currentFunctionInner->GetDataMemPool()->New( + MIRFloat128Const *mirConst = currentFunctionInner->GetDataMemPool()->New( val, GlobalTables::GetTypeTable().GetPrimType(PTY_f128)); - constvalNode->SetPrimType(PTY_f128); - constvalNode->SetConstVal(f128Const); - return constvalNode; + return GetCurrentFuncCodeMp()->New(PTY_f128, mirConst); } ConstvalNode *MIRBuilder::GetConstInt(MemPool *memPool, int i) { - ConstvalNode *constvalNode = memPool->New(); - MIRIntConst *intConst = memPool->New(i, GlobalTables::GetTypeTable().GetInt64()); - constvalNode->SetPrimType(PTY_i32); - constvalNode->SetConstVal(intConst); - return constvalNode; + MIRIntConst *mirConst = memPool->New(i, GlobalTables::GetTypeTable().GetInt64()); + return memPool->New(PTY_i32, mirConst); } ConstvalNode *MIRBuilder::CreateAddrofConst(BaseNode *e) { - ConstvalNode *constvalNode = GetCurrentFuncCodeMp()->New(); ASSERT(e->GetOpCode() == OP_addrof, "illegal op for addrof const"); - AddrofNode *aNode = static_cast(e); - // determine the type of 'e' and create a pointer type, accordingly MIRFunction *currentFunctionInner = GetCurrentFunction(); ASSERT(currentFunctionInner != nullptr, "null ptr check"); - MIRSymbol *var = currentFunctionInner->GetLocalOrGlobalSymbol(static_cast(e)->GetStIdx()); + + // determine the type of 'e' and create a pointer type, accordingly + AddrofNode *aNode = static_cast(e); + 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 *addr = mirModule->GetMemPool()->New(aNode->GetStIdx(), aNode->GetFieldID(), exprty); - constvalNode->SetPrimType(PTY_ptr); - constvalNode->SetConstVal(addr); - return constvalNode; + MIRAddrofConst *temp = mirModule->GetMemPool()->New(aNode->GetStIdx(), aNode->GetFieldID(), exprty); + return GetCurrentFuncCodeMp()->New(PTY_ptr, temp); } ConstvalNode *MIRBuilder::CreateAddroffuncConst(const BaseNode *e) { - ConstvalNode *constvalNode = GetCurrentFuncCodeMp()->New(); ASSERT(e->GetOpCode() == OP_addroffunc, "illegal op for addroffunc const"); - MIRFunction *f = - GlobalTables::GetFunctionTable().GetFunctionFromPuidx(static_cast(e)->GetPUIdx()); - MIRSymbol *fname = f->GetFuncSymbol(); - TyIdx ptyIdx = fname->GetTyIdx(); + + const AddroffuncNode *aNode = static_cast(e); + 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 *fadr = - mirModule->GetMemPool()->New(static_cast(e)->GetPUIdx(), exprty); - constvalNode->SetPrimType(PTY_ptr); - constvalNode->SetConstVal(fadr); - return constvalNode; + MIRAddroffuncConst *mirConst = mirModule->GetMemPool()->New(aNode->GetPUIdx(), exprty); + return GetCurrentFuncCodeMp()->New(PTY_ptr, mirConst); } ConstvalNode *MIRBuilder::CreateStrConst(const BaseNode *e) { - ConstvalNode *constvalNode = GetCurrentFuncCodeMp()->New(); ASSERT(e->GetOpCode() == OP_conststr, "illegal op for conststr const"); UStrIdx strIdx = static_cast(e)->GetStrIdx(); CHECK_FATAL(PTY_u8 < GlobalTables::GetTypeTable().GetTypeTable().size(), @@ -550,14 +524,11 @@ ConstvalNode *MIRBuilder::CreateStrConst(const BaseNode *e) { MIRPtrType ptrType(ptyidx); ptyidx = GlobalTables::GetTypeTable().GetOrCreateMIRType(&ptrType); MIRType *exprType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ptyidx); - MIRStrConst *cStr = mirModule->GetMemPool()->New(strIdx, exprType); - constvalNode->SetPrimType(PTY_ptr); - constvalNode->SetConstVal(cStr); - return constvalNode; + MIRStrConst *mirConst = mirModule->GetMemPool()->New(strIdx, exprType); + return GetCurrentFuncCodeMp()->New(PTY_ptr, mirConst); } ConstvalNode *MIRBuilder::CreateStr16Const(const BaseNode *e) { - ConstvalNode *constvalNode = GetCurrentFuncCodeMp()->New(); ASSERT(e->GetOpCode() == OP_conststr16, "illegal op for conststr16 const"); U16StrIdx strIdx = static_cast(e)->GetStrIdx(); CHECK_FATAL(PTY_u16 < GlobalTables::GetTypeTable().GetTypeTable().size(), @@ -566,10 +537,8 @@ ConstvalNode *MIRBuilder::CreateStr16Const(const BaseNode *e) { MIRPtrType ptrType(ptyIdx); ptyIdx = GlobalTables::GetTypeTable().GetOrCreateMIRType(&ptrType); MIRType *exprty = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ptyIdx); - MIRStr16Const *cstr = mirModule->GetMemPool()->New(strIdx, exprty); - constvalNode->SetPrimType(PTY_ptr); - constvalNode->SetConstVal(cstr); - return constvalNode; + MIRStr16Const *mirConst = mirModule->GetMemPool()->New(strIdx, exprty); + return GetCurrentFuncCodeMp()->New(PTY_ptr, mirConst); } MIRSymbol *MIRBuilder::GetSymbolFromEnclosingScope(StIdx stIdx) { @@ -589,8 +558,7 @@ MIRSymbol *MIRBuilder::GetSymbolFromEnclosingScope(StIdx stIdx) { MIRSymbol *MIRBuilder::GetSymbol(TyIdx tyIdx, const std::string &name, MIRSymKind mClass, MIRStorageClass sClass, MIRFunction *func, uint8 scpID, bool sameType = false) { - GStrIdx strIdx = GetOrCreateStringIndex(name); - return GetSymbol(tyIdx, strIdx, mClass, sClass, func, scpID, sameType); + return GetSymbol(tyIdx, GetOrCreateStringIndex(name), mClass, sClass, func, scpID, sameType); } // when sametype is true, it means match everything the of the symbol @@ -622,8 +590,7 @@ MIRSymbol *MIRBuilder::GetSymbol(TyIdx tyIdx, GStrIdx strIdx, MIRSymKind mClass, MIRSymbol *MIRBuilder::GetOrCreateSymbol(TyIdx tyIdx, const std::string &name, MIRSymKind mClass, MIRStorageClass sClass, MIRFunction *func, uint8 scpID, bool sametype = false) { - GStrIdx stridx = GetOrCreateStringIndex(name); - return GetOrCreateSymbol(tyIdx, stridx, mClass, sClass, func, scpID, sametype); + return GetOrCreateSymbol(tyIdx, GetOrCreateStringIndex(name), mClass, sClass, func, scpID, sametype); } MIRSymbol *MIRBuilder::GetOrCreateSymbol(TyIdx tyIdx, GStrIdx strIdx, MIRSymKind mClass, MIRStorageClass sClass, @@ -637,8 +604,7 @@ MIRSymbol *MIRBuilder::GetOrCreateSymbol(TyIdx tyIdx, GStrIdx strIdx, MIRSymKind // when func is null, create global symbol, otherwise create local symbol MIRSymbol *MIRBuilder::CreateSymbol(TyIdx tyIdx, const std::string &name, MIRSymKind mClass, MIRStorageClass sClass, MIRFunction *func, uint8 scpID) { - GStrIdx stridx = GetOrCreateStringIndex(name); - return CreateSymbol(tyIdx, stridx, mClass, sClass, func, scpID); + return CreateSymbol(tyIdx, GetOrCreateStringIndex(name), mClass, sClass, func, scpID); } // when func is null, create global symbol, otherwise create local symbol @@ -730,57 +696,33 @@ MIRFunction *MIRBuilder::CreateFunction(const StIdx stIdx, bool addToTable) { } SizeoftypeNode *MIRBuilder::CreateExprSizeoftype(const MIRType *type) { - SizeoftypeNode *sizeOfTypeNode = GetCurrentFuncCodeMp()->New(); - sizeOfTypeNode->SetPrimType(PTY_u32); - sizeOfTypeNode->SetTyIdx(type->GetTypeIndex()); - return sizeOfTypeNode; + return GetCurrentFuncCodeMp()->New(PTY_u32, type->GetTypeIndex()); } FieldsDistNode *MIRBuilder::CreateExprFieldsDist(const MIRType *type, FieldID field1, FieldID field2) { - FieldsDistNode *node = GetCurrentFuncCodeMp()->New(); - node->SetPrimType(PTY_i32); - node->SetTyIdx(type->GetTypeIndex()); - node->SetFiledID1(field1); - node->SetFiledID2(field2); - return node; + return GetCurrentFuncCodeMp()->New(PTY_i32, type->GetTypeIndex(), field1, field2); } AddrofNode *MIRBuilder::CreateExprAddrof(FieldID fieldID, const MIRSymbol *symbol, MemPool *memPool) { - if (memPool == nullptr) { - memPool = GetCurrentFuncCodeMp(); - } - AddrofNode *addrofNode = memPool->New(OP_addrof); - addrofNode->SetPrimType(PTY_ptr); - addrofNode->SetStIdx(symbol->GetStIdx()); - addrofNode->SetFieldID(fieldID); - return addrofNode; + return CreateExprAddrof(fieldID, symbol->GetStIdx(), memPool); } AddrofNode *MIRBuilder::CreateExprAddrof(FieldID fieldID, StIdx symbolStIdx, MemPool *memPool) { if (memPool == nullptr) { memPool = GetCurrentFuncCodeMp(); } - AddrofNode *addrofNode = memPool->New(OP_addrof); - addrofNode->SetPrimType(PTY_ptr); - addrofNode->SetStIdx(symbolStIdx); - addrofNode->SetFieldID(fieldID); - return addrofNode; + return memPool->New(OP_addrof, PTY_ptr, symbolStIdx, fieldID); } AddroffuncNode *MIRBuilder::CreateExprAddroffunc(PUIdx puIdx, MemPool *memPool) { if (memPool == nullptr) { memPool = GetCurrentFuncCodeMp(); } - AddroffuncNode *addrofFunc = memPool->New(); - addrofFunc->SetPrimType(PTY_ptr); - addrofFunc->SetPUIdx(puIdx); - return addrofFunc; + return memPool->New(PTY_ptr, puIdx); } AddrofNode *MIRBuilder::CreateExprDread(const MIRType *type, FieldID fieldID, const MIRSymbol *symbol) { - AddrofNode *drn = GetCurrentFuncCodeMp()->New(OP_dread); - drn->SetStIdx(symbol->GetStIdx()); - drn->SetFieldID(fieldID); + AddrofNode *drn = 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())); @@ -788,10 +730,7 @@ AddrofNode *MIRBuilder::CreateExprDread(const MIRType *type, FieldID fieldID, co } RegreadNode *MIRBuilder::CreateExprRegread(PrimType pty, PregIdx regIdx) { - RegreadNode *regRead = GetCurrentFuncCodeMp()->New(); - regRead->SetPrimType(pty); - regRead->SetRegIdx(regIdx); - return regRead; + return GetCurrentFuncCodeMp()->New(pty, regIdx); } AddrofNode *MIRBuilder::CreateExprDread(MIRType *type, MIRSymbol *symbol) { @@ -811,42 +750,28 @@ AddrofNode *MIRBuilder::CreateExprDread(MIRSymbol *symbol) { } AddrofNode *MIRBuilder::CreateExprDread(PregIdx pregID, PrimType pty) { - AddrofNode *dread = GetCurrentFuncCodeMp()->New(OP_dread); - dread->SetPrimType(pty); + AddrofNode *dread = GetCurrentFuncCodeMp()->New(OP_dread, pty); dread->GetStIdx().SetFullIdx(pregID); return dread; } IreadNode *MIRBuilder::CreateExprIread(const MIRType *returnType, const MIRType *ptrType, FieldID fieldID, BaseNode *addr) { - IreadNode *irn = GetCurrentFuncCodeMp()->New(OP_iread); - TyIdx ptrTypeIdx = ptrType->GetTypeIndex(); TyIdx returnTypeIdx = returnType->GetTypeIndex(); ASSERT(returnTypeIdx.GetIdx() < GlobalTables::GetTypeTable().GetTypeTable().size(), - "index out of range in MIRBuilder::CreateExprIread"); - irn->SetPrimType(GlobalTables::GetTypeTable().GetPrimTypeFromTyIdx(returnTypeIdx)); - irn->SetTyIdx(ptrTypeIdx); - + "index out of range in MIRBuilder::CreateExprIread"); ASSERT(fieldID != 0 || ptrType->GetPrimType() != PTY_agg, "Error: Fieldid should not be 0 when trying to iread a field from type "); - irn->SetFieldID(fieldID); - irn->SetOpnd(addr); - return irn; + PrimType type = GlobalTables::GetTypeTable().GetPrimTypeFromTyIdx(returnTypeIdx); + return GetCurrentFuncCodeMp()->New(OP_iread, type, ptrType->GetTypeIndex(), fieldID, addr); } IreadoffNode *MIRBuilder::CreateExprIreadoff(PrimType pty, int32 offset, BaseNode *opnd0) { - IreadoffNode *ireadOff = GetCurrentFuncCodeMp()->New(); - ireadOff->SetPrimType(pty); - ireadOff->SetOffset(offset); - ireadOff->SetOpnd(opnd0); - return ireadOff; + return GetCurrentFuncCodeMp()->New(pty, opnd0, offset); } IreadFPoffNode *MIRBuilder::CreateExprIreadFPoff(PrimType pty, int32 offset) { - IreadFPoffNode *ireadOff = GetCurrentFuncCodeMp()->New(); - ireadOff->SetPrimType(pty); - ireadOff->SetOffset(offset); - return ireadOff; + return GetCurrentFuncCodeMp()->New(pty, offset); } IaddrofNode *MIRBuilder::CreateExprIaddrof(const MIRType *returnType, const MIRType *ptrType, FieldID fieldID, @@ -857,98 +782,55 @@ IaddrofNode *MIRBuilder::CreateExprIaddrof(const MIRType *returnType, const MIRT } IaddrofNode *MIRBuilder::CreateExprIaddrof(PrimType returnTypePty, TyIdx ptrTypeIdx, FieldID fieldID, BaseNode *addr) { - IaddrofNode *iaddrofNode = GetCurrentFuncCodeMp()->New(OP_iaddrof); - iaddrofNode->SetPrimType(returnTypePty); - iaddrofNode->SetTyIdx(ptrTypeIdx); - iaddrofNode->SetFieldID(fieldID); - iaddrofNode->SetOpnd(addr); - return iaddrofNode; + return GetCurrentFuncCodeMp()->New(OP_iaddrof, returnTypePty, ptrTypeIdx, fieldID, addr); } UnaryNode *MIRBuilder::CreateExprUnary(Opcode opcode, const MIRType *type, BaseNode *opnd) { - UnaryNode *un = GetCurrentFuncCodeMp()->New(opcode); - un->SetPrimType(type->GetPrimType()); - un->SetOpnd(opnd); - return un; + return GetCurrentFuncCodeMp()->New(opcode, type->GetPrimType(), opnd); } GCMallocNode *MIRBuilder::CreateExprGCMalloc(Opcode opcode, const MIRType *ptype, const MIRType *type) { - GCMallocNode *un = GetCurrentFuncCodeMp()->New(opcode); - un->SetPrimType(ptype->GetPrimType()); - un->SetTyIdx(type->GetTypeIndex()); - return un; + return GetCurrentFuncCodeMp()->New(opcode, ptype->GetPrimType(), type->GetTypeIndex()); } JarrayMallocNode *MIRBuilder::CreateExprJarrayMalloc(Opcode opcode, const MIRType *ptype, const MIRType *type, BaseNode *opnd) { - JarrayMallocNode *un = GetCurrentFuncCodeMp()->New(opcode); - un->SetPrimType(ptype->GetPrimType()); - un->SetTyIdx(type->GetTypeIndex()); - un->SetOpnd(opnd); - return un; + return GetCurrentFuncCodeMp()->New(opcode, ptype->GetPrimType(), type->GetTypeIndex(), opnd); } TypeCvtNode *MIRBuilder::CreateExprTypeCvt(Opcode o, const MIRType *type, const MIRType *fromType, BaseNode *opnd) { - TypeCvtNode *un = GetCurrentFuncCodeMp()->New(o); - un->SetPrimType(type->GetPrimType()); - un->SetFromType(fromType->GetPrimType()); - un->SetOpnd(static_cast(opnd)); - return un; + return GetCurrentFuncCodeMp()->New(o, type->GetPrimType(), fromType->GetPrimType(), opnd); } ExtractbitsNode *MIRBuilder::CreateExprExtractbits(Opcode o, const MIRType *type, uint32 bOffset, uint32 bsize, BaseNode *opnd) { - ExtractbitsNode *ext = GetCurrentFuncCodeMp()->New(o); - ext->SetPrimType(type->GetPrimType()); - ext->SetBitsOffset(bOffset); - ext->SetBitsSize(bsize); - ext->SetOpnd(static_cast(opnd)); - return ext; + return GetCurrentFuncCodeMp()->New(o, type->GetPrimType(), bOffset, bsize, opnd); } RetypeNode *MIRBuilder::CreateExprRetype(const MIRType *type, const MIRType *fromType, BaseNode *opnd) { - RetypeNode *un = GetCurrentFuncCodeMp()->New(); - un->SetPrimType(type->GetPrimType()); - un->SetFromType(fromType->GetPrimType()); - un->SetTyIdx(type->GetTypeIndex()); - un->SetOpnd(static_cast(opnd)); - return un; + return GetCurrentFuncCodeMp()->New(type->GetPrimType(), fromType->GetPrimType(), + type->GetTypeIndex(), opnd); } BinaryNode *MIRBuilder::CreateExprBinary(Opcode opcode, const MIRType *type, BaseNode *opnd0, BaseNode *opnd1) { - BinaryNode *bn = GetCurrentFuncCodeMp()->New(opcode); - bn->SetPrimType(type->GetPrimType()); - bn->SetBOpnd(opnd0, 0); - bn->SetBOpnd(opnd1, 1); - return bn; + return GetCurrentFuncCodeMp()->New(opcode, type->GetPrimType(), opnd0, opnd1); } TernaryNode *MIRBuilder::CreateExprTernary(Opcode opcode, const MIRType *type, BaseNode *opnd0, BaseNode *opnd1, BaseNode *opnd2) { - TernaryNode *tn = GetCurrentFuncCodeMp()->New(opcode); - tn->SetPrimType(type->GetPrimType()); - tn->SetOpnd(opnd0, 0); - tn->SetOpnd(opnd1, 1); - tn->SetOpnd(opnd2, 2); - return tn; + return GetCurrentFuncCodeMp()->New(opcode, type->GetPrimType(), opnd0, opnd1, opnd2); } CompareNode *MIRBuilder::CreateExprCompare(Opcode opcode, const MIRType *type, const MIRType *opndType, BaseNode *opnd0, BaseNode *opnd1) { - CompareNode *bn = GetCurrentFuncCodeMp()->New(opcode); - bn->SetPrimType(type->GetPrimType()); - bn->SetOpndType(opndType->GetPrimType()); - bn->SetBOpnd(opnd0, 0); - bn->SetBOpnd(opnd1, 1); - return bn; + return GetCurrentFuncCodeMp()->New(opcode, type->GetPrimType(), opndType->GetPrimType(), opnd0, opnd1); } ArrayNode *MIRBuilder::CreateExprArray(const MIRType *arrayType) { - ArrayNode *arrayNode = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator()); MIRType *addrType = GlobalTables::GetTypeTable().GetOrCreatePointerType(arrayType); ASSERT(addrType != nullptr, "addrType is null"); - arrayNode->SetPrimType(addrType->GetPrimType()); - arrayNode->SetTyIdx(addrType->GetTypeIndex()); + ArrayNode *arrayNode = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), + addrType->GetPrimType(), addrType->GetTypeIndex()); arrayNode->SetNumOpnds(0); return arrayNode; } @@ -961,8 +843,7 @@ ArrayNode *MIRBuilder::CreateExprArray(const MIRType *arrayType, BaseNode *op) { } ArrayNode *MIRBuilder::CreateExprArray(const MIRType *arrayType, BaseNode *op1, BaseNode *op2) { - ArrayNode *arrayNode = CreateExprArray(arrayType); - arrayNode->GetNopnd().push_back(op1); + ArrayNode *arrayNode = CreateExprArray(arrayType, op1); arrayNode->GetNopnd().push_back(op2); arrayNode->SetNumOpnds(2); return arrayNode; @@ -982,58 +863,31 @@ IntrinsicopNode *MIRBuilder::CreateExprIntrinsicop(MIRIntrinsicID idx, Opcode op } DassignNode *MIRBuilder::CreateStmtDassign(const MIRSymbol *symbol, FieldID fieldID, BaseNode *src) { - DassignNode *stmt = GetCurrentFuncCodeMp()->New(); - stmt->SetStIdx(symbol->GetStIdx()); - stmt->SetFieldID(fieldID); - stmt->SetRHS(src); - return stmt; + return GetCurrentFuncCodeMp()->New(src, symbol->GetStIdx(), fieldID); } RegassignNode *MIRBuilder::CreateStmtRegassign(PrimType pty, PregIdx regIdx, BaseNode *src) { - RegassignNode *stmt = GetCurrentFuncCodeMp()->New(); - stmt->SetPrimType(pty); - stmt->SetRegIdx(regIdx); - stmt->SetOpnd(src); - return stmt; + return GetCurrentFuncCodeMp()->New(pty, regIdx, src); } DassignNode *MIRBuilder::CreateStmtDassign(StIdx sIdx, FieldID fieldID, BaseNode *src) { - DassignNode *stmt = GetCurrentFuncCodeMp()->New(); - stmt->SetStIdx(sIdx); - stmt->SetFieldID(fieldID); - stmt->SetRHS(src); - return stmt; + return GetCurrentFuncCodeMp()->New(src, sIdx, fieldID); } IassignNode *MIRBuilder::CreateStmtIassign(const MIRType *type, FieldID fieldID, BaseNode *addr, BaseNode *src) { - IassignNode *stmt = GetCurrentFuncCodeMp()->New(); - stmt->SetTyIdx(type->GetTypeIndex()); - stmt->SetFieldID(fieldID); - stmt->SetOpnd(addr, 0); - stmt->SetRHS(src); - return stmt; + return GetCurrentFuncCodeMp()->New(type->GetTypeIndex(), fieldID, addr, src); } IassignoffNode *MIRBuilder::CreateStmtIassignoff(PrimType pty, int32 offset, BaseNode *addr, BaseNode *src) { - IassignoffNode *stmt = GetCurrentFuncCodeMp()->New(); - stmt->SetPrimType(pty); - stmt->offset = offset; - stmt->SetBOpnd(addr, 0); - stmt->SetBOpnd(src, 1); - return stmt; + return GetCurrentFuncCodeMp()->New(pty, offset, addr, src); } IassignFPoffNode *MIRBuilder::CreateStmtIassignFPoff(PrimType pty, int32 offset, BaseNode *src) { - IassignFPoffNode *stmt = GetCurrentFuncCodeMp()->New(); - stmt->SetPrimType(pty); - stmt->SetOffset(offset); - stmt->SetOpnd(src); - return stmt; + return GetCurrentFuncCodeMp()->New(pty, offset, src); } CallNode *MIRBuilder::CreateStmtCall(PUIdx puIdx, const MapleVector &args, Opcode opCode) { - CallNode *stmt = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), opCode); - stmt->SetPUIdx(puIdx); + CallNode *stmt = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), opCode, puIdx, TyIdx()); stmt->SetNOpnd(args); stmt->SetNumOpnds(args.size()); return stmt; @@ -1050,38 +904,32 @@ CallNode *MIRBuilder::CreateStmtCall(const std::string &callee, const MapleVecto IcallNode *MIRBuilder::CreateStmtIcall(const MapleVector &args) { IcallNode *stmt = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), OP_icall); - stmt->SetNOpnd(args); - stmt->SetNumOpnds(args.size()); + ASSERT(stmt != nullptr, "stmt is null"); + stmt->SetOpnds(args); return stmt; } IntrinsiccallNode *MIRBuilder::CreateStmtIntrinsicCall(MIRIntrinsicID idx, const MapleVector &arguments, TyIdx tyIdx) { IntrinsiccallNode *stmt = GetCurrentFuncCodeMp()->New( - GetCurrentFuncCodeMpAllocator(), tyIdx == 0 ? OP_intrinsiccall : OP_intrinsiccallwithtype); - stmt->SetIntrinsic(idx); + GetCurrentFuncCodeMpAllocator(), tyIdx == 0 ? OP_intrinsiccall : OP_intrinsiccallwithtype, idx); stmt->SetTyIdx(tyIdx); - stmt->SetNOpnd(arguments); - stmt->SetNumOpnds(arguments.size()); + stmt->SetOpnds(arguments); return stmt; } IntrinsiccallNode *MIRBuilder::CreateStmtXintrinsicCall(MIRIntrinsicID idx, const MapleVector &arguments) { IntrinsiccallNode *stmt = - GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), OP_xintrinsiccall); - stmt->SetIntrinsic(idx); - stmt->SetNOpnd(arguments); - stmt->SetNumOpnds(arguments.size()); + GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), OP_xintrinsiccall, idx); + ASSERT(stmt != nullptr, "stmt is null"); + stmt->SetOpnds(arguments); return stmt; } CallNode *MIRBuilder::CreateStmtCallAssigned(PUIdx puIdx, const MIRSymbol *ret, Opcode op) { - CallNode *stmt = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), op); - stmt->SetPUIdx(puIdx); + CallNode *stmt = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), op, puIdx); if (ret) { - ASSERT((ret->GetStorageClass() == kScAuto || ret->GetStorageClass() == kScFormal || - ret->GetStorageClass() == kScExtern || ret->GetStorageClass() == kScGlobal), - "Not Expected ret"); + ASSERT(IsValidCallReturn(*ret), "Not Excepted ret"); stmt->GetReturnVec().push_back(CallReturnPair(ret->GetStIdx(), RegFieldPair(0, 0))); } return stmt; @@ -1089,23 +937,18 @@ 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); - stmt->SetPUIdx(puIdx); - stmt->SetTyIdx(tyIdx); - stmt->SetNOpnd(args); - stmt->SetNumOpnds(args.size()); + CallNode *stmt = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), opcode, puIdx, tyIdx); + ASSERT(stmt != nullptr, "stmt is null"); + stmt->SetOpnds(args); if (ret != nullptr) { - ASSERT((ret->GetStorageClass() == kScAuto || ret->GetStorageClass() == kScFormal || - ret->GetStorageClass() == kScExtern || ret->GetStorageClass() == kScGlobal), - "Not Expected ret"); + ASSERT(IsValidCallReturn(*ret), "Not Excepted ret"); stmt->GetReturnVec().push_back(CallReturnPair(ret->GetStIdx(), RegFieldPair(0, 0))); } return stmt; } CallNode *MIRBuilder::CreateStmtCallRegassigned(PUIdx puIdx, PregIdx pRegIdxt, Opcode opcode, BaseNode *arg) { - CallNode *stmt = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), opcode); - stmt->SetPUIdx(puIdx); + CallNode *stmt = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), opcode, puIdx); stmt->GetNopnd().push_back(arg); stmt->SetNumOpnds(stmt->GetNopndSize()); if (pRegIdxt > 0) { @@ -1116,10 +959,9 @@ CallNode *MIRBuilder::CreateStmtCallRegassigned(PUIdx puIdx, PregIdx pRegIdxt, O CallNode *MIRBuilder::CreateStmtCallRegassigned(PUIdx puIdx, const MapleVector &args, PregIdx pRegIdxt, Opcode opcode) { - CallNode *stmt = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), opcode); - stmt->SetPUIdx(puIdx); - stmt->SetNOpnd(args); - stmt->SetNumOpnds(args.size()); + CallNode *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))); } @@ -1129,10 +971,9 @@ CallNode *MIRBuilder::CreateStmtCallRegassigned(PUIdx puIdx, const MapleVector &args, PregIdx retPregIdx) { IntrinsiccallNode *stmt = - GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), OP_intrinsiccallassigned); - stmt->SetIntrinsic(idx); - stmt->SetNOpnd(args); - stmt->SetNumOpnds(args.size()); + GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), OP_intrinsiccallassigned, idx); + ASSERT(stmt != nullptr, "stmt is null"); + stmt->SetOpnds(args); if (retPregIdx > 0) { stmt->GetReturnVec().push_back(CallReturnPair(StIdx(), RegFieldPair(0, retPregIdx))); } @@ -1142,16 +983,12 @@ IntrinsiccallNode *MIRBuilder::CreateStmtIntrinsicCallAssigned(MIRIntrinsicID id IntrinsiccallNode *MIRBuilder::CreateStmtIntrinsicCallAssigned(MIRIntrinsicID idx, const MapleVector &args, const MIRSymbol *ret, TyIdx tyIdx) { IntrinsiccallNode *stmt = GetCurrentFuncCodeMp()->New( - GetCurrentFuncCodeMpAllocator(), tyIdx == 0 ? OP_intrinsiccallassigned : OP_intrinsiccallwithtypeassigned); - stmt->SetIntrinsic(idx); + GetCurrentFuncCodeMpAllocator(), tyIdx == 0 ? OP_intrinsiccallassigned : OP_intrinsiccallwithtypeassigned, idx); stmt->SetTyIdx(tyIdx); - stmt->SetNOpnd(args); - stmt->SetNumOpnds(args.size()); + stmt->SetOpnds(args); CallReturnVector nrets(GetCurrentFuncCodeMpAllocator()->Adapter()); if (ret != nullptr) { - ASSERT((ret->GetStorageClass() == kScAuto || ret->GetStorageClass() == kScFormal || - ret->GetStorageClass() == kScExtern || ret->GetStorageClass() == kScGlobal), - "Not Excepted ret"); + ASSERT(IsValidCallReturn(*ret), "Not Excepted ret"); nrets.push_back(CallReturnPair(ret->GetStIdx(), RegFieldPair(0, 0))); } stmt->SetReturnVec(nrets); @@ -1161,15 +998,12 @@ IntrinsiccallNode *MIRBuilder::CreateStmtIntrinsicCallAssigned(MIRIntrinsicID id IntrinsiccallNode *MIRBuilder::CreateStmtXintrinsicCallAssigned(MIRIntrinsicID idx, const MapleVector &args, const MIRSymbol *ret) { IntrinsiccallNode *stmt = - GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), OP_xintrinsiccallassigned); - stmt->SetIntrinsic(idx); - stmt->SetNOpnd(args); - stmt->SetNumOpnds(args.size()); + GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), OP_xintrinsiccallassigned, idx); + ASSERT(stmt != nullptr, "stmt is null"); + stmt->SetOpnds(args); CallReturnVector nrets(GetCurrentFuncCodeMpAllocator()->Adapter()); if (ret != nullptr) { - ASSERT((ret->GetStorageClass() == kScAuto || ret->GetStorageClass() == kScFormal || - ret->GetStorageClass() == kScExtern || ret->GetStorageClass() == kScGlobal), - "Not Excepted ret"); + ASSERT(IsValidCallReturn(*ret), "Not Excepted ret"); nrets.push_back(CallReturnPair(ret->GetStIdx(), RegFieldPair(0, 0))); } stmt->SetReturnVec(nrets); @@ -1178,33 +1012,27 @@ IntrinsiccallNode *MIRBuilder::CreateStmtXintrinsicCallAssigned(MIRIntrinsicID i NaryStmtNode *MIRBuilder::CreateStmtReturn(BaseNode *rVal) { NaryStmtNode *stmt = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), OP_return); - if (rVal) { - stmt->GetNopnd().push_back(rVal); - } - stmt->SetNumOpnds(stmt->GetNopndSize()); + 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); - stmt->SetNOpnd(rVals); - stmt->SetNumOpnds(stmt->GetNopndSize()); + ASSERT(stmt != nullptr, "stmt is null"); + stmt->SetOpnds(rVals); return stmt; } NaryStmtNode *MIRBuilder::CreateStmtNary(Opcode op, BaseNode *rVal) { NaryStmtNode *stmt = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), op); - if (rVal) { - stmt->GetNopnd().push_back(rVal); - } - stmt->SetNumOpnds(stmt->GetNopndSize()); + ASSERT(stmt != nullptr, "stmt is null"); + stmt->PushOpnd(rVal); return stmt; } UnaryStmtNode *MIRBuilder::CreateStmtUnary(Opcode op, BaseNode *rVal) { - UnaryStmtNode *stmt = GetCurrentFuncCodeMp()->New(op); - stmt->SetOpnd(rVal); - return stmt; + return GetCurrentFuncCodeMp()->New(op, kPtyInvalid, rVal); } UnaryStmtNode *MIRBuilder::CreateStmtThrow(BaseNode *rVal) { @@ -1232,49 +1060,31 @@ IfStmtNode *MIRBuilder::CreateStmtIfThenElse(BaseNode *cond) { DoloopNode *MIRBuilder::CreateStmtDoloop(StIdx doVarStIdx, bool isPReg, BaseNode *startExp, BaseNode *contExp, BaseNode *incrExp) { - DoloopNode *doLoopNode = GetCurrentFuncCodeMp()->New(); - doLoopNode->SetDoVarStIdx(doVarStIdx); - doLoopNode->SetIsPreg(isPReg); - doLoopNode->SetStartExpr(startExp); - doLoopNode->SetContExpr(contExp); - doLoopNode->SetIncrExpr(incrExp); - doLoopNode->SetDoBody(GetCurrentFuncCodeMp()->New()); - doLoopNode->SetNumOpnds(4); - return doLoopNode; + return GetCurrentFuncCodeMp()->New(doVarStIdx, isPReg, startExp, contExp, incrExp, + GetCurrentFuncCodeMp()->New()); } SwitchNode *MIRBuilder::CreateStmtSwitch(BaseNode *opnd, LabelIdx defaultLabel, const CaseVector &switchTable) { - SwitchNode *switchNode = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator()); - switchNode->SetSwitchOpnd(opnd); - switchNode->SetDefaultLabel(defaultLabel); + SwitchNode *switchNode = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), defaultLabel, opnd); switchNode->SetSwitchTable(switchTable); switchNode->SetNumOpnds(switchTable.size()); return switchNode; } GotoNode *MIRBuilder::CreateStmtGoto(Opcode o, LabelIdx labIdx) { - GotoNode *gotoNode = GetCurrentFuncCodeMp()->New(o); - gotoNode->SetOffset(labIdx); - return gotoNode; + return GetCurrentFuncCodeMp()->New(o, labIdx); } JsTryNode *MIRBuilder::CreateStmtJsTry(Opcode o, LabelIdx cLabIdx, LabelIdx fLabIdx) { - JsTryNode *tryNode = GetCurrentFuncCodeMp()->New(); - tryNode->SetCatchOffset(static_cast(cLabIdx)); - tryNode->SetFinallyOffset(static_cast(fLabIdx)); - return tryNode; + return GetCurrentFuncCodeMp()->New(static_cast(cLabIdx), static_cast(fLabIdx)); } TryNode *MIRBuilder::CreateStmtTry(const MapleVector &cLabIdxs) { - TryNode *tryNode = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator()); - tryNode->SetOffsets(cLabIdxs); - return tryNode; + return GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), cLabIdxs); } CatchNode *MIRBuilder::CreateStmtCatch(const MapleVector &tyIdxVec) { - CatchNode *catchNode = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator()); - catchNode->SetExceptionTyIdxVec(tyIdxVec); - return catchNode; + return GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), tyIdxVec); } LabelIdx MIRBuilder::GetOrCreateMIRLabel(const std::string &name) { @@ -1297,14 +1107,11 @@ LabelIdx MIRBuilder::CreateLabIdx(MIRFunction *mirFunc) { } LabelNode *MIRBuilder::CreateStmtLabel(LabelIdx labIdx) { - LabelNode *label = GetCurrentFuncCodeMp()->New(); - label->SetLabelIdx(labIdx); - return label; + return GetCurrentFuncCodeMp()->New(labIdx); } StmtNode *MIRBuilder::CreateStmtComment(const std::string &cmnt) { - CommentNode *cmntNode = GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), cmnt); - return cmntNode; + return GetCurrentFuncCodeMp()->New(GetCurrentFuncCodeMpAllocator(), cmnt); } void MIRBuilder::AddStmtInCurrentFunctionBody(StmtNode *stmt) { @@ -1315,25 +1122,15 @@ void MIRBuilder::AddStmtInCurrentFunctionBody(StmtNode *stmt) { } AddrofNode *MIRBuilder::CreateAddrof(const MIRSymbol *st, PrimType pty) { - AddrofNode *addrofNode = GetCurrentFuncCodeMp()->New(OP_addrof); - addrofNode->SetPrimType(pty); - addrofNode->SetStIdx(st->GetStIdx()); - return addrofNode; + return GetCurrentFuncCodeMp()->New(OP_addrof, pty, st->GetStIdx(), 0); } AddrofNode *MIRBuilder::CreateDread(const MIRSymbol *st, PrimType pty) { - AddrofNode *dread = GetCurrentFuncCodeMp()->New(OP_dread); - dread->SetPrimType(pty); - dread->SetStIdx(st->GetStIdx()); - dread->SetFieldID(0); - return dread; + return GetCurrentFuncCodeMp()->New(OP_dread, pty, st->GetStIdx(), 0); } CondGotoNode *MIRBuilder::CreateStmtCondGoto(BaseNode *cond, Opcode op, LabelIdx labIdx) { - CondGotoNode *condGoto = GetCurrentFuncCodeMp()->New(op == OP_brtrue ? OP_brtrue : OP_brfalse); - condGoto->SetOffset(labIdx); - condGoto->SetOpnd(cond); - return condGoto; + return GetCurrentFuncCodeMp()->New(op == OP_brtrue ? OP_brtrue : OP_brfalse, labIdx, cond); } MemPool *MIRBuilder::GetCurrentFuncCodeMp() { diff --git a/src/maple_ir/src/mir_parser.cpp b/src/maple_ir/src/mir_parser.cpp index 6cde961a2044df033273eee5a036d59c8832e290..4b6ebc9095a5338da8dfc90a55f0a16e5289f6dc 100644 --- a/src/maple_ir/src/mir_parser.cpp +++ b/src/maple_ir/src/mir_parser.cpp @@ -2625,6 +2625,7 @@ bool MIRParser::ParseConstAddrLeafExpr(MIRConstPtr &cexpr, MIRType *type) { MIRFunction *currfn = static_cast(mod.CurFunction()); MIRSymbol *var = currfn->GetLocalOrGlobalSymbol(anode->GetStIdx()); var->SetNeedForwDecl(); + mod.SetSomeSymbolNeedForDecl(true); TyIdx ptyidx = var->GetTyIdx(); MIRPtrType ptrtype(ptyidx, (mod.IsJavaModule() ? PTY_ref : PTY_ptr)); ptyidx = GlobalTables::GetTypeTable().GetOrCreateMIRType(&ptrtype); diff --git a/src/maple_me/include/bb.h b/src/maple_me/include/bb.h index 2d1964cc3ae79d5c9e5c45955990b561f445c806..cadf730d4fe77f07d96332467ef822e743094320 100644 --- a/src/maple_me/include/bb.h +++ b/src/maple_me/include/bb.h @@ -211,6 +211,14 @@ class BB { stmtNodeList.update_back(stmt); } + StmtNode *GetFirst() { + return &stmtNodeList.front(); + } + + StmtNode *GetLast() { + return &stmtNodeList.back(); + } + void SetFirstMe(MeStmt *stmt); void SetLastMe(MeStmt *stmt); bool IsInList(MapleVector &) const; diff --git a/src/maple_me/include/me_function.h b/src/maple_me/include/me_function.h index 2b65cf9a0b58ae38974c9d0ab459b03b63ae7625..6237137f7710f3067775a893a68e0afb697c0bcd 100644 --- a/src/maple_me/include/me_function.h +++ b/src/maple_me/include/me_function.h @@ -316,7 +316,7 @@ class MeFunction : public FuncEmit { void CreateBBLabel(BB *bb); /* clone stmtnodes from orig to newbb */ void CloneBasicBlock(BB *newbb, BB *orig); - BB *SplitBB(BB *bb, StmtNode *splitPoint); + BB *SplitBB(BB *bb, StmtNode *splitPoint, BB *newBB = nullptr); const bool HasException() const { return hasEH; } @@ -418,6 +418,10 @@ class MeFunction : public FuncEmit { nextBBId = currNextBBId; } + uint32 &GetNextBBId() { + return nextBBId; + } + uint32 GetRegNum() const { return regNum; } diff --git a/src/maple_me/include/me_ir.h b/src/maple_me/include/me_ir.h index a608208ea1f60b0f54d74af18fddf9362673e8ce..d253296a04f5b0cca6c43e73be5346a93c00989f 100644 --- a/src/maple_me/include/me_ir.h +++ b/src/maple_me/include/me_ir.h @@ -187,13 +187,14 @@ class IassignMeStmt; // forward decl class VarMeExpr : public MeExpr { public: public: - VarMeExpr(int32 exprid, OStIdx oidx, size_t vidx) + VarMeExpr(MapleAllocator *alloc, int32 exprid, OStIdx oidx, size_t vidx) : MeExpr(exprid, kMeOpVar), def{ .defStmt = nullptr }, ostIdx(oidx), vstIdx(vidx), fieldID(0), inferredTyIdx(0), + inferredTypeCandidates(alloc->Adapter()), defBy(kDefByNo), maybeNull(true) { } @@ -253,6 +254,10 @@ class VarMeExpr : public MeExpr { inferredTyIdx = inferredTyIdxVal; } + MapleVector &GetInferredTypeCandidates() { + return inferredTypeCandidates; + } + MeDefBy GetDefBy() const { return defBy; } @@ -313,6 +318,7 @@ class VarMeExpr : public MeExpr { size_t vstIdx; // the index in MEOptimizer's VersionStTable, 0 if not in VersionStTable FieldID fieldID; TyIdx inferredTyIdx; /* Non zero if it has a known type (allocation type is seen). */ + MapleVector inferredTypeCandidates; MeDefBy defBy; bool maybeNull; // false if definitely not null }; @@ -821,7 +827,7 @@ class OpMeExpr : public MeExpr { bitsOffset = bitsOffSetVal; } - uint8 GetBitsSize() { + uint8 GetBitsSize() const { return bitsSize; } @@ -1458,6 +1464,14 @@ class DassignMeStmt : public MeStmt { return needDecref; } + void SetNeedDecref(bool isNeedDecref) { + needDecref = isNeedDecref; + } + + void SetNeedIncref(bool isNeedIncref) { + needIncref = isNeedIncref; + } + void EnableNeedDecref() { needDecref = true; } diff --git a/src/maple_me/src/irmap.cpp b/src/maple_me/src/irmap.cpp index a11d181031d689c5ae6b35df049bd3b5bd91ec5b..a8d3597aaf9ae3121e0d8549c343f7d079d5b9f7 100644 --- a/src/maple_me/src/irmap.cpp +++ b/src/maple_me/src/irmap.cpp @@ -78,7 +78,7 @@ void IRMap::BuildPhiMeNode(BB *bb) { } VarMeExpr *IRMap::CreateVarMeExprVersion(const VarMeExpr *origExpr) { - VarMeExpr *varmeexpr = New(exprID++, origExpr->GetOStIdx(), verst2MeExprTable.size()); + VarMeExpr *varmeexpr = New(&irMapAlloc, exprID++, origExpr->GetOStIdx(), verst2MeExprTable.size()); verst2MeExprTable.push_back(varmeexpr); varmeexpr->InitBase(origExpr->GetOp(), origExpr->GetPrimType(), origExpr->GetNumOpnds()); varmeexpr->SetFieldID(origExpr->GetFieldID()); @@ -111,7 +111,7 @@ VarMeExpr *IRMap::CreateNewGlobalTmp(GStrIdx strIdx, PrimType ptyp) { mirModule->GetMIRBuilder()->CreateSymbol((TyIdx)ptyp, strIdx, kStVar, kScGlobal, nullptr, kScopeGlobal); st->SetIsTmp(true); OriginalSt *oSt = ssaTab->CreateSymbolOriginalSt(st, 0, 0); - VarMeExpr *varx = New(exprID++, oSt->GetIndex(), oSt->GetZeroVersionIndex()); + VarMeExpr *varx = New(&irMapAlloc, exprID++, oSt->GetIndex(), oSt->GetZeroVersionIndex()); varx->InitBase(OP_dread, ptyp, 0); return varx; } @@ -124,7 +124,7 @@ VarMeExpr *IRMap::CreateNewLocalRefVarTmp(GStrIdx strIdx, TyIdx tIdx) { oSt->SetZeroVersionIndex(verst2MeExprTable.size()); verst2MeExprTable.push_back(nullptr); oSt->GetVersionsIndex().push_back(oSt->GetZeroVersionIndex()); - VarMeExpr *newlocalrefvar = New(exprID++, oSt->GetIndex(), verst2MeExprTable.size()); + VarMeExpr *newlocalrefvar = New(&irMapAlloc, exprID++, oSt->GetIndex(), verst2MeExprTable.size()); verst2MeExprTable.push_back(newlocalrefvar); newlocalrefvar->InitBase(OP_dread, PTY_ref, 0); return newlocalrefvar; @@ -236,7 +236,7 @@ VarMeExpr *IRMap::GetOrCreateVarFromVerSt(const VersionSt *verSt) { } OriginalSt *oSt = verSt->GetOrigSt(); ASSERT(oSt->IsSymbolOst(), "GetOrCreateVarFromVerSt: wrong ost_type"); - VarMeExpr *varx = New(exprID++, oSt->GetIndex(), vindex); + VarMeExpr *varx = New(&irMapAlloc, exprID++, oSt->GetIndex(), vindex); ASSERT(!GlobalTables::GetTypeTable().GetTypeTable().empty(), "container check"); varx->InitBase(OP_dread, GlobalTables::GetTypeTable().GetTypeFromTyIdx(oSt->GetTyIdx())->GetPrimType(), 0); varx->SetFieldID(oSt->GetFieldID()); @@ -252,7 +252,7 @@ VarMeExpr *IRMap::GetOrCreateZeroVersionVarMeExpr(OriginalSt *oSt) { verst2MeExprTable.push_back(nullptr); } if (verst2MeExprTable[oSt->GetZeroVersionIndex()] == nullptr) { - VarMeExpr *varmeexpr = New(exprID++, oSt->GetIndex(), oSt->GetZeroVersionIndex()); + VarMeExpr *varmeexpr = New(&irMapAlloc, exprID++, oSt->GetIndex(), oSt->GetZeroVersionIndex()); varmeexpr->SetFieldID(oSt->GetFieldID()); varmeexpr->SetOp(OP_dread); ASSERT(!GlobalTables::GetTypeTable().GetTypeTable().empty(), "container check"); diff --git a/src/maple_me/src/me_function.cpp b/src/maple_me/src/me_function.cpp index 70b15af2a8fdee8e4b2529d5d939151af3be7786..601f04e1aef4d5062d2d6a91af768e156dd2c62c 100644 --- a/src/maple_me/src/me_function.cpp +++ b/src/maple_me/src/me_function.cpp @@ -499,8 +499,10 @@ void MeFunction::CloneBasicBlock(BB *newBB, BB *orig) { } /* Split BB at split_point */ -BB *MeFunction::SplitBB(BB *bb, StmtNode *splitPoint) { - BB *newBB = memPool->New(&alloc, &versAlloc, BBId(nextBBId++)); +BB *MeFunction::SplitBB(BB *bb, StmtNode *splitPoint, BB *newBB) { + if (newBB == nullptr){ + newBB = memPool->New(&alloc, &versAlloc, BBId(nextBBId++)); + } StmtNode *newBBStart = splitPoint->GetNext(); // Fix Stmt in BB. if (newBBStart != nullptr) { diff --git a/src/maple_me/src/me_ir.cpp b/src/maple_me/src/me_ir.cpp index 7a2299ddedcb3ac91243b4dc23751a57895eca9b..5598336cec26c0b5a8cf970186dc8d92c39d871c 100644 --- a/src/maple_me/src/me_ir.cpp +++ b/src/maple_me/src/me_ir.cpp @@ -41,14 +41,16 @@ bool MeExpr::IsTheSameWorkcand(MeExpr *meexpr) const { // exclude cvt for different return type return false; } - if (op == OP_resolveinterfacefunc || op == OP_resolvevirtualfunc) + if (op == OP_sext && + static_cast(this)->GetBitsSize() != static_cast(meexpr)->GetBitsSize()) { + return false; + } + if (op == OP_resolveinterfacefunc || op == OP_resolvevirtualfunc) { if (static_cast(this)->GetFieldID() != static_cast(meexpr)->GetFieldID()) { return false; } - if (IsUseSameSymbol(meexpr)) { - return true; } - return false; + return IsUseSameSymbol(meexpr); } void MeExpr::UpdateDepth() { diff --git a/src/maple_me/src/me_rc_lowering.cpp b/src/maple_me/src/me_rc_lowering.cpp index 330f11ac05f9ca4b3206d6e92a44f726e037d20c..ac9573d9bd6b2636fb303f162d55b2378149a5ba 100644 --- a/src/maple_me/src/me_rc_lowering.cpp +++ b/src/maple_me/src/me_rc_lowering.cpp @@ -761,7 +761,8 @@ VarMeExpr *RCLowering::CreateNewTmpVarMeExpr(bool isLocalrefvar) { ost->GetVersionsIndex().push_back(ost->GetZeroVersionIndex()); } irMap->SetExprID(irMap->GetExprID() + 1); - VarMeExpr *varMeExpr = irMap->New(irMap->GetExprID(), ost->GetIndex(), irMap->GetVerst2MeExprTableSize()); + VarMeExpr *varMeExpr = irMap->New(&irMap->GetIRMapAlloc(), irMap->GetExprID(), ost->GetIndex(), + irMap->GetVerst2MeExprTableSize()); varMeExpr->InitBase(OP_dread, PTY_ptr, 0); varMeExpr->SetFieldID(0); irMap->PushBackVerst2MeExprTable(varMeExpr); diff --git a/src/maple_me/src/me_ssa_update.cpp b/src/maple_me/src/me_ssa_update.cpp index a03eec677ea42f8bda1bc6a83e554c554047b421..3c1d46c74741201788fcf3f66c55a3e5d7c0e7a4 100644 --- a/src/maple_me/src/me_ssa_update.cpp +++ b/src/maple_me/src/me_ssa_update.cpp @@ -76,7 +76,8 @@ void SSAUpdate::RenamePhi(BB *bb) { if (phi->GetLHS() == nullptr) { // create a new VarMeExpr defined by this phi irMap->SetExprID(irMap->GetExprID() + 1); - VarMeExpr *newvar = irMap->New(irMap->GetExprID(), it2->first, irMap->GetVerst2MeExprTableSize()); + VarMeExpr *newvar = irMap->New(&irMap->GetIRMapAlloc(), irMap->GetExprID(), it2->first, + irMap->GetVerst2MeExprTableSize()); newvar->InitBase(OP_dread, PTY_ref, 0); newvar->SetFieldID(0); irMap->PushBackVerst2MeExprTable(newvar); diff --git a/src/maple_util/include/literal_str_name.h b/src/maple_util/include/literal_str_name.h index ae1d6fe3ae053a517c6a5df16e138b06fd8d4ba8..4f6a68dcd435d9527a2b41331d1f76512006c508 100644 --- a/src/maple_util/include/literal_str_name.h +++ b/src/maple_util/include/literal_str_name.h @@ -41,9 +41,8 @@ union DigestHash { class LiteralStrName { public: static int32_t CalculateHashSwapByte(const char16_t *data, uint32_t len); - static int32_t CalculateHash(const char16_t *data, uint32_t len, bool dataIsCompress) { - int hash = 0; + uint32_t hash = 0; if (dataIsCompress) { const char *dataStart = reinterpret_cast(data); const char *end = dataStart + len; diff --git a/src/maple_util/include/muid.h b/src/maple_util/include/muid.h index 341fa076ae89a95325c3498b533ce8840e9a29b8..bafa0e16d6e9a52185fd5b2a290cd0040ea8abfa 100644 --- a/src/maple_util/include/muid.h +++ b/src/maple_util/include/muid.h @@ -30,6 +30,10 @@ constexpr unsigned int kSystemNamespace = 0xc0; constexpr unsigned int kApkNamespace = 0x80; constexpr unsigned int kBitMask = 0x3f; +// For Lazy decoupling load +const uint32_t kMplLazyLoadMagicNumber = 0x1a2; // For trigger SIGSEGV +const uint64_t kMplLazyLoadSentryNumber = 0x1a27b10d10810ade; + #ifdef USE_64BIT_MUID #undef MUID_LENGTH #define MUID_LENGTH 8 diff --git a/src/maple_util/include/option_parser.h b/src/maple_util/include/option_parser.h index 2ce4b32e102da90c90485c92fc009978bd71c32c..b26d3c311f79610fb5a463786da121b22c617d5a 100644 --- a/src/maple_util/include/option_parser.h +++ b/src/maple_util/include/option_parser.h @@ -217,6 +217,9 @@ class OptionParser { const maple::ErrorCode Parse(int argc, char **argv); + const maple::ErrorCode HandleInputArgs(const std::vector &inputArgs, const std::string &exeName, + std::vector &inputOption); + const std::vector