Author: Chris Lattner Date: 2020-04-25T21:18:59-07:00 New Revision: 919dcc7f6858cf0d9a7442673acafdf495e46c7a
URL: https://github.com/llvm/llvm-project/commit/919dcc7f6858cf0d9a7442673acafdf495e46c7a DIFF: https://github.com/llvm/llvm-project/commit/919dcc7f6858cf0d9a7442673acafdf495e46c7a.diff LOG: [SourceMgr] Tidy up the SourceMgr header file to include less stuff. Summary: Specifically make some simple refactorings to get PointerUnion.h and Twine.h out of the public includes. While here, trim out a lot of transitive includes as well. Subscribers: hiraditya, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D78870 Added: Modified: clang/include/clang/Basic/FileManager.h llvm/include/llvm/Support/SourceMgr.h llvm/lib/Support/SourceMgr.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Basic/FileManager.h b/clang/include/clang/Basic/FileManager.h index b481f5846936..089304e1d1e6 100644 --- a/clang/include/clang/Basic/FileManager.h +++ b/clang/include/clang/Basic/FileManager.h @@ -18,6 +18,7 @@ #include "clang/Basic/LLVM.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/IntrusiveRefCntPtr.h" +#include "llvm/ADT/PointerUnion.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" diff --git a/llvm/include/llvm/Support/SourceMgr.h b/llvm/include/llvm/Support/SourceMgr.h index 3255e143d56b..a0bd3ca2e0c1 100644 --- a/llvm/include/llvm/Support/SourceMgr.h +++ b/llvm/include/llvm/Support/SourceMgr.h @@ -15,19 +15,9 @@ #ifndef LLVM_SUPPORT_SOURCEMGR_H #define LLVM_SUPPORT_SOURCEMGR_H -#include "llvm/ADT/ArrayRef.h" -#include "llvm/ADT/None.h" -#include "llvm/ADT/PointerUnion.h" #include "llvm/ADT/SmallVector.h" -#include "llvm/ADT/StringRef.h" -#include "llvm/ADT/Twine.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/SMLoc.h" -#include <algorithm> -#include <cassert> -#include <memory> -#include <string> -#include <utility> #include <vector> namespace llvm { @@ -57,21 +47,17 @@ class SourceMgr { /// The memory buffer for the file. std::unique_ptr<MemoryBuffer> Buffer; - /// Helper type for OffsetCache below: since we're storing many offsets - /// into relatively small files (often smaller than 2^8 or 2^16 bytes), - /// we select the offset vector element type dynamically based on the - /// size of Buffer. - using VariableSizeOffsets = - PointerUnion<std::vector<uint8_t> *, std::vector<uint16_t> *, - std::vector<uint32_t> *, std::vector<uint64_t> *>; - /// Vector of offsets into Buffer at which there are line-endings /// (lazily populated). Once populated, the '\n' that marks the end of /// line number N from [1..] is at Buffer[OffsetCache[N-1]]. Since /// these offsets are in sorted (ascending) order, they can be /// binary-searched for the first one after any given offset (eg. an /// offset corresponding to a particular SMLoc). - mutable VariableSizeOffsets OffsetCache; + /// + /// Since we're storing offsets into relatively small files (often smaller + /// than 2^8 or 2^16 bytes), we select the offset vector element type + /// dynamically based on the size of Buffer. + mutable void *OffsetCache = nullptr; /// Look up a given \p Ptr in in the buffer, determining which line it came /// from. @@ -196,14 +182,14 @@ class SourceMgr { /// \param ShowColors Display colored messages if output is a terminal and /// the default error handler is used. void PrintMessage(raw_ostream &OS, SMLoc Loc, DiagKind Kind, const Twine &Msg, - ArrayRef<SMRange> Ranges = None, - ArrayRef<SMFixIt> FixIts = None, + ArrayRef<SMRange> Ranges = {}, + ArrayRef<SMFixIt> FixIts = {}, bool ShowColors = true) const; /// Emits a diagnostic to llvm::errs(). void PrintMessage(SMLoc Loc, DiagKind Kind, const Twine &Msg, - ArrayRef<SMRange> Ranges = None, - ArrayRef<SMFixIt> FixIts = None, + ArrayRef<SMRange> Ranges = {}, + ArrayRef<SMFixIt> FixIts = {}, bool ShowColors = true) const; /// Emits a manually-constructed diagnostic to the given output stream. @@ -219,8 +205,8 @@ class SourceMgr { /// \param Msg If non-null, the kind of message (e.g., "error") which is /// prefixed to the message. SMDiagnostic GetMessage(SMLoc Loc, DiagKind Kind, const Twine &Msg, - ArrayRef<SMRange> Ranges = None, - ArrayRef<SMFixIt> FixIts = None) const; + ArrayRef<SMRange> Ranges = {}, + ArrayRef<SMFixIt> FixIts = {}) const; /// Prints the names of included files and the line of the file they were /// included from. A diagnostic handler can use this before printing its @@ -238,17 +224,10 @@ class SMFixIt { std::string Text; public: - // FIXME: Twine.str() is not very efficient. - SMFixIt(SMLoc Loc, const Twine &Insertion) - : Range(Loc, Loc), Text(Insertion.str()) { - assert(Loc.isValid()); - } + SMFixIt(SMRange R, const Twine &Replacement); - // FIXME: Twine.str() is not very efficient. - SMFixIt(SMRange R, const Twine &Replacement) - : Range(R), Text(Replacement.str()) { - assert(R.isValid()); - } + SMFixIt(SMLoc Loc, const Twine &Replacement) + : SMFixIt(SMRange(Loc, Loc), Replacement) {} StringRef getText() const { return Text; } SMRange getRange() const { return Range; } @@ -286,7 +265,7 @@ class SMDiagnostic { SMDiagnostic(const SourceMgr &sm, SMLoc L, StringRef FN, int Line, int Col, SourceMgr::DiagKind Kind, StringRef Msg, StringRef LineStr, ArrayRef<std::pair<unsigned, unsigned>> Ranges, - ArrayRef<SMFixIt> FixIts = None); + ArrayRef<SMFixIt> FixIts = {}); const SourceMgr *getSourceMgr() const { return SM; } SMLoc getLoc() const { return Loc; } diff --git a/llvm/lib/Support/SourceMgr.cpp b/llvm/lib/Support/SourceMgr.cpp index 5fe95badd547..db5f7ad84683 100644 --- a/llvm/lib/Support/SourceMgr.cpp +++ b/llvm/lib/Support/SourceMgr.cpp @@ -69,16 +69,13 @@ unsigned SourceMgr::FindBufferContainingLoc(SMLoc Loc) const { } template <typename T> -static std::vector<T> &GetOrCreateOffsetCache( - PointerUnion<std::vector<uint8_t> *, std::vector<uint16_t> *, - std::vector<uint32_t> *, std::vector<uint64_t> *> &OffsetCache, - MemoryBuffer *Buffer) { - if (!OffsetCache.isNull()) - return *OffsetCache.get<std::vector<T> *>(); +static std::vector<T> &GetOrCreateOffsetCache(void *&OffsetCache, + MemoryBuffer *Buffer) { + if (OffsetCache) + return *static_cast<std::vector<T> *>(OffsetCache); // Lazily fill in the offset cache. auto *Offsets = new std::vector<T>(); - OffsetCache = Offsets; size_t Sz = Buffer->getBufferSize(); assert(Sz <= std::numeric_limits<T>::max()); StringRef S = Buffer->getBuffer(); @@ -87,6 +84,7 @@ static std::vector<T> &GetOrCreateOffsetCache( Offsets->push_back(static_cast<T>(N)); } + OffsetCache = Offsets; return *Offsets; } @@ -164,15 +162,16 @@ SourceMgr::SrcBuffer::SrcBuffer(SourceMgr::SrcBuffer &&Other) } SourceMgr::SrcBuffer::~SrcBuffer() { - if (!OffsetCache.isNull()) { - if (OffsetCache.is<std::vector<uint8_t> *>()) - delete OffsetCache.get<std::vector<uint8_t> *>(); - else if (OffsetCache.is<std::vector<uint16_t> *>()) - delete OffsetCache.get<std::vector<uint16_t> *>(); - else if (OffsetCache.is<std::vector<uint32_t> *>()) - delete OffsetCache.get<std::vector<uint32_t> *>(); + if (OffsetCache) { + size_t Sz = Buffer->getBufferSize(); + if (Sz <= std::numeric_limits<uint8_t>::max()) + delete static_cast<std::vector<uint8_t> *>(OffsetCache); + else if (Sz <= std::numeric_limits<uint16_t>::max()) + delete static_cast<std::vector<uint16_t> *>(OffsetCache); + else if (Sz <= std::numeric_limits<uint32_t>::max()) + delete static_cast<std::vector<uint32_t> *>(OffsetCache); else - delete OffsetCache.get<std::vector<uint64_t> *>(); + delete static_cast<std::vector<uint64_t> *>(OffsetCache); OffsetCache = nullptr; } } @@ -328,6 +327,15 @@ void SourceMgr::PrintMessage(SMLoc Loc, SourceMgr::DiagKind Kind, PrintMessage(errs(), Loc, Kind, Msg, Ranges, FixIts, ShowColors); } +//===----------------------------------------------------------------------===// +// SMFixIt Implementation +//===----------------------------------------------------------------------===// + +SMFixIt::SMFixIt(SMRange R, const Twine &Replacement) + : Range(R), Text(Replacement.str()) { + assert(R.isValid()); +} + //===----------------------------------------------------------------------===// // SMDiagnostic Implementation //===----------------------------------------------------------------------===// _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits