{-# LANGUAGE DeriveGeneric, DefaultSignatures, StrictData #-}

{-|
Module      : JumpTarget
Description : A datatype for resolving the operand of a jump/call
-}

module Data.JumpTarget where

import Base

import Data.Word

import qualified Data.Serialize as Cereal hiding (get,put)
import Control.DeepSeq
import GHC.Generics (Generic)

-- | Resolving the operand of a jump/call can produce one of the following.
data ResolvedJumpTarget =
   Unresolved               -- ^ An indirect branch that has not been resolved yet
 | External String          -- ^ A call to external function f
 | ExternalDeref String     -- ^ A call to external function whose entry address is stored at the label: *[l,8] = fptr
 | ImmediateAddress Word64  -- ^ An internal call to the given address
 | Returns Bool             -- ^ The function returns (treat as a nop) or terminates
 deriving (ResolvedJumpTarget -> ResolvedJumpTarget -> Bool
(ResolvedJumpTarget -> ResolvedJumpTarget -> Bool)
-> (ResolvedJumpTarget -> ResolvedJumpTarget -> Bool)
-> Eq ResolvedJumpTarget
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ResolvedJumpTarget -> ResolvedJumpTarget -> Bool
== :: ResolvedJumpTarget -> ResolvedJumpTarget -> Bool
$c/= :: ResolvedJumpTarget -> ResolvedJumpTarget -> Bool
/= :: ResolvedJumpTarget -> ResolvedJumpTarget -> Bool
Eq,(forall x. ResolvedJumpTarget -> Rep ResolvedJumpTarget x)
-> (forall x. Rep ResolvedJumpTarget x -> ResolvedJumpTarget)
-> Generic ResolvedJumpTarget
forall x. Rep ResolvedJumpTarget x -> ResolvedJumpTarget
forall x. ResolvedJumpTarget -> Rep ResolvedJumpTarget x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ResolvedJumpTarget -> Rep ResolvedJumpTarget x
from :: forall x. ResolvedJumpTarget -> Rep ResolvedJumpTarget x
$cto :: forall x. Rep ResolvedJumpTarget x -> ResolvedJumpTarget
to :: forall x. Rep ResolvedJumpTarget x -> ResolvedJumpTarget
Generic,Eq ResolvedJumpTarget
Eq ResolvedJumpTarget =>
(ResolvedJumpTarget -> ResolvedJumpTarget -> Ordering)
-> (ResolvedJumpTarget -> ResolvedJumpTarget -> Bool)
-> (ResolvedJumpTarget -> ResolvedJumpTarget -> Bool)
-> (ResolvedJumpTarget -> ResolvedJumpTarget -> Bool)
-> (ResolvedJumpTarget -> ResolvedJumpTarget -> Bool)
-> (ResolvedJumpTarget -> ResolvedJumpTarget -> ResolvedJumpTarget)
-> (ResolvedJumpTarget -> ResolvedJumpTarget -> ResolvedJumpTarget)
-> Ord ResolvedJumpTarget
ResolvedJumpTarget -> ResolvedJumpTarget -> Bool
ResolvedJumpTarget -> ResolvedJumpTarget -> Ordering
ResolvedJumpTarget -> ResolvedJumpTarget -> ResolvedJumpTarget
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: ResolvedJumpTarget -> ResolvedJumpTarget -> Ordering
compare :: ResolvedJumpTarget -> ResolvedJumpTarget -> Ordering
$c< :: ResolvedJumpTarget -> ResolvedJumpTarget -> Bool
< :: ResolvedJumpTarget -> ResolvedJumpTarget -> Bool
$c<= :: ResolvedJumpTarget -> ResolvedJumpTarget -> Bool
<= :: ResolvedJumpTarget -> ResolvedJumpTarget -> Bool
$c> :: ResolvedJumpTarget -> ResolvedJumpTarget -> Bool
> :: ResolvedJumpTarget -> ResolvedJumpTarget -> Bool
$c>= :: ResolvedJumpTarget -> ResolvedJumpTarget -> Bool
>= :: ResolvedJumpTarget -> ResolvedJumpTarget -> Bool
$cmax :: ResolvedJumpTarget -> ResolvedJumpTarget -> ResolvedJumpTarget
max :: ResolvedJumpTarget -> ResolvedJumpTarget -> ResolvedJumpTarget
$cmin :: ResolvedJumpTarget -> ResolvedJumpTarget -> ResolvedJumpTarget
min :: ResolvedJumpTarget -> ResolvedJumpTarget -> ResolvedJumpTarget
Ord)


instance Show ResolvedJumpTarget
 where
  show :: ResolvedJumpTarget -> String
show ResolvedJumpTarget
Unresolved             = String
"Unresolved"
  show (External String
f)           = String
f
  show (ExternalDeref String
l)      = String
"*" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
l
  show (ImmediateAddress Word64
imm) = String
"0x" String -> ShowS
forall a. [a] -> [a] -> [a]
++ Word64 -> String
forall {a}. Integral a => a -> String
showHex Word64
imm
  show (Returns Bool
True)         = String
"returns"
  show (Returns Bool
False)        = String
"terminates"

instance Cereal.Serialize ResolvedJumpTarget

instance NFData ResolvedJumpTarget