[clang] [LifetimeSafety][NFC] Refactor OriginList to OriginNode tree (PR #194797)
Zhijie Wang via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 29 10:58:29 PDT 2026
================
@@ -92,30 +92,42 @@ struct Origin {
///
/// The list structure enables the analysis to track how loans flow through
/// different levels of indirection when assignments and dereferences occur.
-class OriginList {
+///
+/// TODO: Currently list-shaped (each node has at most one pointee child).
+/// Will become tree-shaped once field children are added to support
+/// origin trees for records whose fields have origins.
+class OriginNode {
public:
- OriginList(OriginID OID) : OuterOID(OID) {}
+ OriginNode(OriginID OID) : OID(OID) {}
- OriginList *peelOuterOrigin() const { return InnerList; }
- OriginID getOuterOriginID() const { return OuterOID; }
+ OriginNode *getPointeeChild() const {
+ return NumChildren ? Children[0] : nullptr;
+ }
- void setInnerOriginList(OriginList *Inner) { InnerList = Inner; }
+ OriginID getOriginID() const { return OID; }
- // Used for assertion checks only (to ensure origin lists have matching
+ void setChildren(OriginNode **Arr, unsigned N) {
+ assert(Children == nullptr && "children must be set at most once");
+ Children = Arr;
+ NumChildren = N;
+ }
+
+ // Used for assertion checks only (to ensure pointee chains have matching
// lengths).
size_t getLength() const {
size_t Length = 1;
- const OriginList *T = this;
- while (T->InnerList) {
- T = T->InnerList;
+ const OriginNode *T = this;
+ while (auto *ON = T->getPointeeChild()) {
+ T = ON;
Length++;
}
return Length;
}
private:
- OriginID OuterOID;
- OriginList *InnerList = nullptr;
+ OriginID OID;
+ OriginNode **Children = nullptr;
----------------
aeft wrote:
Done
https://github.com/llvm/llvm-project/pull/194797
More information about the cfe-commits
mailing list