summaryrefslogtreecommitdiff
path: root/software/dhrystone
diff options
context:
space:
mode:
authorAlbert Ou <albert@sifive.com>2016-12-13 15:05:19 -0800
committerAlbert Ou <albert@sifive.com>2016-12-14 12:23:40 -0800
commit3dbaad0a1f27b96462541e1189efe37ffa913e9a (patch)
treef50f770a39bc5d9fd9296862b4806c5dd7d0eed6 /software/dhrystone
parent82d5cab92318ca82f6fb95921cd70e4aefa28cd9 (diff)
Refactor libc stubs into libwrap
The --wrap feature of GNU ld supports a cleaner framework for linking in alternative implementations of libc functions without cpp hacks. Place wrappers in separate object files to reduce static code size.
Diffstat (limited to 'software/dhrystone')
-rw-r--r--software/dhrystone/.gitignore1
-rw-r--r--software/dhrystone/Makefile5
-rw-r--r--software/dhrystone/dhry_printf.c4
-rw-r--r--software/dhrystone/dhry_stubs.c15
4 files changed, 7 insertions, 18 deletions
diff --git a/software/dhrystone/.gitignore b/software/dhrystone/.gitignore
new file mode 100644
index 0000000..eb51a6c
--- /dev/null
+++ b/software/dhrystone/.gitignore
@@ -0,0 +1 @@
+dhrystone
diff --git a/software/dhrystone/Makefile b/software/dhrystone/Makefile
index 2058ca1..a55b1ec 100644
--- a/software/dhrystone/Makefile
+++ b/software/dhrystone/Makefile
@@ -5,10 +5,11 @@ C_SRCS := dhry_stubs.c dhry_printf.c
HEADERS := dhry.h
DHRY_SRCS := dhry_1.c dhry_2.c
-DHRY_CFLAGS := -O2 -DTIME -fno-inline -Wno-implicit
+DHRY_CFLAGS := -O2 -DTIME -fno-inline -fno-builtin-printf -Wno-implicit
XLEN ?= 32
-CFLAGS := -Dscanf=dhry_scanf -Dprintf=dhry_printf -Os -fno-common
+CFLAGS := -Os -fno-common
+LDFLAGS := -Wl,--wrap=scanf -Wl,--wrap=printf
DHRY_OBJS := $(patsubst %.c,%.o,$(DHRY_SRCS))
LINK_OBJS := $(DHRY_OBJS)
diff --git a/software/dhrystone/dhry_printf.c b/software/dhrystone/dhry_printf.c
index 1fdaac4..025d231 100644
--- a/software/dhrystone/dhry_printf.c
+++ b/software/dhrystone/dhry_printf.c
@@ -246,7 +246,7 @@ static void vprintfmt(void (*putch)(int, void**), void **putdat, const char *fmt
}
}
-int printf(const char* fmt, ...)
+int __wrap_printf(const char* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
@@ -257,7 +257,7 @@ int printf(const char* fmt, ...)
return 0; // incorrect return value, but who cares, anyway?
}
-int sprintf(char* str, const char* fmt, ...)
+int __wrap_sprintf(char* str, const char* fmt, ...)
{
va_list ap;
char* str0 = str;
diff --git a/software/dhrystone/dhry_stubs.c b/software/dhrystone/dhry_stubs.c
index d384bf1..d3bd14c 100644
--- a/software/dhrystone/dhry_stubs.c
+++ b/software/dhrystone/dhry_stubs.c
@@ -12,20 +12,7 @@ long time(void)
}
// set the number of dhrystone iterations
-void scanf(const char* fmt, int* n)
+void __wrap_scanf(const char* fmt, int* n)
{
*n = 1500000;
}
-
-// simple memory allocator
-void* malloc(unsigned long sz)
-{
- extern void* sbrk(long);
- void* res = sbrk(sz);
- if ((long)res == -1)
- return 0;
- return res;
-}
-
-// simple memory deallocator
-void free(void* ptr) {}