[NFCI][analyzer] Add a clean way to generate nodes (#182377)

Currently the most common way for generating nodes is a complicated and
confusing boilerplate approach, which appears in many places:
- A `NodeBuilderContext` is constructed from a `CoreEngine &` and two
other irrelevant arguments.
- A short-lived temporary `NodeBuilder` is constructed from the
`NodeBuilderContext` and some almost irrelevant node sets.
- `NodeBuilder::generateNode()` is invoked once and accesses the graph
through the `CoreEngine &` to generate the node.

To simplify this, I'm cutting out the wrapper layers and extracting the
"main logic" of the method `NodeBuilder::generateNode()` to a new method
called `CoreEngine::makeNode()`. Eventually I intend to replace most use
of `NodeBuilder`s with direct calls to this method.

To ensure that this new `makeNode()` doesn't generate non-sink nodes
with `PosteriorlyOverconstrained` state, I moved the
`isPosteriorlyOverconstrained()` check from `CoreEngine::generateNode()`
to `makeNode()`.

This is technically speaking not an NFC change, because it prevents
`BranchNodeBuilder::generateNode()` from generating non-sink nodes with
`PosteriorlyOverconstrained` state (previously it was able to do so
because it calls `NodeBuilder::generateNodeImpl()` instead of
`NodeBuilder::generateNode()`).

However I labelled this as an NFCI change, as I'm fairly confident that
this won't lead to any observable changes because:
- `PosteriorlyOverconstrained` states are very rare.
- A state derived from a `PosteriorlyOverconstrained` state is also
posteriorly overconstrained, so if `BranchNodeBuilder` fails to sink the
execution path, it will be sunk anyway at the next transition which is
done by a plain `NodeBuilder`.

Note that simulated paths with a `PosteriorlyOverconstrained` state do
not correspond to real paths that can occur during the actual execution
of the program, so the analyzer should stop following them as soon as
possible. For more explanation see the doc-comment above the data member
`bool PosteriorlyOverconstrained` within `ProgramState`.
3 files changed
tree: 2a4eb56ae1dc55b89bcd3185b2df6236b90d4f18
  1. .ci/
  2. .github/
  3. bolt/
  4. clang/
  5. clang-tools-extra/
  6. cmake/
  7. compiler-rt/
  8. cross-project-tests/
  9. flang/
  10. flang-rt/
  11. libc/
  12. libclc/
  13. libcxx/
  14. libcxxabi/
  15. libsycl/
  16. libunwind/
  17. lld/
  18. lldb/
  19. llvm/
  20. llvm-libgcc/
  21. mlir/
  22. offload/
  23. openmp/
  24. orc-rt/
  25. polly/
  26. runtimes/
  27. third-party/
  28. utils/
  29. .clang-format
  30. .clang-format-ignore
  31. .clang-tidy
  32. .git-blame-ignore-revs
  33. .gitattributes
  34. .gitignore
  35. .mailmap
  36. CODE_OF_CONDUCT.md
  37. CONTRIBUTING.md
  38. LICENSE.TXT
  39. pyproject.toml
  40. README.md
  41. SECURITY.md
README.md

The LLVM Compiler Infrastructure

OpenSSF Scorecard OpenSSF Best Practices libc++

Welcome to the LLVM project!

This repository contains the source code for LLVM, a toolkit for the construction of highly optimized compilers, optimizers, and run-time environments.

The LLVM project has multiple components. The core of the project is itself called “LLVM”. This contains all of the tools, libraries, and header files needed to process intermediate representations and convert them into object files. Tools include an assembler, disassembler, bitcode analyzer, and bitcode optimizer.

C-like languages use the Clang frontend. This component compiles C, C++, Objective-C, and Objective-C++ code into LLVM bitcode -- and from there into object files, using LLVM.

Other components include: the libc++ C++ standard library, the LLD linker, and more.

Getting the Source Code and Building LLVM

Consult the Getting Started with LLVM page for information on building and running LLVM.

For information on how to contribute to the LLVM project, please take a look at the Contributing to LLVM guide.

Getting in touch

Join the LLVM Discourse forums, Discord chat, LLVM Office Hours or Regular sync-ups.

The LLVM project has adopted a code of conduct for participants to all modes of communication within the project.