[llvm] r315218 - [dsymutil] Emit valid debug locations when no symbol flags are set

Francis Ricci via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 9 10:27:47 PDT 2017


Author: fjricci
Date: Mon Oct  9 10:27:47 2017
New Revision: 315218

URL: http://llvm.org/viewvc/llvm-project?rev=315218&view=rev
Log:
[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

Added:
    llvm/trunk/test/tools/dsymutil/Inputs/swift-dwarf-loc.macho.x86_64   (with props)
    llvm/trunk/test/tools/dsymutil/Inputs/swift-dwarf-loc.macho.x86_64.o
    llvm/trunk/test/tools/dsymutil/X86/swift-dwarf-loc.test
Modified:
    llvm/trunk/tools/dsymutil/MachODebugMapParser.cpp

Added: llvm/trunk/test/tools/dsymutil/Inputs/swift-dwarf-loc.macho.x86_64
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inputs/swift-dwarf-loc.macho.x86_64?rev=315218&view=auto
==============================================================================
Binary files llvm/trunk/test/tools/dsymutil/Inputs/swift-dwarf-loc.macho.x86_64 (added) and llvm/trunk/test/tools/dsymutil/Inputs/swift-dwarf-loc.macho.x86_64 Mon Oct  9 10:27:47 2017 differ

Propchange: llvm/trunk/test/tools/dsymutil/Inputs/swift-dwarf-loc.macho.x86_64
------------------------------------------------------------------------------
    svn:executable = *

Added: llvm/trunk/test/tools/dsymutil/Inputs/swift-dwarf-loc.macho.x86_64.o
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inputs/swift-dwarf-loc.macho.x86_64.o?rev=315218&view=auto
==============================================================================
Binary files llvm/trunk/test/tools/dsymutil/Inputs/swift-dwarf-loc.macho.x86_64.o (added) and llvm/trunk/test/tools/dsymutil/Inputs/swift-dwarf-loc.macho.x86_64.o Mon Oct  9 10:27:47 2017 differ

Added: llvm/trunk/test/tools/dsymutil/X86/swift-dwarf-loc.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/X86/swift-dwarf-loc.test?rev=315218&view=auto
==============================================================================
--- llvm/trunk/test/tools/dsymutil/X86/swift-dwarf-loc.test (added)
+++ llvm/trunk/test/tools/dsymutil/X86/swift-dwarf-loc.test Mon Oct  9 10:27:47 2017
@@ -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 }>
+
+ at _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}
+
+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

Modified: llvm/trunk/tools/dsymutil/MachODebugMapParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/MachODebugMapParser.cpp?rev=315218&r1=315217&r2=315218&view=diff
==============================================================================
--- llvm/trunk/tools/dsymutil/MachODebugMapParser.cpp (original)
+++ llvm/trunk/tools/dsymutil/MachODebugMapParser.cpp Mon Oct  9 10:27:47 2017
@@ -482,7 +482,9 @@ void MachODebugMapParser::loadMainBinary
     // 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) {




More information about the llvm-commits mailing list