Skip to content

Commit

Permalink
[Clang][Bundler] Fix for a hang when unbundling fat binary
Browse files Browse the repository at this point in the history
clang-offload-bundler tool may hang under certain conditions when it extracts a subset of all available device bundles from the fat binary that is handled by the BinaryFileHandler. This patch fixes this problem.

Differential Revision: https://reviews.llvm.org/D66598

llvm-svn: 370115
  • Loading branch information
sndmitriev committed Aug 27, 2019
1 parent 5bbb604 commit 4368971
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 4 deletions.
5 changes: 5 additions & 0 deletions clang/test/Driver/clang-offload-bundler.c
Expand Up @@ -221,6 +221,11 @@
// RUN: diff %t.empty %t.res.tgt1
// RUN: diff %t.empty %t.res.tgt2

// Check that we do not have to unbundle all available bundles from the fat binary.
// RUN: clang-offload-bundler -type=ast -targets=host-%itanium_abi_triple,openmp-x86_64-pc-linux-gnu -outputs=%t.res.ast,%t.res.tgt2 -inputs=%t.bundle3.unordered.ast -unbundle
// RUN: diff %t.ast %t.res.ast
// RUN: diff %t.tgt2 %t.res.tgt2

//
// Check object bundle/unbundle. The content should be bundled into an ELF
// section (we are using a PowerPC little-endian host which uses ELF). We
Expand Down
9 changes: 5 additions & 4 deletions clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp
Expand Up @@ -215,6 +215,7 @@ class BinaryFileHandler final : public FileHandler {

/// Iterator for the bundle information that is being read.
StringMap<BundleInfo>::iterator CurBundleInfo;
StringMap<BundleInfo>::iterator NextBundleInfo;

public:
BinaryFileHandler() : FileHandler() {}
Expand Down Expand Up @@ -284,19 +285,19 @@ class BinaryFileHandler final : public FileHandler {
BundlesInfo[Triple] = BundleInfo(Size, Offset);
}
// Set the iterator to where we will start to read.
CurBundleInfo = BundlesInfo.begin();
CurBundleInfo = BundlesInfo.end();
NextBundleInfo = BundlesInfo.begin();
}

StringRef ReadBundleStart(MemoryBuffer &Input) final {
if (CurBundleInfo == BundlesInfo.end())
if (NextBundleInfo == BundlesInfo.end())
return StringRef();

CurBundleInfo = NextBundleInfo++;
return CurBundleInfo->first();
}

void ReadBundleEnd(MemoryBuffer &Input) final {
assert(CurBundleInfo != BundlesInfo.end() && "Invalid reader info!");
++CurBundleInfo;
}

void ReadBundle(raw_fd_ostream &OS, MemoryBuffer &Input) final {
Expand Down

0 comments on commit 4368971

Please sign in to comment.