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

login
register
mail settings
Submitter Tom de Vries
Date April 3, 2011, 5:03 p.m.
Message ID <4D98A86A.6090905@codesourcery.com>
Download mbox | patch
Permalink /patch/89538/
State New
Headers show

Comments

Tom de Vries - April 3, 2011, 5:03 p.m.
On 04/03/2011 09:38 AM, Richard Guenther wrote:
> 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, 

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
Richard Guenther - April 4, 2011, 12:13 p.m.
On Sun, Apr 3, 2011 at 9:34 PM, Sergey Ostanevich <sergos.gnu@gmail.com> wrote:
> I would recommend to use 'nm -S a.out' that gives
>
> [...]
> 00000000004004a4 0000000000000054 T main
> [...]
>
> then you can provide a name for the routine you want to test for the size.

That also sounds reasonable.  Is nm -S more portable than size?

Richard.

> Regards,
> Sergos
>
>
>
> 2011/4/3 Tom de Vries <vries@codesourcery.com>
>>
>> On 04/03/2011 09:38 AM, Richard Guenther wrote:
>> > 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,
>>
>> 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
>
>
Rainer Orth - April 4, 2011, 12:22 p.m.
Richard Guenther <richard.guenther@gmail.com> writes:

> On Sun, Apr 3, 2011 at 9:34 PM, Sergey Ostanevich <sergos.gnu@gmail.com> wrote:
>> I would recommend to use 'nm -S a.out' that gives
>>
>> [...]
>> 00000000004004a4 0000000000000054 T main
>> [...]
>>
>> then you can provide a name for the routine you want to test for the size.
>
> That also sounds reasonable.  Is nm -S more portable than size?

Neither Solaris nor IRIX nm have it.  size isn't particularly portable,
either: there are many variations in output format.

	Rainer

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,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 <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 } } */