Skip to content

Commit c4f7e13

Browse files
committed
[RISC-V] Skip ComputeReturnFlags in ArgIteratorTemplate::HasRetBuffArg
ComputeReturnFlags on RISC-V is complicated due to ABI rules on enregistering small structs and it can even potentially trigger an unnecessary class load. So take a shortcut when we only need to check whether a struct is returned in a buffer.
1 parent 53d8003 commit c4f7e13

File tree

1 file changed

+19
-0
lines changed

1 file changed

+19
-0
lines changed

src/coreclr/vm/callingconvention.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,26 @@ class ArgIteratorTemplate : public ARGITERATOR_BASE
419419
{
420420
WRAPPER_NO_CONTRACT;
421421
if (!(m_dwFlags & RETURN_FLAGS_COMPUTED))
422+
{
423+
#ifdef TARGET_RISCV64
424+
// On RISC-V computing all return flags is complicated due to ABI rules on enregistering small structs
425+
// so just check struct size and be done with it.
426+
TypeHandle valueType;
427+
switch (this->GetReturnType(&valueType))
428+
{
429+
case ELEMENT_TYPE_TYPEDBYREF:
430+
return (sizeof(TypedByRef) > ENREGISTERED_RETURNTYPE_INTEGER_MAXSIZE);
431+
case ELEMENT_TYPE_VALUETYPE:
432+
assert(!valueType.IsNull());
433+
assert(!valueType.IsTypeDesc());
434+
return (valueType.GetSize() > ENREGISTERED_RETURNTYPE_INTEGER_MAXSIZE);
435+
default:
436+
return false;
437+
}
438+
#else
422439
ComputeReturnFlags();
440+
#endif
441+
}
423442
return (m_dwFlags & RETURN_HAS_RET_BUFFER);
424443
}
425444

0 commit comments

Comments
 (0)