summaryrefslogtreecommitdiff
path: root/src/vm/fieldmarshaler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/fieldmarshaler.cpp')
-rw-r--r--src/vm/fieldmarshaler.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/vm/fieldmarshaler.cpp b/src/vm/fieldmarshaler.cpp
index 1e24399e30..dfbbb9aebb 100644
--- a/src/vm/fieldmarshaler.cpp
+++ b/src/vm/fieldmarshaler.cpp
@@ -285,7 +285,27 @@ do \
if (CorTypeInfo::IsPrimitiveType(corElemType))
{
pfwalk->m_managedSize = ((UINT32)CorTypeInfo::Size(corElemType)); // Safe cast - no primitive type is larger than 4gb!
+#if defined(_TARGET_X86_) && defined(UNIX_X86_ABI)
+ switch (corElemType)
+ {
+ // The System V ABI for i386 defines different packing for these types.
+ case ELEMENT_TYPE_I8:
+ case ELEMENT_TYPE_U8:
+ case ELEMENT_TYPE_R8:
+ {
+ pfwalk->m_managedAlignmentReq = 4;
+ break;
+ }
+
+ default:
+ {
+ pfwalk->m_managedAlignmentReq = pfwalk->m_managedSize;
+ break;
+ }
+ }
+#else // _TARGET_X86_ && UNIX_X86_ABI
pfwalk->m_managedAlignmentReq = pfwalk->m_managedSize;
+#endif
}
else if (corElemType == ELEMENT_TYPE_PTR)
{