From 9fdb2d1eb9d4378b0e3ae96c3568e1795ffab258 Mon Sep 17 00:00:00 2001 From: Eugene Rozenfeld Date: Thu, 12 Apr 2018 18:00:35 -0700 Subject: [PATCH] Insert int3 after non-returning calls at the end of basic blocks. This is a follow-up to #17501 that fixed #17398. gc pointer reporting in fully-interruptible mode: the latter assumed that register gc pointer liveness doesn't change across calls while #6103 introduced codegen where it wasn't true. doesn't change across calls. This change inserts int3 after non-returning calls at the end of basic blocks so that gc pointer liveness doesn't change across calls. This is additional insurance in case any other place in the runtime is dependent on that contract. --- src/jit/codegenlinear.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/jit/codegenlinear.cpp b/src/jit/codegenlinear.cpp index 6faaf612bec2..26b52c20d249 100644 --- a/src/jit/codegenlinear.cpp +++ b/src/jit/codegenlinear.cpp @@ -602,6 +602,22 @@ void CodeGen::genCodeForBBlist() { instGen(INS_BREAKPOINT); // This should never get executed } + // Do likewise for blocks that end in DOES_NOT_RETURN calls + // that were not caught by the above rules. This ensures that + // gc register liveness doesn't change across call instructions + // in fully-interruptible mode. + else + { + GenTree* call = block->lastNode(); + + if ((call != nullptr) && (call->gtOper == GT_CALL)) + { + if ((call->gtCall.gtCallMoreFlags & GTF_CALL_M_DOES_NOT_RETURN) != 0) + { + instGen(INS_BREAKPOINT); // This should never get executed + } + } + } break;