From patchwork Fri Jul 18 21:41:36 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xinliang David Li X-Patchwork-Id: 371727 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]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 0F79B140116 for ; Sat, 19 Jul 2014 07:41:51 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:date:message-id:subject:from:to:cc:content-type; q=dns; s=default; b=HGDynbjwAUgn/Up9J2mPq8RpNz3O/A/ecmPXWK5EF3D hDqygPutwJt6nStZ6jq9pRotSXnjsIsVZjxtiKNKpkjz0TCYLgl29p9RooL1hf1b mOeJ6lbK2JDt4PuaM2dAaO0om+TSYuXANoXrAz9H1Vssn2Z3j1LdubkhpQwQAJ/E = DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:date:message-id:subject:from:to:cc:content-type; s=default; bh=MfeZBVZh/V9VUdcSw6Xn9mzAu7I=; b=yhUjmSGl6w0wwC73Q gjW+BFGGgQj/qJcGdIaPtnccxM5s4k0XcfbUlWMgpXIfdRx/c31eOJ2ExLaZ9pwf QtP8q4wQhuJEo8hwTjRJZVFf139tw/yfS9nfh2RR7sENaX7i1t5prXSCRAb1PC7h nHzIkfANw+TyR4a9x+JJ9Fafbw= Received: (qmail 14549 invoked by alias); 18 Jul 2014 21:41:44 -0000 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 Received: (qmail 14481 invoked by uid 89); 18 Jul 2014 21:41:41 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.8 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_LOW, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-wi0-f169.google.com Received: from mail-wi0-f169.google.com (HELO mail-wi0-f169.google.com) (209.85.212.169) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Fri, 18 Jul 2014 21:41:40 +0000 Received: by mail-wi0-f169.google.com with SMTP id n3so1738128wiv.2 for ; Fri, 18 Jul 2014 14:41:36 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:date:message-id:subject:from:to:cc :content-type; bh=mALe/W4YYzgPLDr/h6NCcitAJioJrp7Qxol0gkoI/ag=; b=Lm97fsr/ChbxaqPh2xcda1IfLmMTz3j5z2srQeD6pdqyW+AKHq5Vs+4XM50GhI07As s7VXH2c5cII4AewHV1R0vydN7aYGyb2Zoz/VOAG2gf6fLCn7yUGh/OZwGW5VeaLPzexk VXENIvadShCxxOvOV1dbGzw50xCVRA6gLoPt7TRo1wfZ/56nqatV55liU9faXHKond7x cQ3F2zOHevu+6E12kc9vNGObQuHgEENpNkbxqXo16dQbN9GVsiqnKCOozWscivGylm2K SFoJ0tNvqAxi5Y5JM1LDRvWQbgMOexK6NmUBv0jgpjNNaZOQyPt5pyTPzO4CvKdonNPi GMCg== X-Gm-Message-State: ALoCoQmW7vp3Zbbx8IHq44GSd0akeN6IqIip1ROFfvOD6xNHZ/v2+MUYubgZ7XXKOu0Vue8g6RKC MIME-Version: 1.0 X-Received: by 10.180.75.230 with SMTP id f6mr37344997wiw.5.1405719696541; Fri, 18 Jul 2014 14:41:36 -0700 (PDT) Received: by 10.180.7.34 with HTTP; Fri, 18 Jul 2014 14:41:36 -0700 (PDT) Date: Fri, 18 Jul 2014 14:41:36 -0700 Message-ID: Subject: a new libgcov interface: __gcov_dump_all From: Xinliang David Li To: GCC Patches Cc: Jan Hubicka X-IsSubscribed: yes Hi, the following patch implements a new dumper interface to allow dumping of profile data for all instrumented shared libraries. For good reasons, existing libgcov implements the dumping on a per-shared library basis (i.e., gcov_exit is hidden, gcov_list is file static). This allows each shared library's profile data to be dumped independently with separate summary data. The downside is that there is no interface that can be invoked to dump profile data for all shared modules. The attached patch does that. Ok for trunk after testing? thanks, David Index: libgcc/ChangeLog =================================================================== --- libgcc/ChangeLog (revision 212682) +++ libgcc/ChangeLog (working copy) @@ -1,3 +1,9 @@ +2014-07-18 Xinliang David Li + + * libgcov-driver.c: Force __gcov_dump to be exported + * libgcov-interface.c (register_dumper): New function. + (__gcov_dump_all): Ditto. + 2014-07-14 Richard Biener * libgcov.h (struct gcov_fn_info): Make ctrs size 1. Index: libgcc/libgcov-driver.c =================================================================== --- libgcc/libgcov-driver.c (revision 212682) +++ libgcc/libgcov-driver.c (working copy) @@ -55,6 +55,13 @@ extern void set_gcov_dump_complete (void extern void reset_gcov_dump_complete (void) ATTRIBUTE_HIDDEN; extern int get_gcov_dump_complete (void) ATTRIBUTE_HIDDEN; extern void set_gcov_list (struct gcov_info *) ATTRIBUTE_HIDDEN; + +#ifndef IN_GCOV_TOOL + +/* Creates strong reference to force _gcov_dump.o to be linked + in shared library for exported interfaces. */ +void (*__gcov_dummy_ref)(void) = &__gcov_dump; +#endif struct gcov_fn_buffer { Index: libgcc/libgcov-interface.c =================================================================== --- libgcc/libgcov-interface.c (revision 212682) +++ libgcc/libgcov-interface.c (working copy) @@ -115,6 +115,43 @@ __gcov_dump (void) set_gcov_dump_complete (); } +typedef void (*gcov_dumper_type) (void); +struct dumper_entry +{ + gcov_dumper_type dumper; + struct dumper_entry *next_dumper; +}; + +static struct dumper_entry this_dumper = {&__gcov_dump, 0}; + +/* global dumper list with default visibilty. */ +struct dumper_entry *__gcov_dumper_list; + + +__attribute__((constructor)) +static void +register_dumper (void) +{ + this_dumper.next_dumper = __gcov_dumper_list; + __gcov_dumper_list = &this_dumper; +} + +/* Public interface to dump profile data for all shared libraries + via registered dumpers from the libraries. This interface + has default visibility (unlike gcov_dump which has hidden + visbility. */ + +void +__gcov_dump_all (void) +{ + struct dumper_entry *dumper = __gcov_dumper_list; + while (dumper) + { + dumper->dumper (); + dumper = dumper->next_dumper; + } +} + #endif /* L_gcov_dump */ Index: libgcc/libgcov.h =================================================================== --- libgcc/libgcov.h (revision 212682) +++ libgcc/libgcov.h (working copy) @@ -218,8 +218,14 @@ extern void __gcov_flush (void) ATTRIBUT /* Function to reset all counters to 0. */ extern void __gcov_reset (void); -/* Function to enable early write of profile information so far. */ -extern void __gcov_dump (void); +/* Function to enable early write of profile information so far. + __GCOV_DUMP is also used by __GCOV_DUMP_ALL. The latter + depends on __GCOV_DUMP to have hidden or protected visibility + so that each library has its own copy of the registered dumper. */ +extern void __gcov_dump (void) ATTRIBUTE_HIDDEN; + +/* Call __gcov_dump registered from each shared library. */ +void __gcov_dump_all (void); /* The merge function that just sums the counters. */ extern void __gcov_merge_add (gcov_type *, unsigned) ATTRIBUTE_HIDDEN;