diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h index 018f03b211e42..7fdede98dd6c6 100644 --- a/lld/COFF/Config.h +++ b/lld/COFF/Config.h @@ -290,7 +290,7 @@ struct Configuration { uint32_t minorOSVersion = 0; uint32_t majorSubsystemVersion = 6; uint32_t minorSubsystemVersion = 0; - uint32_t timestamp = 0; + uint64_t timestamp = 0; uint32_t functionPadMin = 0; uint32_t timeTraceGranularity = 0; uint16_t dependentLoadFlags = 0; diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 22ee2f133be98..28770529a910e 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -1821,7 +1821,7 @@ void LinkerDriver::linkerMain(ArrayRef argsArr) { StringRef value(arg->getValue()); if (value.getAsInteger(0, config->timestamp)) fatal(Twine("invalid timestamp: ") + value + - ". Expected 32-bit integer"); + ". Expected 64-bit integer"); } } else { config->repro = false; @@ -1830,7 +1830,7 @@ void LinkerDriver::linkerMain(ArrayRef argsArr) { StringRef value(*epoch); if (value.getAsInteger(0, config->timestamp)) fatal(Twine("invalid SOURCE_DATE_EPOCH timestamp: ") + value + - ". Expected 32-bit integer"); + ". Expected 64-bit integer"); } else { config->timestamp = time(nullptr); } diff --git a/lld/ELF/Relocations.cpp b/lld/ELF/Relocations.cpp index f64b4219e0acc..38abbc981dbdc 100644 --- a/lld/ELF/Relocations.cpp +++ b/lld/ELF/Relocations.cpp @@ -1714,7 +1714,8 @@ void elf::postScanRelocations() { if (!sym.isDefined()) { replaceWithDefined(sym, *in.plt, target->pltHeaderSize + - target->pltEntrySize * sym.getPltIdx(), + (uint64_t)target->pltEntrySize * + sym.getPltIdx(), 0); sym.setFlags(NEEDS_COPY); if (config->emachine == EM_PPC) { diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp index cd2b9e22ab322..6fdc17b692acc 100644 --- a/lld/ELF/Symbols.cpp +++ b/lld/ELF/Symbols.cpp @@ -167,7 +167,7 @@ uint64_t Symbol::getGotVA() const { } uint64_t Symbol::getGotOffset() const { - return getGotIdx() * target->gotEntrySize; + return getGotIdx() * (uint64_t)target->gotEntrySize; } uint64_t Symbol::getGotPltVA() const { @@ -178,8 +178,9 @@ uint64_t Symbol::getGotPltVA() const { uint64_t Symbol::getGotPltOffset() const { if (isInIplt) - return getPltIdx() * target->gotEntrySize; - return (getPltIdx() + target->gotPltHeaderEntriesNum) * target->gotEntrySize; + return getPltIdx() * (uint64_t)target->gotEntrySize; + return (getPltIdx() + target->gotPltHeaderEntriesNum) * + (uint64_t)target->gotEntrySize; } uint64_t Symbol::getPltVA() const { diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp index bada394aa30d7..beedd0d0a4ffc 100644 --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -801,7 +801,7 @@ uint64_t MipsGotSection::getGlobalDynOffset(const InputFile *f, const Symbol &s) const { const FileGot &g = gots[f->mipsGotIndex]; Symbol *sym = const_cast(&s); - return g.dynTlsSymbols.lookup(sym) * config->wordsize; + return g.dynTlsSymbols.lookup(sym) * (uint64_t)config->wordsize; } const Symbol *MipsGotSection::getFirstGlobalEntry() const { diff --git a/lld/test/COFF/timestamp.test b/lld/test/COFF/timestamp.test index cc73af13c38ca..7a93b9208300a 100644 --- a/lld/test/COFF/timestamp.test +++ b/lld/test/COFF/timestamp.test @@ -13,8 +13,8 @@ RUN: env SOURCE_DATE_EPOCH=12345 lld-link %t.obj /debug /timestamp:0 /entry:main RUN: lld-link %t.obj /debug /timestamp:4294967295 /entry:main /nodefaultlib /out:%t.8.exe RUN: env SOURCE_DATE_EPOCH=4294967295 lld-link %t.obj /debug /entry:main /nodefaultlib /out:%t.9.exe # Test that setting UINT32_MAX+1 as timestamp fails. -RUN: env LLD_IN_TEST=1 not lld-link %t.obj /debug /timestamp:4294967296 /entry:main /nodefaultlib /out:%t.10.exe 2>&1 | FileCheck %s --check-prefix=ERROR -RUN: env SOURCE_DATE_EPOCH=4294967296 env LLD_IN_TEST=1 not lld-link %t.obj /debug /entry:main /nodefaultlib /out:%t.11.exe 2>&1 | FileCheck %s --check-prefix=ERROR2 +RUN: env LLD_IN_TEST=1 not lld-link %t.obj /debug /timestamp:18446744073709551616 /entry:main /nodefaultlib /out:%t.10.exe 2>&1 | FileCheck %s --check-prefix=ERROR +RUN: env SOURCE_DATE_EPOCH=18446744073709551616 env LLD_IN_TEST=1 not lld-link %t.obj /debug /entry:main /nodefaultlib /out:%t.11.exe 2>&1 | FileCheck %s --check-prefix=ERROR2 RUN: llvm-readobj --file-headers --coff-debug-directory %t.1.exe | FileCheck %s --check-prefix=HASH RUN: llvm-readobj --file-headers --coff-debug-directory %t.2.exe | FileCheck %s --check-prefix=HASH RUN: llvm-readobj --file-headers --coff-debug-directory %t.3.exe | FileCheck %s --check-prefix=ZERO @@ -41,5 +41,5 @@ LARGE: TimeDateStamp: 2038-01-19 03:14:07 (0x7FFFFFFF) LARGE: DebugDirectory [ LARGE: TimeDateStamp: 2038-01-19 03:14:07 (0x7FFFFFFF) -ERROR: error: invalid timestamp: 4294967296. Expected 32-bit integer -ERROR2: error: invalid SOURCE_DATE_EPOCH timestamp: 4294967296. Expected 32-bit integer +ERROR: error: invalid timestamp: 18446744073709551616. Expected 64-bit integer +ERROR2: error: invalid SOURCE_DATE_EPOCH timestamp: 18446744073709551616. Expected 64-bit integer