[PATCH] D38587: [dsymutil] Emit valid debug locations when no symbol flags are set

Francis Ricci via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 5 07:54:58 PDT 2017


fjricci created this revision.

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.


https://reviews.llvm.org/D38587

Files:
  test/tools/dsymutil/Inputs/swift-dwarf-loc.ll
  test/tools/dsymutil/swift-dwarf-loc.test
  tools/dsymutil/MachODebugMapParser.cpp


Index: tools/dsymutil/MachODebugMapParser.cpp
===================================================================
--- tools/dsymutil/MachODebugMapParser.cpp
+++ tools/dsymutil/MachODebugMapParser.cpp
@@ -482,7 +482,7 @@
     // 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))
+    if (Sym.getFlags() && !(Sym.getFlags() & SymbolRef::SF_Global))
       continue;
     Expected<section_iterator> SectionOrErr = Sym.getSection();
     if (!SectionOrErr) {
Index: test/tools/dsymutil/swift-dwarf-loc.test
===================================================================
--- /dev/null
+++ test/tools/dsymutil/swift-dwarf-loc.test
@@ -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 %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: test/tools/dsymutil/Inputs/swift-dwarf-loc.ll
===================================================================
--- /dev/null
+++ test/tools/dsymutil/Inputs/swift-dwarf-loc.ll
@@ -0,0 +1,32 @@
+; 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 }>
+
+ at _var = hidden global %TSi zeroinitializer, align 8, !dbg !0
+
+define i32 @main(i32, i8**) #0 {
+entry:
+  ret i32 0
+}
+
+!llvm.dbg.cu = !{!8}
+!llvm.module.flags = !{!13, !14}
+
+!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: !11)
+!9 = !DIFile(filename: "/tmp", directory: "")
+!10 = !{!0}
+!11 = !{!12}
+!12 = !DIImportedEntity(tag: DW_TAG_imported_module, scope: !3, entity: !6, file: !3)
+!13 = !{i32 2, !"Dwarf Version", i32 4}
+!14 = !{i32 2, !"Debug Info Version", i32 3}


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D38587.117821.patch
Type: text/x-patch
Size: 2909 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171005/cceecae2/attachment.bin>


More information about the llvm-commits mailing list