blob: 0aa2dbc1bb09d1ef42640453e40be70822544e83 [file] [log] [blame]
Reid Kleckner2ae37c12017-04-05 18:56:48 +00001import lit.formats
2import lit.TestRunner
3
4# Custom format class for static analyzer tests
5class AnalyzerTest(lit.formats.ShTest):
6
7 def execute(self, test, litConfig):
Dominic Chenf94c1082017-06-15 17:05:07 +00008 results = []
Reid Kleckner2ae37c12017-04-05 18:56:48 +00009
Dominic Chenf94c1082017-06-15 17:05:07 +000010 # Parse any test requirements ('REQUIRES: ')
Dominic Chenc0402c62017-07-12 21:43:42 +000011 saved_test = test
Dominic Chenf94c1082017-06-15 17:05:07 +000012 lit.TestRunner.parseIntegratedTestScript(test)
13
14 if 'z3' not in test.requires:
15 results.append(self.executeWithAnalyzeSubstitution(
Dominic Chenc0402c62017-07-12 21:43:42 +000016 saved_test, litConfig, '-analyzer-constraints=range'))
Dominic Chenf94c1082017-06-15 17:05:07 +000017
Dominic Chenc0402c62017-07-12 21:43:42 +000018 if results[-1].code == lit.Test.FAIL:
Dominic Chenf94c1082017-06-15 17:05:07 +000019 return results[-1]
Reid Kleckner2ae37c12017-04-05 18:56:48 +000020
21 # If z3 backend available, add an additional run line for it
Dominic Chenc0402c62017-07-12 21:43:42 +000022 if test.config.clang_staticanalyzer_z3 == '1':
Dominic Chenf94c1082017-06-15 17:05:07 +000023 results.append(self.executeWithAnalyzeSubstitution(
24 saved_test, litConfig, '-analyzer-constraints=z3 -DANALYZER_CM_Z3'))
Reid Kleckner2ae37c12017-04-05 18:56:48 +000025
Dominic Chenf94c1082017-06-15 17:05:07 +000026 # Combine all result outputs into the last element
27 for x in results:
28 if x != results[-1]:
29 results[-1].output = x.output + results[-1].output
30
31 if results:
32 return results[-1]
33 return lit.Test.Result(lit.Test.UNSUPPORTED,
34 "Test requires the following unavailable features: z3")
Reid Kleckner2ae37c12017-04-05 18:56:48 +000035
36 def executeWithAnalyzeSubstitution(self, test, litConfig, substitution):
37 saved_substitutions = list(test.config.substitutions)
38 test.config.substitutions.append(('%analyze', substitution))
39 result = lit.TestRunner.executeShTest(test, litConfig,
Dominic Chenf94c1082017-06-15 17:05:07 +000040 self.execute_external)
Reid Kleckner2ae37c12017-04-05 18:56:48 +000041 test.config.substitutions = saved_substitutions
42
43 return result