mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-03 18:13:01 +00:00
Memcheck, replacing the 9-bits-per-byte shadow memory representation to a 2-bits-per-byte representation (with possibly a little more on the side) by taking advantage of the fact that extremely few memory bytes are partially defined. For the SPEC2k benchmarks with "test" inputs, this speeds up Memcheck by a (geometric mean) factor of 1.20, and reduces the size of shadow memory by a (geometric mean) factor of 4.26. At the same time, Addrcheck is removed. It hadn't worked for quite some time, and with these improvements in Memcheck its raisons-d'etre have shrivelled so much that it's not worth the effort to keep around. Hooray! Nb: this code hasn't been tested on PPC. If things go wrong, look first in the fast stack-handling functions (eg. mc_new_mem_stack_160, MC_(helperc_MAKE_STACK_UNINIT)). git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5791
159 lines
5.4 KiB
C
159 lines
5.4 KiB
C
|
|
/*--------------------------------------------------------------------*/
|
|
/*--- Address space manager. pub_tool_aspacemgr.h ---*/
|
|
/*--------------------------------------------------------------------*/
|
|
|
|
/*
|
|
This file is part of Valgrind, a dynamic binary instrumentation
|
|
framework.
|
|
|
|
Copyright (C) 2000-2005 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_TOOL_ASPACEMGR_H
|
|
#define __PUB_TOOL_ASPACEMGR_H
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
// Definition of address-space segments
|
|
|
|
/* Describes segment kinds. */
|
|
typedef
|
|
enum {
|
|
SkFree, // unmapped space
|
|
SkAnonC, // anonymous mapping belonging to the client
|
|
SkAnonV, // anonymous mapping belonging to valgrind
|
|
SkFileC, // file mapping belonging to the client
|
|
SkFileV, // file mapping belonging to valgrind
|
|
SkShmC, // shared memory segment belonging to the client
|
|
SkResvn // reservation
|
|
}
|
|
SegKind;
|
|
|
|
/* Describes how a reservation segment can be resized. */
|
|
typedef
|
|
enum {
|
|
SmLower, // lower end can move up
|
|
SmFixed, // cannot be shrunk
|
|
SmUpper // upper end can move down
|
|
}
|
|
ShrinkMode;
|
|
|
|
/* Describes a segment. Invariants:
|
|
|
|
kind == SkFree:
|
|
// the only meaningful fields are .start and .end
|
|
|
|
kind == SkAnon{C,V}:
|
|
// smode==SmFixed
|
|
// there's no associated file:
|
|
dev==ino==foff = 0, fnidx == -1
|
|
// segment may have permissions
|
|
|
|
kind == SkFile{C,V}:
|
|
// smode==SmFixed
|
|
moveLo == moveHi == NotMovable, maxlen == 0
|
|
// there is an associated file
|
|
// segment may have permissions
|
|
|
|
kind == SkShmC:
|
|
// smode==SmFixed
|
|
// there's no associated file:
|
|
dev==ino==foff = 0, fnidx == -1
|
|
// segment may have permissions
|
|
|
|
kind == SkResvn
|
|
// the segment may be resized if required
|
|
// there's no associated file:
|
|
dev==ino==foff = 0, fnidx == -1
|
|
// segment has no permissions
|
|
hasR==hasW==hasX==anyTranslated == False
|
|
|
|
Also: anyTranslated==True is only allowed in SkFileV and SkAnonV
|
|
(viz, not allowed to make translations from non-client areas)
|
|
*/
|
|
typedef
|
|
struct {
|
|
SegKind kind;
|
|
/* Extent (SkFree, SkAnon{C,V}, SkFile{C,V}, SkResvn) */
|
|
Addr start; // lowest address in range
|
|
Addr end; // highest address in range
|
|
/* Shrinkable? (SkResvn only) */
|
|
ShrinkMode smode;
|
|
/* Associated file (SkFile{C,V} only) */
|
|
UWord dev;
|
|
UWord ino;
|
|
UInt mode;
|
|
ULong offset;
|
|
Int fnIdx; // file name table index, if name is known
|
|
/* Permissions (SkAnon{C,V}, SkFile{C,V} only) */
|
|
Bool hasR;
|
|
Bool hasW;
|
|
Bool hasX;
|
|
Bool hasT; // True --> translations have (or MAY have)
|
|
// been taken from this segment
|
|
Bool isCH; // True --> is client heap (SkAnonC ONLY)
|
|
/* Admin */
|
|
Bool mark;
|
|
}
|
|
NSegment;
|
|
|
|
|
|
/* Collect up the start addresses of all non-free, non-resvn segments.
|
|
The interface is a bit strange in order to avoid potential
|
|
segment-creation races caused by dynamic allocation of the result
|
|
buffer *starts.
|
|
|
|
The function first computes how many entries in the result
|
|
buffer *starts will be needed. If this number <= nStarts,
|
|
they are placed in starts[0..], and the number is returned.
|
|
If nStarts is not large enough, nothing is written to
|
|
starts[0..], and the negation of the size is returned.
|
|
|
|
Correct use of this function may mean calling it multiple times in
|
|
order to establish a suitably-sized buffer. */
|
|
extern Int VG_(am_get_segment_starts)( Addr* starts, Int nStarts );
|
|
|
|
|
|
// See pub_core_aspacemgr.h for description.
|
|
extern NSegment* VG_(am_find_nsegment) ( Addr a );
|
|
|
|
// See pub_core_aspacemgr.h for description.
|
|
extern HChar* VG_(am_get_filename)( NSegment* );
|
|
|
|
// See pub_core_aspacemgr.h for description.
|
|
extern Bool VG_(am_is_valid_for_client) ( Addr start, SizeT len,
|
|
UInt prot );
|
|
|
|
// See pub_core_aspacemgr.h for description.
|
|
/* Really just a wrapper around VG_(am_mmap_anon_float_valgrind). */
|
|
extern void* VG_(am_shadow_alloc)(SizeT size);
|
|
|
|
/* Unmap the given address range and update the segment array
|
|
accordingly. This fails if the range isn't valid for valgrind. */
|
|
extern SysRes VG_(am_munmap_valgrind)( Addr start, SizeT length );
|
|
|
|
#endif // __PUB_TOOL_ASPACEMGR_H
|
|
|
|
/*--------------------------------------------------------------------*/
|
|
/*--- end ---*/
|
|
/*--------------------------------------------------------------------*/
|