From patchwork Mon Mar 11 18:03:14 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Georg-Johann Lay X-Patchwork-Id: 226629 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]) by ozlabs.org (Postfix) with SMTP id 68C8D2C02A6 for ; Tue, 12 Mar 2013 05:03:39 +1100 (EST) Comment: DKIM? See http://www.dkim.org DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=gcc.gnu.org; s=default; x=1363629819; h=Comment: DomainKey-Signature:Received:Received:Received:Received: Message-ID:Date:From:User-Agent:MIME-Version:To:CC:Subject: Content-Type:Mailing-List:Precedence:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:Sender:Delivered-To; bh=ng6KYwc 4bn1mjUvQeRsLrLYBu8I=; b=hip0/7HCYrjU8F9q7Abmjg5vDMhjKvRe5uy0yn0 EyCd/SYMGxIJRTwHhwRGmDMNrNuzJKQJ3Jlkmb5oW6LBLQc2rAA9x4pcSzdExObx D8nauhKq1vSOQGTL2mz5/+nl3DyJ6o8uf1MtF/hX6TH944dLEUz5xBCNjJQFAoJA tuCY= Comment: DomainKeys? See http://antispam.yahoo.com/domainkeys DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=default; d=gcc.gnu.org; h=Received:Received:X-SWARE-Spam-Status:X-Spam-Check-By:Received:X-RZG-AUTH:X-RZG-CLASS-ID:Received:Message-ID:Date:From:User-Agent:MIME-Version:To:CC:Subject:Content-Type:X-IsSubscribed:Mailing-List:Precedence:List-Id:List-Unsubscribe:List-Archive:List-Post:List-Help:Sender:Delivered-To; b=wHkVZbadz37NsY852aZRpM83RdM50NUKN76P31YiX/huKUOImS68ic5HZ3aN+c 3cO0HouMfPcWhQmSRo6lg6VH/QBVeOHb/wUtYY87sRA9HMOggLzadm+pU0zNIPCU ifLH2t9hafMhHbxT6PyDwOuMxHzMWRPAfeW0gZUFeU9pc=; Received: (qmail 886 invoked by alias); 11 Mar 2013 18:03:33 -0000 Received: (qmail 871 invoked by uid 22791); 11 Mar 2013 18:03:31 -0000 X-SWARE-Spam-Status: No, hits=-1.6 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE, TW_PG X-Spam-Check-By: sourceware.org Received: from mo-p00-ob.rzone.de (HELO mo-p00-ob.rzone.de) (81.169.146.160) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 11 Mar 2013 18:03:19 +0000 X-RZG-AUTH: :LXoWVUeid/7A29J/hMvvT2k715jHQaJercGObUOFkj18odoYNahU4Q== X-RZG-CLASS-ID: mo00 Received: from [192.168.0.22] (business-188-111-022-002.static.arcor-ip.net [188.111.22.2]) by smtp.strato.de (jored mo49) (RZmta 31.19 AUTH) with ESMTPA id Y01315p2BGVChm ; Mon, 11 Mar 2013 19:03:14 +0100 (CET) Message-ID: <513E1C62.70404@gjlay.de> Date: Mon, 11 Mar 2013 19:03:14 +0100 From: Georg-Johann Lay User-Agent: Thunderbird 2.0.0.24 (X11/20100302) MIME-Version: 1.0 To: gcc-patches@gcc.gnu.org CC: Denis Chertykov , Eric Weddington Subject: [Patch,AVR]: Fix PR56263 X-IsSubscribed: yes 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 This patch implements a new warning option -Waddr-space-convert warns about conversions to a non-containing address space. Address spaces are implemented in such a way that each address space is contained in each other space so that casting is possible, e.g. in code like char read_c (bool in_flash, const char *str) { if (in_flash) return * (const __flash char*) str; else return *str; } However, there are no warning about implicit or explicit address space conversions, which makes it hard to port progmem code to address space code. If an address space qualifier is missing, e.g. when calling a function that is not qualified correctly, this would result in wrong code (in contrast to pgm_read that work no matter how the address is qualified). There is still some work to do to get more precise warnings and this is just a first take to implement PR56263, see the FIXME in the source. The details can be worked out later, e.g. for 4.8.1. Ok for trunk? PR target/56263 * config/avr/avr.c (TARGET_CONVERT_TO_TYPE): Define to... (avr_convert_to_type): ...this new static function. * config/avr/avr.opt (-Waddr-space-convert): New C option. * doc/invoke.texi (AVR Options): Document it. Index: config/avr/avr.opt =================================================================== --- config/avr/avr.opt (revision 196495) +++ config/avr/avr.opt (working copy) @@ -74,3 +74,7 @@ When accessing RAM, use X as imposed by msp8 Target Report RejectNegative Var(avr_sp8) Init(0) The device has no SPH special function register. This option will be overridden by the compiler driver with the correct setting if presence/absence of SPH can be deduced from -mmcu=MCU. + +Waddr-space-convert +Warning C Report Var(avr_warn_addr_space_convert) Init(0) +Warn if the address space of an address is change. Index: config/avr/avr.c =================================================================== --- config/avr/avr.c (revision 196495) +++ config/avr/avr.c (working copy) @@ -10765,6 +10765,42 @@ avr_addr_space_subset_p (addr_space_t su } +/* Implement `TARGET_CONVERT_TO_TYPE'. */ + +static tree +avr_convert_to_type (tree type, tree expr) +{ + if (avr_warn_addr_space_convert + && expr != error_mark_node + && POINTER_TYPE_P (type) + && POINTER_TYPE_P (TREE_TYPE (expr))) + { + addr_space_t as_old = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (expr))); + addr_space_t as_new = TYPE_ADDR_SPACE (TREE_TYPE (type)); + + if (avr_log.progmem) + avr_edump ("%?: type = %t\nexpr = %t\n\n", type, expr); + + if (as_new != ADDR_SPACE_MEMX + && as_new != as_old) + { + location_t loc = EXPR_LOCATION (expr); + const char *name_old = avr_addrspace[as_old].name; + const char *name_new = avr_addrspace[as_new].name; + + warning (OPT_Waddr_space_convert, + "conversion from address space %qs to address space %qs", + ADDR_SPACE_GENERIC_P (as_old) ? "generic" : name_old, + ADDR_SPACE_GENERIC_P (as_new) ? "generic" : name_new); + + return fold_build1_loc (loc, ADDR_SPACE_CONVERT_EXPR, type, expr); + } + } + + return NULL_TREE; +} + + /* Worker function for movmemhi expander. XOP[0] Destination as MEM:BLK XOP[1] Source " " @@ -12149,6 +12185,9 @@ avr_fold_builtin (tree fndecl, int n_arg #undef TARGET_FIXED_POINT_SUPPORTED_P #define TARGET_FIXED_POINT_SUPPORTED_P hook_bool_void_true +#undef TARGET_CONVERT_TO_TYPE +#define TARGET_CONVERT_TO_TYPE avr_convert_to_type + #undef TARGET_ADDR_SPACE_SUBSET_P #define TARGET_ADDR_SPACE_SUBSET_P avr_addr_space_subset_p Index: doc/invoke.texi =================================================================== --- doc/invoke.texi (revision 196495) +++ doc/invoke.texi (working copy) @@ -514,7 +514,7 @@ Objective-C and Objective-C++ Dialects}. @emph{AVR Options} @gccoptlist{-mmcu=@var{mcu} -maccumulate-args -mbranch-cost=@var{cost} @gol -mcall-prologues -mint8 -mno-interrupts -mrelax @gol --mstrict-X -mtiny-stack} +-mstrict-X -mtiny-stack -Waddr-space-convert} @emph{Blackfin Options} @gccoptlist{-mcpu=@var{cpu}@r{[}-@var{sirevision}@r{]} @gol @@ -11653,6 +11653,11 @@ when @code{EICALL} or @code{EIJMP} instr Indirect jumps and calls on these devices are handled as follows by the compiler and are subject to some limitations: +@item -Waddr-space-convert +@opindex Waddr-space-convert +Warn about conversions between address spaces in the case where the +resulting address space is not contained in the incoming address space. + @itemize @bullet @item