Merge branch 'master' of github.com:llvmpy/llvmpy into llpython-dev
This commit is contained in:
commit
8b075317cd
3 changed files with 351 additions and 196 deletions
493
llvm/core.py
493
llvm/core.py
|
|
@ -47,144 +47,189 @@ from llvmpy import api
|
|||
#===----------------------------------------------------------------------===
|
||||
# Enumerations
|
||||
#===----------------------------------------------------------------------===
|
||||
class Enum(int):
|
||||
'''Overload integer to print the name of the enum.
|
||||
'''
|
||||
def __repr__(self):
|
||||
return '%s(%d)' % (type(self).__name__, self)
|
||||
|
||||
@classmethod
|
||||
def declare(cls):
|
||||
scope = globals()
|
||||
for name in filter(lambda s: s.startswith(cls.prefix), dir(cls)):
|
||||
n = getattr(cls, name)
|
||||
typ = type(name, (cls,), {})
|
||||
scope[name] = typ(n)
|
||||
|
||||
|
||||
# type id (llvm::Type::TypeID)
|
||||
TYPE_VOID = api.llvm.Type.TypeID.VoidTyID
|
||||
TYPE_HALF = api.llvm.Type.TypeID.HalfTyID
|
||||
TYPE_FLOAT = api.llvm.Type.TypeID.FloatTyID
|
||||
TYPE_DOUBLE = api.llvm.Type.TypeID.DoubleTyID
|
||||
TYPE_X86_FP80 = api.llvm.Type.TypeID.X86_FP80TyID
|
||||
TYPE_FP128 = api.llvm.Type.TypeID.FP128TyID
|
||||
TYPE_PPC_FP128 = api.llvm.Type.TypeID.PPC_FP128TyID
|
||||
TYPE_LABEL = api.llvm.Type.TypeID.LabelTyID
|
||||
TYPE_INTEGER = api.llvm.Type.TypeID.IntegerTyID
|
||||
TYPE_FUNCTION = api.llvm.Type.TypeID.FunctionTyID
|
||||
TYPE_STRUCT = api.llvm.Type.TypeID.StructTyID
|
||||
TYPE_ARRAY = api.llvm.Type.TypeID.ArrayTyID
|
||||
TYPE_POINTER = api.llvm.Type.TypeID.PointerTyID
|
||||
TYPE_VECTOR = api.llvm.Type.TypeID.VectorTyID
|
||||
TYPE_METADATA = api.llvm.Type.TypeID.MetadataTyID
|
||||
TYPE_X86_MMX = api.llvm.Type.TypeID.X86_MMXTyID
|
||||
class TypeEnum(Enum):
|
||||
prefix = 'TYPE_'
|
||||
TypeID = api.llvm.Type.TypeID
|
||||
|
||||
TYPE_VOID = TypeID.VoidTyID
|
||||
TYPE_HALF = TypeID.HalfTyID
|
||||
TYPE_FLOAT = TypeID.FloatTyID
|
||||
TYPE_DOUBLE = TypeID.DoubleTyID
|
||||
TYPE_X86_FP80 = TypeID.X86_FP80TyID
|
||||
TYPE_FP128 = TypeID.FP128TyID
|
||||
TYPE_PPC_FP128 = TypeID.PPC_FP128TyID
|
||||
TYPE_LABEL = TypeID.LabelTyID
|
||||
TYPE_INTEGER = TypeID.IntegerTyID
|
||||
TYPE_FUNCTION = TypeID.FunctionTyID
|
||||
TYPE_STRUCT = TypeID.StructTyID
|
||||
TYPE_ARRAY = TypeID.ArrayTyID
|
||||
TYPE_POINTER = TypeID.PointerTyID
|
||||
TYPE_VECTOR = TypeID.VectorTyID
|
||||
TYPE_METADATA = TypeID.MetadataTyID
|
||||
TYPE_X86_MMX = TypeID.X86_MMXTyID
|
||||
|
||||
TypeEnum.declare()
|
||||
|
||||
|
||||
# value IDs (llvm::Value::ValueTy enum)
|
||||
# According to the doxygen docs, it is not a good idea to use these enums.
|
||||
# There are more values than those declared.
|
||||
VALUE_ARGUMENT = api.llvm.Value.ValueTy.ArgumentVal
|
||||
VALUE_BASIC_BLOCK = api.llvm.Value.ValueTy.BasicBlockVal
|
||||
VALUE_FUNCTION = api.llvm.Value.ValueTy.FunctionVal
|
||||
VALUE_GLOBAL_ALIAS = api.llvm.Value.ValueTy.GlobalAliasVal
|
||||
VALUE_GLOBAL_VARIABLE = api.llvm.Value.ValueTy.GlobalVariableVal
|
||||
VALUE_UNDEF_VALUE = api.llvm.Value.ValueTy.UndefValueVal
|
||||
VALUE_BLOCK_ADDRESS = api.llvm.Value.ValueTy.BlockAddressVal
|
||||
VALUE_CONSTANT_EXPR = api.llvm.Value.ValueTy.ConstantExprVal
|
||||
VALUE_CONSTANT_AGGREGATE_ZERO = api.llvm.Value.ValueTy.ConstantAggregateZeroVal
|
||||
VALUE_CONSTANT_DATA_ARRAY = api.llvm.Value.ValueTy.ConstantDataArrayVal
|
||||
VALUE_CONSTANT_DATA_VECTOR = api.llvm.Value.ValueTy.ConstantDataVectorVal
|
||||
VALUE_CONSTANT_INT = api.llvm.Value.ValueTy.ConstantIntVal
|
||||
VALUE_CONSTANT_FP = api.llvm.Value.ValueTy.ConstantFPVal
|
||||
VALUE_CONSTANT_ARRAY = api.llvm.Value.ValueTy.ConstantArrayVal
|
||||
VALUE_CONSTANT_STRUCT = api.llvm.Value.ValueTy.ConstantStructVal
|
||||
VALUE_CONSTANT_VECTOR = api.llvm.Value.ValueTy.ConstantVectorVal
|
||||
VALUE_CONSTANT_POINTER_NULL = api.llvm.Value.ValueTy.ConstantPointerNullVal
|
||||
VALUE_MD_NODE = api.llvm.Value.ValueTy.MDNodeVal
|
||||
VALUE_MD_STRING = api.llvm.Value.ValueTy.MDStringVal
|
||||
VALUE_INLINE_ASM = api.llvm.Value.ValueTy.InlineAsmVal
|
||||
VALUE_PSEUDO_SOURCE_VALUE = api.llvm.Value.ValueTy.PseudoSourceValueVal
|
||||
VALUE_FIXED_STACK_PSEUDO_SOURCE_VALUE = api.llvm.Value.ValueTy.FixedStackPseudoSourceValueVal
|
||||
VALUE_INSTRUCTION = api.llvm.Value.ValueTy.InstructionVal
|
||||
class ValueEnum(Enum):
|
||||
prefix = 'VALUE_'
|
||||
ValueTy = api.llvm.Value.ValueTy
|
||||
|
||||
VALUE_ARGUMENT = ValueTy.ArgumentVal
|
||||
VALUE_BASIC_BLOCK = ValueTy.BasicBlockVal
|
||||
VALUE_FUNCTION = ValueTy.FunctionVal
|
||||
VALUE_GLOBAL_ALIAS = ValueTy.GlobalAliasVal
|
||||
VALUE_GLOBAL_VARIABLE = ValueTy.GlobalVariableVal
|
||||
VALUE_UNDEF_VALUE = ValueTy.UndefValueVal
|
||||
VALUE_BLOCK_ADDRESS = ValueTy.BlockAddressVal
|
||||
VALUE_CONSTANT_EXPR = ValueTy.ConstantExprVal
|
||||
VALUE_CONSTANT_AGGREGATE_ZERO = ValueTy.ConstantAggregateZeroVal
|
||||
VALUE_CONSTANT_DATA_ARRAY = ValueTy.ConstantDataArrayVal
|
||||
VALUE_CONSTANT_DATA_VECTOR = ValueTy.ConstantDataVectorVal
|
||||
VALUE_CONSTANT_INT = ValueTy.ConstantIntVal
|
||||
VALUE_CONSTANT_FP = ValueTy.ConstantFPVal
|
||||
VALUE_CONSTANT_ARRAY = ValueTy.ConstantArrayVal
|
||||
VALUE_CONSTANT_STRUCT = ValueTy.ConstantStructVal
|
||||
VALUE_CONSTANT_VECTOR = ValueTy.ConstantVectorVal
|
||||
VALUE_CONSTANT_POINTER_NULL = ValueTy.ConstantPointerNullVal
|
||||
VALUE_MD_NODE = ValueTy.MDNodeVal
|
||||
VALUE_MD_STRING = ValueTy.MDStringVal
|
||||
VALUE_INLINE_ASM = ValueTy.InlineAsmVal
|
||||
VALUE_PSEUDO_SOURCE_VALUE = ValueTy.PseudoSourceValueVal
|
||||
VALUE_FIXED_STACK_PSEUDO_SOURCE_VALUE = ValueTy.FixedStackPseudoSourceValueVal
|
||||
VALUE_INSTRUCTION = ValueTy.InstructionVal
|
||||
|
||||
ValueEnum.declare()
|
||||
|
||||
# instruction opcodes (from include/llvm/Instruction.def)
|
||||
OPCODE_RET = 1
|
||||
OPCODE_BR = 2
|
||||
OPCODE_SWITCH = 3
|
||||
OPCODE_INDIRECT_BR = 4
|
||||
OPCODE_INVOKE = 5
|
||||
OPCODE_RESUME = 6
|
||||
OPCODE_UNREACHABLE = 7
|
||||
OPCODE_ADD = 8
|
||||
OPCODE_FADD = 9
|
||||
OPCODE_SUB = 10
|
||||
OPCODE_FSUB = 11
|
||||
OPCODE_MUL = 12
|
||||
OPCODE_FMUL = 13
|
||||
OPCODE_UDIV = 14
|
||||
OPCODE_SDIV = 15
|
||||
OPCODE_FDIV = 16
|
||||
OPCODE_UREM = 17
|
||||
OPCODE_SREM = 18
|
||||
OPCODE_FREM = 19
|
||||
OPCODE_SHL = 20
|
||||
OPCODE_LSHR = 21
|
||||
OPCODE_ASHR = 22
|
||||
OPCODE_AND = 23
|
||||
OPCODE_OR = 24
|
||||
OPCODE_XOR = 25
|
||||
OPCODE_ALLOCA = 26
|
||||
OPCODE_LOAD = 27
|
||||
OPCODE_STORE = 28
|
||||
OPCODE_GETELEMENTPTR = 29
|
||||
OPCODE_FENCE = 30
|
||||
OPCODE_ATOMICCMPXCHG = 31
|
||||
OPCODE_ATOMICRMW = 32
|
||||
OPCODE_TRUNC = 33
|
||||
OPCODE_ZEXT = 34
|
||||
OPCODE_SEXT = 35
|
||||
OPCODE_FPTOUI = 36
|
||||
OPCODE_FPTOSI = 37
|
||||
OPCODE_UITOFP = 38
|
||||
OPCODE_SITOFP = 39
|
||||
OPCODE_FPTRUNC = 40
|
||||
OPCODE_FPEXT = 41
|
||||
OPCODE_PTRTOINT = 42
|
||||
OPCODE_INTTOPTR = 43
|
||||
OPCODE_BITCAST = 44
|
||||
OPCODE_ICMP = 45
|
||||
OPCODE_FCMP = 46
|
||||
OPCODE_PHI = 47
|
||||
OPCODE_CALL = 48
|
||||
OPCODE_SELECT = 49
|
||||
OPCODE_USEROP1 = 50
|
||||
OPCODE_USEROP2 = 51
|
||||
OPCODE_VAARG = 52
|
||||
OPCODE_EXTRACTELEMENT = 53
|
||||
OPCODE_INSERTELEMENT = 54
|
||||
OPCODE_SHUFFLEVECTOR = 55
|
||||
OPCODE_EXTRACTVALUE = 56
|
||||
OPCODE_INSERTVALUE = 57
|
||||
OPCODE_LANDINGPAD = 58
|
||||
class OpcodeEnum(Enum):
|
||||
prefix = 'OPCODE_'
|
||||
|
||||
OPCODE_RET = 1
|
||||
OPCODE_BR = 2
|
||||
OPCODE_SWITCH = 3
|
||||
OPCODE_INDIRECT_BR = 4
|
||||
OPCODE_INVOKE = 5
|
||||
OPCODE_RESUME = 6
|
||||
OPCODE_UNREACHABLE = 7
|
||||
OPCODE_ADD = 8
|
||||
OPCODE_FADD = 9
|
||||
OPCODE_SUB = 10
|
||||
OPCODE_FSUB = 11
|
||||
OPCODE_MUL = 12
|
||||
OPCODE_FMUL = 13
|
||||
OPCODE_UDIV = 14
|
||||
OPCODE_SDIV = 15
|
||||
OPCODE_FDIV = 16
|
||||
OPCODE_UREM = 17
|
||||
OPCODE_SREM = 18
|
||||
OPCODE_FREM = 19
|
||||
OPCODE_SHL = 20
|
||||
OPCODE_LSHR = 21
|
||||
OPCODE_ASHR = 22
|
||||
OPCODE_AND = 23
|
||||
OPCODE_OR = 24
|
||||
OPCODE_XOR = 25
|
||||
OPCODE_ALLOCA = 26
|
||||
OPCODE_LOAD = 27
|
||||
OPCODE_STORE = 28
|
||||
OPCODE_GETELEMENTPTR = 29
|
||||
OPCODE_FENCE = 30
|
||||
OPCODE_ATOMICCMPXCHG = 31
|
||||
OPCODE_ATOMICRMW = 32
|
||||
OPCODE_TRUNC = 33
|
||||
OPCODE_ZEXT = 34
|
||||
OPCODE_SEXT = 35
|
||||
OPCODE_FPTOUI = 36
|
||||
OPCODE_FPTOSI = 37
|
||||
OPCODE_UITOFP = 38
|
||||
OPCODE_SITOFP = 39
|
||||
OPCODE_FPTRUNC = 40
|
||||
OPCODE_FPEXT = 41
|
||||
OPCODE_PTRTOINT = 42
|
||||
OPCODE_INTTOPTR = 43
|
||||
OPCODE_BITCAST = 44
|
||||
OPCODE_ICMP = 45
|
||||
OPCODE_FCMP = 46
|
||||
OPCODE_PHI = 47
|
||||
OPCODE_CALL = 48
|
||||
OPCODE_SELECT = 49
|
||||
OPCODE_USEROP1 = 50
|
||||
OPCODE_USEROP2 = 51
|
||||
OPCODE_VAARG = 52
|
||||
OPCODE_EXTRACTELEMENT = 53
|
||||
OPCODE_INSERTELEMENT = 54
|
||||
OPCODE_SHUFFLEVECTOR = 55
|
||||
OPCODE_EXTRACTVALUE = 56
|
||||
OPCODE_INSERTVALUE = 57
|
||||
OPCODE_LANDINGPAD = 58
|
||||
|
||||
OpcodeEnum.declare()
|
||||
|
||||
# calling conventions
|
||||
CC_C = api.llvm.CallingConv.ID.C
|
||||
CC_FASTCALL = api.llvm.CallingConv.ID.Fast
|
||||
CC_COLDCALL = api.llvm.CallingConv.ID.Cold
|
||||
CC_GHC = api.llvm.CallingConv.ID.GHC
|
||||
CC_X86_STDCALL = api.llvm.CallingConv.ID.X86_StdCall
|
||||
CC_X86_FASTCALL = api.llvm.CallingConv.ID.X86_FastCall
|
||||
CC_ARM_APCS = api.llvm.CallingConv.ID.ARM_APCS
|
||||
CC_ARM_AAPCS = api.llvm.CallingConv.ID.ARM_AAPCS
|
||||
CC_ARM_AAPCS_VFP = api.llvm.CallingConv.ID.ARM_AAPCS_VFP
|
||||
CC_MSP430_INTR = api.llvm.CallingConv.ID.MSP430_INTR
|
||||
CC_X86_THISCALL = api.llvm.CallingConv.ID.X86_ThisCall
|
||||
CC_PTX_KERNEL = api.llvm.CallingConv.ID.PTX_Kernel
|
||||
CC_PTX_DEVICE = api.llvm.CallingConv.ID.PTX_Device
|
||||
CC_MBLAZE_INTR = api.llvm.CallingConv.ID.MBLAZE_INTR
|
||||
CC_MBLAZE_SVOL = api.llvm.CallingConv.ID.MBLAZE_SVOL
|
||||
|
||||
class CCEnum(Enum):
|
||||
prefix = 'CC_'
|
||||
|
||||
ID = api.llvm.CallingConv.ID
|
||||
|
||||
CC_C = ID.C
|
||||
CC_FASTCALL = ID.Fast
|
||||
CC_COLDCALL = ID.Cold
|
||||
CC_GHC = ID.GHC
|
||||
CC_X86_STDCALL = ID.X86_StdCall
|
||||
CC_X86_FASTCALL = ID.X86_FastCall
|
||||
CC_ARM_APCS = ID.ARM_APCS
|
||||
CC_ARM_AAPCS = ID.ARM_AAPCS
|
||||
CC_ARM_AAPCS_VFP = ID.ARM_AAPCS_VFP
|
||||
CC_MSP430_INTR = ID.MSP430_INTR
|
||||
CC_X86_THISCALL = ID.X86_ThisCall
|
||||
CC_PTX_KERNEL = ID.PTX_Kernel
|
||||
CC_PTX_DEVICE = ID.PTX_Device
|
||||
CC_MBLAZE_INTR = ID.MBLAZE_INTR
|
||||
CC_MBLAZE_SVOL = ID.MBLAZE_SVOL
|
||||
|
||||
CCEnum.declare()
|
||||
|
||||
# int predicates
|
||||
ICMP_EQ = api.llvm.CmpInst.Predicate.ICMP_EQ
|
||||
ICMP_NE = api.llvm.CmpInst.Predicate.ICMP_NE
|
||||
ICMP_UGT = api.llvm.CmpInst.Predicate.ICMP_UGT
|
||||
ICMP_UGE = api.llvm.CmpInst.Predicate.ICMP_UGE
|
||||
ICMP_ULT = api.llvm.CmpInst.Predicate.ICMP_ULT
|
||||
ICMP_ULE = api.llvm.CmpInst.Predicate.ICMP_ULE
|
||||
ICMP_SGT = api.llvm.CmpInst.Predicate.ICMP_SGT
|
||||
ICMP_SGE = api.llvm.CmpInst.Predicate.ICMP_SGE
|
||||
ICMP_SLT = api.llvm.CmpInst.Predicate.ICMP_SLT
|
||||
ICMP_SLE = api.llvm.CmpInst.Predicate.ICMP_SLE
|
||||
class ICMPEnum(Enum):
|
||||
prefix = 'ICMP_'
|
||||
|
||||
Predicate = api.llvm.CmpInst.Predicate
|
||||
|
||||
ICMP_EQ = Predicate.ICMP_EQ
|
||||
ICMP_NE = Predicate.ICMP_NE
|
||||
ICMP_UGT = Predicate.ICMP_UGT
|
||||
ICMP_UGE = Predicate.ICMP_UGE
|
||||
ICMP_ULT = Predicate.ICMP_ULT
|
||||
ICMP_ULE = Predicate.ICMP_ULE
|
||||
ICMP_SGT = Predicate.ICMP_SGT
|
||||
ICMP_SGE = Predicate.ICMP_SGE
|
||||
ICMP_SLT = Predicate.ICMP_SLT
|
||||
ICMP_SLE = Predicate.ICMP_SLE
|
||||
|
||||
ICMPEnum.declare()
|
||||
# same as ICMP_xx, for backward compatibility
|
||||
|
||||
IPRED_EQ = ICMP_EQ
|
||||
IPRED_NE = ICMP_NE
|
||||
IPRED_UGT = ICMP_UGT
|
||||
|
|
@ -197,24 +242,33 @@ IPRED_SLT = ICMP_SLT
|
|||
IPRED_SLE = ICMP_SLE
|
||||
|
||||
# real predicates
|
||||
FCMP_FALSE = api.llvm.CmpInst.Predicate.FCMP_FALSE
|
||||
FCMP_OEQ = api.llvm.CmpInst.Predicate.FCMP_OEQ
|
||||
FCMP_OGT = api.llvm.CmpInst.Predicate.FCMP_OGT
|
||||
FCMP_OGE = api.llvm.CmpInst.Predicate.FCMP_OGE
|
||||
FCMP_OLT = api.llvm.CmpInst.Predicate.FCMP_OLT
|
||||
FCMP_OLE = api.llvm.CmpInst.Predicate.FCMP_OLE
|
||||
FCMP_ONE = api.llvm.CmpInst.Predicate.FCMP_ONE
|
||||
FCMP_ORD = api.llvm.CmpInst.Predicate.FCMP_ORD
|
||||
FCMP_UNO = api.llvm.CmpInst.Predicate.FCMP_UNO
|
||||
FCMP_UEQ = api.llvm.CmpInst.Predicate.FCMP_UEQ
|
||||
FCMP_UGT = api.llvm.CmpInst.Predicate.FCMP_UGT
|
||||
FCMP_UGE = api.llvm.CmpInst.Predicate.FCMP_UGE
|
||||
FCMP_ULT = api.llvm.CmpInst.Predicate.FCMP_ULT
|
||||
FCMP_ULE = api.llvm.CmpInst.Predicate.FCMP_ULE
|
||||
FCMP_UNE = api.llvm.CmpInst.Predicate.FCMP_UNE
|
||||
FCMP_TRUE = api.llvm.CmpInst.Predicate.FCMP_TRUE
|
||||
|
||||
class FCMPEnum(Enum):
|
||||
prefix = 'FCMP_'
|
||||
|
||||
Predicate = api.llvm.CmpInst.Predicate
|
||||
|
||||
FCMP_FALSE = Predicate.FCMP_FALSE
|
||||
FCMP_OEQ = Predicate.FCMP_OEQ
|
||||
FCMP_OGT = Predicate.FCMP_OGT
|
||||
FCMP_OGE = Predicate.FCMP_OGE
|
||||
FCMP_OLT = Predicate.FCMP_OLT
|
||||
FCMP_OLE = Predicate.FCMP_OLE
|
||||
FCMP_ONE = Predicate.FCMP_ONE
|
||||
FCMP_ORD = Predicate.FCMP_ORD
|
||||
FCMP_UNO = Predicate.FCMP_UNO
|
||||
FCMP_UEQ = Predicate.FCMP_UEQ
|
||||
FCMP_UGT = Predicate.FCMP_UGT
|
||||
FCMP_UGE = Predicate.FCMP_UGE
|
||||
FCMP_ULT = Predicate.FCMP_ULT
|
||||
FCMP_ULE = Predicate.FCMP_ULE
|
||||
FCMP_UNE = Predicate.FCMP_UNE
|
||||
FCMP_TRUE = Predicate.FCMP_TRUE
|
||||
|
||||
FCMPEnum.declare()
|
||||
|
||||
# real predicates
|
||||
|
||||
RPRED_FALSE = FCMP_FALSE
|
||||
RPRED_OEQ = FCMP_OEQ
|
||||
RPRED_OGT = FCMP_OGT
|
||||
|
|
@ -233,68 +287,69 @@ RPRED_UNE = FCMP_UNE
|
|||
RPRED_TRUE = FCMP_TRUE
|
||||
|
||||
# linkages (see llvm::GlobalValue::LinkageTypes)
|
||||
LINKAGE_EXTERNAL = \
|
||||
api.llvm.GlobalValue.LinkageTypes.ExternalLinkage
|
||||
LINKAGE_AVAILABLE_EXTERNALLY = \
|
||||
api.llvm.GlobalValue.LinkageTypes.AvailableExternallyLinkage
|
||||
LINKAGE_LINKONCE_ANY = \
|
||||
api.llvm.GlobalValue.LinkageTypes.LinkOnceAnyLinkage
|
||||
LINKAGE_LINKONCE_ODR = \
|
||||
api.llvm.GlobalValue.LinkageTypes.LinkOnceODRLinkage
|
||||
LINKAGE_WEAK_ANY = \
|
||||
api.llvm.GlobalValue.LinkageTypes.WeakAnyLinkage
|
||||
LINKAGE_WEAK_ODR = \
|
||||
api.llvm.GlobalValue.LinkageTypes.WeakODRLinkage
|
||||
LINKAGE_APPENDING = \
|
||||
api.llvm.GlobalValue.LinkageTypes.AppendingLinkage
|
||||
LINKAGE_INTERNAL = \
|
||||
api.llvm.GlobalValue.LinkageTypes.InternalLinkage
|
||||
LINKAGE_PRIVATE = \
|
||||
api.llvm.GlobalValue.LinkageTypes.PrivateLinkage
|
||||
LINKAGE_DLLIMPORT = \
|
||||
api.llvm.GlobalValue.LinkageTypes.DLLImportLinkage
|
||||
LINKAGE_DLLEXPORT = \
|
||||
api.llvm.GlobalValue.LinkageTypes.DLLExportLinkage
|
||||
LINKAGE_EXTERNAL_WEAK = \
|
||||
api.llvm.GlobalValue.LinkageTypes.ExternalWeakLinkage
|
||||
LINKAGE_COMMON = \
|
||||
api.llvm.GlobalValue.LinkageTypes.CommonLinkage
|
||||
LINKAGE_LINKER_PRIVATE = \
|
||||
api.llvm.GlobalValue.LinkageTypes.LinkerPrivateLinkage
|
||||
LINKAGE_LINKER_PRIVATE_WEAK = \
|
||||
api.llvm.GlobalValue.LinkageTypes.LinkerPrivateWeakLinkage
|
||||
class LinkageEnum(Enum):
|
||||
prefix = 'LINKAGE_'
|
||||
LinkageTypes = api.llvm.GlobalValue.LinkageTypes
|
||||
|
||||
LINKAGE_EXTERNAL = LinkageTypes.ExternalLinkage
|
||||
LINKAGE_AVAILABLE_EXTERNALLY = LinkageTypes.AvailableExternallyLinkage
|
||||
LINKAGE_LINKONCE_ANY = LinkageTypes.LinkOnceAnyLinkage
|
||||
LINKAGE_LINKONCE_ODR = LinkageTypes.LinkOnceODRLinkage
|
||||
LINKAGE_WEAK_ANY = LinkageTypes.WeakAnyLinkage
|
||||
LINKAGE_WEAK_ODR = LinkageTypes.WeakODRLinkage
|
||||
LINKAGE_APPENDING = LinkageTypes.AppendingLinkage
|
||||
LINKAGE_INTERNAL = LinkageTypes.InternalLinkage
|
||||
LINKAGE_PRIVATE = LinkageTypes.PrivateLinkage
|
||||
LINKAGE_DLLIMPORT = LinkageTypes.DLLImportLinkage
|
||||
LINKAGE_DLLEXPORT = LinkageTypes.DLLExportLinkage
|
||||
LINKAGE_EXTERNAL_WEAK = LinkageTypes.ExternalWeakLinkage
|
||||
LINKAGE_COMMON = LinkageTypes.CommonLinkage
|
||||
LINKAGE_LINKER_PRIVATE = LinkageTypes.LinkerPrivateLinkage
|
||||
LINKAGE_LINKER_PRIVATE_WEAK = LinkageTypes.LinkerPrivateWeakLinkage
|
||||
|
||||
LinkageEnum.declare()
|
||||
|
||||
# visibility (see llvm/GlobalValue.h)
|
||||
VISIBILITY_DEFAULT = api.llvm.GlobalValue.VisibilityTypes.DefaultVisibility
|
||||
VISIBILITY_HIDDEN = api.llvm.GlobalValue.VisibilityTypes.HiddenVisibility
|
||||
VISIBILITY_PROTECTED = api.llvm.GlobalValue.VisibilityTypes.ProtectedVisibility
|
||||
class VisibilityEnum(Enum):
|
||||
prefix = 'VISIBILITY_'
|
||||
|
||||
VISIBILITY_DEFAULT = api.llvm.GlobalValue.VisibilityTypes.DefaultVisibility
|
||||
VISIBILITY_HIDDEN = api.llvm.GlobalValue.VisibilityTypes.HiddenVisibility
|
||||
VISIBILITY_PROTECTED = api.llvm.GlobalValue.VisibilityTypes.ProtectedVisibility
|
||||
|
||||
VisibilityEnum.declare()
|
||||
|
||||
# parameter attributes llvm::Attributes::AttrVal (see llvm/Attributes.h)
|
||||
ATTR_NONE = api.llvm.Attributes.AttrVal.None_
|
||||
ATTR_ZEXT = api.llvm.Attributes.AttrVal.ZExt
|
||||
ATTR_SEXT = api.llvm.Attributes.AttrVal.SExt
|
||||
ATTR_NO_RETURN = api.llvm.Attributes.AttrVal.NoReturn
|
||||
ATTR_IN_REG = api.llvm.Attributes.AttrVal.InReg
|
||||
ATTR_STRUCT_RET = api.llvm.Attributes.AttrVal.StructRet
|
||||
ATTR_NO_UNWIND = api.llvm.Attributes.AttrVal.NoUnwind
|
||||
ATTR_NO_ALIAS = api.llvm.Attributes.AttrVal.NoAlias
|
||||
ATTR_BY_VAL = api.llvm.Attributes.AttrVal.ByVal
|
||||
ATTR_NEST = api.llvm.Attributes.AttrVal.Nest
|
||||
ATTR_READ_NONE = api.llvm.Attributes.AttrVal.ReadNone
|
||||
ATTR_READONLY = api.llvm.Attributes.AttrVal.ReadOnly
|
||||
ATTR_NO_INLINE = api.llvm.Attributes.AttrVal.NoInline
|
||||
ATTR_ALWAYS_INLINE = api.llvm.Attributes.AttrVal.AlwaysInline
|
||||
ATTR_OPTIMIZE_FOR_SIZE = api.llvm.Attributes.AttrVal.OptimizeForSize
|
||||
ATTR_STACK_PROTECT = api.llvm.Attributes.AttrVal.StackProtect
|
||||
ATTR_STACK_PROTECT_REQ = api.llvm.Attributes.AttrVal.StackProtectReq
|
||||
ATTR_ALIGNMENT = api.llvm.Attributes.AttrVal.Alignment
|
||||
ATTR_NO_CAPTURE = api.llvm.Attributes.AttrVal.NoCapture
|
||||
ATTR_NO_REDZONE = api.llvm.Attributes.AttrVal.NoRedZone
|
||||
ATTR_NO_IMPLICIT_FLOAT = api.llvm.Attributes.AttrVal.NoImplicitFloat
|
||||
ATTR_NAKED = api.llvm.Attributes.AttrVal.Naked
|
||||
ATTR_INLINE_HINT = api.llvm.Attributes.AttrVal.InlineHint
|
||||
ATTR_STACK_ALIGNMENT = api.llvm.Attributes.AttrVal.StackAlignment
|
||||
class AttrEnum(Enum):
|
||||
prefix = 'ATTR_'
|
||||
|
||||
AttrVal = api.llvm.Attributes.AttrVal
|
||||
ATTR_NONE = AttrVal.None_
|
||||
ATTR_ZEXT = AttrVal.ZExt
|
||||
ATTR_SEXT = AttrVal.SExt
|
||||
ATTR_NO_RETURN = AttrVal.NoReturn
|
||||
ATTR_IN_REG = AttrVal.InReg
|
||||
ATTR_STRUCT_RET = AttrVal.StructRet
|
||||
ATTR_NO_UNWIND = AttrVal.NoUnwind
|
||||
ATTR_NO_ALIAS = AttrVal.NoAlias
|
||||
ATTR_BY_VAL = AttrVal.ByVal
|
||||
ATTR_NEST = AttrVal.Nest
|
||||
ATTR_READ_NONE = AttrVal.ReadNone
|
||||
ATTR_READONLY = AttrVal.ReadOnly
|
||||
ATTR_NO_INLINE = AttrVal.NoInline
|
||||
ATTR_ALWAYS_INLINE = AttrVal.AlwaysInline
|
||||
ATTR_OPTIMIZE_FOR_SIZE = AttrVal.OptimizeForSize
|
||||
ATTR_STACK_PROTECT = AttrVal.StackProtect
|
||||
ATTR_STACK_PROTECT_REQ = AttrVal.StackProtectReq
|
||||
ATTR_ALIGNMENT = AttrVal.Alignment
|
||||
ATTR_NO_CAPTURE = AttrVal.NoCapture
|
||||
ATTR_NO_REDZONE = AttrVal.NoRedZone
|
||||
ATTR_NO_IMPLICIT_FLOAT = AttrVal.NoImplicitFloat
|
||||
ATTR_NAKED = AttrVal.Naked
|
||||
ATTR_INLINE_HINT = AttrVal.InlineHint
|
||||
ATTR_STACK_ALIGNMENT = AttrVal.StackAlignment
|
||||
|
||||
AttrEnum.declare()
|
||||
|
||||
class Module(llvm.Wrapper):
|
||||
"""A Module instance stores all the information related to an LLVM module.
|
||||
|
|
@ -800,6 +855,9 @@ class Type(llvm.Wrapper):
|
|||
def __str__(self):
|
||||
return str(self._ptr)
|
||||
|
||||
def __hash__(self):
|
||||
return hash(self._ptr)
|
||||
|
||||
def __eq__(self, rhs):
|
||||
return self._ptr is rhs._ptr
|
||||
|
||||
|
|
@ -901,7 +959,6 @@ class StructType(Type):
|
|||
def is_layout_identical(self, other):
|
||||
return self._ptr.isLayoutIdentical(other._ptr)
|
||||
|
||||
|
||||
class ArrayType(Type):
|
||||
"""Represents an array type."""
|
||||
_type_ = api.llvm.ArrayType
|
||||
|
|
@ -1370,6 +1427,8 @@ class GlobalVariable(GlobalValue):
|
|||
|
||||
class Argument(Value):
|
||||
_type_ = api.llvm.Argument
|
||||
_valid_attrs = frozenset([ATTR_BY_VAL, ATTR_NEST, ATTR_NO_ALIAS,
|
||||
ATTR_NO_CAPTURE, ATTR_STRUCT_RET])
|
||||
|
||||
def add_attribute(self, attr):
|
||||
context = api.llvm.getGlobalContext()
|
||||
|
|
@ -1377,6 +1436,9 @@ class Argument(Value):
|
|||
attrbldr.addAttribute(attr)
|
||||
attrs = api.llvm.Attributes.get(context, attrbldr)
|
||||
self._ptr.addAttr(attrs)
|
||||
if attr not in self:
|
||||
raise ValueError("Attribute %s is not valid for arg %s" %
|
||||
(attr, self))
|
||||
|
||||
def remove_attribute(self, attr):
|
||||
context = api.llvm.getGlobalContext()
|
||||
|
|
@ -1398,6 +1460,45 @@ class Argument(Value):
|
|||
alignment = property(_get_alignment,
|
||||
_set_alignment)
|
||||
|
||||
@property
|
||||
def attributes(self):
|
||||
'''Returns a set of defined attributes.
|
||||
'''
|
||||
return set(attr for attr in self._valid_attrs if attr in self)
|
||||
|
||||
def __contains__(self, attr):
|
||||
if attr == ATTR_BY_VAL:
|
||||
return self.has_by_val()
|
||||
elif attr == ATTR_NEST:
|
||||
return self.has_nest()
|
||||
elif attr == ATTR_NO_ALIAS:
|
||||
return self.has_no_alias()
|
||||
elif attr == ATTR_NO_CAPTURE:
|
||||
return self.has_no_capture()
|
||||
elif attr == ATTR_STRUCT_RET:
|
||||
return self.has_struct_ret()
|
||||
else:
|
||||
raise ValueError('invalid attribute for argument')
|
||||
|
||||
@property
|
||||
def arg_no(self):
|
||||
return self._ptr.getArgNo()
|
||||
|
||||
def has_by_val(self):
|
||||
return self._ptr.hasByValAttr()
|
||||
|
||||
def has_nest(self):
|
||||
return self._ptr.hasNestAttr()
|
||||
|
||||
def has_no_alias(self):
|
||||
return self._ptr.hasNoAliasAttr()
|
||||
|
||||
def has_no_capture(self):
|
||||
return self._ptr.hasNoCaptureAttr()
|
||||
|
||||
def has_struct_ret(self):
|
||||
return self._ptr.hasStructRetAttr()
|
||||
|
||||
class Function(GlobalValue):
|
||||
_type_ = api.llvm.Function
|
||||
|
||||
|
|
|
|||
|
|
@ -1260,6 +1260,50 @@ tests.append(TestStruct)
|
|||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
class TestTypeHash(TestCase):
|
||||
def test_scalar_type(self):
|
||||
i32a = Type.int(32)
|
||||
i32b = Type.int(32)
|
||||
i64a = Type.int(64)
|
||||
i64b = Type.int(64)
|
||||
ts = set([i32a, i32b, i64a, i64b])
|
||||
self.assertTrue(len(ts))
|
||||
self.assertTrue(i32a in ts)
|
||||
self.assertTrue(i64b in ts)
|
||||
|
||||
def test_struct_type(self):
|
||||
ta = Type.struct([Type.int(32), Type.float()])
|
||||
tb = Type.struct([Type.int(32), Type.float()])
|
||||
tc = Type.struct([Type.int(32), Type.int(32), Type.float()])
|
||||
ts = set([ta, tb, tc])
|
||||
self.assertTrue(len(ts) == 2)
|
||||
self.assertTrue(ta in ts)
|
||||
self.assertTrue(tb in ts)
|
||||
self.assertTrue(tc in ts)
|
||||
|
||||
tests.append(TestTypeHash)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
class TestArgAttr(TestCase):
|
||||
def test_arg_attr(self):
|
||||
m = Module.new('oifjda')
|
||||
vptr = Type.pointer(Type.float())
|
||||
sptr = Type.pointer(Type.struct([]))
|
||||
fnty = Type.function(Type.void(), [vptr] * 5)
|
||||
func = m.add_function(fnty, 'foo')
|
||||
attrs = [lc.ATTR_STRUCT_RET, lc.ATTR_BY_VAL, lc.ATTR_NEST,
|
||||
lc.ATTR_NO_ALIAS, lc.ATTR_NO_CAPTURE]
|
||||
for i, attr in enumerate(attrs):
|
||||
arg = func.args[i]
|
||||
self.assertEqual(i, arg.arg_no)
|
||||
arg.add_attribute(attr)
|
||||
self.assertTrue(attr in func.args[i])
|
||||
|
||||
tests.append(TestArgAttr)
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def run(verbosity=1):
|
||||
print('llvmpy is installed in: ' + os.path.dirname(__file__))
|
||||
print('llvmpy version: ' + llvm.__version__)
|
||||
|
|
|
|||
|
|
@ -13,3 +13,13 @@ class Argument:
|
|||
removeAttr = Method(Void, ref(Attributes))
|
||||
getParamAlignment = Method(cast(Unsigned, int))
|
||||
|
||||
getArgNo = Method(cast(Unsigned, int))
|
||||
|
||||
hasByValAttr = Method(cast(Bool, bool))
|
||||
hasNestAttr = Method(cast(Bool, bool))
|
||||
hasNoAliasAttr = Method(cast(Bool, bool))
|
||||
hasNoCaptureAttr = Method(cast(Bool, bool))
|
||||
hasStructRetAttr = Method(cast(Bool, bool))
|
||||
|
||||
if LLVM_VERSION > (3, 2):
|
||||
hasReturnedAttr = Method(cast(Bool, bool))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue