From patchwork Wed Feb 27 21:52:25 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom Tromey X-Patchwork-Id: 223711 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id A80E62C0080 for ; Thu, 28 Feb 2013 08:52:54 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1362606775; h=Comment: DomainKey-Signature:Received:Received:Received:Received:Received: From:To:Subject:CC:Date:Message-ID:MIME-Version:Content-Type: Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:Sender:Delivered-To; bh=Ej6ClV/9U0p8kT0f6qsr 1HunAzU=; b=ZofLgthkNPJud34bHvErit7c7dLSTWjKsaGo2O7wy1UyohDKcUWC ptPPkJ7q8gLhm//P+odnos96v/3TLlwEDigsLgpr4Sa7J4ll7CA9kaUZamuAPOZH 8Anjd+5OAEED+Up2tlREb+vaEoi/UtOORnc3iHFhXyiLj+HKfnXyYYI= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:Received:Received:From:To:Subject:CC:Date:Message-ID:MIME-Version:Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=afb1gKo7oGkwIEQsB/cYxSfYC2u6yiwRDEuj3y7UNyUU2TjsjCswb9GImyxi5a 4RSMkIC2VuSSeB8ai/OHBJSApbwqzTXvgkigHkJB+lbyw7YQmpx/zi8bqpgE7Okh vxM1h8MHqubIlH8jiwIkO/suAJWglty6Es0bwhr8bS5k8=; Received: (qmail 12676 invoked by alias); 27 Feb 2013 21:52:34 -0000 Received: (qmail 12658 invoked by uid 22791); 27 Feb 2013 21:52:33 -0000 X-SWARE-Spam-Status: No, hits=-6.7 required=5.0 tests=AWL, BAYES_00, KHOP_RCVD_UNTRUST, KHOP_SPAMHAUS_DROP, RCVD_IN_DNSWL_HI, RCVD_IN_HOSTKARMA_W, RP_MATCHES_RCVD, SPF_HELO_PASS, TW_CX X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 27 Feb 2013 21:52:28 +0000 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r1RLqRbJ000671 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 27 Feb 2013 16:52:27 -0500 Received: from barimba (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id r1RLqPWT008232 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Wed, 27 Feb 2013 16:52:26 -0500 From: Tom Tromey To: libstdc Subject: RFC: add some static probes to libstdc++ CC: gcc-patches@gcc.gnu.org Date: Wed, 27 Feb 2013 14:52:25 -0700 Message-ID: <87sj4hzap2.fsf@fleche.redhat.com> MIME-Version: 1.0 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org I've been working a bit on improving exception-related features in gdb. I had two goals which led to this particular patch. First, I wanted to be able to implement type-name-based filtering for "catch catch" and friends. (This feature was documented in the past, but never implemented, and occasionally people run across the old docs and are disappointed that it doesn't work.) Second, I wanted to be able to expose the currently-thrown-or-caught exception to the gdb user as a convenience variable. I thought this would make it simpler to write more sophisticated catch/throw condition expressions. After digging into libsupc++ a bit, I found that I needed some extra information to be exposed. The best way I know of to do that is to add some static probes to the library. These are cheap, work well with gdb, and do not require debuginfo in order to work. Note that this kind of probe is already in use in libgcc. So, accepting them into libstdc++ doesn't mean any extra dependencies or the like. I needed 3 probes, one each for catch, throw, and rethrow. SDT probes take both a provider (I chose "libstdcxx") and a name (I chose the obvious ones). The arguments to the probes are chosen so that they expose the information gdb needs, namely a pointer to the exception object and a pointer to the exception's type_info. I'm not totally sure if the unwind-cxx.h changes are written the best way possible. I'm posting this now to get reactions to the probe before cleaning up the corresponding gdb patches for submission. I've built it both with and without sys/sdt.h, but I haven't yet run the test suite. Tom 2013-02-27 Tom Tromey * libsupc++/unwind-cxx.h: Include ../config.h, sys/sdt.h. (PROBE2): New macro. * libsupc++/eh_throw.cc (__cxa_throw, __cxa_rethrow): Add probe. * libsupc++/eh_catch.cc (__cxa_begin_catch): Add probe. * configure.ac: Check for sys/sdt.h. * configure, config.h.in: Rebuild. diff --git a/libstdc++-v3/configure.ac b/libstdc++-v3/configure.ac index 66164a2..d0b8c27 100644 --- a/libstdc++-v3/configure.ac +++ b/libstdc++-v3/configure.ac @@ -216,7 +216,7 @@ GLIBCXX_CHECK_SYSCTL_HW_NCPU AC_CHECK_HEADERS([endian.h execinfo.h float.h fp.h ieeefp.h inttypes.h \ locale.h machine/endian.h machine/param.h nan.h stdint.h stdlib.h string.h \ strings.h sys/ipc.h sys/isa_defs.h sys/machine.h sys/param.h \ -sys/resource.h sys/sem.h sys/stat.h sys/time.h sys/types.h unistd.h \ +sys/resource.h sys/sdt.h sys/sem.h sys/stat.h sys/time.h sys/types.h unistd.h \ wchar.h wctype.h]) # Only do link tests if native. Else, hardcode. diff --git a/libstdc++-v3/libsupc++/eh_catch.cc b/libstdc++-v3/libsupc++/eh_catch.cc index 779f5a3..43e875a 100644 --- a/libstdc++-v3/libsupc++/eh_catch.cc +++ b/libstdc++-v3/libsupc++/eh_catch.cc @@ -80,6 +80,9 @@ __cxxabiv1::__cxa_begin_catch (void *exc_obj_in) _GLIBCXX_NOTHROW } objectp = __gxx_caught_object(exceptionObject); + + PROBE2 (catch, objectp, header->exceptionType); + #ifdef __ARM_EABI_UNWINDER__ _Unwind_Complete(exceptionObject); #endif diff --git a/libstdc++-v3/libsupc++/eh_throw.cc b/libstdc++-v3/libsupc++/eh_throw.cc index 297aa04..a79a025 100644 --- a/libstdc++-v3/libsupc++/eh_throw.cc +++ b/libstdc++-v3/libsupc++/eh_throw.cc @@ -60,6 +60,8 @@ extern "C" void __cxxabiv1::__cxa_throw (void *obj, std::type_info *tinfo, void (_GLIBCXX_CDTOR_CALLABI *dest) (void *)) { + PROBE2 (throw, obj, tinfo); + // Definitely a primary. __cxa_refcounted_exception *header = __get_refcounted_exception_header_from_obj (obj); @@ -97,7 +99,12 @@ __cxxabiv1::__cxa_rethrow () if (!__is_gxx_exception_class(header->unwindHeader.exception_class)) globals->caughtExceptions = 0; else - header->handlerCount = -header->handlerCount; + { + header->handlerCount = -header->handlerCount; + // Only notify probe for C++ exceptions. + PROBE2 (rethrow, __get_object_from_ambiguous_exception(header), + header->exceptionType); + } #ifdef _GLIBCXX_SJLJ_EXCEPTIONS _Unwind_SjLj_Resume_or_Rethrow (&header->unwindHeader); diff --git a/libstdc++-v3/libsupc++/unwind-cxx.h b/libstdc++-v3/libsupc++/unwind-cxx.h index e2b945d..69a0c16 100644 --- a/libstdc++-v3/libsupc++/unwind-cxx.h +++ b/libstdc++-v3/libsupc++/unwind-cxx.h @@ -28,6 +28,8 @@ #ifndef _UNWIND_CXX_H #define _UNWIND_CXX_H 1 +#include "../config.h" + // Level 2: C++ ABI #include @@ -37,6 +39,17 @@ #include #include +#ifdef HAVE_SYS_SDT_H +#include +/* We only want to use stap probes starting with v3. Earlier versions + added too much startup cost. */ +#if defined (STAP_PROBE2) && _SDT_NOTE_TYPE >= 3 +#define PROBE2(name, arg1, arg2) STAP_PROBE2 (libstdcxx, name, arg1, arg2) +#else +#define PROBE2(name, arg1, arg2) +#endif +#endif + #pragma GCC visibility push(default) namespace __cxxabiv1