diff --git a/src/mapleall/maple_be/src/be/becommon.cpp b/src/mapleall/maple_be/src/be/becommon.cpp index 9dc0fd22b55b4bd90355ca795ea4383f9732fc88..fb19b70192a0c4eee50d889f6653d002519dc22e 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 04080a4b0a901f1092b88a552bebf3b0af3af6b3..39a41aefb051ed038781be2c4e449015f1d89f90 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 0d3630bc5573bc6a86d4944e5354bfc8eef11b49..2f37c45083e18c39acfb913c1584676538c1fc1b 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) {