[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