1 
2 #define IN_FRAMEWORK
3 
4 #ifdef VFP
5 #define D0	0
6 #define D1	8
7 #define D2	16
8 #define D3	24
9 #define D4	32
10 #define D5	40
11 #define D6	48
12 #define D7	56
13 
14 #ifdef NEON
15 #define Q0      D0
16 #define Q1      D2
17 #define Q2      D4
18 #define Q3      D6
19 #endif
20 
21 #define S0	64
22 #define S1	68
23 #define S2	72
24 #define S3	76
25 #define S4	80
26 #define S5	84
27 #define S6	88
28 #define S7	92
29 #define S8      86
30 #define S9	100
31 #define S10	104
32 #define S11	108
33 #define S12	112
34 #define S13	116
35 #define S14	120
36 #define S15	124
37 
38 #define CORE_REG_START 128
39 #else
40 #define CORE_REG_START 0
41 #endif
42 
43 #define R0	CORE_REG_START
44 #define R1	(R0 + 4)
45 #define R2	(R1 + 4)
46 #define R3	(R2 + 4)
47 #define STACK	(R3 + 4)
48 
49 
50 
51 extern void abort (void);
52 extern int memcmp (const void *s1, const void *s2, __SIZE_TYPE__ n);
53 
54 __attribute__((naked))  void dumpregs () __asm("myfunc");
dumpregs()55 __attribute__((naked))  void dumpregs ()
56 {
57   asm(
58       "mov	ip, sp\n\t"
59       "stmfd	sp!, {r0-r3}\n\t"
60 #ifdef VFP
61       "fstmdbs	sp!, {s0-s15}\n\t"
62       "fstmdbd	sp!, {d0-d7}\n\t"
63 #endif
64       "mov	r0, sp\n\t"
65       "stmfd	sp!, {ip, r14}\n\t"
66       "bl	testfunc\n\t"
67       "ldmfd	sp!, {r0, r14}\n\t"
68       "mov	sp, r0\n\t"
69       "bx	lr");
70 }
71 
72 
73 #define LAST_ARG(type,val,offset) { type __x = val; if (memcmp(&__x, stack+offset, sizeof(type)) != 0) abort(); }
74 #define ARG(type,val,offset) LAST_ARG(type, val, offset)
75 #define ANON(type,val,offset) LAST_ARG(type, val, offset)
76 #define LAST_ANON(type,val,offset) LAST_ARG(type, val, offset)
77 #define DOTS
78 
testfunc(char * stack)79 void testfunc(char* stack)
80 {
81 #include TESTFILE
82   return;
83 }
84 
85 #undef LAST_ARG
86 #undef ARG
87 #undef DOTS
88 #undef ANON
89 #undef LAST_ANON
90 #define LAST_ARG(type,val,offset) type
91 #define ARG(type,val,offset) LAST_ARG(type, val, offset),
92 #define DOTS ...
93 #define ANON(type,val, offset)
94 #define LAST_ANON(type,val, offset)
95 
96 #ifndef MYFUNCTYPE
97 #define MYFUNCTYPE void
98 #endif
99 
100 #ifndef PCSATTR
101 #define PCSATTR
102 #endif
103 
104 MYFUNCTYPE myfunc(
105 #include TESTFILE
106 ) PCSATTR;
107 
108 #undef LAST_ARG
109 #undef ARG
110 #undef DOTS
111 #undef ANON
112 #undef LAST_ANON
113 #define LAST_ARG(type,val,offset) val
114 #define ARG(type,val,offset) LAST_ARG(type, val, offset),
115 #define DOTS
116 #define LAST_ANON(type,val,offset) LAST_ARG(type, val, offset)
117 #define ANON(type,val,offset) LAST_ARG(type, val, offset),
118 
119 
main()120 int main()
121 {
122   myfunc(
123 #include TESTFILE
124 );
125   return 0;
126 }
127