]> granicus.if.org Git - llvm/commitdiff
[dsymutil] Emit valid debug locations when no symbol flags are set
authorFrancis Ricci <francisjricci@gmail.com>
Fri, 6 Oct 2017 17:43:37 +0000 (17:43 +0000)
committerFrancis Ricci <francisjricci@gmail.com>
Fri, 6 Oct 2017 17:43:37 +0000 (17:43 +0000)
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@315082 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/dsymutil/Inputs/swift-dwarf-loc.ll [new file with mode: 0644]
test/tools/dsymutil/X86/swift-dwarf-loc.test [new file with mode: 0644]
tools/dsymutil/MachODebugMapParser.cpp

diff --git a/test/tools/dsymutil/Inputs/swift-dwarf-loc.ll b/test/tools/dsymutil/Inputs/swift-dwarf-loc.ll
new file mode 100644 (file)
index 0000000..c2e7050
--- /dev/null
@@ -0,0 +1,25 @@
+; 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: "<stdin>", 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}
diff --git a/test/tools/dsymutil/X86/swift-dwarf-loc.test b/test/tools/dsymutil/X86/swift-dwarf-loc.test
new file mode 100644 (file)
index 0000000..c8e8afc
--- /dev/null
@@ -0,0 +1,9 @@
+RUN: llc -filetype=obj %p/../Inputs/swift-dwarf-loc.ll -mtriple x86_64-apple-darwin -o %T/swift-dwarf-loc.o
+RUN: ld -dylib %T/swift-dwarf-loc.o -arch x86_64 -lSystem -macosx_version_min 10.9.0 -o %T/swift-dwarf-loc
+RUN: llvm-dsymutil %T/swift-dwarf-loc -no-output -verbose | FileCheck %s
+
+This test checks that dsymutil generates a valid dwarf location for a symbol with no flags set.
+
+CHECK: __var,
+CHECK-NOT: __var,{{.*}}binAddr: 0x0000000000000000
+CHECK-NOT: __var{{.*}} => 0000000000000000
index 79b191371191ebd05f8de72b03055c9bbe30ebb5..0cd6a89cc01ee0b9e41b8981d19994d14ec96f63 100644 (file)
@@ -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<section_iterator> SectionOrErr = Sym.getSection();
     if (!SectionOrErr) {