[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:
Johannes Altmanninger 2019-11-27 22:48:15 +01:00
parent bf507d4259
commit 92211bf0f1
3 changed files with 40 additions and 3 deletions

View File

@ -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;
}
}
}

View File

@ -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"

View File

@ -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}