<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">+ Adrian and Davide, since they work in this area.<div class=""><br class=""></div><div class="">Hi Raj,<div class=""><div class=""><br class=""></div><div class=""><div><blockquote type="cite" class=""><div class="">On Jan 15, 2018, at 4:48 PM, Raj Barik via swift-dev <<a href="mailto:swift-dev@swift.org" class="">swift-dev@swift.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Thanks Mark. You are right, the following assertion fails<div class=""><br class=""></div><div class=""><div class="">require(!DS || DS->getParentFunction() == I->getFunction(),</div><div class=""> "debug scope of instruction belongs to a different function");</div></div><div class=""><br class=""></div><div class="">I am not sure if we need such a check.</div></div></div></blockquote><div><br class=""></div><div>This check exists to ensure that the debug info generated for a program is helpful. For example, a function with the wrong debug scope attached might make for confusing backtraces.</div><div><br class=""></div><div>vedant</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""> </div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Mon, Jan 15, 2018 at 4:16 PM, Mark Lacey <span dir="ltr" class=""><<a href="mailto:mark.lacey@apple.com" target="_blank" class="">mark.lacey@apple.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space" class=""><br class=""><div class=""><span class=""><br class=""><blockquote type="cite" class=""><div class="">On Jan 15, 2018, at 12:54 PM, Raj Barik <<a href="mailto:rkbarik@gmail.com" target="_blank" class="">rkbarik@gmail.com</a>> wrote:</div><br class="m_3833984575572660261Apple-interchange-newline"><div class=""><div dir="ltr" class="">Mark,<div class=""><br class=""></div><div class="">Thanks a lot for quick reply.</div><div class=""> </div><div class="">Is there any reason this interface in SILInstruction should be private?</div><div class="">void setDebugScope(SILBuilder &B, const SILDebugScope *DS);<br class=""></div><div class=""><br class=""></div><div class="">In my case, I am splicing the old F into the new function NF. While splicing retains the debug scope, the new instruction (InitRef) that I am adding to NF is being created in some random scope (not F) even though I explicitly make Builder's debug scope point to F's. </div></div></div></blockquote><div class=""><br class=""></div></span><div class="">The assert you originally hit appears to indicate that the parentFunction of the debug scope for an instruction should be the same as the function the instruction is in. I am not very familiar with the requirements of our debug information and debug scopes, but this seems like a reasonable expectation.</div><div class=""><br class=""></div><div class="">I suggested looking at SILCloner because it is the primary way by which we clone functions, and clearly has to deal with debug scopes when it does so.</div><div class=""><br class=""></div><div class="">I’m not sure how much more help I can be on this matter, but perhaps someone more knowledgable can chime in.</div><span class="HOEnZb"><font color="#888888" class=""><div class=""><br class=""></div><div class="">Mark</div></font></span><div class=""><div class="h5"><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><br class=""></div><div class="">Best,</div><div class="">Raj</div><div class=""><br class=""></div><div class=""><br class=""></div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Mon, Jan 15, 2018 at 9:52 AM, Mark Lacey <span dir="ltr" class=""><<a href="mailto:mark.lacey@apple.com" target="_blank" class="">mark.lacey@apple.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I’d suggest looking at SILCloner.h as well as ScopeCloner in SILBasicBlock.cpp to see how they are dealing with debug scopes.<br class="">
<br class="">
Mark<br class="">
<div class=""><div class="m_3833984575572660261h5"><br class="">
> On Jan 15, 2018, at 9:24 AM, Raj Barik via swift-dev <<a href="mailto:swift-dev@swift.org" target="_blank" class="">swift-dev@swift.org</a>> wrote:<br class="">
><br class="">
> Hi,<br class="">
><br class="">
> I am running into a debug scope SIL Verifier error when creating a new function (NF) from an existing one (F). Can someone point me where I am going wrong?<br class="">
><br class="">
> NF = M.createFunction(...., F->getDebugScope());<br class="">
> SILBasicBlock *NFBody = NF->createBasicBlock();<br class="">
> SILBuilder NFBuilder(NFBody);<br class="">
> SILOpenedArchetypesTracker OpenedArchetypesTrackerNF(NF);<br class="">
> NFBuilder.setOpenedArchetypesT<wbr class="">racker(&OpenedArchetypesTracke<wbr class="">rNF);<br class="">
> NFBuilder.setCurrentDebugScope<wbr class="">(NFBody->getParent()-><wbr class="">getDebugScope());<br class="">
> ...<br class="">
> for (auto &param : params) { /* Assume all are generic types */<br class="">
> auto GenericsSILType = ....<br class="">
> auto NewArg = NFBody->createFunctionArgument<wbr class="">(GenericSILType);<br class="">
> auto Conformances = Mod->lookupConformance(...);<br class="">
> auto *InitRef = NFBuilder.createInitExistentia<wbr class="">lRef( Loc, ArgDesc.Arg->getType(), NewArg->getType().getSwiftRVal<wbr class="">ueType()->getCanonicalType(), NewArg, Conformances);<br class="">
> ...<br class="">
> }<br class="">
><br class="">
> The InitRef instruction created above runs into SIL verifier error:<br class="">
><br class="">
> SIL verification failed: debug scope of instruction belongs to a different function: !DS || DS->getParentFunction() == I->getFunction()<br class="">
> Verifying instruction:<br class="">
> %0 = argument of bb0 : $τ_0_0 // user: %1<br class="">
> -> %1 = init_existential_ref %0 : $τ_0_0 : $τ_0_0, $SomeProtocol // user: %2<br class="">
><br class="">
> The SIL looks correct to me though.<br class="">
><br class="">
> --Raj<br class="">
</div></div>> ______________________________<wbr class="">_________________<br class="">
> swift-dev mailing list<br class="">
> <a href="mailto:swift-dev@swift.org" target="_blank" class="">swift-dev@swift.org</a><br class="">
> <a href="https://lists.swift.org/mailman/listinfo/swift-dev" rel="noreferrer" target="_blank" class="">https://lists.swift.org/mailma<wbr class="">n/listinfo/swift-dev</a><br class="">
<br class="">
</blockquote></div><br class=""></div>
</div></blockquote></div></div></div><br class=""></div></blockquote></div><br class=""></div>
_______________________________________________<br class="">swift-dev mailing list<br class=""><a href="mailto:swift-dev@swift.org" class="">swift-dev@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-dev<br class=""></div></blockquote></div><br class=""></div></div></div></body></html>