|
From: <sv...@va...> - 2005-09-13 12:45:21
|
Author: sewardj
Date: 2005-09-13 13:45:13 +0100 (Tue, 13 Sep 2005)
New Revision: 4639
Log:
In struct NSegment, merge the isClient field into the kind field, so
as to avoid having to represnet nonsensical client-vs-non-client
distinctions for SkFree and SkResvn segments.
Modified:
branches/ASPACEM/coregrind/m_aspacemgr/aspacemgr.c
branches/ASPACEM/coregrind/m_signals.c
branches/ASPACEM/coregrind/m_syswrap/syswrap-generic.c
branches/ASPACEM/coregrind/m_translate.c
branches/ASPACEM/coregrind/pub_core_aspacemgr.h
Modified: branches/ASPACEM/coregrind/m_aspacemgr/aspacemgr.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/ASPACEM/coregrind/m_aspacemgr/aspacemgr.c 2005-09-13 11:57:5=
1 UTC (rev 4638)
+++ branches/ASPACEM/coregrind/m_aspacemgr/aspacemgr.c 2005-09-13 12:45:1=
3 UTC (rev 4639)
@@ -1602,12 +1602,14 @@
if (i < 0)
return NULL;
}
- if (nsegments[i].kind =3D=3D SkFile=20
- || nsegments[i].kind =3D=3D SkAnon
- || nsegments[i].kind =3D=3D SkResvn)
- return &nsegments[i];
- else=20
- return NULL;
+ switch (nsegments[i].kind) {
+ case SkFileC: case SkFileV:=20
+ case SkAnonC: case SkAnonV: case SkResvn:
+ return &nsegments[i];
+ default:
+ break;
+ }
+ return NULL;
}
=20
=20
@@ -1632,9 +1634,10 @@
Int i;
ULong total =3D 0;
for (i =3D 0; i < nsegments_used; i++) {
- if (nsegments[i].kind !=3D SkAnon)
- continue;
- total +=3D (ULong)nsegments[i].end - (ULong)nsegments[i].start + 1=
ULL;
+ if (nsegments[i].kind =3D=3D SkAnonC || nsegments[i].kind =3D=3D S=
kAnonV) {
+ total +=3D (ULong)nsegments[i].end=20
+ - (ULong)nsegments[i].start + 1ULL;
+ }
}
return total;
}
@@ -1661,8 +1664,7 @@
iLo =3D find_nsegment_idx(start);
iHi =3D find_nsegment_idx(start + len - 1);
for (i =3D iLo; i <=3D iHi; i++) {
- if (nsegments[i].isClient
- && (nsegments[i].kind =3D=3D SkFile || nsegments[i].kind =3D=3D=
SkAnon)
+ if ((nsegments[i].kind =3D=3D SkFileC || nsegments[i].kind =3D=3D =
SkAnonC)
&& (needR ? nsegments[i].hasR : True)
&& (needW ? nsegments[i].hasW : True)
&& (needX ? nsegments[i].hasX : True)) {
@@ -1685,8 +1687,10 @@
{
switch (seg->kind) {
case SkFree: return " ";
- case SkAnon: return seg->isClient ? "anon" : "ANON";
- case SkFile: return seg->isClient ? "file" : "FILE";
+ case SkAnonC: return "anon";
+ case SkAnonV: return "ANON";
+ case SkFileC: return "file";
+ case SkFileV: return "FILE";
case SkResvn: return "RSVN";
default: return "????";
}
@@ -1732,7 +1736,7 @@
);
break;
=20
- case SkAnon:
+ case SkAnonC: case SkAnonV:
VG_(debugLog)(
logLevel, "aspacem",
"%3d: %s %08llx-%08llx %s %c%c%c%c d=3D0x%03x i=3D%-7d o=3D%=
-7lld (%d)\n",
@@ -1744,7 +1748,7 @@
);
break;
=20
- case SkFile:
+ case SkFileC: case SkFileV:
VG_(debugLog)(
logLevel, "aspacem",
"%3d: %s %08llx-%08llx %s %c%c%c%c d=3D0x%03x i=3D%-7d o=3D%=
-7lld (%d)\n",
@@ -1921,8 +1925,7 @@
=20
static void init_nsegment ( /*OUT*/NSegment* seg )
{
- seg->kind =3D SkAnon;
- seg->isClient =3D False;
+ seg->kind =3D SkFree;
seg->start =3D 0;
seg->end =3D 0;
seg->smode =3D SmFixed;
@@ -1942,9 +1945,9 @@
aspacem_assert(VG_IS_PAGE_ALIGNED(start));
aspacem_assert(VG_IS_PAGE_ALIGNED(end+1));
init_nsegment(seg);
- seg->kind =3D SkResvn;
+ seg->kind =3D SkResvn;
seg->start =3D start;
- seg->end =3D end;
+ seg->end =3D end;
}
=20
=20
@@ -1970,13 +1973,13 @@
seg.hasX =3D toBool(prot & VKI_PROT_EXEC);
seg.hasT =3D False;
=20
- seg.kind =3D SkAnon;
+ seg.kind =3D SkAnonV;
if (filename) {=20
- seg.kind =3D SkFile;
+ seg.kind =3D SkFileV;
seg.fnIdx =3D allocate_segname( filename );
}
=20
- show_nsegment( 2,0, &seg );
+ if (0) show_nsegment( 2,0, &seg );
add_segment( &seg );
}
=20
@@ -2168,7 +2171,7 @@
Bool allow =3D True;
for (i =3D iLo; i <=3D iHi; i++) {
if (nsegments[i].kind =3D=3D SkFree
- || (nsegments[i].kind =3D=3D SkFile && nsegments[i].isClien=
t)) {
+ || nsegments[i].kind =3D=3D SkFileC) {
/* ok */
} else {
allow =3D False;
@@ -2284,14 +2287,13 @@
aspacem_assert(VG_IS_PAGE_ALIGNED(a));
aspacem_assert(VG_IS_PAGE_ALIGNED(len));
init_nsegment( &seg );
- seg.kind =3D (flags & VKI_MAP_ANONYMOUS) ? SkAnon : SkFile;
- seg.isClient =3D True;
- seg.start =3D a;
- seg.end =3D a + len - 1;
- seg.offset =3D offset;
- seg.hasR =3D toBool(prot & VKI_PROT_READ);
- seg.hasW =3D toBool(prot & VKI_PROT_WRITE);
- seg.hasX =3D toBool(prot & VKI_PROT_EXEC);
+ seg.kind =3D (flags & VKI_MAP_ANONYMOUS) ? SkAnonC : SkFileC;
+ seg.start =3D a;
+ seg.end =3D a + len - 1;
+ seg.offset =3D offset;
+ seg.hasR =3D toBool(prot & VKI_PROT_READ);
+ seg.hasW =3D toBool(prot & VKI_PROT_WRITE);
+ seg.hasX =3D toBool(prot & VKI_PROT_EXEC);
/* TODO: what about seg.hasT ? */
if (get_inode_for_fd(fd, &dev, &ino)) {
seg.dev =3D dev;
@@ -2319,7 +2321,7 @@
if (iLo =3D=3D iHi=20
&& nsegments[iLo].start =3D=3D start=20
&& nsegments[iLo].end+1 =3D=3D start+len
- && (nsegments[iLo].kind =3D=3D SkFile || nsegments[iLo].kind =3D=3D=
SkAnon)) {
+ && (nsegments[iLo].kind =3D=3D SkFileC || nsegments[iLo].kind =3D=
=3D SkAnonC)) {
nsegments[iLo].hasR =3D toBool(prot & VKI_PROT_READ);
nsegments[iLo].hasW =3D toBool(prot & VKI_PROT_WRITE);
nsegments[iLo].hasX =3D toBool(prot & VKI_PROT_EXEC);
@@ -2403,14 +2405,13 @@
=20
/* Ok, the mapping succeeded. Now notify the interval map. */
init_nsegment( &seg );
- seg.kind =3D SkFile;
- seg.isClient =3D True;
- seg.start =3D start;
- seg.end =3D seg.start + VG_PGROUNDUP(length) - 1;
- seg.offset =3D offset;
- seg.hasR =3D toBool(prot & VKI_PROT_READ);
- seg.hasW =3D toBool(prot & VKI_PROT_WRITE);
- seg.hasX =3D toBool(prot & VKI_PROT_EXEC);
+ seg.kind =3D SkFileC;
+ seg.start =3D start;
+ seg.end =3D seg.start + VG_PGROUNDUP(length) - 1;
+ seg.offset =3D offset;
+ seg.hasR =3D toBool(prot & VKI_PROT_READ);
+ seg.hasW =3D toBool(prot & VKI_PROT_WRITE);
+ seg.hasX =3D toBool(prot & VKI_PROT_EXEC);
if (get_inode_for_fd(fd, &dev, &ino)) {
seg.dev =3D dev;
seg.ino =3D ino;
@@ -2468,13 +2469,12 @@
=20
/* Ok, the mapping succeeded. Now notify the interval map. */
init_nsegment( &seg );
- seg.kind =3D SkAnon;
- seg.isClient =3D True;
- seg.start =3D start;
- seg.end =3D seg.start + VG_PGROUNDUP(length) - 1;
- seg.hasR =3D toBool(prot & VKI_PROT_READ);
- seg.hasW =3D toBool(prot & VKI_PROT_WRITE);
- seg.hasX =3D toBool(prot & VKI_PROT_EXEC);
+ seg.kind =3D SkAnonC;
+ seg.start =3D start;
+ seg.end =3D seg.start + VG_PGROUNDUP(length) - 1;
+ seg.hasR =3D toBool(prot & VKI_PROT_READ);
+ seg.hasW =3D toBool(prot & VKI_PROT_WRITE);
+ seg.hasX =3D toBool(prot & VKI_PROT_EXEC);
add_segment( &seg );
=20
return sres;
@@ -2525,13 +2525,12 @@
=20
/* Ok, the mapping succeeded. Now notify the interval map. */
init_nsegment( &seg );
- seg.kind =3D SkAnon;
- seg.isClient =3D True;
- seg.start =3D advised;
- seg.end =3D seg.start + VG_PGROUNDUP(length) - 1;
- seg.hasR =3D toBool(prot & VKI_PROT_READ);
- seg.hasW =3D toBool(prot & VKI_PROT_WRITE);
- seg.hasX =3D toBool(prot & VKI_PROT_EXEC);
+ seg.kind =3D SkAnonC;
+ seg.start =3D advised;
+ seg.end =3D seg.start + VG_PGROUNDUP(length) - 1;
+ seg.hasR =3D toBool(prot & VKI_PROT_READ);
+ seg.hasW =3D toBool(prot & VKI_PROT_WRITE);
+ seg.hasX =3D toBool(prot & VKI_PROT_EXEC);
add_segment( &seg );
=20
return sres;
@@ -2584,13 +2583,12 @@
=20
/* Ok, the mapping succeeded. Now notify the interval map. */
init_nsegment( &seg );
- seg.kind =3D SkAnon;
- seg.isClient =3D False;
- seg.start =3D advised;
- seg.end =3D seg.start + VG_PGROUNDUP(length) - 1;
- seg.hasR =3D True;
- seg.hasW =3D True;
- seg.hasX =3D True;
+ seg.kind =3D SkAnonV;
+ seg.start =3D advised;
+ seg.end =3D seg.start + VG_PGROUNDUP(length) - 1;
+ seg.hasR =3D True;
+ seg.hasW =3D True;
+ seg.hasX =3D True;
add_segment( &seg );
=20
return sres;
@@ -2663,7 +2661,7 @@
segA =3D segAddr_to_index( seg );
aspacem_assert(segA >=3D 0 && segA < nsegments_used);
=20
- if (nsegments[segA].kind !=3D SkAnon)
+ if (nsegments[segA].kind !=3D SkAnonC && nsegments[segA].kind !=3D Sk=
AnonV)
return False;
=20
if (delta =3D=3D 0)
Modified: branches/ASPACEM/coregrind/m_signals.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/ASPACEM/coregrind/m_signals.c 2005-09-13 11:57:51 UTC (rev 4=
638)
+++ branches/ASPACEM/coregrind/m_signals.c 2005-09-13 12:45:13 UTC (rev 4=
639)
@@ -1709,7 +1709,7 @@
NSegment* seg_next =3D seg ? VG_(am_next_nsegment)( seg, True/*fwds*/=
)
: NULL;
=20
- if (seg && seg->kind =3D=3D SkAnon)
+ if (seg && seg->kind =3D=3D SkAnonC)
/* addr is already mapped. Nothing to do. */
return True;
=20
@@ -1720,8 +1720,7 @@
&& seg->kind =3D=3D SkResvn
&& seg->smode =3D=3D SmUpper
&& seg_next
- && seg_next->kind =3D=3D SkAnon
- && seg_next->isClient
+ && seg_next->kind =3D=3D SkAnonC
&& seg->end+1 =3D=3D seg_next->start))
return False;
=20
@@ -1870,8 +1869,7 @@
&& seg->kind =3D=3D SkResvn
&& seg->smode =3D=3D SmUpper
&& seg_next
- && seg_next->kind =3D=3D SkAnon
- && seg_next->isClient
+ && seg_next->kind =3D=3D SkAnonC
&& seg->end+1 =3D=3D seg_next->start
&& fault >=3D (esp - VG_STACK_REDZONE_SZB)) {
/* If the fault address is above esp but below the current known
Modified: branches/ASPACEM/coregrind/m_syswrap/syswrap-generic.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/ASPACEM/coregrind/m_syswrap/syswrap-generic.c 2005-09-13 11:=
57:51 UTC (rev 4638)
+++ branches/ASPACEM/coregrind/m_syswrap/syswrap-generic.c 2005-09-13 12:=
45:13 UTC (rev 4639)
@@ -832,7 +832,7 @@
/* These should be assured by setup_client_dataseg in m_main. */
vg_assert(aseg);
vg_assert(rseg);
- vg_assert(aseg->kind =3D=3D SkAnon);
+ vg_assert(aseg->kind =3D=3D SkAnonC);
vg_assert(rseg->kind =3D=3D SkResvn);
vg_assert(aseg->end+1 =3D=3D rseg->start);
=20
Modified: branches/ASPACEM/coregrind/m_translate.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/ASPACEM/coregrind/m_translate.c 2005-09-13 11:57:51 UTC (rev=
4638)
+++ branches/ASPACEM/coregrind/m_translate.c 2005-09-13 12:45:13 UTC (rev=
4639)
@@ -410,8 +410,7 @@
ThreadId tid =3D chase_into_ok__CLOSURE_tid;
NSegment* seg =3D VG_(am_find_nsegment)(addr);
if (seg
- && (seg->kind =3D=3D SkAnon || seg->kind =3D=3D SkFile)
- && seg->isClient
+ && (seg->kind =3D=3D SkAnonC || seg->kind =3D=3D SkFileC)
&& seg->start <=3D VG_(get_SP)(tid)
&& VG_(get_SP)(tid)+sizeof(Word)-1 <=3D seg->end)
goto dontchase;
@@ -533,8 +532,7 @@
seg =3D VG_(am_find_nsegment)(orig_addr);
=20
if (seg =3D=3D NULL=20
- || !(seg->kind =3D=3D SkAnon || seg->kind =3D=3D SkFile)
- || !seg->isClient
+ || !(seg->kind =3D=3D SkAnonC || seg->kind =3D=3D SkFileC)
|| !seg->hasX) {
=20
/* U R busted, sonny. Place your hands on your head and step
Modified: branches/ASPACEM/coregrind/pub_core_aspacemgr.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/ASPACEM/coregrind/pub_core_aspacemgr.h 2005-09-13 11:57:51 U=
TC (rev 4638)
+++ branches/ASPACEM/coregrind/pub_core_aspacemgr.h 2005-09-13 12:45:13 U=
TC (rev 4639)
@@ -175,10 +175,12 @@
/* Describes segment kinds. */
typedef
enum {
- SkFree, // unmapped space
- SkAnon, // anonymous mapping
- SkFile, // mapping to a file
- SkResvn // reservation
+ 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
+ SkResvn // reservation
}
MKind;
=20
@@ -196,13 +198,13 @@
kind =3D=3D SkFree:
// the only meaningful fields are .start and .end
=20
- kind =3D=3D SkAnon:
+ kind =3D=3D SkAnon{C,V}:
// the segment may be resized if required
// there's no associated file:
dev=3D=3Dino=3D=3Dfoff =3D 0, fnidx =3D=3D -1
// segment may have permissions
=20
- kind =3D=3D SkFile
+ kind =3D=3D SkFile{C,V}:
// the segment may not be resized:
moveLo =3D=3D moveHi =3D=3D NotMovable, maxlen =3D=3D 0
// there is an associated file
@@ -215,24 +217,23 @@
// segment has no permissions
hasR=3D=3DhasW=3D=3DhasX=3D=3DanyTranslated =3D=3D False
=20
- Also: if !isClient then anyTranslated=3D=3DFalse
+ Also: anyTranslated=3D=3DTrue is only allowed in SkFileV and SkAnon=
V
(viz, not allowed to make translations from non-client areas)
*/
typedef
struct {
MKind kind;
- Bool isClient;
- /* Extent (SkFree, SkAnon, SkFile, SkResvn) */
+ /* 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 only) */
+ /* Associated file (SkFile{C,V} only) */
UInt dev;
UInt ino;
ULong offset;
Int fnIdx; // file name table index, if name is known
- /* Permissions (SkAnon, SkFile only) */
+ /* Permissions (SkAnon{C,V}, SkFile{C,V} only) */
Bool hasR;
Bool hasW;
Bool hasX;
|