From: Francis Ricci Date: Mon, 9 Oct 2017 17:27:47 +0000 (+0000) Subject: [dsymutil] Emit valid debug locations when no symbol flags are set X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=87b0f4a33cafe87763b4f046bf2fae41adc7f877;p=llvm [dsymutil] Emit valid debug locations when no symbol flags are set Summary: swiftc emits symbols without flags set, which led dsymutil to ignore them when searching for global symbols, causing dwarf location data to be omitted. Xcode's dsymutil handles this case correctly, and emits valid location data. Add this functionality to llvm-dsymutil by allowing parsing of symbols with no flags set. Reviewers: aprantl, friss, JDevlieghere Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D38587 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315218 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/tools/dsymutil/Inputs/swift-dwarf-loc.macho.x86_64 b/test/tools/dsymutil/Inputs/swift-dwarf-loc.macho.x86_64 new file mode 100755 index 00000000000..b232e509442 Binary files /dev/null and b/test/tools/dsymutil/Inputs/swift-dwarf-loc.macho.x86_64 differ diff --git a/test/tools/dsymutil/Inputs/swift-dwarf-loc.macho.x86_64.o b/test/tools/dsymutil/Inputs/swift-dwarf-loc.macho.x86_64.o new file mode 100644 index 00000000000..2e34ce3de5b Binary files /dev/null and b/test/tools/dsymutil/Inputs/swift-dwarf-loc.macho.x86_64.o differ diff --git a/test/tools/dsymutil/X86/swift-dwarf-loc.test b/test/tools/dsymutil/X86/swift-dwarf-loc.test new file mode 100644 index 00000000000..29310cae6a4 --- /dev/null +++ b/test/tools/dsymutil/X86/swift-dwarf-loc.test @@ -0,0 +1,37 @@ +RUN: llvm-dsymutil -oso-prepend-path %p/../Inputs %p/../Inputs/swift-dwarf-loc.macho.x86_64 -no-output -verbose | FileCheck %s + +This test checks that dsymutil generates a valid dwarf location for a symbol with no flags set. + +The following IR was compiled for x86_64-apple: +; ModuleID = '-' +source_filename = "-" +target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-apple-macosx10.12" + +%TSi = type <{ i64 }> + +@_var = hidden global %TSi zeroinitializer, align 8, !dbg !0 + +!llvm.dbg.cu = !{!8} +!llvm.module.flags = !{!11, !12} + +!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) +!1 = distinct !DIGlobalVariable(name: "x", linkageName: "_var", scope: !2, file: !3, line: 1, type: !4, isLocal: false, isDefinition: true) +!2 = !DIModule(scope: null, name: "main") +!3 = !DIFile(filename: "", directory: "") +!4 = !DICompositeType(tag: DW_TAG_structure_type, name: "Int", scope: !6, file: !5, size: 64, elements: !7, runtimeLang: DW_LANG_Swift, identifier: "_T0SiD") +!5 = !DIFile(filename: "foo", directory: "/tmp") +!6 = !DIModule(scope: null, name: "foo", includePath: "") +!7 = !{} +!8 = distinct !DICompileUnit(language: DW_LANG_Swift, file: !9, producer: "swiftc", isOptimized: false, flags: "", runtimeVersion: 4, emissionKind: FullDebug, enums: !7, globals: !10, imports: null) +!9 = !DIFile(filename: "/tmp", directory: "") +!10 = !{!0} +!11 = !{i32 2, !"Dwarf Version", i32 4} +!12 = !{i32 2, !"Debug Info Version", i32 3} + +Compiled with: llc -filetype=obj %p/../Inputs/swift-dwarf-loc.ll -mtriple x86_64-apple-darwin +Linked with: ld -dylib %T/swift-dwarf-loc.o -arch x86_64 -lSystem -macosx_version_min 10.9.0 + +CHECK: __var, +CHECK-NOT: __var,{{.*}}binAddr: 0x0000000000000000 +CHECK-NOT: __var{{.*}} => 0000000000000000 diff --git a/tools/dsymutil/MachODebugMapParser.cpp b/tools/dsymutil/MachODebugMapParser.cpp index 79b19137119..0cd6a89cc01 100644 --- a/tools/dsymutil/MachODebugMapParser.cpp +++ b/tools/dsymutil/MachODebugMapParser.cpp @@ -482,7 +482,9 @@ void MachODebugMapParser::loadMainBinarySymbols( // are the only ones that need to be queried because the address // of common data won't be described in the debug map. All other // addresses should be fetched for the debug map. - if (!(Sym.getFlags() & SymbolRef::SF_Global)) + uint8_t SymType = + MainBinary.getSymbolTableEntry(Sym.getRawDataRefImpl()).n_type; + if (!(SymType & (MachO::N_EXT | MachO::N_PEXT))) continue; Expected SectionOrErr = Sym.getSection(); if (!SectionOrErr) {