mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-03 18:13:01 +00:00
126 lines
4.7 KiB
C
126 lines
4.7 KiB
C
|
|
/*--------------------------------------------------------------------*/
|
|
/*--- Function replacement and wrapping. pub_core_redir.h ---*/
|
|
/*--------------------------------------------------------------------*/
|
|
|
|
/*
|
|
This file is part of Valgrind, a dynamic binary instrumentation
|
|
framework.
|
|
|
|
Copyright (C) 2000-2008 Julian Seward
|
|
jseward@acm.org
|
|
|
|
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.
|
|
*/
|
|
|
|
#ifndef __PUB_CORE_REDIR_H
|
|
#define __PUB_CORE_REDIR_H
|
|
|
|
//--------------------------------------------------------------------
|
|
// PURPOSE: This module deals with:
|
|
// - code replacement: intercepting calls to client functions, and
|
|
// pointing them to a different piece of code.
|
|
// - loading notification: telling the core where certain client-space
|
|
// functions are when they get loaded.
|
|
// - function wrapping: add calls to code before and after client
|
|
// functions execute, for inspection and/or modification.
|
|
//--------------------------------------------------------------------
|
|
|
|
#include "pub_tool_redir.h"
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
// Notifications - by which we are told of state changes
|
|
//--------------------------------------------------------------------
|
|
|
|
/* Notify the module of a new DebugInfo (called from m_debuginfo). */
|
|
extern void VG_(redir_notify_new_DebugInfo)( DebugInfo* );
|
|
|
|
/* Notify the module of the disappearance of a DebugInfo (also called
|
|
from m_debuginfo). */
|
|
extern void VG_(redir_notify_delete_DebugInfo)( DebugInfo* );
|
|
|
|
/* Initialise the module, and load initial "hardwired" redirects. */
|
|
extern void VG_(redir_initialise)( void );
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
// Queries
|
|
//--------------------------------------------------------------------
|
|
|
|
/* This is the crucial redirection function. It answers the question:
|
|
should this code address be redirected somewhere else? It's used
|
|
just before translating a basic block. If a redir is found,
|
|
*isWrap allows to distinguish wrap- from replace- style
|
|
redirections. */
|
|
extern Addr VG_(redir_do_lookup) ( Addr orig, Bool* isWrap );
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
// Loading notification
|
|
//--------------------------------------------------------------------
|
|
|
|
/* Functions named with this macro have the property that the core will
|
|
be told what their address is when they are loaded. This can be useful
|
|
if the core wants to call them at some point, and so needs to know their
|
|
address. This is a weaker but more general mechanism than code
|
|
replacement.
|
|
|
|
Functions named with this macro should be in client space, ie. in
|
|
vgpreload_<tool>.h or vgpreload_core.h. */
|
|
|
|
#define VG_NOTIFY_ON_LOAD(name) _vgnU_##name
|
|
#define VG_NOTIFY_ON_LOAD_PREFIX "_vgnU_"
|
|
#define VG_NOTIFY_ON_LOAD_PREFIX_LEN 6
|
|
|
|
|
|
//--------------------------------------------------------------------
|
|
// Function wrapping
|
|
//--------------------------------------------------------------------
|
|
|
|
// This is currently not working(?) --njn
|
|
|
|
/* Wrapping machinery */
|
|
//enum return_type {
|
|
// RT_RETURN,
|
|
// RT_LONGJMP,
|
|
// RT_EXIT,
|
|
//};
|
|
//
|
|
//typedef struct _FuncWrapper FuncWrapper;
|
|
//struct _FuncWrapper {
|
|
// void *(*before)(va_list args);
|
|
// void (*after) (void *nonce, enum return_type, Word retval);
|
|
//};
|
|
//
|
|
//extern void VG_(wrap_function)(Addr eip, const FuncWrapper *wrapper);
|
|
//extern const FuncWrapper *VG_(is_wrapped)(Addr eip);
|
|
//extern Bool VG_(is_wrapper_return)(Addr eip);
|
|
|
|
/* Primary interface for adding wrappers for client-side functions. */
|
|
//extern CodeRedirect *VG_(add_wrapper)(const Char *from_lib, const Char *from_sym,
|
|
// const FuncWrapper *wrapper);
|
|
//
|
|
//extern Bool VG_(is_resolved)(const CodeRedirect *redir);
|
|
|
|
#endif // __PUB_CORE_REDIR_H
|
|
|
|
/*--------------------------------------------------------------------*/
|
|
/*--- end ---*/
|
|
/*--------------------------------------------------------------------*/
|