mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-03 21:16:05 +00:00

- Both of these constructs are used to represent structs, classes, and unions; Clang uses the collective term "record" for these. - The term "aggregate" in `AggregateStorageLocation` implies that, at some point, the intention may have been to use it also for arrays, but it don't think it's possible to use it for arrays. Records and arrays are very different and therefore need to be modeled differently. Records have a fixed set of named fields, which can have different type; arrays have a variable number of elements, but they all have the same type. - Futhermore, "aggregate" has a very specific meaning in C++ (https://en.cppreference.com/w/cpp/language/aggregate_initialization). Aggregates of class type may not have any user-declared or inherited constructors, no private or protected non-static data members, no virtual member functions, and so on, but we use `AggregateStorageLocations` to model all objects of class type. In addition, for consistency, we also rename the following: - `getAggregateLoc()` (in `RecordValue`, formerly known as `StructValue`) to simply `getLoc()`. - `refreshStructValue()` to `refreshRecordValue()` We keep the old names around as deprecated synonyms to enable clients to be migrated to the new names. Reviewed By: ymandel, xazax.hun Differential Revision: https://reviews.llvm.org/D156788
80 lines
2.5 KiB
C++
80 lines
2.5 KiB
C++
//===- DebugSupport.cpp -----------------------------------------*- C++ -*-===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file defines functions which generate more readable forms of data
|
|
// structures used in the dataflow analyses, for debugging purposes.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include <utility>
|
|
|
|
#include "clang/Analysis/FlowSensitive/DebugSupport.h"
|
|
#include "clang/Analysis/FlowSensitive/Solver.h"
|
|
#include "clang/Analysis/FlowSensitive/Value.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
|
|
namespace clang {
|
|
namespace dataflow {
|
|
|
|
llvm::StringRef debugString(Value::Kind Kind) {
|
|
switch (Kind) {
|
|
case Value::Kind::Integer:
|
|
return "Integer";
|
|
case Value::Kind::Pointer:
|
|
return "Pointer";
|
|
case Value::Kind::Record:
|
|
return "Record";
|
|
case Value::Kind::AtomicBool:
|
|
return "AtomicBool";
|
|
case Value::Kind::TopBool:
|
|
return "TopBool";
|
|
case Value::Kind::FormulaBool:
|
|
return "FormulaBool";
|
|
}
|
|
llvm_unreachable("Unhandled value kind");
|
|
}
|
|
|
|
llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
|
|
Solver::Result::Assignment Assignment) {
|
|
switch (Assignment) {
|
|
case Solver::Result::Assignment::AssignedFalse:
|
|
return OS << "False";
|
|
case Solver::Result::Assignment::AssignedTrue:
|
|
return OS << "True";
|
|
}
|
|
llvm_unreachable("Booleans can only be assigned true/false");
|
|
}
|
|
|
|
llvm::StringRef debugString(Solver::Result::Status Status) {
|
|
switch (Status) {
|
|
case Solver::Result::Status::Satisfiable:
|
|
return "Satisfiable";
|
|
case Solver::Result::Status::Unsatisfiable:
|
|
return "Unsatisfiable";
|
|
case Solver::Result::Status::TimedOut:
|
|
return "TimedOut";
|
|
}
|
|
llvm_unreachable("Unhandled SAT check result status");
|
|
}
|
|
|
|
llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Solver::Result &R) {
|
|
OS << debugString(R.getStatus()) << "\n";
|
|
if (auto Solution = R.getSolution()) {
|
|
std::vector<std::pair<Atom, Solver::Result::Assignment>> Sorted = {
|
|
Solution->begin(), Solution->end()};
|
|
llvm::sort(Sorted);
|
|
for (const auto &Entry : Sorted)
|
|
OS << Entry.first << " = " << Entry.second << "\n";
|
|
}
|
|
return OS;
|
|
}
|
|
|
|
} // namespace dataflow
|
|
} // namespace clang
|