From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 57404 invoked by alias); 19 Apr 2019 14:45:26 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 57286 invoked by uid 89); 19 Apr 2019 14:45:14 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-1.6 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_NONE,SPF_HELO_PASS autolearn=ham version=3.3.1 spammy= X-HELO: gateway32.websitewelcome.com Received: from gateway32.websitewelcome.com (HELO gateway32.websitewelcome.com) (192.185.145.111) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 19 Apr 2019 14:45:05 +0000 Received: from cm14.websitewelcome.com (cm14.websitewelcome.com [100.42.49.7]) by gateway32.websitewelcome.com (Postfix) with ESMTP id AF1CF25BBA for ; Fri, 19 Apr 2019 09:45:04 -0500 (CDT) Received: from box5379.bluehost.com ([162.241.216.53]) by cmsmtp with SMTP id HUlEh9fZu2qH7HUlEhV2bA; Fri, 19 Apr 2019 09:45:04 -0500 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tromey.com; s=default; h=Content-Type:MIME-Version:Message-ID:In-Reply-To:Date: References:Subject:Cc:To:From:Sender:Reply-To:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=l3lG40ovfC8bPdFVcguCS+F6idcJi4XyS4SC1FXwmkA=; b=Xz3FyKCHMTADBMBT6HmOw48f4Z /LsuQjTJ0ADvab6t1VbgajdxjipJVFwIqwtJl9tQ4n9ZmjWFBWwUNJkmvdx5VY2ZSdDaTq9qtA5O9 r5sgFIcvYtPYy7Q7NpOPLkogl; Received: from 97-122-168-123.hlrn.qwest.net ([97.122.168.123]:56362 helo=murgatroyd) by box5379.bluehost.com with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.91) (envelope-from ) id 1hHUlE-000VDT-FL; Fri, 19 Apr 2019 09:45:04 -0500 From: Tom Tromey To: Andrew Burgess Cc: gdb-patches@sourceware.org Subject: Re: [PATCHv2 4/5] gdb: Introduce new language field la_is_string_type_p References: Date: Fri, 19 Apr 2019 14:45:00 -0000 In-Reply-To: (Andrew Burgess's message of "Wed, 17 Apr 2019 00:06:09 +0100") Message-ID: <878sw6dpg0.fsf@tromey.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-SW-Source: 2019-04/txt/msg00380.txt.bz2 >>>>> "Andrew" == Andrew Burgess writes: Andrew> Some languages already have a "is this a string" predicate that I was Andrew> able to reuse, while for other languages I've had to add a new Andrew> predicate. In this case I took inspiration from the value printing Andrew> code for that language - what different conditions would result in Andrew> printing something as a string. This looks essentially fine, but I had some questions. Andrew> +bool Andrew> +c_is_string_type_p (struct type *type) Andrew> +{ Andrew> + type = check_typedef (type); Andrew> + while (TYPE_CODE (type) == TYPE_CODE_REF) Andrew> + { Andrew> + type = TYPE_TARGET_TYPE (type); Andrew> + type = check_typedef (type); Andrew> + } Andrew> + Andrew> + switch (TYPE_CODE (type)) Andrew> + { Andrew> + case TYPE_CODE_ARRAY: Andrew> + { Andrew> + /* See if target type looks like a string. */ Andrew> + struct type *array_target_type = TYPE_TARGET_TYPE (type); Andrew> + return (TYPE_LENGTH (type) > 0 Andrew> + && TYPE_LENGTH (array_target_type) > 0 Andrew> + && c_textual_element_type (array_target_type, 0)); Andrew> + } Andrew> + case TYPE_CODE_STRING: Andrew> + return true; It seems to me that a "char *" should be considered a string in C; and probably a "wchar_t *" as well. Maybe see c-lang.c:classify_type. Andrew> +/* Return true if TYPE is a string type. */ Andrew> +static bool Andrew> +rust_is_string_type_p (struct type *type) Andrew> +{ Andrew> + LONGEST low_bound, high_bound; Andrew> + Andrew> + type = check_typedef (type); Andrew> + return ((TYPE_CODE (type) == TYPE_CODE_STRING) Andrew> + || (TYPE_CODE (type) == TYPE_CODE_PTR Andrew> + && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_ARRAY Andrew> + && rust_u8_type_p (TYPE_TARGET_TYPE (TYPE_TARGET_TYPE (type))) Andrew> + && get_array_bounds (TYPE_TARGET_TYPE (type), &low_bound, Andrew> + &high_bound))) Andrew> + || ((TYPE_CODE (type) == TYPE_CODE_UNION Andrew> + || (TYPE_CODE (type) == TYPE_CODE_STRUCT Andrew> + && !rust_enum_p (type))) Andrew> + && rust_slice_type_p (type) Andrew> + && strcmp (TYPE_NAME (type), "&str") == 0)); I didn't understand the reason for TYPE_CODE_UNION here. Also, I think an array or slice of 'char' should probably be considered a string in Rust. See rust_chartype_p. thanks, Tom