mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-08 13:01:17 +00:00
that changes will cause binary incompatibilities. Mostly done by hiding naked
structs with function calls.
Structs hidden in this way were: UCodeBlock, SkinSupp and SkinError (which were
merged back with CoreSupp and CoreError into single types Supp and Error),
ShadowChunk, VgDetails, VgNeeds and VgTrackEvents. The last three are the most
important ones, as they are (I think) the most likely to change.
Suitable get()/set() methods were defined for each one. The way UCodeBlocks
are copied for instrumentation by skins is a little different now, using
setup_UCodeBlock. Had to add a few other functions here n there. Changed
how SK_(complete_shadow_chunk) works a bit.
Added a file coregrind/vg_needs.c which contains all the get/set functions.
It's pretty simple.
The changes are not totally ideal -- eg. ShadowChunks has get()/set() methods
for its `next' field which arguably shouldn't be exposed (betraying the fact
that it's a linked list), and the get()/set() methods are a bit cumbersome at
times, esp. for `Error' because the fields are accessed quite a few times, and
the treatment of Supps and Errors is a bit inconsistent (but they are used in
different ways), and sizeof_shadow_blocks is still a hack. But still better
than naked structs. And one advantage is that a bit of sanity checking can be
performed by the get()/set() methods, as is done for VG_({get,set}_sc_extra)()
to make sure no reading/writing occurs outside the allowed area.
I didn't do it for UInstr, because its fields are accessed directly in lots and
lots of spots, which would have been a great big pain and I was a little
worried about overhead of calling lots of extra functions, although in practice
translation times are small enough that it probably doesn't matter.
Updated the example skin and the docs, too, hurrah.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@1314
276 lines
7.7 KiB
C
276 lines
7.7 KiB
C
|
|
/*--------------------------------------------------------------------*/
|
|
/*--- 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 ---*/
|
|
/*--------------------------------------------------------------------*/
|