Skip to content

Commit d3580e5

Browse files
authored
Merge pull request #651 from GaloisInc/llvm-verify-x86-fixes
Fix some small issues in crucible_llvm_verify_x86
2 parents 0c16c78 + 6805dfd commit d3580e5

File tree

3 files changed

+35
-12
lines changed

3 files changed

+35
-12
lines changed

src/SAWScript/Crucible/LLVM/Builtins.hs

+1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ module SAWScript.Crucible.LLVM.Builtins
6060

6161
, displayVerifExceptionOpts
6262
, findDecl
63+
, findDefMaybeStatic
6364
, setupLLVMCrucibleContext
6465
) where
6566

src/SAWScript/Crucible/LLVM/X86.hs

+33-11
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import Control.Monad.State (execStateT)
3434

3535
import Data.Type.Equality ((:~:)(..), testEquality)
3636
import Data.Foldable (foldlM, forM_)
37+
import qualified Data.List.NonEmpty as NE
3738
import qualified Data.Vector as Vector
3839
import qualified Data.Text as Text
3940
import Data.Text.Encoding (encodeUtf8)
@@ -216,7 +217,10 @@ buildCFG ::
216217
buildCFG opts halloc path nm = do
217218
printOutLn opts Info $ mconcat ["Finding symbol for \"", nm, "\""]
218219
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, "\""]
220224
printOutLn opts Info $ mconcat ["Found symbol at address ", show addr, ", building CFG"]
221225
(_, Some finfo) <- stToIO . Macaw.analyzeFunction (const $ pure ()) addr Macaw.UserRequest
222226
$ Macaw.emptyDiscoveryState (memory elf) (funSymMap elf) Macaw.x86_64_linux_info
@@ -270,7 +274,14 @@ llvmSignature ::
270274
Either String ([LLVM.Type], Maybe LLVM.Type)
271275
llvmSignature opts llvmModule nm =
272276
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+
)
274285
Right decl -> pure
275286
( LLVM.decArgs decl
276287
, case LLVM.decRetType decl of
@@ -421,20 +432,31 @@ setArgs ::
421432
[MS.SetupValue LLVM] {- ^ Arguments passed to crucible_execute_func -} ->
422433
IO Regs
423434
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"
425436
| otherwise = foldlM setRegSetupValue regs $ zip argRegs args
426437
where
427438
argRegs :: [Register]
428439
argRegs = [Macaw.RDI, Macaw.RSI, Macaw.RDX, Macaw.RCX, Macaw.R8, Macaw.R9]
429440
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"
438460

439461
--------------------------------------------------------------------------------
440462
-- ** Postcondition

src/SAWScript/X86.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ module SAWScript.X86
1919
, RelevantElf(..)
2020
, getElf
2121
, getRelevant
22-
, findSymbol
22+
, findSymbols
2323
, posFn
2424
, loadGlobal
2525
) where

0 commit comments

Comments
 (0)