Multiplicity — Allocation Multiplicity Classification
Allocation multiplicity classifies each allocation site (global, stack, or heap) as either Unique (executed at most once per program invocation) or Summary (potentially executed multiple times).
Headers: include/Analysis/Multiplicity/
Implementation: lib/Analysis/Multiplicity/
Public API:
- lotus::analysis::multiplicity::classifyModuleMultiplicity
— classify all allocations in a module
Overview
The analysis inspects every allocation site in a module and assigns a multiplicity classification:
Unique — the allocation executes at most once per program run. Applies to: - All global variables (always Unique) - Stack allocations (alloca) in functions without loops - Heap allocations (malloc/calloc/realloc) in functions that are
both loop-free and called from at most one call site
Summary — the allocation may execute multiple times. Applies to: - Allocations inside loop-bearing functions - Heap allocations in functions called from multiple call sites
Heap Allocation Detection
Heap allocation functions are identified using the AliasSpecManager,
which recognizes standard allocators (malloc, calloc, realloc,
operator new, etc.) by their known function roles.
Usage
#include "Analysis/Multiplicity/MultiplicityClassifier.h"
llvm::Module &M = ...;
auto result = lotus::analysis::multiplicity::
classifyModuleMultiplicity(M);
for (const auto &[value, mult] : result.allocations) {
if (mult == lotus::analysis::multiplicity::AllocationMultiplicity::Unique)
errs() << "Unique allocation: " << *value << "\n";
}