Patchwork [PR43920,1/9] ARM specific part.

login
register
mail settings
Submitter Tom de Vries
Date April 2, 2011, 5:05 p.m.
Message ID <4D97576C.9090306@codesourcery.com>
Download mbox | patch
Permalink /patch/89456/
State New
Headers show

Comments

Tom de Vries - April 2, 2011, 5:05 p.m.
On 04/02/2011 09:47 AM, Richard Guenther wrote:
> On Fri, Apr 1, 2011 at 6:06 PM, Tom de Vries <vries@codesourcery.com> 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?

Thanks,
- Tom
Richard Guenther - April 3, 2011, 7:38 a.m.
On Sat, Apr 2, 2011 at 7:05 PM, Tom de Vries <vries@codesourcery.com> wrote:
> On 04/02/2011 09:47 AM, Richard Guenther wrote:
>> On Fri, Apr 1, 2011 at 6:06 PM, Tom de Vries <vries@codesourcery.com> 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, and maybe we need to
verify that size output actually matches our expectation.  Other
than that it's exactly what I meant.

Mike?  Rainer?

Thanks,
Richard.

> Thanks,
> - Tom
>
Mike Stump - April 3, 2011, 6:40 p.m.
On Apr 3, 2011, at 12:38 AM, Richard Guenther wrote:
> On Sat, Apr 2, 2011 at 7:05 PM, Tom de Vries <vries@codesourcery.com> wrote:
>> 
>>> 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!

Ok.  This looks fine and clean, with a reasonable interface.

Patch

2011-04-01  Tom de Vries  <tom@codesourcery.com>

	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,83 @@  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 text [lindex $output 1]
+    set status [lindex $output 0]
+    if { $status != 0 } {
+        error "object-size: $size failed"
+        return
+    }
+
+    set what [lindex $args 0]
+    switch $what {
+        total { set where 9 }
+        bss   { set where 8 }
+        data  { set where 7 }
+        text  { set where 6 }
+        default {
+            error "object-size: illegal argument: $what"
+            return
+        }
+    }
+    set actual [lindex $text $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 <stdio.h>
+
+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 } } */