bump env
[riscv-tests.git] / debug / testlib.py
index 2fd978cc283f5dbc502c32cdb96efb82302d33da..59440b361330cbf472be506cfc6bfa83c2ec3797 100644 (file)
@@ -299,7 +299,13 @@ class Openocd(object):
 
     def __del__(self):
         try:
-            self.process.kill()
+            self.process.terminate()
+            start = time.time()
+            while time.time() < start + 10000:
+                if self.process.poll():
+                    break
+            else:
+                self.process.kill()
             self.process.wait()
         except (OSError, AttributeError):
             pass
@@ -546,6 +552,18 @@ class Gdb(object):
         value = shlex.split(output.split('=')[-1].strip())[1]
         return value
 
+    def info_registers(self, group):
+        output = self.command("info registers %s" % group)
+        result = {}
+        for line in output.splitlines():
+            parts = line.split()
+            name = parts[0]
+            if "Could not fetch" in line:
+                result[name] = " ".join(parts[1:])
+            else:
+                result[name] = int(parts[1], 0)
+        return result
+
     def stepi(self):
         output = self.command("stepi", ops=10)
         return output
@@ -660,6 +678,8 @@ def run_tests(parsed, target, todo):
             result = instance.run()
             log_fd.write("Result: %s\n" % result)
             log_fd.write("Logfile: %s\n" % log_name)
+            log_fd.write("Reproduce: %s %s %s\n" % (sys.argv[0], parsed.target,
+                name))
         finally:
             sys.stdout = real_stdout
             log_fd.write("Time elapsed: %.2fs\n" % (time.time() - start))
@@ -713,12 +733,15 @@ def header(title, dash='-', length=78):
     else:
         print dash * length
 
-def print_log(path):
-    header(path)
-    for l in open(path, "r"):
+def print_log_handle(name, handle):
+    header(name)
+    for l in handle:
         sys.stdout.write(l)
     print
 
+def print_log(path):
+    print_log_handle(path, open(path, "r"))
+
 class BaseTest(object):
     compiled = {}
 
@@ -814,10 +837,15 @@ class BaseTest(object):
             return result
 
         finally:
+            # Get handles to logs before the files are deleted.
+            logs = []
             for log in self.logs:
-                print_log(log)
-            header("End of logs")
+                logs.append((log, open(log, "r")))
+
             self.classTeardown()
+            for name, handle in logs:
+                print_log_handle(name, handle)
+            header("End of logs")
 
         if not result:
             result = 'pass'