module LLVM.Analysis.UsesOf (
UseSummary,
computeUsesOf,
usedBy
) where
import qualified Data.Foldable as F
import Data.HashMap.Strict ( HashMap )
import qualified Data.HashMap.Strict as HM
import qualified Data.HashSet as HS
import Data.Maybe ( fromMaybe )
import LLVM.Analysis
data UseSummary = UseSummary (HashMap Value [Instruction])
computeUsesOf :: Module -> UseSummary
computeUsesOf m = UseSummary $ fmap HS.toList uses
where
uses = F.foldl' funcUses HM.empty fs
fs = moduleDefinedFunctions m
funcUses acc f = F.foldl' addInstUses acc (functionInstructions f)
addInstUses acc i = F.foldl' (addUses i) acc (instructionOperands i)
addUses i acc v = HM.insertWith HS.union v (HS.singleton i) acc
usedBy :: UseSummary -> Value -> [Instruction]
usedBy (UseSummary m) v = fromMaybe [] $ HM.lookup v m