diff --git a/llvm/test/tools/dsymutil/ARM/swift-ast.test b/llvm/test/tools/dsymutil/ARM/swift-ast.test deleted file mode 100644 index bd33e7af436b..000000000000 --- a/llvm/test/tools/dsymutil/ARM/swift-ast.test +++ /dev/null @@ -1,26 +0,0 @@ -RUN: llvm-dsymutil -oso-prepend-path %p/.. %p/../Inputs/swift-ast.macho.fat -o %T/swift-ast.dSYM -verbose -no-swiftmodule-timestamp | FileCheck %s --check-prefix=DSYMUTIL -RUN: llvm-readobj -sections -section-data %T/swift-ast.dSYM/Contents/Resources/DWARF/swift-ast.macho.fat | FileCheck %s --check-prefix=READOBJ - -The tested object file has been created by the dummy Swift code: -let x = 1 - -Compiled with: - swiftc /tmp/test.swift -Onone -target armv7-apple-ios8.1 -c -o swift-ast-armv7.o - ld swift-ast-armv7.o -add_ast_path swift-ast.swiftmodule -arch armv7 -ios_version_min 8.1 -syslibroot /path/to/iPhoneOS.sdk -L/path/to/usr/lib/swift/iphoneos -lobjc -lSystem -o swift-ast.macho.armv7 - - swiftc /tmp/test.swift -Onone -target arm64-apple-ios8.1 -c -o swift-ast-arm64.o - ld swift-ast-arm64.o -add_ast_path swift-ast.swiftmodule -arch arm64 -ios_version_min 8.1 -syslibroot /path/to/iPhoneOS.sdk -L/path/to/usr/lib/swift/iphoneos -lobjc -lSystem -o swift-ast.macho.arm64 - - lipo -create swift-ast.macho.armv7 swift-ast.macho.arm64 -o swift-ast.macho.fat - -DSYMUTIL: filename:{{.*}}swift-ast.swiftmodule -DSYMUTIL: DEBUG MAP OBJECT:{{.*}}swift-ast.swiftmodule - -READOBJ: Name:{{.*}}__swift_ast -READOBJ: |SWIFTMODULE DATA| -READOBJ-NEXT: |.| -READOBJ: |SWIFTMODULE DATA| -READOBJ-NEXT: |.| - -RUN: llvm-dsymutil -oso-prepend-path %p/.. %p/../Inputs/swift-ast.macho.fat -no-output -verbose 2>&1 | FileCheck %s --check-prefix=TIMESTAMP -TIMESTAMP: Warning: Timestamp mismatch diff --git a/llvm/test/tools/dsymutil/Inputs/swift-ast.macho.fat b/llvm/test/tools/dsymutil/Inputs/swift-ast.macho.fat deleted file mode 100755 index a3f8d369d025..000000000000 Binary files a/llvm/test/tools/dsymutil/Inputs/swift-ast.macho.fat and /dev/null differ diff --git a/llvm/test/tools/dsymutil/X86/swift-ast-x86_64.test b/llvm/test/tools/dsymutil/X86/swift-ast-x86_64.test index 98d3850efb0c..72fc7520b73a 100644 --- a/llvm/test/tools/dsymutil/X86/swift-ast-x86_64.test +++ b/llvm/test/tools/dsymutil/X86/swift-ast-x86_64.test @@ -1,19 +1,14 @@ -RUN: llvm-dsymutil -oso-prepend-path %p/.. %p/../Inputs/swift-ast.macho.x86_64 -o %T/swift-ast.dSYM -verbose -no-swiftmodule-timestamp | FileCheck %s --check-prefix=DSYMUTIL +RUN: llvm-dsymutil -oso-prepend-path %p/.. %p/../Inputs/swift-ast.macho.x86_64 -o %T/swift-ast.dSYM -verbose | FileCheck %s --check-prefix=DSYMUTIL RUN: llvm-readobj -sections -section-data %T/swift-ast.dSYM/Contents/Resources/DWARF/swift-ast.macho.x86_64 | FileCheck %s --check-prefix=READOBJ The tested object file has been created by the dummy Swift code: let x = 1 -Compiled with: - swiftc /tmp/test.swift -Onone -target x86_64-apple-macosx10.9 -c - ld swift-ast.o -add_ast_path Inputs/swift-ast.swiftmodule -arch x86_64 -lSystem -macosx_version_min 10.9.0 +Compiled with: swiftc /tmp/test.swift -Onone -target x86_64-apple-macosx10.9 -c +Linked with: ld swift-ast.o -add_ast_path Inputs/swift-ast.swiftmodule -arch x86_64 -lSystem -macosx_version_min 10.9.0 DSYMUTIL: filename:{{.*}}swift-ast.swiftmodule DSYMUTIL: DEBUG MAP OBJECT:{{.*}}swift-ast.swiftmodule READOBJ: Name:{{.*}}__swift_ast READOBJ: |SWIFTMODULE DATA| -READOBJ-NEXT: |.| - -RUN: llvm-dsymutil -oso-prepend-path %p/.. %p/../Inputs/swift-ast.macho.x86_64 -no-output -verbose 2>&1 | FileCheck %s --check-prefix=TIMESTAMP -TIMESTAMP: Warning: Timestamp mismatch diff --git a/llvm/tools/dsymutil/BinaryHolder.h b/llvm/tools/dsymutil/BinaryHolder.h index 5b2061d23aac..f4ca0b2bc3a1 100644 --- a/llvm/tools/dsymutil/BinaryHolder.h +++ b/llvm/tools/dsymutil/BinaryHolder.h @@ -66,6 +66,12 @@ class BinaryHolder { MapArchiveAndGetMemberBuffers(StringRef Filename, sys::TimePoint Timestamp); + void changeBackingMemoryBuffer(std::unique_ptr &&MemBuf); + ErrorOr getObjfileForArch(const Triple &T); + +public: + BinaryHolder(bool Verbose) : Verbose(Verbose) {} + /// Return the MemoryBufferRef that holds the memory mapping for the /// given \p Filename. This function will try to parse archive /// member specifications of the form /path/to/archive.a(member.o). @@ -79,12 +85,6 @@ class BinaryHolder { GetMemoryBuffersForFile(StringRef Filename, sys::TimePoint Timestamp); - void changeBackingMemoryBuffer(std::unique_ptr &&MemBuf); - ErrorOr getObjfileForArch(const Triple &T); - -public: - BinaryHolder(bool Verbose) : Verbose(Verbose) {} - /// Get the ObjectFiles designated by the \p Filename. This /// might be an archive member specification of the form /// /path/to/archive.a(member.o). diff --git a/llvm/tools/dsymutil/DwarfLinker.cpp b/llvm/tools/dsymutil/DwarfLinker.cpp index d96f6e1ba0ed..4b3a336de0e7 100644 --- a/llvm/tools/dsymutil/DwarfLinker.cpp +++ b/llvm/tools/dsymutil/DwarfLinker.cpp @@ -525,8 +525,8 @@ public: /// Emit the string table described by \p Pool. void emitStrings(const NonRelocatableStringpool &Pool); - /// Emit the swift_ast section stored in \p Buffer. - void emitSwiftAST(StringRef Buffer); + /// Emit the swift_ast section stored in \p Buffers. + void emitSwiftAST(const std::vector &Buffers); /// Emit debug_ranges for \p FuncRange by translating the /// original \p Entries. @@ -712,11 +712,12 @@ void DwarfStreamer::emitStrings(const NonRelocatableStringpool &Pool) { } /// Emit the swift_ast section stored in \p Buffers. -void DwarfStreamer::emitSwiftAST(StringRef Buffer) { +void DwarfStreamer::emitSwiftAST(const std::vector &Buffers) { MCSection *SwiftASTSection = MOFI->getDwarfSwiftASTSection(); SwiftASTSection->setAlignment(1 << 5); MS->SwitchSection(SwiftASTSection); - MS->EmitBytes(Buffer); + for (auto Buf : Buffers) + MS->EmitBytes(Buf.getBuffer()); } /// Emit the debug_range section contents for \p FuncRange by @@ -3490,28 +3491,12 @@ bool DwarfLinker::link(const DebugMap &Map) { // N_AST objects (swiftmodule files) should get dumped directly into the // appropriate DWARF section. if (Obj->getType() == MachO::N_AST) { - StringRef File = Obj->getObjectFilename(); - auto ErrorOrMem = MemoryBuffer::getFile(File); - if (!ErrorOrMem) { - errs() << "Warning: Could not open " << File << "\n"; + auto ErrOrMemBufferRefs = BinHolder.GetMemoryBuffersForFile( + Obj->getObjectFilename(), Obj->getTimestamp()); + if (ErrOrMemBufferRefs.getError()) continue; - } - sys::fs::file_status Stat; - if (auto errc = sys::fs::status(File, Stat)) { - errs() << "Warning: " << errc.message() << "\n"; - continue; - } - if (!Options.NoTimestamp && Stat.getLastModificationTime() != - sys::TimePoint<>(Obj->getTimestamp())) { - errs() << "Warning: Timestamp mismatch for " << File << ": " - << Stat.getLastModificationTime() << " and " - << sys::TimePoint<>(Obj->getTimestamp()) << "\n"; - continue; - } - - // Copy the module into the .swift_ast section. if (!Options.NoOutput) - Streamer->emitSwiftAST((*ErrorOrMem)->getBuffer()); + Streamer->emitSwiftAST(ErrOrMemBufferRefs.get()); continue; } diff --git a/llvm/tools/dsymutil/dsymutil.cpp b/llvm/tools/dsymutil/dsymutil.cpp index 975f8a5f0950..51eb3ff2e39d 100644 --- a/llvm/tools/dsymutil/dsymutil.cpp +++ b/llvm/tools/dsymutil/dsymutil.cpp @@ -68,10 +68,7 @@ static opt NoOutput("no-output", desc("Do the link in memory, but do not emit the result file."), init(false), cat(DsymCategory)); -static opt - NoTimestamp("no-swiftmodule-timestamp", - desc("Don't check timestamp for swiftmodule files."), - init(false), cat(DsymCategory)); + static list ArchFlags( "arch", desc("Link DWARF debug information only for specified CPU architecture\n" @@ -269,7 +266,6 @@ int main(int argc, char **argv) { Options.Verbose = Verbose; Options.NoOutput = NoOutput; Options.NoODR = NoODR; - Options.NoTimestamp = NoTimestamp; Options.PrependPath = OsoPrependPath; llvm::InitializeAllTargetInfos(); diff --git a/llvm/tools/dsymutil/dsymutil.h b/llvm/tools/dsymutil/dsymutil.h index 8f5874210054..91cb32766129 100644 --- a/llvm/tools/dsymutil/dsymutil.h +++ b/llvm/tools/dsymutil/dsymutil.h @@ -25,13 +25,12 @@ namespace llvm { namespace dsymutil { struct LinkOptions { - bool Verbose; ///< Verbosity - bool NoOutput; ///< Skip emitting output - bool NoODR; ///< Do not unique types according to ODR - bool NoTimestamp; ///< Do not check swiftmodule timestamp + bool Verbose; ///< Verbosity + bool NoOutput; ///< Skip emitting output + bool NoODR; ///< Do not unique types according to ODR std::string PrependPath; ///< -oso-prepend-path - LinkOptions() : Verbose(false), NoOutput(false), NoTimestamp(false) {} + LinkOptions() : Verbose(false), NoOutput(false) {} }; /// \brief Extract the DebugMaps from the given file.