sdmitriev created this revision. sdmitriev added a reviewer: ABataev. Herald added a reviewer: jdoerfert. Herald added a project: clang. Herald added a subscriber: cfe-commits.
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. Repository: rC Clang https://reviews.llvm.org/D66598 Files: clang/test/Driver/clang-offload-bundler.c clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp Index: clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp =================================================================== --- clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp +++ clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp @@ -231,6 +231,7 @@ /// Iterator for the bundle information that is being read. StringMap<BundleInfo>::iterator CurBundleInfo; + StringMap<BundleInfo>::iterator NextBundleInfo; public: BinaryFileHandler() : FileHandler() {} @@ -300,13 +301,14 @@ 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(); } Index: clang/test/Driver/clang-offload-bundler.c =================================================================== --- clang/test/Driver/clang-offload-bundler.c +++ 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
Index: clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp =================================================================== --- clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp +++ clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp @@ -231,6 +231,7 @@ /// Iterator for the bundle information that is being read. StringMap<BundleInfo>::iterator CurBundleInfo; + StringMap<BundleInfo>::iterator NextBundleInfo; public: BinaryFileHandler() : FileHandler() {} @@ -300,13 +301,14 @@ 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(); } Index: clang/test/Driver/clang-offload-bundler.c =================================================================== --- clang/test/Driver/clang-offload-bundler.c +++ 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
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits