From 8fdce540fed17630af2fe1412c963167e0a63a9c Mon Sep 17 00:00:00 2001 From: Patrick Williams Date: Wed, 22 Aug 2012 17:18:45 -0500 Subject: Memory profiling tools. Change-Id: I4a9cfc1f55c09ff6d02dce80889ac2e3150ab137 RTC: 44504 Reviewed-on: http://gfw160.austin.ibm.com:8080/gerrit/1619 Tested-by: Jenkins Server Reviewed-by: Douglas R. Gilbert Reviewed-by: Daniel M. Crowell Reviewed-by: A. Patrick Williams III --- src/lib/makefile | 48 +++++++++++++------------ src/lib/stdlib.C | 108 ++++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 109 insertions(+), 47 deletions(-) (limited to 'src/lib') diff --git a/src/lib/makefile b/src/lib/makefile index b7cd3196e..4b1d006db 100644 --- a/src/lib/makefile +++ b/src/lib/makefile @@ -1,25 +1,25 @@ -# IBM_PROLOG_BEGIN_TAG -# This is an automatically generated prolog. -# -# $Source: src/lib/makefile $ -# -# IBM CONFIDENTIAL -# -# COPYRIGHT International Business Machines Corp. 2010 - 2011 -# -# p1 -# -# Object Code Only (OCO) source materials -# Licensed Internal Code Source Materials -# IBM HostBoot Licensed Internal Code -# -# The source code for this program is not published or other- -# wise divested of its trade secrets, irrespective of what has -# been deposited with the U.S. Copyright Office. -# -# Origin: 30 -# -# IBM_PROLOG_END +# IBM_PROLOG_BEGIN_TAG +# This is an automatically generated prolog. +# +# $Source: src/lib/makefile $ +# +# IBM CONFIDENTIAL +# +# COPYRIGHT International Business Machines Corp. 2010,2012 +# +# p1 +# +# Object Code Only (OCO) source materials +# Licensed Internal Code Source Materials +# IBM HostBoot Licensed Internal Code +# +# The source code for this program is not published or otherwise +# divested of its trade secrets, irrespective of what has been +# deposited with the U.S. Copyright Office. +# +# Origin: 30 +# +# IBM_PROLOG_END_TAG ROOTPATH = ../.. OBJS = string.o string_ext.o stdlib.o ctype.o assert.o stdio.o math.o @@ -27,4 +27,8 @@ OBJS += syscall_stub.o syscall_task.o syscall_msg.o OBJS += syscall_mmio.o syscall_time.o sync.o syscall_misc.o OBJS += syscall_mm.o splaytree.o cxxtest_data.o +ifdef HOSTBOOT_MEMORY_LEAKS +EXTRACOMMONFLAGS += -DHOSTBOOT_MEMORY_LEAKS=1 +endif + include ${ROOTPATH}/config.mk diff --git a/src/lib/stdlib.C b/src/lib/stdlib.C index f0c3fad74..50d776cd5 100644 --- a/src/lib/stdlib.C +++ b/src/lib/stdlib.C @@ -1,25 +1,25 @@ -// IBM_PROLOG_BEGIN_TAG -// This is an automatically generated prolog. -// -// $Source: src/lib/stdlib.C $ -// -// IBM CONFIDENTIAL -// -// COPYRIGHT International Business Machines Corp. 2010 - 2011 -// -// p1 -// -// Object Code Only (OCO) source materials -// Licensed Internal Code Source Materials -// IBM HostBoot Licensed Internal Code -// -// The source code for this program is not published or other- -// wise divested of its trade secrets, irrespective of what has -// been deposited with the U.S. Copyright Office. -// -// Origin: 30 -// -// IBM_PROLOG_END +/* IBM_PROLOG_BEGIN_TAG */ +/* This is an automatically generated prolog. */ +/* */ +/* $Source: src/lib/stdlib.C $ */ +/* */ +/* IBM CONFIDENTIAL */ +/* */ +/* COPYRIGHT International Business Machines Corp. 2010,2012 */ +/* */ +/* p1 */ +/* */ +/* Object Code Only (OCO) source materials */ +/* Licensed Internal Code Source Materials */ +/* IBM HostBoot Licensed Internal Code */ +/* */ +/* The source code for this program is not published or otherwise */ +/* divested of its trade secrets, irrespective of what has been */ +/* deposited with the U.S. Copyright Office. */ +/* */ +/* Origin: 30 */ +/* */ +/* IBM_PROLOG_END_TAG */ #include #include #include @@ -27,6 +27,46 @@ #include #include +#ifdef HOSTBOOT_MEMORY_LEAKS +#include + +/** Memory allocation function type + * + * These are used as parameters to the magic instruction so that the debug + * tools can determine what memory allocation function was being called. + */ +enum MemoryLeak_FunctionType +{ + MEMORYLEAK_MALLOC = 0, + MEMORYLEAK_REALLOC = 1, + MEMORYLEAK_FREE = 2 +}; + +/** @fn memoryleak_magic_instruction + * @brief Triggers the simics memoryleak analysis magic hap-handler. + * + * Arranges the memory allocation parameters into registers according to the + * Power ABI and triggers the magic instruction. The ABI puts parameter 0-3 + * into registers r3-r6. + * + * Function attribute of "noinline" is required to ensure that the compiler + * treats this as a real function instead of attempting to inline it. If it + * were to inline it then the parameters wouldn't end up in the right register. + */ +static void memoryleak_magic_instruction(MemoryLeak_FunctionType func, + size_t size, + void* ptr, + void* ptr2) __attribute__((noinline)); + +static void memoryleak_magic_instruction(MemoryLeak_FunctionType func, + size_t size, + void* ptr, + void* ptr2) +{ + MAGIC_INSTRUCTION(MAGIC_MEMORYLEAK_FUNCTION); + return; +} +#endif #ifdef MEM_ALLOC_PROFILE // alloc profile @@ -58,7 +98,14 @@ void* malloc(size_t s) else if (s <= 2048) ++g_2k; else ++g_big; #endif - return HeapManager::allocate(s); + + void* result = HeapManager::allocate(s); + +#ifdef HOSTBOOT_MEMORY_LEAKS + memoryleak_magic_instruction(MEMORYLEAK_MALLOC, s, result, NULL); +#endif + + return result; } @@ -66,6 +113,10 @@ void free(void* p) { if (NULL == p) return; +#ifdef HOSTBOOT_MEMORY_LEAKS + memoryleak_magic_instruction(MEMORYLEAK_FREE, 0, p, NULL); +#endif + HeapManager::free(p); } @@ -74,8 +125,14 @@ void* realloc(void* p, size_t s) { if (NULL == p) return malloc(s); - return HeapManager::realloc(p,s); -} + void* result = HeapManager::realloc(p,s); + +#ifdef HOSTBOOT_MEMORY_LEAKS + memoryleak_magic_instruction(MEMORYLEAK_REALLOC, s, result, p); +#endif + + return result; +} void* calloc(size_t num, size_t size) { @@ -92,3 +149,4 @@ void* calloc(size_t num, size_t size) return mem; } + -- cgit v1.2.1