mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-09 11:25:55 +00:00
Teach lit to honor conditional directives. The syntax is:
IF(condition(value)): If the value satisfies the condition, the line is processed by lit; otherwise it is skipped. A test with no unignored directives is resolved as Unsupported. The test suite is responsible for defining conditions; conditions are unary functions over strings. I've defined two conditions in the LLVM test suite, TARGET (with values like those in TARGETS_TO_BUILD) and BINDING (with values like those in llvm_bindings). So for example you can write: IF(BINDING(ocaml)): RUN: %blah %s -o - and the RUN line will only execute if LLVM was configured with the ocaml bindings. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97726 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -144,6 +144,9 @@ bindings = set(site_exp['llvm_bindings'].split(','))
|
|||||||
def llvm_supports_binding(name):
|
def llvm_supports_binding(name):
|
||||||
return name in bindings
|
return name in bindings
|
||||||
|
|
||||||
|
config.conditions["TARGET"] = llvm_supports_target
|
||||||
|
config.conditions["BINDING"] = llvm_supports_binding
|
||||||
|
|
||||||
# Provide on_clone hook for reading 'dg.exp'.
|
# Provide on_clone hook for reading 'dg.exp'.
|
||||||
import os
|
import os
|
||||||
simpleLibData = re.compile(r"""load_lib llvm.exp
|
simpleLibData = re.compile(r"""load_lib llvm.exp
|
||||||
|
@@ -385,7 +385,30 @@ def parseIntegratedTestScript(test):
|
|||||||
script = []
|
script = []
|
||||||
xfails = []
|
xfails = []
|
||||||
xtargets = []
|
xtargets = []
|
||||||
|
ignoredAny = False
|
||||||
for ln in open(sourcepath):
|
for ln in open(sourcepath):
|
||||||
|
if 'IF(' in ln:
|
||||||
|
# Required syntax here is IF(condition(value)):
|
||||||
|
index = ln.index('IF(')
|
||||||
|
ln = ln[index+3:]
|
||||||
|
index = ln.index('(')
|
||||||
|
if index is -1:
|
||||||
|
return (Test.UNRESOLVED, "ill-formed IF at '"+ln[:10]+"'")
|
||||||
|
condition = ln[:index]
|
||||||
|
ln = ln[index+1:]
|
||||||
|
index = ln.index(')')
|
||||||
|
if index is -1 or ln[index:index+3] != ')):':
|
||||||
|
return (Test.UNRESOLVED, "ill-formed IF at '"+ln[:10]+"'")
|
||||||
|
value = ln[:index]
|
||||||
|
ln = ln[index+3:]
|
||||||
|
|
||||||
|
# Actually test the condition.
|
||||||
|
if condition not in test.config.conditions:
|
||||||
|
return (Test.UNRESOLVED, "unknown condition '"+condition+"'")
|
||||||
|
if not test.config.conditions[condition](value):
|
||||||
|
ignoredAny = True
|
||||||
|
continue
|
||||||
|
|
||||||
if 'RUN:' in ln:
|
if 'RUN:' in ln:
|
||||||
# Isolate the command to run.
|
# Isolate the command to run.
|
||||||
index = ln.index('RUN:')
|
index = ln.index('RUN:')
|
||||||
@@ -422,6 +445,8 @@ def parseIntegratedTestScript(test):
|
|||||||
|
|
||||||
# Verify the script contains a run line.
|
# Verify the script contains a run line.
|
||||||
if not script:
|
if not script:
|
||||||
|
if ignoredAny:
|
||||||
|
return (Test.UNSUPPORTED, "Test has only ignored run lines")
|
||||||
return (Test.UNRESOLVED, "Test has no run line!")
|
return (Test.UNRESOLVED, "Test has no run line!")
|
||||||
|
|
||||||
if script[-1][-1] == '\\':
|
if script[-1][-1] == '\\':
|
||||||
|
@@ -27,7 +27,8 @@ class TestingConfig:
|
|||||||
on_clone = None,
|
on_clone = None,
|
||||||
test_exec_root = None,
|
test_exec_root = None,
|
||||||
test_source_root = None,
|
test_source_root = None,
|
||||||
excludes = [])
|
excludes = [],
|
||||||
|
conditions = {})
|
||||||
|
|
||||||
if os.path.exists(path):
|
if os.path.exists(path):
|
||||||
# FIXME: Improve detection and error reporting of errors in the
|
# FIXME: Improve detection and error reporting of errors in the
|
||||||
@@ -53,7 +54,7 @@ class TestingConfig:
|
|||||||
|
|
||||||
def __init__(self, parent, name, suffixes, test_format,
|
def __init__(self, parent, name, suffixes, test_format,
|
||||||
environment, substitutions, unsupported, on_clone,
|
environment, substitutions, unsupported, on_clone,
|
||||||
test_exec_root, test_source_root, excludes):
|
test_exec_root, test_source_root, excludes, conditions):
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.name = str(name)
|
self.name = str(name)
|
||||||
self.suffixes = set(suffixes)
|
self.suffixes = set(suffixes)
|
||||||
@@ -65,6 +66,7 @@ class TestingConfig:
|
|||||||
self.test_exec_root = test_exec_root
|
self.test_exec_root = test_exec_root
|
||||||
self.test_source_root = test_source_root
|
self.test_source_root = test_source_root
|
||||||
self.excludes = set(excludes)
|
self.excludes = set(excludes)
|
||||||
|
self.conditions = dict(conditions)
|
||||||
|
|
||||||
def clone(self, path):
|
def clone(self, path):
|
||||||
# FIXME: Chain implementations?
|
# FIXME: Chain implementations?
|
||||||
@@ -74,7 +76,7 @@ class TestingConfig:
|
|||||||
self.environment, self.substitutions,
|
self.environment, self.substitutions,
|
||||||
self.unsupported, self.on_clone,
|
self.unsupported, self.on_clone,
|
||||||
self.test_exec_root, self.test_source_root,
|
self.test_exec_root, self.test_source_root,
|
||||||
self.excludes)
|
self.excludes, self.conditions)
|
||||||
if cfg.on_clone:
|
if cfg.on_clone:
|
||||||
cfg.on_clone(self, cfg, path)
|
cfg.on_clone(self, cfg, path)
|
||||||
return cfg
|
return cfg
|
||||||
|
Reference in New Issue
Block a user