blob: 5778753a6520da063df4644da50a92c0c403fa1d [file] [log] [blame]
bart8f822af2009-06-08 18:20:42 +00001/** @brief Unit-test for DRD's bitmap implementation. */
2
3
bart34eff982008-05-01 13:50:20 +00004#include <assert.h>
bartf28b7d12008-05-01 15:00:16 +00005#include <stdio.h>
bart34eff982008-05-01 13:50:20 +00006#include <stdlib.h>
7#include <string.h>
bartfb088fd2008-05-04 07:47:21 +00008#include <unistd.h>
philippe6643e962012-01-17 21:16:30 +00009
10#include "coregrind/m_xarray.c"
11#include "coregrind/m_poolalloc.c"
bart34eff982008-05-01 13:50:20 +000012#include "coregrind/m_oset.c"
bartccf17de2008-07-04 15:14:35 +000013#include "drd/drd_bitmap.c"
14#include "drd/pub_drd_bitmap.h"
bart34eff982008-05-01 13:50:20 +000015
16
bart7b706b32009-05-10 06:55:39 +000017#ifndef MIN
18#define MIN(x, y) ((x) < (y) ? (x) : (y))
19#endif
20#ifndef MAX
21#define MAX(x, y) ((x) > (y) ? (x) : (y))
22#endif
23
24
bart8f822af2009-06-08 18:20:42 +000025/* Replacements for Valgrind core functionality. */
bart34eff982008-05-01 13:50:20 +000026
florian54fe2022012-10-27 23:07:42 +000027void* VG_(malloc)(const HChar* cc, SizeT nbytes)
bart34eff982008-05-01 13:50:20 +000028{ return malloc(nbytes); }
29void VG_(free)(void* p)
30{ return free(p); }
florian567f72e2012-10-14 02:58:42 +000031void VG_(assert_fail)(Bool isCore, const HChar* assertion, const HChar* file,
32 Int line, const HChar* function, const HChar* format,
barta9eba352008-05-10 05:49:58 +000033 ...)
34{
35 fprintf(stderr,
36 "%s:%u: %s%sAssertion `%s' failed.\n",
37 file,
38 line,
39 function ? (char*)function : "",
40 function ? ": " : "",
41 assertion);
bart7b706b32009-05-10 06:55:39 +000042 fflush(stdout);
barta9eba352008-05-10 05:49:58 +000043 fflush(stderr);
44 abort();
sewardj8be88602008-05-06 23:01:05 +000045}
46
Elliott Hughesed398002017-06-21 14:41:24 -070047Int VG_(strcmp)( const HChar* s1, const HChar* s2 )
48{ return strcmp(s1, s2); }
bart34eff982008-05-01 13:50:20 +000049void* VG_(memset)(void *s, Int c, SizeT sz)
50{ return memset(s, c, sz); }
51void* VG_(memcpy)(void *d, const void *s, SizeT sz)
52{ return memcpy(d, s, sz); }
sewardj291849f2012-04-20 23:58:55 +000053void* VG_(memmove)(void *d, const void *s, SizeT sz)
54{ return memmove(d, s, sz); }
bart34eff982008-05-01 13:50:20 +000055Int VG_(memcmp)(const void* s1, const void* s2, SizeT n)
56{ return memcmp(s1, s2, n); }
57UInt VG_(printf)(const HChar *format, ...)
58{ UInt ret; va_list vargs; va_start(vargs, format); ret = vprintf(format, vargs); va_end(vargs); return ret; }
bartfb088fd2008-05-04 07:47:21 +000059UInt VG_(message)(VgMsgKind kind, const HChar* format, ...)
60{ UInt ret; va_list vargs; va_start(vargs, format); ret = vprintf(format, vargs); va_end(vargs); printf("\n"); return ret; }
bart1335ecc2009-02-14 16:10:53 +000061Bool DRD_(is_suppressed)(const Addr a1, const Addr a2)
bart34eff982008-05-01 13:50:20 +000062{ assert(0); }
philippe6643e962012-01-17 21:16:30 +000063void VG_(vcbprintf)(void(*char_sink)(HChar, void* opaque),
64 void* opaque,
65 const HChar* format, va_list vargs)
66{ assert(0); }
67void VG_(ssort)( void* base, SizeT nmemb, SizeT size,
florian6bd9dc12012-11-23 16:17:43 +000068 Int (*compar)(const void*, const void*) )
philippe6643e962012-01-17 21:16:30 +000069{ assert(0); }
bart34eff982008-05-01 13:50:20 +000070
bartfb088fd2008-05-04 07:47:21 +000071/* Actual unit test */
72
73static int s_verbose = 1;
74
bart34eff982008-05-01 13:50:20 +000075static
76struct { Addr address; SizeT size; BmAccessTypeT access_type; }
bartfb088fd2008-05-04 07:47:21 +000077 s_test1_args[] = {
barta3003982010-09-08 16:29:17 +000078 { 0, 0, eLoad },
bartfb088fd2008-05-04 07:47:21 +000079 { 0, 1, eLoad },
80 { 666, 4, eLoad },
81 { 667, 2, eStore },
82 { 1024, 1, eStore },
83 { 0xffffULL, 1, eStore },
84 { 0x0001ffffULL, 1, eLoad },
85 { 0x00ffffffULL, 1, eLoad },
bart7b706b32009-05-10 06:55:39 +000086 { 0xffffffffULL - (((1 << ADDR_LSB_BITS) + 1) << ADDR_IGNORED_BITS),
87 1, eStore },
carllcae0cc22014-08-07 23:17:29 +000088#if defined(VGP_amd64_linux) || defined(VGP_ppc64be_linux) \
89 || defined(VGP_ppc64le_linux)
bart7b706b32009-05-10 06:55:39 +000090 { 0xffffffffULL - (1 << ADDR_LSB_BITS << ADDR_IGNORED_BITS),
91 1, eStore },
bartfb088fd2008-05-04 07:47:21 +000092 { 0xffffffffULL, 1, eStore },
93 { 0x100000000ULL, 1, eStore },
bart7b706b32009-05-10 06:55:39 +000094 { -2ULL - (1 << ADDR_LSB_BITS << ADDR_IGNORED_BITS),
95 1, eStore },
bartfb088fd2008-05-04 07:47:21 +000096#endif
bart34eff982008-05-01 13:50:20 +000097 };
98
bartc67d1532009-04-23 15:39:46 +000099/**
100 * Compare two bitmaps and if different, print the differences.
101 */
102int bm_equal_print_diffs(struct bitmap* bm1, struct bitmap* bm2)
103{
104 int equal;
105
106 equal = DRD_(bm_equal)(bm1, bm2);
bart0605e5a2009-05-03 18:07:07 +0000107 if (s_verbose && ! equal)
bartc67d1532009-04-23 15:39:46 +0000108 {
bart7b706b32009-05-10 06:55:39 +0000109 unsigned i;
110
bartc67d1532009-04-23 15:39:46 +0000111 VG_(printf)("Bitmaps are different.\n");
bart7b706b32009-05-10 06:55:39 +0000112 for (i = 0; i < 0x10000; i++)
113 {
114 if (DRD_(bm_has_1)(bm1, i, eLoad) != DRD_(bm_has_1)(bm2, i, eLoad)
115 || DRD_(bm_has_1)(bm1, i, eStore) != DRD_(bm_has_1)(bm2, i, eStore))
116 {
117 printf("0x%x %c %c %c %c\n",
118 i,
119 DRD_(bm_has_1)(bm1, i, eLoad) ? 'R' : ' ',
120 DRD_(bm_has_1)(bm1, i, eStore) ? 'W' : ' ',
121 DRD_(bm_has_1)(bm2, i, eLoad) ? 'R' : ' ',
122 DRD_(bm_has_1)(bm2, i, eStore) ? 'W' : ' '
123 );
124 }
125 }
126 fflush(stdout);
bartc67d1532009-04-23 15:39:46 +0000127 }
128
129 return equal;
130}
131
bartfb088fd2008-05-04 07:47:21 +0000132void bm_test1(void)
bart34eff982008-05-01 13:50:20 +0000133{
134 struct bitmap* bm;
135 struct bitmap* bm2;
136 unsigned i, j;
137
bart39934d62009-02-15 16:18:03 +0000138 bm = DRD_(bm_new)();
bart34eff982008-05-01 13:50:20 +0000139
bartfb088fd2008-05-04 07:47:21 +0000140 for (i = 0; i < sizeof(s_test1_args)/sizeof(s_test1_args[0]); i++)
bart34eff982008-05-01 13:50:20 +0000141 {
bart39934d62009-02-15 16:18:03 +0000142 DRD_(bm_access_range)(bm,
143 s_test1_args[i].address,
144 s_test1_args[i].address + s_test1_args[i].size,
145 s_test1_args[i].access_type);
bart34eff982008-05-01 13:50:20 +0000146 }
147
bartfb088fd2008-05-04 07:47:21 +0000148 for (i = 0; i < sizeof(s_test1_args)/sizeof(s_test1_args[0]); i++)
149 {
bart7b706b32009-05-10 06:55:39 +0000150 for (j = 0;
151 first_address_with_higher_lsb(j) <= s_test1_args[i].size;
152 j = first_address_with_higher_lsb(j))
bart34eff982008-05-01 13:50:20 +0000153 {
bart39934d62009-02-15 16:18:03 +0000154 tl_assert(DRD_(bm_has_1)(bm,
155 s_test1_args[i].address + j,
156 s_test1_args[i].access_type));
bart34eff982008-05-01 13:50:20 +0000157 }
158 }
159
bart39934d62009-02-15 16:18:03 +0000160 bm2 = DRD_(bm_new)();
161 DRD_(bm_merge2)(bm2, bm);
162 DRD_(bm_merge2)(bm2, bm);
bartc67d1532009-04-23 15:39:46 +0000163 assert(bm_equal_print_diffs(bm2, bm));
bart34eff982008-05-01 13:50:20 +0000164
bartfb088fd2008-05-04 07:47:21 +0000165 if (s_verbose)
166 VG_(printf)("Deleting bitmap bm\n");
bart39934d62009-02-15 16:18:03 +0000167 DRD_(bm_delete)(bm);
bartfb088fd2008-05-04 07:47:21 +0000168 if (s_verbose)
169 VG_(printf)("Deleting bitmap bm2\n");
bart39934d62009-02-15 16:18:03 +0000170 DRD_(bm_delete)(bm2);
bartfb088fd2008-05-04 07:47:21 +0000171}
bart34eff982008-05-01 13:50:20 +0000172
bart214493b2008-05-10 08:21:07 +0000173/** Test whether bm_equal() works correctly. */
bartfb088fd2008-05-04 07:47:21 +0000174void bm_test2()
175{
176 struct bitmap* bm1;
177 struct bitmap* bm2;
178
bart39934d62009-02-15 16:18:03 +0000179 bm1 = DRD_(bm_new)();
180 bm2 = DRD_(bm_new)();
181 DRD_(bm_access_load_1)(bm1, 7);
bart7b706b32009-05-10 06:55:39 +0000182 DRD_(bm_access_load_1)(bm2, make_address(1, 0) + 7);
bart39934d62009-02-15 16:18:03 +0000183 assert(! DRD_(bm_equal)(bm1, bm2));
184 assert(! DRD_(bm_equal)(bm2, bm1));
185 DRD_(bm_access_load_1)(bm2, 7);
186 assert(! DRD_(bm_equal)(bm1, bm2));
187 assert(! DRD_(bm_equal)(bm2, bm1));
bart7b706b32009-05-10 06:55:39 +0000188 DRD_(bm_access_store_1)(bm1, make_address(1, 0) + 7);
bart39934d62009-02-15 16:18:03 +0000189 assert(! DRD_(bm_equal)(bm1, bm2));
190 assert(! DRD_(bm_equal)(bm2, bm1));
191 DRD_(bm_delete)(bm2);
192 DRD_(bm_delete)(bm1);
bart214493b2008-05-10 08:21:07 +0000193}
194
195/** Torture test of the functions that set or clear a range of bits. */
bart2dbdbab2008-05-13 16:17:05 +0000196void bm_test3(const int outer_loop_step, const int inner_loop_step)
bart214493b2008-05-10 08:21:07 +0000197{
198 unsigned i, j;
199 struct bitmap* bm1;
200 struct bitmap* bm2;
201
bart7b706b32009-05-10 06:55:39 +0000202 const Addr lb = make_address(2, 0) - 2 * BITS_PER_UWORD;
203 const Addr ub = make_address(2, 0) + 2 * BITS_PER_UWORD;
bart0605e5a2009-05-03 18:07:07 +0000204
bart2dbdbab2008-05-13 16:17:05 +0000205 assert(outer_loop_step >= 1);
bart7b706b32009-05-10 06:55:39 +0000206 assert((outer_loop_step % ADDR_GRANULARITY) == 0);
bart2dbdbab2008-05-13 16:17:05 +0000207 assert(inner_loop_step >= 1);
bart7b706b32009-05-10 06:55:39 +0000208 assert((inner_loop_step % ADDR_GRANULARITY) == 0);
bart2dbdbab2008-05-13 16:17:05 +0000209
bart39934d62009-02-15 16:18:03 +0000210 bm1 = DRD_(bm_new)();
211 bm2 = DRD_(bm_new)();
bart0605e5a2009-05-03 18:07:07 +0000212 for (i = lb; i < ub; i += outer_loop_step)
bart214493b2008-05-10 08:21:07 +0000213 {
bart7b706b32009-05-10 06:55:39 +0000214 for (j = i + ADDR_GRANULARITY; j < ub; j += inner_loop_step)
bart214493b2008-05-10 08:21:07 +0000215 {
bart39934d62009-02-15 16:18:03 +0000216 DRD_(bm_access_range_load)(bm1, i, j);
217 DRD_(bm_clear_load)(bm1, i, j);
bartc67d1532009-04-23 15:39:46 +0000218 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000219 DRD_(bm_access_load_1)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000220 DRD_(bm_clear_load)(bm1, i, i + MAX(1, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000221 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000222 DRD_(bm_access_load_2)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000223 DRD_(bm_clear_load)(bm1, i, i + MAX(2, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000224 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000225 DRD_(bm_access_load_4)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000226 DRD_(bm_clear_load)(bm1, i, i + MAX(4, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000227 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000228 DRD_(bm_access_load_8)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000229 DRD_(bm_clear_load)(bm1, i, i + MAX(8, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000230 assert(bm_equal_print_diffs(bm1, bm2));
231
bart39934d62009-02-15 16:18:03 +0000232 DRD_(bm_access_range_store)(bm1, i, j);
233 DRD_(bm_clear_store)(bm1, i, j);
bartc67d1532009-04-23 15:39:46 +0000234 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000235 DRD_(bm_access_store_1)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000236 DRD_(bm_clear_store)(bm1, i, i + MAX(1, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000237 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000238 DRD_(bm_access_store_2)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000239 DRD_(bm_clear_store)(bm1, i, i + MAX(2, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000240 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000241 DRD_(bm_access_store_4)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000242 DRD_(bm_clear_store)(bm1, i, i + MAX(4, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000243 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000244 DRD_(bm_access_store_8)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000245 DRD_(bm_clear_store)(bm1, i, i + MAX(8, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000246 assert(bm_equal_print_diffs(bm1, bm2));
247
248 DRD_(bm_access_range_load)(bm1, i, j);
249 DRD_(bm_access_range_store)(bm1, i, j);
250 DRD_(bm_clear)(bm1, i, j);
251 assert(bm_equal_print_diffs(bm1, bm2));
252 DRD_(bm_access_load_1)(bm1, i);
253 DRD_(bm_access_store_1)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000254 DRD_(bm_clear)(bm1, i, i + MAX(1, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000255 assert(bm_equal_print_diffs(bm1, bm2));
256 DRD_(bm_access_load_2)(bm1, i);
257 DRD_(bm_access_store_2)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000258 DRD_(bm_clear)(bm1, i, i + MAX(2, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000259 assert(bm_equal_print_diffs(bm1, bm2));
260 DRD_(bm_access_load_4)(bm1, i);
261 DRD_(bm_access_store_4)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000262 DRD_(bm_clear)(bm1, i, i + MAX(4, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000263 assert(bm_equal_print_diffs(bm1, bm2));
264 DRD_(bm_access_load_8)(bm1, i);
265 DRD_(bm_access_store_8)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000266 DRD_(bm_clear)(bm1, i, i + MAX(8, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000267 assert(bm_equal_print_diffs(bm1, bm2));
bart214493b2008-05-10 08:21:07 +0000268 }
269 }
bart7b706b32009-05-10 06:55:39 +0000270 DRD_(bm_access_range_load)(bm1, 0, make_address(2, 0) + 2 * BITS_PER_UWORD);
271 DRD_(bm_access_range_store)(bm1, 0, make_address(2, 0) + 2 * BITS_PER_UWORD);
272 DRD_(bm_access_range_load)(bm2, 0, make_address(2, 0) + 2 * BITS_PER_UWORD);
273 DRD_(bm_access_range_store)(bm2, 0, make_address(2, 0) + 2 * BITS_PER_UWORD);
274 for (i = make_address(1, 0) - 2 * BITS_PER_UWORD;
275 i < make_address(1, 0) + 2 * BITS_PER_UWORD;
bart2dbdbab2008-05-13 16:17:05 +0000276 i += outer_loop_step)
bart214493b2008-05-10 08:21:07 +0000277 {
bart0605e5a2009-05-03 18:07:07 +0000278 for (j = i + 1; j < ub; j += inner_loop_step)
bart214493b2008-05-10 08:21:07 +0000279 {
bart39934d62009-02-15 16:18:03 +0000280 DRD_(bm_clear_load)(bm1, i, j);
281 DRD_(bm_access_range_load)(bm1, i, j);
bartc67d1532009-04-23 15:39:46 +0000282 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000283 DRD_(bm_clear_load)(bm1, i, i+1);
284 DRD_(bm_access_load_1)(bm1, i);
bartc67d1532009-04-23 15:39:46 +0000285 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000286 DRD_(bm_clear_load)(bm1, i, i+2);
287 DRD_(bm_access_load_2)(bm1, i);
bartc67d1532009-04-23 15:39:46 +0000288 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000289 DRD_(bm_clear_load)(bm1, i, i+4);
290 DRD_(bm_access_load_4)(bm1, i);
bartc67d1532009-04-23 15:39:46 +0000291 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000292 DRD_(bm_clear_load)(bm1, i, i+8);
293 DRD_(bm_access_load_8)(bm1, i);
bartc67d1532009-04-23 15:39:46 +0000294 assert(bm_equal_print_diffs(bm1, bm2));
bart0605e5a2009-05-03 18:07:07 +0000295
bart39934d62009-02-15 16:18:03 +0000296 DRD_(bm_clear_store)(bm1, i, j);
297 DRD_(bm_access_range_store)(bm1, i, j);
bartc67d1532009-04-23 15:39:46 +0000298 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000299 DRD_(bm_clear_store)(bm1, i, i+1);
300 DRD_(bm_access_store_1)(bm1, i);
bartc67d1532009-04-23 15:39:46 +0000301 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000302 DRD_(bm_clear_store)(bm1, i, i+2);
303 DRD_(bm_access_store_2)(bm1, i);
bartc67d1532009-04-23 15:39:46 +0000304 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000305 DRD_(bm_clear_store)(bm1, i, i+4);
306 DRD_(bm_access_store_4)(bm1, i);
bartc67d1532009-04-23 15:39:46 +0000307 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000308 DRD_(bm_clear_store)(bm1, i, i+8);
309 DRD_(bm_access_store_8)(bm1, i);
bartc67d1532009-04-23 15:39:46 +0000310 assert(bm_equal_print_diffs(bm1, bm2));
bart0605e5a2009-05-03 18:07:07 +0000311
312 DRD_(bm_clear)(bm1, i, j);
313 DRD_(bm_access_range_load)(bm1, i, j);
314 DRD_(bm_access_range_store)(bm1, i, j);
315 assert(bm_equal_print_diffs(bm1, bm2));
bart214493b2008-05-10 08:21:07 +0000316 }
317 }
bart39934d62009-02-15 16:18:03 +0000318 DRD_(bm_delete)(bm2);
319 DRD_(bm_delete)(bm1);
bart34eff982008-05-01 13:50:20 +0000320}
321
322int main(int argc, char** argv)
323{
bart7b706b32009-05-10 06:55:39 +0000324 int outer_loop_step = ADDR_GRANULARITY;
325 int inner_loop_step = ADDR_GRANULARITY;
bartfb088fd2008-05-04 07:47:21 +0000326 int optchar;
327
bart2dbdbab2008-05-13 16:17:05 +0000328 while ((optchar = getopt(argc, argv, "s:t:q")) != EOF)
bartfb088fd2008-05-04 07:47:21 +0000329 {
330 switch (optchar)
331 {
bart2dbdbab2008-05-13 16:17:05 +0000332 case 's':
333 outer_loop_step = atoi(optarg);
334 break;
335 case 't':
336 inner_loop_step = atoi(optarg);
337 break;
bartfb088fd2008-05-04 07:47:21 +0000338 case 'q':
339 s_verbose = 0;
340 break;
341 default:
bart2dbdbab2008-05-13 16:17:05 +0000342 fprintf(stderr,
343 "Usage: %s [-s<outer_loop_step>] [-t<inner_loop_step>] [-q].\n",
344 argv[0]);
bartfb088fd2008-05-04 07:47:21 +0000345 break;
346 }
347 }
348
bart8f822af2009-06-08 18:20:42 +0000349 fprintf(stderr, "Start of DRD BM unit test.\n");
bartfb088fd2008-05-04 07:47:21 +0000350
barte44bccc2012-01-18 09:46:57 +0000351 DRD_(bm_module_init)();
bartfb088fd2008-05-04 07:47:21 +0000352 bm_test1();
353 bm_test2();
bart2dbdbab2008-05-13 16:17:05 +0000354 bm_test3(outer_loop_step, inner_loop_step);
barte44bccc2012-01-18 09:46:57 +0000355 DRD_(bm_module_cleanup)();
bartfb088fd2008-05-04 07:47:21 +0000356
bart8f822af2009-06-08 18:20:42 +0000357 fprintf(stderr, "End of DRD BM unit test.\n");
bartfb088fd2008-05-04 07:47:21 +0000358
bart34eff982008-05-01 13:50:20 +0000359 return 0;
360}