[Driver][Bundler] Improve bundling of object files.
authorAlexey Bataev <a.bataev@hotmail.com>
Thu, 15 Aug 2019 17:15:35 +0000 (17:15 +0000)
committerAlexey Bataev <a.bataev@hotmail.com>
Thu, 15 Aug 2019 17:15:35 +0000 (17:15 +0000)
commit4fb80d56db626762dc37e4516d1a269ea974229a
tree9493e674303a60388ac2be0f812b204aca6c4c20
parent8d3a1523dd96968c75987620374bfc78c45ee279
[Driver][Bundler] Improve bundling of object files.

Summary:
Previously, object files were bundled using partial linking. It resulted
in the following structure of the bundled objects:
```
<host_code>
clang-offload-bundle
__CLANG_OFFLOAD_BUNDLE__<target>
<target_code>
```
But when we tried to unbundle object files, it worked correctly only for
the target objects. The host object remains 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:

```
<host_code>
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 after unbundling they are the same as were before.
The host section is bundled twice. The bundled section is used to
unbundle the original host section.

Reviewers: yaxunl, tra, jlebar, hfinkel, jdoerfert

Subscribers: caomhin, kkwli0, cfe-commits

Tags: #clang

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

llvm-svn: 369019
clang/test/Driver/clang-offload-bundler.c
clang/tools/clang-offload-bundler/ClangOffloadBundler.cpp