@@ -614,6 +614,22 @@ parseFunctionBlock = \case
614614 (B. USELIST , b) -> trace (" Cannot parse uselist yet (" ++ show b ++ " )" ) >> return ()
615615 _ -> pure ()
616616
617+ getVal :: (HasCallStack , Integral a ) => a -> LLVMReader Symbol
618+ getVal n = do
619+ valueList <- askValueList
620+ let idx = fromIntegral n
621+ if idx < 0 || idx > length valueList
622+ then fail $ " index " ++ show idx ++ " out of range [0, " ++ show (length valueList) ++ " ) of available values."
623+ else pure (valueList !! idx)
624+ 625+ getVal' :: (HasCallStack , Integral a ) => Ty -> a -> LLVMReader Symbol
626+ getVal' t n = do
627+ val <- getVal n
628+ if (ty val) == t
629+ then return val
630+ else do valueList <- askValueList
631+ fail $ show val ++ " (" ++ show (fromIntegral n) ++ " ) doesn't have type " ++ show t
632+ 617633getRelativeVal :: (HasCallStack , Integral a ) => [Symbol ] -> a -> LLVMReader Symbol
618634getRelativeVal refs n = do
619635 valueList <- askValueList
@@ -714,7 +730,7 @@ parseInst rs = \case
714730 where
715731 parseCase :: Ty -> [BC. Val ] -> LLVMReader [(Symbol , BasicBlockId )]
716732 parseCase ty [] = pure []
717- parseCase ty (valId: blockId: cases) = (:) <$> ((,blockId) <$> getRelativeValWithType ty rs valId) <*> parseCase ty cases
733+ parseCase ty (valId: blockId: cases) = (:) <$> ((,blockId) <$> getVal' ty valId) <*> parseCase ty cases
718734 -- 13
719735 -- (INST_INVOKE, vals)
720736 -- 14 - Unused
0 commit comments