Endre =?utf-8?q?Fülöp?= <endre.fu...@sigmatechnology.com>, Endre =?utf-8?q?Fülöp?= <endre.fu...@sigmatechnology.com>, Endre =?utf-8?q?Fülöp?= <endre.fu...@sigmatechnology.com>, Endre =?utf-8?q?Fülöp?= <endre.fu...@sigmatechnology.com> Message-ID: In-Reply-To: <llvm.org/llvm/llvm-project/pull/109...@github.com>
================ @@ -0,0 +1,169 @@ +//===--- MutexModelingGDM.h - Modeling of mutexes in GDM ------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Defines the GDM definitions for tracking mutex states. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_MUTEXMODELINGGDM_H +#define LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_MUTEXMODELINGGDM_H + +#include "MutexModelingDomain.h" + +#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h" +#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h" +#include "llvm/ADT/FoldingSet.h" + +// GDM-related handle-types for tracking mutex states. +namespace clang { +namespace ento { +namespace mutex_modeling { + +// Raw data of the mutex events. +class MutexEvents {}; +using MutexEventsTy = llvm::ImmutableList<EventMarker>; + +// Aggregated data structures for tracking critical sections. +class CritSections {}; +using CritSectionsTy = llvm::ImmutableList<CritSectionMarker>; + +// Aggregated data structures for tracking mutex states. +class LockStates {}; +using LockStatesTy = llvm::ImmutableMap<const MemRegion *, LockStateKind>; + +// Tracks return values of destroy operations for potentially destroyed mutexes +class DestroyedRetVals {}; +using DestroyedRetValsTy = llvm::ImmutableMap<const MemRegion *, SymbolRef>; + +} // namespace mutex_modeling +} // namespace ento +} // namespace clang + +// Enable usage of mutex modeling data structures in llvm::FoldingSet. +namespace llvm { +// Specialization for EventMarker to allow its use in FoldingSet +template <> struct FoldingSetTrait<clang::ento::mutex_modeling::EventMarker> { + static void Profile(const clang::ento::mutex_modeling::EventMarker &EM, + llvm::FoldingSetNodeID &ID) { + ID.Add(EM.Kind); + ID.Add(EM.Library); + ID.Add(EM.Semantics); + ID.Add(EM.EventII); + ID.Add(EM.EventExpr); + ID.Add(EM.MutexRegion); + } +}; + +// Specialization for CritSectionMarker to allow its use in FoldingSet +template <> +struct FoldingSetTrait<clang::ento::mutex_modeling::CritSectionMarker> { + static void Profile(const clang::ento::mutex_modeling::CritSectionMarker &CSM, + llvm::FoldingSetNodeID &ID) { + ID.Add(CSM.BeginExpr); + ID.Add(CSM.MutexRegion); + } +}; +} // namespace llvm + +// Iterator traits for ImmutableList and ImmutableMap data structures +// that enable the use of STL algorithms. +namespace std { ---------------- steakhal wrote: I don't think you are allowed to put these within the `std` namespace. I was thinking about why are you doing this. It is because the `llvm::ImmutableList<*>::iterator` does not define the types to let the `std::iterator_traits<T>` recognize it as an iterator. I'd highly suggest fixing the root cause, and not opening the `std` namespace. Just add define the following for the ImmutableList iterator: - `difference_type` - `value_type` - `pointer` - `reference` - `iterator_category` This is the reason why you could use `llvm::make_filter_range()` of an ImmutableList. https://github.com/llvm/llvm-project/pull/109636 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits