diff --git a/newbinding/gen/binding.py b/newbinding/gen/binding.py index 1c7c7ca..c1e1d1e 100644 --- a/newbinding/gen/binding.py +++ b/newbinding/gen/binding.py @@ -70,6 +70,7 @@ Float = BuiltinTypes('float') Double = BuiltinTypes('double') Uint64 = BuiltinTypes('uint64_t') Int64 = BuiltinTypes('int64_t') +Int = BuiltinTypes('int') Size_t = BuiltinTypes('size_t') VoidPtr = BuiltinTypes('void*') Bool = BuiltinTypes('bool') diff --git a/newbinding/src/Constant.py b/newbinding/src/Constant.py index 9027e3f..42541c4 100644 --- a/newbinding/src/Constant.py +++ b/newbinding/src/Constant.py @@ -1,10 +1,22 @@ from binding import * from namespace import llvm + +from Value import Constant, Value + +UndefValue = llvm.Class(Constant) +ConstantInt = llvm.Class(Constant) +ConstantFP = llvm.Class(Constant) +ConstantArray = llvm.Class(Constant) +ConstantStruct = llvm.Class(Constant) +ConstantVector = llvm.Class(Constant) +ConstantDataSequential = llvm.Class(Constant) +ConstantDataArray = llvm.Class(ConstantDataSequential) +ConstantExpr = llvm.Class(Constant) + from LLVMContext import LLVMContext from ADT.StringRef import StringRef from ADT.SmallVector import SmallVector_Value, SmallVector_Unsigned from Type import Type, IntegerType, ArrayType, StructType -from Value import Constant, Value from Instruction import CmpInst @Constant @@ -42,7 +54,6 @@ class Constant: PyObjectPtr) -UndefValue = llvm.Class(Constant) @UndefValue class UndefValue: @@ -67,7 +78,6 @@ class UndefValue: get = StaticMethod(ptr(UndefValue), ptr(Type)) -ConstantInt = llvm.Class(Constant) @ConstantInt class ConstantInt: @@ -82,7 +92,6 @@ class ConstantInt: getZExtValue = Method(cast(Uint64, int)) getSExtValue = Method(cast(Int64, int)) -ConstantFP = llvm.Class(Constant) @ConstantFP class ConstantFP: @@ -95,7 +104,6 @@ class ConstantFP: isNaN = Method(cast(Bool, bool)) -ConstantArray = llvm.Class(Constant) @ConstantArray class ConstantArray: @@ -105,7 +113,6 @@ class ConstantArray: PyObjectPtr, # Constants ) -ConstantStruct = llvm.Class(Constant) @ConstantStruct class ConstantStruct: @@ -120,7 +127,6 @@ class ConstantStruct: cast(bool, Bool), # packed ).require_only(1) -ConstantVector = llvm.Class(Constant) @ConstantVector class ConstantVector: @@ -129,13 +135,11 @@ class ConstantVector: PyObjectPtr, # constants ) -ConstantDataSequential = llvm.Class(Constant) @ConstantDataSequential class ConstantDataSequential: pass -ConstantDataArray = llvm.Class(ConstantDataSequential) @ConstantDataArray class ConstantDataArray: @@ -146,7 +150,6 @@ class ConstantDataArray: ).require_only(2) -ConstantExpr = llvm.Class(Constant) def _factory(*args): return StaticMethod(ptr(Constant), *args) diff --git a/newbinding/src/Instruction.py b/newbinding/src/Instruction.py index dda6b48..79cf4a3 100644 --- a/newbinding/src/Instruction.py +++ b/newbinding/src/Instruction.py @@ -1,6 +1,11 @@ from binding import * from namespace import llvm -from Value import User +from Value import Value, MDNode, User, BasicBlock, Function +from ADT.StringRef import StringRef +from CallingConv import CallingConv +from Attributes import Attributes +from Constant import ConstantInt + Instruction = llvm.Class(User) AtomicCmpXchgInst = llvm.Class(Instruction) @@ -54,7 +59,49 @@ FPTruncInst = llvm.Class(CastInst) @Instruction class Instruction: - pass + removeFromParent = Method() + eraseFromParent = Method() + eraseFromParent.disowning = True + + getParent = Method(ptr(BasicBlock)) + getOpcode = Method(cast(Unsigned, int)) + getOpcodeName = Method(cast(ConstCharPtr, str)) + + insertBefore = Method(Void, ptr(Instruction)) + insertAfter = Method(Void, ptr(Instruction)) + moveBefore = Method(Void, ptr(Instruction)) + + isTerminator = Method(cast(Bool, bool)) + isBinaryOp = Method(cast(Bool, bool)) + isShift = Method(cast(Bool, bool)) + isCast = Method(cast(Bool, bool)) + isLogicalShift = Method(cast(Bool, bool)) + isArithmeticShift = Method(cast(Bool, bool)) + hasMetadata = Method(cast(Bool, bool)) + hasMetadataOtherThanDebugLoc = Method(cast(Bool, bool)) + isAssociative = Method(cast(Bool, bool)) + isCommutative = Method(cast(Bool, bool)) + isIdempotent = Method(cast(Bool, bool)) + isNilpotent = Method(cast(Bool, bool)) + mayWriteToMemory = Method(cast(Bool, bool)) + mayReadFromMemory = Method(cast(Bool, bool)) + mayReadOrWriteMemory = Method(cast(Bool, bool)) + mayThrow = Method(cast(Bool, bool)) + mayHaveSideEffects = Method(cast(Bool, bool)) + + hasMetadata = Method(cast(Bool, bool)) + getMetadata = Method(ptr(MDNode), cast(str, StringRef)) + setMetadata = Method(Void, cast(str, StringRef), ptr(MDNode)) + + clone = Method(ptr(Instruction)) + +# LLVM 3.3 +# hasUnsafeAlgebra = Method(cast(Bool, bool)) +# hasNoNans = Method(cast(Bool, bool)) +# hasNoInfs = Method(cast(Bool, bool)) +# hasNoSignedZeros = Method(cast(Bool, bool)) +# hasAllowReciprocal = Method(cast(Bool, bool)) + @AtomicCmpXchgInst class AtomicCmpXchgInst: @@ -71,7 +118,16 @@ class BinaryOperator: @CallInst class CallInst: - pass + _downcast_ = Value, Instruction + getCallingConv = Method(CallingConv.ID) + setCallingConv = Method(Void, CallingConv.ID) + getParamAlignment = Method(cast(Unsigned, int), cast(int, Unsigned)) + addAttribute = Method(Void, cast(int, Unsigned), ref(Attributes)) + removeAttribute = Method(Void, cast(int, Unsigned), ref(Attributes)) + getCalledFunction = Method(ptr(Function)) + getCalledValue = Method(ptr(Value)) + setCalledFunction = Method(Void, ptr(Function)) + isInlineAsm = Method(cast(Bool, bool)) @CmpInst class CmpInst: @@ -87,6 +143,8 @@ class CmpInst: 'LAST_ICMP_PREDICATE', 'BAD_ICMP_PREDICATE',) + getPredicate = Method(Predicate) + @ExtractElementInst class ExtractElementInst: pass @@ -113,7 +171,14 @@ class LandingPadInst: @PHINode class PHINode: - pass + getNumIncomingValues = Method(cast(Unsigned, int)) + getIncomingValue = Method(ptr(Value), cast(int, Unsigned)) + setIncomingValue = Method(Void, cast(int, Unsigned), ptr(Value)) + getIncomingBlock = Method(ptr(BasicBlock), cast(int, Unsigned)) + setIncomingBlock = Method(Void, cast(int, Unsigned), ptr(BasicBlock)) + addIncoming = Method(Void, ptr(Value), ptr(BasicBlock)) + hasConstantValue = Method(ptr(Value)) + getBasicBlockIndex = Method(cast(Int, int), ptr(BasicBlock)) @SelectInst class SelectInst: @@ -125,11 +190,24 @@ class ShuffleVectorInst: @StoreInst class StoreInst: - pass + _downcast_ = Instruction + isVolatile = Method(cast(Bool, bool)) + isSimple = Method(cast(Bool, bool)) + isUnordered = Method(cast(Bool, bool)) + isAtomic = Method(cast(Bool, bool)) + + setVolatile = Method(Void, cast(Bool, bool)) + + getAlignment = Method(cast(Unsigned, int)) + setAlignment = Method(Void, cast(int, Unsigned)) + + classof = StaticMethod(cast(Bool, bool), ptr(Value)) @TerminatorInst class TerminatorInst: - pass + getNumSuccessors = Method(cast(Unsigned, int)) + getSuccessor = Method(ptr(BasicBlock), cast(int, Unsigned)) + setSuccessor = Method(Void, cast(int, Unsigned), ptr(BasicBlock)) @UnaryInstruction class UnaryInstruction: @@ -162,7 +240,15 @@ class IndirectBrInst: @InvokeInst class InvokeInst: - pass + _downcast_ = Value, Instruction + getCallingConv = Method(CallingConv.ID) + setCallingConv = Method(Void, CallingConv.ID) + getParamAlignment = Method(cast(Unsigned, int), cast(int, Unsigned)) + addAttribute = Method(Void, cast(int, Unsigned), ref(Attributes)) + removeAttribute = Method(Void, cast(int, Unsigned), ref(Attributes)) + getCalledFunction = Method(ptr(Function)) + getCalledValue = Method(ptr(Value)) + setCalledFunction = Method(Void, ptr(Function)) @ResumeInst class ResumeInst: @@ -174,7 +260,13 @@ class ReturnInst: @SwitchInst class SwitchInst: - pass + getCondition = Method(ptr(Value)) + setCondition = Method(Void, ptr(Value)) + getDefaultDest = Method(ptr(BasicBlock)) + setDefaultDest = Method(Void, ptr(BasicBlock)) + getNumCases = Method(cast(int, Unsigned)) + addCase = Method(Void, ptr(ConstantInt), ptr(BasicBlock)) + @UnreachableInst class UnreachableInst: @@ -195,7 +287,18 @@ class ExtractValueInst: @LoadInst class LoadInst: - pass + _downcast_ = Value, Instruction + isVolatile = Method(cast(Bool, bool)) + isSimple = Method(cast(Bool, bool)) + isUnordered = Method(cast(Bool, bool)) + isAtomic = Method(cast(Bool, bool)) + + setVolatile = Method(Void, cast(Bool, bool)) + + getAlignment = Method(cast(Unsigned, int)) + setAlignment = Method(Void, cast(int, Unsigned)) + + classof = StaticMethod(cast(Bool, bool), ptr(Value)) @VAArgInst class VAArgInst: diff --git a/newbinding/src/Metadata.py b/newbinding/src/Metadata.py index bda09e1..338cbbd 100644 --- a/newbinding/src/Metadata.py +++ b/newbinding/src/Metadata.py @@ -31,6 +31,8 @@ class MDString: @llvm.Class() class NamedMDNode: eraseFromParent = Method() + eraseFromParent.disowning = True + dropAllReferences = Method() getParent = Method(ptr(Module)) getOperand = Method(ptr(MDNode), cast(int, Unsigned)) @@ -41,3 +43,10 @@ class NamedMDNode: print_.realname = "print" dump = Method() + + @CustomPythonMethod + def __str__(self): + import extra + os = extra.make_raw_ostream_for_printing() + self.print_(os, None) + return os.str() \ No newline at end of file