PERFORCE change 151797 for review
Peter Wemm
peter at FreeBSD.org
Thu Oct 23 09:29:46 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=151797
Change 151797 by peter at peter_cheese on 2008/10/23 09:29:26
Get --version to not crash. This means parsing procfs and surviving the
handoff to the tool backend.
$ /home/peter/vginst/bin/valgrind --version
valgrind-3.4.0.SVN
Affected files ...
.. //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-freebsd.c#3 edit
.. //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-linux.c#3 edit
.. //depot/projects/valgrind/coregrind/m_libcbase.c#4 edit
.. //depot/projects/valgrind/coregrind/m_main.c#6 edit
Differences ...
==== //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-freebsd.c#3 (text+ko) ====
@@ -3049,6 +3049,7 @@
UInt prot;
UWord maj, min;
ULong foffset, dev, ino;
+ UInt junk;
ULong junk64;
foffset = ino = 0; /* keep gcc-4.1.0 happy */
@@ -3086,7 +3087,7 @@
if (j > 0) i += j; else goto syntaxerror;
j = readchar(&procmap_buf[i], &ch);
if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
- j = readhex64(&procmap_buf[i], &junk64);
+ j = readhex(&procmap_buf[i], &junk);
if (j > 0) i += j; else goto syntaxerror;
j = readchar(&procmap_buf[i], &ch);
if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
@@ -3110,7 +3111,7 @@
j = readchar(&procmap_buf[i], &ch);
if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
- j = readhex64(&procmap_buf[i], &junk64);
+ j = readhex(&procmap_buf[i], &junk);
if (j > 0) i += j; else goto syntaxerror;
j = readchar(&procmap_buf[i], &ch);
@@ -3223,30 +3224,7 @@
if (ww == 'w') prot |= VKI_PROT_WRITE;
if (xx == 'x') prot |= VKI_PROT_EXEC;
-#if defined(VGO_linux)
- /* Linux has two ways to encode a device number when it
- is exposed to user space (via fstat etc). The old way
- is the traditional unix scheme that produces a 16 bit
- device number with the top 8 being the major number and
- the bottom 8 the minor number.
-
- The new scheme allows for a 12 bit major number and
- a 20 bit minor number by using a 32 bit device number
- and putting the top 12 bits of the minor number into
- the top 12 bits of the device number thus leaving an
- extra 4 bits for the major number.
-
- If the minor and major number are both single byte
- values then both schemes give the same result so we
- use the new scheme here in case either number is
- outside the 0-255 range and then use fstat64 when
- available (or fstat on 64 bit systems) so that we
- should always have a new style device number and
- everything should match. */
- dev = (min & 0xff) | (maj << 8) | ((min & ~0xff) << 12);
-#else
dev = 0;
-#endif
if (record_gap && gapStart < start)
(*record_gap) ( gapStart, start-gapStart );
==== //depot/projects/valgrind/coregrind/m_aspacemgr/aspacemgr-linux.c#3 (text+ko) ====
@@ -352,7 +352,6 @@
/* Given a file descriptor, attempt to deduce its filename. To do
this, we use /proc/self/fd/<FD>. If this doesn't point to a file,
or if it doesn't exist, we return False. */
-#if defined(VGO_linux)
static
Bool get_name_for_fd ( Int fd, /*OUT*/HChar* buf, Int nbuf )
{
@@ -367,51 +366,8 @@
else
return False;
}
-#elif defined(VGO_freebsd)
-static
-Bool get_name_for_fd ( Int fd, HChar* buf, Int nbuf )
-{
- static int nr_fromfd = -1;
- SysRes res;
- Int i;
- for (i = 0; i < nbuf; i++) buf[i] = 0;
- if (nr_fromfd == -1) {
- int oid[2];
- int real_oid[10];
- vki_size_t oidlen;
- char *name = "machdep.getpath_fromfd_num";
- vki_size_t len;
- int sc;
- oid[0] = 0; /* magic */
- oid[1] = 3; /* undocumented */
- oidlen = sizeof(real_oid);
- res = VG_(do_syscall6)(__NR___sysctl, (UWord)oid, 2, (UWord)real_oid, (UWord)&oidlen, (UWord)name, strlen(name));
- oidlen /= sizeof(int);
- if (!res.isError && oidlen > 0) {
- len = sizeof(sc);
- res = VG_(do_syscall6)(__NR___sysctl, (UWord)real_oid, oidlen, (UWord)&sc, (UWord)&len, 0, 0);
- if (!res.isError && sc > 0)
- nr_fromfd = sc;
- }
- if (nr_fromfd == -1)
- nr_fromfd = -2;
- }
- if (nr_fromfd < 0)
- return False;
-
- res = VG_(do_syscall3)(nr_fromfd, fd, (UWord)buf, nbuf);
- if (!res.isError && buf[0] == '/')
- return True;
- else
- return False;
-}
-#else
-#error undefined os
-#endif
-
-
/*-----------------------------------------------------------------*/
/*--- ---*/
/*--- SegName array management. ---*/
@@ -1007,14 +963,12 @@
same = same
&& seg_prot == prot
-#ifndef VGO_freebsd
&& (cmp_devino
? (nsegments[i].dev == dev && nsegments[i].ino == ino)
: True)
&& (cmp_offsets
? nsegments[i].start-nsegments[i].offset == addr-offset
: True)
-#endif
;
if (!same) {
sync_check_ok = False;
@@ -1539,9 +1493,6 @@
if (dev != 0 && ino != 0)
seg.kind = SkFileV;
if (filename) {
-#if defined(VGO_freebsd)
- seg.kind = SkFileV;
-#endif
seg.fnIdx = allocate_segname( filename );
}
@@ -1590,11 +1541,7 @@
" sp_at_startup = 0x%010llx (supplied)\n",
(ULong)sp_at_startup );
-#ifdef VGP_x86_freebsd
- aspacem_minAddr = (Addr) 0x00010000; // 64K
-#else
aspacem_minAddr = (Addr) 0x04000000; // 64M
-#endif
# if VG_WORDSIZE == 8
aspacem_maxAddr = (Addr)0x800000000 - 1; // 32G
@@ -1658,18 +1605,10 @@
VG_(am_show_nsegments)(2, "Initial layout");
-#ifdef VGO_freebsd
- VG_(debugLog)(2, "aspacem", "Reading /proc/curproc/map\n");
-#else
VG_(debugLog)(2, "aspacem", "Reading /proc/self/maps\n");
-#endif
parse_procselfmaps( read_maps_callback, NULL );
-#ifdef VGO_freebsd
- VG_(am_show_nsegments)(2, "With contents of /proc/curproc/map");
-#else
VG_(am_show_nsegments)(2, "With contents of /proc/self/maps");
-#endif
AM_SANITY_CHECK;
return suggested_clstack_top;
@@ -3088,9 +3027,6 @@
UInt prot;
UWord maj, min;
ULong foffset, dev, ino;
-#ifdef VGO_freebsd
- UInt junk;
-#endif
foffset = ino = 0; /* keep gcc-4.1.0 happy */
@@ -3107,7 +3043,6 @@
while (True) {
if (i >= buf_n_tot) break;
-#if defined(VGO_linux)
/* Read (without fscanf :) the pattern %16x-%16x %c%c%c%c %16x %2x:%2x %d */
j = readhex(&procmap_buf[i], &start);
if (j > 0) i += j; else goto syntaxerror;
@@ -3151,121 +3086,12 @@
j = readdec64(&procmap_buf[i], &ino);
if (j > 0) i += j; else goto syntaxerror;
-#elif defined(VGO_freebsd)
- /* Read (without fscanf :) the pattern %8x %8x %d %d %8x %c%c%c%c %d %d %8x .* .* .* */
- /* 0x38000000 0x38119000 281 748 0xd76df8a0 r-x 2 1 0x0 COW NC vnode */
- j = readhex(&procmap_buf[i], &start);
- if (j > 0) i += j; else goto syntaxerror;
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
- j = readhex(&procmap_buf[i], &endPlusOne);
- if (j > 0) i += j; else goto syntaxerror;
-
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
-
- j = readdec(&procmap_buf[i], &junk);
- if (j > 0) i += j; else goto syntaxerror;
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
- j = readdec(&procmap_buf[i], &junk);
- if (j > 0) i += j; else goto syntaxerror;
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
- j = readhex(&procmap_buf[i], &junk);
- if (j > 0) i += j; else goto syntaxerror;
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
-
- j = readchar(&procmap_buf[i], &rr);
- if (j == 1 && (rr == 'r' || rr == '-')) i += j; else goto syntaxerror;
- j = readchar(&procmap_buf[i], &ww);
- if (j == 1 && (ww == 'w' || ww == '-')) i += j; else goto syntaxerror;
- j = readchar(&procmap_buf[i], &xx);
- if (j == 1 && (xx == 'x' || xx == '-')) i += j; else goto syntaxerror;
-
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
-
- j = readdec(&procmap_buf[i], &junk);
- if (j > 0) i += j; else goto syntaxerror;
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
- j = readdec(&procmap_buf[i], &junk);
- if (j > 0) i += j; else goto syntaxerror;
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
-
- j = readhex(&procmap_buf[i], &junk);
- if (j > 0) i += j; else goto syntaxerror;
-
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
-
- /* COW or NCOW */
- j = readchar(&procmap_buf[i], &ch);
- if (j != 1) goto syntaxerror;
- if (ch == 'N') {
- i += j;
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == 'C') i += j; else goto syntaxerror;
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == 'O') i += j; else goto syntaxerror;
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == 'W') i += j; else goto syntaxerror;
- } else if (ch == 'C') {
- i += j;
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == 'O') i += j; else goto syntaxerror;
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == 'W') i += j; else goto syntaxerror;
- } else {
- goto syntaxerror;
- }
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
-
- /* NC or NNC */
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == 'N') i += j; else goto syntaxerror;
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && (ch == 'N' || ch == 'C')) i += j; else goto syntaxerror;
- if (ch == 'N') {
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == 'C') i += j; else goto syntaxerror;
- }
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == ' ') i += j; else goto syntaxerror;
-
- /* map type (vnode, swap, default) */
- j = readchar(&procmap_buf[i], &ch);
- if (j != 1) goto syntaxerror;
- if (ch == 'v') {
- i += j;
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == 'n') i += j; else goto syntaxerror;
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == 'o') i += j; else goto syntaxerror;
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == 'd') i += j; else goto syntaxerror;
- j = readchar(&procmap_buf[i], &ch);
- if (j == 1 && ch == 'e') i += j; else goto syntaxerror;
- }
- foffset = 0;
-#else
-#error "Unknown OS"
-#endif
goto read_line_ok;
syntaxerror:
-#ifdef VGO_freebsd
- VG_(debugLog)(0, "Valgrind:",
- "FATAL: syntax error reading /proc/curproc/map\n");
-#else
VG_(debugLog)(0, "Valgrind:",
"FATAL: syntax error reading /proc/self/maps\n");
-#endif
{ Int k, m;
HChar buf50[51];
m = 0;
@@ -3307,19 +3133,11 @@
foffset = 0;
}
-#if 0
-#ifdef VGO_freebsd
- if (!filename)
- filename = find_path(start);
-#endif
-#endif
-
prot = 0;
if (rr == 'r') prot |= VKI_PROT_READ;
if (ww == 'w') prot |= VKI_PROT_WRITE;
if (xx == 'x') prot |= VKI_PROT_EXEC;
-#if defined(VGO_linux)
/* Linux has two ways to encode a device number when it
is exposed to user space (via fstat etc). The old way
is the traditional unix scheme that produces a 16 bit
@@ -3340,9 +3158,6 @@
should always have a new style device number and
everything should match. */
dev = (min & 0xff) | (maj << 8) | ((min & ~0xff) << 12);
-#else
- dev = 0;
-#endif
if (record_gap && gapStart < start)
(*record_gap) ( gapStart, start-gapStart );
==== //depot/projects/valgrind/coregrind/m_libcbase.c#4 (text+ko) ====
@@ -501,14 +501,6 @@
return dest;
}
-#ifdef VGO_freebsd
-/* Gcc generates internal inline calls for struct copies */
-void* memcpy ( void *dest, const void *src, SizeT sz )
-{
- return VG_(memcpy)(dest, src, sz);
-}
-#endif
-
void* VG_(memmove)(void *dest, const void *src, SizeT sz)
{
SizeT i;
==== //depot/projects/valgrind/coregrind/m_main.c#6 (text+ko) ====
@@ -339,7 +339,7 @@
VG_(message)(Vg_UserMsg, "There is a copy in valgrind/getpath/*");
#endif
VG_(message)(Vg_UserMsg, "");
- VG_(nanosleep)(&ts);
+ VG_(do_syscall2)(__NR_nanosleep, (UWord)&ts, (UWord)NULL);
}
}
#endif
@@ -2304,7 +2304,7 @@
/*=== Getting to main() alive: LINUX (for AIX5 see below) ===*/
/*====================================================================*/
-#if defined(VGO_linux)
+#if defined(VGO_linux) || defined(VGO_freebsd)
/* If linking of the final executables is done with glibc present,
then Valgrind starts at main() above as usual, and all of the
@@ -2483,9 +2483,9 @@
"\tandl $~15, %eax\n"
/* install it, and collect the original one */
"\txchgl %eax, %esp\n"
- /* call _start_in_C, passing it the startup %esp */
+ /* call _start_in_C_linux, passing it the startup %esp */
"\tpushl %eax\n"
- "\tcall _start_in_C\n"
+ "\tcall _start_in_C_linux\n"
"\thlt\n"
".previous\n"
);
@@ -2502,8 +2502,8 @@
"\tandq $~15, %rdi\n"
/* install it, and collect the original one */
"\txchgq %rdi, %rsp\n"
- /* call _start_in_C, passing it the startup %rsp */
- "\tcall _start_in_C\n"
+ /* call _start_in_C_linux, passing it the startup %rsp */
+ "\tcall _start_in_C_linux\n"
"\thlt\n"
".previous\n"
);
More information about the p4-projects
mailing list