re PR target/43920 (Choosing conditional execution over conditional branches for...
authorTom de Vries <tom@codesourcery.com>
Thu, 7 Apr 2011 09:28:11 +0000 (09:28 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Thu, 7 Apr 2011 09:28:11 +0000 (09:28 +0000)
2011-04-07  Tom de Vries  <tom@codesourcery.com>

PR target/43920
* lib/scanasm.exp (object-size): New proc.
* gcc.target/arm/pr43920-2.c: New test.

From-SVN: r172093

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/arm/pr43920-2.c [new file with mode: 0644]
gcc/testsuite/lib/scanasm.exp

index e3de3732f08172a92b87e8defd421101fd818ae1..6c4b6b36d8e630c9666008979caf5d2265ecef0d 100644 (file)
@@ -1,3 +1,9 @@
+2011-04-07  Tom de Vries  <tom@codesourcery.com>
+
+       PR target/43920
+       * lib/scanasm.exp (object-size): New proc.
+       * gcc.target/arm/pr43920-2.c: New test.
+
 2011-04-06  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/18918
diff --git a/gcc/testsuite/gcc.target/arm/pr43920-2.c b/gcc/testsuite/gcc.target/arm/pr43920-2.c
new file mode 100644 (file)
index 0000000..f647165
--- /dev/null
@@ -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 } } */
index a49085410da69b225a1791040d8a98e756dd1a34..fe66264d974d08850c1c4fbde5cd516386587a25 100644 (file)
@@ -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.