aboutsummaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorLuís Marques <luismarques@lowrisc.org>2019-10-22 17:56:54 +0100
committerAndrew Waterman <andrew@sifive.com>2019-10-22 09:56:53 -0700
commit99d6d0a93f9c83b63343a00693d5085e3949fe1a (patch)
tree2be05e20bf3956c1578bd32055c6195117087b85 /util
parent78e61baf432bd2d796c5b1e0498af363967322f4 (diff)
downloadriscv-pk-99d6d0a93f9c83b63343a00693d5085e3949fe1a.zip
riscv-pk-99d6d0a93f9c83b63343a00693d5085e3949fe1a.tar.gz
riscv-pk-99d6d0a93f9c83b63343a00693d5085e3949fe1a.tar.bz2
Make performance counters always 64 bits wide (#178)
This prevents the counters from easily overflowing for a 32-bit pk.
Diffstat (limited to 'util')
-rw-r--r--util/snprintf.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/util/snprintf.c b/util/snprintf.c
index 1544a6c..a11a4f7 100644
--- a/util/snprintf.c
+++ b/util/snprintf.c
@@ -9,6 +9,7 @@ int vsnprintf(char* out, size_t n, const char* s, va_list vl)
{
bool format = false;
bool longarg = false;
+ bool longlongarg = false;
size_t pos = 0;
for( ; *s; s++)
{
@@ -17,7 +18,12 @@ int vsnprintf(char* out, size_t n, const char* s, va_list vl)
switch(*s)
{
case 'l':
- longarg = true;
+ if (s[1] == 'l') {
+ longlongarg = true;
+ s++;
+ }
+ else
+ longarg = true;
break;
case 'p':
longarg = true;
@@ -36,13 +42,19 @@ int vsnprintf(char* out, size_t n, const char* s, va_list vl)
}
case 'd':
{
- long num = longarg ? va_arg(vl, long) : va_arg(vl, int);
+ long long num;
+ if (longarg)
+ num = va_arg(vl, long);
+ else if (longlongarg)
+ num = va_arg(vl, long long);
+ else
+ num = va_arg(vl, int);
if (num < 0) {
num = -num;
if (++pos < n) out[pos-1] = '-';
}
long digits = 1;
- for (long nn = num; nn /= 10; digits++)
+ for (long long nn = num; nn /= 10; digits++)
;
for (int i = digits-1; i >= 0; i--) {
if (pos + i + 1 < n) out[pos + i] = '0' + (num % 10);
@@ -50,6 +62,7 @@ int vsnprintf(char* out, size_t n, const char* s, va_list vl)
}
pos += digits;
longarg = false;
+ longlongarg = false;
format = false;
break;
}