--- /dev/null
+## 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: []
+...
uint8_t *End = Ptr + Dir->Size;
while (Ptr < End) {
debug_directory *Debug = reinterpret_cast<debug_directory *>(Ptr);
- if (!Debug->AddressOfRawData)
- return createStringError(object_error::parse_failed,
- "debug directory payload outside of "
- "mapped sections not supported");
- if (Expected<uint32_t> FilePosOrErr =
- virtualAddressToFileAddress(Debug->AddressOfRawData))
- Debug->PointerToRawData = *FilePosOrErr;
- else
- return FilePosOrErr.takeError();
+ if (Debug->PointerToRawData) {
+ if (Expected<uint32_t> FilePosOrErr =
+ virtualAddressToFileAddress(Debug->AddressOfRawData))
+ Debug->PointerToRawData = *FilePosOrErr;
+ else
+ return FilePosOrErr.takeError();
+ }
Ptr += sizeof(debug_directory);
Offset += sizeof(debug_directory);
}