blob: 8778b846857746e1f1f7c4876d080564b159bb67 [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-2002 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");
}
/* ---------------------------------------------------------------------
Fundamental template functions
------------------------------------------------------------------ */
__attribute__ ((weak))
void SK_(pre_clo_init)( void )
{
fund_panic("SK_(pre_clo_init)");
}
__attribute__ ((weak))
void SK_(post_clo_init)(void)
{
fund_panic("SK_(post_clo_init)");
}
__attribute__ ((weak))
UCodeBlock* SK_(instrument)(UCodeBlock* cb, Addr not_used)
{
fund_panic("SK_(instrument)");
}
__attribute__ ((weak))
void SK_(fini)(void)
{
fund_panic("SK_(fini)");
}
/* ---------------------------------------------------------------------
For error reporting and suppression handling
------------------------------------------------------------------ */
__attribute__ ((weak))
Bool SK_(eq_SkinError)(VgRes res, Error* e1, Error* e2)
{
non_fund_panic("SK_(eq_SkinError)");
}
__attribute__ ((weak))
void SK_(pp_SkinError)(Error* err, void (*pp_ExeContext)(void))
{
non_fund_panic("SK_(pp_SkinError)");
}
__attribute__ ((weak))
void* SK_(dup_extra_and_update)(Error* err)
{
non_fund_panic("SK_(dup_extra_and_update)");
}
__attribute__ ((weak))
Bool SK_(recognised_suppression)(Char* name, Supp* su)
{
non_fund_panic("SK_(recognised_suppression)");
}
__attribute__ ((weak))
Bool SK_(read_extra_suppression_info)(Int fd, Char* buf, Int nBuf, Supp* su)
{
non_fund_panic("SK_(read_extra_suppression_info)");
}
__attribute__ ((weak))
Bool SK_(error_matches_suppression)(Error* err, Supp* su)
{
non_fund_panic("SK_(error_matches_suppression)");
}
/* ---------------------------------------------------------------------
For throwing out basic block level info when code is invalidated
------------------------------------------------------------------ */
__attribute__ ((weak))
void SK_(discard_basic_block_info)(Addr a, UInt size)
{
non_fund_panic("SK_(discard_basic_block_info)");
}
/* ---------------------------------------------------------------------
For throwing out basic block level info when code is invalidated
------------------------------------------------------------------ */
__attribute__ ((weak))
void SK_(written_shadow_regs_values)(UInt* gen_reg, UInt* eflags)
{
non_fund_panic("SK_(written_shadow_regs_values)");
}
/* ---------------------------------------------------------------------
Command line arg template function
------------------------------------------------------------------ */
__attribute__ ((weak))
Bool SK_(process_cmd_line_option)(Char* argv)
{
non_fund_panic("SK_(process_cmd_line_option)");
}
__attribute__ ((weak))
Char* SK_(usage)(void)
{
non_fund_panic("SK_(usage)");
}
/* ---------------------------------------------------------------------
Client request template function
------------------------------------------------------------------ */
__attribute__ ((weak))
Bool SK_(handle_client_request)(ThreadState* tst, UInt* arg_block, UInt *ret)
{
non_fund_panic("SK_(handle_client_request)");
}
/* ---------------------------------------------------------------------
UCode extension
------------------------------------------------------------------ */
__attribute__ ((weak))
void SK_(emit_XUInstr)(UInstr* u, RRegSet regs_live_before)
{
non_fund_panic("SK_(emit_XUInstr)");
}
__attribute__ ((weak))
Bool SK_(sane_XUInstr)(Bool beforeRA, Bool beforeLiveness, UInstr* u)
{
non_fund_panic("SK_(sane_XUInstr)");
}
__attribute__ ((weak))
Char* SK_(name_XUOpcode)(Opcode opc)
{
non_fund_panic("SK_(name_XUOpcode)");
}
__attribute__ ((weak))
void SK_(pp_XUInstr)(UInstr* u)
{
non_fund_panic("SK_(pp_XUInstr)");
}
__attribute__ ((weak))
Int SK_(get_Xreg_usage)(UInstr* u, Tag tag, Int* regs, Bool* isWrites)
{
non_fund_panic("SK_(get_Xreg_usage)");
}
/* ---------------------------------------------------------------------
Syscall wrapping
------------------------------------------------------------------ */
__attribute__ ((weak))
void* SK_(pre_syscall)(ThreadId tid, UInt syscallno, Bool is_blocking)
{
non_fund_panic("SK_(pre_syscall)");
}
__attribute__ ((weak))
void SK_(post_syscall)(ThreadId tid, UInt syscallno,
void* pre_result, Int res, Bool is_blocking)
{
non_fund_panic("SK_(post_syscall)");
}
/* ---------------------------------------------------------------------
Shadow chunks
------------------------------------------------------------------ */
__attribute__ ((weak))
void SK_(complete_shadow_chunk)( ShadowChunk* sc, ThreadState* tst )
{
non_fund_panic("SK_(complete_shadow_chunk)");
}
/* ---------------------------------------------------------------------
Alternative free()
------------------------------------------------------------------ */
__attribute__ ((weak))
void SK_(alt_free) ( ShadowChunk* sc, ThreadState* tst )
{
non_fund_panic("SK_(alt_free)");
}
/* ---------------------------------------------------------------------
Sanity checks
------------------------------------------------------------------ */
__attribute__ ((weak))
Bool SK_(cheap_sanity_check)(void)
{
non_fund_panic("SK_(cheap_sanity_check)");
}
__attribute__ ((weak))
Bool SK_(expensive_sanity_check)(void)
{
non_fund_panic("SK_(expensive_sanity_check)");
}
/*--------------------------------------------------------------------*/
/*--- end vg_defaults.c ---*/
/*--------------------------------------------------------------------*/