[PATCH] D154471: [clang] Add serialization support for the DynamicAllocLValue variant of APValue::LValueBase::Ptr
Nathan Ridge via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Sat Jul 8 15:17:04 PDT 2023
nridge created this revision.
Herald added a project: All.
nridge updated this revision to Diff 537970.
nridge added a comment.
nridge edited the summary of this revision.
Herald added a subscriber: kadircet.
nridge published this revision for review.
Herald added subscribers: cfe-commits, ilya-biryukov.
Herald added a project: clang.
Add missing check for isDynamicAlloc
nridge added a comment.
Requesting review.
The patch does not include an automated test because this is fixing a bug report with no test case (I spotted the issue by inspection based on the stack trace). The bug reporter did try the patch locally and confirm that it fixes the crash on their codebase.
Fixes https://github.com/clangd/clangd/issues/1672
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D154471
Files:
clang/include/clang/AST/PropertiesBase.td
Index: clang/include/clang/AST/PropertiesBase.td
===================================================================
--- clang/include/clang/AST/PropertiesBase.td
+++ clang/include/clang/AST/PropertiesBase.td
@@ -450,10 +450,13 @@
lvalueBase ? lvalueBase.dyn_cast<const Expr *>() : nullptr;
bool lvalueBaseIsExpr = (bool) expr;
bool lvalueBaseIsTypeInfo = lvalueBase.is<TypeInfoLValue>();
+ bool lvalueBaseIsDynamicAlloc = lvalueBase.is<DynamicAllocLValue>();
QualType elemTy;
if (lvalueBase) {
if (lvalueBaseIsTypeInfo) {
elemTy = lvalueBase.getTypeInfoType();
+ } else if (lvalueBaseIsDynamicAlloc) {
+ elemTy = lvalueBase.getDynamicAllocType();
} else if (lvalueBaseIsExpr) {
elemTy = expr->getType();
} else {
@@ -473,6 +476,9 @@
def : Property<"isTypeInfo", Bool> {
let Read = [{ lvalueBaseIsTypeInfo }];
}
+ def : Property<"isDynamicAlloc", Bool> {
+ let Read = [{ lvalueBaseIsDynamicAlloc }];
+ }
def : Property<"hasBase", Bool> {
let Read = [{ static_cast<bool>(lvalueBase) }];
}
@@ -485,9 +491,17 @@
QualType(node.getLValueBase().get<TypeInfoLValue>().getType(), 0)
}];
}
+ def : Property<"dynamicAlloc", UInt32> {
+ let Conditional = [{ hasBase && isDynamicAlloc }];
+ let Read = [{ node.getLValueBase().get<DynamicAllocLValue>().getIndex() }];
+ }
def : Property<"type", QualType> {
- let Conditional = [{ hasBase && isTypeInfo }];
- let Read = [{ node.getLValueBase().getTypeInfoType() }];
+ let Conditional = [{ hasBase && (isTypeInfo || isDynamicAlloc) }];
+ let Read = [{
+ isTypeInfo
+ ? node.getLValueBase().getTypeInfoType()
+ : node.getLValueBase().getDynamicAllocType()
+ }];
}
def : Property<"callIndex", UInt32> {
let Conditional = [{ hasBase && !isTypeInfo }];
@@ -502,7 +516,7 @@
let Read = [{ const_cast<Expr *>(expr) }];
}
def : Property<"decl", DeclRef> {
- let Conditional = [{ hasBase && !isTypeInfo && !isExpr }];
+ let Conditional = [{ hasBase && !isTypeInfo && !isDynamicAlloc && !isExpr }];
let Read = [{ lvalueBase.get<const ValueDecl *>() }];
}
def : Property<"offsetQuantity", UInt32> {
@@ -521,6 +535,9 @@
if (isTypeInfo) {
base = APValue::LValueBase::getTypeInfo(
TypeInfoLValue(typeInfo->getTypePtr()), *type);
+ } else if (isDynamicAlloc) {
+ base = APValue::LValueBase::getDynamicAlloc(
+ DynamicAllocLValue(*dynamicAlloc), *type);
} else if (isExpr) {
base = APValue::LValueBase(cast<Expr>(*stmt),
*callIndex, *version);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D154471.537970.patch
Type: text/x-patch
Size: 2677 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230708/b7c78c8a/attachment-0001.bin>
More information about the cfe-commits
mailing list