Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
5898031
Add symbolic execution support with Python policy bindings and test s…
pgoodman Apr 24, 2026
101d2ee
Deduplicate memory ops across policies and add AtomicExpr codegen
pgoodman Apr 24, 2026
1420dbc
Add __builtin_clzs and __builtin_ctzs to bitwise intrinsic table
pgoodman Apr 24, 2026
1ba7138
Show callee name in CALL instruction to_string format
pgoodman Apr 24, 2026
cacc787
Fix float value representation and narrowing in interpreter
pgoodman Apr 24, 2026
71281e3
Fix float memory ops, as_float32 width bug, and test oracles
pgoodman Apr 24, 2026
5725938
Refactor interpreter to polymorphic Continuation and sharable state
pgoodman Apr 26, 2026
22e9d1a
Add symex Phase 0: mid-block entry and place_at primitives
pgoodman Apr 26, 2026
58831b1
Add symex Phase 1: SymExEngine, Layout, Path, ExploreUntil
pgoodman Apr 26, 2026
abfd7b7
Add symex Phase 2: intercept/observe namespaces with composable hooks
pgoodman Apr 26, 2026
0ac9bf6
Add symex Phase 3: loop policy, path snapshot/replay, DFS/BFS
pgoodman Apr 26, 2026
77754f8
Add symex Phase 4: queryable events, z3 solver, path summaries
pgoodman Apr 27, 2026
18af96e
Add symex Phase 5: typed address strategies + per-site overrides
pgoodman Apr 27, 2026
61805f1
Document: no .FROM casts in Python
pgoodman Apr 27, 2026
71c7c3b
Add symex Phase 6: region-aware memory model + sink oracles
pgoodman Apr 27, 2026
0d568f8
Add symex Phase 7: ptr_add dispatch + organic OOB witness
pgoodman Apr 27, 2026
b7e2549
Add symex Phase 8a: symbolic_load/store policy hooks
pgoodman Apr 27, 2026
694b056
Add symex Phase 8b: symbolic returns + global access events
pgoodman Apr 27, 2026
707e737
Add symex Phase 8c: drop RET's operand; symbolic-capable substrate slots
pgoodman Apr 27, 2026
58fd467
Add symex Phase 8d: close analyst-facing gaps
pgoodman Apr 27, 2026
fd16086
Add symex Phase 8e: fix LOCAL_VALUE alloca regression + float overlay
pgoodman Apr 28, 2026
3ad9aa3
Importer: drop -o /dev/null re-add and skip preprocess-only commands
pgoodman Apr 28, 2026
6fee0cb
Drop .FROM downcasts in Python helpers per binding policy
pgoodman Apr 28, 2026
ca5690d
Add symex Phase 8f: explore_many entry-set exploration
pgoodman Apr 28, 2026
706778b
Add symex Phase 9: total address-space mediation
pgoodman Apr 28, 2026
43b1cfa
Add symex Phase 10: path.origin(expr) provenance walk
pgoodman Apr 28, 2026
e61c3ab
docs: add Phase 10 provenance-walk section to symex-vision
pgoodman Apr 28, 2026
5bf793b
Add symex Phase 11: PathSet analysis + Path taint helpers
pgoodman Apr 28, 2026
e96978b
docs: add Phase 11 PathSet analysis section to symex-vision
pgoodman Apr 28, 2026
230f72c
Add symex Phase 12: Path SMT query helpers
pgoodman Apr 28, 2026
34a9df7
docs: add Phase 12 SMT query helpers section to symex-vision
pgoodman Apr 28, 2026
1783ead
Fix symex Phase 13: complete _Snapshot for all fields added in Phases…
pgoodman Apr 28, 2026
b9a8e7e
docs: add Phase 13 _Snapshot completeness entry to symex-vision
pgoodman Apr 28, 2026
f44bbef
Add symex Phase 14: EventLog groupby/last/unique, Layout.name_for, pa…
pgoodman Apr 28, 2026
447ddf8
docs: add Phase 14 EventLog/Layout/condition_str entry to symex-vision
pgoodman Apr 28, 2026
7d1dff6
Add symex integration test corpus + fix provenance for external z3 args
pgoodman Apr 28, 2026
4f548ec
Move symex under multiplier.symex; add LocalsView to lens
pgoodman Apr 28, 2026
ac9ebcf
Layout: accept optional memory parameter
pgoodman Apr 28, 2026
b4cc36c
Layout: add place_string with suffix sharing
pgoodman Apr 28, 2026
ce76093
Layout.place_string: simplify — no suffix sharing, trust user addresses
pgoodman Apr 28, 2026
c79cf55
Fix ThreadLocal address-reuse crash + corpus/test fixes
pgoodman Apr 28, 2026
734899b
Wire observe.instruction end-to-end
pgoodman Apr 28, 2026
8a9473a
Fix: skip IR initializer for layout pre-placed globals
pgoodman Apr 28, 2026
2e9fa68
Propagate intercept handler exceptions through C++ interpreter loop
pgoodman Apr 28, 2026
2caf14e
Thread call/branch instruction through to Python policy callbacks
pgoodman Apr 29, 2026
eba603e
Dispatch IRInstruction to most-derived Python type; propagate inst to…
pgoodman Apr 29, 2026
aacfbaf
IRStructure: dispatch to_python to most-derived Python subtype
pgoodman Apr 29, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
22 changes: 22 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Building

Always build with `--quiet` (or `-q`) to keep output focused on warnings and errors.

Build directories:
- Release: `~/Build/multiplier/Release/multiplier`
- Debug: `~/Build/multiplier/Debug/multiplier`

Example:
```
ninja -C ~/Build/multiplier/Debug/multiplier --quiet
```

# Python bindings

Multiplier's Python bindings already return the most-derived type. Don't
write `mx.ast.FunctionDecl.FROM(decl)` (or any other `.FROM(...)` cast)
to refine an entity in Python — the object you got out of an iterator,
property, or lookup is already the right subclass. Use `isinstance(...)`
when you genuinely need to gate on type, and access typed attributes
(`fd.parameters`, `vd.type`, etc.) directly. The `.FROM` pattern is a
C++-style code smell here and reads as one in review.
9 changes: 7 additions & 2 deletions bin/Bootstrap/Python.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,17 @@
#include <multiplier/Index.h>

#include <multiplier/IR/Function.h>
#include <multiplier/IR/FunctionKind.h>
#include <multiplier/IR/Block.h>
#include <multiplier/IR/BlockKind.h>
#include <multiplier/IR/Instruction.h>
#include <multiplier/IR/InstructionKinds.h>
#include <multiplier/IR/Object.h>
#include <multiplier/IR/OpCode.h>
#include <multiplier/IR/ObjectKind.h>
#include <multiplier/IR/BlockKind.h>
#include <multiplier/IR/OpCode.h>
#include <multiplier/IR/Structure.h>
#include <multiplier/IR/StructureKind.h>
#include <multiplier/IR/StructureKinds.h>

#include <multiplier/Re2.h>
#include <multiplier/Reference.h>
21 changes: 15 additions & 6 deletions bin/Bootstrap/PythonBindings.py
Original file line number Diff line number Diff line change
Expand Up @@ -859,9 +859,13 @@ class UserToken;

// Assign each enumerator.
for (T val : EnumerationRange<T>()) {
const char *name_cstr = EnumeratorName(val);
if (!name_cstr) {
continue; // Skip gap values.
}
auto ival = PyLong_FromUnsignedLongLong(static_cast<uint64_t>(val));
if (ival) {
auto iname = PyUnicode_FromString(EnumeratorName(val));
auto iname = PyUnicode_FromString(name_cstr);
if (!PyObject_SetItem(ns_dict, iname, ival)) {
continue;
}
Expand Down Expand Up @@ -920,12 +924,17 @@ class UserToken;
#include <multiplier/Frontend.h>
#include <multiplier/Index.h>
#include <multiplier/IR/Function.h>
#include <multiplier/IR/FunctionKind.h>
#include <multiplier/IR/Block.h>
#include <multiplier/IR/BlockKind.h>
#include <multiplier/IR/Instruction.h>
#include <multiplier/IR/InstructionKinds.h>
#include <multiplier/IR/Object.h>
#include <multiplier/IR/OpCode.h>
#include <multiplier/IR/ObjectKind.h>
#include <multiplier/IR/BlockKind.h>
#include <multiplier/IR/OpCode.h>
#include <multiplier/IR/Structure.h>
#include <multiplier/IR/StructureKind.h>
#include <multiplier/IR/StructureKinds.h>
#include <multiplier/Re2.h>
#include <multiplier/Reference.h>

Expand Down Expand Up @@ -1129,7 +1138,7 @@ def rename_method(self, class_schema: ClassSchema,

def _wrap_method_impl(class_schema: ClassSchema, schema: MethodSchema,
is_static: bool, is_overload: bool, out: List[str],
stubs_out: List[str]):
stubs_out: List[str], renamer: "Renamer" = None):
global FROM_EXPORTS, TO_EXPORTS

if isinstance(schema.return_type, UnknownSchema):
Expand Down Expand Up @@ -1233,9 +1242,9 @@ def _wrap_method(class_schema: ClassSchema, schema: NamedSchema,

if isinstance(schema, OverloadSetSchema):
for method in schema.overloads:
_wrap_method_impl(class_schema, method, is_static, True, out, stubs_out)
_wrap_method_impl(class_schema, method, is_static, True, out, stubs_out, renamer)
elif isinstance(schema, MethodSchema):
_wrap_method_impl(class_schema, schema, is_static, False, out, stubs_out)
_wrap_method_impl(class_schema, schema, is_static, False, out, stubs_out, renamer)
else:
assert False

Expand Down
Loading
Loading