diff options
author | tomsmeding <tom.smeding@gmail.com> | 2017-08-19 11:05:43 +0200 |
---|---|---|
committer | tomsmeding <tom.smeding@gmail.com> | 2017-08-19 11:05:43 +0200 |
commit | 694ec05bcad01fd27606aace73b49cdade16945e (patch) | |
tree | 5c7a0433232f0860ef18f1634510d4f823ce5bdb /ReplaceRefs.hs |
Initial
Diffstat (limited to 'ReplaceRefs.hs')
-rw-r--r-- | ReplaceRefs.hs | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/ReplaceRefs.hs b/ReplaceRefs.hs new file mode 100644 index 0000000..3ab73c3 --- /dev/null +++ b/ReplaceRefs.hs @@ -0,0 +1,36 @@ +module ReplaceRefs + (replaceRefsIns, replaceRefsTerm, replaceRefsBB, replaceRefsBBList) + where + +import Intermediate + + +replaceRefsIns :: Ref -> Ref -> IRIns -> IRIns +replaceRefsIns from to (IMov a b) = IMov (trans from to a) (trans from to b) +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) = IAri at (trans from to a) (trans from to b) +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 _ _ 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 _ _ 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 |