@@ -34,6 +34,7 @@ import Control.Monad.State (execStateT)
34
34
35
35
import Data.Type.Equality ((:~:) (.. ), testEquality )
36
36
import Data.Foldable (foldlM , forM_ )
37
+ import qualified Data.List.NonEmpty as NE
37
38
import qualified Data.Vector as Vector
38
39
import qualified Data.Text as Text
39
40
import Data.Text.Encoding (encodeUtf8 )
@@ -216,7 +217,10 @@ buildCFG ::
216
217
buildCFG opts halloc path nm = do
217
218
printOutLn opts Info $ mconcat [" Finding symbol for \" " , nm, " \" " ]
218
219
elf <- getElf path >>= getRelevant
219
- (addr :: Macaw. MemSegmentOff 64 ) <- findSymbol (symMap elf) . encodeUtf8 $ Text. pack nm
220
+ (addr :: Macaw. MemSegmentOff 64 ) <-
221
+ case findSymbols (symMap elf) . encodeUtf8 $ Text. pack nm of
222
+ (addr: _) -> pure addr
223
+ _ -> fail $ mconcat [" Could not find symbol \" " , nm, " \" " ]
220
224
printOutLn opts Info $ mconcat [" Found symbol at address " , show addr, " , building CFG" ]
221
225
(_, Some finfo) <- stToIO . Macaw. analyzeFunction (const $ pure () ) addr Macaw. UserRequest
222
226
$ Macaw. emptyDiscoveryState (memory elf) (funSymMap elf) Macaw. x86_64_linux_info
@@ -270,7 +274,14 @@ llvmSignature ::
270
274
Either String ([LLVM. Type ], Maybe LLVM. Type )
271
275
llvmSignature opts llvmModule nm =
272
276
case findDecl (modAST llvmModule) nm of
273
- Left err -> Left $ displayVerifExceptionOpts opts err
277
+ Left err -> case findDefMaybeStatic (modAST llvmModule) nm of
278
+ Left _ -> Left $ displayVerifExceptionOpts opts err
279
+ Right defs -> pure
280
+ ( LLVM. typedType <$> LLVM. defArgs (NE. head defs)
281
+ , case LLVM. defRetType $ NE. head defs of
282
+ LLVM. PrimType LLVM. Void -> Nothing
283
+ x -> Just x
284
+ )
274
285
Right decl -> pure
275
286
( LLVM. decArgs decl
276
287
, case LLVM. decRetType decl of
@@ -421,20 +432,31 @@ setArgs ::
421
432
[MS. SetupValue LLVM ] {- ^ Arguments passed to crucible_execute_func -} ->
422
433
IO Regs
423
434
setArgs sym cc env tyenv nameEnv mem regs args
424
- | length args > length argRegs = fail " More arguments than would fit into registers"
435
+ | length args > length argRegs = fail " More arguments than would fit into general-purpose registers"
425
436
| otherwise = foldlM setRegSetupValue regs $ zip argRegs args
426
437
where
427
438
argRegs :: [Register ]
428
439
argRegs = [Macaw. RDI , Macaw. RSI , Macaw. RDX , Macaw. RCX , Macaw. R8 , Macaw. R9 ]
429
440
setRegSetupValue rs (reg, sval) = typeOfSetupValue cc tyenv nameEnv sval >>= \ ty ->
430
- let assign = do
431
- val <- C.LLVM. unpackMemValue sym (C.LLVM. LLVMPointerRepr $ knownNat @ 64 )
432
- =<< resolveSetupVal cc mem env tyenv nameEnv sval
433
- setReg reg val rs
434
- in case (ty, C.LLVM. memTypeBitwidth ty) of
435
- (C.LLVM. PtrType _, _) -> assign
436
- (_, Just 64 ) -> assign
437
- _ -> fail " Argument is not 64 bits"
441
+ case ty of
442
+ C.LLVM. PtrType _ -> do
443
+ val <- C.LLVM. unpackMemValue sym (C.LLVM. LLVMPointerRepr $ knownNat @ 64 )
444
+ =<< resolveSetupVal cc mem env tyenv nameEnv sval
445
+ setReg reg val rs
446
+ C.LLVM. IntType 64 -> do
447
+ val <- C.LLVM. unpackMemValue sym (C.LLVM. LLVMPointerRepr $ knownNat @ 64 )
448
+ =<< resolveSetupVal cc mem env tyenv nameEnv sval
449
+ setReg reg val rs
450
+ C.LLVM. IntType _ -> do
451
+ C.LLVM. LLVMValInt base off <- resolveSetupVal cc mem env tyenv nameEnv sval
452
+ case testLeq (incNat $ W4. bvWidth off) (knownNat @ 64 ) of
453
+ Nothing -> fail " Argument bitvector does not fit in a single general-purpose register"
454
+ Just LeqProof -> do
455
+ off' <- W4. bvZext sym (knownNat @ 64 ) off
456
+ val <- C.LLVM. unpackMemValue sym (C.LLVM. LLVMPointerRepr $ knownNat @ 64 )
457
+ $ C.LLVM. LLVMValInt base off'
458
+ setReg reg val rs
459
+ _ -> fail " Argument does not fit into a single general-purpose register"
438
460
439
461
--------------------------------------------------------------------------------
440
462
-- ** Postcondition
0 commit comments