summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorJustin Bogner <mail@justinbogner.com>2015-02-24 04:13:56 +0000
committerJustin Bogner <mail@justinbogner.com>2015-02-24 04:13:56 +0000
commitc109102ecb80c06375688d374fdc17c04cd7d562 (patch)
tree44640375a792629400dc47d26deeda120a9d1a75 /clang
parent7d7dee753dc91b24fee3f39af37b2432e9fe41a2 (diff)
downloadbcm5719-llvm-c109102ecb80c06375688d374fdc17c04cd7d562.tar.gz
bcm5719-llvm-c109102ecb80c06375688d374fdc17c04cd7d562.zip
InstrProf: Make sure counts in lambdas don't escape to the parent scope
When generating coverage maps, we were traversing the body as if it were part of the parent function, but this doesn't make sense since we're currently counting lambdas as separate functions. llvm-svn: 230304
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/CodeGen/CoverageMappingGen.cpp5
-rw-r--r--clang/test/CoverageMapping/lambda.cpp17
2 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp
index 4bd4eb6da2e..55e7334acc2 100644
--- a/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -850,6 +850,11 @@ struct CounterCoverageMappingBuilder
extendRegion(E->getRHS());
propagateCounts(getRegionCounter(E), E->getRHS());
}
+
+ void VisitLambdaExpr(const LambdaExpr *LE) {
+ // Lambdas are treated as their own functions for now, so we shouldn't
+ // propagate counts into them.
+ }
};
}
diff --git a/clang/test/CoverageMapping/lambda.cpp b/clang/test/CoverageMapping/lambda.cpp
new file mode 100644
index 00000000000..fb018e6b477
--- /dev/null
+++ b/clang/test/CoverageMapping/lambda.cpp
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -x c++ -std=c++11 -triple %itanium_abi_triple -fprofile-instr-generate -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only %s -main-file-name lambda.cpp | FileCheck %s
+
+// CHECK-LABEL: _Z3fooi:
+void foo(int i) { // CHECK: File 0, [[@LINE]]:17 -> {{[0-9]+}}:2 = #0
+ auto f = [](int x) {
+ return x + 1;
+ };
+
+ f(i);
+ // Make sure the zero region after the return doesn't escape the lambda.
+ // CHECK-NOT: File 0, {{[0-9:]+}} -> [[@LINE+1]]:2 = 0
+}
+
+int main(int argc, const char *argv[]) {
+ foo(1);
+ return 0;
+}
OpenPOWER on IntegriCloud