mirror of
https://github.com/intel/llvm.git
synced 2026-02-05 04:46:27 +08:00
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 llvm-svn: 40108
This commit is contained in:
@@ -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));
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -53,8 +53,8 @@ namespace SrcMgr {
|
||||
typedef std::pair<const FileEntry * const, FileInfo> 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<SrcMgr::MacroIDInfo> 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
|
||||
|
||||
Reference in New Issue
Block a user