module ReplaceRefs (replaceRef, replaceRefsIns, replaceRefsTerm, replaceRefsBB, replaceRefsBBList) where import Intermediate replaceRef :: Ref -> Ref -> Ref -> Ref replaceRef = trans replaceRefsIns :: Ref -> Ref -> IRIns -> IRIns replaceRefsIns from to (IMov a b) = IMov (trans from to a) (trans from to b) replaceRefsIns from to (ILea a n) = ILea (trans from to a) n replaceRefsIns from to (IStore a b) = IStore (trans from to a) (trans from to b) replaceRefsIns from to (ILoad a b) = ILoad (trans from to a) (trans from to b) replaceRefsIns from to (IAri at a b c) = IAri at (trans from to a) (trans from to b) (trans from to c) replaceRefsIns from to (ICall n al) = ICall n (map (trans from to) al) replaceRefsIns from to (ICallr a n al) = ICallr (trans from to a) n (map (trans from to) al) replaceRefsIns from to (IResize a b) = IResize (trans from to a) (trans from to b) replaceRefsIns _ _ IDebugger = IDebugger replaceRefsIns _ _ INop = INop replaceRefsTerm :: Ref -> Ref -> IRTerm -> IRTerm replaceRefsTerm from to (IJcc ct a b i1 i2) = IJcc ct (trans from to a) (trans from to b) i1 i2 replaceRefsTerm _ _ (IJmp i) = IJmp i replaceRefsTerm _ _ IRet = IRet replaceRefsTerm from to (IRetr a) = IRetr (trans from to a) replaceRefsTerm _ _ IUnreachable = IUnreachable replaceRefsTerm _ _ ITermNone = ITermNone replaceRefsBB :: Ref -> Ref -> BB -> BB replaceRefsBB from to (BB bid inss term) = BB bid (map (replaceRefsIns from to) inss) (replaceRefsTerm from to term) replaceRefsBBList :: Ref -> Ref -> [BB] -> [BB] replaceRefsBBList from to bbs = map (\bb -> replaceRefsBB from to bb) bbs trans :: Ref -> Ref -> Ref -> Ref trans from to ref | ref == from = to | otherwise = ref