-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[RISC-V] Fix struct types passed by floating-point calling convention #4
[RISC-V] Fix struct types passed by floating-point calling convention #4
Conversation
Thanks for looking at this. Feel free to submit it upstream since it looks like it doesn't interact with any of the things I was doing in this branch. |
On a related note I think this assert can/should be tightened back to the same as all other targets; it should be possible after the dotnet#97368 (related comment: dotnet#97368 (comment)). |
…ting-point calling convention
…atforms because after dotnet#97368 we don't need an exception
Should work now, albeit platform-specific fix-ups are not the nicest thing. I phrased it utilizing new ABI passing info to make it easier when the old ones will eventually go. |
#if defined(TARGET_RISCV64) || defined(TARGET_LOONGARCH64) | ||
if (arg.NewAbiInfo.HasAnyFloatingRegisterSegment()) | ||
{ | ||
// Struct passed according to hardware floating-point calling convention | ||
assert(arg.NewAbiInfo.NumSegments <= 2); | ||
assert(!arg.NewAbiInfo.HasAnyStackSegment()); | ||
if (arg.NewAbiInfo.NumSegments == 2) | ||
{ | ||
// On LoongArch64, "getPrimitiveTypeForStruct" will incorrectly return "TYP_LONG" | ||
// for "struct { float, float }", and retyping to a primitive here will cause the | ||
// multi-reg morphing to not kick in (the struct in question needs to be passed in | ||
// two FP registers). Here is just keep "structBaseType" as "TYP_STRUCT". | ||
// TODO-LoongArch64: fix "getPrimitiveTypeForStruct". | ||
structBaseType = TYP_STRUCT; | ||
} | ||
else | ||
{ | ||
assert(arg.NewAbiInfo.NumSegments == 1); | ||
structBaseType = arg.NewAbiInfo.Segments[0].GetRegisterType(); | ||
} | ||
|
||
for (unsigned i = 0; i < arg.NewAbiInfo.NumSegments; ++i) | ||
{ | ||
arg.AbiInfo.StructFloatFieldType[i] = arg.NewAbiInfo.Segments[i].GetRegisterType(); | ||
} | ||
} | ||
#endif // defined(TARGET_RISCV64) || defined(TARGET_LOONGARCH64) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM, thanks. I think we need some test further on LA64 after the relate refactor of these.
Looks good to me. I think this platform-specific fixup will disappear once the multireg morphing code is adapted to use the new ABI representation directly. |
* bug #1: don't allow for values out of the SerializationRecordType enum range * bug #2: throw SerializationException rather than KeyNotFoundException when the referenced record is missing or it points to a record of different type * bug #3: throw SerializationException rather than FormatException when it's being thrown by BinaryReader (or sth else that we use) * bug #4: document the fact that IOException can be thrown * bug dotnet#5: throw SerializationException rather than OverflowException when parsing the decimal fails * bug dotnet#6: 0 and 17 are illegal values for PrimitiveType enum * bug dotnet#7: throw SerializationException when a surrogate character is read (so far an ArgumentException was thrown)
dotnet#103537 (comment)
Part of dotnet#84834, cc @dotnet/samsung