From patchwork Fri May 26 15:49:48 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Iain Buclaw X-Patchwork-Id: 767440 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 3wZ9Z31YpMz9s82 for ; Sat, 27 May 2017 01:50:03 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="q+6JB/Tl"; dkim-atps=neutral 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:from:date:message-id:subject:to:content-type; q= dns; s=default; b=OPa0eR2r9T+VnAXtsKMiFmHm5aSIcDHvaTVIDCIdIDEyli DGgPAWrUOr6Vl1XoA/jXzgIkng1i+sDAFj7p080EVHWpS4jogvJxxIkp9s8Hr79B 7or498pWph17FjaOXzmi+alckhRJti7R9NDA5KPsS/reK/0cFlb5gOPUoVBAk= 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:from:date:message-id:subject:to:content-type; s= default; bh=wkyiO50BukJdxHVeAsR84AvvFCk=; b=q+6JB/TlNfEnUrE2qJSC gabulUO8uyde8OOTi05wlO1bbmmUcZQcRBzcu25Mk/YqP12glNIrLZB+ken+gGQ8 gL+HyV0OjN0Btpu3mXQa73cFjXWQaaodsO9umPiNnU+wbDQk6y8DHvox8lrof1fz 7NSPhsan+/zt2XvfYxJpWgY= Received: (qmail 59815 invoked by alias); 26 May 2017 15:49:49 -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 59042 invoked by uid 89); 26 May 2017 15:49:48 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.2 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_SPAM, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-vk0-f46.google.com Received: from mail-vk0-f46.google.com (HELO mail-vk0-f46.google.com) (209.85.213.46) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 26 May 2017 15:49:47 +0000 Received: by mail-vk0-f46.google.com with SMTP id x71so7444494vkd.0 for ; Fri, 26 May 2017 08:49:50 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:sender:from:date:message-id:subject :to; bh=40dk2Zy97A6/5+Zd4kb0skjY/GwgvztZVqRnQlx/Cws=; b=P/nYmpMM/MfA2MVwVj+Q59iALL/XbkxeszLyi/1vbCPVG+RUGCO57Jb3I2Xb4Xf6Cj eAKvF+Yo4Gj//qlq/IOjWm8TZTLxcQY6sCv8t5Zq9hlKnxqKZPCSLeSZ/2x0w53CwD4u cNlWweJaw2JFuUalNVbHzrwS6PGINZ94/mv12emwCq+wohveN7gqA5gDgtlDfWVjwWtf iayP/vqRo33z1OqrGpoukKYMlxGAHMe+BqbHkg8jcv408oXW7TLRrLXto4uw23qJ9vJJ ou8/0ocr/XUuihcwLGxcn2/ffHa+vQJGw7W4YFIFLdzQqOkzSlkP7D77FnQaWl58HMaW IOtw== X-Gm-Message-State: AODbwcBRvnOZb7xz8tpSjx88ZldKuXgMTSVhcGsXcxPvCRwOGW892JdR XCwCLJJY3z3hp8dQ3OYMjuLrAdE5aQ== X-Received: by 10.31.3.150 with SMTP id f22mr1106051vki.133.1495813788951; Fri, 26 May 2017 08:49:48 -0700 (PDT) MIME-Version: 1.0 Received: by 10.31.96.201 with HTTP; Fri, 26 May 2017 08:49:48 -0700 (PDT) From: Iain Buclaw Date: Fri, 26 May 2017 17:49:48 +0200 Message-ID: Subject: [PATCH 2/3] [D] libiberty: Add support for handling function types in dlang_type To: gcc-patches X-IsSubscribed: yes In the normal case, functions are passed around as a pointer-to-function type. One place where this is not the case however is when a function appears in template arguments, here the function is instead passed by alias. This patch updates dlang_type() to handle this case. commit 43a0c37b48f8365fb34083a8ebbcb6ce8a2da05c Author: Iain Buclaw Date: Fri May 26 15:53:53 2017 +0200 libiberty/ChangeLog: 2017-05-26 Iain Buclaw * d-demangle.c (dlang_call_convention_p): Move declaration before dlang_type. (dlang_type): Handle function types. * testsuite/d-demangle-expected: Add tests. diff --git a/libiberty/d-demangle.c b/libiberty/d-demangle.c index 030cab3333f..829050bc0b8 100644 --- a/libiberty/d-demangle.c +++ b/libiberty/d-demangle.c @@ -251,6 +251,22 @@ dlang_hexdigit (const char *mangled, char *ret) return mangled; } +/* Extract the function calling convention from MANGLED and + return 1 on success or 0 on failure. */ +static int +dlang_call_convention_p (const char *mangled) +{ + switch (*mangled) + { + case 'F': case 'U': case 'V': + case 'W': case 'R': case 'Y': + return 1; + + default: + return 0; + } +} + /* Demangle the calling convention from MANGLED and append it to DECL. Return the remaining string on success or NULL on failure. */ static const char * @@ -600,17 +616,22 @@ dlang_type (string *decl, const char *mangled) } case 'P': /* pointer (T*) */ mangled++; - /* Function pointer types don't include the trailing asterisk. */ - switch (*mangled) + if (!dlang_call_convention_p (mangled)) { - case 'F': case 'U': case 'W': - case 'V': case 'R': case 'Y': - mangled = dlang_function_type (decl, mangled); - string_append (decl, "function"); + mangled = dlang_type (decl, mangled); + string_append (decl, "*"); return mangled; } - mangled = dlang_type (decl, mangled); - string_append (decl, "*"); + /* Fall through */ + case 'F': /* function T (D) */ + case 'U': /* function T (C) */ + case 'W': /* function T (Windows) */ + case 'V': /* function T (Pascal) */ + case 'R': /* function T (C++) */ + case 'Y': /* function T (Objective-C) */ + /* Function pointer types don't include the trailing asterisk. */ + mangled = dlang_function_type (decl, mangled); + string_append (decl, "function"); return mangled; case 'I': /* ident T */ case 'C': /* class T */ @@ -1311,22 +1332,6 @@ dlang_value (string *decl, const char *mangled, const char *name, char type) return mangled; } -/* Extract the function calling convention from MANGLED and - return 1 on success or 0 on failure. */ -static int -dlang_call_convention_p (const char *mangled) -{ - switch (*mangled) - { - case 'F': case 'U': case 'V': - case 'W': case 'R': case 'Y': - return 1; - - default: - return 0; - } -} - /* Extract and demangle the symbol in MANGLED and append it to DECL. Returns the remaining signature on success or NULL on failure. */ static const char * diff --git a/libiberty/testsuite/d-demangle-expected b/libiberty/testsuite/d-demangle-expected index 950d4955d8f..7bf8b1725f9 100644 --- a/libiberty/testsuite/d-demangle-expected +++ b/libiberty/testsuite/d-demangle-expected @@ -886,6 +886,10 @@ _D8demangle35__T4testVS8demangle1SS2i1a3_616263Zv demangle.test!(demangle.S(1, "abc")) # --format=dlang +_D8demangle13__T4testTFZaZ6mangleFZv +demangle.test!(char() function).mangle() +# +--format=dlang _D8demangle4testMxFZv demangle.test() const # @@ -1298,3 +1302,7 @@ std.traits.fqnSym!(std).adjustIdent(immutable(char)[]) --format=dlang _D2rt8lifetime36__T14_d_newarrayOpTS13_d_newarrayiTZ14_d_newarrayOpTFNaNbxC8TypeInfomPmZAv rt.lifetime._d_newarrayOpT!(_d_newarrayiT)._d_newarrayOpT(const(TypeInfo), ulong, ulong*) +# +--format=dlang +_D4core8demangle16__T6mangleTFZPvZ6mangleFNaNbNfAxaAaZ11DotSplitter5emptyMxFNaNbNdNiNfZb +core.demangle.mangle!(void*() function).mangle(const(char)[], char[]).DotSplitter.empty() const