forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			49 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Python
		
	
	
	
| import lit.formats
 | |
| import lit.TestRunner
 | |
| 
 | |
| # Custom format class for static analyzer tests
 | |
| class AnalyzerTest(lit.formats.ShTest):
 | |
| 
 | |
|     def __init__(self, execute_external, use_z3_solver=False):
 | |
|         super(AnalyzerTest, self).__init__(execute_external)
 | |
|         self.use_z3_solver = use_z3_solver
 | |
| 
 | |
|     def execute(self, test, litConfig):
 | |
|         results = []
 | |
| 
 | |
|         # Parse any test requirements ('REQUIRES: ')
 | |
|         saved_test = test
 | |
|         lit.TestRunner.parseIntegratedTestScript(test)
 | |
| 
 | |
|         if 'z3' not in test.requires:
 | |
|             results.append(self.executeWithAnalyzeSubstitution(
 | |
|                 saved_test, litConfig, '-analyzer-constraints=range'))
 | |
| 
 | |
|             if results[-1].code == lit.Test.FAIL:
 | |
|                 return results[-1]
 | |
| 
 | |
|         # If z3 backend available, add an additional run line for it
 | |
|         if self.use_z3_solver == '1':
 | |
|             assert(test.config.clang_staticanalyzer_z3 == '1')
 | |
|             results.append(self.executeWithAnalyzeSubstitution(
 | |
|                 saved_test, litConfig, '-analyzer-constraints=z3 -DANALYZER_CM_Z3'))
 | |
| 
 | |
|         # Combine all result outputs into the last element
 | |
|         for x in results:
 | |
|             if x != results[-1]:
 | |
|                 results[-1].output = x.output + results[-1].output
 | |
| 
 | |
|         if results:
 | |
|             return results[-1]
 | |
|         return lit.Test.Result(lit.Test.UNSUPPORTED,
 | |
|             "Test requires the following unavailable features: z3")
 | |
| 
 | |
|     def executeWithAnalyzeSubstitution(self, test, litConfig, substitution):
 | |
|         saved_substitutions = list(test.config.substitutions)
 | |
|         test.config.substitutions.append(('%analyze', substitution))
 | |
|         result = lit.TestRunner.executeShTest(test, litConfig,
 | |
|             self.execute_external)
 | |
|         test.config.substitutions = saved_substitutions
 | |
| 
 | |
|         return result
 |