earle@SUN.COM (Greg Earle) (12/21/88)
Description:
The following file, which is condensed from X V11 R3's lib/X/Xlibint.h and
lib/X/XBackgnd.c (combination, and then removal of extraneous noise), shows
that when compiled with `-ansi -pedantic', gcc-cpp produces macro expansions
that are different (and cause gcc-cc1 to gag) from when `-traditional' is
invoked. To be more to the point, there are two macros, SIZEOF(x) and
GetReqExtra(name, n, req), that are the cause. GetReqExtra calls SIZEOF;
both are conditionally compiled for dpANS C or traditional K&R C. When
using `-ansi -pedantic', the `#if defined(__STDC__)' conditional code is
compiled. Inside `GetReqExtra', a macro, is a line that uses the
SIZEOF macro call, with an argument of `SIZEOF(*req)'. This macro is the
one that, when expanded under `-ansi', doesn't match the same macro expansion
using `-traditional'. As mentioned, this later causes gc-cc1 to complain
vociferously about the resultant code ...
Repeat-By:
% gcc -v -E -fstrength-reduce -finline-functions -fcombine-regs \
-ansi -pedantic dummy.c > dummy.ansi.i
% gcc -v -E -fstrength-reduce -finline-functions -fcombine-regs \
-traditional dummy.c > dummy.trad.i
% diff -c dummy.trad.i dummy.ansi.i | more
[ Note the differences, and incorrect `dummy.ansi.i' output ... ]
[ I assume the `-fmumble' switches are irrelevant for this stage, ]
[ but I heisted them from the makefile line ... ]
Can someone tell me if this is a gcc bug (gcc CPP, actually), or are the X
people's assumptions about string concatenation macros under dpANS C incorrect
(i.e., their 2 macro definitions are incorrect, when used with __STDC__ set) ??
Note that in the original X library code (lib/X/Xlibint.h), there are 2 other
macros, GetReq and GetResReq, which are almost identical, but neither of
them uses a pointer indirection (`SIZEOF(*req)') in the call to SIZEOF; I
^^^^
||||
got no compiler complaints from either of those macros being used/referenced.
Only the `*' inside the inner expansion seems to have caused havoc ...
Thanks in advance,
- Greg Earle
Sun Los Angeles Consulting
earle@Sun.COM
poseur!earle@elroy.JPL.NASA.GOV
------------------ >8 Cut here - dummy.c - Cut here 8< -----------------
/* $XConsortium: XBackgnd.c,v 11.7 88/09/06 16:04:08 jim Exp $ */
/* Copyright Massachusetts Institute of Technology 1986 */
#define SyncHandle() \
if (dpy->synchandler) (*dpy->synchandler)(dpy)
/* a little bit of magic */
#define OneDataCard32(dpy,dstaddr,srcvar) \
{ dpy->bufptr -= 4; Data32 (dpy, (char *) &(srcvar), 4); }
/*
* Definition of macro used to set constants for size of network structures;
* machines with preprocessors that can't handle all of the sz_ symbols
* can define this macro to be sizeof(x) if and only if their compiler doesn't
* pad out structures (esp. the xTextElt structure which contains only two
* one-byte fields). Network structures should always define sz_symbols.
*
* The sz_ prefix is used instead of something more descriptive so that the
* symbols are no more than 32 characters long (which causes problems for some
* compilers and preprocessors).
*/
#if defined(__STDC__) && !defined(UNIXCPP)
#define SIZEOF(x) sz_##x
#else
#define SIZEOF(x) sz_/**/x
#endif /* if ANSI C compiler else not */
/* GetReqExtra is the same as GetReq, but allocates "n" additional
bytes after the request. "n" must be a multiple of 4! */
#define WORD64ALIGN
#if defined(__STDC__) && !defined(UNIXCPP)
#define GetReqExtra(name, n, req) \
WORD64ALIGN\
if ((dpy->bufptr + SIZEOF(*req) + n) > dpy->bufmax)\
_XFlush(dpy);\
req = (x##name##Req *)(dpy->last_req = dpy->bufptr);\
req->reqType = X_##name;\
req->length = (SIZEOF(*req) + n)>>2;\
dpy->bufptr += SIZEOF(*req) + n;\
dpy->request++
#else
#define GetReqExtra(name, n, req) \
WORD64ALIGN\
if ((dpy->bufptr + SIZEOF(x/**/name/**/Req) + n) > dpy->bufmax)\
_XFlush(dpy);\
req = (x/**/name/**/Req *)(dpy->last_req = dpy->bufptr);\
req->reqType = X_/**/name;\
req->length = (SIZEOF(x/**/name/**/Req) + n)>>2;\
dpy->bufptr += SIZEOF(x/**/name/**/Req) + n;\
dpy->request++
#endif
XSetWindowBackground(dpy, w, pixel)
register Display *dpy;
Window w;
unsigned long pixel;
{
register xChangeWindowAttributesReq *req;
LockDisplay(dpy);
GetReqExtra (ChangeWindowAttributes, 4, req);
req->window = w;
req->valueMask = CWBackPixel;
OneDataCard32 (dpy, NEXTPTR(req,xChangeWindowAttributesReq), pixel);
UnlockDisplay(dpy);
SyncHandle();
}
---------------------------------------------------------------------------casey@gauss.llnl.gov (Casey Leedom) (12/22/88)
| From: tsunami!valley!poseur!earle@SUN.COM (Greg Earle) | | Can someone tell me if this is a gcc bug (gcc CPP, actually), or are the X | people's assumptions about string concatenation macros under dpANS C | incorrect (i.e., their 2 macro definitions are incorrect, when used with | __STDC__ set)?? You should be following comp.windows.x (yes, I know, almost impossible given its volume). In any case, I've already posted a fix to X.V11R3 for this problem. The ANSI C side of the ``#ifdef __STDC__'' just wasn't correct. Just copy the code from the K&R side of the ifdef and replace occurrences of "/**/" with "##". Casey