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

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