xref: /llvm-project/clang/lib/Analysis/FlowSensitive/Value.cpp (revision e8fce95887ecfd87a83db8dbb0cc55966b004d6f)
18cadac41SYitzhak Mandelbaum //===-- Value.cpp -----------------------------------------------*- C++ -*-===//
28cadac41SYitzhak Mandelbaum //
38cadac41SYitzhak Mandelbaum // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
48cadac41SYitzhak Mandelbaum // See https://llvm.org/LICENSE.txt for license information.
58cadac41SYitzhak Mandelbaum // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68cadac41SYitzhak Mandelbaum //
78cadac41SYitzhak Mandelbaum //===----------------------------------------------------------------------===//
88cadac41SYitzhak Mandelbaum //
98cadac41SYitzhak Mandelbaum //  This file defines support functions for the `Value` type.
108cadac41SYitzhak Mandelbaum //
118cadac41SYitzhak Mandelbaum //===----------------------------------------------------------------------===//
128cadac41SYitzhak Mandelbaum 
138cadac41SYitzhak Mandelbaum #include "clang/Analysis/FlowSensitive/Value.h"
14c441f65fSYitzhak Mandelbaum #include "clang/Analysis/FlowSensitive/DebugSupport.h"
158cadac41SYitzhak Mandelbaum #include "llvm/Support/Casting.h"
168cadac41SYitzhak Mandelbaum 
178cadac41SYitzhak Mandelbaum namespace clang {
188cadac41SYitzhak Mandelbaum namespace dataflow {
198cadac41SYitzhak Mandelbaum 
areEquivalentIndirectionValues(const Value & Val1,const Value & Val2)208cadac41SYitzhak Mandelbaum static bool areEquivalentIndirectionValues(const Value &Val1,
218cadac41SYitzhak Mandelbaum                                            const Value &Val2) {
228cadac41SYitzhak Mandelbaum   if (auto *IndVal1 = dyn_cast<PointerValue>(&Val1)) {
238cadac41SYitzhak Mandelbaum     auto *IndVal2 = cast<PointerValue>(&Val2);
248cadac41SYitzhak Mandelbaum     return &IndVal1->getPointeeLoc() == &IndVal2->getPointeeLoc();
258cadac41SYitzhak Mandelbaum   }
268cadac41SYitzhak Mandelbaum   return false;
278cadac41SYitzhak Mandelbaum }
288cadac41SYitzhak Mandelbaum 
areEquivalentValues(const Value & Val1,const Value & Val2)298cadac41SYitzhak Mandelbaum bool areEquivalentValues(const Value &Val1, const Value &Val2) {
30*65ecbdf6SYitzhak Mandelbaum   if (&Val1 == &Val2)
31*65ecbdf6SYitzhak Mandelbaum     return true;
32*65ecbdf6SYitzhak Mandelbaum   if (Val1.getKind() != Val2.getKind())
33*65ecbdf6SYitzhak Mandelbaum     return false;
34*65ecbdf6SYitzhak Mandelbaum   // If values are distinct and have properties, we don't consider them equal,
35*65ecbdf6SYitzhak Mandelbaum   // leaving equality up to the user model.
36*65ecbdf6SYitzhak Mandelbaum   if (!Val1.properties().empty() || !Val2.properties().empty())
37*65ecbdf6SYitzhak Mandelbaum     return false;
38*65ecbdf6SYitzhak Mandelbaum   if (isa<TopBoolValue>(&Val1))
39*65ecbdf6SYitzhak Mandelbaum     return true;
40*65ecbdf6SYitzhak Mandelbaum   return areEquivalentIndirectionValues(Val1, Val2);
418cadac41SYitzhak Mandelbaum }
428cadac41SYitzhak Mandelbaum 
operator <<(raw_ostream & OS,const Value & Val)43c441f65fSYitzhak Mandelbaum raw_ostream &operator<<(raw_ostream &OS, const Value &Val) {
44c441f65fSYitzhak Mandelbaum   switch (Val.getKind()) {
4564ed4edcSmartinboehme   case Value::Kind::Integer:
4664ed4edcSmartinboehme     return OS << "Integer(@" << &Val << ")";
4764ed4edcSmartinboehme   case Value::Kind::Pointer:
4864ed4edcSmartinboehme     return OS << "Pointer(" << &cast<PointerValue>(Val).getPointeeLoc() << ")";
4964ed4edcSmartinboehme   case Value::Kind::TopBool:
5064ed4edcSmartinboehme     return OS << "TopBool(" << cast<TopBoolValue>(Val).getAtom() << ")";
5164ed4edcSmartinboehme   case Value::Kind::AtomicBool:
5264ed4edcSmartinboehme     return OS << "AtomicBool(" << cast<AtomicBoolValue>(Val).getAtom() << ")";
5364ed4edcSmartinboehme   case Value::Kind::FormulaBool:
5464ed4edcSmartinboehme     return OS << "FormulaBool(" << cast<FormulaBoolValue>(Val).formula() << ")";
55c441f65fSYitzhak Mandelbaum   }
568d720790SSimon Pilgrim   llvm_unreachable("Unknown clang::dataflow::Value::Kind enum");
57c441f65fSYitzhak Mandelbaum }
58c441f65fSYitzhak Mandelbaum 
598cadac41SYitzhak Mandelbaum } // namespace dataflow
608cadac41SYitzhak Mandelbaum } // namespace clang
61