mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-03 18:13:01 +00:00
110 lines
3.2 KiB
C
110 lines
3.2 KiB
C
|
|
/* This demonstrates a stack overrun bug that exp-ptrcheck found while
|
|
running Valgrind itself (self hosting). As at 12 Sept 08 this bug
|
|
is still in Valgrind. */
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <assert.h>
|
|
#include <string.h>
|
|
|
|
typedef unsigned long long int ULong;
|
|
typedef unsigned int UInt;
|
|
typedef signed int Int;
|
|
typedef char Char;
|
|
|
|
/* ---------------------------------------------------------------------
|
|
percentify()
|
|
------------------------------------------------------------------ */
|
|
|
|
/* This part excerpted from coregrind/m_libcbase.c */
|
|
|
|
// Percentify n/m with d decimal places. Includes the '%' symbol at the end.
|
|
// Right justifies in 'buf'.
|
|
void VG_percentify(ULong n, ULong m, UInt d, Int n_buf, char buf[])
|
|
{
|
|
Int i, len, space;
|
|
ULong p1;
|
|
Char fmt[32];
|
|
|
|
if (m == 0) {
|
|
// Have to generate the format string in order to be flexible about
|
|
// the width of the field.
|
|
sprintf(fmt, "%%-%ds", n_buf);
|
|
// fmt is now "%<n_buf>s" where <d> is 1,2,3...
|
|
sprintf(buf, fmt, "--%");
|
|
return;
|
|
}
|
|
|
|
p1 = (100*n) / m;
|
|
|
|
if (d == 0) {
|
|
sprintf(buf, "%lld%%", p1);
|
|
} else {
|
|
ULong p2;
|
|
UInt ex;
|
|
switch (d) {
|
|
case 1: ex = 10; break;
|
|
case 2: ex = 100; break;
|
|
case 3: ex = 1000; break;
|
|
default: assert(0);
|
|
/* was: VG_(tool_panic)("Currently can only handle 3 decimal places"); */
|
|
}
|
|
p2 = ((100*n*ex) / m) % ex;
|
|
// Have to generate the format string in order to be flexible about
|
|
// the width of the post-decimal-point part.
|
|
sprintf(fmt, "%%lld.%%0%dlld%%%%", d);
|
|
// fmt is now "%lld.%0<d>lld%%" where <d> is 1,2,3...
|
|
sprintf(buf, fmt, p1, p2);
|
|
}
|
|
|
|
len = strlen(buf);
|
|
space = n_buf - len;
|
|
if (space < 0) space = 0; /* Allow for v. small field_width */
|
|
i = len;
|
|
|
|
/* Right justify in field */
|
|
for ( ; i >= 0; i--) buf[i + space] = buf[i];
|
|
for (i = 0; i < space; i++) buf[i] = ' ';
|
|
}
|
|
|
|
|
|
/*------------------------------------------------------------*/
|
|
/*--- Stats ---*/
|
|
/*------------------------------------------------------------*/
|
|
|
|
/* This part excerpted from coregrind/m_translate.c */
|
|
|
|
static UInt n_SP_updates_fast = 0;
|
|
static UInt n_SP_updates_generic_known = 0;
|
|
static UInt n_SP_updates_generic_unknown = 0;
|
|
|
|
void VG_print_translation_stats ( void )
|
|
{
|
|
Char buf[6];
|
|
UInt n_SP_updates = n_SP_updates_fast + n_SP_updates_generic_known
|
|
+ n_SP_updates_generic_unknown;
|
|
VG_percentify(n_SP_updates_fast, n_SP_updates, 1, 6, buf);
|
|
printf(
|
|
"translate: fast SP updates identified: %'u (%s)\n",
|
|
n_SP_updates_fast, buf );
|
|
|
|
VG_percentify(n_SP_updates_generic_known, n_SP_updates, 1, 6, buf);
|
|
printf(
|
|
"translate: generic_known SP updates identified: %'u (%s)\n",
|
|
n_SP_updates_generic_known, buf );
|
|
|
|
VG_percentify(n_SP_updates_generic_unknown, n_SP_updates, 1, 6, buf);
|
|
printf(
|
|
"translate: generic_unknown SP updates identified: %'u (%s)\n",
|
|
n_SP_updates_generic_unknown, buf );
|
|
}
|
|
|
|
|
|
|
|
int main ( void )
|
|
{
|
|
VG_print_translation_stats();
|
|
return 0;
|
|
}
|