diff --git a/llvm/test/tools/llvm-objcopy/COFF/debug-dir-unmapped.test b/llvm/test/tools/llvm-objcopy/COFF/debug-dir-unmapped.test --- a/llvm/test/tools/llvm-objcopy/COFF/debug-dir-unmapped.test +++ b/llvm/test/tools/llvm-objcopy/COFF/debug-dir-unmapped.test @@ -6,7 +6,7 @@ # RUN: not llvm-objcopy --remove-section .rdata %t.in.exe %t.out.exe 2>&1 | FileCheck %s -# CHECK: error: '{{.*}}{{/|\\}}debug-dir-unmapped.test.tmp.out.exe': debug directory payload outside of mapped sections not supported +# CHECK: error: '{{.*}}{{/|\\}}debug-dir-unmapped.test.tmp.out.exe': debug directory payload not found --- !COFF OptionalHeader: diff --git a/llvm/test/tools/llvm-objcopy/COFF/debug-entry-no-payload.test b/llvm/test/tools/llvm-objcopy/COFF/debug-entry-no-payload.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/COFF/debug-entry-no-payload.test @@ -0,0 +1,56 @@ +## Check that llvm-objcopy does not produce an error for debug directory +## entries without a payload (e.g. IMAGE_DEBUG_TYPE_REPRO, +## IMAGE_DEBUG_TYPE_UNKNOWN) when patching entries that may have moved during +## a requested operation. Also check that the such debug entries are present +## in the output. + +## The code to patch debug entries is executed even when no operation is +## requested. Hence the RUN line below invokes llvm-objcopy without any +## arguments. + +# RUN: yaml2obj %s -o %t.in.exe +# RUN: llvm-objcopy %t.in.exe %t.out.exe +# RUN: llvm-readobj --coff-debug-directory %t.out.exe | FileCheck %s + +# CHECK: Type: Repro (0x10) +# CHECK: Type: Unknown (0x0) + +--- !COFF +OptionalHeader: + AddressOfEntryPoint: 4096 + ImageBase: 1073741824 + SectionAlignment: 4096 + FileAlignment: 512 + MajorOperatingSystemVersion: 6 + MinorOperatingSystemVersion: 0 + MajorImageVersion: 0 + MinorImageVersion: 0 + MajorSubsystemVersion: 6 + MinorSubsystemVersion: 0 + Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI + DLLCharacteristics: [ ] + SizeOfStackReserve: 1048576 + SizeOfStackCommit: 4096 + SizeOfHeapReserve: 1048576 + SizeOfHeapCommit: 4096 + Debug: + RelativeVirtualAddress: 8192 + Size: 56 +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [ ] +sections: + - Name: .text + Characteristics: [ ] + VirtualAddress: 4096 + VirtualSize: 3 + SectionData: 31C0C3 + - Name: .rdata + Characteristics: [ ] + VirtualAddress: 8192 + VirtualSize: 56 + ## '10' in SectionData below indicates the Repro type for the first debug + ## entry. The second entry has a type of Unknown ('00'). + SectionData: 0000000047F96B2000000000100000000000000000000000000000000000000047F96B200000000000000000000000000000000000000000 +symbols: [] +... diff --git a/llvm/tools/llvm-objcopy/COFF/Writer.cpp b/llvm/tools/llvm-objcopy/COFF/Writer.cpp --- a/llvm/tools/llvm-objcopy/COFF/Writer.cpp +++ b/llvm/tools/llvm-objcopy/COFF/Writer.cpp @@ -426,15 +426,13 @@ uint8_t *End = Ptr + Dir->Size; while (Ptr < End) { debug_directory *Debug = reinterpret_cast(Ptr); - if (!Debug->AddressOfRawData) - return createStringError(object_error::parse_failed, - "debug directory payload outside of " - "mapped sections not supported"); - if (Expected FilePosOrErr = - virtualAddressToFileAddress(Debug->AddressOfRawData)) - Debug->PointerToRawData = *FilePosOrErr; - else - return FilePosOrErr.takeError(); + if (Debug->PointerToRawData) { + if (Expected FilePosOrErr = + virtualAddressToFileAddress(Debug->AddressOfRawData)) + Debug->PointerToRawData = *FilePosOrErr; + else + return FilePosOrErr.takeError(); + } Ptr += sizeof(debug_directory); Offset += sizeof(debug_directory); }