ABataev created this revision. ABataev added reviewers: yaxunl, tra, jlebar, hfinkel. Herald added a reviewer: jdoerfert. Herald added a project: clang.
Previously, object files were bundled using partial linking. It resulted in the following structure of the bundled objects: clang-offload-bundle __CLANG_OFFLOAD_BUNDLE__<target> <target_code> <host_code> But when we tried to unbundle object files, it worked correctly only for the target objects. The host object remain bundled. It produced a lot of junk sections in the host object files and in some cases may caused incorrect linking. Patch improves bundling of the object files. After this patch the bundled object looks like this: clang-offload-bundle __CLANG_OFFLOAD_BUNDLE__<target> <target_code> __CLANG_OFFLOAD_BUNDLE__<host> <host_code> With this structure we are able to unbundle the host object files too so that fter unbundling they are the same as were before. Repository: rC Clang https://reviews.llvm.org/D65819 Files: test/Driver/clang-offload-bundler.c test/Driver/clang-offload-bundler.c.o tools/clang-offload-bundler/ClangOffloadBundler.cpp Index: tools/clang-offload-bundler/ClangOffloadBundler.cpp =================================================================== --- tools/clang-offload-bundler/ClangOffloadBundler.cpp +++ tools/clang-offload-bundler/ClangOffloadBundler.cpp @@ -468,10 +468,7 @@ return; } - if (Content->size() < 2) - OS.write(Input.getBufferStart(), Input.getBufferSize()); - else - OS.write(Content->data(), Content->size()); + OS.write(Content->data(), Content->size()); } void WriteHeader(raw_fd_ostream &OS, @@ -539,12 +536,11 @@ OS.close(); SmallString<128> TargetName = getTriple(TargetNames[HostInputIndex]); std::vector<StringRef> ClangArgs = {"clang", - "-r", + "-c", "-target", TargetName.c_str(), "-o", OutputFileNames.front().c_str(), - InputFileNames[HostInputIndex].c_str(), BitcodeFileName.c_str(), "-nostdlib"}; @@ -593,15 +589,10 @@ // bundling into (the host input), this is just a place-holder, so a single // byte is sufficient. assert(HostInputIndex != ~0u && "Host input index undefined??"); - Constant *Content; - if (NumberOfProcessedInputs == HostInputIndex + 1) { - uint8_t Byte[] = {0}; - Content = ConstantDataArray::get(VMContext, Byte); - } else - Content = ConstantDataArray::get( - VMContext, ArrayRef<uint8_t>(reinterpret_cast<const uint8_t *>( - Input.getBufferStart()), - Input.getBufferSize())); + auto *Content = ConstantDataArray::get( + VMContext, ArrayRef<uint8_t>(reinterpret_cast<const uint8_t *>( + Input.getBufferStart()), + Input.getBufferSize())); // Create the global in the desired section. We don't want these globals in // the symbol table, so we mark them private. Index: test/Driver/clang-offload-bundler.c =================================================================== --- test/Driver/clang-offload-bundler.c +++ test/Driver/clang-offload-bundler.c @@ -229,17 +229,18 @@ // RUN: clang-offload-bundler -type=o -targets=host-powerpc64le-ibm-linux-gnu,openmp-powerpc64le-ibm-linux-gnu,openmp-x86_64-pc-linux-gnu -inputs=%t.o,%t.tgt1,%t.tgt2 -outputs=%t.bundle3.o -### -dump-temporary-files 2>&1 \ // RUN: | FileCheck %s --check-prefix CK-OBJ-CMD -// CK-OBJ-CMD: private constant [1 x i8] zeroinitializer, section "__CLANG_OFFLOAD_BUNDLE__host-powerpc64le-ibm-linux-gnu" +// CK-OBJ-CMD: private constant [{{[0-9]+}} x i8] c"{{.+}}", section "__CLANG_OFFLOAD_BUNDLE__host-powerpc64le-ibm-linux-gnu" // CK-OBJ-CMD: private constant [{{[0-9]+}} x i8] c"Content of device file 1{{.+}}", section "__CLANG_OFFLOAD_BUNDLE__openmp-powerpc64le-ibm-linux-gnu" // CK-OBJ-CMD: private constant [{{[0-9]+}} x i8] c"Content of device file 2{{.+}}", section "__CLANG_OFFLOAD_BUNDLE__openmp-x86_64-pc-linux-gnu" -// CK-OBJ-CMD: clang{{(.exe)?}}" "-r" "-target" "powerpc64le-ibm-linux-gnu" "-o" "{{.+}}.o" "{{.+}}.o" "{{.+}}.bc" "-nostdlib" +// CK-OBJ-CMD: clang{{(.exe)?}}" "-c" "-target" "powerpc64le-ibm-linux-gnu" "-o" "{{.+}}.o" "{{.+}}.bc" "-nostdlib" -// RUN: clang-offload-bundler -type=o -targets=host-powerpc64le-ibm-linux-gnu,openmp-powerpc64le-ibm-linux-gnu,openmp-x86_64-pc-linux-gnu -outputs=%t.res.o,%t.res.tgt1,%t.res.tgt2 -inputs=%s.o -unbundle -// RUN: diff %s.o %t.res.o +// RUN: clang-offload-bundler -type=o -targets=host-powerpc64le-ibm-linux-gnu,openmp-powerpc64le-ibm-linux-gnu,openmp-x86_64-pc-linux-gnu -inputs=%t.o,%t.tgt1,%t.tgt2 -outputs=%t.bundle3.o +// RUN: clang-offload-bundler -type=o -targets=host-powerpc64le-ibm-linux-gnu,openmp-powerpc64le-ibm-linux-gnu,openmp-x86_64-pc-linux-gnu -outputs=%t.res.o,%t.res.tgt1,%t.res.tgt2 -inputs=%t.bundle3.o -unbundle +// RUN: diff %t.o %t.res.o // RUN: diff %t.tgt1 %t.res.tgt1 // RUN: diff %t.tgt2 %t.res.tgt2 -// RUN: clang-offload-bundler -type=o -targets=openmp-powerpc64le-ibm-linux-gnu,host-powerpc64le-ibm-linux-gnu,openmp-x86_64-pc-linux-gnu -outputs=%t.res.tgt1,%t.res.o,%t.res.tgt2 -inputs=%s.o -unbundle -// RUN: diff %s.o %t.res.o +// RUN: clang-offload-bundler -type=o -targets=openmp-powerpc64le-ibm-linux-gnu,host-powerpc64le-ibm-linux-gnu,openmp-x86_64-pc-linux-gnu -outputs=%t.res.tgt1,%t.res.o,%t.res.tgt2 -inputs=%t.bundle3.o -unbundle +// RUN: diff %t.o %t.res.o // RUN: diff %t.tgt1 %t.res.tgt1 // RUN: diff %t.tgt2 %t.res.tgt2
Index: tools/clang-offload-bundler/ClangOffloadBundler.cpp =================================================================== --- tools/clang-offload-bundler/ClangOffloadBundler.cpp +++ tools/clang-offload-bundler/ClangOffloadBundler.cpp @@ -468,10 +468,7 @@ return; } - if (Content->size() < 2) - OS.write(Input.getBufferStart(), Input.getBufferSize()); - else - OS.write(Content->data(), Content->size()); + OS.write(Content->data(), Content->size()); } void WriteHeader(raw_fd_ostream &OS, @@ -539,12 +536,11 @@ OS.close(); SmallString<128> TargetName = getTriple(TargetNames[HostInputIndex]); std::vector<StringRef> ClangArgs = {"clang", - "-r", + "-c", "-target", TargetName.c_str(), "-o", OutputFileNames.front().c_str(), - InputFileNames[HostInputIndex].c_str(), BitcodeFileName.c_str(), "-nostdlib"}; @@ -593,15 +589,10 @@ // bundling into (the host input), this is just a place-holder, so a single // byte is sufficient. assert(HostInputIndex != ~0u && "Host input index undefined??"); - Constant *Content; - if (NumberOfProcessedInputs == HostInputIndex + 1) { - uint8_t Byte[] = {0}; - Content = ConstantDataArray::get(VMContext, Byte); - } else - Content = ConstantDataArray::get( - VMContext, ArrayRef<uint8_t>(reinterpret_cast<const uint8_t *>( - Input.getBufferStart()), - Input.getBufferSize())); + auto *Content = ConstantDataArray::get( + VMContext, ArrayRef<uint8_t>(reinterpret_cast<const uint8_t *>( + Input.getBufferStart()), + Input.getBufferSize())); // Create the global in the desired section. We don't want these globals in // the symbol table, so we mark them private. Index: test/Driver/clang-offload-bundler.c =================================================================== --- test/Driver/clang-offload-bundler.c +++ test/Driver/clang-offload-bundler.c @@ -229,17 +229,18 @@ // RUN: clang-offload-bundler -type=o -targets=host-powerpc64le-ibm-linux-gnu,openmp-powerpc64le-ibm-linux-gnu,openmp-x86_64-pc-linux-gnu -inputs=%t.o,%t.tgt1,%t.tgt2 -outputs=%t.bundle3.o -### -dump-temporary-files 2>&1 \ // RUN: | FileCheck %s --check-prefix CK-OBJ-CMD -// CK-OBJ-CMD: private constant [1 x i8] zeroinitializer, section "__CLANG_OFFLOAD_BUNDLE__host-powerpc64le-ibm-linux-gnu" +// CK-OBJ-CMD: private constant [{{[0-9]+}} x i8] c"{{.+}}", section "__CLANG_OFFLOAD_BUNDLE__host-powerpc64le-ibm-linux-gnu" // CK-OBJ-CMD: private constant [{{[0-9]+}} x i8] c"Content of device file 1{{.+}}", section "__CLANG_OFFLOAD_BUNDLE__openmp-powerpc64le-ibm-linux-gnu" // CK-OBJ-CMD: private constant [{{[0-9]+}} x i8] c"Content of device file 2{{.+}}", section "__CLANG_OFFLOAD_BUNDLE__openmp-x86_64-pc-linux-gnu" -// CK-OBJ-CMD: clang{{(.exe)?}}" "-r" "-target" "powerpc64le-ibm-linux-gnu" "-o" "{{.+}}.o" "{{.+}}.o" "{{.+}}.bc" "-nostdlib" +// CK-OBJ-CMD: clang{{(.exe)?}}" "-c" "-target" "powerpc64le-ibm-linux-gnu" "-o" "{{.+}}.o" "{{.+}}.bc" "-nostdlib" -// RUN: clang-offload-bundler -type=o -targets=host-powerpc64le-ibm-linux-gnu,openmp-powerpc64le-ibm-linux-gnu,openmp-x86_64-pc-linux-gnu -outputs=%t.res.o,%t.res.tgt1,%t.res.tgt2 -inputs=%s.o -unbundle -// RUN: diff %s.o %t.res.o +// RUN: clang-offload-bundler -type=o -targets=host-powerpc64le-ibm-linux-gnu,openmp-powerpc64le-ibm-linux-gnu,openmp-x86_64-pc-linux-gnu -inputs=%t.o,%t.tgt1,%t.tgt2 -outputs=%t.bundle3.o +// RUN: clang-offload-bundler -type=o -targets=host-powerpc64le-ibm-linux-gnu,openmp-powerpc64le-ibm-linux-gnu,openmp-x86_64-pc-linux-gnu -outputs=%t.res.o,%t.res.tgt1,%t.res.tgt2 -inputs=%t.bundle3.o -unbundle +// RUN: diff %t.o %t.res.o // RUN: diff %t.tgt1 %t.res.tgt1 // RUN: diff %t.tgt2 %t.res.tgt2 -// RUN: clang-offload-bundler -type=o -targets=openmp-powerpc64le-ibm-linux-gnu,host-powerpc64le-ibm-linux-gnu,openmp-x86_64-pc-linux-gnu -outputs=%t.res.tgt1,%t.res.o,%t.res.tgt2 -inputs=%s.o -unbundle -// RUN: diff %s.o %t.res.o +// RUN: clang-offload-bundler -type=o -targets=openmp-powerpc64le-ibm-linux-gnu,host-powerpc64le-ibm-linux-gnu,openmp-x86_64-pc-linux-gnu -outputs=%t.res.tgt1,%t.res.o,%t.res.tgt2 -inputs=%t.bundle3.o -unbundle +// RUN: diff %t.o %t.res.o // RUN: diff %t.tgt1 %t.res.tgt1 // RUN: diff %t.tgt2 %t.res.tgt2
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits