<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">The problem is that scope: can't be a DIFile. It must point to a DILocalScope (DISubprogram, DILexicalBlock).<br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Aug 24, 2018, at 3:07 PM, David Blaikie <<a href="mailto:dblaikie@gmail.com" class="">dblaikie@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Not sure I'm following - the example there looks fine (I might be failing to spot the abnormality) - inlinedAt should lead to another DILocation with another scope (& maybe inlinedAt) chain.<div class=""><br class=""></div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Fri, Aug 24, 2018 at 3:05 PM Adrian Prantl <<a href="mailto:aprantl@apple.com" class="">aprantl@apple.com</a>> wrote:<br class=""></div><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="">Unfortunately I don't have a reduced testcase yet, but basically what happens is that<div class=""><br class=""></div><div class="">!1 = !DISubprogram(..., file: !0)</div><div class="">!2 = !DISubprogram(..., file: !0)</div><div class="">LocA = !DILocation(line: 1, scope: DISubprogram !1, inlinedAt: !3)</div><div class="">LocB = !DILocation(line: 2, scope: DISubprogram !2, inlinedAt: !3)</div><div class=""><br class=""></div><div class="">and getMergedLocation(LocA, LocB) returns !DILocation(line: 0, scope: !0, inlinedAt: !3), which is invalid.</div><div class=""><br class=""></div><div class="">Lacking a better testcase, I guess we could easily add a unit test for that scenario.</div><div class=""><br class=""></div><div class=""></div></div><div style="word-wrap:break-word;line-break:after-white-space" class=""><div class="">-- adrian</div></div><div style="word-wrap:break-word;line-break:after-white-space" class=""><div class=""><br class=""><div class=""><br class=""><blockquote type="cite" class=""><div class="">On Aug 24, 2018, at 1:47 PM, David Blaikie <<a href="mailto:dblaikie@gmail.com" target="_blank" class="">dblaikie@gmail.com</a>> wrote:</div><br class="m_6822999404213359704Apple-interchange-newline"><div class=""><div dir="ltr" class="">No worries - always appreciate the follow-up! Happy to help if it turns out there's anything I can.</div><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Fri, Aug 24, 2018 at 1:17 PM Adrian Prantl <<a href="mailto:aprantl@apple.com" target="_blank" class="">aprantl@apple.com</a>> wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Yeah, the Verifier doesn't verify that the scope of a DILocation is a DILocalScope. I'll start there!<br class="">
<br class="">
sorry for the noise.<br class="">
-- adrian<br class="">
<br class="">
> On Aug 24, 2018, at 1:12 PM, Adrian Prantl <<a href="mailto:aprantl@apple.com" target="_blank" class="">aprantl@apple.com</a>> wrote:<br class="">
> <br class="">
> There'a also a >50% chance that this just exposed a bug in the Swift frontend; all reproducers I've got so far are Swift code.<br class="">
> <br class="">
> -- adrian<br class="">
> <br class="">
>> On Aug 24, 2018, at 1:10 PM, Adrian Prantl <<a href="mailto:aprantl@apple.com" target="_blank" class="">aprantl@apple.com</a>> wrote:<br class="">
>> <br class="">
>> I think this commit may be to cause for some failures we are seeing on our internal bots.<br class="">
>> They are hitting an assertion in llvm::DILocation::getMergedLocation(llvm::DILocation const*, llvm::DILocation const*) at <br class="">
>> DIScope *S = LocA->getScope()<br class="">
>> because the scope of LocA is a DIFile (which is not a valid DILocalScope).<br class="">
>> <br class="">
>> I'll post an update once I know more.<br class="">
>> <br class="">
>> -- adrian<br class="">
>> <br class="">
>>> On Aug 23, 2018, at 3:35 PM, David Blaikie via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank" class="">llvm-commits@lists.llvm.org</a>> wrote:<br class="">
>>> <br class="">
>>> Author: dblaikie<br class="">
>>> Date: Thu Aug 23 15:35:58 2018<br class="">
>>> New Revision: 340583<br class="">
>>> <br class="">
>>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=340583&view=rev" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=340583&view=rev</a><br class="">
>>> Log:<br class="">
>>> DebugInfo: Improve debug location merging<br class="">
>>> <br class="">
>>> Fix a set of related bugs:<br class="">
>>> <br class="">
>>> * Considering two locations as equivalent when their lines are the same<br class="">
>>> but their scopes are different causes erroneous debug info that<br class="">
>>> attributes a commoned call to be attributed to one of the two calls it<br class="">
>>> was commoned from.<br class="">
>>> <br class="">
>>> * The previous code to compute a new location's scope was inaccurate and<br class="">
>>> would use the inlinedAt that was the /parent/ of the inlinedAt that is<br class="">
>>> the nearest common one, and also used that parent scope instead of the<br class="">
>>> nearest common scope.<br class="">
>>> <br class="">
>>> * Not generating new locations generally seemed like a lower quality<br class="">
>>> choice<br class="">
>>> <br class="">
>>> There was some risk that generating more new locations could hurt object<br class="">
>>> size by making more fine grained line table entries, but it looks like<br class="">
>>> that was offset by the decrease in line table (& address & ranges) size<br class="">
>>> caused by more accurately computing the scope - which likely lead to<br class="">
>>> fewer range entries (more contiguous ranges) & reduced size that way.<br class="">
>>> <br class="">
>>> All up with these changes I saw minor reductions (-1.21%, -1.77%) in<br class="">
>>> .rela.debug_ranges and .rela.debug_addr (in a fission, compressed debug<br class="">
>>> info build) as well as other minor size changes (generally reductinos)<br class="">
>>> across the board (-1.32% debug_info.dwo, -1.28% debug_loc.dwo). Measured<br class="">
>>> in an optimized (-O2) build of the clang binary.<br class="">
>>> <br class="">
>>> If you are investigating a size regression in an optimized debug builds,<br class="">
>>> this is certainly a patch to look into - and I'd be happy to look into<br class="">
>>> any major regressions found & see what we can do to address them.<br class="">
>>> <br class="">
>>> Added:<br class="">
>>>  llvm/trunk/test/DebugInfo/X86/merge_inlined_loc.ll<br class="">
>>> Modified:<br class="">
>>>  llvm/trunk/include/llvm/IR/DebugInfoMetadata.h<br class="">
>>>  llvm/trunk/lib/IR/DebugInfo.cpp<br class="">
>>>  llvm/trunk/lib/IR/DebugInfoMetadata.cpp<br class="">
>>>  llvm/trunk/test/DebugInfo/COFF/local-variables.ll<br class="">
>>> <br class="">
>>> Modified: llvm/trunk/include/llvm/IR/DebugInfoMetadata.h<br class="">
>>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DebugInfoMetadata.h?rev=340583&r1=340582&r2=340583&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DebugInfoMetadata.h?rev=340583&r1=340582&r2=340583&view=diff</a><br class="">
>>> ==============================================================================<br class="">
>>> --- llvm/trunk/include/llvm/IR/DebugInfoMetadata.h (original)<br class="">
>>> +++ llvm/trunk/include/llvm/IR/DebugInfoMetadata.h Thu Aug 23 15:35:58 2018<br class="">
>>> @@ -1479,19 +1479,6 @@ public:<br class="">
>>>   return getScope();<br class="">
>>> }<br class="">
>>> <br class="">
>>> -  /// Check whether this can be discriminated from another location.<br class="">
>>> -  ///<br class="">
>>> -  /// Check \c this can be discriminated from \c RHS in a linetable entry.<br class="">
>>> -  /// Scope and inlined-at chains are not recorded in the linetable, so they<br class="">
>>> -  /// cannot be used to distinguish basic blocks.<br class="">
>>> -  bool canDiscriminate(const DILocation &RHS) const {<br class="">
>>> -    return getLine() != RHS.getLine() ||<br class="">
>>> -           getColumn() != RHS.getColumn() ||<br class="">
>>> -           getDiscriminator() != RHS.getDiscriminator() ||<br class="">
>>> -           getFilename() != RHS.getFilename() ||<br class="">
>>> -           getDirectory() != RHS.getDirectory();<br class="">
>>> -  }<br class="">
>>> -<br class="">
>>> /// Get the DWARF discriminator.<br class="">
>>> ///<br class="">
>>> /// DWARF discriminators distinguish identical file locations between<br class="">
>>> @@ -1539,8 +1526,6 @@ public:<br class="">
>>> /// discriminator.<br class="">
>>> inline const DILocation *cloneWithDuplicationFactor(unsigned DF) const;<br class="">
>>> <br class="">
>>> -  enum { NoGeneratedLocation = false, WithGeneratedLocation = true };<br class="">
>>> -<br class="">
>>> /// When two instructions are combined into a single instruction we also<br class="">
>>> /// need to combine the original locations into a single location.<br class="">
>>> ///<br class="">
>>> @@ -1555,9 +1540,8 @@ public:<br class="">
>>> ///<br class="">
>>> /// \p GenerateLocation: Whether the merged location can be generated when<br class="">
>>> /// \p LocA and \p LocB differ.<br class="">
>>> -  static const DILocation *<br class="">
>>> -  getMergedLocation(const DILocation *LocA, const DILocation *LocB,<br class="">
>>> -                    bool GenerateLocation = NoGeneratedLocation);<br class="">
>>> +  static const DILocation *getMergedLocation(const DILocation *LocA,<br class="">
>>> +                                             const DILocation *LocB);<br class="">
>>> <br class="">
>>> /// Returns the base discriminator for a given encoded discriminator \p D.<br class="">
>>> static unsigned getBaseDiscriminatorFromDiscriminator(unsigned D) {<br class="">
>>> <br class="">
>>> Modified: llvm/trunk/lib/IR/DebugInfo.cpp<br class="">
>>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=340583&r1=340582&r2=340583&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=340583&r1=340582&r2=340583&view=diff</a><br class="">
>>> ==============================================================================<br class="">
>>> --- llvm/trunk/lib/IR/DebugInfo.cpp (original)<br class="">
>>> +++ llvm/trunk/lib/IR/DebugInfo.cpp Thu Aug 23 15:35:58 2018<br class="">
>>> @@ -690,8 +690,7 @@ unsigned llvm::getDebugMetadataVersionFr<br class="">
>>> <br class="">
>>> void Instruction::applyMergedLocation(const DILocation *LocA,<br class="">
>>>                                     const DILocation *LocB) {<br class="">
>>> -  setDebugLoc(DILocation::getMergedLocation(LocA, LocB,<br class="">
>>> -                                            DILocation::WithGeneratedLocation));<br class="">
>>> +  setDebugLoc(DILocation::getMergedLocation(LocA, LocB));<br class="">
>>> }<br class="">
>>> <br class="">
>>> //===----------------------------------------------------------------------===//<br class="">
>>> <br class="">
>>> Modified: llvm/trunk/lib/IR/DebugInfoMetadata.cpp<br class="">
>>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfoMetadata.cpp?rev=340583&r1=340582&r2=340583&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfoMetadata.cpp?rev=340583&r1=340582&r2=340583&view=diff</a><br class="">
>>> ==============================================================================<br class="">
>>> --- llvm/trunk/lib/IR/DebugInfoMetadata.cpp (original)<br class="">
>>> +++ llvm/trunk/lib/IR/DebugInfoMetadata.cpp Thu Aug 23 15:35:58 2018<br class="">
>>> @@ -14,7 +14,7 @@<br class="">
>>> #include "llvm/IR/DebugInfoMetadata.h"<br class="">
>>> #include "LLVMContextImpl.h"<br class="">
>>> #include "MetadataImpl.h"<br class="">
>>> -#include "llvm/ADT/SmallPtrSet.h"<br class="">
>>> +#include "llvm/ADT/SmallSet.h"<br class="">
>>> #include "llvm/ADT/StringSwitch.h"<br class="">
>>> #include "llvm/IR/DIBuilder.h"<br class="">
>>> #include "llvm/IR/Function.h"<br class="">
>>> @@ -69,28 +69,40 @@ DILocation *DILocation::getImpl(LLVMCont<br class="">
>>> }<br class="">
>>> <br class="">
>>> const DILocation *DILocation::getMergedLocation(const DILocation *LocA,<br class="">
>>> -                                                const DILocation *LocB,<br class="">
>>> -                                                bool GenerateLocation) {<br class="">
>>> +                                                const DILocation *LocB) {<br class="">
>>> if (!LocA || !LocB)<br class="">
>>>   return nullptr;<br class="">
>>> <br class="">
>>> -  if (LocA == LocB || !LocA->canDiscriminate(*LocB))<br class="">
>>> +  if (LocA == LocB)<br class="">
>>>   return LocA;<br class="">
>>> <br class="">
>>> -  if (!GenerateLocation)<br class="">
>>> -    return nullptr;<br class="">
>>> -<br class="">
>>> SmallPtrSet<DILocation *, 5> InlinedLocationsA;<br class="">
>>> for (DILocation *L = LocA->getInlinedAt(); L; L = L->getInlinedAt())<br class="">
>>>   InlinedLocationsA.insert(L);<br class="">
>>> +  SmallSet<std::pair<DIScope *, DILocation *>, 5> Locations;<br class="">
>>> +  DIScope *S = LocA->getScope();<br class="">
>>> +  DILocation *L = LocA->getInlinedAt();<br class="">
>>> +  while (S) {<br class="">
>>> +    Locations.insert(std::make_pair(S, L));<br class="">
>>> +    S = S->getScope().resolve();<br class="">
>>> +    if (!S && L) {<br class="">
>>> +      S = L->getScope();<br class="">
>>> +      L = L->getInlinedAt();<br class="">
>>> +    }<br class="">
>>> +  }<br class="">
>>> const DILocation *Result = LocB;<br class="">
>>> -  for (DILocation *L = LocB->getInlinedAt(); L; L = L->getInlinedAt()) {<br class="">
>>> -    Result = L;<br class="">
>>> -    if (InlinedLocationsA.count(L))<br class="">
>>> +  S = LocB->getScope();<br class="">
>>> +  L = LocB->getInlinedAt();<br class="">
>>> +  while (S) {<br class="">
>>> +    if (Locations.count(std::make_pair(S, L)))<br class="">
>>>     break;<br class="">
>>> +    S = S->getScope().resolve();<br class="">
>>> +    if (!S && L) {<br class="">
>>> +      S = L->getScope();<br class="">
>>> +      L = L->getInlinedAt();<br class="">
>>> +    }<br class="">
>>> }<br class="">
>>> -  return DILocation::get(Result->getContext(), 0, 0, Result->getScope(),<br class="">
>>> -                         Result->getInlinedAt());<br class="">
>>> +  return DILocation::get(Result->getContext(), 0, 0, S, L);<br class="">
>>> }<br class="">
>>> <br class="">
>>> DINode::DIFlags DINode::getFlag(StringRef Flag) {<br class="">
>>> <br class="">
>>> Modified: llvm/trunk/test/DebugInfo/COFF/local-variables.ll<br class="">
>>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/local-variables.ll?rev=340583&r1=340582&r2=340583&view=diff" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/local-variables.ll?rev=340583&r1=340582&r2=340583&view=diff</a><br class="">
>>> ==============================================================================<br class="">
>>> --- llvm/trunk/test/DebugInfo/COFF/local-variables.ll (original)<br class="">
>>> +++ llvm/trunk/test/DebugInfo/COFF/local-variables.ll Thu Aug 23 15:35:58 2018<br class="">
>>> @@ -60,7 +60,7 @@<br class="">
>>> ; ASM:         leaq    36(%rsp), %rcx<br class="">
>>> ; ASM: [[else_end:\.Ltmp.*]]:<br class="">
>>> ; ASM: .LBB0_3:                                # %if.end<br class="">
>>> -; ASM:         .cv_loc 0 1 17 1                # t.cpp:17:1<br class="">
>>> +; ASM:         .cv_loc 0 1 0 0                # t.cpp:0:0<br class="">
>>> ; ASM:         callq   capture<br class="">
>>> ; ASM:         nop<br class="">
>>> ; ASM:         addq    $56, %rsp<br class="">
>>> <br class="">
>>> Added: llvm/trunk/test/DebugInfo/X86/merge_inlined_loc.ll<br class="">
>>> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/merge_inlined_loc.ll?rev=340583&view=auto" rel="noreferrer" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/merge_inlined_loc.ll?rev=340583&view=auto</a><br class="">
>>> ==============================================================================<br class="">
>>> --- llvm/trunk/test/DebugInfo/X86/merge_inlined_loc.ll (added)<br class="">
>>> +++ llvm/trunk/test/DebugInfo/X86/merge_inlined_loc.ll Thu Aug 23 15:35:58 2018<br class="">
>>> @@ -0,0 +1,100 @@<br class="">
>>> +; RUN: llc %s -mtriple=x86_64-unknown-unknown -o - | FileCheck %s<br class="">
>>> +<br class="">
>>> +; Generated with "clang -g -c -emit-llvm -S -O3"<br class="">
>>> +<br class="">
>>> +; This will test several features of merging debug locations. Importantly,<br class="">
>>> +; locations with the same source line but different scopes should be merged to<br class="">
>>> +; a line zero location at the nearest common scope and inlining. The location<br class="">
>>> +; of the single call to "common" (the two calls are collapsed together by<br class="">
>>> +; BranchFolding) should be attributed to line zero inside the wrapper2 inlined<br class="">
>>> +; scope within f1.<br class="">
>>> +<br class="">
>>> +; void common();<br class="">
>>> +; inline void wrapper() { common(); }<br class="">
>>> +; extern bool b;<br class="">
>>> +; void sink();<br class="">
>>> +; inline void wrapper2() {<br class="">
>>> +;   if (b) {<br class="">
>>> +;     sink();<br class="">
>>> +;     wrapper();<br class="">
>>> +;   } else<br class="">
>>> +;     wrapper();<br class="">
>>> +; }<br class="">
>>> +; void f1() { wrapper2(); }<br class="">
>>> +<br class="">
>>> +; Ensure there is only one inlined_subroutine (for wrapper2, none for wrapper)<br class="">
>>> +; & that its address range includes the call to 'common'.<br class="">
>>> +<br class="">
>>> +; CHECK: jmp _Z6commonv<br class="">
>>> +; CHECK-NEXT: [[LABEL:.*]]:<br class="">
>>> +<br class="">
>>> +; CHECK: .section .debug_info<br class="">
>>> +; CHECK: DW_TAG_subprogram<br class="">
>>> +; CHECK: DW_TAG_subprogram<br class="">
>>> +; CHECK-NOT: {{DW_TAG\|End Of Children}}<br class="">
>>> +; CHECK:   DW_TAG_inlined_subroutine<br class="">
>>> +; CHECK-NOT: {{DW_TAG\|End Of Children}}<br class="">
>>> +; CHECK:     [[LABEL]]-{{.*}} DW_AT_high_pc<br class="">
>>> +; CHECK-NOT: DW_TAG<br class="">
>>> +<br class="">
>>> +<br class="">
>>> +<br class="">
>>> +@b = external dso_local local_unnamed_addr global i8, align 1<br class="">
>>> +<br class="">
>>> +; Function Attrs: uwtable<br class="">
>>> +define dso_local void @_Z2f1v() local_unnamed_addr !dbg !7 {<br class="">
>>> +entry:<br class="">
>>> +  %0 = load i8, i8* @b, align 1, !dbg !10, !tbaa !14, !range !18<br class="">
>>> +  %tobool.i = icmp eq i8 %0, 0, !dbg !10<br class="">
>>> +  br i1 %tobool.i, label %if.else.i, label %if.then.i, !dbg !19<br class="">
>>> +<br class="">
>>> +if.then.i:                                        ; preds = %entry<br class="">
>>> +  tail call void @_Z4sinkv(), !dbg !20<br class="">
>>> +  tail call void @_Z6commonv(), !dbg !22<br class="">
>>> +  br label %_Z8wrapper2v.exit, !dbg !25<br class="">
>>> +<br class="">
>>> +if.else.i:                                        ; preds = %entry<br class="">
>>> +  tail call void @_Z6commonv(), !dbg !26<br class="">
>>> +  br label %_Z8wrapper2v.exit<br class="">
>>> +<br class="">
>>> +_Z8wrapper2v.exit:                                ; preds = %if.then.i, %if.else.i<br class="">
>>> +  ret void, !dbg !28<br class="">
>>> +}<br class="">
>>> +<br class="">
>>> +declare dso_local void @_Z4sinkv() local_unnamed_addr<br class="">
>>> +<br class="">
>>> +declare dso_local void @_Z6commonv() local_unnamed_addr<br class="">
>>> +<br class="">
>>> +!<a href="http://llvm.dbg.cu/" rel="noreferrer" target="_blank" class="">llvm.dbg.cu</a> = !{!0}<br class="">
>>> +!llvm.module.flags = !{!3, !4, !5}<br class="">
>>> +!llvm.ident = !{!6}<br class="">
>>> +<br class="">
>>> +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 8.0.0 (trunk 340559) (llvm/trunk 340572)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, nameTableKind: None)<br class="">
>>> +!1 = !DIFile(filename: "merge_loc.cpp", directory: "/usr/local/google/home/blaikie/dev/scratch")<br class="">
>>> +!2 = !{}<br class="">
>>> +!3 = !{i32 2, !"Dwarf Version", i32 4}<br class="">
>>> +!4 = !{i32 2, !"Debug Info Version", i32 3}<br class="">
>>> +!5 = !{i32 1, !"wchar_size", i32 4}<br class="">
>>> +!6 = !{!"clang version 8.0.0 (trunk 340559) (llvm/trunk 340572)"}<br class="">
>>> +!7 = distinct !DISubprogram(name: "f1", linkageName: "_Z2f1v", scope: !1, file: !1, line: 12, type: !8, isLocal: false, isDefinition: true, scopeLine: 12, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)<br class="">
>>> +!8 = !DISubroutineType(types: !9)<br class="">
>>> +!9 = !{null}<br class="">
>>> +!10 = !DILocation(line: 6, column: 7, scope: !11, inlinedAt: !13)<br class="">
>>> +!11 = distinct !DILexicalBlock(scope: !12, file: !1, line: 6, column: 7)<br class="">
>>> +!12 = distinct !DISubprogram(name: "wrapper2", linkageName: "_Z8wrapper2v", scope: !1, file: !1, line: 5, type: !8, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)<br class="">
>>> +!13 = distinct !DILocation(line: 13, column: 3, scope: !7)<br class="">
>>> +!14 = !{!15, !15, i64 0}<br class="">
>>> +!15 = !{!"bool", !16, i64 0}<br class="">
>>> +!16 = !{!"omnipotent char", !17, i64 0}<br class="">
>>> +!17 = !{!"Simple C++ TBAA"}<br class="">
>>> +!18 = !{i8 0, i8 2}<br class="">
>>> +!19 = !DILocation(line: 6, column: 7, scope: !12, inlinedAt: !13)<br class="">
>>> +!20 = !DILocation(line: 7, column: 5, scope: !21, inlinedAt: !13)<br class="">
>>> +!21 = distinct !DILexicalBlock(scope: !11, file: !1, line: 6, column: 10)<br class="">
>>> +!22 = !DILocation(line: 2, column: 25, scope: !23, inlinedAt: !24)<br class="">
>>> +!23 = distinct !DISubprogram(name: "wrapper", linkageName: "_Z7wrapperv", scope: !1, file: !1, line: 2, type: !8, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: true, unit: !0, retainedNodes: !2)<br class="">
>>> +!24 = distinct !DILocation(line: 8, column: 5, scope: !21, inlinedAt: !13)<br class="">
>>> +!25 = !DILocation(line: 9, column: 3, scope: !21, inlinedAt: !13)<br class="">
>>> +!26 = !DILocation(line: 2, column: 25, scope: !23, inlinedAt: !27)<br class="">
>>> +!27 = distinct !DILocation(line: 10, column: 5, scope: !11, inlinedAt: !13)<br class="">
>>> +!28 = !DILocation(line: 14, column: 1, scope: !7)<br class="">
>>> <br class="">
>>> <br class="">
>>> _______________________________________________<br class="">
>>> llvm-commits mailing list<br class="">
>>> <a href="mailto:llvm-commits@lists.llvm.org" target="_blank" class="">llvm-commits@lists.llvm.org</a><br class="">
>>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br class="">
>> <br class="">
> <br class="">
<br class="">
</blockquote></div>
</div></blockquote></div><br class=""></div></div></blockquote></div>
</div></blockquote></div><br class=""></body></html>