зеркало из https://github.com/mozilla/pjs.git
Fix excessive fastload file invalidation with some versions of gcc by fixing aliasing bug in NS_SWAP64. Patch by me, with tweaks by brendan. b=142869 r=bryner sr=brendan
This commit is contained in:
Родитель
9ea45e8064
Коммит
ab8f3df2f6
|
@ -117,10 +117,18 @@ interface nsIStreamBufferAccess : nsISupports
|
||||||
# define NS_SWAP16(x) ((((x) & 0xff) << 8) | (((x) >> 8) & 0xff))
|
# define NS_SWAP16(x) ((((x) & 0xff) << 8) | (((x) >> 8) & 0xff))
|
||||||
# define NS_SWAP32(x) ((NS_SWAP16((x) & 0xffff) << 16) | (NS_SWAP16((x) >> 16)))
|
# define NS_SWAP32(x) ((NS_SWAP16((x) & 0xffff) << 16) | (NS_SWAP16((x) >> 16)))
|
||||||
|
|
||||||
|
// We want to avoid casting to 32-bit types if possible, since that violates
|
||||||
|
// aliasing rules (a standard compiler may assume that pointers of two types
|
||||||
|
// do not address overlapping storage).
|
||||||
|
//
|
||||||
|
// XXX What if we have a compiler that follows aliasing rules strictly but
|
||||||
|
// doesn't have a 64-bit int type?
|
||||||
|
//
|
||||||
// XXXbe shouldn't NSPR's LL_INIT work for non-constant arguments in all cases?
|
// XXXbe shouldn't NSPR's LL_INIT work for non-constant arguments in all cases?
|
||||||
# if defined(HAVE_LONG_LONG)
|
|
||||||
# define NS_SWAP64(x) (((PRUint64)NS_SWAP32(*(PRUint32*)&(x)) << 32) \
|
# if defined HAVE_LONG_LONG
|
||||||
| NS_SWAP32(*((PRUint32*)&(x)+1)))
|
# define NS_SWAP64(x) ((NS_SWAP32((x) & 0xffffffff) << 32) | \
|
||||||
|
(NS_SWAP32((x) >> 32)))
|
||||||
# else
|
# else
|
||||||
# define NS_SWAP64(x) LL_INIT(NS_SWAP32(*(PRUint32*)&(x)), \
|
# define NS_SWAP64(x) LL_INIT(NS_SWAP32(*(PRUint32*)&(x)), \
|
||||||
NS_SWAP32(*((PRUint32*)&(x)+1)))
|
NS_SWAP32(*((PRUint32*)&(x)+1)))
|
||||||
|
|
Загрузка…
Ссылка в новой задаче