Skip to content

Commit

Permalink
dump: CLI via optparse-applicative
Browse files Browse the repository at this point in the history
  • Loading branch information
Your Name committed Oct 9, 2024
1 parent 7c3bd2f commit 05b5a28
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 16 deletions.
33 changes: 18 additions & 15 deletions macaw-aarch32-symbolic/tools/Dump.hs
Original file line number Diff line number Diff line change
Expand Up @@ -8,31 +8,34 @@ import Data.ByteString qualified as BS
import Data.ElfEdit qualified as EE
import Data.Macaw.AArch32.Symbolic ()
import Data.Macaw.ARM qualified as MA
import Data.Macaw.Dump qualified as Dump
import Data.Macaw.Dump qualified as MD
import Data.Macaw.Dump.CLI qualified as MDC
import Data.Macaw.Symbolic qualified as MS
import Data.Proxy (Proxy(..))
import Data.Set qualified as Set
import System.Environment qualified as Env
import System.Exit qualified as Exit
import System.IO qualified as IO

go :: FilePath -> IO ()
go exePath = do
die :: String -> IO a
die msg = do
IO.hPutStrLn IO.stderr msg
Exit.exitFailure

main :: IO ()
main = do
cli <- MDC.parseCli
let exePath = MDC.cliBinPath cli
bytes <- BS.readFile exePath
case EE.decodeElfHeaderInfo bytes of
Left (_, msg) -> error ("Error parsing ELF header from file '" ++ show exePath ++ "': " ++ msg)
Left (_, msg) -> die ("Error parsing ELF header from file '" ++ exePath ++ "': " ++ msg)
Right (EE.SomeElf ehi) -> do
case EE.headerClass (EE.header ehi) of
EE.ELFCLASS32 -> do
discState <- Dump.runDiscovery ehi MA.arm_linux_info Set.empty
let symbs = Set.fromList (MDC.cliSymbols cli)
discState <- MD.runDiscovery ehi MA.arm_linux_info symbs
archVals <-
case MS.archVals (Proxy @MA.ARM) Nothing of
Just archVals -> pure archVals
Nothing -> error "impossible"
Dump.displayCfgs exePath discState archVals False
EE.ELFCLASS64 -> error "Only 32-bit ARM is supported"

main :: IO ()
main = do
args <- Env.getArgs
case args of
[exePath] -> go exePath
_ -> error "Bad arguments"
MD.displayCfgs exePath discState archVals (MDC.cliPrintCrucible cli)
EE.ELFCLASS64 -> die "Only 32-bit ARM is supported"
4 changes: 3 additions & 1 deletion macaw-dump/macaw-dump.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Build-type: Simple
License: BSD-3-Clause
License-file: LICENSE
Category: Language
Synopsis: A tool to display internal Macaw data structures
Synopsis: A tool to display internal Macaw data structures

extra-doc-files: README.md

Expand Down Expand Up @@ -96,6 +96,7 @@ library
lens,
macaw-base,
macaw-symbolic,
optparse-applicative,
parameterized-utils,
prettyprinter,
text,
Expand All @@ -105,3 +106,4 @@ library

exposed-modules:
Data.Macaw.Dump
Data.Macaw.Dump.CLI
39 changes: 39 additions & 0 deletions macaw-dump/src/Data/Macaw/Dump/CLI.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
{-# LANGUAGE ApplicativeDo #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE RecordWildCards #-}

module Data.Macaw.Dump.CLI
( Cli(..)
, parseCli
) where

import Control.Applicative ((<**>))
import Data.ByteString (ByteString)
import Options.Applicative qualified as Opt

data Cli = Cli
{ -- Arguments
cliBinPath :: FilePath
, cliSymbols :: [ByteString]
-- Options
, cliPrintCrucible :: Bool
} deriving Show

opts :: Opt.Parser Cli
opts = do
cliBinPath <- Opt.strArgument (Opt.help "filename of binary" <> Opt.metavar "FILENAME" )
cliSymbols <- Opt.many $ Opt.strArgument (Opt.help "function name" <> Opt.metavar "SYMBOL")
cliPrintCrucible <- Opt.switch (Opt.long "crucible" <> Opt.help "output Crucible CFGs")
pure Cli{..}

cliInfo :: Opt.ParserInfo Cli
cliInfo =
Opt.info
(opts <**> Opt.helper)
( Opt.fullDesc
<> Opt.header
"A tool to display internal Macaw data structures"
)

parseCli :: IO Cli
parseCli = Opt.execParser cliInfo

0 comments on commit 05b5a28

Please sign in to comment.