On March 19, 2019 1:07:26 PM GMT+01:00, Robin Dapp <rd...@linux.ibm.com> wrote:
>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".  

It should probably use sth specified by the C ABI instead, like using 
size_type_node which maps to the targets size_t rather than the internal 
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; }

Reply via email to