[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`.
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.
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.
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.