OLD | NEW |
---|---|
(Empty) | |
1 //===- subzero/crosstest/test_calling_conv_main.cpp - Driver for tests ----===// | |
2 // | |
3 // The Subzero Code Generator | |
4 // | |
5 // This file is distributed under the University of Illinois Open Source | |
6 // License. See LICENSE.TXT for details. | |
7 // | |
8 //===----------------------------------------------------------------------===// | |
9 // | |
10 // Driver for cross testing the compatibility of calling conventions | |
Jim Stichnoth
2014/08/05 18:09:26
Period at end of sentence?
wala
2014/08/05 23:57:03
Done.
| |
11 // | |
12 //===----------------------------------------------------------------------===// | |
13 | |
14 /* crosstest.py --test=test_calling_conv.c \ | |
15 --driver=test_calling_conv_main.cpp --prefix=Subzero_ \ | |
16 --output=test_calling_conv */ | |
17 | |
18 #include <iostream> | |
Jim Stichnoth
2014/08/05 18:09:26
Alphabetize the includes.
wala
2014/08/05 23:57:03
Done.
| |
19 #include <sstream> | |
20 #include <cstring> | |
21 | |
22 #include "test_calling_conv.h" | |
23 | |
Jim Stichnoth
2014/08/05 18:09:26
There should be a comment here describing the big
wala
2014/08/05 23:57:03
Done.
| |
24 extern "C" { | |
25 size_t ArgNum, Subzero_ArgNum; | |
26 size_t DynAllocaSize, Subzero_DynAllocaSize; | |
27 CalleePtrTy Callee, Subzero_Callee; | |
28 char *Buf, *Subzero_Buf; | |
29 | |
30 void fakeUse(void *) {} | |
31 void Subzero_fakeUse(void *) {} | |
32 } | |
33 | |
34 const static size_t ALLOCA_SIZE = 7; | |
35 const static size_t BUF_SIZE = 16; | |
36 | |
37 std::string bufAsString(const char Buf[BUF_SIZE]) { | |
38 std::ostringstream OS; | |
39 for (size_t i = 0; i < BUF_SIZE; ++i) { | |
40 if (i > 0) | |
41 OS << " "; | |
42 OS << (unsigned) Buf[i]; | |
43 } | |
44 return OS.str(); | |
45 } | |
46 | |
47 void testCaller(size_t &TotalTests, size_t &Passes, size_t &Failures) { | |
48 static struct { | |
49 const char *CallerName, *CalleeName; | |
50 size_t Args; | |
51 void (*Caller)(void); | |
52 void (*Subzero_Caller)(void); | |
53 CalleePtrTy Callee; | |
54 } Funcs[] = { | |
55 #define X(caller, callee, argc) \ | |
56 { \ | |
57 STR(caller), STR(callee), argc, &caller, &Subzero_##caller, \ | |
58 reinterpret_cast<CalleePtrTy>(&callee), \ | |
59 } \ | |
60 , | |
61 CALLER_TEST_FUNC_TABLE | |
62 #undef X | |
63 }; | |
64 | |
65 const static size_t NumFuncs = sizeof(Funcs) / sizeof(*Funcs); | |
66 | |
67 for (size_t f = 0; f < NumFuncs; ++f) { | |
68 char BufLlc[BUF_SIZE], BufSz[BUF_SIZE]; | |
69 Callee = Subzero_Callee = Funcs[f].Callee; | |
70 DynAllocaSize = Subzero_DynAllocaSize = ALLOCA_SIZE; | |
71 | |
72 for (size_t i = 0; i < Funcs[f].Args; ++i) { | |
73 memset(BufLlc, 0xff, sizeof(BufLlc)); | |
74 memset(BufSz, 0xff, sizeof(BufSz)); | |
75 | |
76 ArgNum = Subzero_ArgNum = i; | |
77 | |
78 Buf = BufLlc; | |
79 Funcs[f].Caller(); | |
80 | |
81 Buf = BufSz; | |
82 Funcs[f].Subzero_Caller(); | |
83 | |
84 ++TotalTests; | |
85 if (!memcmp(BufLlc, BufSz, sizeof(BufLlc))) { | |
86 ++Passes; | |
87 } else { | |
88 ++Failures; | |
89 std::cout << "testCaller(Caller=" << Funcs[f].CallerName << ", "; | |
90 std::cout << "Callee=" << Funcs[f].CalleeName << ", "; | |
91 std::cout << "ArgNum=" << ArgNum << ")\n"; | |
92 std::cout << "sz =" << bufAsString(BufSz) << "\n"; | |
93 std::cout << "llc=" << bufAsString(BufLlc) << "\n"; | |
94 } | |
95 } | |
96 } | |
97 } | |
98 | |
99 void testCallee(size_t &TotalTests, size_t &Passes, size_t &Failures) { | |
100 static struct { | |
101 const char *CallerName, *CalleeName; | |
102 size_t Args; | |
103 void (*Caller)(void); | |
104 CalleePtrTy Callee, Subzero_Callee; | |
105 } Funcs[] = { | |
106 #define X(caller, callee, argc) \ | |
107 { \ | |
108 STR(caller), STR(callee), argc, &caller, \ | |
109 reinterpret_cast<CalleePtrTy>(&callee), \ | |
110 reinterpret_cast<CalleePtrTy>(&Subzero_##callee) \ | |
111 } \ | |
112 , | |
113 CALLEE_TEST_FUNC_TABLE | |
114 #undef X | |
115 }; | |
116 | |
117 const static size_t NumFuncs = sizeof(Funcs) / sizeof(*Funcs); | |
118 | |
119 for (size_t f = 0; f < NumFuncs; ++f) { | |
120 char BufLlc[BUF_SIZE], BufSz[BUF_SIZE]; | |
121 Buf = BufLlc; | |
122 Subzero_Buf = BufSz; | |
123 DynAllocaSize = Subzero_DynAllocaSize = ALLOCA_SIZE; | |
124 | |
125 for (size_t i = 0; i < Funcs[f].Args; ++i) { | |
126 memset(BufLlc, 0xff, sizeof(BufLlc)); | |
127 memset(BufSz, 0xff, sizeof(BufSz)); | |
128 | |
129 ArgNum = Subzero_ArgNum = i; | |
130 | |
131 Callee = Funcs[f].Callee; | |
132 Funcs[f].Caller(); | |
133 | |
134 Callee = Funcs[f].Subzero_Callee; | |
135 Funcs[f].Caller(); | |
136 | |
137 ++TotalTests; | |
138 if (!memcmp(BufLlc, BufSz, sizeof(BufLlc))) { | |
139 ++Passes; | |
140 } else { | |
141 ++Failures; | |
142 std::cout << "testCallee(Caller=" << Funcs[f].CallerName << ", "; | |
143 std::cout << "Callee=" << Funcs[f].CalleeName << ", "; | |
144 std::cout << "ArgNum=" << ArgNum << ")\n"; | |
145 std::cout << "sz =" << bufAsString(BufSz) << "\n"; | |
146 std::cout << "llc=" << bufAsString(BufLlc) << "\n"; | |
147 } | |
148 } | |
149 } | |
150 } | |
151 | |
152 int main(int argc, char *argv[]) { | |
153 size_t TotalTests = 0; | |
154 size_t Passes = 0; | |
155 size_t Failures = 0; | |
156 | |
157 testCaller(TotalTests, Passes, Failures); | |
158 testCallee(TotalTests, Passes, Failures); | |
159 | |
160 std::cout << "TotalTests=" << TotalTests << " Passes=" << Passes | |
161 << " Failures=" << Failures << "\n"; | |
162 | |
163 return Failures; | |
164 } | |
OLD | NEW |