[llvm] r340583 - DebugInfo: Improve debug location merging

Reid Kleckner via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 28 16:18:17 PDT 2018


This should all be solved by r340878, and I'm going to commit an NFC
cleanup after that to simplify the code soon.

On Tue, Aug 28, 2018 at 11:37 AM David Blaikie <dblaikie at gmail.com> wrote:

>
>
> On Tue, Aug 28, 2018 at 10:37 AM Reid Kleckner <rnk at google.com> wrote:
>
>> CReduce produced:
>>
>> typedef long a;
>> void __declspec(noreturn) b(char *, int, char *, a, a);
>> class c {
>> public:
>>   char &operator[](long d) {
>>     long e = 0, f(g);
>>     if (f)
>>       b("", 0, "", e, f);
>>     return h[d];
>>   }
>>   char *h;
>>   long g;
>> };
>> class i : public c {
>> public:
>>   i(long);
>> };
>> class j : i {
>> public:
>>   j(long d) : i(d) { (*this)[0] = '\0'; }
>>   void k() { (*this)[0]; }
>> };
>> void l() {
>>   j m(8);
>>   m.k();
>> }
>> void n() {}
>>
>> Compile with:
>> clang --target=i686-windows-msvc t.cpp -g -gcodeview -O2 -c
>>
>> We could revert, but ultimately this is a pre-existing issue in the
>> .cv_loc implementation in MC. I'll try to fix that today.
>>
>
> Ah, thanks a bunch! Happy to help if there's anything that comes up/I'd be
> useful for.
>
> - Dave
>
>
>>
>> On Tue, Aug 28, 2018 at 10:27 AM David Blaikie <dblaikie at gmail.com>
>> wrote:
>>
>>> Yeah, if anyone's seeing failures - I'm all ears for repro steps.
>>>
>>> On Mon, Aug 27, 2018 at 10:59 PM <douglas.yung at sony.com> wrote:
>>>
>>>> Is a repro still needed for this issue? Several of our internal tests
>>>> have also hit an assertion failure that started with this commit.
>>>>
>>>>
>>>>
>>>> Douglas Yung
>>>>
>>>>
>>>>
>>>> *From:* llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] *On
>>>> Behalf Of *David Blaikie via llvm-commits
>>>> *Sent:* Monday, August 27, 2018 18:43
>>>> *To:* Reid Kleckner
>>>> *Cc:* llvm-commits
>>>> *Subject:* Re: [llvm] r340583 - DebugInfo: Improve debug location
>>>> merging
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Mon, Aug 27, 2018 at 6:38 PM Reid Kleckner <rnk at google.com> wrote:
>>>>
>>>> The root of the problem is that we emit assembly like this:
>>>>
>>>>
>>>>
>>>> calll "?b@@YAXPADH0JJ at Z"
>>>>
>>>> Ltmp10:
>>>>
>>>> .cv_loc 2 1 8 0                 # t.cpp:8:0
>>>>
>>>> .cv_fpo_endproc
>>>>
>>>> Lfunc_end0:
>>>>
>>>>                                         # -- End function
>>>>
>>>> .def "?n@@YAXXZ";
>>>>
>>>> .scl 2;
>>>>
>>>> .type 32;
>>>>
>>>> .endef
>>>>
>>>> .globl "?n@@YAXXZ"             # -- Begin function ?n@@YAXXZ
>>>>
>>>> .p2align 4, 0x90
>>>>
>>>> "?n@@YAXXZ":                            # @"?n@@YAXXZ"
>>>>
>>>> Lfunc_begin1:
>>>>
>>>> .cv_func_id 5
>>>>
>>>> .cv_fpo_proc "?n@@YAXXZ" 0
>>>>
>>>> # %bb.0:                                # %entry
>>>>
>>>> .cv_loc 5 1 27 0                # t.cpp:27:0
>>>>
>>>> retl
>>>>
>>>>
>>>>
>>>> We are asserting that the label generated by .cv_loc 2 1 8 0
>>>> (t.cpp:8:0) comes before the Lfunc_end0 label. In the context of emitting
>>>> codeview, that makes sense, we are emitting deltas, and they should all be
>>>> positive.
>>>>
>>>>
>>>> What did the assembly look like previously? the .cv_loc 2 1 8 0 must've
>>>> been attached to some instruction, right? But an instruction that ended up
>>>> optimized away too late? (after the loc directive had been generated)
>>>>
>>>>
>>>> The thing is that the .cv_loc directives bind to the *next* instruction
>>>> emitted, and in this case, ffunction-sections is off, so we bind to the
>>>> 'retl' instruction in the next function, and we have a negative delta, so
>>>> we assert.
>>>>
>>>>
>>>>
>>>> DWARF locations are similarly affected, but there's no real problem
>>>> there, since they just generate one huge line table per section IIRC.
>>>>
>>>>
>>>>
>>>> Does anyone know why we wait until we emit an instruction to insert
>>>> labels? Why don't we do it right at the point of the directive? For
>>>> .cv_loc, we just copied the behavior from .loc, which I can't explain.
>>>>
>>>>
>>>>
>>>> Not sure, to be honest.
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Mon, Aug 27, 2018 at 6:06 PM Reid Kleckner <rnk at google.com> wrote:
>>>>
>>>> I got the crash files and am running a reduction.
>>>>
>>>>
>>>>
>>>> What's happening is that this file has a function with several CHECKs,
>>>> and their failure cases get commoned together. We're using this new merged
>>>> source location, and something goes wrong.
>>>>
>>>>
>>>>
>>>> On Mon, Aug 27, 2018 at 5:18 PM Vitaly Buka <vitalybuka at google.com>
>>>> wrote:
>>>>
>>>> I can't reproduce on Linux.
>>>>
>>>> +Reid Kleckner <rnk at google.com>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Mon, Aug 27, 2018 at 5:12 PM David Blaikie <dblaikie at gmail.com>
>>>> wrote:
>>>>
>>>> Yeah, I'm totally open to some ideas on investigating that - can you
>>>> reproduce this? Does it reproduce not on windows? I'd love some help!
>>>>
>>>>
>>>>
>>>> On Mon, Aug 27, 2018 at 5:09 PM Vitaly Buka <vitalybuka at google.com>
>>>> wrote:
>>>>
>>>> This revision breaks windows bot
>>>>
>>>>
>>>> http://lab.llvm.org:8011/builders/sanitizer-windows/builds/33862/steps/run%20check-sanitizer/logs/stdio
>>>>
>>>>
>>>>
>>>> FAILED: projects/compiler-rt/lib/sanitizer_common/tests/SANITIZER_TEST_OBJECTS.sanitizer_stacktrace_printer_test.cc.i386.o
>>>>
>>>> cmd.exe /C "cd /D C:\b\slave\sanitizer-windows\build\projects\compiler-rt\lib\sanitizer_common\tests && C:\b\slave\sanitizer-windows\build\.\bin\clang.exe -DWIN32 -D_WINDOWS -Wno-unknown-warning-option -fms-compatibility-version=19.00.24215.1 -D_HAS_EXCEPTIONS=0 -Wno-undefined-inline -DGTEST_NO_LLVM_RAW_OSTREAM=1 -DGTEST_HAS_RTTI=0 -IC:/b/slave/sanitizer-windows/llvm/utils/unittest/googletest/include -IC:/b/slave/sanitizer-windows/llvm/utils/unittest/googletest -DGTEST_HAS_SEH=0 -Wno-deprecated-declarations -IC:/b/slave/sanitizer-windows/llvm/projects/compiler-rt/include -IC:/b/slave/sanitizer-windows/llvm/projects/compiler-rt/lib -IC:/b/slave/sanitizer-windows/llvm/projects/compiler-rt/lib/sanitizer_common -fno-rtti -O2 -Werror=sign-compare -Wno-non-virtual-dtor -Wno-gnu-zero-variadic-macro-arguments -fno-exceptions -DGTEST_HAS_SEH=0 -gline-tables-only -gcodeview -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -c -o SANITIZER_TEST_OBJECTS.sanitizer_stacktrace_printer_test.cc.i386.o C:/b/slave/sanitizer-windows/llvm/projects/compiler-rt/lib/sanitizer_common/tests/sanitizer_stacktrace_printer_test.cc"
>>>>
>>>> Assertion failed: Result >= 0 && "negative label difference requested", file C:\b\slave\sanitizer-windows\llvm\lib\MC\MCCodeView.cpp, line 449
>>>>
>>>>
>>>>
>>>> Wrote crash dump file "C:\Users\buildbot\AppData\Local\Temp\clang.exe-30d2bf.dmp"
>>>>
>>>>
>>>>
>>>> LLVMSymbolizer: error reading file: PDB Error: Unable to load PDB.  Make sure the file exists and is readable.  Calling loadDataForExe
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> #0 0x021cf367 (C:\b\slave\sanitizer-windows\build\bin\clang.exe+0x119f367)
>>>>
>>>>
>>>>
>>>> #1 0x72ec91d2 (C:\windows\SYSTEM32\ucrtbase.DLL+0x891d2)
>>>>
>>>>
>>>>
>>>> #2 0x72eca7e1 (C:\windows\SYSTEM32\ucrtbase.DLL+0x8a7e1)
>>>>
>>>>
>>>>
>>>> #3 0x72ec9c1e (C:\windows\SYSTEM32\ucrtbase.DLL+0x89c1e)
>>>>
>>>>
>>>>
>>>> #4 0x72eca8e6 (C:\windows\SYSTEM32\ucrtbase.DLL+0x8a8e6)
>>>>
>>>>
>>>>
>>>> #5 0x0201cad9 (C:\b\slave\sanitizer-windows\build\bin\clang.exe+0xfecad9)
>>>>
>>>>
>>>>
>>>> #6 0x0201e219 (C:\b\slave\sanitizer-windows\build\bin\clang.exe+0xfee219)
>>>>
>>>>
>>>>
>>>> #7 0x02010b71 (C:\b\slave\sanitizer-windows\build\bin\clang.exe+0xfe0b71)
>>>>
>>>>
>>>>
>>>> #8 0x020109f6 (C:\b\slave\sanitizer-windows\build\bin\clang.exe+0xfe09f6)
>>>>
>>>>
>>>>
>>>> #9 0x0201049d (C:\b\slave\sanitizer-windows\build\bin\clang.exe+0xfe049d)
>>>>
>>>>
>>>>
>>>> #10 0x01fee676 (C:\b\slave\sanitizer-windows\build\bin\clang.exe+0xfbe676)
>>>>
>>>>
>>>>
>>>> #11 0x021aa8b3 (C:\b\slave\sanitizer-windows\build\bin\clang.exe+0x117a8b3)
>>>>
>>>>
>>>>
>>>> #12 0x0200cd47 (C:\b\slave\sanitizer-windows\build\bin\clang.exe+0xfdcd47)
>>>>
>>>>
>>>>
>>>> clang: error: clang frontend command failed due to signal (use -v to see invocation)
>>>>
>>>>
>>>>
>>>> clang version 8.0.0 (trunk 340583)
>>>>
>>>>
>>>>
>>>> Target: i686-pc-windows-msvc
>>>>
>>>>
>>>>
>>>> Thread model: posix
>>>>
>>>>
>>>>
>>>> InstalledDir: C:\b\slave\sanitizer-windows\build\.\bin
>>>>
>>>>
>>>>
>>>> clang: note: diagnostic msg: PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace, preprocessed source, and associated run script.
>>>>
>>>>
>>>>
>>>> clang: note: diagnostic msg:
>>>>
>>>>
>>>>
>>>> ********************
>>>>
>>>>
>>>>
>>>> On Thu, Aug 23, 2018 at 3:36 PM David Blaikie via llvm-commits <
>>>> llvm-commits at lists.llvm.org> wrote:
>>>>
>>>> Author: dblaikie
>>>> Date: Thu Aug 23 15:35:58 2018
>>>> New Revision: 340583
>>>>
>>>> URL: http://llvm.org/viewvc/llvm-project?rev=340583&view=rev
>>>> Log:
>>>> DebugInfo: Improve debug location merging
>>>>
>>>> Fix a set of related bugs:
>>>>
>>>> * Considering two locations as equivalent when their lines are the same
>>>> but their scopes are different causes erroneous debug info that
>>>> attributes a commoned call to be attributed to one of the two calls it
>>>> was commoned from.
>>>>
>>>> * The previous code to compute a new location's scope was inaccurate and
>>>> would use the inlinedAt that was the /parent/ of the inlinedAt that is
>>>> the nearest common one, and also used that parent scope instead of the
>>>> nearest common scope.
>>>>
>>>> * Not generating new locations generally seemed like a lower quality
>>>> choice
>>>>
>>>> There was some risk that generating more new locations could hurt object
>>>> size by making more fine grained line table entries, but it looks like
>>>> that was offset by the decrease in line table (& address & ranges) size
>>>> caused by more accurately computing the scope - which likely lead to
>>>> fewer range entries (more contiguous ranges) & reduced size that way.
>>>>
>>>> All up with these changes I saw minor reductions (-1.21%, -1.77%) in
>>>> .rela.debug_ranges and .rela.debug_addr (in a fission, compressed debug
>>>> info build) as well as other minor size changes (generally reductinos)
>>>> across the board (-1.32% debug_info.dwo, -1.28% debug_loc.dwo). Measured
>>>> in an optimized (-O2) build of the clang binary.
>>>>
>>>> If you are investigating a size regression in an optimized debug builds,
>>>> this is certainly a patch to look into - and I'd be happy to look into
>>>> any major regressions found & see what we can do to address them.
>>>>
>>>> Added:
>>>>     llvm/trunk/test/DebugInfo/X86/merge_inlined_loc.ll
>>>> Modified:
>>>>     llvm/trunk/include/llvm/IR/DebugInfoMetadata.h
>>>>     llvm/trunk/lib/IR/DebugInfo.cpp
>>>>     llvm/trunk/lib/IR/DebugInfoMetadata.cpp
>>>>     llvm/trunk/test/DebugInfo/COFF/local-variables.ll
>>>>
>>>> Modified: llvm/trunk/include/llvm/IR/DebugInfoMetadata.h
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/DebugInfoMetadata.h?rev=340583&r1=340582&r2=340583&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/include/llvm/IR/DebugInfoMetadata.h (original)
>>>> +++ llvm/trunk/include/llvm/IR/DebugInfoMetadata.h Thu Aug 23 15:35:58
>>>> 2018
>>>> @@ -1479,19 +1479,6 @@ public:
>>>>      return getScope();
>>>>    }
>>>>
>>>> -  /// Check whether this can be discriminated from another location.
>>>> -  ///
>>>> -  /// Check \c this can be discriminated from \c RHS in a linetable
>>>> entry.
>>>> -  /// Scope and inlined-at chains are not recorded in the linetable,
>>>> so they
>>>> -  /// cannot be used to distinguish basic blocks.
>>>> -  bool canDiscriminate(const DILocation &RHS) const {
>>>> -    return getLine() != RHS.getLine() ||
>>>> -           getColumn() != RHS.getColumn() ||
>>>> -           getDiscriminator() != RHS.getDiscriminator() ||
>>>> -           getFilename() != RHS.getFilename() ||
>>>> -           getDirectory() != RHS.getDirectory();
>>>> -  }
>>>> -
>>>>    /// Get the DWARF discriminator.
>>>>    ///
>>>>    /// DWARF discriminators distinguish identical file locations between
>>>> @@ -1539,8 +1526,6 @@ public:
>>>>    /// discriminator.
>>>>    inline const DILocation *cloneWithDuplicationFactor(unsigned DF)
>>>> const;
>>>>
>>>> -  enum { NoGeneratedLocation = false, WithGeneratedLocation = true };
>>>> -
>>>>    /// When two instructions are combined into a single instruction we
>>>> also
>>>>    /// need to combine the original locations into a single location.
>>>>    ///
>>>> @@ -1555,9 +1540,8 @@ public:
>>>>    ///
>>>>    /// \p GenerateLocation: Whether the merged location can be
>>>> generated when
>>>>    /// \p LocA and \p LocB differ.
>>>> -  static const DILocation *
>>>> -  getMergedLocation(const DILocation *LocA, const DILocation *LocB,
>>>> -                    bool GenerateLocation = NoGeneratedLocation);
>>>> +  static const DILocation *getMergedLocation(const DILocation *LocA,
>>>> +                                             const DILocation *LocB);
>>>>
>>>>    /// Returns the base discriminator for a given encoded discriminator
>>>> \p D.
>>>>    static unsigned getBaseDiscriminatorFromDiscriminator(unsigned D) {
>>>>
>>>> Modified: llvm/trunk/lib/IR/DebugInfo.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=340583&r1=340582&r2=340583&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/lib/IR/DebugInfo.cpp (original)
>>>> +++ llvm/trunk/lib/IR/DebugInfo.cpp Thu Aug 23 15:35:58 2018
>>>> @@ -690,8 +690,7 @@ unsigned llvm::getDebugMetadataVersionFr
>>>>
>>>>  void Instruction::applyMergedLocation(const DILocation *LocA,
>>>>                                        const DILocation *LocB) {
>>>> -  setDebugLoc(DILocation::getMergedLocation(LocA, LocB,
>>>> -
>>>> DILocation::WithGeneratedLocation));
>>>> +  setDebugLoc(DILocation::getMergedLocation(LocA, LocB));
>>>>  }
>>>>
>>>>
>>>>  //===----------------------------------------------------------------------===//
>>>>
>>>> Modified: llvm/trunk/lib/IR/DebugInfoMetadata.cpp
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfoMetadata.cpp?rev=340583&r1=340582&r2=340583&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/lib/IR/DebugInfoMetadata.cpp (original)
>>>> +++ llvm/trunk/lib/IR/DebugInfoMetadata.cpp Thu Aug 23 15:35:58 2018
>>>> @@ -14,7 +14,7 @@
>>>>  #include "llvm/IR/DebugInfoMetadata.h"
>>>>  #include "LLVMContextImpl.h"
>>>>  #include "MetadataImpl.h"
>>>> -#include "llvm/ADT/SmallPtrSet.h"
>>>> +#include "llvm/ADT/SmallSet.h"
>>>>  #include "llvm/ADT/StringSwitch.h"
>>>>  #include "llvm/IR/DIBuilder.h"
>>>>  #include "llvm/IR/Function.h"
>>>> @@ -69,28 +69,40 @@ DILocation *DILocation::getImpl(LLVMCont
>>>>  }
>>>>
>>>>  const DILocation *DILocation::getMergedLocation(const DILocation *LocA,
>>>> -                                                const DILocation *LocB,
>>>> -                                                bool GenerateLocation)
>>>> {
>>>> +                                                const DILocation
>>>> *LocB) {
>>>>    if (!LocA || !LocB)
>>>>      return nullptr;
>>>>
>>>> -  if (LocA == LocB || !LocA->canDiscriminate(*LocB))
>>>> +  if (LocA == LocB)
>>>>      return LocA;
>>>>
>>>> -  if (!GenerateLocation)
>>>> -    return nullptr;
>>>> -
>>>>    SmallPtrSet<DILocation *, 5> InlinedLocationsA;
>>>>    for (DILocation *L = LocA->getInlinedAt(); L; L = L->getInlinedAt())
>>>>      InlinedLocationsA.insert(L);
>>>> +  SmallSet<std::pair<DIScope *, DILocation *>, 5> Locations;
>>>> +  DIScope *S = LocA->getScope();
>>>> +  DILocation *L = LocA->getInlinedAt();
>>>> +  while (S) {
>>>> +    Locations.insert(std::make_pair(S, L));
>>>> +    S = S->getScope().resolve();
>>>> +    if (!S && L) {
>>>> +      S = L->getScope();
>>>> +      L = L->getInlinedAt();
>>>> +    }
>>>> +  }
>>>>    const DILocation *Result = LocB;
>>>> -  for (DILocation *L = LocB->getInlinedAt(); L; L = L->getInlinedAt())
>>>> {
>>>> -    Result = L;
>>>> -    if (InlinedLocationsA.count(L))
>>>> +  S = LocB->getScope();
>>>> +  L = LocB->getInlinedAt();
>>>> +  while (S) {
>>>> +    if (Locations.count(std::make_pair(S, L)))
>>>>        break;
>>>> +    S = S->getScope().resolve();
>>>> +    if (!S && L) {
>>>> +      S = L->getScope();
>>>> +      L = L->getInlinedAt();
>>>> +    }
>>>>    }
>>>> -  return DILocation::get(Result->getContext(), 0, 0,
>>>> Result->getScope(),
>>>> -                         Result->getInlinedAt());
>>>> +  return DILocation::get(Result->getContext(), 0, 0, S, L);
>>>>  }
>>>>
>>>>  DINode::DIFlags DINode::getFlag(StringRef Flag) {
>>>>
>>>> Modified: llvm/trunk/test/DebugInfo/COFF/local-variables.ll
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/local-variables.ll?rev=340583&r1=340582&r2=340583&view=diff
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/test/DebugInfo/COFF/local-variables.ll (original)
>>>> +++ llvm/trunk/test/DebugInfo/COFF/local-variables.ll Thu Aug 23
>>>> 15:35:58 2018
>>>> @@ -60,7 +60,7 @@
>>>>  ; ASM:         leaq    36(%rsp), %rcx
>>>>  ; ASM: [[else_end:\.Ltmp.*]]:
>>>>  ; ASM: .LBB0_3:                                # %if.end
>>>> -; ASM:         .cv_loc 0 1 17 1                # t.cpp:17:1
>>>> +; ASM:         .cv_loc 0 1 0 0                # t.cpp:0:0
>>>>  ; ASM:         callq   capture
>>>>  ; ASM:         nop
>>>>  ; ASM:         addq    $56, %rsp
>>>>
>>>> Added: llvm/trunk/test/DebugInfo/X86/merge_inlined_loc.ll
>>>> URL:
>>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/X86/merge_inlined_loc.ll?rev=340583&view=auto
>>>>
>>>> ==============================================================================
>>>> --- llvm/trunk/test/DebugInfo/X86/merge_inlined_loc.ll (added)
>>>> +++ llvm/trunk/test/DebugInfo/X86/merge_inlined_loc.ll Thu Aug 23
>>>> 15:35:58 2018
>>>> @@ -0,0 +1,100 @@
>>>> +; RUN: llc %s -mtriple=x86_64-unknown-unknown -o - | FileCheck %s
>>>> +
>>>> +; Generated with "clang -g -c -emit-llvm -S -O3"
>>>> +
>>>> +; This will test several features of merging debug locations.
>>>> Importantly,
>>>> +; locations with the same source line but different scopes should be
>>>> merged to
>>>> +; a line zero location at the nearest common scope and inlining. The
>>>> location
>>>> +; of the single call to "common" (the two calls are collapsed together
>>>> by
>>>> +; BranchFolding) should be attributed to line zero inside the wrapper2
>>>> inlined
>>>> +; scope within f1.
>>>> +
>>>> +; void common();
>>>> +; inline void wrapper() { common(); }
>>>> +; extern bool b;
>>>> +; void sink();
>>>> +; inline void wrapper2() {
>>>> +;   if (b) {
>>>> +;     sink();
>>>> +;     wrapper();
>>>> +;   } else
>>>> +;     wrapper();
>>>> +; }
>>>> +; void f1() { wrapper2(); }
>>>> +
>>>> +; Ensure there is only one inlined_subroutine (for wrapper2, none for
>>>> wrapper)
>>>> +; & that its address range includes the call to 'common'.
>>>> +
>>>> +; CHECK: jmp _Z6commonv
>>>> +; CHECK-NEXT: [[LABEL:.*]]:
>>>> +
>>>> +; CHECK: .section .debug_info
>>>> +; CHECK: DW_TAG_subprogram
>>>> +; CHECK: DW_TAG_subprogram
>>>> +; CHECK-NOT: {{DW_TAG\|End Of Children}}
>>>> +; CHECK:   DW_TAG_inlined_subroutine
>>>> +; CHECK-NOT: {{DW_TAG\|End Of Children}}
>>>> +; CHECK:     [[LABEL]]-{{.*}} DW_AT_high_pc
>>>> +; CHECK-NOT: DW_TAG
>>>> +
>>>> +
>>>> +
>>>> + at b = external dso_local local_unnamed_addr global i8, align 1
>>>> +
>>>> +; Function Attrs: uwtable
>>>> +define dso_local void @_Z2f1v() local_unnamed_addr !dbg !7 {
>>>> +entry:
>>>> +  %0 = load i8, i8* @b, align 1, !dbg !10, !tbaa !14, !range !18
>>>> +  %tobool.i = icmp eq i8 %0, 0, !dbg !10
>>>> +  br i1 %tobool.i, label %if.else.i, label %if.then.i, !dbg !19
>>>> +
>>>> +if.then.i:                                        ; preds = %entry
>>>> +  tail call void @_Z4sinkv(), !dbg !20
>>>> +  tail call void @_Z6commonv(), !dbg !22
>>>> +  br label %_Z8wrapper2v.exit, !dbg !25
>>>> +
>>>> +if.else.i:                                        ; preds = %entry
>>>> +  tail call void @_Z6commonv(), !dbg !26
>>>> +  br label %_Z8wrapper2v.exit
>>>> +
>>>> +_Z8wrapper2v.exit:                                ; preds =
>>>> %if.then.i, %if.else.i
>>>> +  ret void, !dbg !28
>>>> +}
>>>> +
>>>> +declare dso_local void @_Z4sinkv() local_unnamed_addr
>>>> +
>>>> +declare dso_local void @_Z6commonv() local_unnamed_addr
>>>> +
>>>> +!llvm.dbg.cu = !{!0}
>>>> +!llvm.module.flags = !{!3, !4, !5}
>>>> +!llvm.ident = !{!6}
>>>> +
>>>> +!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)
>>>> +!1 = !DIFile(filename: "merge_loc.cpp", directory:
>>>> "/usr/local/google/home/blaikie/dev/scratch")
>>>> +!2 = !{}
>>>> +!3 = !{i32 2, !"Dwarf Version", i32 4}
>>>> +!4 = !{i32 2, !"Debug Info Version", i32 3}
>>>> +!5 = !{i32 1, !"wchar_size", i32 4}
>>>> +!6 = !{!"clang version 8.0.0 (trunk 340559) (llvm/trunk 340572)"}
>>>> +!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)
>>>> +!8 = !DISubroutineType(types: !9)
>>>> +!9 = !{null}
>>>> +!10 = !DILocation(line: 6, column: 7, scope: !11, inlinedAt: !13)
>>>> +!11 = distinct !DILexicalBlock(scope: !12, file: !1, line: 6, column:
>>>> 7)
>>>> +!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)
>>>> +!13 = distinct !DILocation(line: 13, column: 3, scope: !7)
>>>> +!14 = !{!15, !15, i64 0}
>>>> +!15 = !{!"bool", !16, i64 0}
>>>> +!16 = !{!"omnipotent char", !17, i64 0}
>>>> +!17 = !{!"Simple C++ TBAA"}
>>>> +!18 = !{i8 0, i8 2}
>>>> +!19 = !DILocation(line: 6, column: 7, scope: !12, inlinedAt: !13)
>>>> +!20 = !DILocation(line: 7, column: 5, scope: !21, inlinedAt: !13)
>>>> +!21 = distinct !DILexicalBlock(scope: !11, file: !1, line: 6, column:
>>>> 10)
>>>> +!22 = !DILocation(line: 2, column: 25, scope: !23, inlinedAt: !24)
>>>> +!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)
>>>> +!24 = distinct !DILocation(line: 8, column: 5, scope: !21, inlinedAt:
>>>> !13)
>>>> +!25 = !DILocation(line: 9, column: 3, scope: !21, inlinedAt: !13)
>>>> +!26 = !DILocation(line: 2, column: 25, scope: !23, inlinedAt: !27)
>>>> +!27 = distinct !DILocation(line: 10, column: 5, scope: !11, inlinedAt:
>>>> !13)
>>>> +!28 = !DILocation(line: 14, column: 1, scope: !7)
>>>>
>>>>
>>>> _______________________________________________
>>>> llvm-commits mailing list
>>>> llvm-commits at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>>
>>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180828/990c08ff/attachment.html>


More information about the llvm-commits mailing list