From patchwork Fri May 15 21:17:52 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Evans X-Patchwork-Id: 6757 Received: (qmail 3427 invoked by alias); 15 May 2015 21:17:58 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 3359 invoked by uid 89); 15 May 2015 21:17:57 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.8 required=5.0 tests=AWL, BAYES_00, KAM_STOCKGEN, RCVD_IN_DNSWL_LOW, SPF_PASS, T_RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: mail-ie0-f201.google.com Received: from mail-ie0-f201.google.com (HELO mail-ie0-f201.google.com) (209.85.223.201) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Fri, 15 May 2015 21:17:54 +0000 Received: by ierx19 with SMTP id x19so6716352ier.0 for ; Fri, 15 May 2015 14:17:52 -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:message-id:date:subject:from:to :content-type; bh=qyCS85yLYQHihIAEp+QA/HoGIxP/pfz8D/OcPfbHb6I=; b=g2/Zu8JoCh3PK441xlQSezlcsWaQUx/bYRqHJ/rik4Z5gf3QLpIINEDibVw7PKE8g7 C4/kXtlDsbKPfDyPFrLowozIlSS+P/sDQEK+yeo+wmSaqd9ufoqmZ3GFiSrM0XCUKjxh 4VWyzQC/APrPhE5ZHTPJ3LYcvcHbxhIDVrOVrE8394mq/vv/O6sRcUEFseAUyIQwTUr9 ZculzHIggbVLGRoHp2c50IijFrGkXoVd9NVraZm0nv2jwnNeFXa2QAI30CfmRGzRr10h RCccqwF4DeLj1nT46JPEE9qib967HbQzVJ68S+++iM4upUqa2nBxmt8QVeyva0DWRqfS Ga9Q== X-Gm-Message-State: ALoCoQmqyVOh8HtTsFfE/GTnTv72X0Lnog08AtMoVOkvsNyJKzimQAJcEsFpKacyAQihcx7zC9fu3Qdr/MIYMU9IAw6MrUu5x+5UDs42RJQTOTr6qHtsy92We+gY8V24gfhnmMQ31eQq8+PiWC6GjYL12HaePXhNXJZdRLOzsgh1rITMQgYNVAM= MIME-Version: 1.0 X-Received: by 10.50.18.42 with SMTP id t10mr3084521igd.0.1431724672418; Fri, 15 May 2015 14:17:52 -0700 (PDT) Message-ID: <089e014946b284ccdb0516256040@google.com> Date: Fri, 15 May 2015 21:17:52 +0000 Subject: [PATCH][PR c++/18141, c++/18417] std::iostream is a typedef From: Doug Evans To: gdb-patches@sourceware.org X-IsSubscribed: yes Hi. This patch fixes 18141, 18417. gnuv3_rtti_type/cp_lookup_rtti_type make the assumption that the name being lookup up is a class (after all, gnuv3_rtti_type calls check_typedef). This assumption breaks for std::iostream. From 18417: "p std::cerr" can give the following: warning: RTTI symbol for class 'std::iostream' has bad type this is because the minsym for the vtable is a typedef. gnuv3_rtti_type calls check_typedef on the value's type, and then does a minsym lookup by pc for the vtable which returns "_ZTVSo" which demangles as "vtable for std::ostream", and "std::iostream" is a typedef. For 18141, this is another classic case of .gdb_index saying the symbol is present but upon expansion symbol lookup doesn't find it. So we end up expanding one (or more) CUs in potentially 1000s of shared libraries. The cost is 10s of GB of memory and an untold number of minutes (I gave up waiting for it to finish). My gmonster perf testcase will have a test to cover this. 2015-05-15 Doug Evans PR c++/18141, c++/18417. * cp-support.c (cp_lookup_rtti_type): Handle the case of NAME being a typedef. testsuite/ * gdb.cp/iostream.cc: New file. * gdb.cp/iostream.exp: New file. diff --git a/gdb/cp-support.c b/gdb/cp-support.c index 4bbee94..3db9751 100644 --- a/gdb/cp-support.c +++ b/gdb/cp-support.c @@ -1453,7 +1453,9 @@ cp_lookup_rtti_type (const char *name, struct block *block) struct symbol * rtti_sym; struct type * rtti_type; - rtti_sym = lookup_symbol (name, block, STRUCT_DOMAIN, NULL); + /* Use VAR_DOMAIN here as NAME may be a typedef. PR 18141, 18417. + Classes "live" in both STRUCT_DOMAIN and VAR_DOMAIN. */ + rtti_sym = lookup_symbol (name, block, VAR_DOMAIN, NULL); if (rtti_sym == NULL) { @@ -1467,7 +1469,7 @@ cp_lookup_rtti_type (const char *name, struct block *block) return NULL; } - rtti_type = SYMBOL_TYPE (rtti_sym); + rtti_type = check_typedef (SYMBOL_TYPE (rtti_sym)); switch (TYPE_CODE (rtti_type)) { diff --git a/gdb/testsuite/gdb.cp/iostream.cc b/gdb/testsuite/gdb.cp/iostream.cc new file mode 100644 index 0000000..2e78599 --- /dev/null +++ b/gdb/testsuite/gdb.cp/iostream.cc @@ -0,0 +1,27 @@ +/* Code to go along with tests in rtti.exp. + + Copyright 2015 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +#include + +int +main () +{ + std::cerr << "cerr\n"; + return 0; +} diff --git a/gdb/testsuite/gdb.cp/iostream.exp b/gdb/testsuite/gdb.cp/iostream.exp new file mode 100644 index 0000000..3b864a8 --- /dev/null +++ b/gdb/testsuite/gdb.cp/iostream.exp @@ -0,0 +1,44 @@ +# Copyright 2015 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# This file is part of the gdb testsuite. +# It tests various aspects of iostream that have caused problems for gdb. + +if { [skip_cplus_tests] } { continue } + +standard_testfile .cc + +if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} { + return -1 +} + +if ![runto_main] { + perror "couldn't run to breakpoint" + continue +} + +# PR 18417 +# std::iostream is problematic because the minimal symbol for its vtable is +# "_ZTVSo" which demangles as "vtable for std::ostream" and std::iostream +# a typedef. +set test "p std::cerr" +gdb_test_multiple $test $test { + -re "warning: RTTI symbol for class '.*' has bad type.*$gdb_prompt $" { + fail $test + } + -re ".*$gdb_prompt $" { + pass $test + } +}