From: Chris Lattner Date: Fri, 20 Jul 2007 18:00:12 +0000 (+0000) Subject: improve comments, implement a trivial single-entry cache in X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=31bb8be680ee2facf7fbb3c6c87b9bbd20248328;p=clang improve comments, implement a trivial single-entry cache in SourceManager::getInstantiationLoc. With this change, every token expanded from a macro doesn't get its own MacroID. :) This reduces # macro IDs in carbon.h from 16805 to 9197 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40108 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Basic/SourceManager.cpp b/Basic/SourceManager.cpp index 3e2623c8e4..09941635da 100644 --- a/Basic/SourceManager.cpp +++ b/Basic/SourceManager.cpp @@ -165,16 +165,35 @@ unsigned SourceManager::createFileID(const InfoRec *File, /// getInstantiationLoc - Return a new SourceLocation that encodes the fact /// that a token from physloc PhysLoc should actually be referenced from /// InstantiationLoc. -SourceLocation SourceManager::getInstantiationLoc(SourceLocation VirtLoc, +SourceLocation SourceManager::getInstantiationLoc(SourceLocation PhysLoc, SourceLocation InstantLoc) { // The specified source location may be a mapped location, due to a macro // instantiation or #line directive. Strip off this information to find out // where the characters are actually located. - SourceLocation PhysLoc = getPhysicalLoc(VirtLoc); + PhysLoc = getPhysicalLoc(PhysLoc); // Resolve InstantLoc down to a real logical location. InstantLoc = getLogicalLoc(InstantLoc); + + // If the last macro id is close to the currently requested location, try to + // reuse it. This implements a single-entry cache. + if (!MacroIDs.empty()) { + MacroIDInfo &LastOne = MacroIDs.back(); + if (LastOne.getInstantiationLoc() == InstantLoc && + LastOne.getPhysicalLoc().getFileID() == PhysLoc.getFileID()) { + + int PhysDelta = PhysLoc.getRawFilePos() - + LastOne.getPhysicalLoc().getRawFilePos(); + if (unsigned(PhysDelta) < (1 << SourceLocation::MacroPhysOffsBits)) + return SourceLocation::getMacroLoc(MacroIDs.size()-1, + (unsigned)PhysDelta, 0); + + } + } + + + // FIXME: intelligently cache macroid's. MacroIDs.push_back(MacroIDInfo::get(InstantLoc, PhysLoc)); diff --git a/include/clang/Basic/SourceLocation.h b/include/clang/Basic/SourceLocation.h index d107b0bd70..f0dd026184 100644 --- a/include/clang/Basic/SourceLocation.h +++ b/include/clang/Basic/SourceLocation.h @@ -28,8 +28,8 @@ public: FileIDBits = 14, FilePosBits = 32-1-FileIDBits, - MacroIDBits = 23, - MacroPhysOffsBits = 5, + MacroIDBits = 19, + MacroPhysOffsBits = 9, MacroLogOffBits = 3 }; @@ -106,7 +106,7 @@ public: unsigned getMacroLogOffs() const { assert(isMacroID() && "Is not a macro id!"); - return ID & ((1 << MacroPhysOffsBits)-1); + return ID & ((1 << MacroLogOffBits)-1); } /// getFileLocWithOffset - Return a source location with the specified offset diff --git a/include/clang/Basic/SourceManager.h b/include/clang/Basic/SourceManager.h index 042dda9b67..414b1789a7 100644 --- a/include/clang/Basic/SourceManager.h +++ b/include/clang/Basic/SourceManager.h @@ -53,8 +53,8 @@ namespace SrcMgr { typedef std::pair InfoRec; /// FileIDInfo - Information about a FileID, basically just the logical file - /// that it represents and include stack information. A SourceLocation is a - /// byte offset from the start of this. + /// that it represents and include stack information. A File SourceLocation + /// is a byte offset from the start of this. /// /// FileID's are used to compute the location of a character in memory as well /// as the logical source location, which can be differ from the physical @@ -63,16 +63,12 @@ namespace SrcMgr { /// /// Each FileID has include stack information, indicating where it came from. /// For the primary translation unit, it comes from SourceLocation() aka 0. + /// This information encodes the #include chain that a token was instantiated + /// from. /// - /// There are three types of FileID's: - /// 1. Normal MemoryBuffer (file). These are represented by a "InfoRec *", - /// describing the source file, and a Chunk number, which factors into - /// the SourceLocation's offset from the start of the buffer. - /// 2. Macro Expansions. These indicate that the logical location is - /// totally different than the physical location. The logical source - /// location is specified by the IncludeLoc. The physical location is - /// the FilePos of the token's SourceLocation combined with the FileID - /// from MacroTokenFileID. + /// FileIDInfos contain a "InfoRec *", describing the source file, and a Chunk + /// number, which allows a SourceLocation to index into very large files + /// (those which there are not enough FilePosBits to address). /// struct FileIDInfo { private: @@ -104,6 +100,11 @@ namespace SrcMgr { const InfoRec *getInfo() const { return Info; } }; + /// MacroIDInfo - Macro SourceLocations refer to these records by their ID. + /// Each MacroIDInfo encodes the Instantiation location - where the macro was + /// instantiated, and the PhysicalLoc - where the actual character data for + /// the token came from. An actual macro SourceLocation stores deltas from + /// these positions. class MacroIDInfo { SourceLocation InstantiationLoc, PhysicalLoc; public: @@ -153,13 +154,8 @@ class SourceManager { /// MacroIDs - Information about each MacroID. std::vector MacroIDs; - /// LastInstantiationLoc_* - Cache the last instantiation request for fast - /// lookup. Macros often want many tokens instantated at the same location. - SourceLocation LastInstantiationLoc_InstantLoc; - unsigned LastInstantiationLoc_MacroFID; - unsigned LastInstantiationLoc_Result; public: - SourceManager() { LastInstantiationLoc_MacroFID = ~0U; } + SourceManager() {} ~SourceManager(); /// createFileID - Create a new FileID that represents the specified file @@ -249,8 +245,8 @@ public: // File locations are both physical and logical. if (Loc.isFileID()) return Loc; - SourceLocation ILoc = MacroIDs[Loc.getMacroID()].getPhysicalLoc(); - return ILoc.getFileLocWithOffset(Loc.getMacroPhysOffs()); + SourceLocation PLoc = MacroIDs[Loc.getMacroID()].getPhysicalLoc(); + return PLoc.getFileLocWithOffset(Loc.getMacroPhysOffs()); } /// getFileEntryForLoc - Return the FileEntry record for the physloc of the