[PATCH] D142092: [include-mapping] Allow multiple headers for the same symbol. Choose the first header of available ones.
Viktoriia Bakalova via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 1 01:29:39 PST 2023
VitaNuo updated this revision to Diff 493871.
VitaNuo added a comment.
Revert more.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D142092/new/
https://reviews.llvm.org/D142092
Files:
clang/lib/Tooling/Inclusions/Stdlib/StandardLibrary.cpp
Index: clang/lib/Tooling/Inclusions/Stdlib/StandardLibrary.cpp
===================================================================
--- clang/lib/Tooling/Inclusions/Stdlib/StandardLibrary.cpp
+++ clang/lib/Tooling/Inclusions/Stdlib/StandardLibrary.cpp
@@ -8,6 +8,7 @@
#include "clang/Tooling/Inclusions/StandardLibrary.h"
#include "clang/AST/Decl.h"
+#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Casting.h"
@@ -17,7 +18,7 @@
static llvm::StringRef *HeaderNames;
static std::pair<llvm::StringRef, llvm::StringRef> *SymbolNames;
-static unsigned *SymbolHeaderIDs;
+static llvm::SmallVector<unsigned> *SymbolHeaderIDs;
static llvm::DenseMap<llvm::StringRef, unsigned> *HeaderIDs;
// Maps symbol name -> Symbol::ID, within a namespace.
using NSSymbolMap = llvm::DenseMap<llvm::StringRef, unsigned>;
@@ -29,6 +30,8 @@
#include "clang/Tooling/Inclusions/CSymbolMap.inc"
#include "clang/Tooling/Inclusions/StdSymbolMap.inc"
#undef SYMBOL
+ // Allocates more space than necessary since multiple SYMBOLs might correspond
+ // to the same qualified name.
SymbolNames = new std::remove_reference_t<decltype(*SymbolNames)>[SymCount];
SymbolHeaderIDs =
new std::remove_reference_t<decltype(*SymbolHeaderIDs)>[SymCount];
@@ -46,18 +49,26 @@
return HeaderIDs->try_emplace(Header, HeaderIDs->size()).first->second;
};
- auto Add = [&, SymIndex(0)](llvm::StringRef Name, llvm::StringRef NS,
- llvm::StringRef HeaderName) mutable {
+ auto Add = [&, SymIndex(-1)](llvm::StringRef Name, llvm::StringRef NS,
+ llvm::StringRef HeaderName) mutable {
if (NS == "None")
NS = "";
+ // Determine whether the symbol is new. This relies on symbols being
+ // ordered alpahbetically in the map.
+ if (SymIndex >= 0 && SymbolNames[SymIndex].first == NS &&
+ SymbolNames[SymIndex].second == Name) {
+ // Not a new symbol, use the same index.
+ } else {
+ // First symbol or new symbol, increment next available index.
+ ++SymIndex;
+ }
+
SymbolNames[SymIndex] = {NS, Name};
- SymbolHeaderIDs[SymIndex] = AddHeader(HeaderName);
+ SymbolHeaderIDs[SymIndex].emplace_back(AddHeader(HeaderName));
NSSymbolMap &NSSymbols = AddNS(NS);
NSSymbols.try_emplace(Name, SymIndex);
-
- ++SymIndex;
};
#define SYMBOL(Name, NS, Header) Add(#Name, #NS, #Header);
#include "clang/Tooling/Inclusions/CSymbolMap.inc"
@@ -87,7 +98,7 @@
llvm::StringRef Symbol::scope() const { return SymbolNames[ID].first; }
llvm::StringRef Symbol::name() const { return SymbolNames[ID].second; }
std::optional<Symbol> Symbol::named(llvm::StringRef Scope,
- llvm::StringRef Name) {
+ llvm::StringRef Name) {
ensureInitialized();
if (NSSymbolMap *NSSymbols = NamespaceSymbols->lookup(Scope)) {
auto It = NSSymbols->find(Name);
@@ -96,9 +107,14 @@
}
return std::nullopt;
}
-Header Symbol::header() const { return Header(SymbolHeaderIDs[ID]); }
+
+Header Symbol::header() const { return Header(SymbolHeaderIDs[ID][0]); }
llvm::SmallVector<Header> Symbol::headers() const {
- return {header()}; // FIXME: multiple in case of ambiguity
+ llvm::SmallVector<Header> result;
+ for (auto HeaderID : SymbolHeaderIDs[ID]) {
+ result.emplace_back(Header(HeaderID));
+ }
+ return result;
}
Recognizer::Recognizer() { ensureInitialized(); }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D142092.493871.patch
Type: text/x-patch
Size: 3487 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230201/0e1cc93c/attachment.bin>
More information about the cfe-commits
mailing list