Skip to content
Snippets Groups Projects
Commit 2791081e authored by Henrik Tjäder's avatar Henrik Tjäder
Browse files

Support running xargo, docker and remove sqlite

parent 3f84218b
Branches
No related tags found
No related merge requests found
...@@ -2,21 +2,25 @@ import gdb ...@@ -2,21 +2,25 @@ import gdb
import os import os
import sys import sys
import struct import struct
import sqlite3
from subprocess import call from subprocess import call
import subprocess import subprocess
import glob
# Should ideally properly just import from ktest-tool """ ktest file version """
# from .ktesttool import KTest
version_no = 3 version_no = 3
debug = False debug = False
autobuild = True
klee_out_folder = 'target/x86_64-unknown-linux-gnu/debug/examples/'
stm_out_folder = 'target/thumbv7em-none-eabihf/release/examples/'
file_list = [] file_list = []
file_index_current = 0 file_index_current = 0
object_index_current = 0 object_index_current = 0
example_name = "resource"
tasks = [] tasks = []
task_to_test = 0 task_to_test = 0
...@@ -33,28 +37,8 @@ object_index_max = 100 ...@@ -33,28 +37,8 @@ object_index_max = 100
database_name = "klee_profiling" database_name = "klee_profiling"
path = "output" path = "output"
""" Create an folder named output if it doesn't exist """ """ Define the original working directory """
os.makedirs(path, exist_ok=True) original_pwd = os.getcwd()
""" Enter the output folder """
os.chdir(path)
""" Check if a database exists, otherwise create one """
if os.path.isfile("%s%s" % (database_name, ".db")):
os.rename("%s%s" % (database_name, ".db"),
"%s%s" % (database_name, "_old.db"))
# conn = sqlite3.connect(database_name)
# cur = conn.cursor()
# print("Opened already created database")
conn = sqlite3.connect("%s%s" % (database_name, ".db"))
cur = conn.cursor()
cur.execute('''CREATE TABLE IF NOT EXISTS events
(ID INTEGER PRIMARY KEY AUTOINCREMENT,
FILE TEXT NOT NULL,
TIME INT NOT NULL,
RESOURCE TEXT NOT NULL,
ACTION TEXT,
JOB TEXT);''')
class KTestError(Exception): class KTestError(Exception):
...@@ -313,87 +297,6 @@ def gather_data(): ...@@ -313,87 +297,6 @@ def gather_data():
gdb.execute("quit") gdb.execute("quit")
def posted_event_finish_execution():
"""
FIXME: Not used currently
"""
""" Called when the breakpoint at finish_execution() is hit """
global file_list
global file_index_current
global object_index_current
global object_index_max
# gdb.execute("print eventlist")
# print("object_current: %r " % object_index_current)
print("object_max: %r " % object_index_max)
while object_index_current < object_index_max:
""" Collect all data for the database """
event_time = gdb.parse_and_eval("eventlist[" +
str(object_index_current) +
"].time")
event_resource = gdb.parse_and_eval("eventlist[" +
str(object_index_current) +
"].elem")
event_action = gdb.parse_and_eval("eventlist[" +
str(object_index_current) +
"].action")
""" Parse which running job is active """
event_job = gdb.parse_and_eval("job")
"""
print("file: %r " % str(file_list[file_index_current]))
print("time: %r " % int(event_time))
print("resource: %r" % str(event_resource))
print("action: %r" % str(event_action))
"""
event = []
event.append(str(file_list[file_index_current]))
event.append(int(event_time))
event.append(str(event_resource))
event.append(str(event_action))
event.append("j" + str(event_job))
print("Event: %r " % event)
try:
cur = conn.cursor()
cur.execute('INSERT INTO events(FILE, TIME, RESOURCE, ACTION, JOB)\
VALUES (?,?,?,?,?)', event)
except sqlite3.Error as e:
print("An error occurred:", e.args[0])
object_index_current += 1
""" If this was the END of execution go for next file """
if str(event_action) == 'E':
""" All events covered, break out from loop """
break
""" Reset object counter for next file """
file_index_current += 1
object_index_current = 0
""" All done, commit to database and tidy after ourselves """
if len(file_list) == file_index_current:
print("Committing to database")
conn.commit()
conn.close()
gdb.execute("quit")
else:
gdb.execute("run")
def trimZeros(str): def trimZeros(str):
for i in range(len(str))[::-1]: for i in range(len(str))[::-1]:
if str[i] != '\x00': if str[i] != '\x00':
...@@ -457,28 +360,53 @@ def ktest_iterate(): ...@@ -457,28 +360,53 @@ def ktest_iterate():
""" Get the list of folders in current directory, sort and then grab the """ Get the list of folders in current directory, sort and then grab the
last one. last one.
""" """
global debug
global autobuild
curdir = os.getcwd() curdir = os.getcwd()
if debug: if debug:
print(curdir) print(curdir)
""" We have already entered the output folder """ """ We have already entered the output folder """
rustoutputfolder = "../target/x86_64-unknown-linux-gnu/debug/examples/" rustoutputfolder = curdir + "/" + klee_out_folder
try: try:
os.chdir(rustoutputfolder) os.chdir(rustoutputfolder)
except IOError: except IOError:
print(rustoutputfolder + "not found. Need to run\n") print(rustoutputfolder + "not found. Need to run\n")
print("xargo build --release --example resource --features\ print("xargo build --example " + example_name + " --features" +
klee_mode --target x86_64-unknown-linux-gnu ") "klee_mode --target x86_64-unknown-linux-gnu ")
print("\nand docker run --rm --user (id -u):(id -g)" +
"-v $PWD" + "/" + klee_out_folder + ":/mnt" +
"-w /mnt -it afoht/llvm-klee-4 /bin/bash ")
if autobuild:
xargo_run("klee")
klee_run()
else:
print("Run the above commands before proceeding")
sys.exit(1) sys.exit(1)
if os.listdir(rustoutputfolder) == []:
"""
The folder is empty, generate some files
"""
xargo_run("klee")
klee_run()
dirlist = next(os.walk("."))[1] dirlist = next(os.walk("."))[1]
dirlist.sort() dirlist.sort()
if debug: if debug:
print(dirlist) print(dirlist)
if not dirlist:
print("No KLEE output, need to run KLEE")
print("Running klee...")
klee_run()
try: try:
directory = dirlist[-1] directory = dirlist[-1]
except IOError: except IOError:
print("No KLEE output, need to run KLEE") print("No KLEE output, need to run KLEE")
sys.exit(1) print("Running klee...")
klee_run()
print("Using ktest-files from directory:\n" + rustoutputfolder + directory) print("Using ktest-files from directory:\n" + rustoutputfolder + directory)
...@@ -502,27 +430,59 @@ def tasklist_get(): ...@@ -502,27 +430,59 @@ def tasklist_get():
if debug: if debug:
print(os.getcwd()) print(os.getcwd())
with open('../klee/tasks.txt') as fin: with open('klee/tasks.txt') as fin:
for line in fin: for line in fin:
# print(line) # print(line)
if not line == "// autogenerated file\n": if not line == "// autogenerated file\n":
return [x.strip().strip("[]\"") for x in line.split(',')] return [x.strip().strip("[]\"") for x in line.split(',')]
def klee_run(): def xargo_run(mode):
""" Stub for running KLEE on the LLVM IR """
Run xargo for building
"""
if "klee" in mode:
xargo_cmd = ("xargo build --example " + example_name + " --features " +
"klee_mode --target x86_64-unknown-linux-gnu ")
elif "stm" in mode:
xargo_cmd = ("xargo build --release --example " + example_name +
" --features " +
"wcet_bkpt --target thumbv7em-none-eabihf")
else:
print("Provide either 'klee' or 'stm' as mode")
sys.exit(1)
call(xargo_cmd, shell=True)
def klee_run():
"""
Stub for running KLEE on the LLVM IR
""" """
PWD = os.getcwd() global debug
global original_pwd
PWD = original_pwd
user_id = subprocess.check_output(['id', '-u']).decode() user_id = subprocess.check_output(['id', '-u']).decode()
group_id = subprocess.check_output(['id', '-g']).decode() group_id = subprocess.check_output(['id', '-g']).decode()
bc_file = (glob.glob(PWD + "/" +
klee_out_folder +
'*.bc', recursive=False))[-1].split('/')[-1].strip('\'')
if debug:
print(PWD + "/" + klee_out_folder)
print(bc_file)
klee_cmd = ("docker run --rm --user " + klee_cmd = ("docker run --rm --user " +
user_id[:-1] + ":" + group_id[:-1] + user_id[:-1] + ":" + group_id[:-1] +
" -v " " -v '"
+ PWD + PWD + "/"
+ "/target/x86_64-unknown-linux-gnu/debug/examples:/mnt\ + klee_out_folder + "':'/mnt'" +
-w /mnt -it afoht/llvm-klee-4 /bin/bash -c 'klee '*'.bc'") " -w /mnt -it afoht/llvm-klee-4 " +
"/bin/bash -c 'klee %s'" % bc_file)
if debug:
print(klee_cmd) print(klee_cmd)
call(klee_cmd, shell=True) call(klee_cmd, shell=True)
...@@ -553,10 +513,21 @@ def gdb_cyccnt_write(num): ...@@ -553,10 +513,21 @@ def gdb_cyccnt_write(num):
gdb.execute('mon mww 0xe0001004 %r' % num) gdb.execute('mon mww 0xe0001004 %r' % num)
""" Check if the MCU code is compiled """
try:
if os.listdir(stm_out_folder) == []:
""" There are no files, compile """
xargo_run("stm")
gdb.execute("file %s" % (stm_out_folder + example_name))
gdb.execute("load")
except IOError:
xargo_run("stm")
gdb.execute("file %s" % (stm_out_folder + example_name))
gdb.execute("load")
""" Run KLEE on the generated files """ """ Run KLEE on the generated files """
# print(klee_run()) # print(klee_run())
""" Break at main to set variable values """ """ Break at main to set variable values """
# AddBreakpoint("main") # AddBreakpoint("main")
MainBP("init") MainBP("init")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment