From be6c98d7bf0f6356b61462369723d8bccecae258 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Sat, 13 Aug 2022 19:00:49 -0700 Subject: [PATCH] Corrected return type for strcpy, strncpy, memcpy, memmove and memset Set alignment for empty field to 1 instead of 8 When generating ireadoff from dread/iread, insert extra CVT if the load has implicit extension --- src/mapleall/maple_be/src/be/becommon.cpp | 2 +- src/mapleall/maple_ir/include/intrinsic_c.def | 10 +++++----- src/mapleall/maple_me/src/lmbc_lower.cpp | 20 +++++++++++++++---- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/mapleall/maple_be/src/be/becommon.cpp b/src/mapleall/maple_be/src/be/becommon.cpp index 9dc0fd22b5..fb19b70192 100644 --- a/src/mapleall/maple_be/src/be/becommon.cpp +++ b/src/mapleall/maple_be/src/be/becommon.cpp @@ -134,7 +134,7 @@ void BECommon::ComputeStructTypeSizesAligns(MIRType &ty, const TyIdx &tyIdx) { SetTypeAlign(tyIdx.GetIdx(), 1); } else { SetTypeSize(tyIdx.GetIdx(), 0); - SetTypeAlign(tyIdx.GetIdx(), k8ByteSize); + SetTypeAlign(tyIdx.GetIdx(), 1); } return; } diff --git a/src/mapleall/maple_ir/include/intrinsic_c.def b/src/mapleall/maple_ir/include/intrinsic_c.def index 04080a4b0a..39a41aefb0 100644 --- a/src/mapleall/maple_ir/include/intrinsic_c.def +++ b/src/mapleall/maple_ir/include/intrinsic_c.def @@ -20,10 +20,10 @@ DEF_MIR_INTRINSIC(C_strncmp,\ "strncmp", 1, INTRNNOSIDEEFFECT | INTRNISPURE, kArgTyI32, kArgTyPtr, kArgTyPtr, kArgTyU32) DEF_MIR_INTRINSIC(C_strcpy,\ "strcpy", 1, INTRNWRITEFIRSTOPND | INTRNREADSECONDOPND, \ - kArgTyVoid, kArgTyPtr, kArgTyPtr) + kArgTyPtr, kArgTyPtr, kArgTyPtr) DEF_MIR_INTRINSIC(C_strncpy,\ "strncpy", 1, INTRNWRITEFIRSTOPND | INTRNREADSECONDOPND | INTRNREADTHIRDOPND, \ - kArgTyVoid, kArgTyPtr, kArgTyPtr, kArgTyU64) + kArgTyPtr, kArgTyPtr, kArgTyPtr, kArgTyU64) DEF_MIR_INTRINSIC(C_strlen,\ "strlen", 1, INTRNNOSIDEEFFECT | INTRNISPURE, kArgTyU64, kArgTyPtr) DEF_MIR_INTRINSIC(C_strchr,\ @@ -34,12 +34,12 @@ DEF_MIR_INTRINSIC(C_memcmp,\ "memcmp", 1, INTRNNOSIDEEFFECT | INTRNISPURE, kArgTyI32, kArgTyPtr, kArgTyPtr, kArgTyU64) DEF_MIR_INTRINSIC(C_memcpy,\ "memcpy", 1, INTRNWRITEFIRSTOPND | INTRNREADSECONDOPND | INTRNREADTHIRDOPND, \ - kArgTyVoid, kArgTyPtr, kArgTyPtr, kArgTyU64) + kArgTyPtr, kArgTyPtr, kArgTyPtr, kArgTyU64) DEF_MIR_INTRINSIC(C_memmove,\ - "memmove", 1, 0, kArgTyVoid, kArgTyPtr, kArgTyPtr, kArgTyU64) + "memmove", 1, 0, kArgTyPtr, kArgTyPtr, kArgTyPtr, kArgTyU64) DEF_MIR_INTRINSIC(C_memset,\ "memset", 1, INTRNWRITEFIRSTOPND | INTRNREADSECONDOPND | INTRNREADTHIRDOPND, \ - kArgTyVoid, kArgTyPtr, kArgTyI32, kArgTyU64) + kArgTyPtr, kArgTyPtr, kArgTyI32, kArgTyU64) DEF_MIR_INTRINSIC(C_acosf,\ "acosf", 1, INTRNISPURE, kArgTyF32, kArgTyF32) DEF_MIR_INTRINSIC(C_asinf,\ diff --git a/src/mapleall/maple_me/src/lmbc_lower.cpp b/src/mapleall/maple_me/src/lmbc_lower.cpp index 0d3630bc55..2f37c45083 100644 --- a/src/mapleall/maple_me/src/lmbc_lower.cpp +++ b/src/mapleall/maple_me/src/lmbc_lower.cpp @@ -78,20 +78,29 @@ BaseNode *LMBCLowerer::LowerDread(AddrofNode *expr) { if (!symbol->LMBCAllocateOffSpecialReg()) { BaseNode *base = mirBuilder->CreateExprDreadoff(OP_addrofoff, LOWERED_PTR_TYPE, *symbol, 0); IreadoffNode *ireadoff = mirBuilder->CreateExprIreadoff(symty, offset, base); - return ireadoff; + if (GetPrimTypeSize(ireadoff->GetPrimType()) == GetPrimTypeSize(expr->GetPrimType())) { + return ireadoff; + } + return mirBuilder->CreateExprTypeCvt(OP_cvt, expr->GetPrimType(), GetRegPrimType(ireadoff->GetPrimType()), *ireadoff); } PregIdx spcreg = GetSpecialRegFromSt(symbol); if (spcreg == -kSregFp) { CHECK_FATAL(symbol->IsLocal(), "load from fp non local?"); IreadFPoffNode *ireadoff = mirBuilder->CreateExprIreadFPoff( symty, memlayout->sym_alloc_table[symbol->GetStIndex()].offset + offset); - return ireadoff; + if (GetPrimTypeSize(ireadoff->GetPrimType()) == GetPrimTypeSize(expr->GetPrimType())) { + return ireadoff; + } + return mirBuilder->CreateExprTypeCvt(OP_cvt, expr->GetPrimType(), GetRegPrimType(ireadoff->GetPrimType()), *ireadoff); } else { BaseNode *rrn = mirBuilder->CreateExprRegread(LOWERED_PTR_TYPE, spcreg); SymbolAlloc &symalloc = symbol->IsLocal() ? memlayout->sym_alloc_table[symbol->GetStIndex()] : globmemlayout->sym_alloc_table[symbol->GetStIndex()]; IreadoffNode *ireadoff = mirBuilder->CreateExprIreadoff(symty, symalloc.offset + offset, rrn); - return ireadoff; + if (GetPrimTypeSize(ireadoff->GetPrimType()) == GetPrimTypeSize(expr->GetPrimType())) { + return ireadoff; + } + return mirBuilder->CreateExprTypeCvt(OP_cvt, expr->GetPrimType(), GetRegPrimType(ireadoff->GetPrimType()), *ireadoff); } } @@ -141,7 +150,10 @@ BaseNode *LMBCLowerer::LowerIread(IreadNode *expr) { type = structty->GetFieldType(expr->GetFieldID()); } BaseNode *ireadoff = mirBuilder->CreateExprIreadoff(type->GetPrimType(), offset, expr->Opnd(0)); - return ireadoff; + if (GetPrimTypeSize(ireadoff->GetPrimType()) == GetPrimTypeSize(expr->GetPrimType())) { + return ireadoff; + } + return mirBuilder->CreateExprTypeCvt(OP_cvt, expr->GetPrimType(), GetRegPrimType(ireadoff->GetPrimType()), *ireadoff); } BaseNode *LMBCLowerer::LowerIaddrof(IaddrofNode *expr) { -- Gitee