blob: e537e6d38bde237cccf8e091aed850329c7bed2a [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
bart34eff982008-05-01 13:50:20 +000047void* VG_(memset)(void *s, Int c, SizeT sz)
48{ return memset(s, c, sz); }
49void* VG_(memcpy)(void *d, const void *s, SizeT sz)
50{ return memcpy(d, s, sz); }
sewardj291849f2012-04-20 23:58:55 +000051void* VG_(memmove)(void *d, const void *s, SizeT sz)
52{ return memmove(d, s, sz); }
bart34eff982008-05-01 13:50:20 +000053Int VG_(memcmp)(const void* s1, const void* s2, SizeT n)
54{ return memcmp(s1, s2, n); }
55UInt VG_(printf)(const HChar *format, ...)
56{ UInt ret; va_list vargs; va_start(vargs, format); ret = vprintf(format, vargs); va_end(vargs); return ret; }
bartfb088fd2008-05-04 07:47:21 +000057UInt VG_(message)(VgMsgKind kind, const HChar* format, ...)
58{ 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 +000059Bool DRD_(is_suppressed)(const Addr a1, const Addr a2)
bart34eff982008-05-01 13:50:20 +000060{ assert(0); }
philippe6643e962012-01-17 21:16:30 +000061void VG_(vcbprintf)(void(*char_sink)(HChar, void* opaque),
62 void* opaque,
63 const HChar* format, va_list vargs)
64{ assert(0); }
65void VG_(ssort)( void* base, SizeT nmemb, SizeT size,
florian6bd9dc12012-11-23 16:17:43 +000066 Int (*compar)(const void*, const void*) )
philippe6643e962012-01-17 21:16:30 +000067{ assert(0); }
bart34eff982008-05-01 13:50:20 +000068
bartfb088fd2008-05-04 07:47:21 +000069/* Actual unit test */
70
71static int s_verbose = 1;
72
bart34eff982008-05-01 13:50:20 +000073static
74struct { Addr address; SizeT size; BmAccessTypeT access_type; }
bartfb088fd2008-05-04 07:47:21 +000075 s_test1_args[] = {
barta3003982010-09-08 16:29:17 +000076 { 0, 0, eLoad },
bartfb088fd2008-05-04 07:47:21 +000077 { 0, 1, eLoad },
78 { 666, 4, eLoad },
79 { 667, 2, eStore },
80 { 1024, 1, eStore },
81 { 0xffffULL, 1, eStore },
82 { 0x0001ffffULL, 1, eLoad },
83 { 0x00ffffffULL, 1, eLoad },
bart7b706b32009-05-10 06:55:39 +000084 { 0xffffffffULL - (((1 << ADDR_LSB_BITS) + 1) << ADDR_IGNORED_BITS),
85 1, eStore },
sewardj6e9de462011-06-28 07:25:29 +000086#if defined(VGP_amd64_linux) || defined(VGP_ppc64_linux)
bart7b706b32009-05-10 06:55:39 +000087 { 0xffffffffULL - (1 << ADDR_LSB_BITS << ADDR_IGNORED_BITS),
88 1, eStore },
bartfb088fd2008-05-04 07:47:21 +000089 { 0xffffffffULL, 1, eStore },
90 { 0x100000000ULL, 1, eStore },
bart7b706b32009-05-10 06:55:39 +000091 { -2ULL - (1 << ADDR_LSB_BITS << ADDR_IGNORED_BITS),
92 1, eStore },
bartfb088fd2008-05-04 07:47:21 +000093#endif
bart34eff982008-05-01 13:50:20 +000094 };
95
bartc67d1532009-04-23 15:39:46 +000096/**
97 * Compare two bitmaps and if different, print the differences.
98 */
99int bm_equal_print_diffs(struct bitmap* bm1, struct bitmap* bm2)
100{
101 int equal;
102
103 equal = DRD_(bm_equal)(bm1, bm2);
bart0605e5a2009-05-03 18:07:07 +0000104 if (s_verbose && ! equal)
bartc67d1532009-04-23 15:39:46 +0000105 {
bart7b706b32009-05-10 06:55:39 +0000106 unsigned i;
107
bartc67d1532009-04-23 15:39:46 +0000108 VG_(printf)("Bitmaps are different.\n");
bart7b706b32009-05-10 06:55:39 +0000109 for (i = 0; i < 0x10000; i++)
110 {
111 if (DRD_(bm_has_1)(bm1, i, eLoad) != DRD_(bm_has_1)(bm2, i, eLoad)
112 || DRD_(bm_has_1)(bm1, i, eStore) != DRD_(bm_has_1)(bm2, i, eStore))
113 {
114 printf("0x%x %c %c %c %c\n",
115 i,
116 DRD_(bm_has_1)(bm1, i, eLoad) ? 'R' : ' ',
117 DRD_(bm_has_1)(bm1, i, eStore) ? 'W' : ' ',
118 DRD_(bm_has_1)(bm2, i, eLoad) ? 'R' : ' ',
119 DRD_(bm_has_1)(bm2, i, eStore) ? 'W' : ' '
120 );
121 }
122 }
123 fflush(stdout);
bartc67d1532009-04-23 15:39:46 +0000124 }
125
126 return equal;
127}
128
bartfb088fd2008-05-04 07:47:21 +0000129void bm_test1(void)
bart34eff982008-05-01 13:50:20 +0000130{
131 struct bitmap* bm;
132 struct bitmap* bm2;
133 unsigned i, j;
134
bart39934d62009-02-15 16:18:03 +0000135 bm = DRD_(bm_new)();
bart34eff982008-05-01 13:50:20 +0000136
bartfb088fd2008-05-04 07:47:21 +0000137 for (i = 0; i < sizeof(s_test1_args)/sizeof(s_test1_args[0]); i++)
bart34eff982008-05-01 13:50:20 +0000138 {
bart39934d62009-02-15 16:18:03 +0000139 DRD_(bm_access_range)(bm,
140 s_test1_args[i].address,
141 s_test1_args[i].address + s_test1_args[i].size,
142 s_test1_args[i].access_type);
bart34eff982008-05-01 13:50:20 +0000143 }
144
bartfb088fd2008-05-04 07:47:21 +0000145 for (i = 0; i < sizeof(s_test1_args)/sizeof(s_test1_args[0]); i++)
146 {
bart7b706b32009-05-10 06:55:39 +0000147 for (j = 0;
148 first_address_with_higher_lsb(j) <= s_test1_args[i].size;
149 j = first_address_with_higher_lsb(j))
bart34eff982008-05-01 13:50:20 +0000150 {
bart39934d62009-02-15 16:18:03 +0000151 tl_assert(DRD_(bm_has_1)(bm,
152 s_test1_args[i].address + j,
153 s_test1_args[i].access_type));
bart34eff982008-05-01 13:50:20 +0000154 }
155 }
156
bart39934d62009-02-15 16:18:03 +0000157 bm2 = DRD_(bm_new)();
158 DRD_(bm_merge2)(bm2, bm);
159 DRD_(bm_merge2)(bm2, bm);
bartc67d1532009-04-23 15:39:46 +0000160 assert(bm_equal_print_diffs(bm2, bm));
bart34eff982008-05-01 13:50:20 +0000161
bartfb088fd2008-05-04 07:47:21 +0000162 if (s_verbose)
163 VG_(printf)("Deleting bitmap bm\n");
bart39934d62009-02-15 16:18:03 +0000164 DRD_(bm_delete)(bm);
bartfb088fd2008-05-04 07:47:21 +0000165 if (s_verbose)
166 VG_(printf)("Deleting bitmap bm2\n");
bart39934d62009-02-15 16:18:03 +0000167 DRD_(bm_delete)(bm2);
bartfb088fd2008-05-04 07:47:21 +0000168}
bart34eff982008-05-01 13:50:20 +0000169
bart214493b2008-05-10 08:21:07 +0000170/** Test whether bm_equal() works correctly. */
bartfb088fd2008-05-04 07:47:21 +0000171void bm_test2()
172{
173 struct bitmap* bm1;
174 struct bitmap* bm2;
175
bart39934d62009-02-15 16:18:03 +0000176 bm1 = DRD_(bm_new)();
177 bm2 = DRD_(bm_new)();
178 DRD_(bm_access_load_1)(bm1, 7);
bart7b706b32009-05-10 06:55:39 +0000179 DRD_(bm_access_load_1)(bm2, make_address(1, 0) + 7);
bart39934d62009-02-15 16:18:03 +0000180 assert(! DRD_(bm_equal)(bm1, bm2));
181 assert(! DRD_(bm_equal)(bm2, bm1));
182 DRD_(bm_access_load_1)(bm2, 7);
183 assert(! DRD_(bm_equal)(bm1, bm2));
184 assert(! DRD_(bm_equal)(bm2, bm1));
bart7b706b32009-05-10 06:55:39 +0000185 DRD_(bm_access_store_1)(bm1, make_address(1, 0) + 7);
bart39934d62009-02-15 16:18:03 +0000186 assert(! DRD_(bm_equal)(bm1, bm2));
187 assert(! DRD_(bm_equal)(bm2, bm1));
188 DRD_(bm_delete)(bm2);
189 DRD_(bm_delete)(bm1);
bart214493b2008-05-10 08:21:07 +0000190}
191
192/** Torture test of the functions that set or clear a range of bits. */
bart2dbdbab2008-05-13 16:17:05 +0000193void bm_test3(const int outer_loop_step, const int inner_loop_step)
bart214493b2008-05-10 08:21:07 +0000194{
195 unsigned i, j;
196 struct bitmap* bm1;
197 struct bitmap* bm2;
198
bart7b706b32009-05-10 06:55:39 +0000199 const Addr lb = make_address(2, 0) - 2 * BITS_PER_UWORD;
200 const Addr ub = make_address(2, 0) + 2 * BITS_PER_UWORD;
bart0605e5a2009-05-03 18:07:07 +0000201
bart2dbdbab2008-05-13 16:17:05 +0000202 assert(outer_loop_step >= 1);
bart7b706b32009-05-10 06:55:39 +0000203 assert((outer_loop_step % ADDR_GRANULARITY) == 0);
bart2dbdbab2008-05-13 16:17:05 +0000204 assert(inner_loop_step >= 1);
bart7b706b32009-05-10 06:55:39 +0000205 assert((inner_loop_step % ADDR_GRANULARITY) == 0);
bart2dbdbab2008-05-13 16:17:05 +0000206
bart39934d62009-02-15 16:18:03 +0000207 bm1 = DRD_(bm_new)();
208 bm2 = DRD_(bm_new)();
bart0605e5a2009-05-03 18:07:07 +0000209 for (i = lb; i < ub; i += outer_loop_step)
bart214493b2008-05-10 08:21:07 +0000210 {
bart7b706b32009-05-10 06:55:39 +0000211 for (j = i + ADDR_GRANULARITY; j < ub; j += inner_loop_step)
bart214493b2008-05-10 08:21:07 +0000212 {
bart39934d62009-02-15 16:18:03 +0000213 DRD_(bm_access_range_load)(bm1, i, j);
214 DRD_(bm_clear_load)(bm1, i, j);
bartc67d1532009-04-23 15:39:46 +0000215 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000216 DRD_(bm_access_load_1)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000217 DRD_(bm_clear_load)(bm1, i, i + MAX(1, ADDR_GRANULARITY));
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_2)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000220 DRD_(bm_clear_load)(bm1, i, i + MAX(2, 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_4)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000223 DRD_(bm_clear_load)(bm1, i, i + MAX(4, 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_8)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000226 DRD_(bm_clear_load)(bm1, i, i + MAX(8, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000227 assert(bm_equal_print_diffs(bm1, bm2));
228
bart39934d62009-02-15 16:18:03 +0000229 DRD_(bm_access_range_store)(bm1, i, j);
230 DRD_(bm_clear_store)(bm1, i, j);
bartc67d1532009-04-23 15:39:46 +0000231 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000232 DRD_(bm_access_store_1)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000233 DRD_(bm_clear_store)(bm1, i, i + MAX(1, ADDR_GRANULARITY));
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_2)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000236 DRD_(bm_clear_store)(bm1, i, i + MAX(2, 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_4)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000239 DRD_(bm_clear_store)(bm1, i, i + MAX(4, 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_8)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000242 DRD_(bm_clear_store)(bm1, i, i + MAX(8, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000243 assert(bm_equal_print_diffs(bm1, bm2));
244
245 DRD_(bm_access_range_load)(bm1, i, j);
246 DRD_(bm_access_range_store)(bm1, i, j);
247 DRD_(bm_clear)(bm1, i, j);
248 assert(bm_equal_print_diffs(bm1, bm2));
249 DRD_(bm_access_load_1)(bm1, i);
250 DRD_(bm_access_store_1)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000251 DRD_(bm_clear)(bm1, i, i + MAX(1, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000252 assert(bm_equal_print_diffs(bm1, bm2));
253 DRD_(bm_access_load_2)(bm1, i);
254 DRD_(bm_access_store_2)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000255 DRD_(bm_clear)(bm1, i, i + MAX(2, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000256 assert(bm_equal_print_diffs(bm1, bm2));
257 DRD_(bm_access_load_4)(bm1, i);
258 DRD_(bm_access_store_4)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000259 DRD_(bm_clear)(bm1, i, i + MAX(4, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000260 assert(bm_equal_print_diffs(bm1, bm2));
261 DRD_(bm_access_load_8)(bm1, i);
262 DRD_(bm_access_store_8)(bm1, i);
bart7b706b32009-05-10 06:55:39 +0000263 DRD_(bm_clear)(bm1, i, i + MAX(8, ADDR_GRANULARITY));
bartc67d1532009-04-23 15:39:46 +0000264 assert(bm_equal_print_diffs(bm1, bm2));
bart214493b2008-05-10 08:21:07 +0000265 }
266 }
bart7b706b32009-05-10 06:55:39 +0000267 DRD_(bm_access_range_load)(bm1, 0, make_address(2, 0) + 2 * BITS_PER_UWORD);
268 DRD_(bm_access_range_store)(bm1, 0, make_address(2, 0) + 2 * BITS_PER_UWORD);
269 DRD_(bm_access_range_load)(bm2, 0, make_address(2, 0) + 2 * BITS_PER_UWORD);
270 DRD_(bm_access_range_store)(bm2, 0, make_address(2, 0) + 2 * BITS_PER_UWORD);
271 for (i = make_address(1, 0) - 2 * BITS_PER_UWORD;
272 i < make_address(1, 0) + 2 * BITS_PER_UWORD;
bart2dbdbab2008-05-13 16:17:05 +0000273 i += outer_loop_step)
bart214493b2008-05-10 08:21:07 +0000274 {
bart0605e5a2009-05-03 18:07:07 +0000275 for (j = i + 1; j < ub; j += inner_loop_step)
bart214493b2008-05-10 08:21:07 +0000276 {
bart39934d62009-02-15 16:18:03 +0000277 DRD_(bm_clear_load)(bm1, i, j);
278 DRD_(bm_access_range_load)(bm1, i, j);
bartc67d1532009-04-23 15:39:46 +0000279 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000280 DRD_(bm_clear_load)(bm1, i, i+1);
281 DRD_(bm_access_load_1)(bm1, i);
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+2);
284 DRD_(bm_access_load_2)(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+4);
287 DRD_(bm_access_load_4)(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+8);
290 DRD_(bm_access_load_8)(bm1, i);
bartc67d1532009-04-23 15:39:46 +0000291 assert(bm_equal_print_diffs(bm1, bm2));
bart0605e5a2009-05-03 18:07:07 +0000292
bart39934d62009-02-15 16:18:03 +0000293 DRD_(bm_clear_store)(bm1, i, j);
294 DRD_(bm_access_range_store)(bm1, i, j);
bartc67d1532009-04-23 15:39:46 +0000295 assert(bm_equal_print_diffs(bm1, bm2));
bart39934d62009-02-15 16:18:03 +0000296 DRD_(bm_clear_store)(bm1, i, i+1);
297 DRD_(bm_access_store_1)(bm1, i);
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+2);
300 DRD_(bm_access_store_2)(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+4);
303 DRD_(bm_access_store_4)(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+8);
306 DRD_(bm_access_store_8)(bm1, i);
bartc67d1532009-04-23 15:39:46 +0000307 assert(bm_equal_print_diffs(bm1, bm2));
bart0605e5a2009-05-03 18:07:07 +0000308
309 DRD_(bm_clear)(bm1, i, j);
310 DRD_(bm_access_range_load)(bm1, i, j);
311 DRD_(bm_access_range_store)(bm1, i, j);
312 assert(bm_equal_print_diffs(bm1, bm2));
bart214493b2008-05-10 08:21:07 +0000313 }
314 }
bart39934d62009-02-15 16:18:03 +0000315 DRD_(bm_delete)(bm2);
316 DRD_(bm_delete)(bm1);
bart34eff982008-05-01 13:50:20 +0000317}
318
319int main(int argc, char** argv)
320{
bart7b706b32009-05-10 06:55:39 +0000321 int outer_loop_step = ADDR_GRANULARITY;
322 int inner_loop_step = ADDR_GRANULARITY;
bartfb088fd2008-05-04 07:47:21 +0000323 int optchar;
324
bart2dbdbab2008-05-13 16:17:05 +0000325 while ((optchar = getopt(argc, argv, "s:t:q")) != EOF)
bartfb088fd2008-05-04 07:47:21 +0000326 {
327 switch (optchar)
328 {
bart2dbdbab2008-05-13 16:17:05 +0000329 case 's':
330 outer_loop_step = atoi(optarg);
331 break;
332 case 't':
333 inner_loop_step = atoi(optarg);
334 break;
bartfb088fd2008-05-04 07:47:21 +0000335 case 'q':
336 s_verbose = 0;
337 break;
338 default:
bart2dbdbab2008-05-13 16:17:05 +0000339 fprintf(stderr,
340 "Usage: %s [-s<outer_loop_step>] [-t<inner_loop_step>] [-q].\n",
341 argv[0]);
bartfb088fd2008-05-04 07:47:21 +0000342 break;
343 }
344 }
345
bart8f822af2009-06-08 18:20:42 +0000346 fprintf(stderr, "Start of DRD BM unit test.\n");
bartfb088fd2008-05-04 07:47:21 +0000347
barte44bccc2012-01-18 09:46:57 +0000348 DRD_(bm_module_init)();
bartfb088fd2008-05-04 07:47:21 +0000349 bm_test1();
350 bm_test2();
bart2dbdbab2008-05-13 16:17:05 +0000351 bm_test3(outer_loop_step, inner_loop_step);
barte44bccc2012-01-18 09:46:57 +0000352 DRD_(bm_module_cleanup)();
bartfb088fd2008-05-04 07:47:21 +0000353
bart8f822af2009-06-08 18:20:42 +0000354 fprintf(stderr, "End of DRD BM unit test.\n");
bartfb088fd2008-05-04 07:47:21 +0000355
bart34eff982008-05-01 13:50:20 +0000356 return 0;
357}