Hi, > Alignment is written to TypeInfo, I don't think it should ever be > zero. That would mean that it isn't being generated by the compiler, > or read by the library correctly, so something else is amiss.
it took me a while to see that in libphobos/libdruntime/object.d override @property size_t talign() nothrow pure const {return m_align;} returns a size_t but m_align is a uint. The type info seems to be stored in memory by the compiler and writes a GCC "sizetype". When using it, we only emit a 4-byte read which loads the first half of the stored 8 bytes. This will work on a little-endian machine but fail on big endian. I'd hope it is safe to change m_align's type to size_t since, as far as I can tell, the compiler will always write 8 bytes and the memory layout will not be changed by that. Does this [1] look reasonable? Regards Robin --- [1] diff --git a/gcc/d/typeinfo.cc b/gcc/d/typeinfo.cc index dac66acdcd4..1bd94c33e82 100644 --- a/gcc/d/typeinfo.cc +++ b/gcc/d/typeinfo.cc @@ -954,7 +954,7 @@ public: StructFlags m_flags; void function(void*) xdtor; void function(void*) xpostblit; - uint m_align; + size_t m_align; version (X86_64) TypeInfo m_arg1; TypeInfo m_arg2; @@ -1032,7 +1032,7 @@ public: else this->layout_field (null_pointer_node); - /* uint m_align; */ + /* size_t m_align; */ this->layout_field (size_int (ti->alignsize ())); if (global.params.is64bit) diff --git a/libphobos/libdruntime/object.d b/libphobos/libdruntime/object.d index 38bd0ae1f6b..bb821bf7040 100644 --- a/libphobos/libdruntime/object.d +++ b/libphobos/libdruntime/object.d @@ -1226,7 +1226,7 @@ class TypeInfo_Struct : TypeInfo } void function(void*) xpostblit; - uint m_align; + size_t m_align; override @property immutable(void)* rtInfo() const { return m_RTInfo; }