r188707 - PR16933: Don't try to codegen things after we've seen errors.

David Blaikie dblaikie at gmail.com
Tue Aug 20 15:04:22 PDT 2013


On Mon, Aug 19, 2013 at 2:02 PM, David Blaikie <dblaikie at gmail.com> wrote:
> Author: dblaikie
> Date: Mon Aug 19 16:02:26 2013
> New Revision: 188707
>
> URL: http://llvm.org/viewvc/llvm-project?rev=188707&view=rev
> Log:
> PR16933: Don't try to codegen things after we've seen errors.
>
> Refactor the underlying code a bit to remove unnecessary calls to
> "hasErrorOccurred" & make them consistently at all the entry points to
> the IRGen ASTConsumer.

Added missing test in r188836.

>
> Modified:
>     cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
>     cfe/trunk/lib/CodeGen/CodeGenFunction.h
>     cfe/trunk/lib/CodeGen/CodeGenModule.cpp
>     cfe/trunk/lib/CodeGen/CodeGenModule.h
>     cfe/trunk/lib/CodeGen/ModuleBuilder.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=188707&r1=188706&r2=188707&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Mon Aug 19 16:02:26 2013
> @@ -953,9 +953,8 @@ void CodeGenFunction::EmitBranchOnBoolEx
>
>  /// ErrorUnsupported - Print out an error that codegen doesn't support the
>  /// specified stmt yet.
> -void CodeGenFunction::ErrorUnsupported(const Stmt *S, const char *Type,
> -                                       bool OmitOnError) {
> -  CGM.ErrorUnsupported(S, Type, OmitOnError);
> +void CodeGenFunction::ErrorUnsupported(const Stmt *S, const char *Type) {
> +  CGM.ErrorUnsupported(S, Type);
>  }
>
>  /// emitNonZeroVLAInit - Emit the "zero" initialization of a
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=188707&r1=188706&r2=188707&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Mon Aug 19 16:02:26 2013
> @@ -1327,8 +1327,7 @@ public:
>
>    /// ErrorUnsupported - Print out an error that codegen doesn't support the
>    /// specified stmt yet.
> -  void ErrorUnsupported(const Stmt *S, const char *Type,
> -                        bool OmitOnError=false);
> +  void ErrorUnsupported(const Stmt *S, const char *Type);
>
>    //===--------------------------------------------------------------------===//
>    //                                  Helpers
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=188707&r1=188706&r2=188707&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Mon Aug 19 16:02:26 2013
> @@ -264,10 +264,7 @@ void CodeGenModule::Error(SourceLocation
>
>  /// ErrorUnsupported - Print out an error that codegen doesn't support the
>  /// specified stmt yet.
> -void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type,
> -                                     bool OmitOnError) {
> -  if (OmitOnError && getDiags().hasErrorOccurred())
> -    return;
> +void CodeGenModule::ErrorUnsupported(const Stmt *S, const char *Type) {
>    unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
>                                                 "cannot compile this %0 yet");
>    std::string Msg = Type;
> @@ -277,10 +274,7 @@ void CodeGenModule::ErrorUnsupported(con
>
>  /// ErrorUnsupported - Print out an error that codegen doesn't support the
>  /// specified decl yet.
> -void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type,
> -                                     bool OmitOnError) {
> -  if (OmitOnError && getDiags().hasErrorOccurred())
> -    return;
> +void CodeGenModule::ErrorUnsupported(const Decl *D, const char *Type) {
>    unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
>                                                 "cannot compile this %0 yet");
>    std::string Msg = Type;
> @@ -2796,12 +2790,6 @@ void CodeGenModule::EmitLinkageSpec(cons
>
>  /// EmitTopLevelDecl - Emit code for a single top level declaration.
>  void CodeGenModule::EmitTopLevelDecl(Decl *D) {
> -  // If an error has occurred, stop code generation, but continue
> -  // parsing and semantic analysis (to ensure all warnings and errors
> -  // are emitted).
> -  if (Diags.hasErrorOccurred())
> -    return;
> -
>    // Ignore dependent declarations.
>    if (D->getDeclContext() && D->getDeclContext()->isDependentContext())
>      return;
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=188707&r1=188706&r2=188707&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenModule.h (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenModule.h Mon Aug 19 16:02:26 2013
> @@ -852,17 +852,11 @@ public:
>
>    /// ErrorUnsupported - Print out an error that codegen doesn't support the
>    /// specified stmt yet.
> -  /// \param OmitOnError - If true, then this error should only be emitted if no
> -  /// other errors have been reported.
> -  void ErrorUnsupported(const Stmt *S, const char *Type,
> -                        bool OmitOnError=false);
> +  void ErrorUnsupported(const Stmt *S, const char *Type);
>
>    /// ErrorUnsupported - Print out an error that codegen doesn't support the
>    /// specified decl yet.
> -  /// \param OmitOnError - If true, then this error should only be emitted if no
> -  /// other errors have been reported.
> -  void ErrorUnsupported(const Decl *D, const char *Type,
> -                        bool OmitOnError=false);
> +  void ErrorUnsupported(const Decl *D, const char *Type);
>
>    /// SetInternalFunctionAttributes - Set the attributes on the LLVM
>    /// function for the given decl and function info. This applies
>
> Modified: cfe/trunk/lib/CodeGen/ModuleBuilder.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ModuleBuilder.cpp?rev=188707&r1=188706&r2=188707&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/ModuleBuilder.cpp (original)
> +++ cfe/trunk/lib/CodeGen/ModuleBuilder.cpp Mon Aug 19 16:02:26 2013
> @@ -66,10 +66,16 @@ namespace {
>      }
>
>      virtual void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) {
> +      if (Diags.hasErrorOccurred())
> +        return;
> +
>        Builder->HandleCXXStaticMemberVarInstantiation(VD);
>      }
>
>      virtual bool HandleTopLevelDecl(DeclGroupRef DG) {
> +      if (Diags.hasErrorOccurred())
> +        return true;
> +
>        // Make sure to emit all elements of a Decl.
>        for (DeclGroupRef::iterator I = DG.begin(), E = DG.end(); I != E; ++I)
>          Builder->EmitTopLevelDecl(*I);
> @@ -81,6 +87,9 @@ namespace {
>      /// client hack on the type, which can occur at any point in the file
>      /// (because these can be defined in declspecs).
>      virtual void HandleTagDeclDefinition(TagDecl *D) {
> +      if (Diags.hasErrorOccurred())
> +        return;
> +
>        Builder->UpdateCompletedType(D);
>
>        // In C++, we may have member functions that need to be emitted at this
> @@ -98,6 +107,9 @@ namespace {
>      }
>
>      virtual void HandleTagDeclRequiredDefinition(const TagDecl *D) LLVM_OVERRIDE {
> +      if (Diags.hasErrorOccurred())
> +        return;
> +
>        if (CodeGen::CGDebugInfo *DI = Builder->getModuleDebugInfo())
>          if (const RecordDecl *RD = dyn_cast<RecordDecl>(D))
>            DI->completeRequiredType(RD);
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



More information about the cfe-commits mailing list