From 6617e6c96f2d71e27304c8a8a019d9d90235575e Mon Sep 17 00:00:00 2001 From: William Chen Date: Wed, 13 Jan 2021 09:09:39 -0800 Subject: [PATCH] Allow for malloc/calloc in lhs of expression. --- src/mapleall/maple_be/include/cg/cg_option.h | 2 +- src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp | 8 ++++++-- src/mapleall/maple_be/src/cg/cg_option.cpp | 2 +- src/mapleall/maple_be/src/cg/cgfunc.cpp | 6 +++++- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/mapleall/maple_be/include/cg/cg_option.h b/src/mapleall/maple_be/include/cg/cg_option.h index 551f2f3bba..cfe1163b18 100644 --- a/src/mapleall/maple_be/include/cg/cg_option.h +++ b/src/mapleall/maple_be/include/cg/cg_option.h @@ -119,7 +119,7 @@ class CGOptions : public MapleDriverOptionBase { * Generate yieldpoints for GC. * Do not generate separate GCTIB file. */ - static const GenerateFlag kDefaultGflags = GenerateFlag(kGrootList | kPrimorList); + static const GenerateFlag kDefaultGflags = GenerateFlag(0); public: static CGOptions &GetInstance(); diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp index c2d81537b4..d41f22a76a 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp @@ -3664,9 +3664,13 @@ Operand *AArch64CGFunc::SelectMalloc(UnaryNode &node, Operand &opnd0) { opndVec.emplace_back(&opnd0); /* Use calloc to make sure allocated memory is zero-initialized */ const std::string &funcName = "calloc"; - Operand &opnd1 = CreateImmOperand(1, PTY_u32, false); + PrimType srcPty = PTY_u64; + if (opnd0.GetSize() <= k32BitSize) { + srcPty = PTY_u32; + } + Operand &opnd1 = CreateImmOperand(1, srcPty, false); opndVec.emplace_back(&opnd1); - SelectLibCall(funcName, opndVec, PTY_u32, retType); + SelectLibCall(funcName, opndVec, srcPty, retType); return &resOpnd; } diff --git a/src/mapleall/maple_be/src/cg/cg_option.cpp b/src/mapleall/maple_be/src/cg/cg_option.cpp index 8f0d8ba721..70c8e34684 100644 --- a/src/mapleall/maple_be/src/cg/cg_option.cpp +++ b/src/mapleall/maple_be/src/cg/cg_option.cpp @@ -1095,7 +1095,7 @@ void CGOptions::ParseCyclePattern(const std::string &fileName) { /* Set default options according to different languages. */ void CGOptions::SetDefaultOptions(const maple::MIRModule &mod) { if (mod.IsJavaModule()) { - generateFlag = generateFlag | kGenYieldPoint | kGenLocalRc; + generateFlag = generateFlag | kGenYieldPoint | kGenLocalRc | kGrootList | kPrimorList; } insertYieldPoint = GenYieldPoint(); } diff --git a/src/mapleall/maple_be/src/cg/cgfunc.cpp b/src/mapleall/maple_be/src/cg/cgfunc.cpp index 5600f74536..fe238da768 100644 --- a/src/mapleall/maple_be/src/cg/cgfunc.cpp +++ b/src/mapleall/maple_be/src/cg/cgfunc.cpp @@ -538,7 +538,11 @@ void HandleDassign(StmtNode &stmt, CGFunc &cgFunc) { ASSERT(dassignNode.GetOpCode() == OP_dassign, "expect dassign"); BaseNode *rhs = dassignNode.GetRHS(); ASSERT(rhs != nullptr, "get rhs of dassignNode failed"); - if (rhs->GetPrimType() == PTY_agg) { + if (rhs->GetOpCode() == OP_malloc || rhs->GetOpCode() == OP_alloca) { + UnaryStmtNode &uNode = static_cast(stmt); + Operand *opnd0 = cgFunc.HandleExpr(dassignNode, *(uNode.Opnd())); + cgFunc.SelectDassign(dassignNode, *opnd0); + } else if (rhs->GetPrimType() == PTY_agg) { cgFunc.SelectAggDassign(dassignNode); return; } -- Gitee