Source code for angr.analyses.typehoon.lifter

from ...sim_type import SimType, SimTypeChar, SimTypeShort, SimTypeInt, SimTypeLong, SimTypeLongLong, SimTypePointer
from .typeconsts import BottomType, Int8, Int16, Int32, Int64, Pointer32, Pointer64


[docs]class TypeLifter: """ Lift SimTypes to type constants. """ __slots__ = ("bits",)
[docs] def __init__(self, bits: int): if bits not in (32, 64): raise ValueError("TypeLifter only supports 32-bit or 64-bit pointers.") self.bits = bits
[docs] def lift(self, ty: SimType): handler = _mapping.get(type(ty), None) if handler is None: return BottomType() return handler(self, ty)
def _lift_SimTypeChar(self, ty): # pylint:disable=unused-argument,no-self-use return Int8() def _lift_SimTypeShort(self, ty): # pylint:disable=unused-argument,no-self-use return Int16() def _lift_SimTypeInt(self, ty): # pylint:disable=unused-argument,no-self-use return Int32() def _lift_SimTypeLongLong(self, ty): # pylint:disable=unused-argument,no-self-use return Int64() def _lift_SimTypePointer(self, ty: SimTypePointer): if self.bits == 32: return Pointer32(self.lift(ty.pts_to)) elif self.bits == 64: return Pointer64(self.lift(ty.pts_to)) raise ValueError("Unsupported bits %s." % self.bits)
_mapping = { SimTypeChar: TypeLifter._lift_SimTypeChar, SimTypeShort: TypeLifter._lift_SimTypeShort, SimTypeInt: TypeLifter._lift_SimTypeInt, SimTypeLong: TypeLifter._lift_SimTypeInt, SimTypeLongLong: TypeLifter._lift_SimTypeLongLong, SimTypePointer: TypeLifter._lift_SimTypePointer, }