mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-27 00:46:05 +00:00

When using FileIndexRecord with macros, symbol references can be seen out of source order, which was causing a regression to insert the symbols into a vector. Instead, we now lazily sort the vector. The impact is small on most code, but in very large files with many macro references (M) near the beginning of the file followed by many decl references (D) it was O(M*D). A particularly bad protobuf-generated header was observed with a 100% regression in practice. rdar://78628133
71 lines
2.5 KiB
C++
71 lines
2.5 KiB
C++
//===--- FileIndexRecord.h - Index data per file ----------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_CLANG_LIB_INDEX_FILEINDEXRECORD_H
|
|
#define LLVM_CLANG_LIB_INDEX_FILEINDEXRECORD_H
|
|
|
|
#include "clang/Basic/SourceLocation.h"
|
|
#include "clang/Index/DeclOccurrence.h"
|
|
#include "clang/Index/IndexSymbol.h"
|
|
#include "llvm/ADT/ArrayRef.h"
|
|
#include "llvm/ADT/SmallVector.h"
|
|
#include <vector>
|
|
|
|
namespace clang {
|
|
class IdentifierInfo;
|
|
|
|
namespace index {
|
|
|
|
/// Stores the declaration occurrences seen in a particular source or header
|
|
/// file of a translation unit
|
|
class FileIndexRecord {
|
|
private:
|
|
FileID FID;
|
|
bool IsSystem;
|
|
mutable bool IsSorted = false;
|
|
mutable std::vector<DeclOccurrence> Decls;
|
|
|
|
public:
|
|
FileIndexRecord(FileID FID, bool IsSystem) : FID(FID), IsSystem(IsSystem) {}
|
|
|
|
ArrayRef<DeclOccurrence> getDeclOccurrencesSortedByOffset() const;
|
|
|
|
FileID getFileID() const { return FID; }
|
|
bool isSystem() const { return IsSystem; }
|
|
|
|
/// Adds an occurrence of the canonical declaration \c D at the supplied
|
|
/// \c Offset
|
|
///
|
|
/// \param Roles the roles the occurrence fulfills in this position.
|
|
/// \param Offset the offset in the file of this occurrence.
|
|
/// \param D the canonical declaration this is an occurrence of.
|
|
/// \param Relations the set of symbols related to this occurrence.
|
|
void addDeclOccurence(SymbolRoleSet Roles, unsigned Offset, const Decl *D,
|
|
ArrayRef<SymbolRelation> Relations);
|
|
|
|
/// Adds an occurrence of the given macro at the supplied \c Offset.
|
|
///
|
|
/// \param Roles the roles the occurrence fulfills in this position.
|
|
/// \param Offset the offset in the file of this occurrence.
|
|
/// \param Name the name of the macro.
|
|
/// \param MI the canonical declaration this is an occurrence of.
|
|
void addMacroOccurence(SymbolRoleSet Roles, unsigned Offset,
|
|
const IdentifierInfo *Name, const MacroInfo *MI);
|
|
|
|
/// Remove any macro occurrences for header guards. When preprocessing, this
|
|
/// will only be accurate after HandleEndOfFile.
|
|
void removeHeaderGuardMacros();
|
|
|
|
void print(llvm::raw_ostream &OS, SourceManager &SM) const;
|
|
};
|
|
|
|
} // end namespace index
|
|
} // end namespace clang
|
|
|
|
#endif // LLVM_CLANG_LIB_INDEX_FILEINDEXRECORD_H
|