[llvm-dev] Difference when compiling human readable IR vs bitcode with clang frontend

via llvm-dev
Fri, 18 Jan 2019 17:09:20 -0000

> -----Original Message-----
> From: llvm-dev [mailto:llvm-dev-bounces at lists.llvm.org] On Behalf Of
> Dennis Frett via llvm-dev
> Sent: Friday, January 18, 2019 4:15 AM
> To: llvm-dev at lists.llvm.org
> Subject: [llvm-dev] Difference when compiling human readable IR vs bitcode
> with clang frontend
>
> We've noticed a difference in the embedded bitcode when compiling human
> readable IR to an object directly vs first compiling IR to BC and then an
> object through clang -cc1.
> If the original IR file contained an "llvm.compiler.used" gv, it
will be
> preserved when compiling IR -> BC -> Obj.
> When compiling IR -> Obj directly, it will be removed.
>
> This difference does not exist for the "llvm.used" gv however, it
is
> always preserved.
> This questions seems related to the following lit test in LLVM:
> https://github.com/llvm-
> mirror/llvm/blob/master/test/Transforms/GlobalOpt/compiler-used.ll.
>
> Is this somehow expected behaviour?

I am curious what happens if you do IR -> BC -> IR -> BC; I'd
expect
the IR to more-or-less match (the differences all being due to one
is hand-written and one is a disassembly) and the two BC files should
be identical.

If not (and I'm am guessing they aren't, which is why you see some
differences in the compiled object file) that's a bug.
--paulr

>
> Reproduce:
> Source taken from the lit test.
>
> define void @foo() {
>   ret void
> }
>
> @llvm.used = appending global [1 x i8*] [i8* bitcast (void ()* @foo to
> i8*)], section "llvm.metadata"
> @llvm.compiler.used = appending global [1 x i8*] [i8* bitcast (void ()*
> @foo to i8*)], section "llvm.metadata"
>
>
> # Compile IR -> Obj directly.
> clang -cc1 -triple x86_64-apple-macosx10.13.0 -emit-obj -fembed-
> bitcode=all -x ir test.ll -o test_ll.o
>
> # Compile IR -> BC -> Obj.
> clang -cc1 -triple x86_64-apple-macosx10.13.0 -emit-llvm-bc -fblocks -
> fencode-extended-block-signature -x ir test.ll  -o test.bc
> clang -cc1 -triple x86_64-apple-macosx10.13.0 -emit-obj -fembed-
> bitcode=all -x ir test.bc -o test_bc.o
>
> # Extract and disassemble embedded bitcode from both scenarios.
> segedit test_bc.o -extract __LLVM __bitcode bc_bc.bc
> segedit test_ll.o -extract __LLVM __bitcode ll_bc.bc
> llvm-dis bc_bc.bc
> llvm-dis ll_bc.bc
>
> # Diff both IR files to show that only bc_bc.ll contains
> "llvm.compiler.used"
> diff bc_bc.ll ll_bc.ll
>
> - Dennis Frett