mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
Emit discriminator for inlined callsites.
Summary: Inlined callsites need to be emitted in debug info so that sample profile can be annotated to the correct inlined instance. Reviewers: dnovillo, dblaikie Subscribers: dblaikie, llvm-commits Differential Revision: http://reviews.llvm.org/D14511 llvm-svn: 252768
This commit is contained in:
parent
d52939585a
commit
96e036f1dd
@ -238,6 +238,7 @@ enum Attribute : uint16_t {
|
||||
DW_AT_GNU_addr_base = 0x2133,
|
||||
DW_AT_GNU_pubnames = 0x2134,
|
||||
DW_AT_GNU_pubtypes = 0x2135,
|
||||
DW_AT_GNU_discriminator = 0x2136,
|
||||
|
||||
// LLVM project extensions.
|
||||
DW_AT_LLVM_include_path = 0x3e00,
|
||||
|
@ -439,6 +439,8 @@ DIE *DwarfCompileUnit::constructInlinedScopeDIE(LexicalScope *Scope) {
|
||||
addUInt(*ScopeDIE, dwarf::DW_AT_call_file, None,
|
||||
getOrCreateSourceID(IA->getFilename(), IA->getDirectory()));
|
||||
addUInt(*ScopeDIE, dwarf::DW_AT_call_line, None, IA->getLine());
|
||||
if (IA->getDiscriminator())
|
||||
addUInt(*ScopeDIE, dwarf::DW_AT_GNU_discriminator, None, IA->getDiscriminator());
|
||||
|
||||
// Add name to the name table, we do this here because we're guaranteed
|
||||
// to have concrete versions of our DW_TAG_inlined_subprogram nodes.
|
||||
|
@ -201,6 +201,7 @@ const char *llvm::dwarf::AttributeString(unsigned Attribute) {
|
||||
case DW_AT_GNU_addr_base: return "DW_AT_GNU_addr_base";
|
||||
case DW_AT_GNU_pubnames: return "DW_AT_GNU_pubnames";
|
||||
case DW_AT_GNU_pubtypes: return "DW_AT_GNU_pubtypes";
|
||||
case DW_AT_GNU_discriminator: return "DW_AT_GNU_discriminator";
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
52
test/DebugInfo/Generic/discriminator.ll
Normal file
52
test/DebugInfo/Generic/discriminator.ll
Normal file
@ -0,0 +1,52 @@
|
||||
; REQUIRES: object-emission
|
||||
|
||||
; RUN: %llc_dwarf < %s -filetype=obj | llvm-dwarfdump -debug-dump=info - | FileCheck %s
|
||||
|
||||
; Given the following source, ensure that the discriminator is emitted for
|
||||
; the inlined callsite.
|
||||
|
||||
;void xyz();
|
||||
;static void __attribute__((always_inline)) bar() { xyz(); }
|
||||
;void foo() {
|
||||
; bar(); bar();
|
||||
;}
|
||||
|
||||
;CHECK: DW_TAG_inlined_subroutine
|
||||
;CHECK-NOT: DW_AT_GNU_discriminator
|
||||
;CHECK: DW_TAG_inlined_subroutine
|
||||
;CHECK-NOT: {{DW_TAG|NULL}}
|
||||
;CHECK: DW_AT_GNU_discriminator{{.*}}0x01
|
||||
|
||||
; Function Attrs: uwtable
|
||||
define void @_Z3foov() #0 !dbg !4 {
|
||||
tail call void @_Z3xyzv(), !dbg !11
|
||||
tail call void @_Z3xyzv(), !dbg !13
|
||||
ret void, !dbg !16
|
||||
}
|
||||
|
||||
declare void @_Z3xyzv() #1
|
||||
|
||||
attributes #0 = { uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||
attributes #1 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2" "unsafe-fp-math"="false" "use-soft-float"="false" }
|
||||
|
||||
!llvm.dbg.cu = !{!0}
|
||||
!llvm.module.flags = !{!8, !9}
|
||||
!llvm.ident = !{!10}
|
||||
|
||||
!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 3.8.0 (trunk 252497)", isOptimized: true, runtimeVersion: 0, emissionKind: 1, enums: !2, subprograms: !3)
|
||||
!1 = !DIFile(filename: "a.cc", directory: "/tmp")
|
||||
!2 = !{}
|
||||
!3 = !{!4, !7}
|
||||
!4 = distinct !DISubprogram(name: "foo", linkageName: "_Z3foov", scope: !1, file: !1, line: 3, type: !5, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: true, variables: !2)
|
||||
!5 = !DISubroutineType(types: !6)
|
||||
!6 = !{null}
|
||||
!7 = distinct !DISubprogram(name: "bar", linkageName: "_ZL3barv", scope: !1, file: !1, line: 2, type: !5, isLocal: true, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: true, variables: !2)
|
||||
!8 = !{i32 2, !"Dwarf Version", i32 4}
|
||||
!9 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
!10 = !{!"clang version 3.8.0 (trunk 252497)"}
|
||||
!11 = !DILocation(line: 2, column: 52, scope: !7, inlinedAt: !12)
|
||||
!12 = distinct !DILocation(line: 4, column: 3, scope: !4)
|
||||
!13 = !DILocation(line: 2, column: 52, scope: !7, inlinedAt: !14)
|
||||
!14 = distinct !DILocation(line: 4, column: 10, scope: !15)
|
||||
!15 = !DILexicalBlockFile(scope: !4, file: !1, discriminator: 1)
|
||||
!16 = !DILocation(line: 5, column: 1, scope: !4)
|
Loading…
x
Reference in New Issue
Block a user