summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/test/Driver/clang-offload-bundler.c5
-rw-r--r--clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp9
2 files changed, 10 insertions, 4 deletions
diff --git a/clang/test/Driver/clang-offload-bundler.c b/clang/test/Driver/clang-offload-bundler.c
index fe8d51e7c6d..f551090dc43 100644
--- a/clang/test/Driver/clang-offload-bundler.c
+++ b/clang/test/Driver/clang-offload-bundler.c
@@ -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
diff --git a/clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp b/clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp
index 9f52790d55c..a1c7418e26a 100644
--- a/clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp
+++ b/clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp
@@ -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() {}
@@ -284,19 +285,19 @@ public:
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 {
OpenPOWER on IntegriCloud