content: module Lang.Crucible.LLVM.MalformedLLVMModule where
  
  import qualified Control.Exception as X
  import           Data.Void
  
  import           Prettyprinter
  
  ------------------------------------------------------------------------
  -- MalformedLLVMModule
  
  -- | This datatype represents an exception that occurs when an LLVM module
  --   is broken in some way; for example, if the types of expressions do
  --   not match up in some way.  The first argument is a short description
  --   of the error, and the remaining arguments are any additional details
  --   describing the error.
  data MalformedLLVMModule
    = MalformedLLVMModule (Doc Void) [Doc Void]
  
  instance X.Exception MalformedLLVMModule
  
  instance Show MalformedLLVMModule where
    show = show . renderMalformedLLVMModule
  
  -- Throw a @MalformedLLVMModule@ exception
  malformedLLVMModule :: Doc Void -> [Doc Void] -> a
  malformedLLVMModule short details = X.throw (MalformedLLVMModule short details)
  
  -- Render a @MalformedLLVMModule@ exception as a pretty printer document
  renderMalformedLLVMModule :: MalformedLLVMModule -> Doc Void
  renderMalformedLLVMModule (MalformedLLVMModule short details) =
    vcat [short, indent 2 (vcat details)]
  