From 9921923c9ddbc0161980262027eb6d9395976c73 Mon Sep 17 00:00:00 2001
From: Hans-Peter Nilsson <hp@axis.com>
Date: Wed, 14 Jun 2000 01:21:35 +0000
Subject: 	* binutils-all/readelf.exp (regexp_diff): Do not break when a 
 mismatching line is found. 	(readelf_find_size): New. 
 (readelf_size): New global variable. 	(readelf_test): Add newline to
 send_log of command. 	If $srcdir/$subdir/$regexp_file-$readelf_size exists,
 use it 	instead of $srcdir/$subdir/$regexp_file. 	(*-*elf test):
 Fix typo in message. 	* binutils-all/readelf.s-64: New. 	*
 binutils-all/readelf.ss-64: New.

---
 binutils/testsuite/ChangeLog                  | 13 +++++++
 binutils/testsuite/binutils-all/readelf.exp   | 50 +++++++++++++++++++++++----
 binutils/testsuite/binutils-all/readelf.s-64  | 24 +++++++++++++
 binutils/testsuite/binutils-all/readelf.ss-64 | 13 +++++++
 4 files changed, 94 insertions(+), 6 deletions(-)
 create mode 100644 binutils/testsuite/binutils-all/readelf.s-64
 create mode 100644 binutils/testsuite/binutils-all/readelf.ss-64

diff --git a/binutils/testsuite/ChangeLog b/binutils/testsuite/ChangeLog
index e68494e..d51de55 100644
--- a/binutils/testsuite/ChangeLog
+++ b/binutils/testsuite/ChangeLog
@@ -1,3 +1,16 @@
+2000-06-14  Hans-Peter Nilsson  <hp@bitrange.com>
+
+	* binutils-all/readelf.exp (regexp_diff): Do not break when a
+	mismatching line is found.
+	(readelf_find_size): New.
+	(readelf_size): New global variable.
+	(readelf_test): Add newline to send_log of command.
+	If $srcdir/$subdir/$regexp_file-$readelf_size exists, use it
+	instead of $srcdir/$subdir/$regexp_file.
+	(*-*elf test): Fix typo in message.
+	* binutils-all/readelf.s-64: New.
+	* binutils-all/readelf.ss-64: New.
+
 2000-05-02  Alan Modra  <alan@linuxcare.com.au>
 
 	* binutils-all/objcopy.exp (simple copy): Clear xfail for hppa-linux.
diff --git a/binutils/testsuite/binutils-all/readelf.exp b/binutils/testsuite/binutils-all/readelf.exp
index 12fcdad..46a837c 100644
--- a/binutils/testsuite/binutils-all/readelf.exp
+++ b/binutils/testsuite/binutils-all/readelf.exp
@@ -1,4 +1,4 @@
-#   Copyright (C) 1999 Free Software Foundation, Inc.
+#   Copyright (C) 1999, 2000 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -103,7 +103,6 @@ proc regexp_diff { file_1 file_2 } {
 		send_log "regexp_diff match failure\n"
 		send_log "regexp \"^$line_b$\"\nline   \"$line_a\"\n"
 		set differences 1
-                break
             }
         }
     }
@@ -120,19 +119,51 @@ proc regexp_diff { file_1 file_2 } {
     return $differences
 }
 
+# Find out the size by reading the output of the EI_CLASS field.
+# Similar to the test for readelf -h, but we're just looking for the
+# EI_CLASS line here.
+proc readelf_find_size { binary_file } {
+    global READELF
+    global READELFFLAGS
+    global readelf_size
+
+    set readelf_size ""
+    set testname "finding out ELF size with readelf -h"
+    catch "exec $READELF $READELFFLAGS -h $binary_file > readelf.out" got
+
+    if ![string match "" $got] then {
+	send_log $got
+	fail $testname
+	return
+    }
+
+    if { ! [regexp "\n\[ \]*Class:\[ \]*ELF(\[0-9\]+)\n" \
+	    [file_contents readelf.out] nil readelf_size] } {
+	verbose -log "EI_CLASS field not found in output"
+	verbose -log "output is \n[file_contents readelf.out]"
+	fail $testname
+	return
+    } else {
+	verbose -log "ELF size is $readelf_size"
+    }
+
+    pass $testname
+}
+
 # Run an individual readelf test.
 # Basically readelf is run on the binary_file with the given options.
 # Readelf's output is captured and then compared against the contents
-# of the regexp_file.
+# of the regexp_file-readelf_size if it exists, else regexp_file.
 
 proc readelf_test { options binary_file regexp_file xfails } {
 
     global READELF
     global READELFFLAGS
+    global readelf_size
     global srcdir
     global subdir
     
-    send_log "exec $READELF $READELFFLAGS $options $binary_file > readelf.out"
+    send_log "exec $READELF $READELFFLAGS $options $binary_file > readelf.out\n"
     catch "exec $READELF $READELFFLAGS $options $binary_file > readelf.out" got
 
     if { [llength $xfails] != 0 } then {
@@ -145,6 +176,10 @@ proc readelf_test { options binary_file regexp_file xfails } {
 	return
     }
 
+    if { [file exists $srcdir/$subdir/$regexp_file-$readelf_size] } then {
+	set regexp_file $regexp_file-$readelf_size
+    }
+
     if { [regexp_diff readelf.out $srcdir/$subdir/$regexp_file] } then {
 	fail "readelf $options"
 	verbose "output is \n[file_contents readelf.out]" 2
@@ -161,7 +196,7 @@ proc readelf_test { options binary_file regexp_file xfails } {
 # in the target string, then the target is not an ELF based port.
 
 if ![istarget "*-*elf"] then {
-    verbose "$READELF is only intenteded for ELF targets" 2
+    verbose "$READELF is only intended for ELF targets" 2
     return
 }
 
@@ -187,7 +222,10 @@ if ![is_remote host] {
     set tempfile [remote_download host tmpdir/bintest.o]
 }
 
-# Run the tests
+# First, determine the size, so specific output matchers can be used.
+readelf_find_size $tempfile
+
+# Run the tests.
 readelf_test -h $tempfile readelf.h  {}
 
 # The v850 fails the next two tests because it creates two special
diff --git a/binutils/testsuite/binutils-all/readelf.s-64 b/binutils/testsuite/binutils-all/readelf.s-64
new file mode 100644
index 0000000..a748c16
--- /dev/null
+++ b/binutils/testsuite/binutils-all/readelf.s-64
@@ -0,0 +1,24 @@
+There are .* section headers, starting at offset .*:
+
+Section Headers:
+  \[Nr\] Name              Type             Address           Offset
+       Size              EntSize          Flags  Link  Info  Align
+  \[ 0\]                   NULL             0000000000000000  00000000
+       0000000000000000  0000000000000000           0     0     0
+  \[ 1\] .text             PROGBITS         0000000000000000  00000040
+       00000000000000..  0000000000000000  AX       0     0     .*
+  \[ 2\] .rel.+text +REL. +0+  0+.*
+       000000000000001.  000000000000001.           .     1     8
+  \[ 3\] .data             PROGBITS         0000000000000000  000000[45][08]
+       0000000000000004  0000000000000000  WA       0     0     .*
+  \[ 4\] .bss              NOBITS           0000000000000000  000000[45][c4]
+       0000000000000000  0000000000000000  WA       0     0     .*
+  \[ 5\] .shstrtab         STRTAB           0000000000000000  000000[45][c4]
+       00000000000000..  0000000000000000           0     0     .*
+  \[ 6\] .symtab           SYMTAB           0000000000000000  0+.*
+       0+.*  0000000000000018           7     6     8
+  \[ 7\] .strtab           STRTAB           0000000000000000  0+.*
+       0+.*  0000000000000000           0     0     1
+Key to Flags: W \(write\), A \(alloc\), X \(execute\), M \(merge\), S \(strings\)
+              I \(info\), L \(link order\), O \(extra OS processing required\)
+              o \(os specific\), p \(processor specific\) x \(unknown\)
diff --git a/binutils/testsuite/binutils-all/readelf.ss-64 b/binutils/testsuite/binutils-all/readelf.ss-64
new file mode 100644
index 0000000..b29276d
--- /dev/null
+++ b/binutils/testsuite/binutils-all/readelf.ss-64
@@ -0,0 +1,13 @@
+
+Symbol table '.symtab' contains .* entries:
+   Num:    Value          Size Type    Bind   Vis      Ndx Name
+     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
+     1: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 
+     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    3 
+     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    4 
+     4: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    1 static_text_symbol
+     5: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    3 static_data_symbol
+.*   .: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT    1 text_symbol
+     .: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND external_symbol
+     .: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT    3 data_symbol
+     .: 0000000000000004     4 OBJECT  GLOBAL DEFAULT  COM common_symbol
-- 
cgit v1.1