diff options
| author | David Blaikie <dblaikie@gmail.com> | 2018-01-23 01:25:24 +0000 |
|---|---|---|
| committer | David Blaikie <dblaikie@gmail.com> | 2018-01-23 01:25:24 +0000 |
| commit | ac904d0e3a94828f5e7dd2f618bfc4c8ab699bd5 (patch) | |
| tree | 91ed2ee5b6480c6ae29733e133225039358725e1 /clang | |
| parent | 0c64f5a2eba6ed11c1e04cfbb19ab8dcf0a469ed (diff) | |
| download | bcm5719-llvm-ac904d0e3a94828f5e7dd2f618bfc4c8ab699bd5.tar.gz bcm5719-llvm-ac904d0e3a94828f5e7dd2f618bfc4c8ab699bd5.zip | |
NewPM: Improve/fix GCOV - which needs to run early in the pass pipeline.
Using a new extension point in the new PM, register GCOV at the start of
the pipeline rather than the end.
llvm-svn: 323167
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/CodeGen/BackendUtil.cpp | 10 | ||||
| -rw-r--r-- | clang/test/CodeGen/code-coverage.c | 6 |
2 files changed, 13 insertions, 3 deletions
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index c7557236573..6d42aac9040 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -909,6 +909,9 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager( bool IsLTO = CodeGenOpts.PrepareForLTO; if (CodeGenOpts.OptimizationLevel == 0) { + if (Optional<GCOVOptions> Options = getGCOVOptions(CodeGenOpts)) + MPM.addPass(GCOVProfilerPass(*Options)); + // Build a minimal pipeline based on the semantics required by Clang, // which is just that always inlining occurs. MPM.addPass(AlwaysInlinerPass()); @@ -932,6 +935,10 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager( [](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) { FPM.addPass(BoundsCheckingPass()); }); + if (Optional<GCOVOptions> Options = getGCOVOptions(CodeGenOpts)) + PB.registerPipelineStartEPCallback([Options](ModulePassManager &MPM) { + MPM.addPass(GCOVProfilerPass(*Options)); + }); if (IsThinLTO) { MPM = PB.buildThinLTOPreLinkDefaultPipeline( @@ -945,9 +952,6 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager( CodeGenOpts.DebugPassManager); } } - if (Optional<GCOVOptions> Options = getGCOVOptions(CodeGenOpts)) { - MPM.addPass(GCOVProfilerPass(*Options)); - } } // FIXME: We still use the legacy pass manager to do code generation. We diff --git a/clang/test/CodeGen/code-coverage.c b/clang/test/CodeGen/code-coverage.c index 9d4f55862ee..4fbfd5b8ce2 100644 --- a/clang/test/CodeGen/code-coverage.c +++ b/clang/test/CodeGen/code-coverage.c @@ -3,9 +3,15 @@ // RUN: %clang_cc1 -emit-llvm -disable-red-zone -femit-coverage-data -coverage-notes-file=aaa.gcno -coverage-data-file=bbb.gcda -dwarf-column-info -debug-info-kind=limited -dwarf-version=4 %s -o - | FileCheck %s --check-prefix GCOV_FILE_INFO // RUN: %clang_cc1 -emit-llvm-bc -o /dev/null -fexperimental-new-pass-manager -fdebug-pass-manager -femit-coverage-data %s 2>&1 | FileCheck --check-prefix=NEWPM %s +// RUN: %clang_cc1 -emit-llvm-bc -o /dev/null -fexperimental-new-pass-manager -fdebug-pass-manager -femit-coverage-data -O3 %s 2>&1 | FileCheck --check-prefix=NEWPM-O3 %s +// NEWPM-NOT: Running pass // NEWPM: Running pass: GCOVProfilerPass +// NEWPM-O3-NOT: Running pass +// NEWPM-O3: Running pass: ForceFunctionAttrsPass +// NEWPM-O3: Running pass: GCOVProfilerPass + int test1(int a) { switch (a % 2) { |

