{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE RecordWildCards #-}

module GHC.Toolchain.Tools.Nm (Nm(..), findNm) where

import Control.Monad

import GHC.Toolchain.Prelude
import GHC.Toolchain.Program

newtype Nm = Nm { Nm -> Program
nmProgram :: Program
                }
    deriving (Int -> Nm -> ShowS
[Nm] -> ShowS
Nm -> String
(Int -> Nm -> ShowS)
-> (Nm -> String) -> ([Nm] -> ShowS) -> Show Nm
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Nm -> ShowS
showsPrec :: Int -> Nm -> ShowS
$cshow :: Nm -> String
show :: Nm -> String
$cshowList :: [Nm] -> ShowS
showList :: [Nm] -> ShowS
Show, ReadPrec [Nm]
ReadPrec Nm
Int -> ReadS Nm
ReadS [Nm]
(Int -> ReadS Nm)
-> ReadS [Nm] -> ReadPrec Nm -> ReadPrec [Nm] -> Read Nm
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Nm
readsPrec :: Int -> ReadS Nm
$creadList :: ReadS [Nm]
readList :: ReadS [Nm]
$creadPrec :: ReadPrec Nm
readPrec :: ReadPrec Nm
$creadListPrec :: ReadPrec [Nm]
readListPrec :: ReadPrec [Nm]
Read, Nm -> Nm -> Bool
(Nm -> Nm -> Bool) -> (Nm -> Nm -> Bool) -> Eq Nm
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Nm -> Nm -> Bool
== :: Nm -> Nm -> Bool
$c/= :: Nm -> Nm -> Bool
/= :: Nm -> Nm -> Bool
Eq, Eq Nm
Eq Nm =>
(Nm -> Nm -> Ordering)
-> (Nm -> Nm -> Bool)
-> (Nm -> Nm -> Bool)
-> (Nm -> Nm -> Bool)
-> (Nm -> Nm -> Bool)
-> (Nm -> Nm -> Nm)
-> (Nm -> Nm -> Nm)
-> Ord Nm
Nm -> Nm -> Bool
Nm -> Nm -> Ordering
Nm -> Nm -> Nm
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 :: Nm -> Nm -> Ordering
compare :: Nm -> Nm -> Ordering
$c< :: Nm -> Nm -> Bool
< :: Nm -> Nm -> Bool
$c<= :: Nm -> Nm -> Bool
<= :: Nm -> Nm -> Bool
$c> :: Nm -> Nm -> Bool
> :: Nm -> Nm -> Bool
$c>= :: Nm -> Nm -> Bool
>= :: Nm -> Nm -> Bool
$cmax :: Nm -> Nm -> Nm
max :: Nm -> Nm -> Nm
$cmin :: Nm -> Nm -> Nm
min :: Nm -> Nm -> Nm
Ord)

findNm :: ProgOpt -> M Nm
findNm :: ProgOpt -> M Nm
findNm ProgOpt
progOpt = String -> M Nm -> M Nm
forall a. Show a => String -> M a -> M a
checking String
"for 'nm'" (M Nm -> M Nm) -> M Nm -> M Nm
forall a b. (a -> b) -> a -> b
$ do
    nmProgram <- String -> ProgOpt -> [String] -> M Program
findProgram String
"nm utility" ProgOpt
progOpt [String
"nm", String
"llvm-nm"]
    return Nm {..}