mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Use C99 restrict via pg_restrict, rather than restrict directly.
Unfortunately using 'restrict' plainly causes problems with MSVC,
which supports restrict only as '__restrict'. Defining 'restrict' to
'__restrict' unfortunately causes a conflict with MSVC's usage of
__declspec(restrict) in headers.
Therefore define pg_restrict to the appropriate keyword instead, and
replace existing usages.
This replaces the temporary workaround introduced in 36b4b91ba0
.
Author: Andres Freund
Discussion: https://postgr.es/m/2656.1507830907@sss.pgh.pa.us
This commit is contained in:
@ -38,8 +38,8 @@ extern void pq_sendfloat8(StringInfo buf, float8 f);
|
||||
* Append a int8 to a StringInfo buffer, which already has enough space
|
||||
* preallocated.
|
||||
*
|
||||
* The use of restrict allows the compiler to optimize the code based on the
|
||||
* assumption that buf, buf->len, buf->data and *buf->data don't
|
||||
* The use of pg_restrict allows the compiler to optimize the code based on
|
||||
* the assumption that buf, buf->len, buf->data and *buf->data don't
|
||||
* overlap. Without the annotation buf->len etc cannot be kept in a register
|
||||
* over subsequent pq_writeint* calls.
|
||||
*
|
||||
@ -47,12 +47,12 @@ extern void pq_sendfloat8(StringInfo buf, float8 f);
|
||||
* overly picky and demanding a * before a restrict.
|
||||
*/
|
||||
static inline void
|
||||
pq_writeint8(StringInfoData * restrict buf, int8 i)
|
||||
pq_writeint8(StringInfoData *pg_restrict buf, int8 i)
|
||||
{
|
||||
int8 ni = i;
|
||||
|
||||
Assert(buf->len + sizeof(i) <= buf->maxlen);
|
||||
memcpy((char *restrict) (buf->data + buf->len), &ni, sizeof(ni));
|
||||
memcpy((char *pg_restrict) (buf->data + buf->len), &ni, sizeof(ni));
|
||||
buf->len += sizeof(i);
|
||||
}
|
||||
|
||||
@ -61,12 +61,12 @@ pq_writeint8(StringInfoData * restrict buf, int8 i)
|
||||
* preallocated.
|
||||
*/
|
||||
static inline void
|
||||
pq_writeint16(StringInfoData * restrict buf, int16 i)
|
||||
pq_writeint16(StringInfoData *pg_restrict buf, int16 i)
|
||||
{
|
||||
int16 ni = pg_hton16(i);
|
||||
|
||||
Assert(buf->len + sizeof(ni) <= buf->maxlen);
|
||||
memcpy((char *restrict) (buf->data + buf->len), &ni, sizeof(i));
|
||||
memcpy((char *pg_restrict) (buf->data + buf->len), &ni, sizeof(i));
|
||||
buf->len += sizeof(i);
|
||||
}
|
||||
|
||||
@ -75,12 +75,12 @@ pq_writeint16(StringInfoData * restrict buf, int16 i)
|
||||
* preallocated.
|
||||
*/
|
||||
static inline void
|
||||
pq_writeint32(StringInfoData * restrict buf, int32 i)
|
||||
pq_writeint32(StringInfoData *pg_restrict buf, int32 i)
|
||||
{
|
||||
int32 ni = pg_hton32(i);
|
||||
|
||||
Assert(buf->len + sizeof(i) <= buf->maxlen);
|
||||
memcpy((char *restrict) (buf->data + buf->len), &ni, sizeof(i));
|
||||
memcpy((char *pg_restrict) (buf->data + buf->len), &ni, sizeof(i));
|
||||
buf->len += sizeof(i);
|
||||
}
|
||||
|
||||
@ -89,12 +89,12 @@ pq_writeint32(StringInfoData * restrict buf, int32 i)
|
||||
* preallocated.
|
||||
*/
|
||||
static inline void
|
||||
pq_writeint64(StringInfoData * restrict buf, int64 i)
|
||||
pq_writeint64(StringInfoData *pg_restrict buf, int64 i)
|
||||
{
|
||||
int64 ni = pg_hton64(i);
|
||||
|
||||
Assert(buf->len + sizeof(i) <= buf->maxlen);
|
||||
memcpy((char *restrict) (buf->data + buf->len), &ni, sizeof(i));
|
||||
memcpy((char *pg_restrict) (buf->data + buf->len), &ni, sizeof(i));
|
||||
buf->len += sizeof(i);
|
||||
}
|
||||
|
||||
@ -109,7 +109,7 @@ pq_writeint64(StringInfoData * restrict buf, int64 i)
|
||||
* sent to the frontend.
|
||||
*/
|
||||
static inline void
|
||||
pq_writestring(StringInfoData * restrict buf, const char *restrict str)
|
||||
pq_writestring(StringInfoData *pg_restrict buf, const char *pg_restrict str)
|
||||
{
|
||||
int slen = strlen(str);
|
||||
char *p;
|
||||
@ -120,7 +120,7 @@ pq_writestring(StringInfoData * restrict buf, const char *restrict str)
|
||||
|
||||
Assert(buf->len + slen + 1 <= buf->maxlen);
|
||||
|
||||
memcpy(((char *restrict) buf->data + buf->len), p, slen + 1);
|
||||
memcpy(((char *pg_restrict) buf->data + buf->len), p, slen + 1);
|
||||
buf->len += slen + 1;
|
||||
|
||||
if (p != str)
|
||||
|
@ -923,6 +923,10 @@
|
||||
if such a type exists, and if the system does not define it. */
|
||||
#undef intptr_t
|
||||
|
||||
/* Define to keyword to use for C99 restrict support, or to nothing if not
|
||||
supported */
|
||||
#undef pg_restrict
|
||||
|
||||
/* Define to the equivalent of the C99 'restrict' keyword, or to
|
||||
nothing if this is not supported. Do not define if restrict is
|
||||
supported directly. */
|
||||
|
@ -681,21 +681,19 @@
|
||||
#define inline __inline
|
||||
#endif
|
||||
|
||||
/* Define to keyword to use for C99 restrict support, or to nothing if this is
|
||||
not supported */
|
||||
/* Works for C and C++ in Visual Studio 2008 and upwards */
|
||||
#if (_MSC_VER >= 1500)
|
||||
#define pg_restrict __restrict
|
||||
#else
|
||||
#define pg_restrict
|
||||
#endif
|
||||
|
||||
/* Define to the equivalent of the C99 'restrict' keyword, or to
|
||||
nothing if this is not supported. Do not define if restrict is
|
||||
supported directly. */
|
||||
/* Visual Studio 2008 and upwards */
|
||||
#if (_MSC_VER >= 1500)
|
||||
/* works for C and C++ in msvc */
|
||||
/*
|
||||
* Temporary attempt at a workaround for stdlib.h's use of
|
||||
* declspec(restrict), conflicting with below define.
|
||||
*/
|
||||
#include <stdlib.h>
|
||||
#define restrict __restrict
|
||||
#else
|
||||
#define restrict
|
||||
#endif
|
||||
/* not defined, because it'd conflict with __declspec(restrict) */
|
||||
|
||||
/* Define to empty if the C compiler does not understand signed types. */
|
||||
/* #undef signed */
|
||||
|
Reference in New Issue
Block a user