diff options
Diffstat (limited to 'src/vm/fieldmarshaler.cpp')
-rw-r--r-- | src/vm/fieldmarshaler.cpp | 20 |
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) { |