Skip to content

Commit 9d8824e

Browse files
committed
[llvm][llvm-objdump] Fix fatbin handling on 32-bit systems
Which fixes a test failure seen on the bots, introduced by llvm#140286. [ RUN ] OffloadingBundleTest.checkExtractOffloadBundleFatBinary ObjectTests: ../llvm/llvm/include/llvm/ADT/StringRef.h:618: StringRef llvm::StringRef::drop_front(size_t) const: Assertion `size() >= N && "Dropping more elements than exist"' failed. 0 0x0a24a990 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/home/tcwg-buildbot/worker/clang-armv8-quick/stage1/unittests/Object/./ObjectTests+0x31a990) 1 0x0a248364 llvm::sys::RunSignalHandlers() (/home/tcwg-buildbot/worker/clang-armv8-quick/stage1/unittests/Object/./ObjectTests+0x318364) 2 0x0a24b410 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0 3 0xf46ed6f0 __default_rt_sa_restorer ./signal/../sysdeps/unix/sysv/linux/arm/sigrestorer.S:80:0 4 0xf46ddb06 ./csu/../sysdeps/unix/sysv/linux/arm/libc-do-syscall.S:47:0 5 0xf471d292 __pthread_kill_implementation ./nptl/pthread_kill.c:44:76 6 0xf46ec840 gsignal ./signal/../sysdeps/posix/raise.c:27:6 Also reported on 32-bit x86. The cause is that the code was casting the result of StringRef.find into an int64_t. The failure value of find is StringRef::npos, which is defined as: static constexpr size_t npos = ~size_t(0); So making that into an int64_t means it is > 0 and the code continued to search for bundles that didn't exist, at an offset beyond the largest file we could handle. I have changed the code to use size_t throughout, as this matches the APIs used, and it does not search backwards in the file so the offset does not need to be signed.
1 parent 062353d commit 9d8824e

File tree

1 file changed

+5
-7
lines changed

1 file changed

+5
-7
lines changed

llvm/lib/Object/OffloadBundle.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,11 @@ Error extractOffloadBundle(MemoryBufferRef Contents, uint64_t SectionOffset,
3838
StringRef FileName,
3939
SmallVectorImpl<OffloadBundleFatBin> &Bundles) {
4040

41-
uint64_t Offset = 0;
42-
int64_t NextbundleStart = 0;
41+
size_t Offset = 0;
42+
size_t NextbundleStart = 0;
4343

4444
// There could be multiple offloading bundles stored at this section.
45-
while (NextbundleStart >= 0) {
46-
45+
while (NextbundleStart != StringRef::npos) {
4746
std::unique_ptr<MemoryBuffer> Buffer =
4847
MemoryBuffer::getMemBuffer(Contents.getBuffer().drop_front(Offset), "",
4948
/*RequiresNullTerminator=*/false);
@@ -60,10 +59,9 @@ Error extractOffloadBundle(MemoryBufferRef Contents, uint64_t SectionOffset,
6059

6160
// Find the next bundle by searching for the magic string
6261
StringRef Str = Buffer->getBuffer();
63-
NextbundleStart =
64-
(int64_t)Str.find(StringRef("__CLANG_OFFLOAD_BUNDLE__"), 24);
62+
NextbundleStart = Str.find(StringRef("__CLANG_OFFLOAD_BUNDLE__"), 24);
6563

66-
if (NextbundleStart >= 0)
64+
if (NextbundleStart != StringRef::npos)
6765
Offset += NextbundleStart;
6866
}
6967

0 commit comments

Comments
 (0)