mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 00:16:11 +00:00
674 lines
18 KiB
C
674 lines
18 KiB
C
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <assert.h>
|
|
#include "valgrind.h"
|
|
|
|
/* Program that checks all numbers of args (0 through 12) work for
|
|
wrapping. Also calls originals which trash all the iregs in an
|
|
attempt to shake out any problems caused by insufficient saving of
|
|
caller-save registers around the hidden call instruction. */
|
|
|
|
typedef unsigned int UInt;
|
|
|
|
#define ROL(_x,n) (((_x) << n) | ((UInt)(_x)) >> ((8*sizeof(UInt)-n)))
|
|
|
|
#define TRASH_IREGS(_rlval, _vec) \
|
|
do { \
|
|
register UInt* vec = (_vec); \
|
|
/* x86 spills for v > 4, amd64 for v > 12. Getting ppc */ \
|
|
/* to spill is quite difficult, requiring v > 28 or so. */ \
|
|
register UInt i, sum = 0; \
|
|
register UInt v1 = vec[1-1]; \
|
|
register UInt v2 = vec[2-1]; \
|
|
register UInt v3 = vec[3-1]; \
|
|
register UInt v4 = vec[4-1]; \
|
|
register UInt v5 = vec[5-1]; \
|
|
register UInt v6 = vec[6-1]; \
|
|
register UInt v7 = vec[7-1]; \
|
|
register UInt v8 = vec[8-1]; \
|
|
register UInt v9 = vec[9-1]; \
|
|
register UInt v10 = vec[10-1]; \
|
|
register UInt v11 = vec[11-1]; \
|
|
register UInt v12 = vec[12-1]; \
|
|
register UInt v13 = vec[13-1]; \
|
|
register UInt v14 = vec[14-1]; \
|
|
register UInt v15 = vec[15-1]; \
|
|
register UInt v16 = vec[16-1]; \
|
|
register UInt v17 = vec[17-1]; \
|
|
register UInt v18 = vec[18-1]; \
|
|
register UInt v19 = vec[19-1]; \
|
|
register UInt v20 = vec[20-1]; \
|
|
register UInt v21 = vec[21-1]; \
|
|
register UInt v22 = vec[22-1]; \
|
|
register UInt v23 = vec[23-1]; \
|
|
register UInt v24 = vec[24-1]; \
|
|
register UInt v25 = vec[25-1]; \
|
|
register UInt v26 = vec[26-1]; \
|
|
register UInt v27 = vec[27-1]; \
|
|
register UInt v28 = vec[28-1]; \
|
|
register UInt v29 = vec[29-1]; \
|
|
for (i = 0; i < 50; i++) { \
|
|
v1 = ROL(v1,1); \
|
|
v2 = ROL(v2,2); \
|
|
v3 = ROL(v3,3); \
|
|
v4 = ROL(v4,4); \
|
|
v5 = ROL(v5,5); \
|
|
v6 = ROL(v6,6); \
|
|
v7 = ROL(v7,7); \
|
|
v8 = ROL(v8,8); \
|
|
v9 = ROL(v9,9); \
|
|
v10 = ROL(v10,10); \
|
|
v11 = ROL(v11,11); \
|
|
v12 = ROL(v12,12); \
|
|
v13 = ROL(v13,13); \
|
|
v14 = ROL(v14,14); \
|
|
v15 = ROL(v15,15); \
|
|
v16 = ROL(v16,16); \
|
|
v17 = ROL(v17,17); \
|
|
v18 = ROL(v18,18); \
|
|
v19 = ROL(v19,19); \
|
|
v20 = ROL(v20,20); \
|
|
v21 = ROL(v21,21); \
|
|
v22 = ROL(v22,22); \
|
|
v23 = ROL(v23,23); \
|
|
v24 = ROL(v24,24); \
|
|
v25 = ROL(v25,25); \
|
|
v26 = ROL(v26,26); \
|
|
v27 = ROL(v27,27); \
|
|
v28 = ROL(v28,28); \
|
|
v29 = ROL(v29,29); \
|
|
sum ^= ((0xFFF & v1) * i); \
|
|
sum ^= (v1-v2); \
|
|
sum ^= (v1-v3); \
|
|
sum ^= (v1-v4); \
|
|
sum ^= (v1-v5); \
|
|
sum ^= (v1-v6); \
|
|
sum ^= (v1-v7); \
|
|
sum ^= (v1-v8); \
|
|
sum ^= (v1-v9); \
|
|
sum ^= (v1-v10); \
|
|
sum ^= (v1-v11); \
|
|
sum ^= (v1-v12); \
|
|
sum ^= (v1-v13); \
|
|
sum ^= (v1-v14); \
|
|
sum ^= (v1-v15); \
|
|
sum ^= (v1-v16); \
|
|
sum ^= (v1-v17); \
|
|
sum ^= (v1-v18); \
|
|
sum ^= (v1-v19); \
|
|
sum ^= (v1-v20); \
|
|
sum ^= (v1-v21); \
|
|
sum ^= (v1-v22); \
|
|
sum ^= (v1-v23); \
|
|
sum ^= (v1-v24); \
|
|
sum ^= (v1-v25); \
|
|
sum ^= (v1-v26); \
|
|
sum ^= (v1-v27); \
|
|
sum ^= (v1-v28); \
|
|
sum ^= (v1-v29); \
|
|
} \
|
|
_rlval = sum; \
|
|
} while (0)
|
|
|
|
|
|
/* Returns one, in a way that gcc probably can't constant fold out */
|
|
|
|
volatile int one_actual_return_value = 0; /* the value one() returns */
|
|
|
|
__attribute__((noinline))
|
|
int one ( void )
|
|
{
|
|
int i, sum, a[7];
|
|
for (i = 0; i < 7; i++)
|
|
a[i] = i;
|
|
a[3] = 3+one_actual_return_value;
|
|
sum = 0;
|
|
for (i = 7-1; i >= 0; i--)
|
|
sum += a[i] - i;
|
|
return sum;
|
|
}
|
|
|
|
#define LOOPS_START \
|
|
{ register int len = one(); \
|
|
register int x0; for (x0 = 0x1000; x0 < 0x1000+len; x0++) { \
|
|
register int x1; for (x1 = 0x1100; x1 < 0x1100+len; x1++) { \
|
|
register int x2; for (x2 = 0x1200; x2 < 0x1200+len; x2++) { \
|
|
register int x3; for (x3 = 0x1300; x3 < 0x1300+len; x3++) { \
|
|
register int x4; for (x4 = 0x1400; x4 < 0x1400+len; x4++) { \
|
|
register int x5; for (x5 = 0x1500; x5 < 0x1500+len; x5++) { \
|
|
register int x6; for (x6 = 0x1600; x6 < 0x1600+len; x6++) { \
|
|
register int x7; for (x7 = 0x1700; x7 < 0x1700+len; x7++) { \
|
|
register int x8; for (x8 = 0x1800; x8 < 0x1800+len; x8++) { \
|
|
register int x9; for (x9 = 0x1900; x9 < 0x1900+len; x9++) { \
|
|
register int xA; for (xA = 0x1A00; xA < 0x1A00+len; xA++) { \
|
|
register int xB; for (xB = 0x1B00; xB < 0x1B00+len; xB++) { \
|
|
register int xC; for (xC = 0x1C00; xC < 0x1C00+len; xC++) { \
|
|
register int xD; for (xD = 0x1D00; xD < 0x1D00+len; xD++) { \
|
|
register int xE; for (xE = 0x1E00; xE < 0x1E00+len; xE++) { \
|
|
register int xF; for (xF = 0x1F00; xF < 0x1F00+len; xF++) { \
|
|
/* */
|
|
|
|
#define LOOPS_END \
|
|
assert(xF >= 0x1F00 && xF <= 0x1F00+len); } \
|
|
assert(xE >= 0x1E00 && xE <= 0x1E00+len); } \
|
|
assert(xD >= 0x1D00 && xD <= 0x1D00+len); } \
|
|
assert(xC >= 0x1C00 && xC <= 0x1C00+len); } \
|
|
assert(xB >= 0x1B00 && xB <= 0x1B00+len); } \
|
|
assert(xA >= 0x1A00 && xA <= 0x1A00+len); } \
|
|
assert(x9 >= 0x1900 && x9 <= 0x1900+len); } \
|
|
assert(x8 >= 0x1800 && x8 <= 0x1800+len); } \
|
|
assert(x7 >= 0x1700 && x7 <= 0x1700+len); } \
|
|
assert(x6 >= 0x1600 && x6 <= 0x1600+len); } \
|
|
assert(x5 >= 0x1500 && x5 <= 0x1500+len); } \
|
|
assert(x4 >= 0x1400 && x4 <= 0x1400+len); } \
|
|
assert(x3 >= 0x1300 && x3 <= 0x1300+len); } \
|
|
assert(x2 >= 0x1200 && x2 <= 0x1200+len); } \
|
|
assert(x1 >= 0x1100 && x1 <= 0x1100+len); } \
|
|
assert(x0 >= 0x1000 && x0 <= 0x1000+len); } \
|
|
}
|
|
|
|
/* General idea is for the wrappers to use LOOPS_START / LOOPS_END to
|
|
soak up lots of int registers. And the orig fn uses TRASH_IREGS to
|
|
do the same. If there is insufficient saving of caller-saves regs
|
|
by the CALL_FN_* macros, then hopefully the assertions in LOOPS_END
|
|
will fail. */
|
|
|
|
/* --------------- 0 --------------- */
|
|
|
|
UInt fn_0 ( void )
|
|
{
|
|
UInt r;
|
|
UInt* words = calloc(200, sizeof(UInt));
|
|
TRASH_IREGS(r, words);
|
|
free(words);
|
|
return r;
|
|
}
|
|
|
|
UInt I_WRAP_SONAME_FNNAME_ZU(NONE,fn_0) ( UInt a1 )
|
|
{
|
|
UInt r = 0;
|
|
OrigFn fn;
|
|
VALGRIND_GET_ORIG_FN(fn);
|
|
LOOPS_START
|
|
printf("fn_0 wrapper pre ()\n");
|
|
CALL_FN_W_v(r, fn);
|
|
printf("fn_0 wrapper post1 = %d\n", (int)r);
|
|
CALL_FN_v_v(fn);
|
|
printf("fn_0 wrapper post2 = %d\n", (int)r);
|
|
LOOPS_END
|
|
return r;
|
|
}
|
|
|
|
/* --------------- 1 --------------- */
|
|
|
|
UInt fn_1 ( UInt a1 )
|
|
{
|
|
UInt r;
|
|
UInt* words = calloc(200, sizeof(UInt));
|
|
words[1-1] = a1;
|
|
TRASH_IREGS(r, words);
|
|
free(words);
|
|
return r;
|
|
}
|
|
|
|
UInt I_WRAP_SONAME_FNNAME_ZU(NONE,fn_1) ( UInt a1 )
|
|
{
|
|
UInt r = 0;
|
|
OrigFn fn;
|
|
VALGRIND_GET_ORIG_FN(fn);
|
|
LOOPS_START
|
|
printf("fn_1 wrapper pre ( %d )\n", (int)a1);
|
|
CALL_FN_W_W(r, fn, a1);
|
|
printf("fn_1 wrapper post1 = %d\n", (int)r);
|
|
CALL_FN_v_W(fn, a1);
|
|
printf("fn_1 wrapper post2 = %d\n", (int)r);
|
|
LOOPS_END
|
|
return r;
|
|
}
|
|
|
|
/* --------------- 2 --------------- */
|
|
|
|
UInt fn_2 ( UInt a1, UInt a2 )
|
|
{
|
|
UInt r = 0;
|
|
UInt* words = calloc(200, sizeof(UInt));
|
|
words[1-1] = a1;
|
|
words[2-1] = a2;
|
|
TRASH_IREGS(r, words);
|
|
free(words);
|
|
return r;
|
|
}
|
|
|
|
UInt I_WRAP_SONAME_FNNAME_ZU(NONE,fn_2) ( UInt a1, UInt a2 )
|
|
{
|
|
UInt r = 0;
|
|
OrigFn fn;
|
|
VALGRIND_GET_ORIG_FN(fn);
|
|
LOOPS_START
|
|
printf("fn_2 wrapper pre ( %d, %d )\n", (int)a1, (int)a2);
|
|
CALL_FN_W_WW(r, fn, a1, a2);
|
|
printf("fn_2 wrapper post1 = %d\n", (int)r);
|
|
CALL_FN_v_WW(fn, a1, a2);
|
|
printf("fn_2 wrapper post2 = %d\n", (int)r);
|
|
LOOPS_END
|
|
return r;
|
|
}
|
|
|
|
/* --------------- 3 --------------- */
|
|
|
|
UInt fn_3 ( UInt a1, UInt a2, UInt a3 )
|
|
{
|
|
UInt r;
|
|
UInt* words = calloc(200, sizeof(UInt));
|
|
words[1-1] = a1;
|
|
words[2-1] = a2;
|
|
words[3-1] = a3;
|
|
TRASH_IREGS(r, words);
|
|
free(words);
|
|
return r;
|
|
}
|
|
|
|
UInt I_WRAP_SONAME_FNNAME_ZU(NONE,fn_3) ( UInt a1, UInt a2, UInt a3 )
|
|
{
|
|
UInt r = 0;
|
|
OrigFn fn;
|
|
VALGRIND_GET_ORIG_FN(fn);
|
|
LOOPS_START
|
|
printf("fn_3 wrapper pre ( %d, %d, %d )\n", (int)a1, (int)a2, (int)a3);
|
|
CALL_FN_W_WWW(r, fn, a1, a2, a3);
|
|
printf("fn_3 wrapper post1 = %d\n", (int)r);
|
|
CALL_FN_v_WWW(fn, a1, a2, a3);
|
|
printf("fn_3 wrapper post2 = %d\n", (int)r);
|
|
LOOPS_END
|
|
return r;
|
|
}
|
|
|
|
/* --------------- 4 --------------- */
|
|
|
|
UInt fn_4 ( UInt a1, UInt a2, UInt a3, UInt a4 )
|
|
{
|
|
UInt r;
|
|
UInt* words = calloc(200, sizeof(UInt));
|
|
words[1-1] = a1;
|
|
words[2-1] = a2;
|
|
words[3-1] = a3;
|
|
words[4-1] = a4;
|
|
TRASH_IREGS(r, words);
|
|
free(words);
|
|
return r;
|
|
}
|
|
|
|
UInt I_WRAP_SONAME_FNNAME_ZU(NONE,fn_4)
|
|
( UInt a1, UInt a2, UInt a3, UInt a4 )
|
|
{
|
|
UInt r = 0;
|
|
OrigFn fn;
|
|
VALGRIND_GET_ORIG_FN(fn);
|
|
LOOPS_START
|
|
printf("fn_4 wrapper pre ( %d, %d, %d, %d )\n",
|
|
(int)a1, (int)a2, (int)a3, (int)a4);
|
|
CALL_FN_W_WWWW(r, fn, a1, a2, a3, a4);
|
|
printf("fn_4 wrapper post1 = %d\n", (int)r);
|
|
LOOPS_END
|
|
return r;
|
|
}
|
|
|
|
/* --------------- 5 --------------- */
|
|
|
|
UInt fn_5 ( UInt a1, UInt a2, UInt a3, UInt a4, UInt a5 )
|
|
{
|
|
UInt r;
|
|
UInt* words = calloc(200, sizeof(UInt));
|
|
words[1-1] = a1;
|
|
words[2-1] = a2;
|
|
words[3-1] = a3;
|
|
words[4-1] = a4;
|
|
words[5-1] = a5;
|
|
TRASH_IREGS(r, words);
|
|
free(words);
|
|
return r;
|
|
}
|
|
|
|
UInt I_WRAP_SONAME_FNNAME_ZU(NONE,fn_5)
|
|
( UInt a1, UInt a2, UInt a3, UInt a4, UInt a5 )
|
|
{
|
|
UInt r = 0;
|
|
OrigFn fn;
|
|
VALGRIND_GET_ORIG_FN(fn);
|
|
LOOPS_START
|
|
printf("fn_5 wrapper pre ( %d, %d, %d, %d, %d )\n",
|
|
(int)a1, (int)a2, (int)a3, (int)a4, (int)a5);
|
|
CALL_FN_W_5W(r, fn, a1, a2, a3, a4, a5);
|
|
printf("fn_5 wrapper post1 = %d\n", (int)r);
|
|
LOOPS_END
|
|
return r;
|
|
}
|
|
|
|
/* --------------- 6 --------------- */
|
|
|
|
UInt fn_6 ( UInt a1, UInt a2, UInt a3, UInt a4, UInt a5, UInt a6 )
|
|
{
|
|
UInt r;
|
|
UInt* words = calloc(200, sizeof(UInt));
|
|
words[1-1] = a1;
|
|
words[2-1] = a2;
|
|
words[3-1] = a3;
|
|
words[4-1] = a4;
|
|
words[5-1] = a5;
|
|
words[6-1] = a6;
|
|
TRASH_IREGS(r, words);
|
|
free(words);
|
|
return r;
|
|
}
|
|
|
|
UInt I_WRAP_SONAME_FNNAME_ZU(NONE,fn_6)
|
|
( UInt a1, UInt a2, UInt a3, UInt a4, UInt a5, UInt a6 )
|
|
{
|
|
UInt r = 0;
|
|
OrigFn fn;
|
|
VALGRIND_GET_ORIG_FN(fn);
|
|
LOOPS_START
|
|
printf("fn_6 wrapper pre ( %d, %d, %d, %d, %d, %d )\n",
|
|
(int)a1, (int)a2, (int)a3, (int)a4, (int)a5, (int)a6);
|
|
CALL_FN_W_6W(r, fn, a1, a2, a3, a4, a5, a6);
|
|
printf("fn_6 wrapper post1 = %d\n", (int)r);
|
|
LOOPS_END
|
|
return r;
|
|
}
|
|
|
|
/* --------------- 7 --------------- */
|
|
|
|
UInt fn_7 ( UInt a1, UInt a2, UInt a3, UInt a4, UInt a5, UInt a6,
|
|
UInt a7 )
|
|
{
|
|
UInt r;
|
|
UInt* words = calloc(200, sizeof(UInt));
|
|
words[1-1] = a1;
|
|
words[2-1] = a2;
|
|
words[3-1] = a3;
|
|
words[4-1] = a4;
|
|
words[5-1] = a5;
|
|
words[6-1] = a6;
|
|
words[7-1] = a7;
|
|
TRASH_IREGS(r, words);
|
|
free(words);
|
|
return r;
|
|
}
|
|
|
|
UInt I_WRAP_SONAME_FNNAME_ZU(NONE,fn_7)
|
|
( UInt a1, UInt a2, UInt a3, UInt a4, UInt a5, UInt a6,
|
|
UInt a7 )
|
|
{
|
|
UInt r = 0;
|
|
OrigFn fn;
|
|
VALGRIND_GET_ORIG_FN(fn);
|
|
LOOPS_START
|
|
printf("fn_7 wrapper pre ( %d, %d, %d, %d, %d, %d, %d )\n",
|
|
(int)a1, (int)a2, (int)a3, (int)a4, (int)a5, (int)a6,
|
|
(int)a7);
|
|
CALL_FN_W_7W(r, fn, a1, a2, a3, a4, a5, a6, a7);
|
|
printf("fn_7 wrapper post1 = %d\n", (int)r);
|
|
LOOPS_END
|
|
return r;
|
|
}
|
|
|
|
/* --------------- 8 --------------- */
|
|
|
|
UInt fn_8 ( UInt a1, UInt a2, UInt a3, UInt a4, UInt a5, UInt a6,
|
|
UInt a7, UInt a8 )
|
|
{
|
|
UInt r;
|
|
UInt* words = calloc(200, sizeof(UInt));
|
|
words[1-1] = a1;
|
|
words[2-1] = a2;
|
|
words[3-1] = a3;
|
|
words[4-1] = a4;
|
|
words[5-1] = a5;
|
|
words[6-1] = a6;
|
|
words[7-1] = a7;
|
|
words[8-1] = a8;
|
|
TRASH_IREGS(r, words);
|
|
free(words);
|
|
return r;
|
|
}
|
|
|
|
UInt I_WRAP_SONAME_FNNAME_ZU(NONE,fn_8)
|
|
( UInt a1, UInt a2, UInt a3, UInt a4, UInt a5, UInt a6,
|
|
UInt a7, UInt a8 )
|
|
{
|
|
UInt r = 0;
|
|
OrigFn fn;
|
|
VALGRIND_GET_ORIG_FN(fn);
|
|
LOOPS_START
|
|
printf("fn_8 wrapper pre ( %d, %d, %d, %d, %d, %d, %d, %d )\n",
|
|
(int)a1, (int)a2, (int)a3, (int)a4, (int)a5, (int)a6,
|
|
(int)a7, (int)a8);
|
|
CALL_FN_W_8W(r, fn, a1, a2, a3, a4, a5, a6, a7, a8);
|
|
printf("fn_8 wrapper post1 = %d\n", (int)r);
|
|
LOOPS_END
|
|
return r;
|
|
}
|
|
|
|
/* --------------- 9 --------------- */
|
|
|
|
UInt fn_9 ( UInt a1, UInt a2, UInt a3, UInt a4, UInt a5, UInt a6,
|
|
UInt a7, UInt a8, UInt a9 )
|
|
{
|
|
UInt r;
|
|
UInt* words = calloc(200, sizeof(UInt));
|
|
words[1-1] = a1;
|
|
words[2-1] = a2;
|
|
words[3-1] = a3;
|
|
words[4-1] = a4;
|
|
words[5-1] = a5;
|
|
words[6-1] = a6;
|
|
words[7-1] = a7;
|
|
words[8-1] = a8;
|
|
words[9-1] = a9;
|
|
TRASH_IREGS(r, words);
|
|
free(words);
|
|
return r;
|
|
}
|
|
|
|
UInt I_WRAP_SONAME_FNNAME_ZU(NONE,fn_9)
|
|
( UInt a1, UInt a2, UInt a3, UInt a4, UInt a5, UInt a6,
|
|
UInt a7, UInt a8, UInt a9 )
|
|
{
|
|
UInt r = 0;
|
|
OrigFn fn;
|
|
VALGRIND_GET_ORIG_FN(fn);
|
|
LOOPS_START
|
|
printf("fn_9 wrapper pre ( %d, %d, %d, %d, %d, %d, %d, %d, %d )\n",
|
|
(int)a1, (int)a2, (int)a3, (int)a4, (int)a5, (int)a6,
|
|
(int)a7, (int)a8, (int)a9);
|
|
CALL_FN_W_9W(r, fn, a1, a2, a3, a4, a5, a6, a7, a8, a9);
|
|
printf("fn_9 wrapper post1 = %d\n", (int)r);
|
|
LOOPS_END
|
|
return r;
|
|
}
|
|
|
|
/* --------------- 10 --------------- */
|
|
|
|
UInt fn_10 ( UInt a1, UInt a2, UInt a3, UInt a4, UInt a5, UInt a6,
|
|
UInt a7, UInt a8, UInt a9, UInt a10 )
|
|
{
|
|
UInt r;
|
|
UInt* words = calloc(200, sizeof(UInt));
|
|
words[1-1] = a1;
|
|
words[2-1] = a2;
|
|
words[3-1] = a3;
|
|
words[4-1] = a4;
|
|
words[5-1] = a5;
|
|
words[6-1] = a6;
|
|
words[7-1] = a7;
|
|
words[8-1] = a8;
|
|
words[9-1] = a9;
|
|
words[10-1] = a10;
|
|
TRASH_IREGS(r, words);
|
|
free(words);
|
|
return r;
|
|
}
|
|
|
|
UInt I_WRAP_SONAME_FNNAME_ZU(NONE,fn_10)
|
|
( UInt a1, UInt a2, UInt a3, UInt a4, UInt a5, UInt a6,
|
|
UInt a7, UInt a8, UInt a9, UInt a10 )
|
|
{
|
|
UInt r = 0;
|
|
OrigFn fn;
|
|
VALGRIND_GET_ORIG_FN(fn);
|
|
LOOPS_START
|
|
printf("fn_10 wrapper pre ( %d, %d, %d, %d, %d, %d, %d, %d, %d, %d )\n",
|
|
(int)a1, (int)a2, (int)a3, (int)a4, (int)a5, (int)a6,
|
|
(int)a7, (int)a8, (int)a9, (int)a10);
|
|
CALL_FN_W_10W(r, fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
|
|
printf("fn_10 wrapper post1 = %d\n", (int)r);
|
|
LOOPS_END
|
|
return r;
|
|
}
|
|
|
|
/* --------------- 11 --------------- */
|
|
|
|
UInt fn_11 ( UInt a1, UInt a2, UInt a3, UInt a4, UInt a5, UInt a6,
|
|
UInt a7, UInt a8, UInt a9, UInt a10, UInt a11 )
|
|
{
|
|
UInt r;
|
|
UInt* words = calloc(200, sizeof(UInt));
|
|
words[1-1] = a1;
|
|
words[2-1] = a2;
|
|
words[3-1] = a3;
|
|
words[4-1] = a4;
|
|
words[5-1] = a5;
|
|
words[6-1] = a6;
|
|
words[7-1] = a7;
|
|
words[8-1] = a8;
|
|
words[9-1] = a9;
|
|
words[10-1] = a10;
|
|
words[11-1] = a11;
|
|
TRASH_IREGS(r, words);
|
|
free(words);
|
|
return r;
|
|
}
|
|
|
|
UInt I_WRAP_SONAME_FNNAME_ZU(NONE,fn_11)
|
|
( UInt a1, UInt a2, UInt a3, UInt a4, UInt a5, UInt a6,
|
|
UInt a7, UInt a8, UInt a9, UInt a10, UInt a11 )
|
|
{
|
|
UInt r = 0;
|
|
OrigFn fn;
|
|
VALGRIND_GET_ORIG_FN(fn);
|
|
LOOPS_START
|
|
printf("fn_11 wrapper pre ( %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d )\n",
|
|
(int)a1, (int)a2, (int)a3, (int)a4, (int)a5, (int)a6,
|
|
(int)a7, (int)a8, (int)a9, (int)a10, (int)a11);
|
|
CALL_FN_W_11W(r, fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
|
|
printf("fn_11 wrapper post1 = %d\n", (int)r);
|
|
LOOPS_END
|
|
return r;
|
|
}
|
|
|
|
/* --------------- 12 --------------- */
|
|
|
|
UInt fn_12 ( UInt a1, UInt a2, UInt a3, UInt a4, UInt a5, UInt a6,
|
|
UInt a7, UInt a8, UInt a9, UInt a10, UInt a11, UInt a12 )
|
|
{
|
|
UInt r;
|
|
UInt* words = calloc(200, sizeof(UInt));
|
|
words[1-1] = a1;
|
|
words[2-1] = a2;
|
|
words[3-1] = a3;
|
|
words[4-1] = a4;
|
|
words[5-1] = a5;
|
|
words[6-1] = a6;
|
|
words[7-1] = a7;
|
|
words[8-1] = a8;
|
|
words[9-1] = a9;
|
|
words[10-1] = a10;
|
|
words[11-1] = a11;
|
|
words[12-1] = a12;
|
|
TRASH_IREGS(r, words);
|
|
free(words);
|
|
return r;
|
|
}
|
|
|
|
UInt I_WRAP_SONAME_FNNAME_ZU(NONE,fn_12)
|
|
( UInt a1, UInt a2, UInt a3, UInt a4, UInt a5, UInt a6,
|
|
UInt a7, UInt a8, UInt a9, UInt a10, UInt a11, UInt a12 )
|
|
{
|
|
UInt r = 0;
|
|
OrigFn fn;
|
|
VALGRIND_GET_ORIG_FN(fn);
|
|
LOOPS_START
|
|
printf("fn_12 wrapper pre ( %d, %d, %d, %d, %d, %d, "
|
|
"%d, %d, %d, %d, %d, %d )\n",
|
|
(int)a1, (int)a2, (int)a3, (int)a4, (int)a5, (int)a6,
|
|
(int)a7, (int)a8, (int)a9, (int)a10, (int)a11, (int)a12);
|
|
CALL_FN_W_12W(r, fn, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
|
|
printf("fn_12 wrapper post1 = %d\n", (int)r);
|
|
LOOPS_END
|
|
return r;
|
|
}
|
|
|
|
/* --------------- main --------------- */
|
|
|
|
int main ( void )
|
|
{
|
|
UInt w;
|
|
|
|
one_actual_return_value = 1;
|
|
|
|
printf("fn_0 ...\n");
|
|
w = fn_0();
|
|
printf(" ... %d\n\n", (int)w);
|
|
|
|
printf("fn_1 ...\n");
|
|
w = fn_1(42);
|
|
printf(" ... %d\n\n", (int)w);
|
|
|
|
printf("fn_2 ...\n");
|
|
w = fn_2(42,43);
|
|
printf(" ... %d\n\n", (int)w);
|
|
|
|
printf("fn_3 ...\n");
|
|
w = fn_3(42,43,44);
|
|
printf(" ... %d\n\n", (int)w);
|
|
|
|
printf("fn_4 ...\n");
|
|
w = fn_4(42,43,44,45);
|
|
printf(" ... %d\n\n", (int)w);
|
|
|
|
printf("fn_5 ...\n");
|
|
w = fn_5(42,43,44,45,46);
|
|
printf(" ... %d\n\n", (int)w);
|
|
|
|
printf("fn_6 ...\n");
|
|
w = fn_6(42,43,44,45,46,47);
|
|
printf(" ... %d\n\n", (int)w);
|
|
|
|
printf("fn_7 ...\n");
|
|
w = fn_7(42,43,44,45,46,47,48);
|
|
printf(" ... %d\n\n", (int)w);
|
|
|
|
printf("fn_8 ...\n");
|
|
w = fn_8(42,43,44,45,46,47,48,49);
|
|
printf(" ... %d\n\n", (int)w);
|
|
|
|
printf("fn_9 ...\n");
|
|
w = fn_9(42,43,44,45,46,47,48,49,50);
|
|
printf(" ... %d\n\n", (int)w);
|
|
|
|
printf("fn_10 ...\n");
|
|
w = fn_10(42,43,44,45,46,47,48,49,50,51);
|
|
printf(" ... %d\n\n", (int)w);
|
|
|
|
printf("fn_11 ...\n");
|
|
w = fn_11(42,43,44,45,46,47,48,49,50,51,52);
|
|
printf(" ... %d\n\n", (int)w);
|
|
|
|
printf("fn_12 ...\n");
|
|
w = fn_12(42,43,44,45,46,47,48,49,50,51,52,53);
|
|
printf(" ... %d\n\n", (int)w);
|
|
|
|
return 0;
|
|
}
|