[PATCH] D16564: Fix an issue where backend crashes after frontend emits an error message

Justin Bogner via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 28 09:53:28 PST 2016


Manman Ren via cfe-commits <cfe-commits at lists.llvm.org> writes:
> manmanren created this revision.
> manmanren added reviewers: echristo, rafael, ahatanak.
> manmanren added a subscriber: cfe-commits.
>
> It can happen that frontend emits error message when releasing the
> builder. When that happens, we emit the error message and continue to
> invoke backend.
> Backend will then crash.
>
> The fix is quite simple, we check for errors after releasing the builder.
>
> http://reviews.llvm.org/D16564
>
> Files:
>   lib/CodeGen/ModuleBuilder.cpp
>   test/CodeGen/target-builtin-error-3.c
>
>
> Index: test/CodeGen/target-builtin-error-3.c
> ===================================================================
> --- test/CodeGen/target-builtin-error-3.c
> +++ test/CodeGen/target-builtin-error-3.c
> @@ -0,0 +1,28 @@
> +// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin -S -verify -o - -target-feature +avx
> +
> +// RUN: not %clang_cc1 %s -triple=x86_64-apple-darwin -emit-obj -target-feature +avx 2> %t.err
> +// RUN: FileCheck < %t.err %s
> +// CHECK: 1 error generated
> +
> +typedef unsigned short uint16_t;
> +typedef long long __m128i __attribute__((__vector_size__(16)));
> +typedef float __v8sf __attribute__ ((__vector_size__ (32)));
> +typedef float __m256 __attribute__ ((__vector_size__ (32)));
> +typedef uint16_t half;
> +typedef __attribute__ ((ext_vector_type( 8),__aligned__( 16))) half half8;
> +typedef __attribute__ ((ext_vector_type(16),__aligned__( 32))) half half16;
> +typedef __attribute__ ((ext_vector_type(16),__aligned__( 2))) half half16U;
> +typedef __attribute__ ((ext_vector_type( 8),__aligned__( 32))) float float8;
> +typedef __attribute__ ((ext_vector_type(16),__aligned__( 64))) float float16;
> +static inline half8 __attribute__((__overloadable__)) convert_half( float8 a ) {
> +  return __extension__ ({ __m256 __a = (a); (__m128i)__builtin_ia32_vcvtps2ph256((__v8sf)__a, (0x00)); }); // expected-error {{'__builtin_ia32_vcvtps2ph256' needs target feature f16c}}
> +}
> +static inline half16 __attribute__((__overloadable__)) convert_half( float16 a ) {
> +  half16 r; 
> +  r.lo = convert_half( a.lo); 
> +  return r;
> +}
> +void avx_test( uint16_t *destData, float16 argbF)
> +{
> +   ((half16U*)destData)[0] = convert_half(argbF);
> +}
> Index: lib/CodeGen/ModuleBuilder.cpp
> ===================================================================
> --- lib/CodeGen/ModuleBuilder.cpp
> +++ lib/CodeGen/ModuleBuilder.cpp
> @@ -208,6 +208,14 @@
>  
>        if (Builder)
>          Builder->Release();
> +
> +      // Builder->Release can cause diagnostics to be generated.

This comment's a bit confusing. Isn't it more like "If errors occurred
while building the module, we need to stop here before invoking the
backend", or something like that?

> +      if (Diags.hasErrorOccurred()) {
> +        if (Builder)
> +          Builder->clear();
> +        M.reset();
> +        return;
> +      }
>      }
>  
>      void CompleteTentativeDefinition(VarDecl *D) override {
>


More information about the cfe-commits mailing list