[webkit-dev] Fix for Vector::m_inlineBuffer alignment?

David Kilzer ddkilzer at webkit.org
Wed Sep 3 15:21:47 PDT 2008


It sounds like the first part should go in JavaScriptCore/wtf/Platform.h.

Could you open a new bug on <https://bugs.webkit.org/> and post this as a patch for review?  Thanks!

Dave


On Wed, 9/3/08, Paul Pedriana <ppedriana at gmail.com> wrote:

> I see that JavaScriptCore/wtf/Vector.h has this:
> 
>     // FIXME: Nothing guarantees this buffer is
> appropriately aligned to 
> hold objects of type T.
>     char m_inlineBuffer[m_inlineBufferSize];
> 
> And I've heard reports about people having alignment
> crashes on some 
> hardware. Something like the code below could rectify this
> in a portable 
> way. This could be made into a patch as-is, though the
> first part of the 
> code really belongs in a separate PlatformDefs.h-style
> header. I'm 
> wondering if WebKit has a central place for such a thing
> that I'm not 
> aware of.
> 
>     // Portable facilities to detect and set alignment
>     #if defined(__GNUC__) || defined(__MWERKS__)
>         #define WTF_ALIGN_OF(type)   __alignof__(type)
>         #define WTF_PREFIX_ALIGN(n)
>         #define WTF_POSTFIX_ALIGN(n)
> __attribute__((aligned(n)))
>     #elif defined(_MSC_VER)
>         #define WTF_ALIGN_OF(type)   __alignof(type)
>         #define WTF_PREFIX_ALIGN(n)  __declspec(align(n)) 
> // n must be 
> a literal integer, it cannot be a general constant
> expression.
>         #define WTF_POSTFIX_ALIGN(n)
>     #else
>         #error need alignment control
>     #endif
> 
>     // Portable aliasing support.
>     #if defined(__GNUC__) && (((__GNUC__ * 100) +
> __GNUC_MINOR__) >= 303)
>         typedef char __attribute__((__may_alias__))
> aligned_buffer_char;
>     #else
>         typedef char aligned_buffer_char;
>     #endif
> 
>     // Portable aligned char buffer.
>     // VC++ can't
> compile__declspec(align(__alignof(T)), so we solve 
> this with template specialization.
>     template <size_t size, size_t alignment>
>     struct aligned_buffer { aligned_buffer_char
> buffer[size]; };
> 
>     template<size_t size>
>     struct aligned_buffer<size, 2> {
> WTF_PREFIX_ALIGN(2)  
> aligned_buffer_char buffer[size] WTF_POSTFIX_ALIGN(2); };
> 
>     template<size_t size>
>     struct aligned_buffer<size, 4> {
> WTF_PREFIX_ALIGN(4)  
> aligned_buffer_char buffer[size] WTF_POSTFIX_ALIGN(4); };
> 
>     template<size_t size>
>     struct aligned_buffer<size, 8> {
> WTF_PREFIX_ALIGN(8)  
> aligned_buffer_char buffer[size] WTF_POSTFIX_ALIGN(8); };
> 
>     template<size_t size>
>     struct aligned_buffer<size, 16> {
> WTF_PREFIX_ALIGN(16) 
> aligned_buffer_char buffer[size] WTF_POSTFIX_ALIGN(16); };
> 
>     template<size_t size>
>     struct aligned_buffer<size, 32> {
> WTF_PREFIX_ALIGN(32) 
> aligned_buffer_char buffer[size] WTF_POSTFIX_ALIGN(32); };
> 
>     template<size_t size>
>     struct aligned_buffer<size, 64> {
> WTF_PREFIX_ALIGN(64) 
> aligned_buffer_char buffer[size] WTF_POSTFIX_ALIGN(64); };
> 
> 
> 
>     template<typename T, size_t inlineCapacity>
>     class VectorBuffer : private VectorBufferBase<T>
> {
>         .
>         .
>         .
> 
> -        T* inlineBuffer() { return
> reinterpret_cast<T*>(&m_inlineBuffer); }
> -        // FIXME: Nothing guarantees this buffer is
> appropriately 
> aligned to hold objects of type T.
> -        char m_inlineBuffer[m_inlineBufferSize];
> 
> 
> +        T* inlineBuffer() { return 
> reinterpret_cast<T*>(m_inlineBuffer.buffer); }
> +        aligned_buffer<m_inlineBufferSize,
> WTF_ALIGN_OF(T)> m_inlineBuffer;
>     };
> 


More information about the webkit-dev mailing list