[cfe-commits] r90437 - in /cfe/trunk: include/clang/Basic/DiagnosticFrontendKinds.td include/clang/Frontend/CompilerInstance.h lib/Frontend/CompilerInstance.cpp lib/Frontend/FrontendActions.cpp

Daniel Dunbar daniel at zuster.org
Thu Dec 3 01:13:30 PST 2009


Author: ddunbar
Date: Thu Dec  3 03:13:30 2009
New Revision: 90437

URL: http://llvm.org/viewvc/llvm-project?rev=90437&view=rev
Log:
Fix CompilerInstance::createOutputFile to use proper diagnostics, and (try to) update all clients to be able to handle failure.

Modified:
    cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
    cfe/trunk/include/clang/Frontend/CompilerInstance.h
    cfe/trunk/lib/Frontend/CompilerInstance.cpp
    cfe/trunk/lib/Frontend/FrontendActions.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td?rev=90437&r1=90436&r2=90437&view=diff

==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td Thu Dec  3 03:13:30 2009
@@ -53,6 +53,8 @@
     "malformed block record in PCH file: '%0'">;
 def err_fe_pch_error_at_end_block : Error<
     "error at end of module block in PCH file: '%0'">;
+def err_fe_unable_to_open_output : Error<
+    "unable to to open output file '%0': '%1'">;
 
 def err_verify_bogus_characters : Error<
     "bogus characters before '{{' in expected string">;

Modified: cfe/trunk/include/clang/Frontend/CompilerInstance.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CompilerInstance.h?rev=90437&r1=90436&r2=90437&view=diff

==============================================================================
--- cfe/trunk/include/clang/Frontend/CompilerInstance.h (original)
+++ cfe/trunk/include/clang/Frontend/CompilerInstance.h Thu Dec  3 03:13:30 2009
@@ -482,12 +482,16 @@
 
   /// Create the default output file (from the invocation's options) and add it
   /// to the list of tracked output files.
+  ///
+  /// \return - Null on error.
   llvm::raw_fd_ostream *
   createDefaultOutputFile(bool Binary = true, llvm::StringRef BaseInput = "",
                           llvm::StringRef Extension = "");
 
   /// Create a new output file and add it to the list of tracked output files,
   /// optionally deriving the output path name.
+  ///
+  /// \return - Null on error.
   llvm::raw_fd_ostream *
   createOutputFile(llvm::StringRef OutputPath, bool Binary = true,
                    llvm::StringRef BaseInput = "",

Modified: cfe/trunk/lib/Frontend/CompilerInstance.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInstance.cpp?rev=90437&r1=90436&r2=90437&view=diff

==============================================================================
--- cfe/trunk/lib/Frontend/CompilerInstance.cpp (original)
+++ cfe/trunk/lib/Frontend/CompilerInstance.cpp Thu Dec  3 03:13:30 2009
@@ -328,9 +328,9 @@
                                               InFile, Extension,
                                               &OutputPathName);
   if (!OS) {
-    // FIXME: Don't fail this way.
-    llvm::errs() << "error: " << Error << "\n";
-    ::exit(1);
+    getDiagnostics().Report(diag::err_fe_unable_to_open_output)
+      << OutputPath << Error;
+    return 0;
   }
 
   // Add the output file -- but don't try to remove "-", since this means we are

Modified: cfe/trunk/lib/Frontend/FrontendActions.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendActions.cpp?rev=90437&r1=90436&r2=90437&view=diff

==============================================================================
--- cfe/trunk/lib/Frontend/FrontendActions.cpp (original)
+++ cfe/trunk/lib/Frontend/FrontendActions.cpp Thu Dec  3 03:13:30 2009
@@ -35,13 +35,16 @@
 
 ASTConsumer *ASTPrintAction::CreateASTConsumer(CompilerInstance &CI,
                                                llvm::StringRef InFile) {
-  return CreateASTPrinter(CI.createDefaultOutputFile(false, InFile));
+  if (llvm::raw_ostream *OS = CI.createDefaultOutputFile(false, InFile))
+    return CreateASTPrinter(OS);
+  return 0;
 }
 
 ASTConsumer *ASTPrintXMLAction::CreateASTConsumer(CompilerInstance &CI,
                                                   llvm::StringRef InFile) {
-  return CreateASTPrinterXML(CI.createDefaultOutputFile(false, InFile,
-                                                        "xml"));
+  if (llvm::raw_ostream *OS = CI.createDefaultOutputFile(false, InFile, "xml"))
+    return CreateASTPrinterXML(OS);
+  return 0;
 }
 
 ASTConsumer *ASTDumpAction::CreateASTConsumer(CompilerInstance &CI,
@@ -74,6 +77,9 @@
   }
 
   llvm::raw_ostream *OS = CI.createDefaultOutputFile(true, InFile);
+  if (!OS)
+    return 0;
+
   if (CI.getFrontendOpts().RelocatablePCH)
     return CreatePCHGenerator(CI.getPreprocessor(), OS, Sysroot.c_str());
 
@@ -82,8 +88,9 @@
 
 ASTConsumer *HTMLPrintAction::CreateASTConsumer(CompilerInstance &CI,
                                                 llvm::StringRef InFile) {
-  return CreateHTMLPrinter(CI.createDefaultOutputFile(false, InFile),
-                           CI.getPreprocessor());
+  if (llvm::raw_ostream *OS = CI.createDefaultOutputFile(false, InFile))
+    return CreateHTMLPrinter(OS, CI.getPreprocessor());
+  return 0;
 }
 
 ASTConsumer *InheritanceViewAction::CreateASTConsumer(CompilerInstance &CI,
@@ -140,10 +147,11 @@
 
 ASTConsumer *RewriteObjCAction::CreateASTConsumer(CompilerInstance &CI,
                                                   llvm::StringRef InFile) {
-  return CreateObjCRewriter(InFile,
-                            CI.createDefaultOutputFile(true, InFile, "cpp"),
-                            CI.getDiagnostics(), CI.getLangOpts(),
-                            CI.getDiagnosticOpts().NoRewriteMacros);
+  if (llvm::raw_ostream *OS = CI.createDefaultOutputFile(false, InFile, "cpp"))
+    return CreateObjCRewriter(InFile, OS,
+                              CI.getDiagnostics(), CI.getLangOpts(),
+                              CI.getDiagnosticOpts().NoRewriteMacros);
+  return 0;
 }
 
 ASTConsumer *RewriteBlocksAction::CreateASTConsumer(CompilerInstance &CI,
@@ -162,12 +170,21 @@
                                               llvm::StringRef InFile) {
   BackendAction BA = static_cast<BackendAction>(Act);
   llvm::OwningPtr<llvm::raw_ostream> OS;
-  if (BA == Backend_EmitAssembly)
+  switch (BA) {
+  case Backend_EmitAssembly:
     OS.reset(CI.createDefaultOutputFile(false, InFile, "s"));
-  else if (BA == Backend_EmitLL)
+    break;
+  case Backend_EmitLL:
     OS.reset(CI.createDefaultOutputFile(false, InFile, "ll"));
-  else if (BA == Backend_EmitBC)
+    break;
+  case Backend_EmitBC:
     OS.reset(CI.createDefaultOutputFile(true, InFile, "bc"));
+    break;
+  case Backend_EmitNothing:
+    break;
+  }
+  if (BA != Backend_EmitNothing && !OS)
+    return 0;
 
   return CreateBackendConsumer(BA, CI.getDiagnostics(), CI.getLangOpts(),
                                CI.getCodeGenOpts(), CI.getTargetOpts(),
@@ -228,6 +245,8 @@
   }
   llvm::raw_fd_ostream *OS =
     CI.createDefaultOutputFile(true, getCurrentFile());
+  if (!OS) return;
+
   CacheTokens(CI.getPreprocessor(), OS);
 }
 
@@ -255,6 +274,8 @@
   CompilerInstance &CI = getCompilerInstance();
   Preprocessor &PP = getCompilerInstance().getPreprocessor();
   llvm::raw_ostream *OS = CI.createDefaultOutputFile(false, getCurrentFile());
+  if (!OS) return;
+
   llvm::OwningPtr<Action> PA(CreatePrintParserActionsAction(PP, OS));
 
   Parser P(PP, *PA);
@@ -265,6 +286,8 @@
 void PrintPreprocessedAction::ExecuteAction() {
   CompilerInstance &CI = getCompilerInstance();
   llvm::raw_ostream *OS = CI.createDefaultOutputFile(false, getCurrentFile());
+  if (!OS) return;
+
   DoPrintPreprocessedInput(CI.getPreprocessor(), OS,
                            CI.getPreprocessorOutputOpts());
 }
@@ -272,11 +295,15 @@
 void RewriteMacrosAction::ExecuteAction() {
   CompilerInstance &CI = getCompilerInstance();
   llvm::raw_ostream *OS = CI.createDefaultOutputFile(true, getCurrentFile());
+  if (!OS) return;
+
   RewriteMacrosInInput(CI.getPreprocessor(), OS);
 }
 
 void RewriteTestAction::ExecuteAction() {
   CompilerInstance &CI = getCompilerInstance();
   llvm::raw_ostream *OS = CI.createDefaultOutputFile(false, getCurrentFile());
+  if (!OS) return;
+
   DoRewriteTest(CI.getPreprocessor(), OS);
 }





More information about the cfe-commits mailing list