[clang] [MC/DC][Coverage] Workaround for `##` conditions (PR #89573)

2024-04-24 Thread NAKAMURA Takumi via cfe-commits

https://github.com/chapuni closed 
https://github.com/llvm/llvm-project/pull/89573
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MC/DC][Coverage] Workaround for `##` conditions (PR #89573)

2024-04-24 Thread NAKAMURA Takumi via cfe-commits

chapuni wrote:

See #89869 .

https://github.com/llvm/llvm-project/pull/89573
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MC/DC][Coverage] Workaround for `##` conditions (PR #89573)

2024-04-24 Thread Wentao Zhang via cfe-commits

whentojump wrote:

Yes I can do it. Thank you as well!!

https://github.com/llvm/llvm-project/pull/89573
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MC/DC][Coverage] Workaround for `##` conditions (PR #89573)

2024-04-23 Thread NAKAMURA Takumi via cfe-commits

chapuni wrote:

@whentojump Thanks. Would you like to take this over? Then I will close this.

https://github.com/llvm/llvm-project/pull/89573
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MC/DC][Coverage] Workaround for `##` conditions (PR #89573)

2024-04-23 Thread Wentao Zhang via cfe-commits

whentojump wrote:

@chapuni Would you please take a look at #89869? Specifically, the extra one 
commit atop yours.

Essentially I did similar things to `getIncludeOrExpansionLoc()`. 


https://github.com/llvm/llvm-project/pull/89573
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [MC/DC][Coverage] Workaround for `##` conditions (PR #89573)

2024-04-22 Thread Wentao Zhang via cfe-commits

whentojump wrote:

Hi, thanks for the fix.

I can confirm it addressed your test case (https://godbolt.org/z/sMscqWeq7). 
But unfortunately it doesn't fix the one in my original post of #87000 
([compiler explorer 
link](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGIM6SuADJ4DJgAcj4ARpjEEgDM8aQADqgKhE4MHt6%2B/ilpGQIhYZEsMXFcibaY9o4CQgRMxATZPn4BdpgOmQ1NBMUR0bEJSQqNza25HeP9oYNlw5XxAJS2qF7EyOwcAPQ7ANQAgvuYqqzJ9PvpLBd4NJjo%2B1TEqCz7CAQEyQogezV4qjwxAAdFFUKgCLRQsC0CwdlCGF5VDsAG4ANmBAA5gVwdgp1ptMDt0MQ8CjYgodk4WCwvFTBDUdslYlQWAIYSYNIc9vsAEqYZIvdBeZB4KKXADuhAQ%2B2QBiM%2B3JxHSAn2XGxXGB8X20EIAAFgNKvFEYa8QLRaCi4RarQBaQWobRdAjAw0ETncg5mSQATkxmHiTA0AHYqPF0FQzGZg2YqF1MZiAKxURPxKgaH1MTCVMxSUTxTHLfaGR5yKJeQReWXy4CKimZNUarUenkQazWMwab0aeJRkPxLip6yYKho9BcLoh5Bon22rgAP1OyQXne7vdzPsSGg0WLRy2BLZ2h/24QhmH2BAQTAIxYUSmamQU%2BwAVCw8MAPs/3kxyRfUPsYhOZhxQeUgLwQWIRxIc9BUwcs6BvZImGQABrJhgEwBRj2eV5i2SF0bRYYESFrTACGQF83w/AgvwYCEAMwK9f0vc8FFYTBgX2bBXU4pgn1QKh9gAWSafYzExUhj0I200BROdMSeF43iYfDgUI4jiFIhh0CfLxkn2KVL32cwzCETBgDYQRrwbKgmC8Wh3SjMDpNkucfWPdBUEwhgwA4G9bLoYsb3oPibyXKFRUhABPTiAHkGHA88IQg4hv20sC7gM894NoR4giCAA1ITFNeY98Q2LZi20oCmBA297zqBgwIlc9RAS1AonvX9wrwSLjKjORwl5bBDjcAAJQ4LCCbATlULovAIB4TOPNg73QzCDy5PZjwaAUfkPY99n2AASfZiDeW1iEEphiIWl9gQdZ4mAle7HvQa8mEOk7q0MWtbQAdTomSzHiW1TkWhgVUh/ZbSoR66EwW1QjGYhbQwsJiGvc9Ydk2J1ttFgVOSUI/qoXHMYwgnkHQCjmSutkGA5LaDiO07gR2G71ndZmju%2B6S3o%2B/Y2E088sFs%2ByXUezGXttf8xbshyHpeKh3saL7Tpc1AUSuBBUBl20FF1iUqZpmHkYIVH4cueWJaVgTVaYYtbu5z0PWPAARHwWCi/YxdCQpoaIIWmBQ89LzwJ8aEuWFifoTbPR1IRXiSwSWOU4hzzEfF9lD4gwloWUMGyu7Qhj%2BhFv2EghYwO48AeZY3a5FGRRva8LeM4MrC5TkfVoARazQBgaGALgTHiLvDh7vuFUH4ezDHieTGDd2F8bw5m4cd4JQAfTpqht8wclBA7xeM2n2s8HQVRV%2B7s/%2B8Lof3xvyfl%2Bfj0N8QlkD6Pm8l9Pn0P5b13l/Q%2BjAbwIAlG/DMgC26pVgW/V%2B4816AOpLSXetIT6N17vfKOi1iBQOwTPKgwBt4Z2AAQwBe9v5gJfKAwQ28oRjBMImCwXBtzMJXkg2%2BhDayIhYNvZAgh8FcMnnfBUXglDoG3oTBQKEEGcNPocc%2BF5MIEG3iWbeSg1FREIBAc%2Bzl%2B5Fj/mdMiGwEoaAXh3FeXJlGoK8Og%2BxKIxCXyxsA4gAihHUMEBAFBrw0HJAwc%2BAxRgwKUJAT/F8RjO4mIIGYtUlil7WMOCiVAl9qyYCaNvHRBA9H92CcAKJVhX5chSWkiUpJFoAEdckhP2OfQpiSPSlMeOUwgNQanAHyQ04pSj752IEQIYeWS%2BKYB8RbFu%2Bx%2BkBKrEEuphiT4xLiRY8eViPTKKcaSWq9Bt5UCoAoDphTFl53iSsxpt9J4gz9mEfYcgggQAABpFnueYeILzblrx5IcBwXgxC0B9mgYmDwSpvFzvnK4BIthrxeVc88FgACSAAVCADBiANwzD3HuEBbkQC4EY%2BIbgx5uB1Ci5YaLREXPDCOOYTw9kQFUEWCA28sleAQqEAZkNGj0OSHSvFAAxfYTKcqOAYDs2l9L9ggEVE0PAWzMCiv2fSslbtLlUuuegQm7iM5MHQNUpgRYtU6ogHq5VlKaBqo1dvVpVSjWkBREWK1mBqkolIMa7uKqzWiwtQa2gRr9UZPQD611FKYW%2BwtQ6wNYE7UGQqe051xYlVutNdSqZaDGCkMdV4VRsRt6XwgJgNF7kMxQHzf1NE%2BwNCqFxSakNKb7Fps8oTUIeaC0YqLcWvF2Ax4zVxaW8tlalXuuTX4%2Bx0yD4iqQukdAzbW2Fp9FAZtxl4idqXWJIxZgy0VqrYmmtw6HFjvUQQfZ%2BaZ2YvbYu5dM0Vi9s3QOpN1za37qQhhbejQQLTvRW2hdXau37EkGujd/bq2qvPA%2BjCaiM6VMzWMbNubcGxALfOuDqLz0/q4Hua9qhdm7NvTumkI60Fge3g2pgTakMts/WRlDK7ez/r7VhqgOHgOTN3aOwjE7YMIXgzOqAlHzAAbTPRxjHrmN4b3YR68%2ByyPcZ45x5D36V3elo5uhjQHhOgbIrvdaL7ZXUFkwhmTDl4NUcvWYJTlaVPnOhUxuFsUhJCTkNvZQ9nt7hDkEJbesVeW8u3sNAA4kIE9GZJCqepTZuzDmnMOc895vzQht5CARdgZQgWfTBcs4O65YXnORe3ryuFQREu8h89gAAinIbACXsBFbhdY2dFaNCj23dZ2z2XnN5YK1V7e7tbOHDheEFL9X55NeE1liLbX8uFcc4cIQNWBuqA0Gl4NzXwuOfGx1orhwEUBY/XV%2BbmIQuZZa2Nhz7XJvKEOL57A28EWTWmjOzdFj0t3vPKN1bJ2JudewP1nbPd4VIoHAmpbI2jtve3m4XlvmPNeaENgBFc22GPaB6FkHOXweQ7cOEBFvI3CHGUFD3lMO4c7YrZiRHVngcrdRxDsHmPhoFRx3j6LhP7uqExIt8nyPKfObR/FuFAAtTtP2Mwk4Oy9lH3Pqenaq3FpnsOWfs%2BG5z1rDmGfFf8/FxLyWhd%2BihRlkDLG0FaJ2bJxlzA2BgXZcPC3SGLeX1UBbrogz3zkfcomAl3dO4pa99rjFbusGZSgLW20XakO9uN4ZuT66%2BMif8amkVLyXnbzN6Mg%2Bs9ncNPRX77hPd1WZPDRAIPXbkDEPTbWawAq7cvn2K9qnkPZcIv6l3V37vRGzp7rzav4uVfU5mwLxv3vm9YJnR36gtLw94KLLaNURYvw14l5DqXvIZfQ9h5JTPLeUsd/U2ohPIMk/sUZWngpHciVz/e%2Bt7eX2G5IKz63s5befeP8Hx7pJx5lB9EroJD4Xwfh/ChICEEMECEBEU0a0UIJEVEDEDUPECFIkEkMkCkKkYdekRaWgJkFkBmDkEGIISQDQfbc5MYayCiUIG8B9PidIYAEVOhHJXxUTaZF8WtNfO/bXI6MJK6LxG8Z8agpVT3bhEgyZK%2BKBVvB9I3JDCACDKDPBHNdAMCag4PJdWBU0R%2BEeJgzfDvM/XLD7IrYaMrCrSbGrDKK%2BVQlgjvOQrtRQo/KtERHuHkEQjTMQ4jUIWQn%2BeQ7ACwp3FQrBHkYfdQrvTQi/brISXrcIQw%2B3Lwg4Hw3mMwhQz4EESw6/RRHuDOWJY5ZZReHpD2L2H2RtBgNefgnIiAZpDPVvWg2PKsWtChcZTeKhagk4H%2BAhMgu8d8Kgn%2BNsddRg0tbgghZIpZeRDgVYWgTgRMXgPwDgLQUgVATgAlSwcvcqQkfqAcXgAgTQfo1YFCEARMDQfQTgSQEYlYiYzgXgH4LY5YsY/o0gOAWAGARAFAV4WOWIcgSgGOBGOIOUX6dRO8WIRqBQF9YgCsFCPgWTH4CAKIfYnRZgYgKKTgHgUgcEpoKKWKKIJ0BwaE3gWESyAgeKP5fYrAcsYANwX5H4bgXgLAQmIwcQM40gfADObockIk8Y04eaRaVE8gBkQYykqEKITGSEjwLAFki2PAFgVE1YKgAwYABQAqOuCUWKZkUYmE/gQQEQMQdgKQGQQQRQFQdQSk3QLgfQX6FAdsSwfQMUH4SAVYVAfCR8TgWGK2RGc2VGdGPGCuHGLWPGSmQmZIYmBUF0pUfGFgamZAXgV04gUkLAU0iAVYToboZwPNbSSYPwXU4IOYUocoPQVIdIRqeMtMgoRqAYFMxYaoWoHoGYLM3UqMxqXoZoPMoYCoWwEszwNoPQQgqs5MmsiQSM2A9s7YjgYY0gUY8YyYjgfYVnNEW0NESQH6BUI1T4h8AQJ8cZBgFCBlXAQgKuF5XFJYlY0lUgdYzY7s3Y0gIUvc/soMw42wEAE4rci464iAJAIgTwR4o1TSIk3gJocU9/fOIQI2OUtEu4l48IdiTgEcscic4AZACiLgMwYEMwXgB4Vc0MvQBU4QUQcQVUpCjUtQfYnUw8gQZCVAFcogYgMaPiCwTARgQ4BaVAGUxgB4FkhmPCgikgain8nC5gNABofAFisYTis87i0ID8moL8vWFi%2B82gOFdAc0S0FgGSLWBcgE8pFSYU7s3sk8g4jgTWbWCAN4owWWBgP5IsYC8cyc2sachqR8C8P4xc5c/AQihY3U/YDw

[clang] [MC/DC][Coverage] Workaround for `##` conditions (PR #89573)

2024-04-21 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang-codegen

Author: NAKAMURA Takumi (chapuni)


Changes

A synthesized identifier with `##` is emitted to ``. 
`llvm-cov` cannot handle ` since it doesn't have actual 
files.

As a workaround, peel `` to the actual definition if the 
definition is present.

This affects predefined built-in macros, like __LINE__.

Fixes #87000

---
Full diff: https://github.com/llvm/llvm-project/pull/89573.diff


4 Files Affected:

- (modified) clang/lib/CodeGen/CoverageMappingGen.cpp (+11-1) 
- (modified) clang/test/CoverageMapping/builtinmacro.c (+1-1) 
- (modified) clang/test/CoverageMapping/macros.c (+5-3) 
- (added) clang/test/CoverageMapping/mcdc-scratch-space.c (+39) 


``diff
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp 
b/clang/lib/CodeGen/CoverageMappingGen.cpp
index 71215da362d3d0..643f3c5ab8d349 100644
--- a/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -339,8 +339,18 @@ class CoverageMappingBuilder {
 
 llvm::SmallSet Visited;
 SmallVector, 8> FileLocs;
-for (const auto &Region : SourceRegions) {
+for (auto &Region : SourceRegions) {
   SourceLocation Loc = Region.getBeginLoc();
+
+  // Replace Region with its definition if it is in .
+  while (Loc.isMacroID() &&
+ SM.isWrittenInScratchSpace(SM.getSpellingLoc(Loc))) {
+auto ExpansionRange = SM.getImmediateExpansionRange(Loc);
+Loc = ExpansionRange.getBegin();
+Region.setStartLoc(Loc);
+Region.setEndLoc(ExpansionRange.getEnd());
+  }
+
   FileID File = SM.getFileID(Loc);
   if (!Visited.insert(File).second)
 continue;
diff --git a/clang/test/CoverageMapping/builtinmacro.c 
b/clang/test/CoverageMapping/builtinmacro.c
index abcdc191523a5d..5d5a176aa7d87e 100644
--- a/clang/test/CoverageMapping/builtinmacro.c
+++ b/clang/test/CoverageMapping/builtinmacro.c
@@ -4,7 +4,7 @@
 
 // CHECK: filename
 const char *filename (const char *name) { // CHECK-NEXT: File 0, [[@LINE]]:41 
-> [[@LINE+3]]:2 = #0
-  static const char this_file[] = __FILE__;
+  static const char this_file[] = __FILE__; // CHECK-NEXT: File 0, 
[[@LINE]]:35 -> [[@LINE]]:35 = #0
   return this_file;
 }
 
diff --git a/clang/test/CoverageMapping/macros.c 
b/clang/test/CoverageMapping/macros.c
index 6bd3be434139a2..fcf21170ef135c 100644
--- a/clang/test/CoverageMapping/macros.c
+++ b/clang/test/CoverageMapping/macros.c
@@ -80,12 +80,14 @@ void func7(void) { // CHECK-NEXT: File 0, [[@LINE]]:18 -> 
[[@LINE+6]]:2 = #0
   int kk,ll;   // CHECK-NEXT: File 0, [[@LINE+1]]:7 -> [[@LINE+1]]:8 = #0
   if (k)   // CHECK-NEXT: Branch,File 0, [[@LINE]]:7 -> [[@LINE]]:8 = 
#1
 m(k);  // CHECK-NEXT: Gap,File 0, [[@LINE-1]]:9 -> [[@LINE]]:5 = #1
-  else // CHECK-NEXT: Expansion,File 0, [[@LINE-1]]:5 -> 
[[@LINE-1]]:6 = #0
+  else // CHECK-NEXT: Expansion,File 0, [[@LINE-1]]:5 -> 
[[@LINE-1]]:6 = #1
 l = m(l);  // CHECK-NEXT: Gap,File 0, [[@LINE-2]]:7 -> [[@LINE]]:5 = 
(#0 - #1)
 }  // CHECK-NEXT: File 0, [[@LINE-1]]:5 -> [[@LINE-1]]:10 = 
(#0 - #1)
// CHECK-NEXT: Expansion,File 0, [[@LINE-2]]:9 -> 
[[@LINE-2]]:10 = (#0 - #1)
-   // CHECK-NEXT: File 1, [[@LINE-9]]:14 -> [[@LINE-9]]:18 = #0
-   // CHECK-NEXT: File 2, [[@LINE-10]]:14 -> [[@LINE-10]]:15 = 
(#0 - #1)
+   // CHECK-NEXT: File 1, [[@LINE-9]]:14 -> [[@LINE-9]]:17 = #1
+   // CHECK-NEXT: File 1, [[@LINE-10]]:14 -> [[@LINE-10]]:18 = 
#0
+   // CHECK-NEXT: File 2, [[@LINE-11]]:14 -> [[@LINE-11]]:17 = 
(#0 - #1)
+   // CHECK-NEXT: File 2, [[@LINE-12]]:14 -> [[@LINE-12]]:15 = 
(#0 - #1)
 
 int main(int argc, const char *argv[]) {
   func();
diff --git a/clang/test/CoverageMapping/mcdc-scratch-space.c 
b/clang/test/CoverageMapping/mcdc-scratch-space.c
new file mode 100644
index 00..1b8735cd27445a
--- /dev/null
+++ b/clang/test/CoverageMapping/mcdc-scratch-space.c
@@ -0,0 +1,39 @@
+// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c99 -fcoverage-mcdc 
-fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping 
-emit-llvm-only %s | FileCheck %s
+
+// CHECK: builtin_macro0:
+int builtin_macro0(int a) {
+  // CHECK: Decision,File 0, [[@LINE+1]]:11 -> [[@LINE+2]]:15 = M:0, C:2
+  return (__LINE__ // CHECK: Branch,File 0, [[@LINE]]:11 -> [[@LINE]]:11 = 0, 
0 [1,2,0]
+  && a); //   CHECK: Branch,File 0, [[@LINE]]:14 -> [[@LINE]]:15 = #2, 
(#1 - #2) [2,0,0]
+}
+
+// CHECK: builtin_macro1:
+int builtin_macro1(int a) {
+  // CHECK: Decision,File 0, [[@LINE+1]]:11 -> [[@LINE+2]]:22 = M:0, C:2
+  return (a // CHECK: Branch,File 0, [[@LINE]]:11 -> [[@LINE]]:12 = (#0 - #1), 
#1 [1,0,2]
+  || __LINE__); // CHECK: Branch,File 0, [[@LINE]]:14 -> [[@LINE]]:14 
= 0, 0 [2,0,0]
+}
+
+#define PRE(x) pre_##x
+
+// CHECK: pre0:
+int 

[clang] [MC/DC][Coverage] Workaround for `##` conditions (PR #89573)

2024-04-21 Thread NAKAMURA Takumi via cfe-commits

https://github.com/chapuni created 
https://github.com/llvm/llvm-project/pull/89573

A synthesized identifier with `##` is emitted to ``. `llvm-cov` 
cannot handle ` since it doesn't have actual files.

As a workaround, peel `` to the actual definition if the 
definition is present.

This affects predefined built-in macros, like __LINE__.

Fixes #87000

>From f1214b72c842d08cb843e90a7b1cace0aa6e0260 Mon Sep 17 00:00:00 2001
From: NAKAMURA Takumi 
Date: Fri, 19 Apr 2024 15:16:05 +0900
Subject: [PATCH] [MC/DC][Coverage] Workaround for `##` conditions

A synthesized identifier with `##` is emitted to ``.
`llvm-cov` cannot handle ` since it doesn't have actual files.

As a workaround, peel `` to the actual definition if the 
definition is present.

This affects predefined built-in macros, like __LINE__.

Fixes #87000
---
 clang/lib/CodeGen/CoverageMappingGen.cpp  | 12 +-
 clang/test/CoverageMapping/builtinmacro.c |  2 +-
 clang/test/CoverageMapping/macros.c   |  8 ++--
 .../test/CoverageMapping/mcdc-scratch-space.c | 39 +++
 4 files changed, 56 insertions(+), 5 deletions(-)
 create mode 100644 clang/test/CoverageMapping/mcdc-scratch-space.c

diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp 
b/clang/lib/CodeGen/CoverageMappingGen.cpp
index 71215da362d3d0..643f3c5ab8d349 100644
--- a/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -339,8 +339,18 @@ class CoverageMappingBuilder {
 
 llvm::SmallSet Visited;
 SmallVector, 8> FileLocs;
-for (const auto &Region : SourceRegions) {
+for (auto &Region : SourceRegions) {
   SourceLocation Loc = Region.getBeginLoc();
+
+  // Replace Region with its definition if it is in .
+  while (Loc.isMacroID() &&
+ SM.isWrittenInScratchSpace(SM.getSpellingLoc(Loc))) {
+auto ExpansionRange = SM.getImmediateExpansionRange(Loc);
+Loc = ExpansionRange.getBegin();
+Region.setStartLoc(Loc);
+Region.setEndLoc(ExpansionRange.getEnd());
+  }
+
   FileID File = SM.getFileID(Loc);
   if (!Visited.insert(File).second)
 continue;
diff --git a/clang/test/CoverageMapping/builtinmacro.c 
b/clang/test/CoverageMapping/builtinmacro.c
index abcdc191523a5d..5d5a176aa7d87e 100644
--- a/clang/test/CoverageMapping/builtinmacro.c
+++ b/clang/test/CoverageMapping/builtinmacro.c
@@ -4,7 +4,7 @@
 
 // CHECK: filename
 const char *filename (const char *name) { // CHECK-NEXT: File 0, [[@LINE]]:41 
-> [[@LINE+3]]:2 = #0
-  static const char this_file[] = __FILE__;
+  static const char this_file[] = __FILE__; // CHECK-NEXT: File 0, 
[[@LINE]]:35 -> [[@LINE]]:35 = #0
   return this_file;
 }
 
diff --git a/clang/test/CoverageMapping/macros.c 
b/clang/test/CoverageMapping/macros.c
index 6bd3be434139a2..fcf21170ef135c 100644
--- a/clang/test/CoverageMapping/macros.c
+++ b/clang/test/CoverageMapping/macros.c
@@ -80,12 +80,14 @@ void func7(void) { // CHECK-NEXT: File 0, [[@LINE]]:18 -> 
[[@LINE+6]]:2 = #0
   int kk,ll;   // CHECK-NEXT: File 0, [[@LINE+1]]:7 -> [[@LINE+1]]:8 = #0
   if (k)   // CHECK-NEXT: Branch,File 0, [[@LINE]]:7 -> [[@LINE]]:8 = 
#1
 m(k);  // CHECK-NEXT: Gap,File 0, [[@LINE-1]]:9 -> [[@LINE]]:5 = #1
-  else // CHECK-NEXT: Expansion,File 0, [[@LINE-1]]:5 -> 
[[@LINE-1]]:6 = #0
+  else // CHECK-NEXT: Expansion,File 0, [[@LINE-1]]:5 -> 
[[@LINE-1]]:6 = #1
 l = m(l);  // CHECK-NEXT: Gap,File 0, [[@LINE-2]]:7 -> [[@LINE]]:5 = 
(#0 - #1)
 }  // CHECK-NEXT: File 0, [[@LINE-1]]:5 -> [[@LINE-1]]:10 = 
(#0 - #1)
// CHECK-NEXT: Expansion,File 0, [[@LINE-2]]:9 -> 
[[@LINE-2]]:10 = (#0 - #1)
-   // CHECK-NEXT: File 1, [[@LINE-9]]:14 -> [[@LINE-9]]:18 = #0
-   // CHECK-NEXT: File 2, [[@LINE-10]]:14 -> [[@LINE-10]]:15 = 
(#0 - #1)
+   // CHECK-NEXT: File 1, [[@LINE-9]]:14 -> [[@LINE-9]]:17 = #1
+   // CHECK-NEXT: File 1, [[@LINE-10]]:14 -> [[@LINE-10]]:18 = 
#0
+   // CHECK-NEXT: File 2, [[@LINE-11]]:14 -> [[@LINE-11]]:17 = 
(#0 - #1)
+   // CHECK-NEXT: File 2, [[@LINE-12]]:14 -> [[@LINE-12]]:15 = 
(#0 - #1)
 
 int main(int argc, const char *argv[]) {
   func();
diff --git a/clang/test/CoverageMapping/mcdc-scratch-space.c 
b/clang/test/CoverageMapping/mcdc-scratch-space.c
new file mode 100644
index 00..1b8735cd27445a
--- /dev/null
+++ b/clang/test/CoverageMapping/mcdc-scratch-space.c
@@ -0,0 +1,39 @@
+// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c99 -fcoverage-mcdc 
-fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping 
-emit-llvm-only %s | FileCheck %s
+
+// CHECK: builtin_macro0:
+int builtin_macro0(int a) {
+  // CHECK: Decision,File 0, [[@LINE+1]]:11 -> [[@LINE+2]]:15 = M:0, C:2
+  return (__LINE__ // CHECK: Branch,File 0, [[@LINE]]:11 -> [[@LINE]]:11 = 0, 
0 [1,2,0]
+  && a); //   CHECK: Branch,File 0, [[@LINE]