I happened to see this today: https://github.com/dotnet/roslyn/issues/5940 It explains what to do if the pe timestamp field is a hash and not a real timestamp. We should make sure that lld does all this.
Now also documented at https://docs.microsoft.com/en-us/windows/desktop/Debug/pe-format#section-data : "The presence of an entry of type IMAGE_DEBUG_TYPE_REPRO indicates the PE file is built in a way to achieve determinism or reproducibility. If the input does not change, the output PE file is guaranteed to be bit-for-bit identical no matter when or where the PE is produced. Various date/time stamp fields in the PE file are filled with part or all the bits from a calculated hash value that uses PE file content as input, and therefore no longer represent the actual date and time when a PE file or related specific data within the PE is produced. The raw data of this debug entry may be empty, or may contain a calculated hash value preceded by a four-byte value that represents the hash value length." Looks like link.exe writes a 0-sized entry with /debug and a long hash without. Just always doing the 0-sized things for lld-link is probably fine. I'll try to make a patch.
Looks like llvm even knows the value already, see https://reviews.llvm.org/D20885?id=59297#inline-176515 , https://reviews.llvm.org/D20885 , r271549
https://reviews.llvm.org/D51652
https://reviews.llvm.org/rL341486 / https://reviews.llvm.org/rL341485