diff --git a/llvm/include/llvm/DWARFLinker/DWARFLinkerCompileUnit.h b/llvm/include/llvm/DWARFLinker/DWARFLinkerCompileUnit.h --- a/llvm/include/llvm/DWARFLinker/DWARFLinkerCompileUnit.h +++ b/llvm/include/llvm/DWARFLinker/DWARFLinkerCompileUnit.h @@ -115,6 +115,8 @@ bool hasODR() const { return HasODR; } bool isClangModule() const { return !ClangModuleName.empty(); } uint16_t getLanguage(); + /// Return the DW_AT_LLVM_sysroot of the compile unit or an empty StringRef. + StringRef getSysRoot(); const std::string &getClangModuleName() const { return ClangModuleName; } @@ -321,6 +323,9 @@ /// The DW_AT_language of this unit. uint16_t Language = 0; + /// The DW_AT_LLVM_sysroot of this unit. + std::string SysRoot; + /// If this is a Clang module, this holds the module's name. std::string ClangModuleName; }; diff --git a/llvm/lib/DWARFLinker/DWARFLinker.cpp b/llvm/lib/DWARFLinker/DWARFLinker.cpp --- a/llvm/lib/DWARFLinker/DWARFLinker.cpp +++ b/llvm/lib/DWARFLinker/DWARFLinker.cpp @@ -171,6 +171,12 @@ StringRef Path = dwarf::toStringRef(DIE.find(dwarf::DW_AT_LLVM_include_path)); if (!Path.endswith(".swiftinterface")) return; + // Don't track interfaces that are part of the SDK. + StringRef SysRoot = dwarf::toStringRef(DIE.find(dwarf::DW_AT_LLVM_sysroot)); + if (SysRoot.empty()) + SysRoot = CU.getSysRoot(); + if (!SysRoot.empty() && Path.startswith(SysRoot)) + return; if (Optional Val = DIE.find(dwarf::DW_AT_name)) if (Optional Name = Val->getAsCString()) { auto &Entry = (*ParseableSwiftInterfaces)[*Name]; diff --git a/llvm/lib/DWARFLinker/DWARFLinkerCompileUnit.cpp b/llvm/lib/DWARFLinker/DWARFLinkerCompileUnit.cpp --- a/llvm/lib/DWARFLinker/DWARFLinkerCompileUnit.cpp +++ b/llvm/lib/DWARFLinker/DWARFLinkerCompileUnit.cpp @@ -29,6 +29,14 @@ return Language; } +StringRef CompileUnit::getSysRoot() { + if (SysRoot.empty()) { + DWARFDie CU = getOrigUnit().getUnitDIE(); + SysRoot = dwarf::toStringRef(CU.find(dwarf::DW_AT_LLVM_sysroot)).str(); + } + return SysRoot; +} + void CompileUnit::markEverythingAsKept() { unsigned Idx = 0; diff --git a/llvm/test/tools/dsymutil/Inputs/swift-interface.ll b/llvm/test/tools/dsymutil/Inputs/swift-interface.ll deleted file mode 100644 --- a/llvm/test/tools/dsymutil/Inputs/swift-interface.ll +++ /dev/null @@ -1,34 +0,0 @@ -; This is a manually stripped empty Swift program with one import. -source_filename = "/swift-interface.ll" -target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" -target triple = "x86_64-apple-macosx10.9.0" - -@__swift_reflection_version = linkonce_odr hidden constant i16 3 -@llvm.used = appending global [1 x i8*] [i8* bitcast (i16* @__swift_reflection_version to i8*)], section "llvm.metadata", align 8 - -define i32 @main(i32, i8**) !dbg !29 { -entry: - %2 = bitcast i8** %1 to i8* - ret i32 0, !dbg !35 -} - -!llvm.dbg.cu = !{!0} -!swift.module.flags = !{!14} -!llvm.module.flags = !{!20, !21, !24} - -!0 = distinct !DICompileUnit(language: DW_LANG_Swift, file: !1, isOptimized: false, runtimeVersion: 5, emissionKind: FullDebug, enums: !2, imports: !3) -!1 = !DIFile(filename: "ParseableInterfaceImports.swift", directory: "/") -!2 = !{} -!3 = !{!4} -!4 = !DIImportedEntity(tag: DW_TAG_imported_module, scope: !1, entity: !5, file: !1) -!5 = !DIModule(scope: null, name: "Foo", includePath: "/Foo/x86_64.swiftinterface") -!14 = !{!"standard-library", i1 false} -!20 = !{i32 2, !"Dwarf Version", i32 4} -!21 = !{i32 2, !"Debug Info Version", i32 3} -!24 = !{i32 1, !"Swift Version", i32 7} -!29 = distinct !DISubprogram(name: "main", linkageName: "main", scope: !5, file: !1, line: 1, type: !30, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) -!30 = !DISubroutineType(types: !31) -!31 = !{} -!35 = !DILocation(line: 0, scope: !36) -!36 = !DILexicalBlockFile(scope: !29, file: !37, discriminator: 0) -!37 = !DIFile(filename: "", directory: "") diff --git a/llvm/test/tools/dsymutil/Inputs/swift-interface.s b/llvm/test/tools/dsymutil/Inputs/swift-interface.s new file mode 100644 --- /dev/null +++ b/llvm/test/tools/dsymutil/Inputs/swift-interface.s @@ -0,0 +1,216 @@ +##; Generated from the following manually stripped empty Swift program: +##; +##; target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" +##; target triple = "x86_64-apple-macosx10.9.0" +##; +##; @__swift_reflection_version = linkonce_odr hidden constant i16 3 +##; @llvm.used = appending global [1 x i8*] [i8* bitcast (i16* @__swift_reflection_version to i8*)], section "llvm.metadata", align 8 +##; +##; define i32 @main(i32, i8**) !dbg !29 { +##; entry: +##; %2 = bitcast i8** %1 to i8* +##; ret i32 0, !dbg !35 +##; } +##; +##; !llvm.dbg.cu = !{!0} +##; !swift.module.flags = !{!14} +##; !llvm.module.flags = !{!20, !21, !24} +##; +##; !0 = distinct !DICompileUnit(language: DW_LANG_Swift, file: !1, isOptimized: false, runtimeVersion: 5, emissionKind: FullDebug, enums: !2, imports: !3, sysroot: "/SDK") +##; !1 = !DIFile(filename: "ParseableInterfaceImports.swift", directory: "/") +##; !2 = !{} +##; !3 = !{!4, !6, !8} +##; !4 = !DIImportedEntity(tag: DW_TAG_imported_module, scope: !1, entity: !5, file: !1) +##; !5 = !DIModule(scope: null, name: "Foo", includePath: "/Foo/x86_64.swiftinterface") +##; !6 = !DIImportedEntity(tag: DW_TAG_imported_module, scope: !1, entity: !7, file: !1) +##; !7 = !DIModule(scope: null, name: "Swift", includePath: "/SDK/Swift.swiftmodule/x86_64.swiftinterface", sysroot: "/SDK") +##; !8 = !DIImportedEntity(tag: DW_TAG_imported_module, scope: !1, entity: !7, file: !1) +##; !9 = !DIModule(scope: null, name: "Foundation", includePath: "/SDK/Foundation.swiftmodu +##; !14 = !{!"standard-library", i1 false} +##; !20 = !{i32 2, !"Dwarf Version", i32 4} +##; !21 = !{i32 2, !"Debug Info Version", i32 3} +##; !24 = !{i32 1, !"Swift Version", i32 7} +##; !29 = distinct !DISubprogram(name: "main", linkageName: "main", scope: !5, file: !1, line: 1, type: !30, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) +##; !30 = !DISubroutineType(types: !31) +##; !31 = !{} +##; !35 = !DILocation(line: 0, scope: !36) +##; !36 = !DILexicalBlockFile(scope: !29, file: !37, discriminator: 0) +##; !37 = !DIFile(filename: "", directory: "") + .section __TEXT,__text,regular,pure_instructions + .macosx_version_min 10, 9 + .globl _main ## -- Begin function main + .p2align 4, 0x90 +_main: ## @main +Lfunc_begin0: + .file 1 "/ParseableInterfaceImports.swift" + .loc 1 0 0 ## ParseableInterfaceImports.swift:0:0 + .cfi_startproc +## %bb.0: ## %entry + xorl %eax, %eax + retq +Ltmp0: +Lfunc_end0: + .cfi_endproc + ## -- End function + .private_extern ___swift_reflection_version ## @__swift_reflection_version + .section __TEXT,__const + .globl ___swift_reflection_version + .weak_definition ___swift_reflection_version + .p2align 1 +___swift_reflection_version: + .short 3 ## 0x3 + + .no_dead_strip ___swift_reflection_version + .section __DWARF,__debug_str,regular,debug +Linfo_string: + .byte 0 ## string offset=0 + .asciz "ParseableInterfaceImports.swift" ## string offset=1 + .asciz "/" ## string offset=33 + .asciz "Foo" ## string offset=35 + .asciz "/Foo/x86_64.swiftinterface" ## string offset=39 + .asciz "Swift" ## string offset=66 + .asciz "/SDK/Swift.swiftmodule/x86_64.swiftinterface" ## string offset=72 + .asciz "/SDK" ## string offset=117 + .asciz "main" ## string offset=122 + .asciz "Foundation" ## string offset=127 + .asciz "/SDK/Foundation.swiftmodule/x86_64.swiftinterface" ## string offset=138 + .section __DWARF,__debug_abbrev,regular,debug +Lsection_abbrev: + .byte 1 ## Abbreviation Code + .byte 17 ## DW_TAG_compile_unit + .byte 1 ## DW_CHILDREN_yes + .byte 37 ## DW_AT_producer + .byte 14 ## DW_FORM_strp + .byte 19 ## DW_AT_language + .byte 5 ## DW_FORM_data2 + .byte 3 ## DW_AT_name + .byte 14 ## DW_FORM_strp + .ascii "\202|" ## DW_AT_LLVM_sysroot + .byte 14 ## DW_FORM_strp + .byte 16 ## DW_AT_stmt_list + .byte 23 ## DW_FORM_sec_offset + .byte 27 ## DW_AT_comp_dir + .byte 14 ## DW_FORM_strp + .ascii "\345\177" ## DW_AT_APPLE_major_runtime_vers + .byte 11 ## DW_FORM_data1 + .byte 17 ## DW_AT_low_pc + .byte 1 ## DW_FORM_addr + .byte 18 ## DW_AT_high_pc + .byte 6 ## DW_FORM_data4 + .byte 0 ## EOM(1) + .byte 0 ## EOM(2) + .byte 2 ## Abbreviation Code + .byte 30 ## DW_TAG_module + .byte 1 ## DW_CHILDREN_yes + .byte 3 ## DW_AT_name + .byte 14 ## DW_FORM_strp + .ascii "\200|" ## DW_AT_LLVM_include_path + .byte 14 ## DW_FORM_strp + .byte 0 ## EOM(1) + .byte 0 ## EOM(2) + .byte 3 ## Abbreviation Code + .byte 46 ## DW_TAG_subprogram + .byte 0 ## DW_CHILDREN_no + .byte 17 ## DW_AT_low_pc + .byte 1 ## DW_FORM_addr + .byte 18 ## DW_AT_high_pc + .byte 6 ## DW_FORM_data4 + .ascii "\347\177" ## DW_AT_APPLE_omit_frame_ptr + .byte 25 ## DW_FORM_flag_present + .byte 64 ## DW_AT_frame_base + .byte 24 ## DW_FORM_exprloc + .byte 110 ## DW_AT_linkage_name + .byte 14 ## DW_FORM_strp + .byte 3 ## DW_AT_name + .byte 14 ## DW_FORM_strp + .byte 58 ## DW_AT_decl_file + .byte 11 ## DW_FORM_data1 + .byte 59 ## DW_AT_decl_line + .byte 11 ## DW_FORM_data1 + .byte 63 ## DW_AT_external + .byte 25 ## DW_FORM_flag_present + .byte 0 ## EOM(1) + .byte 0 ## EOM(2) + .byte 4 ## Abbreviation Code + .byte 58 ## DW_TAG_imported_module + .byte 0 ## DW_CHILDREN_no + .byte 24 ## DW_AT_import + .byte 19 ## DW_FORM_ref4 + .byte 0 ## EOM(1) + .byte 0 ## EOM(2) + .byte 5 ## Abbreviation Code + .byte 30 ## DW_TAG_module + .byte 0 ## DW_CHILDREN_no + .byte 3 ## DW_AT_name + .byte 14 ## DW_FORM_strp + .ascii "\200|" ## DW_AT_LLVM_include_path + .byte 14 ## DW_FORM_strp + .ascii "\202|" ## DW_AT_LLVM_sysroot + .byte 14 ## DW_FORM_strp + .byte 0 ## EOM(1) + .byte 0 ## EOM(2) + .byte 30 ## DW_TAG_module + .byte 1 ## DW_CHILDREN_no + .byte 3 ## DW_AT_name + .byte 14 ## DW_FORM_strp + .ascii "\200|" ## DW_AT_LLVM_include_path + .byte 14 ## DW_FORM_strp + .byte 0 ## EOM(1) + .byte 0 ## EOM(2) + .byte 0 ## EOM(3) + .section __DWARF,__debug_info,regular,debug +Lsection_info: +Lcu_begin0: +.set Lset0, Ldebug_info_end0-Ldebug_info_start0 ## Length of Unit + .long Lset0 +Ldebug_info_start0: + .short 4 ## DWARF version number +.set Lset1, Lsection_abbrev-Lsection_abbrev ## Offset Into Abbrev. Section + .long Lset1 + .byte 8 ## Address Size (in bytes) + .byte 1 ## Abbrev [1] 0xb:0x5b DW_TAG_compile_unit + .long 0 ## DW_AT_producer + .short 30 ## DW_AT_language + .long 1 ## DW_AT_name + .long 117 ## DW_AT_name +.set Lset2, Lline_table_start0-Lsection_line ## DW_AT_stmt_list + .long Lset2 + .long 33 ## DW_AT_comp_dir + .byte 5 ## DW_AT_APPLE_major_runtime_vers + .quad Lfunc_begin0 ## DW_AT_low_pc +.set Lset3, Lfunc_end0-Lfunc_begin0 ## DW_AT_high_pc + .long Lset3 + .byte 2 ## Abbrev [2] 0x2b:0x23 DW_TAG_module + .long 35 ## DW_AT_name + .long 39 ## DW_AT_LLVM_include_path + .byte 3 ## Abbrev [3] 0x34:0x19 DW_TAG_subprogram + .quad Lfunc_begin0 ## DW_AT_low_pc +.set Lset4, Lfunc_end0-Lfunc_begin0 ## DW_AT_high_pc + .long Lset4 + ## DW_AT_APPLE_omit_frame_ptr + .byte 1 ## DW_AT_frame_base + .byte 87 + .long 122 ## DW_AT_linkage_name + .long 122 ## DW_AT_name + .byte 1 ## DW_AT_decl_file + .byte 1 ## DW_AT_decl_line + ## DW_AT_external + .byte 0 ## End Of Children Mark + .byte 4 ## Abbrev [4] 0x4e:0x5 DW_TAG_imported_module + .long 47 ## DW_AT_import + .byte 5 ## Abbrev [5] 0x53:0xd DW_TAG_module + .long 66 ## DW_AT_name + .long 72 ## DW_AT_LLVM_include_path + .long 117 ## DW_AT_LLVM_sysroot + .byte 4 ## Abbrev [4] 0x60:0x5 DW_TAG_imported_module + .long 105 ## DW_AT_import + .byte 2 ## Abbrev [2] 0x2b:0x23 DW_TAG_module + .long 127 ## DW_AT_name + .long 138 ## DW_AT_LLVM_include_path + .byte 0 ## End Of Children Mark + .byte 0 ## End Of Children Mark +Ldebug_info_end0: +.subsections_via_symbols + .section __DWARF,__debug_line,regular,debug +Lsection_line: +Lline_table_start0: diff --git a/llvm/test/tools/dsymutil/X86/swift-interface.test b/llvm/test/tools/dsymutil/X86/swift-interface.test --- a/llvm/test/tools/dsymutil/X86/swift-interface.test +++ b/llvm/test/tools/dsymutil/X86/swift-interface.test @@ -1,7 +1,8 @@ # RUN: rm -rf %t.dir # RUN: mkdir -p %t.dir/obj # RUN: mkdir -p %t.dir/Foo/x86_64 -# RUN: llc %p/../Inputs/swift-interface.ll -filetype=obj -o %t.dir/obj/1.o +# RUN: llvm-mc -triple x86_64-apple-macos -filetype=obj -o %t.dir/obj/1.o \ +# RUN: %p/../Inputs/swift-interface.s # RUN: dsymutil -oso-prepend-path %t.dir -y %s \ # RUN: -o %t.dir/swift-interface.dSYM 2>&1 \ # RUN: | FileCheck %s --check-prefix=WARNINGS @@ -11,7 +12,9 @@ # RUN: cat %t.dir/swift-interface.dSYM/Contents/Resources/Swift/x86_64/Foo.swiftinterface \ # RUN: | FileCheck %s --check-prefix=INTERFACE -# WARNINGS: cannot copy parseable Swift interface +# WARNINGS-NOT: cannot copy parseable Swift interface {{.*}}{{Swift|Foundation}} +# WARNINGS: cannot copy parseable Swift interface {{.*}}Foo +# WARNINGS-NOT: cannot copy parseable Swift interface {{.*}}{{Swift|Foundation}} # INTERFACE: module Foo ---