|
From: <sv...@va...> - 2008-02-14 16:55:05
|
Author: sewardj
Date: 2008-02-14 16:55:01 +0000 (Thu, 14 Feb 2008)
New Revision: 7408
Log:
More performance tuning (mostly pointless).
Modified:
branches/DATASYMS/coregrind/m_debuginfo/misc.c
branches/DATASYMS/coregrind/m_debuginfo/priv_misc.h
branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c
branches/DATASYMS/coregrind/m_debuginfo/tytypes.c
branches/DATASYMS/coregrind/m_xarray.c
branches/DATASYMS/include/pub_tool_xarray.h
Modified: branches/DATASYMS/coregrind/m_debuginfo/misc.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/misc.c 2008-02-14 12:09:04 UTC (rev 7407)
+++ branches/DATASYMS/coregrind/m_debuginfo/misc.c 2008-02-14 16:55:01 UTC (rev 7408)
@@ -60,14 +60,6 @@
}
-void ML_(copy_bytes_into_XA) ( XArray* /* of UChar */ xa,
- void* bytes, Word nbytes ) {
- Word i;
- for (i = 0; i < nbytes; i++)
- VG_(addToXA)( xa, & ((UChar*)bytes)[i] );
-}
-
-
/*--------------------------------------------------------------------*/
/*--- end misc.c ---*/
/*--------------------------------------------------------------------*/
Modified: branches/DATASYMS/coregrind/m_debuginfo/priv_misc.h
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/priv_misc.h 2008-02-14 12:09:04 UTC (rev 7407)
+++ branches/DATASYMS/coregrind/m_debuginfo/priv_misc.h 2008-02-14 16:55:01 UTC (rev 7408)
@@ -51,10 +51,6 @@
void ML_(dinfo_free)( void* v );
UChar* ML_(dinfo_strdup)( const UChar* str );
-/* Copy bytes into an XArray of what are assumed to be, well,
- bytes. */
-void ML_(copy_bytes_into_XA) ( XArray* /* of UChar */ xa,
- void* bytes, Word nbytes );
#endif /* ndef __PRIV_MISC_H */
Modified: branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c 2008-02-14 12:09:04 UTC (rev 7407)
+++ branches/DATASYMS/coregrind/m_debuginfo/readdwarf3.c 2008-02-14 16:55:01 UTC (rev 7408)
@@ -499,7 +499,7 @@
xa = VG_(newXA)( ML_(dinfo_zalloc), ML_(dinfo_free),
sizeof(UChar) );
- { UChar c = 1; /*biasMe*/ VG_(addToXA)( xa, &c ); }
+ { UChar c = 1; /*biasMe*/ VG_(addBytesToXA)( xa, &c, sizeof(c) ); }
base = 0;
while (True) {
@@ -536,26 +536,26 @@
UShort s;
UChar c;
c = 0; /* !isEnd*/
- VG_(addToXA)( xa, &c );
+ VG_(addBytesToXA)( xa, &c, sizeof(c) );
w = w1 + base + svma_of_referencing_CU;
- ML_(copy_bytes_into_XA)( xa, &w, sizeof(w) );
+ VG_(addBytesToXA)( xa, &w, sizeof(w) );
w = w2 -1 + base + svma_of_referencing_CU;
- ML_(copy_bytes_into_XA)( xa, &w, sizeof(w) );
+ VG_(addBytesToXA)( xa, &w, sizeof(w) );
s = (UShort)len;
- ML_(copy_bytes_into_XA)( xa, &s, sizeof(s) );
+ VG_(addBytesToXA)( xa, &s, sizeof(s) );
}
while (len > 0) {
UChar byte = get_UChar( &loc );
TRACE_D3("%02x", (UInt)byte);
if (acquire)
- VG_(addToXA)( xa, &byte );
+ VG_(addBytesToXA)( xa, &byte, 1 );
len--;
}
TRACE_D3("\n");
}
- { UChar c = 1; /*isEnd*/ VG_(addToXA)( xa, &c ); }
+ { UChar c = 1; /*isEnd*/ VG_(addBytesToXA)( xa, &c, sizeof(c) ); }
nbytes = VG_(sizeXA)( xa );
vg_assert(nbytes >= 1);
Modified: branches/DATASYMS/coregrind/m_debuginfo/tytypes.c
===================================================================
--- branches/DATASYMS/coregrind/m_debuginfo/tytypes.c 2008-02-14 12:09:04 UTC (rev 7407)
+++ branches/DATASYMS/coregrind/m_debuginfo/tytypes.c 2008-02-14 16:55:01 UTC (rev 7408)
@@ -402,7 +402,7 @@
UChar buf[32];
VG_(memset)(buf, 0, sizeof(buf));
VG_(sprintf)(buf, "%lu", uw);
- ML_(copy_bytes_into_XA)( xa, buf, VG_(strlen)(buf));
+ VG_(addBytesToXA)( xa, buf, VG_(strlen)(buf));
}
/* Describe where in the type 'offset' falls. Caller must
@@ -455,9 +455,9 @@
goto done; /* No. Give up. */
/* Yes. 'field' is it. */
if (!field->name) goto done;
- ML_(copy_bytes_into_XA)( xa, ".", 1 );
- ML_(copy_bytes_into_XA)( xa, field->name,
- VG_(strlen)(field->name) );
+ VG_(addBytesToXA)( xa, ".", 1 );
+ VG_(addBytesToXA)( xa, field->name,
+ VG_(strlen)(field->name) );
offset -= offMin;
ty = field->typeR;
if (!ty) goto done;
@@ -484,9 +484,9 @@
eszB = ML_(sizeOfType)( ty->Ty.Array.typeR );
if (eszB == 0) goto done;
ix = offset / eszB;
- ML_(copy_bytes_into_XA)( xa, "[", 1 );
+ VG_(addBytesToXA)( xa, "[", 1 );
copy_UWord_into_XA( xa, ix );
- ML_(copy_bytes_into_XA)( xa, "]", 1 );
+ VG_(addBytesToXA)( xa, "]", 1 );
ty = ty->Ty.Array.typeR;
offset -= ix * eszB;
/* keep going; look inside the array element. */
@@ -516,7 +516,7 @@
done:
*residual_offset = offset;
- ML_(copy_bytes_into_XA)( xa, "\0", 1 );
+ VG_(addBytesToXA)( xa, "\0", 1 );
return xa;
}
Modified: branches/DATASYMS/coregrind/m_xarray.c
===================================================================
--- branches/DATASYMS/coregrind/m_xarray.c 2008-02-14 12:09:04 UTC (rev 7407)
+++ branches/DATASYMS/coregrind/m_xarray.c 2008-02-14 16:55:01 UTC (rev 7408)
@@ -104,13 +104,8 @@
return ((char*)xa->arr) + n * xa->elemSzB;
}
-Int VG_(addToXA) ( XArray* xao, void* elem )
+static inline void ensureSpaceXA ( struct _XArray* xa )
{
- struct _XArray* xa = (struct _XArray*)xao;
- vg_assert(xa);
- vg_assert(elem);
- vg_assert(xa->totsizeE >= 0);
- vg_assert(xa->usedsizeE >= 0 && xa->usedsizeE <= xa->totsizeE);
if (xa->usedsizeE == xa->totsizeE) {
void* tmp;
Word newsz;
@@ -142,20 +137,46 @@
xa->arr = tmp;
xa->totsizeE = newsz;
}
+}
+
+Int VG_(addToXA) ( XArray* xao, void* elem )
+{
+ struct _XArray* xa = (struct _XArray*)xao;
+ vg_assert(xa);
+ vg_assert(elem);
+ vg_assert(xa->totsizeE >= 0);
+ vg_assert(xa->usedsizeE >= 0 && xa->usedsizeE <= xa->totsizeE);
+ ensureSpaceXA( xa );
vg_assert(xa->usedsizeE < xa->totsizeE);
vg_assert(xa->arr);
- if (xa->elemSzB == 1) {
- /* calling memcpy is just stupid, hence */
- * (((UChar*)xa->arr) + xa->usedsizeE) = * ((UChar*) elem);
- } else {
- VG_(memcpy)( ((UChar*)xa->arr) + xa->usedsizeE * xa->elemSzB,
- elem, xa->elemSzB );
- }
+ VG_(memcpy)( ((UChar*)xa->arr) + xa->usedsizeE * xa->elemSzB,
+ elem, xa->elemSzB );
xa->usedsizeE++;
xa->sorted = False;
return xa->usedsizeE-1;
}
+Int VG_(addBytesToXA) ( XArray* xao, void* bytesV, Int nbytes )
+{
+ Int r, i;
+ struct _XArray* xa = (struct _XArray*)xao;
+ vg_assert(xa);
+ vg_assert(xa->elemSzB == 1);
+ vg_assert(nbytes >= 0);
+ vg_assert(xa->totsizeE >= 0);
+ vg_assert(xa->usedsizeE >= 0 && xa->usedsizeE <= xa->totsizeE);
+ r = xa->usedsizeE;
+ for (i = 0; i < nbytes; i++) {
+ ensureSpaceXA( xa );
+ vg_assert(xa->usedsizeE < xa->totsizeE);
+ vg_assert(xa->arr);
+ * (((UChar*)xa->arr) + xa->usedsizeE) = ((UChar*)bytesV)[i];
+ xa->usedsizeE++;
+ }
+ xa->sorted = False;
+ return r;
+}
+
void VG_(sortXA) ( XArray* xao )
{
struct _XArray* xa = (struct _XArray*)xao;
Modified: branches/DATASYMS/include/pub_tool_xarray.h
===================================================================
--- branches/DATASYMS/include/pub_tool_xarray.h 2008-02-14 12:09:04 UTC (rev 7407)
+++ branches/DATASYMS/include/pub_tool_xarray.h 2008-02-14 16:55:01 UTC (rev 7408)
@@ -66,6 +66,11 @@
invalidated if the array is later sortXA'd. */
extern Int VG_(addToXA) ( XArray*, void* elem );
+/* Add a sequence of bytes to an XArray of bytes. Asserts if nbytes
+ is negative or the array's element size is not 1. Returns the
+ index at which the first byte was added. */
+extern Int VG_(addBytesToXA) ( XArray* xao, void* bytesV, Int nbytes );
+
/* Sort an XArray using its comparison function, if set; else bomb.
Probably not a stable sort w.r.t. equal elements module cmpFn. */
extern void VG_(sortXA) ( XArray* );
|