Bug#909234: clang-7: clang::ast_matchers::MatchFinder::MatchFinder is miscompiled

Sylvestre Ledru sylvestre at debian.org
Thu Sep 20 09:33:28 BST 2018


Hello,

This was built using the gcc in unstable (gcc-8_8.2.0-6). I will upload a new version later (and upload the source packages).

Doko, does it ring a bell?

And I agree that I should move to a two stages build (yeah, more compilation time!)

Cheers,
Sylvestre

Le 20/09/2018 à 06:43, Mike Hommey a écrit :
> Package: clang-7
> Version: 1:7-1
> Severity: normal
> 
> Dear Maintainer,
> 
> Using a clang plugin that creates a MatchFinder crashes. One way to
> reproduce is to get the Firefox source code from
> https://hg.mozilla.org/mozilla-central, create a .mozconfig file with
> the following contents:
>   ac_add_options --enable-clang-plugin
>   ac_add_options CC=clang-7
>   ac_add_options LLVM_CONFIG=llvm-config-7
> 
> and run ./mach build
> 
> This results in the compiler crashing when it uses the plugin.
> 
> The constructor C++ code is:
> 
>   MatchFinder::MatchFinder(MatchFinderOptions Options)
>       : Options(std::move(Options)), ParsingDone(nullptr) {}
> 
> where MatchFinderOptions is defined as:
> 
>   struct MatchFinderOptions {
>     struct Profiling {
>       Profiling(llvm::StringMap<llvm::TimeRecord> &Records)
>           : Records(Records) {}
> 
>       /// Per bucket timing information.
>       llvm::StringMap<llvm::TimeRecord> &Records;
>     };
> 
>     /// Enables per-check timers.
>     ///
>     /// It prints a report after match.
>     llvm::Optional<Profiling> CheckProfiling;
>   };
> 
> I won't go on detailing how Optional is defined, but the point is
> MatchFinderOptions, and thus the Optional is passed by value.
> 
> But the function as it appears in the clang-7 executable looks like:
> 
>   lea    0xb0(%rdi),%rax
>   movq   $0x0,(%rdi)
>   mov    %rax,0x90(%rdi)
>   mov    %rax,0x98(%rdi)
>   movzbl 0x8(%rsi),%eax
>   movq   $0x0,0x8(%rdi)
>   movq   $0x0,0x10(%rdi)
>   movq   $0x0,0x18(%rdi)
>   movq   $0x0,0x20(%rdi)
>   (...)
>   mov    %al,0x138(%rdi)
>   test   %al,%al
>   je     <_ZN5clang12ast_matchers11MatchFinderC2ENS1_18MatchFinderOptionsE+215>
>   mov    (%rsi),%rax
>   mov    %rax,0x130(%rdi)
>   movq   $0x0,0x140(%rdi)
>   retq   
> 
> The crashing instruction is the movzbl, which tries to dereference %rsi
> as a pointer, and its value is 0. What's happening here, essentially, is
> that it's compiled with the assumption that %rsi is a pointer to the
> MatchFinderOptions. That's clearly not what's supposed to happen given
> the C++ code.
> 
> As bootstrapped by clang-7 itself, the same function is compiled as
>   lea    0xb0(%rdi),%rax
>   xorps  %xmm0,%xmm0
>   movups %xmm0,0x80(%rdi)
>   (...)
>   movups %xmm0,(%rdi)
>   mov    %rax,0x90(%rdi)
>   mov    %rax,0x98(%rdi)
>   movq   $0x10,0xa0(%rdi)
>   movl   $0x0,0xa8(%rdi)
>   mov    %rsi,0x130(%rdi)
>   mov    %dl,0x138(%rdi)
>   movq   $0x0,0x140(%rdi)
>   retq   
> 
> which is compiled with the assumption that %rsi and %rdx (really %rdl)
> represent the value of the MatchFinderOptions.
> 
> Interestingly, there's already a #ifdef in Optional.h in llvm to disable
> some code for GCC because it miscompiles it. It looks like things got
> worse.
> 
> It feels like the clang package should be bootstrapped in 2 stages...
> 
> I'd file a GCC upstream bug for the miscompilation, but as the package
> wasn't built on buildds, buildd.debian.org doesn't contain logs that
> could tell me what specific version was used.
> 
> Mike
> 
> -- System Information:
> Debian Release: buster/sid
>   APT prefers unstable-debug
>   APT policy: (500, 'unstable-debug'), (500, 'unstable'), (500, 'testing'), (1, 'experimental-debug'), (1, 'experimental')
> Architecture: amd64 (x86_64)
> Foreign Architectures: i386
> 
> Kernel: Linux 4.17.0-1-amd64 (SMP w/4 CPU cores)
> Locale: LANG=ja_JP.UTF-8, LC_CTYPE=ja_JP.UTF-8 (charmap=UTF-8), LANGUAGE=ja_JP.UTF-8 (charmap=UTF-8)
> Shell: /bin/sh linked to /bin/dash
> Init: systemd (via /run/systemd/system)
> LSM: AppArmor: enabled
> 
> Versions of packages clang-7 depends on:
> ii  binutils               2.31.1-4
> ii  libc6                  2.27-5
> ii  libc6-dev              2.27-5
> ii  libclang-common-7-dev  1:7-1
> ii  libclang1-7            1:7-1
> ii  libgcc-8-dev           8.2.0-3
> ii  libgcc1                1:8.2.0-3
> ii  libllvm7               1:7-1
> ii  libobjc-8-dev          8.2.0-3
> ii  libstdc++-8-dev        8.2.0-3
> ii  libstdc++6             8.2.0-3
> 
> Versions of packages clang-7 recommends:
> ii  libomp-dev  6.0.1-1
> ii  llvm-7-dev  1:7-1
> ii  python      2.7.15-3
> 
> Versions of packages clang-7 suggests:
> pn  clang-7-doc  <none>
> 
> -- no debconf information
> 



More information about the Pkg-llvm-team mailing list