From 0bf92b1fff32383c1ab0485faf473cf76dce53a3 Mon Sep 17 00:00:00 2001 From: George Karpenkov Date: Thu, 27 Sep 2018 01:10:59 +0000 Subject: [analyzer] [testing] Pass through an extra argument for specifying extra analyzer options Differential Revision: https://reviews.llvm.org/D52585 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@343158 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/analyzer/SATestBuild.py | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) (limited to 'utils/analyzer') diff --git a/utils/analyzer/SATestBuild.py b/utils/analyzer/SATestBuild.py index ea95ee289e..3c886a7d6a 100755 --- a/utils/analyzer/SATestBuild.py +++ b/utils/analyzer/SATestBuild.py @@ -255,7 +255,7 @@ def applyPatch(Dir, PBuildLogFile): sys.exit(1) -def runScanBuild(Dir, SBOutputDir, PBuildLogFile): +def runScanBuild(Args, Dir, SBOutputDir, PBuildLogFile): """ Build the project with scan-build by reading in the commands and prefixing them with the scan-build options. @@ -281,9 +281,11 @@ def runScanBuild(Dir, SBOutputDir, PBuildLogFile): ("stable-report-filename", "true"), ("serialize-stats", "true"), ] - - SBOptions += "-analyzer-config '%s' " % ( - ",".join("%s=%s" % (key, value) for (key, value) in AnalyzerConfig)) + AnalyzerConfigSerialized = ",".join( + "%s=%s" % (key, value) for (key, value) in AnalyzerConfig) + if Args.extra_args: + AnalyzerConfigSerialized += "," + Args.extra_args + SBOptions += "-analyzer-config '%s' " % AnalyzerConfigSerialized # Always use ccc-analyze to ensure that we can locate the failures # directory. @@ -407,7 +409,7 @@ def removeLogFile(SBOutputDir): check_call(RmCommand, shell=True) -def buildProject(Dir, SBOutputDir, ProjectBuildMode, IsReferenceBuild): +def buildProject(Args, Dir, SBOutputDir, ProjectBuildMode, IsReferenceBuild): TBegin = time.time() BuildLogPath = getBuildLogPath(SBOutputDir) @@ -431,7 +433,7 @@ def buildProject(Dir, SBOutputDir, ProjectBuildMode, IsReferenceBuild): if (ProjectBuildMode == 1): downloadAndPatch(Dir, PBuildLogFile) runCleanupScript(Dir, PBuildLogFile) - runScanBuild(Dir, SBOutputDir, PBuildLogFile) + runScanBuild(Args, Dir, SBOutputDir, PBuildLogFile) else: runAnalyzePreprocessed(Dir, SBOutputDir, ProjectBuildMode) @@ -628,12 +630,13 @@ def cleanupReferenceResults(SBOutputDir): class TestProjectThread(threading.Thread): - def __init__(self, TasksQueue, ResultsDiffer, FailureFlag): + def __init__(self, Args, TasksQueue, ResultsDiffer, FailureFlag): """ :param ResultsDiffer: Used to signify that results differ from the canonical ones. :param FailureFlag: Used to signify a failure during the run. """ + self.Args = Args self.TasksQueue = TasksQueue self.ResultsDiffer = ResultsDiffer self.FailureFlag = FailureFlag @@ -649,7 +652,7 @@ class TestProjectThread(threading.Thread): Logger = logging.getLogger(ProjArgs[0]) Local.stdout = StreamToLogger(Logger, logging.INFO) Local.stderr = StreamToLogger(Logger, logging.ERROR) - if not testProject(*ProjArgs): + if not testProject(Args, *ProjArgs): self.ResultsDiffer.set() self.TasksQueue.task_done() except: @@ -657,7 +660,7 @@ class TestProjectThread(threading.Thread): raise -def testProject(ID, ProjectBuildMode, IsReferenceBuild=False, Strictness=0): +def testProject(Args, ID, ProjectBuildMode, IsReferenceBuild=False, Strictness=0): """ Test a given project. :return TestsPassed: Whether tests have passed according @@ -675,7 +678,7 @@ def testProject(ID, ProjectBuildMode, IsReferenceBuild=False, Strictness=0): RelOutputDir = getSBOutputDirName(IsReferenceBuild) SBOutputDir = os.path.join(Dir, RelOutputDir) - buildProject(Dir, SBOutputDir, ProjectBuildMode, IsReferenceBuild) + buildProject(Args, Dir, SBOutputDir, ProjectBuildMode, IsReferenceBuild) checkBuild(SBOutputDir) @@ -719,17 +722,17 @@ def validateProjectFile(PMapFile): " (single file), 1 (project), or 2(single file c++11)." raise Exception() -def singleThreadedTestAll(ProjectsToTest): +def singleThreadedTestAll(Args, ProjectsToTest): """ Run all projects. :return: whether tests have passed. """ Success = True for ProjArgs in ProjectsToTest: - Success &= testProject(*ProjArgs) + Success &= testProject(Args, *ProjArgs) return Success -def multiThreadedTestAll(ProjectsToTest, Jobs): +def multiThreadedTestAll(Args, ProjectsToTest, Jobs): """ Run each project in a separate thread. @@ -747,7 +750,7 @@ def multiThreadedTestAll(ProjectsToTest, Jobs): FailureFlag = threading.Event() for i in range(Jobs): - T = TestProjectThread(TasksQueue, ResultsDiffer, FailureFlag) + T = TestProjectThread(Args, TasksQueue, ResultsDiffer, FailureFlag) T.start() # Required to handle Ctrl-C gracefully. @@ -772,9 +775,9 @@ def testAll(Args): Args.regenerate, Args.strictness)) if Args.jobs <= 1: - return singleThreadedTestAll(ProjectsToTest) + return singleThreadedTestAll(Args, ProjectsToTest) else: - return multiThreadedTestAll(ProjectsToTest, Args.jobs) + return multiThreadedTestAll(Args, ProjectsToTest, Args.jobs) if __name__ == '__main__': @@ -791,6 +794,9 @@ if __name__ == '__main__': Parser.add_argument('-j', '--jobs', dest='jobs', type=int, default=0, help='Number of projects to test concurrently') + Parser.add_argument('--extra-analyzer-args', dest='extra_args', + type=str, default="", + help="Extra arguments to add to -analyzer-config") Args = Parser.parse_args() TestsPassed = testAll(Args) -- cgit v1.2.1