From patchwork Sun Apr 3 17:03:38 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom de Vries X-Patchwork-Id: 89538 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 7F310B6F94 for ; Mon, 4 Apr 2011 03:03:51 +1000 (EST) Received: (qmail 9266 invoked by alias); 3 Apr 2011 17:03:47 -0000 Received: (qmail 9243 invoked by uid 22791); 3 Apr 2011 17:03:45 -0000 X-SWARE-Spam-Status: No, hits=-1.6 required=5.0 tests=AWL, BAYES_00, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 03 Apr 2011 17:03:40 +0000 Received: (qmail 6414 invoked from network); 3 Apr 2011 17:03:39 -0000 Received: from unknown (HELO ?192.168.1.66?) (vries@127.0.0.2) by mail.codesourcery.com with ESMTPA; 3 Apr 2011 17:03:39 -0000 Message-ID: <4D98A86A.6090905@codesourcery.com> Date: Sun, 03 Apr 2011 19:03:38 +0200 From: Tom de Vries User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.14) Gecko/20110223 Lightning/1.0b2 Thunderbird/3.1.8 MIME-Version: 1.0 To: Richard Guenther CC: Richard Earnshaw , gcc-patches@gcc.gnu.org, Mike Stump , Rainer Orth Subject: Re: [PATCH, PR43920, 1/9] ARM specific part. References: <4D94C603.7080505@codesourcery.com> <4D94C6FB.1080309@codesourcery.com> <4D95E523.1050800@codesourcery.com> <1301671135.4104.11.camel@e102346-lin.cambridge.arm.com> <4D95F802.80003@codesourcery.com> <4D97576C.9090306@codesourcery.com> In-Reply-To: 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 On 04/03/2011 09:38 AM, Richard Guenther wrote: > On Sat, Apr 2, 2011 at 7:05 PM, Tom de Vries wrote: >> On 04/02/2011 09:47 AM, Richard Guenther wrote: >>> On Fri, Apr 1, 2011 at 6:06 PM, Tom de Vries wrote: >>>> On 04/01/2011 05:18 PM, Richard Earnshaw wrote: >>>>> >>>>> On Fri, 2011-04-01 at 16:45 +0200, Tom de Vries wrote: >>>>>> Reposting, with ChangeLog. >>>>> >>>>> #define BRANCH_COST(speed_p, predictable_p) \ >>>>> - (TARGET_32BIT ? 4 : (optimize > 0 ? 2 : 0)) >>>>> + (TARGET_32BIT ? (TARGET_THUMB2 && optimize_size ? 1 : 4) \ >>>>> + : (optimize > 0 ? 2 : 0)) >>>>> >>>>> Don't use optimize_size here, use !speed_p. >>>>> >>>>> Otherwise OK. >>>>> >>>> >>>> Replaced optimize_size by !speed_p. >>> >>> I wonder if we can add a code-size test harness. Using GNU size >>> for examle, if available and a new dg-final { object-size SIZE } that >>> fails when the size is greater than the specified one (of course all >>> object-size tests with specific target restrictions). >> >> like this? > > Yes! > > I'm not sure finding the size binary is ok, Me neither. I just copied what I saw done for c++filt in scan-assembler-dem-not, and found that it works for me. > and maybe we need to > verify that size output actually matches our expectation. Changes since previous post: - split output of size into lines - check format of first and second line - replaced 'switch $what' with 'lsearch $what' > Other than that it's exactly what I meant. > Great. > Mike? Rainer? > Thanks, - Tom 2011-04-01 Tom de Vries PR target/43920 * lib/scanasm.exp (object-size): New proc. * gcc.target/arm/pr43920-2.c: New test. Index: gcc/testsuite/lib/scanasm.exp =================================================================== --- gcc/testsuite/lib/scanasm.exp (revision 170556) +++ gcc/testsuite/lib/scanasm.exp (working copy) @@ -315,6 +315,92 @@ proc scan-assembler-dem-not { args } { } } +# Call pass if object size is ok, otherwise fail. +# example: /* { dg-final { object-size text <= 54 } } */ +proc object-size { args } { + global size + global base_dir + + if { [llength $args] < 3 } { + error "object-size: too few arguments" + return + } + if { [llength $args] > 4 } { + error "object-size: too many arguments" + return + } + if { [llength $args] >= 4 } { + switch [dg-process-target [lindex $args 1]] { + "S" { } + "N" { return } + "F" { setup_xfail "*-*-*" } + "P" { } + } + } + + # Find size like we find g++ in g++.exp. + if ![info exists size] { + set size [findfile $base_dir/../../../binutils/size \ + $base_dir/../../../binutils/size \ + [findfile $base_dir/../../size $base_dir/../../size \ + [findfile $base_dir/size $base_dir/size \ + [transform size]]]] + verbose -log "size is $size" + } + + upvar 2 name testcase + set testcase [lindex $testcase 0] + set output_file "[file rootname [file tail $testcase]].o" + set output [remote_exec host "$size" "$output_file"] + set status [lindex $output 0] + if { $status != 0 } { + error "object-size: $size failed" + return + } + + set text [lindex $output 1] + set lines [split $text "\n"] + + set line0 [lindex $lines 0] + if ![regexp {^\s*text\s+data\s+bss\s+dec\s+hex\s+filename\s*$} $line0] { + error "object-size: $size did not produce expected first line: $line0" + return + } + + set line1 [lindex $lines 1] + if ![regexp {^\s*\d+\s+\d+\s+\d+\s+\d+\s+[\da-fA-F]+\s+} $line1] { + error "object-size: $size did not produce expected second line: $line1" + return + } + + set what [lindex $args 0] + set where [lsearch { text data bss total } $what] + if { $where == -1 } { + error "object-size: illegal argument: $what" + return + } + set actual [lindex $line1 $where] + verbose -log "$what size is $actual" + + set cmp [lindex $args 1] + if { [lsearch { < > <= >= == != } $cmp] == -1 } { + error "object-size: illegal argument: $cmp" + return + } + + set with [lindex $args 2] + if { ![string is integer $with ] } { + error "object-size: illegal argument: $with" + return + } + + if { [expr $actual $cmp $with] } { + pass "$testcase object-size $what $cmp $with" + } else { + fail "$testcase object-size $what $cmp $with" + } +} + # Utility for testing that a function is defined on the current line. # Call pass if so, otherwise fail. Invoked directly; the file must # have been compiled with -g -dA. Index: gcc/testsuite/gcc.target/arm/pr43920-2.c =================================================================== --- gcc/testsuite/gcc.target/arm/pr43920-2.c (revision 0) +++ gcc/testsuite/gcc.target/arm/pr43920-2.c (revision 0) @@ -0,0 +1,30 @@ +/* { dg-do assemble } */ +/* { dg-options "-mthumb -Os -save-temps" } */ +/* { dg-require-effective-target arm_thumb2_ok } */ + +#include + +int getFileStartAndLength (int fd, int *start_, size_t *length_) +{ + int start, end; + size_t length; + + start = lseek (fd, 0L, SEEK_CUR); + end = lseek (fd, 0L, SEEK_END); + + if (start == -1 || end == -1) + return -1; + + length = end - start; + if (length == 0) + return -1; + + *start_ = start; + *length_ = length; + + return 0; +} + +/* { dg-final { scan-assembler-times "pop" 2 } } */ +/* { dg-final { scan-assembler-times "beq" 3 } } */ +/* { dg-final { object-size text <= 54 } } */