[clang] efed314 - Revert "[clang-format] Remove the dependency on frontend"

Vlad Tsyrklevich via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 29 10:48:58 PDT 2019


Author: Vlad Tsyrklevich
Date: 2019-10-29T10:48:03-07:00
New Revision: efed314118c7c287a71b8a8d67953a98d8a718d5

URL: https://github.com/llvm/llvm-project/commit/efed314118c7c287a71b8a8d67953a98d8a718d5
DIFF: https://github.com/llvm/llvm-project/commit/efed314118c7c287a71b8a8d67953a98d8a718d5.diff

LOG: Revert "[clang-format] Remove the dependency on frontend"

This reverts commit ec66603ac7ea655be5c2c5f508c5bf0d5eaeb65b. It was
causing ubsan failures like the following on the ubsan bot:
llvm/lib/Support/SourceMgr.cpp:440:48: runtime error: pointer index expression with base 0x000000000000 overflowed to 0xfffffffffffffffa

Added: 
    

Modified: 
    clang/tools/clang-format/CMakeLists.txt
    clang/tools/clang-format/ClangFormat.cpp

Removed: 
    


################################################################################
diff  --git a/clang/tools/clang-format/CMakeLists.txt b/clang/tools/clang-format/CMakeLists.txt
index 35ecdb11253c..28ac4fb5913e 100644
--- a/clang/tools/clang-format/CMakeLists.txt
+++ b/clang/tools/clang-format/CMakeLists.txt
@@ -7,6 +7,7 @@ add_clang_tool(clang-format
 set(CLANG_FORMAT_LIB_DEPS
   clangBasic
   clangFormat
+  clangFrontend
   clangRewrite
   clangToolingCore
   )

diff  --git a/clang/tools/clang-format/ClangFormat.cpp b/clang/tools/clang-format/ClangFormat.cpp
index cbbb52bd0aa8..db00d41d0351 100644
--- a/clang/tools/clang-format/ClangFormat.cpp
+++ b/clang/tools/clang-format/ClangFormat.cpp
@@ -18,6 +18,7 @@
 #include "clang/Basic/SourceManager.h"
 #include "clang/Basic/Version.h"
 #include "clang/Format/Format.h"
+#include "clang/Frontend/TextDiagnosticPrinter.h"
 #include "clang/Rewrite/Core/Rewriter.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/FileSystem.h"
@@ -299,9 +300,12 @@ emitReplacementWarnings(const Replacements &Replaces, StringRef AssumedFileName,
   IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
   DiagOpts->ShowColors = (ShowColors && !NoShowColors);
 
+  TextDiagnosticPrinter *DiagsBuffer =
+      new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts, false);
+
   IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
   IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
-      new DiagnosticsEngine(DiagID, &*DiagOpts));
+      new DiagnosticsEngine(DiagID, &*DiagOpts, DiagsBuffer));
 
   IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> InMemoryFileSystem(
       new llvm::vfs::InMemoryFileSystem);
@@ -310,40 +314,24 @@ emitReplacementWarnings(const Replacements &Replaces, StringRef AssumedFileName,
   FileID FileID = createInMemoryFile(AssumedFileName, Code.get(), Sources,
                                      Files, InMemoryFileSystem.get());
 
-  FileManager &FileMgr = Sources.getFileManager();
-  llvm::ErrorOr<const FileEntry *> FileEntryPtr =
-      FileMgr.getFile(AssumedFileName);
+  const unsigned ID = Diags->getCustomDiagID(
+      WarningsAsErrors ? clang::DiagnosticsEngine::Error
+                       : clang::DiagnosticsEngine::Warning,
+      "code should be clang-formatted [-Wclang-format-violations]");
 
   unsigned Errors = 0;
+  DiagsBuffer->BeginSourceFile(LangOptions(), nullptr);
   if (WarnFormat && !NoWarnFormat) {
     for (const auto &R : Replaces) {
-      PresumedLoc PLoc = Sources.getPresumedLoc(
-          Sources.getLocForStartOfFile(FileID).getLocWithOffset(R.getOffset()));
-
-      SourceLocation LineBegin =
-          Sources.translateFileLineCol(FileEntryPtr.get(), PLoc.getLine(), 1);
-      SourceLocation NextLineBegin = Sources.translateFileLineCol(
-          FileEntryPtr.get(), PLoc.getLine() + 1, 1);
-
-      const char *StartBuf = Sources.getCharacterData(LineBegin);
-      const char *EndBuf = Sources.getCharacterData(NextLineBegin);
-
-      StringRef Line(StartBuf, (EndBuf - StartBuf) - 1);
-
-      SMDiagnostic Diags(
-          llvm::SourceMgr(), SMLoc(), AssumedFileName, PLoc.getLine(),
-          PLoc.getColumn(),
-          WarningsAsErrors ? SourceMgr::DiagKind::DK_Error
-                           : SourceMgr::DiagKind::DK_Warning,
-          "code should be clang-formatted [-Wclang-format-violations]", Line,
-          ArrayRef<std::pair<unsigned, unsigned>>());
-
-      Diags.print(nullptr, llvm::errs(), (ShowColors && !NoShowColors));
+      Diags->Report(
+          Sources.getLocForStartOfFile(FileID).getLocWithOffset(R.getOffset()),
+          ID);
       Errors++;
       if (ErrorLimit && Errors >= ErrorLimit)
         break;
     }
   }
+  DiagsBuffer->EndSourceFile();
   return WarningsAsErrors;
 }
 


        


More information about the cfe-commits mailing list