[Mono-bugs] [Bug 375160] Wrong struct packing.

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Fri Mar 28 22:02:25 EDT 2008


https://bugzilla.novell.com/show_bug.cgi?id=375160

User jan.oravec at 6com.sk added comment
https://bugzilla.novell.com/show_bug.cgi?id=375160#c1





--- Comment #1 from Jan Oravec <jan.oravec at 6com.sk>  2008-03-28 20:02:24 MST ---
Just found this code (class.c:1265):

        if (layout != TYPE_ATTRIBUTE_EXPLICIT_LAYOUT) {
                /*
                 * For small structs, set min_align to at least the struct size
to improve
                 * performance, and since the JIT memset/memcpy code assumes
this and generates 
                 * unaligned accesses otherwise. See #78990 for a testcase.
                 */
                if (class->instance_size <= sizeof (MonoObject) + sizeof
(gpointer))
                        class->min_align = MAX (class->min_align,
class->instance_size - sizeof (MonoObject));
        }


I am not sure, if runtime can choose struct packing arbitrarily, but I see
another problems:

a) it forces high minimum alignments on structures which could be heavily used
in other structures... these other structures are massively oversized because
of that

b) class->instance_size - sizeof (MonoObject) isn't necessarily 2^N, e.g.:

class X
{
  int a; short b; byte c;
}

class Y
{
  int a; X x;
}

sizeof (X) == 7, sizeof (Y) == 17, while adding another byte to X makes sizeof
(Y) == 16, which is even lower!

Something very bad may happen when min_align = 7...


-- 
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.


More information about the mono-bugs mailing list