From patchwork Thu Jul 14 15:11:51 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Georg-Johann Lay X-Patchwork-Id: 648434 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 3rqzhL4yZGz9sDk for ; Fri, 15 Jul 2016 01:12:16 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=qO3JAMlM; 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:to :from:subject:message-id:date:mime-version:content-type; q=dns; s=default; b=v5tDuX+QC20Z92WuWIX+ib+pi+KUYkxCZW8gewxHlBQLfcg+QZ 3nzCm6HDQ/53LZ6isccWqZ8jGQEbIXSpl5ciSvZdqecwp8Ofu1pWvdNHavp63hNZ M+OU87hKp6dDvHJkR9YoyiMfJPZo8oBTqhp8uwuV5yutAb8lJ8YGnYS7U= 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:to :from:subject:message-id:date:mime-version:content-type; s= default; bh=PqBMsWqNBvAbfNMJgYUm/P26y5c=; b=qO3JAMlMteWpFbNIL4Po WYx/PX28vCTsD8avuTPReXwDJEEcswsQZAHTTdKk9Rypz6AAOt1oNlbIWHqN4j4Q r8W0J5EvO+wOEI0G8nJ89Axim9n55CElnkgOm0pZgkxFERGJlkIGg6gE32TD/bwi xDFOMIK1f+QswyaRr3fyums= Received: (qmail 86287 invoked by alias); 14 Jul 2016 15:12:08 -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 86268 invoked by uid 89); 14 Jul 2016 15:12:07 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.2 required=5.0 tests=AWL, BAYES_00, KAM_ASCII_DIVIDERS, RCVD_IN_DNSWL_LOW autolearn=no version=3.3.2 spammy=cindex, @cindex, UD:tm.texi.in, tmtexiin X-HELO: mo4-p00-ob.smtp.rzone.de Received: from mo4-p00-ob.smtp.rzone.de (HELO mo4-p00-ob.smtp.rzone.de) (81.169.146.217) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Thu, 14 Jul 2016 15:11:57 +0000 X-RZG-AUTH: :LXoWVUeid/7A29J/hMvvT3ol15ykJcYwR/bcHRirORRW3yMcVao= X-RZG-CLASS-ID: mo00 Received: from [192.168.0.123] (mail.hightec-rt.com [213.135.1.215]) by smtp.strato.de (RZmta 38.13 DYNA|AUTH) with ESMTPSA id f07045s6EFBq4Fz (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA (curve secp521r1 with 521 ECDH bits, eq. 15360 bits RSA)) (Client did not present a certificate) for ; Thu, 14 Jul 2016 17:11:52 +0200 (CEST) To: GCC Patches From: Georg-Johann Lay Subject: [patch] Add new hook to diagnose address space usage Message-ID: <051d5d94-6175-0b11-04ee-439f0cab870a@gjlay.de> Date: Thu, 14 Jul 2016 17:11:51 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.2.0 MIME-Version: 1.0 X-IsSubscribed: yes This adds a new hook that allows to emit better diagnostics if an address space is used that's not available. One solution would be no not register the address space with c_register_addr_space but that gives ugly report like error: expected '=', ',', ';', 'asm' or '__attribute__' before 'f321' The hook allows better diagnostics: The address spaces are registered with c_register_addr_space and if the parser comes across an address space it provides the hook with the needed information, in particular the location of the token so that the message would be something like ptiny.c:12:11: error: address space '__flash2' not supported for devices with flash size up to 128 KiB const int __flash2 f321[] = { 321, 654 }; ^~~~~~~~ This only works if address spaces are part of the language dialect. Default implementation is void. The intended user is the avr backend which currently emits diagnostics in some hook like TARGET_INSERT_ATTRIBUTER, but the locations are out of sync there. Ok for trunk if bootstrap passes? Johann gcc/ * target.def (addr_space): Add new diagnose_usage to hook vector. * targhooks.c (default_addr_space_diagnose_usage): Add default implementation and... * targhooks.h (default_addr_space_diagnose_usage): ... its prototype. * c/c-parser.c (c_lex_one_token) [CPP_NAME]: If the token is some address space, call targetm.addr_space.diagnose_usage. * doc/tm.texi.in (Named Address Spaces): Add anchor for TARGET_ADDR_SPACE_DIAGNOSE_USAGE documentation. * doc/tm.texi: Regenerate. Index: target.def =================================================================== --- target.def (revision 237587) +++ target.def (working copy) @@ -3241,6 +3241,21 @@ The result is the value to be used with int, (addr_space_t as), default_addr_space_debug) +/* Function to emit custom diagnostic if an address space is used. */ +DEFHOOK +(diagnose_usage, + "Define this hook if the availability of an address space depends on\n\ +command line options and some diagnostics shall be printed when the\n\ +address space is used. This hook is called during parsing and allows\n\ +to emit a better diagnostic compared to the case where the address space\n\ +was not registered with @code{c_register_addr_space}. @var{as} is\n\ +the address space as registered with @code{c_register_addr_space}.\n\ +@var{loc} is the location of the address space qualifier token.\n\ +Return true if the hook issued an error and false, otherwise.\n\ +The default implementation does nothing.", + bool, (addr_space_t as, location_t loc), + default_addr_space_diagnose_usage) + HOOK_VECTOR_END (addr_space) #undef HOOK_PREFIX Index: targhooks.c =================================================================== --- targhooks.c (revision 237587) +++ targhooks.c (working copy) @@ -1291,6 +1291,14 @@ default_addr_space_debug (addr_space_t a return as; } +bool +default_addr_space_diagnose_usage (addr_space_t ARG_UNUSED (as), + location_t ARG_UNUSED (loc)) +{ + return false; +} + + /* The default hook for TARGET_ADDR_SPACE_CONVERT. This hook should never be called for targets with only a generic address space. */ Index: targhooks.h =================================================================== --- targhooks.h (revision 237587) +++ targhooks.h (working copy) @@ -181,6 +181,7 @@ extern rtx default_addr_space_legitimize extern bool default_addr_space_subset_p (addr_space_t, addr_space_t); extern bool default_addr_space_zero_address_valid (addr_space_t); extern int default_addr_space_debug (addr_space_t); +extern bool default_addr_space_diagnose_usage (addr_space_t, location_t); extern rtx default_addr_space_convert (rtx, tree, tree); extern unsigned int default_case_values_threshold (void); extern bool default_have_conditional_execution (void); Index: c/c-parser.c =================================================================== --- c/c-parser.c (revision 237587) +++ c/c-parser.c (working copy) @@ -300,6 +300,9 @@ c_lex_one_token (c_parser *parser, c_tok else if (rid_code >= RID_FIRST_ADDR_SPACE && rid_code <= RID_LAST_ADDR_SPACE) { + addr_space_t as; + as = (addr_space_t) (rid_code - RID_FIRST_ADDR_SPACE); + targetm.addr_space.diagnose_usage (as, token->location); token->id_kind = C_ID_ADDRSPACE; token->keyword = rid_code; break; Index: doc/tm.texi.in =================================================================== --- doc/tm.texi.in (revision 237587) +++ doc/tm.texi.in (working copy) @@ -7486,6 +7486,8 @@ c_register_addr_space ("__ea", ADDR_SPAC @hook TARGET_ADDR_SPACE_DEBUG +@hook TARGET_ADDR_SPACE_DIAGNOSE_USAGE + @node Misc @section Miscellaneous Parameters @cindex parameters, miscellaneous Index: doc/tm.texi =================================================================== --- doc/tm.texi (revision 237587) +++ doc/tm.texi (working copy) @@ -10431,6 +10431,18 @@ Define this to define how the address sp The result is the value to be used with @code{DW_AT_address_class}. @end deftypefn +@deftypefn {Target Hook} bool TARGET_ADDR_SPACE_DIAGNOSE_USAGE (addr_space_t @var{as}, location_t @var{loc}) +Define this hook if the availability of an address space depends on +command line options and some diagnostics shall be printed when the +address space is used. This hook is called during parsing and allows +to emit a better diagnostic compared to the case where the address space +was not registered with @code{c_register_addr_space}. @var{as} is +the address space as registered with @code{c_register_addr_space}. +@var{loc} is the location of the address space qualifier token. +Return true if the hook issued an error and false, otherwise. +The default implementation does nothing. +@end deftypefn + @node Misc @section Miscellaneous Parameters @cindex parameters, miscellaneous