Built-in LLVM passes

The framework features a number of useful analysis/transformation passes that you can use in your own instances/passes. The passes are listed below, with the supported LLVM versions in parentheses.

Transform passes

-dump-ir (3.8.0/4.0.0): Dumps the current module IR of the program that is being linked in human-readable bitcode file with the “.ll” extension. Prints the location of the created file to stderr. Optionally, the target filename can be set by calling DEBUG_MODULE_NAME("myname"); after including dump-ir-helper.h from the built-in passes.

-custominline (3.8.0/4.0.0): Custom inliner for helper functions from statically linked runtime libraries. Inlines calls to functions that have __attribute__((always_inline)) and functions whose name starts with __noinstrument__inline_.

-defer-global-init (3.8.0): Changes all global initializers to zero-initializers and adds a global constructor function that initializes the globals instead. In combination with -expand-const-global-uses, this is useful for instrumenting globals without having to deal with constant expressions (but only with instructions).

-expand-const-global-uses (3.8.0): Expands all uses of constant expressions (ConstExpr) in functions to equivalent instructions. This limts edge cases during instrumentation, and can be undone with -instcombine.

TODO: Combine -defer-global-init and -expand-const-global-uses into a single -expand-constexprs pass that expands all constant expressions to instructions.

Analysis passes

-sizeof-types (3.8.0): Finds allocated types for calls to malloc based on sizeof expression in the source code. Must be used in conjunction with the accompanying compiler wrapper and compile-time pass. See header file for usage.

Utility headers

Utilities to be used in custom LLVM pass implementations. These require use_builtins=True to be passed to infra.packages.LLVM. See the source code for a complete reference.

builtin/Common.h (3.8.0/4.0.0): Includes a bunch of much-used LLVM headers and defines some helper functions.

builtin/Allocation.h (3.8.0/4.0.0): Helpers to populate an AllocationSite struct with standardized information about any stack/heap allocations.

TODO: rewrite builtin/Allocation.h to an -allocs analysis pass.

builtin/CustomFunctionPass.h (3.8.0/4.0.0): Defines the CustomFunctionPass class which serves as a drop-in replacement for LLVM’s FunctionPass, but really is a ModulePass. This is necessary because the link-time passes plugin does not support function passes because of things and reasons.