|
From: <sv...@va...> - 2014-08-16 20:10:04
|
Author: florian
Date: Sat Aug 16 20:09:37 2014
New Revision: 14295
Log:
Merge from trunk to pick up modifications due to VEX IRop renames.
Added:
branches/BUF_REMOVAL/auxprogs/getoff.c
- copied unchanged from r14294, trunk/auxprogs/getoff.c
branches/BUF_REMOVAL/gdbserver_tests/hgtls.stderr.exp
- copied unchanged from r14294, trunk/gdbserver_tests/hgtls.stderr.exp
branches/BUF_REMOVAL/gdbserver_tests/hgtls.stderrB.exp
- copied unchanged from r14294, trunk/gdbserver_tests/hgtls.stderrB.exp
branches/BUF_REMOVAL/gdbserver_tests/hgtls.stdinB.gdb
- copied unchanged from r14294, trunk/gdbserver_tests/hgtls.stdinB.gdb
branches/BUF_REMOVAL/gdbserver_tests/hgtls.stdoutB.exp
- copied unchanged from r14294, trunk/gdbserver_tests/hgtls.stdoutB.exp
branches/BUF_REMOVAL/gdbserver_tests/hgtls.vgtest
- copied unchanged from r14294, trunk/gdbserver_tests/hgtls.vgtest
branches/BUF_REMOVAL/none/tests/ppc32/round.c
- copied unchanged from r14294, trunk/none/tests/ppc32/round.c
branches/BUF_REMOVAL/none/tests/ppc64/round.c
- copied unchanged from r14294, trunk/none/tests/ppc64/round.c
Modified:
branches/BUF_REMOVAL/ (props changed)
branches/BUF_REMOVAL/NEWS
branches/BUF_REMOVAL/auxprogs/Makefile.am
branches/BUF_REMOVAL/configure.ac
branches/BUF_REMOVAL/coregrind/m_debuginfo/debuginfo.c
branches/BUF_REMOVAL/coregrind/m_debuginfo/priv_storage.h
branches/BUF_REMOVAL/coregrind/m_debuginfo/readelf.c
branches/BUF_REMOVAL/coregrind/m_debuginfo/readmacho.c
branches/BUF_REMOVAL/coregrind/m_debuginfo/readpdb.c
branches/BUF_REMOVAL/coregrind/m_debuginfo/storage.c
branches/BUF_REMOVAL/coregrind/m_gdbserver/server.c
branches/BUF_REMOVAL/coregrind/m_gdbserver/target.c
branches/BUF_REMOVAL/coregrind/m_gdbserver/target.h
branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-amd64.c
branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-arm.c
branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-arm64.c
branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-mips32.c
branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-mips64.c
branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-ppc32.c
branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-ppc64.c
branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-s390x.c
branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-x86.c
branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind_low.h
branches/BUF_REMOVAL/coregrind/m_redir.c
branches/BUF_REMOVAL/coregrind/pub_core_debuginfo.h
branches/BUF_REMOVAL/darwin13.supp
branches/BUF_REMOVAL/drd/tests/std_thread2.supp
branches/BUF_REMOVAL/gdbserver_tests/Makefile.am
branches/BUF_REMOVAL/include/pub_tool_debuginfo.h
branches/BUF_REMOVAL/memcheck/mc_translate.c
branches/BUF_REMOVAL/memcheck/tests/vbit-test/irops.c
branches/BUF_REMOVAL/memcheck/tests/vbit-test/util.c
branches/BUF_REMOVAL/none/tests/Makefile.am
branches/BUF_REMOVAL/none/tests/arm64/fp_and_simd.c
branches/BUF_REMOVAL/none/tests/ppc32/Makefile.am
branches/BUF_REMOVAL/none/tests/ppc32/round.stdout.exp
branches/BUF_REMOVAL/none/tests/ppc32/round.stdout.exp-RM-fix
branches/BUF_REMOVAL/none/tests/ppc64/Makefile.am
branches/BUF_REMOVAL/none/tests/ppc64/round.stdout.exp
branches/BUF_REMOVAL/none/tests/ppc64/round.stdout.exp-RM-fix
branches/BUF_REMOVAL/none/tests/s390x/rounding-3.c
branches/BUF_REMOVAL/none/tests/s390x/rounding-3.stdout.exp
branches/BUF_REMOVAL/none/tests/s390x/rounding-4.c
branches/BUF_REMOVAL/none/tests/s390x/rounding-4.stdout.exp
branches/BUF_REMOVAL/none/tests/s390x/rounding-6.c
branches/BUF_REMOVAL/none/tests/s390x/rounding-6.stdout.exp
branches/BUF_REMOVAL/none/tests/tls.c
branches/BUF_REMOVAL/tests/ (props changed)
Modified: branches/BUF_REMOVAL/NEWS
==============================================================================
--- branches/BUF_REMOVAL/NEWS (original)
+++ branches/BUF_REMOVAL/NEWS Sat Aug 16 20:09:37 2014
@@ -55,6 +55,8 @@
* New and modified GDB server monitor features:
+ - thread local variables/storage (__thread) can now be displayed.
+
- The GDB server monitor command 'v.info location <address>'
outputs information about an address. The information produced depends
on the tool and on the options given to valgrind.
@@ -204,6 +206,7 @@
337528 leak check heuristic for block prefixed by length as 64bit number
338024 inlined functions are not shown if DW_AT_ranges is used
338115 DRD: computed conflict set differs from actual after fork
+338160 implement display of thread local storage in gdbsrv
n-i-bz Fix KVM_CREATE_IRQCHIP ioctl handling
n-i-bz s390x: Fix memory corruption for multithreaded applications
n-i-bz vex arm->IR: allow PC as basereg in some LDRD cases
Modified: branches/BUF_REMOVAL/auxprogs/Makefile.am
==============================================================================
--- branches/BUF_REMOVAL/auxprogs/Makefile.am (original)
+++ branches/BUF_REMOVAL/auxprogs/Makefile.am Sat Aug 16 20:09:37 2014
@@ -51,3 +51,44 @@
if VGCONF_PLATFORMS_INCLUDE_X86_DARWIN
valgrind_di_server_LDFLAGS += -Wl,-read_only_relocs -Wl,suppress
endif
+
+#----------------------------------------------------------------------------
+# getoff-<platform>
+# Used to retrieve user space various offsets, using user space libraries.
+#----------------------------------------------------------------------------
+noinst_PROGRAMS = getoff-@VGCONF_ARCH_PRI@-@VGCONF_OS@
+if VGCONF_HAVE_PLATFORM_SEC
+noinst_PROGRAMS += getoff-@VGCONF_ARCH_SEC@-@VGCONF_OS@
+endif
+
+getoff_@VGCONF_ARCH_PRI@_@VGCONF_OS@_SOURCES = getoff.c
+getoff_@VGCONF_ARCH_PRI@_@VGCONF_OS@_CPPFLAGS = $(AM_CPPFLAGS_@VGCONF_PLATFORM_PRI_CAPS@)
+getoff_@VGCONF_ARCH_PRI@_@VGCONF_OS@_CFLAGS = $(AM_CFLAGS_@VGCONF_PLATFORM_PRI_CAPS@)
+getoff_@VGCONF_ARCH_PRI@_@VGCONF_OS@_CCASFLAGS = $(AM_CCASFLAGS_PRI)
+getoff_@VGCONF_ARCH_PRI@_@VGCONF_OS@_LDFLAGS = $(AM_CFLAGS_PRI)
+if HAVE_DLINFO_RTLD_DI_TLS_MODID
+getoff_@VGCONF_ARCH_PRI@_@VGCONF_OS@_LDADD = $(LDADD) -ldl
+endif
+
+if VGCONF_HAVE_PLATFORM_SEC
+getoff_@VGCONF_ARCH_SEC@_@VGCONF_OS@_SOURCES = getoff.c
+getoff_@VGCONF_ARCH_SEC@_@VGCONF_OS@_CPPFLAGS = $(AM_CPPFLAGS_@VGCONF_PLATFORM_SEC_CAPS@)
+getoff_@VGCONF_ARCH_SEC@_@VGCONF_OS@_CFLAGS = $(AM_CFLAGS_@VGCONF_PLATFORM_SEC_CAPS@)
+getoff_@VGCONF_ARCH_SEC@_@VGCONF_OS@_CCASFLAGS = $(AM_CCASFLAGS_SEC)
+getoff_@VGCONF_ARCH_SEC@_@VGCONF_OS@_LDFLAGS = $(AM_CFLAGS_SEC)
+if HAVE_DLINFO_RTLD_DI_TLS_MODID
+getoff_@VGCONF_ARCH_SEC@_@VGCONF_OS@_LDADD = $(LDADD) -ldl
+endif
+endif
+
+#----------------------------------------------------------------------------
+# General stuff
+#----------------------------------------------------------------------------
+
+all-local: inplace-noinst_PROGRAMS inplace-noinst_DSYMS
+
+clean-local: clean-noinst_DSYMS
+
+install-exec-local: install-noinst_PROGRAMS install-noinst_DSYMS
+
+uninstall-local: uninstall-noinst_PROGRAMS uninstall-noinst_DSYMS
Modified: branches/BUF_REMOVAL/configure.ac
==============================================================================
--- branches/BUF_REMOVAL/configure.ac (original)
+++ branches/BUF_REMOVAL/configure.ac Sat Aug 16 20:09:37 2014
@@ -1449,6 +1449,37 @@
test x$ac_have_pthread_create_glibc_2_0 = xyes)
+# Check for dlinfo RTLD_DI_TLS_MODID
+AC_MSG_CHECKING([for dlinfo RTLD_DI_TLS_MODID])
+
+safe_LIBS="$LIBS"
+LIBS="-ldl"
+AC_LINK_IFELSE([AC_LANG_PROGRAM([[
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+#include <link.h>
+#include <dlfcn.h>
+]], [[
+ size_t sizes[10000];
+ size_t modid_offset;
+ (void) dlinfo ((void*)sizes, RTLD_DI_TLS_MODID, &modid_offset);
+ return 0;
+]])], [
+ac_have_dlinfo_rtld_di_tls_modid=yes
+AC_MSG_RESULT([yes])
+AC_DEFINE([HAVE_DLINFO_RTLD_DI_TLS_MODID], 1,
+ [Define to 1 if you have a dlinfo that can do RTLD_DI_TLS_MODID.])
+], [
+ac_have_dlinfo_rtld_di_tls_modid=no
+AC_MSG_RESULT([no])
+])
+LIBS=$safe_LIBS
+
+AM_CONDITIONAL(HAVE_DLINFO_RTLD_DI_TLS_MODID,
+ test x$ac_have_dlinfo_rtld_di_tls_modid = xyes)
+
+
# Check for eventfd_t, eventfd() and eventfd_read()
AC_MSG_CHECKING([for eventfd()])
Modified: branches/BUF_REMOVAL/coregrind/m_debuginfo/debuginfo.c
==============================================================================
--- branches/BUF_REMOVAL/coregrind/m_debuginfo/debuginfo.c (original)
+++ branches/BUF_REMOVAL/coregrind/m_debuginfo/debuginfo.c Sat Aug 16 20:09:37 2014
@@ -1660,7 +1660,7 @@
{
*buf = (HChar *)"(below main)"; // FIXME: constification
}
- offset = a - di->symtab[sno].addr;
+ offset = a - di->symtab[sno].avmas.main;
if (offsetP) *offsetP = offset;
if (show_offset && offset != 0) {
@@ -1685,6 +1685,7 @@
guest_code_addr. Returns 0 if not known. */
Addr VG_(get_tocptr) ( Addr guest_code_addr )
{
+#if defined(VGA_ppc64be) || defined(VGA_ppc64le)
DebugInfo* si;
Word sno;
search_all_symtabs ( guest_code_addr,
@@ -1694,7 +1695,10 @@
if (si == NULL)
return 0;
else
- return si->symtab[sno].tocptr;
+ return GET_TOCPTR_AVMA(si->symtab[sno].avmas);
+#else
+ return 0;
+#endif
}
/* This is available to tools... always demangle C++ names,
@@ -2013,8 +2017,7 @@
Therefore specify "*" to search all the objects. On TOC-afflicted
platforms, a symbol is deemed to be found only if it has a nonzero
TOC pointer. */
-Bool VG_(lookup_symbol_SLOW)(const HChar* sopatt, HChar* name,
- Addr* pEnt, Addr* pToc)
+Bool VG_(lookup_symbol_SLOW)(const HChar* sopatt, HChar* name, SymAVMAs* avmas)
{
Bool require_pToc = False;
Int i;
@@ -2035,9 +2038,8 @@
HChar* pri_name = si->symtab[i].pri_name;
tl_assert(pri_name);
if (0==VG_(strcmp)(name, pri_name)
- && (require_pToc ? si->symtab[i].tocptr : True)) {
- *pEnt = si->symtab[i].addr;
- *pToc = si->symtab[i].tocptr;
+ && (require_pToc ? GET_TOCPTR_AVMA(si->symtab[i].avmas) : True)) {
+ *avmas = si->symtab[i].avmas;
return True;
}
HChar** sec_names = si->symtab[i].sec_names;
@@ -2045,9 +2047,9 @@
tl_assert(sec_names[0]);
while (*sec_names) {
if (0==VG_(strcmp)(name, *sec_names)
- && (require_pToc ? si->symtab[i].tocptr : True)) {
- *pEnt = si->symtab[i].addr;
- *pToc = si->symtab[i].tocptr;
+ && (require_pToc
+ ? GET_TOCPTR_AVMA(si->symtab[i].avmas) : True)) {
+ *avmas = si->symtab[i].avmas;
return True;
}
sec_names++;
@@ -4154,19 +4156,15 @@
void VG_(DebugInfo_syms_getidx) ( const DebugInfo *si,
Int idx,
- /*OUT*/Addr* avma,
- /*OUT*/Addr* tocptr,
- /*OUT*/Addr* local_ep,
- /*OUT*/UInt* size,
- /*OUT*/HChar** pri_name,
- /*OUT*/HChar*** sec_names,
- /*OUT*/Bool* isText,
- /*OUT*/Bool* isIFunc )
+ /*OUT*/SymAVMAs* avmas,
+ /*OUT*/UInt* size,
+ /*OUT*/HChar** pri_name,
+ /*OUT*/HChar*** sec_names,
+ /*OUT*/Bool* isText,
+ /*OUT*/Bool* isIFunc )
{
vg_assert(idx >= 0 && idx < si->symtab_used);
- if (avma) *avma = si->symtab[idx].addr;
- if (tocptr) *tocptr = si->symtab[idx].tocptr;
- if (local_ep) *local_ep = si->symtab[idx].local_ep;
+ if (avmas) *avmas = si->symtab[idx].avmas;
if (size) *size = si->symtab[idx].size;
if (pri_name) *pri_name = si->symtab[idx].pri_name;
if (sec_names) *sec_names = (HChar **)si->symtab[idx].sec_names; // FIXME
Modified: branches/BUF_REMOVAL/coregrind/m_debuginfo/priv_storage.h
==============================================================================
--- branches/BUF_REMOVAL/coregrind/m_debuginfo/priv_storage.h (original)
+++ branches/BUF_REMOVAL/coregrind/m_debuginfo/priv_storage.h Sat Aug 16 20:09:37 2014
@@ -69,10 +69,10 @@
sec_names[] does not need to be allocated.
*/
typedef
- struct {
- Addr addr; /* lowest address of entity */
- Addr tocptr; /* ppc64be-linux only: value that R2 should have */
- Addr local_ep; /* address for local entry point, ppc64le */
+ struct {
+ SymAVMAs avmas; /* Symbol Actual VMAs: lowest address of entity,
+ + platform specific fields, to access with
+ the macros defined in pub_core_debuginfo.h */
HChar* pri_name; /* primary name, never NULL */
HChar** sec_names; /* NULL, or a NULL term'd array of other names */
// XXX: this could be shrunk (on 32-bit platforms) by using 30
Modified: branches/BUF_REMOVAL/coregrind/m_debuginfo/readelf.c
==============================================================================
--- branches/BUF_REMOVAL/coregrind/m_debuginfo/readelf.c (original)
+++ branches/BUF_REMOVAL/coregrind/m_debuginfo/readelf.c Sat Aug 16 20:09:37 2014
@@ -234,17 +234,12 @@
PtrdiffT opd_bias, /* for biasing AVMAs found in .opd */
/* OUTPUTS */
DiOffT* sym_name_out_ioff, /* name (in strtab) we should record */
- Addr* sym_avma_out, /* addr we should record */
+ SymAVMAs* sym_avmas_out, /* sym avmas we should record */
Int* sym_size_out, /* symbol size */
- Addr* sym_tocptr_out, /* ppc64be-linux only: R2 value to be
- used on entry */
Bool* from_opd_out, /* ppc64be-linux only: did we deref an
.opd entry? */
Bool* is_text_out, /* is this a text symbol? */
- Bool* is_ifunc, /* is this a STT_GNU_IFUNC function ?*/
- Addr* sym_local_ep /* addr for local entry point. PPC64 LE
- supports a local and global entry points.
- Use this value to return the entry point. */
+ Bool* is_ifunc /* is this a STT_GNU_IFUNC function ?*/
)
{
Bool plausible;
@@ -257,12 +252,12 @@
/* Set defaults */
*sym_name_out_ioff = sym_name_ioff;
- *sym_avma_out = sym_svma; /* we will bias this shortly */
+ (*sym_avmas_out).main = sym_svma; /* we will bias this shortly */
*is_text_out = True;
- *sym_tocptr_out = 0; /* unknown/inapplicable */
+ SET_TOCPTR_AVMA(*sym_avmas_out, 0); /* default to unknown/inapplicable */
+ SET_LOCAL_EP_AVMA(*sym_avmas_out, 0); /* default to unknown/inapplicable */
*from_opd_out = False;
*is_ifunc = False;
- *sym_local_ep = 0; /* unknown/inapplicable */
/* Get the symbol size, but restrict it to fit in a signed 32 bit
int. Also, deal with the stupid case of negative size by making
@@ -322,7 +317,7 @@
sbss_bias = di->sbss_bias;
}
- /* Now bias sym_avma_out accordingly by figuring out exactly which
+ /* Now bias (*sym_avmas_out).main accordingly by figuring out exactly which
section the symbol is from and bias accordingly. Screws up if
the previously deduced section svma address ranges are wrong. */
if (di->text_present
@@ -330,46 +325,46 @@
&& sym_svma >= text_svma
&& sym_svma < text_svma + di->text_size) {
*is_text_out = True;
- *sym_avma_out += text_bias;
+ (*sym_avmas_out).main += text_bias;
} else
if (di->data_present
&& di->data_size > 0
&& sym_svma >= data_svma
&& sym_svma < data_svma + di->data_size) {
*is_text_out = False;
- *sym_avma_out += data_bias;
+ (*sym_avmas_out).main += data_bias;
} else
if (di->sdata_present
&& di->sdata_size > 0
&& sym_svma >= sdata_svma
&& sym_svma < sdata_svma + di->sdata_size) {
*is_text_out = False;
- *sym_avma_out += sdata_bias;
+ (*sym_avmas_out).main += sdata_bias;
} else
if (di->rodata_present
&& di->rodata_size > 0
&& sym_svma >= rodata_svma
&& sym_svma < rodata_svma + di->rodata_size) {
*is_text_out = False;
- *sym_avma_out += rodata_bias;
+ (*sym_avmas_out).main += rodata_bias;
} else
if (di->bss_present
&& di->bss_size > 0
&& sym_svma >= bss_svma
&& sym_svma < bss_svma + di->bss_size) {
*is_text_out = False;
- *sym_avma_out += bss_bias;
+ (*sym_avmas_out).main += bss_bias;
} else
if (di->sbss_present
&& di->sbss_size > 0
&& sym_svma >= sbss_svma
&& sym_svma < sbss_svma + di->sbss_size) {
*is_text_out = False;
- *sym_avma_out += sbss_bias;
+ (*sym_avmas_out).main += sbss_bias;
} else {
/* Assume it's in .text. Is this a good idea? */
*is_text_out = True;
- *sym_avma_out += text_bias;
+ (*sym_avmas_out).main += text_bias;
}
# ifdef STT_GNU_IFUNC
@@ -390,8 +385,8 @@
&& *sym_size_out > 0
&& di->opd_present
&& di->opd_size > 0
- && *sym_avma_out >= di->opd_avma
- && *sym_avma_out < di->opd_avma + di->opd_size)
+ && (*sym_avmas_out).main >= di->opd_avma
+ && (*sym_avmas_out).main < di->opd_avma + di->opd_size)
plausible = True;
# endif
@@ -456,8 +451,8 @@
symbol defined elsewhere, so ignore it. */
if (di->got_present
&& di->got_size > 0
- && *sym_avma_out >= di->got_avma
- && *sym_avma_out < di->got_avma + di->got_size) {
+ && (*sym_avmas_out).main >= di->got_avma
+ && (*sym_avmas_out).main < di->got_avma + di->got_size) {
if (TRACE_SYMTAB_ENABLED) {
HChar* sym_name = ML_(img_strdup)(escn_strtab->img,
"di.gesi.4", sym_name_ioff);
@@ -468,8 +463,8 @@
}
if (di->plt_present
&& di->plt_size > 0
- && *sym_avma_out >= di->plt_avma
- && *sym_avma_out < di->plt_avma + di->plt_size) {
+ && (*sym_avmas_out).main >= di->plt_avma
+ && (*sym_avmas_out).main < di->plt_avma + di->plt_size) {
if (TRACE_SYMTAB_ENABLED) {
HChar* sym_name = ML_(img_strdup)(escn_strtab->img,
"di.gesi.5", sym_name_ioff);
@@ -494,8 +489,8 @@
if (di->opd_present
&& di->opd_size > 0
- && *sym_avma_out >= di->opd_avma
- && *sym_avma_out < di->opd_avma + di->opd_size) {
+ && (*sym_avmas_out).main >= di->opd_avma
+ && (*sym_avmas_out).main < di->opd_avma + di->opd_size) {
# if !defined(VGP_ppc64be_linux)
if (TRACE_SYMTAB_ENABLED) {
HChar* sym_name = ML_(img_strdup)(escn_strtab->img,
@@ -510,9 +505,9 @@
if (details)
TRACE_SYMTAB("opdXXX: opd_bias %p, sym_svma_out %p\n",
- (void*)(opd_bias), (void*)*sym_avma_out);
+ (void*)(opd_bias), (void*)(*sym_avmas_out).main);
- if (!VG_IS_8_ALIGNED(*sym_avma_out)) {
+ if (!VG_IS_8_ALIGNED((*sym_avmas_out).main)) {
if (TRACE_SYMTAB_ENABLED) {
HChar* sym_name = ML_(img_strdup)(escn_strtab->img,
"di.gesi.6a", sym_name_ioff);
@@ -522,11 +517,11 @@
return False;
}
- /* *sym_avma_out is a vma pointing into the .opd section. We
+ /* (*sym_avmas_out).main is a avma pointing into the .opd section. We
know the vma of the opd section start, so we can figure out
how far into the opd section this is. */
- offset_in_opd = (Addr)(*sym_avma_out) - (Addr)(di->opd_avma);
+ offset_in_opd = (Addr)(*sym_avmas_out).main - (Addr)(di->opd_avma);
if (offset_in_opd < 0 || offset_in_opd >= di->opd_size) {
if (TRACE_SYMTAB_ENABLED) {
HChar* sym_name = ML_(img_strdup)(escn_strtab->img,
@@ -576,13 +571,13 @@
OK for fn_descr[0], but surely we need to use the data bias
and not the text bias for fn_descr[1] ? Oh Well.
*/
- *sym_avma_out = fn_descr[0] + opd_bias;
- *sym_tocptr_out = fn_descr[1] + opd_bias;
+ (*sym_avmas_out).main = fn_descr[0] + opd_bias;
+ SET_TOCPTR_AVMA(*sym_avmas_out, fn_descr[1] + opd_bias);
*from_opd_out = True;
is_in_opd = True;
/* Do a final sanity check: if the symbol falls outside the
- DebugInfo's mapped range, ignore it. Since *sym_avma_out has
+ DebugInfo's mapped range, ignore it. Since (*sym_avmas_out).main has
been updated, that can be achieved simply by falling through
to the test below. */
@@ -607,38 +602,38 @@
in_text
= di->text_present
&& di->text_size > 0
- && !(*sym_avma_out + *sym_size_out <= di->text_avma
- || *sym_avma_out >= di->text_avma + di->text_size);
+ && !((*sym_avmas_out).main + *sym_size_out <= di->text_avma
+ || (*sym_avmas_out).main >= di->text_avma + di->text_size);
in_data
= di->data_present
&& di->data_size > 0
- && !(*sym_avma_out + *sym_size_out <= di->data_avma
- || *sym_avma_out >= di->data_avma + di->data_size);
+ && !((*sym_avmas_out).main + *sym_size_out <= di->data_avma
+ || (*sym_avmas_out).main >= di->data_avma + di->data_size);
in_sdata
= di->sdata_present
&& di->sdata_size > 0
- && !(*sym_avma_out + *sym_size_out <= di->sdata_avma
- || *sym_avma_out >= di->sdata_avma + di->sdata_size);
+ && !((*sym_avmas_out).main + *sym_size_out <= di->sdata_avma
+ || (*sym_avmas_out).main >= di->sdata_avma + di->sdata_size);
in_rodata
= di->rodata_present
&& di->rodata_size > 0
- && !(*sym_avma_out + *sym_size_out <= di->rodata_avma
- || *sym_avma_out >= di->rodata_avma + di->rodata_size);
+ && !((*sym_avmas_out).main + *sym_size_out <= di->rodata_avma
+ || (*sym_avmas_out).main >= di->rodata_avma + di->rodata_size);
in_bss
= di->bss_present
&& di->bss_size > 0
- && !(*sym_avma_out + *sym_size_out <= di->bss_avma
- || *sym_avma_out >= di->bss_avma + di->bss_size);
+ && !((*sym_avmas_out).main + *sym_size_out <= di->bss_avma
+ || (*sym_avmas_out).main >= di->bss_avma + di->bss_size);
in_sbss
= di->sbss_present
&& di->sbss_size > 0
- && !(*sym_avma_out + *sym_size_out <= di->sbss_avma
- || *sym_avma_out >= di->sbss_avma + di->sbss_size);
+ && !((*sym_avmas_out).main + *sym_size_out <= di->sbss_avma
+ || (*sym_avmas_out).main >= di->sbss_avma + di->sbss_size);
if (*is_text_out) {
@@ -653,14 +648,16 @@
/* This could actually wrap around and cause
ML_(find_rx_mapping) to assert. But that seems so unlikely,
let's wait for it to happen before fixing it. */
- in_rx = (ML_(find_rx_mapping)(di, *sym_avma_out,
- *sym_avma_out + *sym_size_out) != NULL);
+ in_rx = (ML_(find_rx_mapping)(
+ di,
+ (*sym_avmas_out).main,
+ (*sym_avmas_out).main + *sym_size_out) != NULL);
if (in_text)
vg_assert(in_rx);
if (!in_rx) {
TRACE_SYMTAB(
"ignore -- %#lx .. %#lx outside .text svma range %#lx .. %#lx\n",
- *sym_avma_out, *sym_avma_out + *sym_size_out,
+ (*sym_avmas_out).main, (*sym_avmas_out).main + *sym_size_out,
di->text_avma,
di->text_avma + di->text_size);
return False;
@@ -670,15 +667,15 @@
TRACE_SYMTAB(
"ignore -- %#lx .. %#lx outside .data / .sdata / .rodata "
"/ .bss / .sbss svma ranges\n",
- *sym_avma_out, *sym_avma_out + *sym_size_out);
+ (*sym_avmas_out).main, (*sym_avmas_out).main + *sym_size_out);
return False;
}
}
# if defined(VGP_ppc64be_linux)
if (di->opd_present && di->opd_size > 0) {
- vg_assert(*sym_avma_out + *sym_size_out <= di->opd_avma
- || *sym_avma_out >= di->opd_avma + di->opd_size);
+ vg_assert((*sym_avmas_out).main + *sym_size_out <= di->opd_avma
+ || (*sym_avmas_out).main >= di->opd_avma + di->opd_size);
}
#endif
@@ -717,13 +714,15 @@
if ((bit_field > 0) && (bit_field < 7)) {
/* store the local entry point address */
dist_to_local_entry = ((1 << bit_field) >> 2) << 2;
- *sym_local_ep = *sym_avma_out + dist_to_local_entry;
+ SET_LOCAL_EP_AVMA(*sym_avmas_out,
+ (*sym_avmas_out).main + dist_to_local_entry);
if (TRACE_SYMTAB_ENABLED) {
HChar* sym_name = ML_(img_strdup)(escn_strtab->img,
"di.gesi.5", sym_name_ioff);
VG_(printf)("Local entry point: %s at %#010x\n",
- sym_name, (unsigned int)*sym_local_ep);
+ sym_name,
+ (unsigned int)GET_LOCAL_EP_AVMA(*sym_avmas_out));
}
}
}
@@ -771,29 +770,26 @@
show_raw_elf_symbol(escn_strtab->img, i,
&sym, sym_name, sym_svma, False);
- Addr sym_avma_really = 0;
+ SymAVMAs sym_avmas_really;
Int sym_size = 0;
- Addr sym_tocptr = 0;
- Addr local_ep = 0;
Bool from_opd = False, is_text = False, is_ifunc = False;
DiOffT sym_name_really = DiOffT_INVALID;
+ sym_avmas_really.main = 0;
+ SET_TOCPTR_AVMA(sym_avmas_really, 0);
+ SET_LOCAL_EP_AVMA(sym_avmas_really, 0);
if (get_elf_symbol_info(di, &sym, sym_name, escn_strtab,
sym_svma, symtab_in_debug,
escn_opd, di->text_bias,
&sym_name_really,
- &sym_avma_really,
+ &sym_avmas_really,
&sym_size,
- &sym_tocptr,
- &from_opd, &is_text, &is_ifunc,
- &local_ep)) {
+ &from_opd, &is_text, &is_ifunc)) {
DiSym disym;
VG_(memset)(&disym, 0, sizeof(disym));
HChar* cstr = ML_(img_strdup)(escn_strtab->img,
"di.res__n.1", sym_name_really);
- disym.addr = sym_avma_really;
- disym.tocptr = sym_tocptr;
- disym.local_ep = local_ep;
+ disym.avmas = sym_avmas_really;
disym.pri_name = ML_(addStr) ( di, cstr, -1 );
disym.sec_names = NULL;
disym.size = sym_size;
@@ -801,7 +797,8 @@
disym.isIFunc = is_ifunc;
if (cstr) { ML_(dinfo_free)(cstr); cstr = NULL; }
vg_assert(disym.pri_name);
- vg_assert(disym.tocptr == 0); /* has no role except on ppc64be-linux */
+ vg_assert(GET_TOCPTR_AVMA(disym.avmas) == 0);
+ /* has no role except on ppc64be-linux */
ML_(addSym) ( di, &disym );
if (TRACE_SYMTAB_ENABLED) {
@@ -809,13 +806,13 @@
" val %#010lx, sz %4d %s\n",
is_text ? 't' : 'd',
i,
- disym.addr,
+ disym.avmas.main,
(Int)disym.size,
(HChar*)disym.pri_name
);
- if (local_ep != 0) {
+ if (GET_LOCAL_EP_AVMA(disym.avmas) != 0) {
TRACE_SYMTAB(" local entry point %#010lx\n",
- local_ep)
+ GET_LOCAL_EP_AVMA(disym.avmas));
}
}
@@ -909,26 +906,25 @@
show_raw_elf_symbol(escn_strtab->img, i,
&sym, sym_name, sym_svma, True);
- Addr sym_avma_really = 0;
+ SymAVMAs sym_avmas_really;
Int sym_size = 0;
- Addr sym_tocptr = 0;
- Addr sym_local_ep = 0;
Bool from_opd = False, is_text = False, is_ifunc = False;
DiOffT sym_name_really = DiOffT_INVALID;
DiSym disym;
VG_(memset)(&disym, 0, sizeof(disym));
+ sym_avmas_really.main = 0;
+ SET_TOCPTR_AVMA(sym_avmas_really, 0);
+ SET_LOCAL_EP_AVMA(sym_avmas_really, 0);
if (get_elf_symbol_info(di, &sym, sym_name, escn_strtab,
sym_svma, symtab_in_debug,
escn_opd, di->text_bias,
&sym_name_really,
- &sym_avma_really,
+ &sym_avmas_really,
&sym_size,
- &sym_tocptr,
- &from_opd, &is_text, &is_ifunc,
- &sym_local_ep)) {
+ &from_opd, &is_text, &is_ifunc)) {
/* Check if we've seen this (name,addr) key before. */
- key.addr = sym_avma_really;
+ key.addr = sym_avmas_really.main;
key.name = sym_name_really;
key.img = escn_strtab->img;
prev = VG_(OSetGen_Lookup)( oset, &key );
@@ -959,7 +955,7 @@
shouldn't currently have an known TOC ptr. */
vg_assert(prev->tocptr == 0);
modify_tocptr = True;
- prev->tocptr = sym_tocptr;
+ prev->tocptr = GET_TOCPTR_AVMA(sym_avmas_really);
}
else {
/* ignore. can we do better here? */
@@ -994,7 +990,7 @@
elem = VG_(OSetGen_AllocNode)(oset, sizeof(TempSym));
vg_assert(elem);
elem->key = key;
- elem->tocptr = sym_tocptr;
+ elem->tocptr = GET_TOCPTR_AVMA(sym_avmas_really);
elem->size = sym_size;
elem->from_opd = from_opd;
elem->is_text = is_text;
@@ -1029,8 +1025,9 @@
VG_(memset)(&disym, 0, sizeof(disym));
HChar* cstr = ML_(img_strdup)(escn_strtab->img,
"di.res__ppc64.1", elem->key.name);
- disym.addr = elem->key.addr;
- disym.tocptr = elem->tocptr;
+ disym.avmas.main = elem->key.addr;
+ SET_TOCPTR_AVMA(disym.avmas, elem->tocptr);
+ SET_LOCAL_EP_AVMA(disym.avmas, 0); // ppc64be does not use local_ep.
disym.pri_name = ML_(addStr) ( di, cstr, -1 );
disym.sec_names = NULL;
disym.size = elem->size;
@@ -1045,8 +1042,8 @@
" val %#010lx, toc %#010lx, sz %4d %s\n",
disym.isText ? 't' : 'd',
i,
- disym.addr,
- disym.tocptr,
+ disym.avmas.main,
+ GET_TOCPTR_AVMA(disym.avmas),
(Int) disym.size,
(HChar*)disym.pri_name
);
Modified: branches/BUF_REMOVAL/coregrind/m_debuginfo/readmacho.c
==============================================================================
--- branches/BUF_REMOVAL/coregrind/m_debuginfo/readmacho.c (original)
+++ branches/BUF_REMOVAL/coregrind/m_debuginfo/readmacho.c Sat Aug 16 20:09:37 2014
@@ -356,14 +356,16 @@
continue;
}
- disym.addr = sym_addr;
- disym.tocptr = 0;
- disym.pri_name = ML_(addStr)(di, name, -1);
- disym.sec_names = NULL;
- disym.size = // let canonicalize fix it
- di->text_avma+di->text_size - sym_addr;
- disym.isText = True;
- disym.isIFunc = False;
+ VG_(bzero_inline)(&disym, sizeof(disym));
+ disym.avmas.main = sym_addr;
+ SET_TOCPTR_AVMA(disym, 0);
+ SET_LOCAL_EP_AVMA(disym, 0);
+ disym.pri_name = ML_(addStr)(di, name, -1);
+ disym.sec_names = NULL;
+ disym.size = // let canonicalize fix it
+ di->text_avma+di->text_size - sym_addr;
+ disym.isText = True;
+ disym.isIFunc = False;
// Lots of user function names get prepended with an underscore. Eg. the
// function 'f' becomes the symbol '_f'. And the "below main"
// function is called "start". So we skip the leading underscore, and
@@ -393,8 +395,8 @@
{
const DiSym* s1 = (DiSym*)v1;
const DiSym* s2 = (DiSym*)v2;
- if (s1->addr < s2->addr) return -1;
- if (s1->addr > s2->addr) return 1;
+ if (s1->avmas.main < s2->avmas.main) return -1;
+ if (s1->avmas.main > s2->avmas.main) return 1;
return VG_(strcmp)(s1->pri_name, s2->pri_name);
}
@@ -433,8 +435,8 @@
for (i = 0; i < nsyms; i++) {
for (k = i+1;
k < nsyms
- && ((DiSym*)VG_(indexXA)(syms,i))->addr
- == ((DiSym*)VG_(indexXA)(syms,k))->addr;
+ && ((DiSym*)VG_(indexXA)(syms,i))->avmas.main
+ == ((DiSym*)VG_(indexXA)(syms,k))->avmas.main;
k++)
;
/* So now [i .. k-1] is a group all with the same start address.
@@ -444,9 +446,9 @@
DiSym* next = (DiSym*)VG_(indexXA)(syms,k);
for (m = i; m < k; m++) {
DiSym* here = (DiSym*)VG_(indexXA)(syms,m);
- vg_assert(here->addr < next->addr);
- if (here->addr + here->size > next->addr)
- here->size = next->addr - here->addr;
+ vg_assert(here->avmas.main < next->avmas.main);
+ if (here->avmas.main + here->size > next->avmas.main)
+ here->size = next->avmas.main - here->avmas.main;
}
}
i = k-1;
@@ -462,7 +464,7 @@
s_j1 = (DiSym*)VG_(indexXA)(syms, j-1);
s_j = (DiSym*)VG_(indexXA)(syms, j);
s_i = (DiSym*)VG_(indexXA)(syms, i);
- if (s_i->addr != s_j1->addr
+ if (s_i->avmas.main != s_j1->avmas.main
|| s_i->size != s_j1->size
|| 0 != VG_(strcmp)(s_i->pri_name, s_j1->pri_name)) {
*s_j = *s_i;
@@ -470,7 +472,7 @@
} else {
if (trace_symtab)
VG_(printf)("nlist cleanup: dump duplicate avma %010lx %s\n",
- s_i->addr, s_i->pri_name );
+ s_i->avmas.main, s_i->pri_name );
}
}
}
@@ -955,7 +957,7 @@
vg_assert(cand->sec_names == NULL);
if (di->trace_symtab)
VG_(printf)("nlist final: acquire avma %010lx-%010lx %s\n",
- cand->addr, cand->addr + cand->size - 1,
+ cand->avmas.main, cand->avmas.main + cand->size - 1,
cand->pri_name );
ML_(addSym)( di, cand );
}
Modified: branches/BUF_REMOVAL/coregrind/m_debuginfo/readpdb.c
==============================================================================
--- branches/BUF_REMOVAL/coregrind/m_debuginfo/readpdb.c (original)
+++ branches/BUF_REMOVAL/coregrind/m_debuginfo/readpdb.c Sat Aug 16 20:09:37 2014
@@ -1264,9 +1264,9 @@
if (0 /*VG_(needs).data_syms*/) {
nmstr = ML_(addStr)(di, symname, sym->data_v1.p_name.namelen);
- vsym.addr = bias + sectp[sym->data_v1.segment-1].VirtualAddress
+ vsym.avmas.main = bias + sectp[sym->data_v1.segment-1].VirtualAddress
+ sym->data_v1.offset;
- vsym.tocptr = 0;
+ SET_TOCPTR_AVMA(vsym.avmas, 0);
vsym.pri_name = nmstr;
vsym.sec_names = NULL;
vsym.size = sym->data_v1.p_name.namelen;
@@ -1290,9 +1290,9 @@
if (sym->generic.id==S_PUB_V2 /*VG_(needs).data_syms*/) {
nmstr = ML_(addStr)(di, symname, k);
- vsym.addr = bias + sectp[sym->data_v2.segment-1].VirtualAddress
+ vsym.avmas.main = bias + sectp[sym->data_v2.segment-1].VirtualAddress
+ sym->data_v2.offset;
- vsym.tocptr = 0;
+ SET_TOCPTR_AVMA(vsym.avmas, 0);
vsym.pri_name = nmstr;
vsym.sec_names = NULL;
vsym.size = 4000;
@@ -1324,9 +1324,9 @@
if (1 /*sym->generic.id==S_PUB_FUNC1_V3
|| sym->generic.id==S_PUB_FUNC2_V3*/) {
nmstr = ML_(addStr)(di, symname, k);
- vsym.addr = bias + sectp[sym->public_v3.segment-1].VirtualAddress
+ vsym.avmas.main = bias + sectp[sym->public_v3.segment-1].VirtualAddress
+ sym->public_v3.offset;
- vsym.tocptr = 0;
+ SET_TOCPTR_AVMA(vsym.avmas, 0);
vsym.pri_name = nmstr;
vsym.sec_names = NULL;
vsym.size = 4000;
@@ -1360,9 +1360,9 @@
sym->proc_v1.p_name.namelen);
symname[sym->proc_v1.p_name.namelen] = '\0';
nmstr = ML_(addStr)(di, symname, sym->proc_v1.p_name.namelen);
- vsym.addr = bias + sectp[sym->proc_v1.segment-1].VirtualAddress
+ vsym.avmas.main = bias + sectp[sym->proc_v1.segment-1].VirtualAddress
+ sym->proc_v1.offset;
- vsym.tocptr = 0;
+ SET_TOCPTR_AVMA(vsym.avmas, 0);
vsym.pri_name = nmstr;
vsym.sec_names = NULL;
vsym.size = sym->proc_v1.proc_len;
@@ -1371,7 +1371,7 @@
if (debug)
VG_(message)(Vg_UserMsg,
" Adding function %s addr=%#lx length=%d\n",
- symname, vsym.addr, vsym.size );
+ symname, vsym.avmas.main, vsym.size );
ML_(addSym)( di, &vsym );
n_syms_read++;
break;
@@ -1382,9 +1382,9 @@
sym->proc_v2.p_name.namelen);
symname[sym->proc_v2.p_name.namelen] = '\0';
nmstr = ML_(addStr)(di, symname, sym->proc_v2.p_name.namelen);
- vsym.addr = bias + sectp[sym->proc_v2.segment-1].VirtualAddress
+ vsym.avmas.main = bias + sectp[sym->proc_v2.segment-1].VirtualAddress
+ sym->proc_v2.offset;
- vsym.tocptr = 0;
+ SET_TOCPTR_AVMA(vsym.avmas, 0);
vsym.pri_name = nmstr;
vsym.sec_names = NULL;
vsym.size = sym->proc_v2.proc_len;
@@ -1393,7 +1393,7 @@
if (debug)
VG_(message)(Vg_UserMsg,
" Adding function %s addr=%#lx length=%d\n",
- symname, vsym.addr, vsym.size );
+ symname, vsym.avmas.main, vsym.size );
ML_(addSym)( di, &vsym );
n_syms_read++;
break;
@@ -1406,9 +1406,9 @@
if (1) {
nmstr = ML_(addStr)(di, sym->proc_v3.name,
VG_(strlen)(sym->proc_v3.name));
- vsym.addr = bias + sectp[sym->proc_v3.segment-1].VirtualAddress
+ vsym.avmas.main = bias + sectp[sym->proc_v3.segment-1].VirtualAddress
+ sym->proc_v3.offset;
- vsym.tocptr = 0;
+ SET_TOCPTR_AVMA(vsym.avmas, 0);
vsym.pri_name = nmstr;
vsym.sec_names = NULL;
vsym.size = sym->proc_v3.proc_len;
Modified: branches/BUF_REMOVAL/coregrind/m_debuginfo/storage.c
==============================================================================
--- branches/BUF_REMOVAL/coregrind/m_debuginfo/storage.c (original)
+++ branches/BUF_REMOVAL/coregrind/m_debuginfo/storage.c Sat Aug 16 20:09:37 2014
@@ -102,8 +102,8 @@
idx,
sym->isText ? 'T' : '-',
sym->isIFunc ? 'I' : '-',
- sym->addr,
- sym->addr + sym->size - 1, sym->size,
+ sym->avmas.main,
+ sym->avmas.main + sym->size - 1, sym->size,
sym->pri_name, sec_names ? " " : "" );
if (sec_names) {
while (*sec_names) {
@@ -1388,8 +1388,8 @@
{
const DiSym* a = va;
const DiSym* b = vb;
- if (a->addr < b->addr) return -1;
- if (a->addr > b->addr) return 1;
+ if (a->avmas.main < b->avmas.main) return -1;
+ if (a->avmas.main > b->avmas.main) return 1;
return 0;
}
@@ -1656,9 +1656,9 @@
/* A pass merging entries together */
for (r = 1; r < di->symtab_used; r++) {
vg_assert(w < r);
- if ( di->symtab[w].addr == di->symtab[r].addr
- && di->symtab[w].size == di->symtab[r].size
- && !!di->symtab[w].isText == !!di->symtab[r].isText) {
+ if ( di->symtab[w].avmas.main == di->symtab[r].avmas.main
+ && di->symtab[w].size == di->symtab[r].size
+ && !!di->symtab[w].isText == !!di->symtab[r].isText) {
/* merge the two into one */
n_merged++;
/* Add r names to w if r has secondary names
@@ -1707,11 +1707,11 @@
for (i = 0; i < ((Word)di->symtab_used) -1; i++) {
- vg_assert(di->symtab[i].addr <= di->symtab[i+1].addr);
+ vg_assert(di->symtab[i].avmas.main <= di->symtab[i+1].avmas.main);
/* Check for common (no overlap) case. */
- if (di->symtab[i].addr + di->symtab[i].size
- <= di->symtab[i+1].addr)
+ if (di->symtab[i].avmas.main + di->symtab[i].size
+ <= di->symtab[i+1].avmas.main)
continue;
/* There's an overlap. Truncate one or the other. */
@@ -1724,17 +1724,19 @@
}
/* Truncate one or the other. */
- sta1 = di->symtab[i].addr;
+ sta1 = di->symtab[i].avmas.main;
end1 = sta1 + di->symtab[i].size - 1;
- toc1 = di->symtab[i].tocptr;
+ toc1 = GET_TOCPTR_AVMA(di->symtab[i].avmas);
+ // aren't we missing local_ep here ????
pri1 = di->symtab[i].pri_name;
sec1 = di->symtab[i].sec_names;
ist1 = di->symtab[i].isText;
isf1 = di->symtab[i].isIFunc;
- sta2 = di->symtab[i+1].addr;
+ sta2 = di->symtab[i+1].avmas.main;
end2 = sta2 + di->symtab[i+1].size - 1;
- toc2 = di->symtab[i+1].tocptr;
+ toc2 = GET_TOCPTR_AVMA(di->symtab[i+1].avmas);
+ // aren't we missing local_ep here ????
pri2 = di->symtab[i+1].pri_name;
sec2 = di->symtab[i+1].sec_names;
ist2 = di->symtab[i+1].isText;
@@ -1757,17 +1759,19 @@
up back at cleanup_more, which will take care of it. */
}
}
- di->symtab[i].addr = sta1;
- di->symtab[i].size = end1 - sta1 + 1;
- di->symtab[i].tocptr = toc1;
+ di->symtab[i].avmas.main = sta1;
+ di->symtab[i].size = end1 - sta1 + 1;
+ SET_TOCPTR_AVMA(di->symtab[i].avmas, toc1);
+ // missing local_ep ???
di->symtab[i].pri_name = pri1;
di->symtab[i].sec_names = sec1;
di->symtab[i].isText = ist1;
di->symtab[i].isIFunc = isf1;
- di->symtab[i+1].addr = sta2;
- di->symtab[i+1].size = end2 - sta2 + 1;
- di->symtab[i+1].tocptr = toc2;
+ di->symtab[i+1].avmas.main = sta2;
+ di->symtab[i+1].size = end2 - sta2 + 1;
+ SET_TOCPTR_AVMA(di->symtab[i+1].avmas, toc2);
+ // missing local_ep ???
di->symtab[i+1].pri_name = pri2;
di->symtab[i+1].sec_names = sec2;
di->symtab[i+1].isText = ist2;
@@ -1780,7 +1784,7 @@
along to maintain the address order requirement. */
j = i+1;
while (j < ((Word)di->symtab_used)-1
- && di->symtab[j].addr > di->symtab[j+1].addr) {
+ && di->symtab[j].avmas.main > di->symtab[j+1].avmas.main) {
SWAP(DiSym,di->symtab[j],di->symtab[j+1]);
j++;
}
@@ -1794,10 +1798,10 @@
/* No zero-sized symbols. */
vg_assert(di->symtab[i].size > 0);
/* In order. */
- vg_assert(di->symtab[i].addr < di->symtab[i+1].addr);
+ vg_assert(di->symtab[i].avmas.main < di->symtab[i+1].avmas.main);
/* No overlaps. */
- vg_assert(di->symtab[i].addr + di->symtab[i].size - 1
- < di->symtab[i+1].addr);
+ vg_assert(di->symtab[i].avmas.main + di->symtab[i].size - 1
+ < di->symtab[i+1].avmas.main);
/* Names are sane(ish) */
vg_assert(di->symtab[i].pri_name);
if (di->symtab[i].sec_names) {
@@ -1834,7 +1838,7 @@
/* Choose the most favoured. */
Word best = 0;
for (j = 1; j < n_tmp; j++) {
- if (preferName(di, tmp[best], tmp[j], di->symtab[i].addr)) {
+ if (preferName(di, tmp[best], tmp[j], di->symtab[i].avmas.main)) {
/* best is unchanged */
} else {
best = j;
@@ -2283,11 +2287,11 @@
/* current unsearched space is from lo to hi, inclusive. */
if (lo > hi) return -1; /* not found */
mid = (lo + hi) / 2;
- a_mid_lo = di->symtab[mid].addr;
+ a_mid_lo = di->symtab[mid].avmas.main;
size = ( match_anywhere_in_sym
? di->symtab[mid].size
: 1);
- a_mid_hi = ((Addr)di->symtab[mid].addr) + size - 1;
+ a_mid_hi = ((Addr)di->symtab[mid].avmas.main) + size - 1;
if (ptr < a_mid_lo) { hi = mid-1; continue; }
if (ptr > a_mid_hi) { lo = mid+1; continue; }
Modified: branches/BUF_REMOVAL/coregrind/m_gdbserver/server.c
==============================================================================
--- branches/BUF_REMOVAL/coregrind/m_gdbserver/server.c (original)
+++ branches/BUF_REMOVAL/coregrind/m_gdbserver/server.c Sat Aug 16 20:09:37 2014
@@ -649,6 +649,45 @@
{
static struct inferior_list_entry *thread_ptr;
+ /* thread local storage query */
+ if (strncmp ("qGetTLSAddr:", arg_own_buf, 12) == 0) {
+ char *from, *to;
+ char *end = arg_own_buf + strlen(arg_own_buf);
+ unsigned long gdb_id;
+ CORE_ADDR lm;
+ CORE_ADDR offset;
+ struct thread_info *ti;
+
+ from = arg_own_buf + 12;
+ to = strchr(from, ',');
+ *to = 0;
+ gdb_id = strtoul (from, NULL, 16);
+ from = to + 1;
+ to = strchr(from, ',');
+ decode_address (&offset, from, to - from);
+ from = to + 1;
+ to = end;
+ decode_address (&lm, from, to - from);
+ dlog(2, "qGetTLSAddr thread %lu offset %p lm %p\n",
+ gdb_id, (void*)offset, (void*)lm);
+
+ ti = gdb_id_to_thread (gdb_id);
+ if (ti != NULL) {
+ ThreadState *tst;
+ Addr tls_addr;
+
+ tst = (ThreadState *) inferior_target_data (ti);
+ if (valgrind_get_tls_addr(tst, offset, lm, &tls_addr)) {
+ VG_(sprintf) (arg_own_buf, "%lx", tls_addr);
+ return;
+ }
+ // else we will report we do not support qGetTLSAddr
+ } else {
+ write_enn (arg_own_buf);
+ return;
+ }
+ }
+
/* qRcmd, monitor command handling. */
if (strncmp ("qRcmd,", arg_own_buf, 6) == 0) {
char *p = arg_own_buf + 6;
@@ -706,7 +745,7 @@
return;
}
}
-
+
if (strcmp ("qAttached", arg_own_buf) == 0) {
/* tell gdb to always detach, never kill the process */
arg_own_buf[0] = '1';
Modified: branches/BUF_REMOVAL/coregrind/m_gdbserver/target.c
==============================================================================
--- branches/BUF_REMOVAL/coregrind/m_gdbserver/target.c (original)
+++ branches/BUF_REMOVAL/coregrind/m_gdbserver/target.c Sat Aug 16 20:09:37 2014
@@ -547,6 +547,144 @@
return valgrind_point (/* insert*/ False, type, addr, len);
}
+/* Returns the (platform specific) offset of lm_modid field in the link map
+ struct.
+ Stores the offset in *result and returns True if offset can be determined.
+ Returns False otherwise. *result is not to be used then. */
+static Bool getplatformoffset (SizeT *result)
+{
+ static Bool getplatformoffset_called = False;
+
+ static Bool lm_modid_offset_found = False;
+ static SizeT lm_modid_offset = 1<<31; // Rubbish initial value.
+ // lm_modid_offset is a magic offset, retrieved using an external program.
+
+ if (!getplatformoffset_called) {
+ const HChar *platform = VG_PLATFORM;
+ const HChar *cmdformat = "%s/%s-%s -o %s";
+ const HChar *getoff = "getoff";
+ HChar outfile[VG_(mkstemp_fullname_bufsz) (VG_(strlen)(getoff))];
+ Int fd = VG_(mkstemp) (getoff, outfile);
+ HChar cmd[ VG_(strlen)(cmdformat)
+ + VG_(strlen)(VG_(libdir)) - 2
+ + VG_(strlen)(getoff) - 2
+ + VG_(strlen)(platform) - 2
+ + VG_(strlen)(outfile) - 2
+ + 1];
+ UInt cmdlen;
+ struct vg_stat stat_buf;
+ Int ret;
+
+ cmdlen = VG_(snprintf)(cmd, sizeof(cmd),
+ cmdformat,
+ VG_(libdir), getoff, platform, outfile);
+ vg_assert (cmdlen == sizeof(cmd) - 1);
+ ret = VG_(system) (cmd);
+ if (ret != 0 || VG_(debugLog_getLevel)() >= 1)
+ VG_(dmsg) ("command %s exit code %d\n", cmd, ret);
+ ret = VG_(fstat)( fd, &stat_buf );
+ if (ret != 0)
+ VG_(dmsg) ("error VG_(fstat) %d %s\n", fd, outfile);
+ else {
+ HChar *w;
+ HChar *ssaveptr;
+ HChar *os;
+ HChar *str;
+ HChar *endptr;
+
+ os = malloc (stat_buf.size+1);
+ vg_assert (os);
+ ret = VG_(read)(fd, os, stat_buf.size);
+ vg_assert(ret == stat_buf.size);
+ os[ret] = '\0';
+ str = os;
+ while ((w = VG_(strtok_r)(str, " \n", &ssaveptr)) != NULL) {
+ if (VG_(strcmp) (w, "lm_modid_offset") == 0) {
+ w = VG_(strtok_r)(NULL, " \n", &ssaveptr);
+ lm_modid_offset = (SizeT) VG_(strtoull16) ( w, &endptr );
+ if (endptr == w)
+ VG_(dmsg) ("%s lm_modid_offset unexpected hex value %s\n",
+ cmd, w);
+ else
+ lm_modid_offset_found = True;
+ } else {
+ VG_(dmsg) ("%s produced unexpected %s\n", cmd, w);
+ }
+ str = NULL; // ensure next VG_(strtok_r) continues the parsing.
+ }
+ VG_(free) (os);
+ }
+
+ VG_(close)(fd);
+ ret = VG_(unlink)( outfile );
+ if (ret != 0)
+ VG_(umsg) ("error: could not unlink %s\n", outfile);
+ getplatformoffset_called = True;
+ }
+
+ *result = lm_modid_offset;
+ return lm_modid_offset_found;
+}
+
+Bool valgrind_get_tls_addr (ThreadState *tst,
+ CORE_ADDR offset,
+ CORE_ADDR lm,
+ CORE_ADDR *tls_addr)
+{
+ CORE_ADDR **dtv_loc;
+ CORE_ADDR *dtv;
+ SizeT lm_modid_offset;
+ unsigned long int modid;
+
+#define CHECK_DEREF(addr, len, name) \
+ if (!VG_(am_is_valid_for_client) ((Addr)(addr), (len), VKI_PROT_READ)) { \
+ dlog(0, "get_tls_addr: %s at %p len %lu not addressable\n", \
+ name, (void*)(addr), (unsigned long)(len)); \
+ return False; \
+ }
+
+ *tls_addr = 0;
+
+ if (the_low_target.target_get_dtv == NULL) {
+ dlog(1, "low level dtv support not available\n");
+ return False;
+ }
+
+ if (!getplatformoffset (&lm_modid_offset)) {
+ dlog(0, "link_map modid field offset not available\n");
+ return False;
+ }
+ dlog (2, "link_map modid offset %p\n", (void*)lm_modid_offset);
+ vg_assert (lm_modid_offset < 0x10000); // let's say
+
+ dtv_loc = (*the_low_target.target_get_dtv)(tst);
+ if (dtv_loc == NULL) {
+ dlog(0, "low level dtv support returned NULL\n");
+ return False;
+ }
+
+ CHECK_DEREF(dtv_loc, sizeof(CORE_ADDR), "dtv_loc");
+ dtv = *dtv_loc;
+
+ // Check we can read at least 2 address at the beginning of dtv.
+ CHECK_DEREF(dtv, 2*sizeof(CORE_ADDR), "dtv 2 first entries");
+ dlog (2, "tid %d dtv %p\n", tst->tid, (void*)dtv);
+
+ // Check we can read the modid
+ CHECK_DEREF(lm+lm_modid_offset, sizeof(unsigned long int), "link_map modid");
+ modid = *(unsigned long int *)(lm+lm_modid_offset);
+
+ // Check we can access the dtv entry for modid
+ CHECK_DEREF(dtv + 2 * modid, sizeof(CORE_ADDR), "dtv[2*modid]");
+
+ // And finally compute the address of the tls variable.
+ *tls_addr = *(dtv + 2 * modid) + offset;
+
+ return True;
+
+#undef CHECK_DEREF
+}
+
/* returns a pointer to the architecture state corresponding to
the provided register set: 0 => normal guest registers,
1 => shadow1
Modified: branches/BUF_REMOVAL/coregrind/m_gdbserver/target.h
==============================================================================
--- branches/BUF_REMOVAL/coregrind/m_gdbserver/target.h (original)
+++ branches/BUF_REMOVAL/coregrind/m_gdbserver/target.h Sat Aug 16 20:09:37 2014
@@ -200,11 +200,29 @@
extern int valgrind_insert_watchpoint (char type, CORE_ADDR addr, int len);
extern int valgrind_remove_watchpoint (char type, CORE_ADDR addr, int len);
+/* Get the address of a thread local variable.
+ 'tst' is the thread for which thread local address is searched for.
+ 'offset' is the offset of the variable in the tls data of the load
+ module identified by 'lm'.
+ 'lm' is the link_map address of the loaded module : it is the address
+ of the data structure used by the dynamic linker to maintain various
+ information about a loaded object.
+
+ Returns True if the address of the variable could be found.
+ *tls_addr is then set to this address.
+ Returns False if tls support is not available for this arch, or
+ if an error occured. *tls_addr is set to NULL. */
+extern Bool valgrind_get_tls_addr (ThreadState *tst,
+ CORE_ADDR offset,
+ CORE_ADDR lm,
+ CORE_ADDR *tls_addr);
+
/* -------------------------------------------------------------------------- */
/* ----------- Utils functions for low level arch specific files ------------ */
/* -------------------------------------------------------------------------- */
+
/* returns a pointer to the architecture state corresponding to
the provided register set: 0 => normal guest registers,
1 => shadow1
Modified: branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-amd64.c
==============================================================================
--- branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-amd64.c (original)
+++ branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-amd64.c Sat Aug 16 20:09:37 2014
@@ -315,6 +315,7 @@
VG_(machine_get_VexArchInfo) (&va, &vai);
return (vai.hwcaps & VEX_HWCAPS_AMD64_AVX ? True : False);
}
+
static
const char* target_xml (Bool shadow_mode)
{
@@ -345,6 +346,12 @@
}
}
+static CORE_ADDR** target_get_dtv (ThreadState *tst)
+{
+ VexGuestAMD64State* amd64 = (VexGuestAMD64State*)&tst->arch.vex;
+ return (CORE_ADDR**)((CORE_ADDR)amd64->guest_FS_ZERO + 0x8);
+}
+
static struct valgrind_target_ops low_target = {
-1, // Must be computed at init time.
regs,
@@ -353,7 +360,8 @@
get_pc,
set_pc,
"amd64",
- target_xml
+ target_xml,
+ target_get_dtv
};
void amd64_init_architecture (struct valgrind_target_ops *target)
Modified: branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-arm.c
==============================================================================
--- branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-arm.c (original)
+++ branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-arm.c Sat Aug 16 20:09:37 2014
@@ -145,18 +145,17 @@
// pc aligned on 4 bytes. We need to use debug info.
{
HChar *fnname;
- Addr entrypoint;
- Addr ptoc; // unused but needed.
+ SymAVMAs avmas;
// If this is a thumb instruction, we need to ask
// the debug info with the bit0 set
// (why can't debug info do that for us ???)
// (why if this is a 4 bytes thumb instruction ???)
if (VG_(get_fnname_raw) (pc | 1, &fnname)) {
- if (VG_(lookup_symbol_SLOW)( "*", fnname, &entrypoint, &ptoc )) {
+ if (VG_(lookup_symbol_SLOW)( "*", fnname, &avmas )) {
dlog (1, "fnname %s lookupsym %p => %p %s.\n",
- fnname, C2v(entrypoint), C2v(pc),
- (entrypoint & 1 ? "thumb" : "arm"));
- if (entrypoint & 1)
+ fnname, C2v(avmas.main), C2v(pc),
+ (avmas.main & 1 ? "thumb" : "arm"));
+ if (avmas.main & 1)
return pc | 1;
else
return pc;
@@ -287,6 +286,13 @@
}
}
+static CORE_ADDR** target_get_dtv (ThreadState *tst)
+{
+ VexGuestARMState* arm = (VexGuestARMState*)&tst->arch.vex;
+ // arm dtv is pointed to by TPIDRURO
+ return (CORE_ADDR**)((CORE_ADDR)arm->guest_TPIDRURO);
+}
+
static struct valgrind_target_ops low_target = {
num_regs,
regs,
@@ -295,7 +301,8 @@
get_pc,
set_pc,
"arm",
- target_xml
+ target_xml,
+ target_get_dtv
};
void arm_init_architecture (struct valgrind_target_ops *target)
Modified: branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-arm64.c
==============================================================================
--- branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-arm64.c (original)
+++ branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-arm64.c Sat Aug 16 20:09:37 2014
@@ -261,6 +261,13 @@
#endif
}
+static CORE_ADDR** target_get_dtv (ThreadState *tst)
+{
+ VexGuestARM64State* arm64 = (VexGuestARM64State*)&tst->arch.vex;
+ // arm64 dtv is pointed to by TPIDR_EL0.
+ return (CORE_ADDR**)((CORE_ADDR)arm64->guest_TPIDR_EL0);
+}
+
static struct valgrind_target_ops low_target = {
num_regs,
regs,
@@ -269,7 +276,8 @@
get_pc,
set_pc,
"arm64",
- target_xml
+ target_xml,
+ target_get_dtv
};
void arm64_init_architecture (struct valgrind_target_ops *target)
Modified: branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-mips32.c
==============================================================================
--- branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-mips32.c (original)
+++ branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-mips32.c Sat Aug 16 20:09:37 2014
@@ -354,6 +354,14 @@
}
}
+static CORE_ADDR** target_get_dtv (ThreadState *tst)
+{
+ VexGuestMIPS32State* mips32 = (VexGuestMIPS32State*)&tst->arch.vex;
+ // mips32 dtv location similar to ppc64
+ return (CORE_ADDR**)((CORE_ADDR)mips32->guest_ULR
+ - 0x7000 - sizeof(CORE_ADDR));
+}
+
static struct valgrind_target_ops low_target = {
num_regs,
regs,
@@ -362,7 +370,8 @@
get_pc,
set_pc,
"mips",
- target_xml
+ target_xml,
+ target_get_dtv
};
void mips32_init_architecture (struct valgrind_target_ops *target)
Modified: branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-mips64.c
==============================================================================
--- branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-mips64.c (original)
+++ branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-mips64.c Sat Aug 16 20:09:37 2014
@@ -355,6 +355,14 @@
}
}
+static CORE_ADDR** target_get_dtv (ThreadState *tst)
+{
+ VexGuestMIPS64State* mips64 = (VexGuestMIPS64State*)&tst->arch.vex;
+ // mips64 dtv location similar to ppc64
+ return (CORE_ADDR**)((CORE_ADDR)mips64->guest_ULR
+ - 0x7000 - sizeof(CORE_ADDR));
+}
+
static struct valgrind_target_ops low_target = {
num_regs,
regs,
@@ -363,7 +371,8 @@
get_pc,
set_pc,
"mips64",
- target_xml
+ target_xml,
+ target_get_dtv
};
void mips64_init_architecture (struct valgrind_target_ops *target)
Modified: branches/BUF_REMOVAL/coregrind/m_gdbserver/valgrind-low-ppc32.c
==============================================================================
--- branches/BUF_REMOVA...
[truncated message content] |