[PATCH] D131065: [clang][dataflow] Store DeclContext of block being analysed in Environment if available.
This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG2cb51449f0d9: [clang][dataflow] Store DeclContext of block being analysed in Environment if… (authored by wyt). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D131065/new/ https://reviews.llvm.org/D131065 Files: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp Index: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp === --- clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp +++ clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp @@ -154,7 +154,7 @@ : DACtx(), FlowConditionToken(()) {} Environment::Environment(const Environment ) -: DACtx(Other.DACtx), ReturnLoc(Other.ReturnLoc), +: DACtx(Other.DACtx), DeclCtx(Other.DeclCtx), ReturnLoc(Other.ReturnLoc), ThisPointeeLoc(Other.ThisPointeeLoc), DeclToLoc(Other.DeclToLoc), ExprToLoc(Other.ExprToLoc), LocToVal(Other.LocToVal), MemberLocToStruct(Other.MemberLocToStruct), @@ -168,9 +168,11 @@ } Environment::Environment(DataflowAnalysisContext , - const DeclContext ) + const DeclContext ) : Environment(DACtx) { - if (const auto *FuncDecl = dyn_cast()) { + setDeclCtx(); + + if (const auto *FuncDecl = dyn_cast(DeclCtx)) { assert(FuncDecl->getBody() != nullptr); initGlobalVars(*FuncDecl->getBody(), *this); for (const auto *ParamDecl : FuncDecl->parameters()) { @@ -185,7 +187,7 @@ ReturnLoc = (ReturnType); } - if (const auto *MethodDecl = dyn_cast()) { + if (const auto *MethodDecl = dyn_cast(DeclCtx)) { auto *Parent = MethodDecl->getParent(); assert(Parent != nullptr); if (Parent->isLambda()) @@ -210,6 +212,9 @@ const auto *FuncDecl = Call->getDirectCallee(); assert(FuncDecl != nullptr); + + Env.setDeclCtx(FuncDecl); + // FIXME: In order to allow the callee to reference globals, we probably need // to call `initGlobalVars` here in some way. @@ -252,12 +257,12 @@ void Environment::popCall(const Environment ) { // We ignore `DACtx` because it's already the same in both. We don't want the - // callee's `ReturnLoc` or `ThisPointeeLoc`. We don't bring back `DeclToLoc` - // and `ExprToLoc` because we want to be able to later analyze the same callee - // in a different context, and `setStorageLocation` requires there to not - // already be a storage location assigned. Conceptually, these maps capture - // information from the local scope, so when popping that scope, we do not - // propagate the maps. + // callee's `DeclCtx`, `ReturnLoc` or `ThisPointeeLoc`. We don't bring back + // `DeclToLoc` and `ExprToLoc` because we want to be able to later analyze the + // same callee in a different context, and `setStorageLocation` requires there + // to not already be a storage location assigned. Conceptually, these maps + // capture information from the local scope, so when popping that scope, we do + // not propagate the maps. this->LocToVal = std::move(CalleeEnv.LocToVal); this->MemberLocToStruct = std::move(CalleeEnv.MemberLocToStruct); this->FlowConditionToken = std::move(CalleeEnv.FlowConditionToken); @@ -304,11 +309,13 @@ assert(DACtx == Other.DACtx); assert(ReturnLoc == Other.ReturnLoc); assert(ThisPointeeLoc == Other.ThisPointeeLoc); + assert(DeclCtx == Other.DeclCtx); auto Effect = LatticeJoinEffect::Unchanged; Environment JoinedEnv(*DACtx); + JoinedEnv.setDeclCtx(DeclCtx); JoinedEnv.ReturnLoc = ReturnLoc; JoinedEnv.ThisPointeeLoc = ThisPointeeLoc; Index: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h === --- clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h +++ clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h @@ -347,6 +347,13 @@ /// imply that `Val` is true. bool flowConditionImplies(BoolValue ) const; + /// Returns the `DeclContext` of the block being analysed, if any. Otherwise, + /// returns null. + const DeclContext *getDeclCtx() { return DeclCtx; } + + /// Sets the `DeclContext` of the block being analysed. + void setDeclCtx(const DeclContext *Ctx) { DeclCtx = Ctx; } + /// Returns the `ControlFlowContext` registered for `F`, if any. Otherwise, /// returns null. const ControlFlowContext *getControlFlowContext(const FunctionDecl *F) { @@ -377,6 +384,9 @@ // `DACtx` is not null and not owned by this object. DataflowAnalysisContext *DACtx; + // `DeclContext` of the block being analysed if provided. + const DeclContext *DeclCtx = nullptr; + // In a properly initialized `Environment`, `ReturnLoc` should only be null if // its `DeclContext` could not be cast to a
[PATCH] D131065: [clang][dataflow] Store DeclContext of block being analysed in Environment if available.
wyt updated this revision to Diff 451754. wyt added a comment. Initialise DeclCtx field with nullptr. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D131065/new/ https://reviews.llvm.org/D131065 Files: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp Index: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp === --- clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp +++ clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp @@ -154,7 +154,7 @@ : DACtx(), FlowConditionToken(()) {} Environment::Environment(const Environment ) -: DACtx(Other.DACtx), ReturnLoc(Other.ReturnLoc), +: DACtx(Other.DACtx), DeclCtx(Other.DeclCtx), ReturnLoc(Other.ReturnLoc), ThisPointeeLoc(Other.ThisPointeeLoc), DeclToLoc(Other.DeclToLoc), ExprToLoc(Other.ExprToLoc), LocToVal(Other.LocToVal), MemberLocToStruct(Other.MemberLocToStruct), @@ -168,9 +168,11 @@ } Environment::Environment(DataflowAnalysisContext , - const DeclContext ) + const DeclContext ) : Environment(DACtx) { - if (const auto *FuncDecl = dyn_cast()) { + setDeclCtx(); + + if (const auto *FuncDecl = dyn_cast(DeclCtx)) { assert(FuncDecl->getBody() != nullptr); initGlobalVars(*FuncDecl->getBody(), *this); for (const auto *ParamDecl : FuncDecl->parameters()) { @@ -185,7 +187,7 @@ ReturnLoc = (ReturnType); } - if (const auto *MethodDecl = dyn_cast()) { + if (const auto *MethodDecl = dyn_cast(DeclCtx)) { auto *Parent = MethodDecl->getParent(); assert(Parent != nullptr); if (Parent->isLambda()) @@ -210,6 +212,9 @@ const auto *FuncDecl = Call->getDirectCallee(); assert(FuncDecl != nullptr); + + Env.setDeclCtx(FuncDecl); + // FIXME: In order to allow the callee to reference globals, we probably need // to call `initGlobalVars` here in some way. @@ -252,12 +257,12 @@ void Environment::popCall(const Environment ) { // We ignore `DACtx` because it's already the same in both. We don't want the - // callee's `ReturnLoc` or `ThisPointeeLoc`. We don't bring back `DeclToLoc` - // and `ExprToLoc` because we want to be able to later analyze the same callee - // in a different context, and `setStorageLocation` requires there to not - // already be a storage location assigned. Conceptually, these maps capture - // information from the local scope, so when popping that scope, we do not - // propagate the maps. + // callee's `DeclCtx`, `ReturnLoc` or `ThisPointeeLoc`. We don't bring back + // `DeclToLoc` and `ExprToLoc` because we want to be able to later analyze the + // same callee in a different context, and `setStorageLocation` requires there + // to not already be a storage location assigned. Conceptually, these maps + // capture information from the local scope, so when popping that scope, we do + // not propagate the maps. this->LocToVal = std::move(CalleeEnv.LocToVal); this->MemberLocToStruct = std::move(CalleeEnv.MemberLocToStruct); this->FlowConditionToken = std::move(CalleeEnv.FlowConditionToken); @@ -304,11 +309,13 @@ assert(DACtx == Other.DACtx); assert(ReturnLoc == Other.ReturnLoc); assert(ThisPointeeLoc == Other.ThisPointeeLoc); + assert(DeclCtx == Other.DeclCtx); auto Effect = LatticeJoinEffect::Unchanged; Environment JoinedEnv(*DACtx); + JoinedEnv.setDeclCtx(DeclCtx); JoinedEnv.ReturnLoc = ReturnLoc; JoinedEnv.ThisPointeeLoc = ThisPointeeLoc; Index: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h === --- clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h +++ clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h @@ -347,6 +347,13 @@ /// imply that `Val` is true. bool flowConditionImplies(BoolValue ) const; + /// Returns the `DeclContext` of the block being analysed, if any. Otherwise, + /// returns null. + const DeclContext *getDeclCtx() { return DeclCtx; } + + /// Sets the `DeclContext` of the block being analysed. + void setDeclCtx(const DeclContext *Ctx) { DeclCtx = Ctx; } + /// Returns the `ControlFlowContext` registered for `F`, if any. Otherwise, /// returns null. const ControlFlowContext *getControlFlowContext(const FunctionDecl *F) { @@ -377,6 +384,9 @@ // `DACtx` is not null and not owned by this object. DataflowAnalysisContext *DACtx; + // `DeclContext` of the block being analysed if provided. + const DeclContext *DeclCtx = nullptr; + // In a properly initialized `Environment`, `ReturnLoc` should only be null if // its `DeclContext` could not be cast to a `FunctionDecl`. StorageLocation *ReturnLoc = nullptr; ___ cfe-commits mailing list cfe-commits@lists.llvm.org
[PATCH] D131065: [clang][dataflow] Store DeclContext of block being analysed in Environment if available.
eugenis added a comment. Reverted. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D131065/new/ https://reviews.llvm.org/D131065 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D131065: [clang][dataflow] Store DeclContext of block being analysed in Environment if available.
eugenis added a comment. MSan is not happy: https://lab.llvm.org/buildbot/#/builders/74/builds/12717 Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D131065/new/ https://reviews.llvm.org/D131065 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D131065: [clang][dataflow] Store DeclContext of block being analysed in Environment if available.
This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rG8a4c40bfe8e6: [clang][dataflow] Store DeclContext of block being analysed in Environment if… (authored by wyt). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D131065/new/ https://reviews.llvm.org/D131065 Files: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp Index: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp === --- clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp +++ clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp @@ -154,7 +154,7 @@ : DACtx(), FlowConditionToken(()) {} Environment::Environment(const Environment ) -: DACtx(Other.DACtx), ReturnLoc(Other.ReturnLoc), +: DACtx(Other.DACtx), DeclCtx(Other.DeclCtx), ReturnLoc(Other.ReturnLoc), ThisPointeeLoc(Other.ThisPointeeLoc), DeclToLoc(Other.DeclToLoc), ExprToLoc(Other.ExprToLoc), LocToVal(Other.LocToVal), MemberLocToStruct(Other.MemberLocToStruct), @@ -168,9 +168,11 @@ } Environment::Environment(DataflowAnalysisContext , - const DeclContext ) + const DeclContext ) : Environment(DACtx) { - if (const auto *FuncDecl = dyn_cast()) { + setDeclCtx(); + + if (const auto *FuncDecl = dyn_cast(DeclCtx)) { assert(FuncDecl->getBody() != nullptr); initGlobalVars(*FuncDecl->getBody(), *this); for (const auto *ParamDecl : FuncDecl->parameters()) { @@ -185,7 +187,7 @@ ReturnLoc = (ReturnType); } - if (const auto *MethodDecl = dyn_cast()) { + if (const auto *MethodDecl = dyn_cast(DeclCtx)) { auto *Parent = MethodDecl->getParent(); assert(Parent != nullptr); if (Parent->isLambda()) @@ -210,6 +212,9 @@ const auto *FuncDecl = Call->getDirectCallee(); assert(FuncDecl != nullptr); + + Env.setDeclCtx(FuncDecl); + // FIXME: In order to allow the callee to reference globals, we probably need // to call `initGlobalVars` here in some way. @@ -252,12 +257,12 @@ void Environment::popCall(const Environment ) { // We ignore `DACtx` because it's already the same in both. We don't want the - // callee's `ReturnLoc` or `ThisPointeeLoc`. We don't bring back `DeclToLoc` - // and `ExprToLoc` because we want to be able to later analyze the same callee - // in a different context, and `setStorageLocation` requires there to not - // already be a storage location assigned. Conceptually, these maps capture - // information from the local scope, so when popping that scope, we do not - // propagate the maps. + // callee's `DeclCtx`, `ReturnLoc` or `ThisPointeeLoc`. We don't bring back + // `DeclToLoc` and `ExprToLoc` because we want to be able to later analyze the + // same callee in a different context, and `setStorageLocation` requires there + // to not already be a storage location assigned. Conceptually, these maps + // capture information from the local scope, so when popping that scope, we do + // not propagate the maps. this->LocToVal = std::move(CalleeEnv.LocToVal); this->MemberLocToStruct = std::move(CalleeEnv.MemberLocToStruct); this->FlowConditionToken = std::move(CalleeEnv.FlowConditionToken); @@ -304,11 +309,13 @@ assert(DACtx == Other.DACtx); assert(ReturnLoc == Other.ReturnLoc); assert(ThisPointeeLoc == Other.ThisPointeeLoc); + assert(DeclCtx == Other.DeclCtx); auto Effect = LatticeJoinEffect::Unchanged; Environment JoinedEnv(*DACtx); + JoinedEnv.setDeclCtx(DeclCtx); JoinedEnv.ReturnLoc = ReturnLoc; JoinedEnv.ThisPointeeLoc = ThisPointeeLoc; Index: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h === --- clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h +++ clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h @@ -347,6 +347,13 @@ /// imply that `Val` is true. bool flowConditionImplies(BoolValue ) const; + /// Returns the `DeclContext` of the block being analysed, if any. Otherwise, + /// returns null. + const DeclContext *getDeclCtx() { return DeclCtx; } + + /// Sets the `DeclContext` of the block being analysed. + void setDeclCtx(const DeclContext *Ctx) { DeclCtx = Ctx; } + /// Returns the `ControlFlowContext` registered for `F`, if any. Otherwise, /// returns null. const ControlFlowContext *getControlFlowContext(const FunctionDecl *F) { @@ -377,6 +384,9 @@ // `DACtx` is not null and not owned by this object. DataflowAnalysisContext *DACtx; + // `DeclContext` of the block being analysed if provided. + const DeclContext *DeclCtx; + // In a properly initialized `Environment`, `ReturnLoc` should only be null if // its `DeclContext` could not be cast to a
[PATCH] D131065: [clang][dataflow] Store DeclContext of block being analysed in Environment if available.
wyt updated this revision to Diff 451411. wyt added a comment. Relocate function and fix comment for consistency. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D131065/new/ https://reviews.llvm.org/D131065 Files: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp Index: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp === --- clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp +++ clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp @@ -154,7 +154,7 @@ : DACtx(), FlowConditionToken(()) {} Environment::Environment(const Environment ) -: DACtx(Other.DACtx), ReturnLoc(Other.ReturnLoc), +: DACtx(Other.DACtx), DeclCtx(Other.DeclCtx), ReturnLoc(Other.ReturnLoc), ThisPointeeLoc(Other.ThisPointeeLoc), DeclToLoc(Other.DeclToLoc), ExprToLoc(Other.ExprToLoc), LocToVal(Other.LocToVal), MemberLocToStruct(Other.MemberLocToStruct), @@ -168,9 +168,11 @@ } Environment::Environment(DataflowAnalysisContext , - const DeclContext ) + const DeclContext ) : Environment(DACtx) { - if (const auto *FuncDecl = dyn_cast()) { + setDeclCtx(); + + if (const auto *FuncDecl = dyn_cast(DeclCtx)) { assert(FuncDecl->getBody() != nullptr); initGlobalVars(*FuncDecl->getBody(), *this); for (const auto *ParamDecl : FuncDecl->parameters()) { @@ -185,7 +187,7 @@ ReturnLoc = (ReturnType); } - if (const auto *MethodDecl = dyn_cast()) { + if (const auto *MethodDecl = dyn_cast(DeclCtx)) { auto *Parent = MethodDecl->getParent(); assert(Parent != nullptr); if (Parent->isLambda()) @@ -210,6 +212,9 @@ const auto *FuncDecl = Call->getDirectCallee(); assert(FuncDecl != nullptr); + + Env.setDeclCtx(FuncDecl); + // FIXME: In order to allow the callee to reference globals, we probably need // to call `initGlobalVars` here in some way. @@ -252,12 +257,12 @@ void Environment::popCall(const Environment ) { // We ignore `DACtx` because it's already the same in both. We don't want the - // callee's `ReturnLoc` or `ThisPointeeLoc`. We don't bring back `DeclToLoc` - // and `ExprToLoc` because we want to be able to later analyze the same callee - // in a different context, and `setStorageLocation` requires there to not - // already be a storage location assigned. Conceptually, these maps capture - // information from the local scope, so when popping that scope, we do not - // propagate the maps. + // callee's `DeclCtx`, `ReturnLoc` or `ThisPointeeLoc`. We don't bring back + // `DeclToLoc` and `ExprToLoc` because we want to be able to later analyze the + // same callee in a different context, and `setStorageLocation` requires there + // to not already be a storage location assigned. Conceptually, these maps + // capture information from the local scope, so when popping that scope, we do + // not propagate the maps. this->LocToVal = std::move(CalleeEnv.LocToVal); this->MemberLocToStruct = std::move(CalleeEnv.MemberLocToStruct); this->FlowConditionToken = std::move(CalleeEnv.FlowConditionToken); @@ -304,11 +309,13 @@ assert(DACtx == Other.DACtx); assert(ReturnLoc == Other.ReturnLoc); assert(ThisPointeeLoc == Other.ThisPointeeLoc); + assert(DeclCtx == Other.DeclCtx); auto Effect = LatticeJoinEffect::Unchanged; Environment JoinedEnv(*DACtx); + JoinedEnv.setDeclCtx(DeclCtx); JoinedEnv.ReturnLoc = ReturnLoc; JoinedEnv.ThisPointeeLoc = ThisPointeeLoc; Index: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h === --- clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h +++ clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h @@ -347,6 +347,13 @@ /// imply that `Val` is true. bool flowConditionImplies(BoolValue ) const; + /// Returns the `DeclContext` of the block being analysed, if any. Otherwise, + /// returns null. + const DeclContext *getDeclCtx() { return DeclCtx; } + + /// Sets the `DeclContext` of the block being analysed. + void setDeclCtx(const DeclContext *Ctx) { DeclCtx = Ctx; } + /// Returns the `ControlFlowContext` registered for `F`, if any. Otherwise, /// returns null. const ControlFlowContext *getControlFlowContext(const FunctionDecl *F) { @@ -377,6 +384,9 @@ // `DACtx` is not null and not owned by this object. DataflowAnalysisContext *DACtx; + // `DeclContext` of the block being analysed if provided. + const DeclContext *DeclCtx; + // In a properly initialized `Environment`, `ReturnLoc` should only be null if // its `DeclContext` could not be cast to a `FunctionDecl`. StorageLocation *ReturnLoc = nullptr; ___ cfe-commits mailing list cfe-commits@lists.llvm.org
[PATCH] D131065: [clang][dataflow] Store DeclContext of block being analysed in Environment if available.
wyt updated this revision to Diff 450276. wyt marked an inline comment as done. wyt added a comment. Rebase to head. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D131065/new/ https://reviews.llvm.org/D131065 Files: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp Index: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp === --- clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp +++ clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp @@ -154,7 +154,7 @@ : DACtx(), FlowConditionToken(()) {} Environment::Environment(const Environment ) -: DACtx(Other.DACtx), ReturnLoc(Other.ReturnLoc), +: DACtx(Other.DACtx), DeclCtx(Other.DeclCtx), ReturnLoc(Other.ReturnLoc), ThisPointeeLoc(Other.ThisPointeeLoc), DeclToLoc(Other.DeclToLoc), ExprToLoc(Other.ExprToLoc), LocToVal(Other.LocToVal), MemberLocToStruct(Other.MemberLocToStruct), @@ -168,9 +168,11 @@ } Environment::Environment(DataflowAnalysisContext , - const DeclContext ) + const DeclContext ) : Environment(DACtx) { - if (const auto *FuncDecl = dyn_cast()) { + setDeclCtx(); + + if (const auto *FuncDecl = dyn_cast(DeclCtx)) { assert(FuncDecl->getBody() != nullptr); initGlobalVars(*FuncDecl->getBody(), *this); for (const auto *ParamDecl : FuncDecl->parameters()) { @@ -185,7 +187,7 @@ ReturnLoc = (ReturnType); } - if (const auto *MethodDecl = dyn_cast()) { + if (const auto *MethodDecl = dyn_cast(DeclCtx)) { auto *Parent = MethodDecl->getParent(); assert(Parent != nullptr); if (Parent->isLambda()) @@ -210,6 +212,9 @@ const auto *FuncDecl = Call->getDirectCallee(); assert(FuncDecl != nullptr); + + Env.setDeclCtx(FuncDecl); + // FIXME: In order to allow the callee to reference globals, we probably need // to call `initGlobalVars` here in some way. @@ -252,12 +257,12 @@ void Environment::popCall(const Environment ) { // We ignore `DACtx` because it's already the same in both. We don't want the - // callee's `ReturnLoc` or `ThisPointeeLoc`. We don't bring back `DeclToLoc` - // and `ExprToLoc` because we want to be able to later analyze the same callee - // in a different context, and `setStorageLocation` requires there to not - // already be a storage location assigned. Conceptually, these maps capture - // information from the local scope, so when popping that scope, we do not - // propagate the maps. + // callee's `DeclCtx`, `ReturnLoc` or `ThisPointeeLoc`. We don't bring back + // `DeclToLoc` and `ExprToLoc` because we want to be able to later analyze the + // same callee in a different context, and `setStorageLocation` requires there + // to not already be a storage location assigned. Conceptually, these maps + // capture information from the local scope, so when popping that scope, we do + // not propagate the maps. this->LocToVal = std::move(CalleeEnv.LocToVal); this->MemberLocToStruct = std::move(CalleeEnv.MemberLocToStruct); this->FlowConditionToken = std::move(CalleeEnv.FlowConditionToken); @@ -304,11 +309,13 @@ assert(DACtx == Other.DACtx); assert(ReturnLoc == Other.ReturnLoc); assert(ThisPointeeLoc == Other.ThisPointeeLoc); + assert(DeclCtx == Other.DeclCtx); auto Effect = LatticeJoinEffect::Unchanged; Environment JoinedEnv(*DACtx); + JoinedEnv.setDeclCtx(DeclCtx); JoinedEnv.ReturnLoc = ReturnLoc; JoinedEnv.ThisPointeeLoc = ThisPointeeLoc; Index: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h === --- clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h +++ clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h @@ -172,6 +172,13 @@ LatticeJoinEffect join(const Environment , Environment::ValueModel ); + /// Returns the `DeclContext` of the block being analysed if provided, + /// otherwise returns nullptr. + const DeclContext *getDeclCtx() { return DeclCtx; } + + /// Sets the `DeclContext` of the block being analysed. + void setDeclCtx(const DeclContext *Ctx) { DeclCtx = Ctx; } + // FIXME: Rename `createOrGetStorageLocation` to `getOrCreateStorageLocation`, // `getStableStorageLocation`, or something more appropriate. @@ -377,6 +384,9 @@ // `DACtx` is not null and not owned by this object. DataflowAnalysisContext *DACtx; + // `DeclContext` of the block being analysed if provided. + const DeclContext *DeclCtx; + // In a properly initialized `Environment`, `ReturnLoc` should only be null if // its `DeclContext` could not be cast to a `FunctionDecl`. StorageLocation *ReturnLoc = nullptr; ___ cfe-commits mailing list cfe-commits@lists.llvm.org
[PATCH] D131065: [clang][dataflow] Store DeclContext of block being analysed in Environment if available.
sgatev accepted this revision. sgatev added inline comments. Comment at: clang/lib/Analysis/FlowSensitive/Transfer.cpp:537-539 + auto *Caller = Env.getDeclCtx(); + Env = Environment(ExitState->Env); + Env.setDeclCtx(Caller); I believe you'll need to rebase because this has changed: https://github.com/llvm/llvm-project/blob/main/clang/lib/Analysis/FlowSensitive/Transfer.cpp#L567 Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D131065/new/ https://reviews.llvm.org/D131065 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D131065: [clang][dataflow] Store DeclContext of block being analysed in Environment if available.
wyt added a reviewer: samestep. wyt removed a subscriber: samestep. wyt added inline comments. Comment at: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp:170-172 + const DeclContext ) : Environment(DACtx) { + DeclCtx = sgatev wrote: > Unfortunately doesn't work, I get a warning about "An initializer for a delegating constructor must appear alone". Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D131065/new/ https://reviews.llvm.org/D131065 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D131065: [clang][dataflow] Store DeclContext of block being analysed in Environment if available.
wyt updated this revision to Diff 449666. wyt marked 3 inline comments as done. wyt added a comment. Formatting fixes. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D131065/new/ https://reviews.llvm.org/D131065 Files: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp clang/lib/Analysis/FlowSensitive/Transfer.cpp Index: clang/lib/Analysis/FlowSensitive/Transfer.cpp === --- clang/lib/Analysis/FlowSensitive/Transfer.cpp +++ clang/lib/Analysis/FlowSensitive/Transfer.cpp @@ -534,7 +534,9 @@ auto ExitState = (*BlockToOutputState)[ExitBlock]; assert(ExitState); - Env = ExitState->Env; + auto *Caller = Env.getDeclCtx(); + Env = Environment(ExitState->Env); + Env.setDeclCtx(Caller); } } Index: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp === --- clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp +++ clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp @@ -154,7 +154,7 @@ : DACtx(), FlowConditionToken(()) {} Environment::Environment(const Environment ) -: DACtx(Other.DACtx), DeclToLoc(Other.DeclToLoc), +: DACtx(Other.DACtx), DeclCtx(Other.DeclCtx), DeclToLoc(Other.DeclToLoc), ExprToLoc(Other.ExprToLoc), LocToVal(Other.LocToVal), MemberLocToStruct(Other.MemberLocToStruct), FlowConditionToken(>forkFlowCondition(*Other.FlowConditionToken)) { @@ -167,9 +167,11 @@ } Environment::Environment(DataflowAnalysisContext , - const DeclContext ) + const DeclContext ) : Environment(DACtx) { - if (const auto *FuncDecl = dyn_cast()) { + setDeclCtx(); + + if (const auto *FuncDecl = dyn_cast(DeclCtx)) { assert(FuncDecl->getBody() != nullptr); initGlobalVars(*FuncDecl->getBody(), *this); for (const auto *ParamDecl : FuncDecl->parameters()) { @@ -181,7 +183,7 @@ } } - if (const auto *MethodDecl = dyn_cast()) { + if (const auto *MethodDecl = dyn_cast(DeclCtx)) { auto *Parent = MethodDecl->getParent(); assert(Parent != nullptr); if (Parent->isLambda()) @@ -214,6 +216,8 @@ const auto *FuncDecl = Call->getDirectCallee(); assert(FuncDecl != nullptr); assert(FuncDecl->getBody() != nullptr); + + Env.setDeclCtx(FuncDecl); // FIXME: In order to allow the callee to reference globals, we probably need // to call `initGlobalVars` here in some way. @@ -268,12 +272,14 @@ LatticeJoinEffect Environment::join(const Environment , Environment::ValueModel ) { - assert(DACtx == Other.DACtx); + assert(DACtx == Other.DACtx && DeclCtx == Other.DeclCtx); auto Effect = LatticeJoinEffect::Unchanged; Environment JoinedEnv(*DACtx); + JoinedEnv.setDeclCtx(DeclCtx); + JoinedEnv.DeclToLoc = intersectDenseMaps(DeclToLoc, Other.DeclToLoc); if (DeclToLoc.size() != JoinedEnv.DeclToLoc.size()) Effect = LatticeJoinEffect::Changed; Index: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h === --- clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h +++ clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h @@ -167,6 +167,13 @@ LatticeJoinEffect join(const Environment , Environment::ValueModel ); + /// Returns the `DeclContext` of the block being analysed if provided, + /// otherwise returns nullptr. + const DeclContext *getDeclCtx() { return DeclCtx; } + + /// Sets the `DeclContext` of the block being analysed. + void setDeclCtx(const DeclContext *Ctx) { DeclCtx = Ctx; } + // FIXME: Rename `createOrGetStorageLocation` to `getOrCreateStorageLocation`, // `getStableStorageLocation`, or something more appropriate. @@ -363,6 +370,9 @@ // `DACtx` is not null and not owned by this object. DataflowAnalysisContext *DACtx; + // `DeclContext` of the block being analysed if provided. + const DeclContext *DeclCtx; + // Maps from program declarations and statements to storage locations that are // assigned to them. Unlike the maps in `DataflowAnalysisContext`, these // include only storage locations that are in scope for a particular basic ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D131065: [clang][dataflow] Store DeclContext of block being analysed in Environment if available.
wyt updated this revision to Diff 449664. wyt added a comment. Update DeclCtx when pushing/popping calls. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D131065/new/ https://reviews.llvm.org/D131065 Files: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp clang/lib/Analysis/FlowSensitive/Transfer.cpp Index: clang/lib/Analysis/FlowSensitive/Transfer.cpp === --- clang/lib/Analysis/FlowSensitive/Transfer.cpp +++ clang/lib/Analysis/FlowSensitive/Transfer.cpp @@ -534,7 +534,9 @@ auto ExitState = (*BlockToOutputState)[ExitBlock]; assert(ExitState); - Env = ExitState->Env; + auto *Caller = Env.getDeclCtx(); + Env = Environment(ExitState->Env); + Env.setDeclCtx(Caller); } } Index: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp === --- clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp +++ clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp @@ -154,7 +154,7 @@ : DACtx(), FlowConditionToken(()) {} Environment::Environment(const Environment ) -: DACtx(Other.DACtx), DeclToLoc(Other.DeclToLoc), +: DACtx(Other.DACtx), DeclCtx(Other.DeclCtx), DeclToLoc(Other.DeclToLoc), ExprToLoc(Other.ExprToLoc), LocToVal(Other.LocToVal), MemberLocToStruct(Other.MemberLocToStruct), FlowConditionToken(>forkFlowCondition(*Other.FlowConditionToken)) { @@ -167,9 +167,11 @@ } Environment::Environment(DataflowAnalysisContext , - const DeclContext ) + const DeclContext ) : Environment(DACtx) { - if (const auto *FuncDecl = dyn_cast()) { + setDeclCtx(); + + if (const auto *FuncDecl = dyn_cast(DeclCtx)) { assert(FuncDecl->getBody() != nullptr); initGlobalVars(*FuncDecl->getBody(), *this); for (const auto *ParamDecl : FuncDecl->parameters()) { @@ -181,7 +183,7 @@ } } - if (const auto *MethodDecl = dyn_cast()) { + if (const auto *MethodDecl = dyn_cast(DeclCtx)) { auto *Parent = MethodDecl->getParent(); assert(Parent != nullptr); if (Parent->isLambda()) @@ -214,6 +216,8 @@ const auto *FuncDecl = Call->getDirectCallee(); assert(FuncDecl != nullptr); assert(FuncDecl->getBody() != nullptr); + + Env.setDeclCtx(FuncDecl); // FIXME: In order to allow the callee to reference globals, we probably need // to call `initGlobalVars` here in some way. @@ -268,12 +272,14 @@ LatticeJoinEffect Environment::join(const Environment , Environment::ValueModel ) { - assert(DACtx == Other.DACtx); + assert(DACtx == Other.DACtx && DeclCtx == Other.DeclCtx); auto Effect = LatticeJoinEffect::Unchanged; Environment JoinedEnv(*DACtx); + JoinedEnv.setDeclCtx(DeclCtx); + JoinedEnv.DeclToLoc = intersectDenseMaps(DeclToLoc, Other.DeclToLoc); if (DeclToLoc.size() != JoinedEnv.DeclToLoc.size()) Effect = LatticeJoinEffect::Changed; Index: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h === --- clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h +++ clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h @@ -167,6 +167,13 @@ LatticeJoinEffect join(const Environment , Environment::ValueModel ); + /// Returns the `DeclCtx` of the block being analysed if provided, otherwise + /// returns nullptr. + const DeclContext *getDeclCtx() { return DeclCtx; } + + /// Sets the `DeclCtx` of the block being analysed. + void setDeclCtx(const DeclContext *Ctx) { DeclCtx = Ctx; } + // FIXME: Rename `createOrGetStorageLocation` to `getOrCreateStorageLocation`, // `getStableStorageLocation`, or something more appropriate. @@ -363,6 +370,9 @@ // `DACtx` is not null and not owned by this object. DataflowAnalysisContext *DACtx; + // `DeclCtx` of the block being analysed if provided. + const DeclContext *DeclCtx; + // Maps from program declarations and statements to storage locations that are // assigned to them. Unlike the maps in `DataflowAnalysisContext`, these // include only storage locations that are in scope for a particular basic ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D131065: [clang][dataflow] Store DeclContext of block being analysed in Environment if available.
samestep added inline comments. Comment at: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp:216 const auto *FuncDecl = Call->getDirectCallee(); assert(FuncDecl != nullptr); I think you need to set the `DeclCtx` field here (or at least, somewhere in this method). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D131065/new/ https://reviews.llvm.org/D131065 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D131065: [clang][dataflow] Store DeclContext of block being analysed in Environment if available.
sgatev accepted this revision. sgatev added inline comments. This revision is now accepted and ready to land. Comment at: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h:170 + /// Returns the `DeclCtx` of the block being analysed if provided, otherwise + /// returns nullptr. Comment at: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h:370 + // `DeclCtx` of the block being analysed if provided. + const DeclContext *DeclCtx; Comment at: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp:170-172 + const DeclContext ) : Environment(DACtx) { + DeclCtx = Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D131065/new/ https://reviews.llvm.org/D131065 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D131065: [clang][dataflow] Store DeclContext of block being analysed in Environment if available.
wyt created this revision. Herald added subscribers: martong, tschuett, xazax.hun. Herald added a reviewer: NoQ. Herald added a project: All. wyt requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D131065 Files: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp Index: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp === --- clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp +++ clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp @@ -154,7 +154,7 @@ : DACtx(), FlowConditionToken(()) {} Environment::Environment(const Environment ) -: DACtx(Other.DACtx), DeclToLoc(Other.DeclToLoc), +: DACtx(Other.DACtx), DeclCtx(Other.DeclCtx), DeclToLoc(Other.DeclToLoc), ExprToLoc(Other.ExprToLoc), LocToVal(Other.LocToVal), MemberLocToStruct(Other.MemberLocToStruct), FlowConditionToken(>forkFlowCondition(*Other.FlowConditionToken)) { @@ -167,9 +167,11 @@ } Environment::Environment(DataflowAnalysisContext , - const DeclContext ) + const DeclContext ) : Environment(DACtx) { - if (const auto *FuncDecl = dyn_cast()) { + DeclCtx = + + if (const auto *FuncDecl = dyn_cast(DeclCtx)) { assert(FuncDecl->getBody() != nullptr); initGlobalVars(*FuncDecl->getBody(), *this); for (const auto *ParamDecl : FuncDecl->parameters()) { @@ -181,7 +183,7 @@ } } - if (const auto *MethodDecl = dyn_cast()) { + if (const auto *MethodDecl = dyn_cast(DeclCtx)) { auto *Parent = MethodDecl->getParent(); assert(Parent != nullptr); if (Parent->isLambda()) @@ -268,12 +270,14 @@ LatticeJoinEffect Environment::join(const Environment , Environment::ValueModel ) { - assert(DACtx == Other.DACtx); + assert(DACtx == Other.DACtx && DeclCtx == Other.DeclCtx); auto Effect = LatticeJoinEffect::Unchanged; Environment JoinedEnv(*DACtx); + JoinedEnv.DeclCtx = DeclCtx; + JoinedEnv.DeclToLoc = intersectDenseMaps(DeclToLoc, Other.DeclToLoc); if (DeclToLoc.size() != JoinedEnv.DeclToLoc.size()) Effect = LatticeJoinEffect::Changed; Index: clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h === --- clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h +++ clang/include/clang/Analysis/FlowSensitive/DataflowEnvironment.h @@ -167,6 +167,10 @@ LatticeJoinEffect join(const Environment , Environment::ValueModel ); + /// Returns the `DeclCtx` of the block being analysed if provided, otherwise + /// returns nullptr. + const DeclContext *getDeclCtx() { return DeclCtx; } + // FIXME: Rename `createOrGetStorageLocation` to `getOrCreateStorageLocation`, // `getStableStorageLocation`, or something more appropriate. @@ -363,6 +367,9 @@ // `DACtx` is not null and not owned by this object. DataflowAnalysisContext *DACtx; + // `DeclCtx` of the block being analysed if provided. + const DeclContext *DeclCtx; + // Maps from program declarations and statements to storage locations that are // assigned to them. Unlike the maps in `DataflowAnalysisContext`, these // include only storage locations that are in scope for a particular basic Index: clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp === --- clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp +++ clang/lib/Analysis/FlowSensitive/DataflowEnvironment.cpp @@ -154,7 +154,7 @@ : DACtx(), FlowConditionToken(()) {} Environment::Environment(const Environment ) -: DACtx(Other.DACtx), DeclToLoc(Other.DeclToLoc), +: DACtx(Other.DACtx), DeclCtx(Other.DeclCtx), DeclToLoc(Other.DeclToLoc), ExprToLoc(Other.ExprToLoc), LocToVal(Other.LocToVal), MemberLocToStruct(Other.MemberLocToStruct), FlowConditionToken(>forkFlowCondition(*Other.FlowConditionToken)) { @@ -167,9 +167,11 @@ } Environment::Environment(DataflowAnalysisContext , - const DeclContext ) + const DeclContext ) : Environment(DACtx) { - if (const auto *FuncDecl = dyn_cast()) { + DeclCtx = + + if (const auto *FuncDecl = dyn_cast(DeclCtx)) { assert(FuncDecl->getBody() != nullptr); initGlobalVars(*FuncDecl->getBody(), *this); for (const auto *ParamDecl : FuncDecl->parameters()) { @@ -181,7 +183,7 @@ } } - if (const auto *MethodDecl = dyn_cast()) { + if (const auto *MethodDecl = dyn_cast(DeclCtx)) { auto *Parent = MethodDecl->getParent(); assert(Parent != nullptr); if (Parent->isLambda()) @@ -268,12 +270,14 @@ LatticeJoinEffect Environment::join(const