================
@@ -424,6 +424,74 @@ class LifetimeSafetySemaHelperImpl : public
LifetimeSafetySemaHelper {
}
private:
+ struct LifetimeBoundMacroCache {
+ bool IsBuilt = false;
+ SmallVector<const IdentifierInfo *> Candidates;
+ };
+
+ void buildLifetimeBoundMacroCache(LifetimeBoundMacroCache &Cache,
+ ArrayRef<TokenValue> Tokens) {
+ if (Cache.IsBuilt)
+ return;
+
+ const Preprocessor &PP = S.getPreprocessor();
+ // Collect macro names that were ever defined as a lifetimebound attribute.
+ for (const auto &M : PP.macros()) {
+ const IdentifierInfo *II = M.first;
+ const MacroDirective *MD = PP.getLocalMacroDirectiveHistory(II);
+ if (!MD)
+ continue;
+
+ // Include earlier matching definitions to handle redefinitions.
+ for (MacroDirective::DefInfo Def = MD->getDefinition(); Def;
+ Def = Def.getPreviousDefinition()) {
+ const MacroInfo *MI = Def.getMacroInfo();
+ if (MI->isObjectLike() && Tokens.size() == MI->getNumTokens() &&
+ std::equal(Tokens.begin(), Tokens.end(), MI->tokens_begin())) {
+ Cache.Candidates.push_back(II);
+ break;
----------------
Xazax-hun wrote:
Ah, sorry, my bad! We are only adding macro names, not the individual
definitions. I wonder if doing the latter would be a bit more efficient, that
being said I think this is probably good as is. I am resolving this.
https://github.com/llvm/llvm-project/pull/205250
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits