blob: 58cb0a0c8ed38448fc1c817fc20a7b4f20b2a7c4 [file] [log] [blame]
/*--------------------------------------------------------------------*/
/*--- Default panicky definitions of template functions that skins ---*/
/*--- should override. ---*/
/*--- vg_defaults.c ---*/
/*--------------------------------------------------------------------*/
/*
This file is part of Valgrind, an extensible x86 protected-mode
emulator for monitoring program execution on x86-Unixes.
Copyright (C) 2000-2003 Nicholas Nethercote
njn25@cam.ac.uk
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307, USA.
The GNU General Public License is contained in the file COPYING.
*/
/* These functions aren't intended to be run. Replacement functions used by
* the chosen skin are substituted by compiling the skin into a .so and
* LD_PRELOADing it. Nasty :) */
#include "vg_include.h"
/* ---------------------------------------------------------------------
Error messages (for malformed skins)
------------------------------------------------------------------ */
/* If the skin fails to define one or more of the required functions,
* make it very clear what went wrong! */
static __attribute__ ((noreturn))
void fund_panic ( Char* fn )
{
VG_(printf)(
"\nSkin error:\n"
" The skin you have selected is missing the function `%s',\n"
" which is required.\n\n",
fn);
VG_(skin_panic)("Missing skin function");
}
static __attribute__ ((noreturn))
void non_fund_panic ( Char* fn )
{
VG_(printf)(
"\nSkin error:\n"
" The skin you have selected is missing the function `%s'\n"
" required by one of its needs.\n\n",
fn);
VG_(skin_panic)("Missing skin function");
}
static __attribute__ ((noreturn))
void malloc_panic ( Char* fn )
{
VG_(printf)(
"\nSkin error:\n"
" The skin you have selected is missing the function `%s'\n"
" required because it is replacing malloc() et al.\n\n",
fn);
VG_(skin_panic)("Missing skin function");
}
#define FUND(proto) \
__attribute__((weak)) \
proto \
{ \
fund_panic(__PRETTY_FUNCTION__); \
}
#define NON_FUND(proto) \
__attribute__((weak)) \
proto \
{ \
non_fund_panic(__PRETTY_FUNCTION__); \
}
#define MALLOC(proto) \
__attribute__((weak)) \
proto \
{ \
malloc_panic(__PRETTY_FUNCTION__); \
}
/* ---------------------------------------------------------------------
Default functions
------------------------------------------------------------------ */
/* Fundamental template functions */
FUND( void SK_(pre_clo_init) (void) );
FUND( void SK_(post_clo_init)(void) );
FUND( UCodeBlock* SK_(instrument) (UCodeBlock* cb, Addr not_used) );
FUND( void SK_(fini) (Int exitcode) );
/* For error reporting and suppression handling */
NON_FUND( Bool SK_(eq_SkinError)(VgRes res, Error* e1, Error* e2) );
NON_FUND( void SK_(pp_SkinError)(Error* err) );
NON_FUND( UInt SK_(update_extra)(Error* err) );
NON_FUND( Bool SK_(recognised_suppression)(Char* name, Supp* su) );
NON_FUND( Bool SK_(read_extra_suppression_info)(Int fd, Char* buf, Int nBuf,
Supp* su) );
NON_FUND( Bool SK_(error_matches_suppression)(Error* err, Supp* su) );
NON_FUND( Char* SK_(get_error_name)(Error* err) );
NON_FUND( void SK_(print_extra_suppression_info)(Error* err) );
/* For throwing out basic block level info when code is invalidated */
NON_FUND( void SK_(discard_basic_block_info)(Addr a, UInt size) );
/* For throwing out basic block level info when code is invalidated */
NON_FUND( void SK_(written_shadow_regs_values)(UInt* gen_reg, UInt* eflags) );
/* Command line arg handling functions */
NON_FUND( Bool SK_(process_cmd_line_option)(Char* argv) );
NON_FUND( void SK_(print_usage)(void) );
NON_FUND( void SK_(print_debug_usage)(void) );
/* Client request template function */
NON_FUND( Bool SK_(handle_client_request)(ThreadState* tst, UInt* arg_block,
UInt *ret) );
/* UCode extension */
NON_FUND( void SK_(emit_XUInstr) (UInstr* u, RRegSet regs_live_before) );
NON_FUND( Bool SK_(sane_XUInstr) (Bool beforeRA, Bool beforeLiveness,
UInstr* u) );
NON_FUND( Char* SK_(name_XUOpcode) (Opcode opc) );
NON_FUND( void SK_(pp_XUInstr) (UInstr* u) );
NON_FUND( Int SK_(get_Xreg_usage)(UInstr* u, Tag tag, Int* regs,
Bool* isWrites) );
/* Syscall wrapping */
NON_FUND( void* SK_(pre_syscall) (ThreadId tid, UInt syscallno,
Bool is_blocking) );
NON_FUND( void SK_(post_syscall)(ThreadId tid, UInt syscallno,
void* pre_result, Int res, Bool is_blocking) );
/* Sanity checks */
NON_FUND( Bool SK_(cheap_sanity_check)(void) );
NON_FUND( Bool SK_(expensive_sanity_check)(void) );
/*------------------------------------------------------------*/
/*--- Replacing malloc et al ---*/
/*------------------------------------------------------------*/
/* Default redzone for CLIENT arena of Valgrind's malloc() is 4 bytes */
__attribute__ ((weak))
UInt VG_(vg_malloc_redzone_szB) = 4;
Bool VG_(sk_malloc_called_by_scheduler) = False;
/* If the skin hasn't replaced malloc(), this one can be called from the
scheduler, for the USERREQ__MALLOC user request used by vg_libpthread.c.
(Nb: it cannot call glibc's malloc().) The lock variable ensures that the
scheduler is the only place this can be called from; this ensures that a
malloc()-replacing skin cannot forget to implement SK_(malloc)() or
SK_(free)(). */
__attribute__ ((weak))
void* SK_(malloc)( ThreadState* tst, Int size )
{
if (VG_(sk_malloc_called_by_scheduler))
return VG_(cli_malloc)(4, size);
else
malloc_panic(__PRETTY_FUNCTION__);
}
__attribute__ ((weak))
void SK_(free)( ThreadState* tst, void* p )
{
/* see comment for SK_(malloc)() above */
if (VG_(sk_malloc_called_by_scheduler))
VG_(cli_free)(p);
else
malloc_panic(__PRETTY_FUNCTION__);
}
MALLOC( void* SK_(__builtin_new) ( ThreadState* tst, Int size ) );
MALLOC( void* SK_(__builtin_vec_new)( ThreadState* tst, Int size ) );
MALLOC( void* SK_(memalign) ( ThreadState* tst, Int align, Int size ) );
MALLOC( void* SK_(calloc) ( ThreadState* tst, Int nmemb, Int size ) );
MALLOC( void SK_(__builtin_delete) ( ThreadState* tst, void* p ) );
MALLOC( void SK_(__builtin_vec_delete) ( ThreadState* tst, void* p ) );
MALLOC( void* SK_(realloc) ( ThreadState* tst, void* p,
Int new_size ) );
/*--------------------------------------------------------------------*/
/*--- end vg_defaults.c ---*/
/*--------------------------------------------------------------------*/