forked from OSchip/llvm-project
[LLDB] Fix address computation for inline function
Summary: Fixes PR41237 - SIGSEGV on call expression evaluation when debugging clang When linking multiple compilation units that define the same functions, the functions is merged but their debug info is not. This ignores debug info entries for functions in a non-executable sections; those are functions that were definitely dropped by the linker. Reviewers: spyffe, clayborg, jasonmolenda Reviewed By: clayborg Subscribers: labath, aprantl, lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D71487
This commit is contained in:
parent
bf507d4259
commit
92211bf0f1
|
@ -2282,9 +2282,12 @@ bool SymbolFileDWARF::ResolveFunction(const DWARFDIE &orig_die,
|
|||
addr = sc.function->GetAddressRange().GetBaseAddress();
|
||||
}
|
||||
|
||||
if (addr.IsValid()) {
|
||||
sc_list.Append(sc);
|
||||
return true;
|
||||
|
||||
if (auto section_sp = addr.GetSection()) {
|
||||
if (section_sp->GetPermissions() & ePermissionsExecutable) {
|
||||
sc_list.Append(sc);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
# REQUIRES: lld
|
||||
; RUN: llc %S/inline-function-address.ll -filetype=obj -o %t.o
|
||||
; RUN: ld.lld %t.o %t.o -o %t -shared
|
||||
; RUN: lldb-test symbols --find=function --name=foo --function-flags=full %t | FileCheck %s
|
||||
; CHECK: Function: {{.*}} "foo"
|
||||
; CHECK-NOT: Function: {{.*}} "foo"
|
|
@ -0,0 +1,28 @@
|
|||
; REQUIRES: lld
|
||||
; RUN: llc %s -filetype=obj -o %t.o
|
||||
; RUN: ld.lld %t.o %t.o -o %t
|
||||
; "foo" is defined in both compilation units, but there should be only one meaningful debuginfo entry
|
||||
; RUN: lldb-test symbols --find=function --name=foo --function-flags=full %t | FileCheck %s
|
||||
; CHECK: Function: {{.*}} "foo"
|
||||
; CHECK-NOT: Function: {{.*}} "foo"
|
||||
|
||||
$foo = comdat any
|
||||
define void @foo() comdat !dbg !6 {
|
||||
entry:
|
||||
ret void
|
||||
}
|
||||
|
||||
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !2, isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !{}, imports: !{}, splitDebugInlining: false, nameTableKind: None)
|
||||
!1 = !DIFile(filename: "inline-function-address.h", directory: "")
|
||||
!2 = !DIFile(filename: "inline-function-address.c", directory: "")
|
||||
!3 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
|
||||
!4 = !DISubroutineType(types: !{})
|
||||
!5 = !DISubprogram(name: "foo", file: !1, line: 12, type: !4, flags: DIFlagPrototyped, spFlags: 0)
|
||||
!6 = distinct !DISubprogram(name: "foo", file: !1, line: 12, type: !4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, declaration: !5)
|
||||
|
||||
!llvm.dbg.cu = !{!0}
|
||||
!llvm.module.flags = !{!7, !8, !9}
|
||||
!llvm.ident = !{}
|
||||
!7 = !{i32 7, !"Dwarf Version", i32 4}
|
||||
!8 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
!9 = !{i32 1, !"wchar_size", i32 4}
|
Loading…
Reference in New Issue