| #define FOR_EACH_SCALAR(F) \ |
| F(sc, signed char) \ |
| F(uc, unsigned char) \ |
| F(ss, short) \ |
| F(us, unsigned short) \ |
| F(si, int) \ |
| F(ui, unsigned int) \ |
| F(sl, long) \ |
| F(ul, unsigned long) \ |
| F(sll, long long) \ |
| F(ull, unsigned long long) \ |
| F(f, float) \ |
| F(d, double) \ |
| F(ld, long double) \ |
| F(ptr, void *) |
| |
| #define EXTERN(SUFFIX, TYPE) extern TYPE x##SUFFIX; |
| #define STATIC(SUFFIX, TYPE) static TYPE s##SUFFIX; |
| #define COMMON(SUFFIX, TYPE) TYPE c##SUFFIX; |
| |
| #define GETADDR(SUFFIX, TYPE) \ |
| TYPE *get##SUFFIX (int which) \ |
| { \ |
| return (which == 0 ? &c##SUFFIX \ |
| : which == 1 ? &s##SUFFIX \ |
| : &x##SUFFIX); \ |
| } |
| |
| #define COPY(SUFFIX, TYPE) c##SUFFIX = s##SUFFIX; s##SUFFIX = x##SUFFIX; |
| |
| FOR_EACH_SCALAR (EXTERN) |
| FOR_EACH_SCALAR (STATIC) |
| FOR_EACH_SCALAR (COMMON) |
| |
| FOR_EACH_SCALAR (GETADDR) |
| |
| void |
| copy (void) |
| { |
| FOR_EACH_SCALAR (COPY); |
| } |
| |
| extern void foo (int); |
| |
| void |
| sibcall1 (void) |
| { |
| foo (1); |
| } |
| |
| void |
| sibcall2 (void) |
| { |
| foo (csi + ssi + xsi); |
| } |
| |
| static void |
| sibcall3 (void) |
| { |
| foo (1); |
| foo (2); |
| foo (3); |
| } |
| |
| extern void bar (void (*) (void)); |
| |
| int |
| nested (int x) |
| { |
| void sub (void) { foo (x); } |
| bar (sub); |
| bar (sibcall3); |
| return 1; |
| } |