Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /MLRISC/trunk/x86/staged-allocation/test-varargs.c
ViewVC logotype

Annotation of /MLRISC/trunk/x86/staged-allocation/test-varargs.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3054 - (view) (download) (as text)

1 : mrainey 3054 #include <stdio.h>
2 :     #include <stdlib.h>
3 :     #include <stdarg.h>
4 :    
5 :     #define NEW(ty) (ty*)malloc(sizeof(ty))
6 :    
7 :     extern void varargs (void* fun, void* args, int);
8 :    
9 :     typedef struct {
10 :     void* val;
11 :     void* kind;
12 :     void* loc;
13 :     } triplet_t;
14 :    
15 :     typedef struct varargs_s {
16 :     triplet_t* hd;
17 :     struct varargs_s* tl;
18 :     } varargs_t;
19 :    
20 :     void Say (const char *fmt, ...)
21 :     __attribute__ ((format(printf, 1, 2)));
22 :    
23 :     void Say (const char *fmt, ...)
24 :     {
25 :     va_list ap;
26 :    
27 :     va_start (ap, fmt);
28 :     vfprintf (stdout, fmt, ap);
29 :     fflush (stdout);
30 :     va_end(ap);
31 :    
32 :     }
33 :    
34 :     #define N_ARGS 2
35 :     #define STK 2
36 :     #define FSTK 3
37 :    
38 :     int alignb (int n) {
39 :     n += 2;
40 :     n *= sizeof(void*);
41 :     n += 16-(n%16);
42 :     return n-(2*sizeof(void*));
43 :     }
44 :    
45 :     int main ()
46 :     {
47 :     varargs_t* args[N_ARGS];
48 :    
49 :     for(int i = 0 ; i < N_ARGS; i++)
50 :     args[i] = NEW(varargs_t);
51 :    
52 :     args[N_ARGS-1]->tl = 0;
53 :     for (int i = N_ARGS-2; i >= 0; i--)
54 :     args[i]->tl = args[i+1];
55 :    
56 :     args[0]->hd = NEW(triplet_t);
57 :     args[0]->hd->val = (void*)"arg1=%f\n";
58 :     args[0]->hd->kind = (void*)STK;
59 :     args[0]->hd->loc = (void*)(0*4);
60 :     /*
61 :     args[1]->hd = NEW(triplet_t);
62 :     args[1]->hd->val = (void*)0xdeadbeef;
63 :     args[1]->hd->kind = (void*)STK;
64 :     args[1]->hd->loc = (void*)(1*4);
65 :     */
66 :    
67 :     float f = 3.14f;
68 :     void** x = (void*)&f;
69 :     printf("%f\n",*(float*)x);
70 :    
71 :     args[1]->hd = NEW(triplet_t);
72 :     args[1]->hd->val = *x;
73 :     args[1]->hd->kind = (void*)FSTK;
74 :     args[1]->hd->loc = (void*)(1*4);
75 :    
76 :     varargs(Say, args[0], alignb(N_ARGS));
77 :    
78 :     return 0;
79 :     }

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0