ruby-changes:49711
From: shyouhei <ko1@a...>
Date: Mon, 15 Jan 2018 11:35:24 +0900 (JST)
Subject: [ruby-changes:49711] shyouhei:r61828 (trunk): __alignof__ to take alignment of a type
shyouhei 2018-01-15 11:35:17 +0900 (Mon, 15 Jan 2018) New Revision: 61828 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=61828 Log: __alignof__ to take alignment of a type C11 and C++11 has this feature so why not use it when available. Modified files: trunk/bignum.c trunk/configure.ac trunk/include/ruby/defines.h trunk/win32/Makefile.sub Index: configure.ac =================================================================== --- configure.ac (revision 61827) +++ configure.ac (revision 61828) @@ -1767,6 +1767,24 @@ AS_IF([test "$rb_cv_have_alignas" != no] https://github.com/ruby/ruby/blob/trunk/configure.ac#L1767 AC_DEFINE_UNQUOTED([RUBY_ALIGNAS(x)], $rb_cv_have_alignas) ]) +AC_CACHE_CHECK([for alignof() syntax], rb_cv_have_alignof,[ +rb_cv_have_alignof=no +RUBY_WERROR_FLAG([ +for expr in \ + "_Alignof" \ + "alignof" \ + "__alignof" \ + "__alignof__" \ +; +do + AC_TRY_COMPILE([],[return (int)$expr(int);], + [rb_cv_have_alignof="$expr"; break], []) +done +])]) +AS_IF([test "$rb_cv_have_alignof" != no], [ + AC_DEFINE_UNQUOTED(RUBY_ALIGNOF, $rb_cv_have_alignof) +]) + dnl RUBY_DECL_ATTRIBUTE(attrib, macroname, cachevar, condition, type, code) AC_DEFUN([RUBY_DECL_ATTRIBUTE], [dnl m4_ifval([$2], dnl Index: include/ruby/defines.h =================================================================== --- include/ruby/defines.h (revision 61827) +++ include/ruby/defines.h (revision 61828) @@ -380,6 +380,16 @@ void rb_ia64_flushrs(void); https://github.com/ruby/ruby/blob/trunk/include/ruby/defines.h#L380 #define RUBY_ALIGNAS(x) y #endif +#ifdef RUBY_ALIGNOF +/* OK, take that definition */ +#elif defined(__cplusplus) && (__cplusplus >= 201103L) +#define RUBY_ALIGNOF alignof +#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) +#define RUBY_ALIGNOF _Alignof +#else +#define RUBY_ALIGNOF(x) ((size_t)offsetof(struct { char f1; type f2; }, f2)) +#endif + RUBY_SYMBOL_EXPORT_END #if defined(__cplusplus) Index: win32/Makefile.sub =================================================================== --- win32/Makefile.sub (revision 61827) +++ win32/Makefile.sub (revision 61828) @@ -637,6 +637,7 @@ $(CONFIG_H): $(MKFILES) $(srcdir)/win32/ https://github.com/ruby/ruby/blob/trunk/win32/Makefile.sub#L637 !endif #define RUBY_EXTERN extern __declspec(dllimport) #define RUBY_ALIGNAS(n) __declspec(align(n)) +#define RUBY_ALIGNOF __alignof #define HAVE_DECL_SYS_NERR 1 #define HAVE_LIMITS_H 1 #define HAVE_FCNTL_H 1 Index: bignum.c =================================================================== --- bignum.c (revision 61827) +++ bignum.c (revision 61828) @@ -65,7 +65,6 @@ STATIC_ASSERT(sizeof_long_and_sizeof_bdi https://github.com/ruby/ruby/blob/trunk/bignum.c#L65 #else # define HOST_BIGENDIAN_P 0 #endif -#define ALIGNOF(type) ((int)offsetof(struct { char f1; type f2; }, f2)) /* (!LSHIFTABLE(d, n) ? 0 : (n)) is same as n but suppress a warning, C4293, by Visual Studio. */ #define LSHIFTABLE(d, n) ((n) < sizeof(d) * CHAR_BIT) #define LSHIFTX(d, n) (!LSHIFTABLE(d, n) ? 0 : ((d) << (!LSHIFTABLE(d, n) ? 0 : (n)))) @@ -668,7 +667,7 @@ bary_pack(int sign, BDIGIT *ds, size_t n https://github.com/ruby/ruby/blob/trunk/bignum.c#L667 return ((1 < de - dp || CLEAR_LOWBITS(d, 8) != 0) ? 2 : 1) * sign; } #if defined(HAVE_UINT16_T) && 2 <= SIZEOF_BDIGIT - if (wordsize == 2 && (uintptr_t)words % ALIGNOF(uint16_t) == 0) { + if (wordsize == 2 && (uintptr_t)words % RUBY_ALIGNOF(uint16_t) == 0) { uint16_t u = (uint16_t)(d = dp[0]); if (need_swap) u = swap16(u); *((uint16_t *)words) = u; @@ -676,7 +675,7 @@ bary_pack(int sign, BDIGIT *ds, size_t n https://github.com/ruby/ruby/blob/trunk/bignum.c#L675 } #endif #if defined(HAVE_UINT32_T) && 4 <= SIZEOF_BDIGIT - if (wordsize == 4 && (uintptr_t)words % ALIGNOF(uint32_t) == 0) { + if (wordsize == 4 && (uintptr_t)words % RUBY_ALIGNOF(uint32_t) == 0) { uint32_t u = (uint32_t)(d = dp[0]); if (need_swap) u = swap32(u); *((uint32_t *)words) = u; @@ -684,7 +683,7 @@ bary_pack(int sign, BDIGIT *ds, size_t n https://github.com/ruby/ruby/blob/trunk/bignum.c#L683 } #endif #if defined(HAVE_UINT64_T) && 8 <= SIZEOF_BDIGIT - if (wordsize == 8 && (uintptr_t)words % ALIGNOF(uint64_t) == 0) { + if (wordsize == 8 && (uintptr_t)words % RUBY_ALIGNOF(uint64_t) == 0) { uint64_t u = (uint64_t)(d = dp[0]); if (need_swap) u = swap64(u); *((uint64_t *)words) = u; @@ -699,7 +698,7 @@ bary_pack(int sign, BDIGIT *ds, size_t n https://github.com/ruby/ruby/blob/trunk/bignum.c#L698 return (1 < de - dp || FILL_LOWBITS(d, 8) != -1) ? -2 : -1; } #if defined(HAVE_UINT16_T) && 2 <= SIZEOF_BDIGIT - if (wordsize == 2 && (uintptr_t)words % ALIGNOF(uint16_t) == 0) { + if (wordsize == 2 && (uintptr_t)words % RUBY_ALIGNOF(uint16_t) == 0) { uint16_t u = (uint16_t)(d = -(BDIGIT_DBL_SIGNED)dp[0]); if (need_swap) u = swap16(u); *((uint16_t *)words) = u; @@ -708,7 +707,7 @@ bary_pack(int sign, BDIGIT *ds, size_t n https://github.com/ruby/ruby/blob/trunk/bignum.c#L707 } #endif #if defined(HAVE_UINT32_T) && 4 <= SIZEOF_BDIGIT - if (wordsize == 4 && (uintptr_t)words % ALIGNOF(uint32_t) == 0) { + if (wordsize == 4 && (uintptr_t)words % RUBY_ALIGNOF(uint32_t) == 0) { uint32_t u = (uint32_t)(d = -(BDIGIT_DBL_SIGNED)dp[0]); if (need_swap) u = swap32(u); *((uint32_t *)words) = u; @@ -717,7 +716,7 @@ bary_pack(int sign, BDIGIT *ds, size_t n https://github.com/ruby/ruby/blob/trunk/bignum.c#L716 } #endif #if defined(HAVE_UINT64_T) && 8 <= SIZEOF_BDIGIT - if (wordsize == 8 && (uintptr_t)words % ALIGNOF(uint64_t) == 0) { + if (wordsize == 8 && (uintptr_t)words % RUBY_ALIGNOF(uint64_t) == 0) { uint64_t u = (uint64_t)(d = -(BDIGIT_DBL_SIGNED)dp[0]); if (need_swap) u = swap64(u); *((uint64_t *)words) = u; @@ -760,7 +759,7 @@ bary_pack(int sign, BDIGIT *ds, size_t n https://github.com/ruby/ruby/blob/trunk/bignum.c#L759 } #endif if (nails == 0 && SIZEOF_BDIGIT == sizeof(BDIGIT) && - wordsize % SIZEOF_BDIGIT == 0 && (uintptr_t)words % ALIGNOF(BDIGIT) == 0) { + wordsize % SIZEOF_BDIGIT == 0 && (uintptr_t)words % RUBY_ALIGNOF(BDIGIT) == 0) { size_t bdigits_per_word = wordsize / SIZEOF_BDIGIT; size_t src_num_bdigits = de - dp; size_t dst_num_bdigits = numwords * bdigits_per_word; @@ -1100,19 +1099,19 @@ bary_unpack_internal(BDIGIT *bdigits, si https://github.com/ruby/ruby/blob/trunk/bignum.c#L1099 return integer_unpack_single_bdigit(*(uint8_t *)buf, sizeof(uint8_t), flags, dp); } #if defined(HAVE_UINT16_T) && 2 <= SIZEOF_BDIGIT - if (wordsize == 2 && (uintptr_t)words % ALIGNOF(uint16_t) == 0) { + if (wordsize == 2 && (uintptr_t)words % RUBY_ALIGNOF(uint16_t) == 0) { uint16_t u = *(uint16_t *)buf; return integer_unpack_single_bdigit(need_swap ? swap16(u) : u, sizeof(uint16_t), flags, dp); } #endif #if defined(HAVE_UINT32_T) && 4 <= SIZEOF_BDIGIT - if (wordsize == 4 && (uintptr_t)words % ALIGNOF(uint32_t) == 0) { + if (wordsize == 4 && (uintptr_t)words % RUBY_ALIGNOF(uint32_t) == 0) { uint32_t u = *(uint32_t *)buf; return integer_unpack_single_bdigit(need_swap ? swap32(u) : u, sizeof(uint32_t), flags, dp); } #endif #if defined(HAVE_UINT64_T) && 8 <= SIZEOF_BDIGIT - if (wordsize == 8 && (uintptr_t)words % ALIGNOF(uint64_t) == 0) { + if (wordsize == 8 && (uintptr_t)words % RUBY_ALIGNOF(uint64_t) == 0) { uint64_t u = *(uint64_t *)buf; return integer_unpack_single_bdigit(need_swap ? swap64(u) : u, sizeof(uint64_t), flags, dp); } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/