From d1623a81992a24abbfcd5520b32a0dd90857b8a8 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 21 Jul 2007 06:41:57 +0000 Subject: [PATCH] Add support for reusing macroid's with negative physical loc deltas. This keeps the MacroInfo table more compact. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40281 91177308-0d34-0410-b5e6-96231b3b80d8 --- Basic/SourceManager.cpp | 7 +++---- include/clang/Basic/SourceLocation.h | 31 +++++++++++++++++++--------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/Basic/SourceManager.cpp b/Basic/SourceManager.cpp index d05da5d971..be8eeee408 100644 --- a/Basic/SourceManager.cpp +++ b/Basic/SourceManager.cpp @@ -180,20 +180,19 @@ SourceLocation SourceManager::getInstantiationLoc(SourceLocation PhysLoc, // 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); + if (SourceLocation::isValidMacroPhysOffs(PhysDelta)) + return SourceLocation::getMacroLoc(MacroIDs.size()-1, PhysDelta, 0); } } MacroIDs.push_back(MacroIDInfo::get(InstantLoc, PhysLoc)); - return SourceLocation::getMacroLoc(MacroIDs.size()-1, 0, 0); } diff --git a/include/clang/Basic/SourceLocation.h b/include/clang/Basic/SourceLocation.h index f0dd026184..6ba17b0530 100644 --- a/include/clang/Basic/SourceLocation.h +++ b/include/clang/Basic/SourceLocation.h @@ -28,9 +28,9 @@ public: FileIDBits = 14, FilePosBits = 32-1-FileIDBits, - MacroIDBits = 19, + MacroIDBits = 20, MacroPhysOffsBits = 9, - MacroLogOffBits = 3 + MacroLogOffBits = 2 }; SourceLocation() : ID(0) {} // 0 is an invalid FileID. @@ -56,16 +56,24 @@ public: return L; } - static SourceLocation getMacroLoc(unsigned MacroID, unsigned PhysOffs, + static bool isValidMacroPhysOffs(int Val) { + if (Val >= 0) + return Val < (1 << (MacroPhysOffsBits-1)); + return -Val < (1 << (MacroPhysOffsBits-1)); + } + + static SourceLocation getMacroLoc(unsigned MacroID, int PhysOffs, unsigned LogOffs) { - SourceLocation L; - assert(MacroID < (1 << MacroIDBits) && "Too many macros!"); - assert(PhysOffs < (1 << MacroPhysOffsBits) && "Physoffs too large!"); + assert(isValidMacroPhysOffs(PhysOffs) && "Physoffs too large!"); assert(LogOffs < (1 << MacroLogOffBits) && "Logical offs too large!"); + PhysOffs &= (1 << MacroPhysOffsBits)-1; + + SourceLocation L; L.ID = (1 << 31) | (MacroID << (MacroPhysOffsBits+MacroLogOffBits)) | - (PhysOffs << MacroLogOffBits) | LogOffs; + (PhysOffs << MacroLogOffBits) | + LogOffs; return L; } @@ -99,9 +107,12 @@ public: return (ID >> (MacroPhysOffsBits+MacroLogOffBits)) & ((1 << MacroIDBits)-1); } - unsigned getMacroPhysOffs() const { + int getMacroPhysOffs() const { assert(isMacroID() && "Is not a macro id!"); - return (ID >> MacroLogOffBits) & ((1 << MacroPhysOffsBits)-1); + int Val = (ID >> MacroLogOffBits) & ((1 << MacroPhysOffsBits)-1); + // Sign extend it properly. + unsigned ShAmt = sizeof(int)*8 - MacroPhysOffsBits; + return (Val << ShAmt) >> ShAmt; } unsigned getMacroLogOffs() const { @@ -111,7 +122,7 @@ public: /// getFileLocWithOffset - Return a source location with the specified offset /// from this file SourceLocation. - SourceLocation getFileLocWithOffset(unsigned Offset) const { + SourceLocation getFileLocWithOffset(int Offset) const { return getFileLoc(getFileID(), getRawFilePos()+Offset); } -- 2.40.0