diff options
| author | Graydon Hoare <graydon@mozilla.com> | 2012-02-29 11:46:23 -0800 |
|---|---|---|
| committer | Graydon Hoare <graydon@mozilla.com> | 2012-03-02 18:46:13 -0800 |
| commit | 87c14f1e3d85751bffffda0b1920be5e726172c4 (patch) | |
| tree | 371d86e9a7c65b06df5c8f5e6d499cf4730324fc /src/comp/lib | |
| parent | 9228947fe15af96593abf4745d91802b56c205e8 (diff) | |
| download | rust-87c14f1e3d85751bffffda0b1920be5e726172c4.tar.gz rust-87c14f1e3d85751bffffda0b1920be5e726172c4.zip | |
Move src/comp to src/rustc
Diffstat (limited to 'src/comp/lib')
| -rw-r--r-- | src/comp/lib/llvm.rs | 1113 |
1 files changed, 0 insertions, 1113 deletions
diff --git a/src/comp/lib/llvm.rs b/src/comp/lib/llvm.rs deleted file mode 100644 index 2dc2945d8de..00000000000 --- a/src/comp/lib/llvm.rs +++ /dev/null @@ -1,1113 +0,0 @@ -import str::sbuf; - -import ctypes::{c_int, c_uint, unsigned, longlong, ulonglong}; - -type Opcode = u32; -type Bool = unsigned; -const True: Bool = 1u32; -const False: Bool = 0u32; - -// Consts for the LLVM CallConv type, pre-cast to uint. - -enum CallConv { - CCallConv = 0, - FastCallConv = 8, - ColdCallConv = 9, - X86StdcallCallConv = 64, - X86FastcallCallConv = 65, -} - -enum Visibility { - LLVMDefaultVisibility = 0, - HiddenVisibility = 1, - ProtectedVisibility = 2, -} - -enum Linkage { - ExternalLinkage = 0, - AvailableExternallyLinkage = 1, - LinkOnceAnyLinkage = 2, - LinkOnceODRLinkage = 3, - WeakAnyLinkage = 4, - WeakODRLinkage = 5, - AppendingLinkage = 6, - InternalLinkage = 7, - PrivateLinkage = 8, - DLLImportLinkage = 9, - DLLExportLinkage = 10, - ExternalWeakLinkage = 11, - GhostLinkage = 12, - CommonLinkage = 13, - LinkerPrivateLinkage = 14, - LinkerPrivateWeakLinkage = 15, - LinkerPrivateWeakDefAutoLinkage = 16, -} - -enum Attribute { - ZExtAttribute = 1, - SExtAttribute = 2, - NoReturnAttribute = 4, - InRegAttribute = 8, - StructRetAttribute = 16, - NoUnwindAttribute = 32, - NoAliasAttribute = 64, - ByValAttribute = 128, - NestAttribute = 256, - ReadNoneAttribute = 512, - ReadOnlyAttribute = 1024, - NoInlineAttribute = 2048, - AlwaysInlineAttribute = 4096, - OptimizeForSizeAttribute = 8192, - StackProtectAttribute = 16384, - StackProtectReqAttribute = 32768, - // 31 << 16 - AlignmentAttribute = 2031616, - NoCaptureAttribute = 2097152, - NoRedZoneAttribute = 4194304, - NoImplicitFloatAttribute = 8388608, - NakedAttribute = 16777216, - InlineHintAttribute = 33554432, - // 7 << 26 - StackAttribute = 469762048, - ReturnsTwiceAttribute = 536870912, - // 1 << 30 - UWTableAttribute = 1073741824, - NonLazyBindAttribute = 2147483648, -} - -// Consts for the LLVM IntPredicate type, pre-cast to uint. -// FIXME: as above. - -enum IntPredicate { - IntEQ = 32, - IntNE = 33, - IntUGT = 34, - IntUGE = 35, - IntULT = 36, - IntULE = 37, - IntSGT = 38, - IntSGE = 39, - IntSLT = 40, - IntSLE = 41, -} - -// Consts for the LLVM RealPredicate type, pre-case to uint. -// FIXME: as above. - -enum RealPredicate { - RealOEQ = 1, - RealOGT = 2, - RealOGE = 3, - RealOLT = 4, - RealOLE = 5, - RealONE = 6, - RealORD = 7, - RealUNO = 8, - RealUEQ = 9, - RealUGT = 10, - RealUGE = 11, - RealULT = 12, - RealULE = 13, - RealUNE = 14, -} - -// Opaque pointer types -enum Module_opaque {} -type ModuleRef = *Module_opaque; -enum Context_opaque {} -type ContextRef = *Context_opaque; -enum Type_opaque {} -type TypeRef = *Type_opaque; -enum Value_opaque {} -type ValueRef = *Value_opaque; -enum BasicBlock_opaque {} -type BasicBlockRef = *BasicBlock_opaque; -enum Builder_opaque {} -type BuilderRef = *Builder_opaque; -enum MemoryBuffer_opaque {} -type MemoryBufferRef = *MemoryBuffer_opaque; -enum PassManager_opaque {} -type PassManagerRef = *PassManager_opaque; -enum PassManagerBuilder_opaque {} -type PassManagerBuilderRef = *PassManagerBuilder_opaque; -enum Use_opaque {} -type UseRef = *Use_opaque; -enum TargetData_opaque {} -type TargetDataRef = *TargetData_opaque; -enum ObjectFile_opaque {} -type ObjectFileRef = *ObjectFile_opaque; -enum SectionIterator_opaque {} -type SectionIteratorRef = *SectionIterator_opaque; - -#[link_args = "-Lrustllvm"] -#[link_name = "rustllvm"] -#[abi = "cdecl"] -native mod llvm { - /* Create and destroy contexts. */ - fn LLVMContextCreate() -> ContextRef; - fn LLVMGetGlobalContext() -> ContextRef; - fn LLVMContextDispose(C: ContextRef); - fn LLVMGetMDKindIDInContext(C: ContextRef, Name: sbuf, SLen: unsigned) -> - unsigned; - fn LLVMGetMDKindID(Name: sbuf, SLen: unsigned) -> unsigned; - - /* Create and destroy modules. */ - fn LLVMModuleCreateWithNameInContext(ModuleID: sbuf, C: ContextRef) -> - ModuleRef; - fn LLVMDisposeModule(M: ModuleRef); - - /** Data layout. See Module::getDataLayout. */ - fn LLVMGetDataLayout(M: ModuleRef) -> sbuf; - fn LLVMSetDataLayout(M: ModuleRef, Triple: sbuf); - - /** Target triple. See Module::getTargetTriple. */ - fn LLVMGetTarget(M: ModuleRef) -> sbuf; - fn LLVMSetTarget(M: ModuleRef, Triple: sbuf); - - /** See Module::dump. */ - fn LLVMDumpModule(M: ModuleRef); - - /** See Module::setModuleInlineAsm. */ - fn LLVMSetModuleInlineAsm(M: ModuleRef, Asm: sbuf); - - /** See llvm::LLVMTypeKind::getTypeID. */ - - // FIXME: returning int rather than TypeKind because - // we directly inspect the values, and casting from - // a native doesn't work yet (only *to* a native). - - fn LLVMGetTypeKind(Ty: TypeRef) -> c_int; - - /** See llvm::LLVMType::getContext. */ - fn LLVMGetTypeContext(Ty: TypeRef) -> ContextRef; - - /* Operations on integer types */ - fn LLVMInt1TypeInContext(C: ContextRef) -> TypeRef; - fn LLVMInt8TypeInContext(C: ContextRef) -> TypeRef; - fn LLVMInt16TypeInContext(C: ContextRef) -> TypeRef; - fn LLVMInt32TypeInContext(C: ContextRef) -> TypeRef; - fn LLVMInt64TypeInContext(C: ContextRef) -> TypeRef; - fn LLVMIntTypeInContext(C: ContextRef, NumBits: unsigned) -> TypeRef; - - fn LLVMInt1Type() -> TypeRef; - fn LLVMInt8Type() -> TypeRef; - fn LLVMInt16Type() -> TypeRef; - fn LLVMInt32Type() -> TypeRef; - fn LLVMInt64Type() -> TypeRef; - fn LLVMIntType(NumBits: unsigned) -> TypeRef; - fn LLVMGetIntTypeWidth(IntegerTy: TypeRef) -> unsigned; - - /* Operations on real types */ - fn LLVMFloatTypeInContext(C: ContextRef) -> TypeRef; - fn LLVMDoubleTypeInContext(C: ContextRef) -> TypeRef; - fn LLVMX86FP80TypeInContext(C: ContextRef) -> TypeRef; - fn LLVMFP128TypeInContext(C: ContextRef) -> TypeRef; - fn LLVMPPCFP128TypeInContext(C: ContextRef) -> TypeRef; - - fn LLVMFloatType() -> TypeRef; - fn LLVMDoubleType() -> TypeRef; - fn LLVMX86FP80Type() -> TypeRef; - fn LLVMFP128Type() -> TypeRef; - fn LLVMPPCFP128Type() -> TypeRef; - - /* Operations on function types */ - fn LLVMFunctionType(ReturnType: TypeRef, ParamTypes: *TypeRef, - ParamCount: unsigned, IsVarArg: Bool) -> TypeRef; - fn LLVMIsFunctionVarArg(FunctionTy: TypeRef) -> Bool; - fn LLVMGetReturnType(FunctionTy: TypeRef) -> TypeRef; - fn LLVMCountParamTypes(FunctionTy: TypeRef) -> unsigned; - fn LLVMGetParamTypes(FunctionTy: TypeRef, Dest: *TypeRef); - - /* Operations on struct types */ - fn LLVMStructTypeInContext(C: ContextRef, ElementTypes: *TypeRef, - ElementCount: unsigned, - Packed: Bool) -> TypeRef; - fn LLVMStructType(ElementTypes: *TypeRef, ElementCount: unsigned, - Packed: Bool) -> TypeRef; - fn LLVMCountStructElementTypes(StructTy: TypeRef) -> unsigned; - fn LLVMGetStructElementTypes(StructTy: TypeRef, Dest: *TypeRef); - fn LLVMIsPackedStruct(StructTy: TypeRef) -> Bool; - - /* Operations on array, pointer, and vector types (sequence types) */ - fn LLVMArrayType(ElementType: TypeRef, - ElementCount: unsigned) -> TypeRef; - fn LLVMPointerType(ElementType: TypeRef, - AddressSpace: unsigned) -> TypeRef; - fn LLVMVectorType(ElementType: TypeRef, - ElementCount: unsigned) -> TypeRef; - - fn LLVMGetElementType(Ty: TypeRef) -> TypeRef; - fn LLVMGetArrayLength(ArrayTy: TypeRef) -> unsigned; - fn LLVMGetPointerAddressSpace(PointerTy: TypeRef) -> unsigned; - fn LLVMGetVectorSize(VectorTy: TypeRef) -> unsigned; - - /* Operations on other types */ - fn LLVMVoidTypeInContext(C: ContextRef) -> TypeRef; - fn LLVMLabelTypeInContext(C: ContextRef) -> TypeRef; - fn LLVMMetadataTypeInContext(C: ContextRef) -> TypeRef; - - fn LLVMVoidType() -> TypeRef; - fn LLVMLabelType() -> TypeRef; - fn LLVMMetadataType() -> TypeRef; - - /* Operations on all values */ - fn LLVMTypeOf(Val: ValueRef) -> TypeRef; - fn LLVMGetValueName(Val: ValueRef) -> sbuf; - fn LLVMSetValueName(Val: ValueRef, Name: sbuf); - fn LLVMDumpValue(Val: ValueRef); - fn LLVMReplaceAllUsesWith(OldVal: ValueRef, NewVal: ValueRef); - fn LLVMHasMetadata(Val: ValueRef) -> c_int; - fn LLVMGetMetadata(Val: ValueRef, KindID: unsigned) -> ValueRef; - fn LLVMSetMetadata(Val: ValueRef, KindID: unsigned, Node: ValueRef); - - /* Operations on Uses */ - fn LLVMGetFirstUse(Val: ValueRef) -> UseRef; - fn LLVMGetNextUse(U: UseRef) -> UseRef; - fn LLVMGetUser(U: UseRef) -> ValueRef; - fn LLVMGetUsedValue(U: UseRef) -> ValueRef; - - /* Operations on Users */ - fn LLVMGetOperand(Val: ValueRef, Index: unsigned) -> ValueRef; - fn LLVMSetOperand(Val: ValueRef, Index: unsigned, Op: ValueRef); - - /* Operations on constants of any type */ - fn LLVMConstNull(Ty: TypeRef) -> ValueRef; - /* all zeroes */ - fn LLVMConstAllOnes(Ty: TypeRef) -> ValueRef; - /* only for int/vector */ - fn LLVMGetUndef(Ty: TypeRef) -> ValueRef; - fn LLVMIsConstant(Val: ValueRef) -> Bool; - fn LLVMIsNull(Val: ValueRef) -> Bool; - fn LLVMIsUndef(Val: ValueRef) -> Bool; - fn LLVMConstPointerNull(Ty: TypeRef) -> ValueRef; - - /* Operations on metadata */ - fn LLVMMDStringInContext(C: ContextRef, Str: sbuf, SLen: unsigned) -> - ValueRef; - fn LLVMMDString(Str: sbuf, SLen: unsigned) -> ValueRef; - fn LLVMMDNodeInContext(C: ContextRef, Vals: *ValueRef, Count: unsigned) -> - ValueRef; - fn LLVMMDNode(Vals: *ValueRef, Count: unsigned) -> ValueRef; - fn LLVMAddNamedMetadataOperand(M: ModuleRef, Str: sbuf, - Val: ValueRef); - - /* Operations on scalar constants */ - fn LLVMConstInt(IntTy: TypeRef, N: ulonglong, SignExtend: Bool) -> - ValueRef; - // FIXME: radix is actually u8, but our native layer can't handle this - // yet. lucky for us we're little-endian. Small miracles. - fn LLVMConstIntOfString(IntTy: TypeRef, Text: sbuf, Radix: c_int) -> - ValueRef; - fn LLVMConstIntOfStringAndSize(IntTy: TypeRef, Text: sbuf, SLen: unsigned, - Radix: u8) -> ValueRef; - fn LLVMConstReal(RealTy: TypeRef, N: f64) -> ValueRef; - fn LLVMConstRealOfString(RealTy: TypeRef, Text: sbuf) -> ValueRef; - fn LLVMConstRealOfStringAndSize(RealTy: TypeRef, Text: sbuf, - SLen: unsigned) -> ValueRef; - fn LLVMConstIntGetZExtValue(ConstantVal: ValueRef) -> ulonglong; - fn LLVMConstIntGetSExtValue(ConstantVal: ValueRef) -> longlong; - - - /* Operations on composite constants */ - fn LLVMConstStringInContext(C: ContextRef, Str: sbuf, Length: unsigned, - DontNullTerminate: Bool) -> ValueRef; - fn LLVMConstStructInContext(C: ContextRef, ConstantVals: *ValueRef, - Count: unsigned, Packed: Bool) -> ValueRef; - - fn LLVMConstString(Str: sbuf, Length: unsigned, - DontNullTerminate: Bool) -> ValueRef; - fn LLVMConstArray(ElementTy: TypeRef, ConstantVals: *ValueRef, - Length: unsigned) -> ValueRef; - fn LLVMConstStruct(ConstantVals: *ValueRef, - Count: unsigned, Packed: Bool) -> ValueRef; - fn LLVMConstVector(ScalarConstantVals: *ValueRef, - Size: unsigned) -> ValueRef; - - /* Constant expressions */ - fn LLVMAlignOf(Ty: TypeRef) -> ValueRef; - fn LLVMSizeOf(Ty: TypeRef) -> ValueRef; - fn LLVMConstNeg(ConstantVal: ValueRef) -> ValueRef; - fn LLVMConstNSWNeg(ConstantVal: ValueRef) -> ValueRef; - fn LLVMConstNUWNeg(ConstantVal: ValueRef) -> ValueRef; - fn LLVMConstFNeg(ConstantVal: ValueRef) -> ValueRef; - fn LLVMConstNot(ConstantVal: ValueRef) -> ValueRef; - fn LLVMConstAdd(LHSConstant: ValueRef, RHSConstant: ValueRef) -> ValueRef; - fn LLVMConstNSWAdd(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstNUWAdd(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstFAdd(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstSub(LHSConstant: ValueRef, RHSConstant: ValueRef) -> ValueRef; - fn LLVMConstNSWSub(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstNUWSub(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstFSub(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstMul(LHSConstant: ValueRef, RHSConstant: ValueRef) -> ValueRef; - fn LLVMConstNSWMul(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstNUWMul(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstFMul(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstUDiv(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstSDiv(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstExactSDiv(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstFDiv(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstURem(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstSRem(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstFRem(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstAnd(LHSConstant: ValueRef, RHSConstant: ValueRef) -> ValueRef; - fn LLVMConstOr(LHSConstant: ValueRef, RHSConstant: ValueRef) -> ValueRef; - fn LLVMConstXor(LHSConstant: ValueRef, RHSConstant: ValueRef) -> ValueRef; - fn LLVMConstShl(LHSConstant: ValueRef, RHSConstant: ValueRef) -> ValueRef; - fn LLVMConstLShr(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstAShr(LHSConstant: ValueRef, RHSConstant: ValueRef) -> - ValueRef; - fn LLVMConstGEP(ConstantVal: ValueRef, ConstantIndices: *uint, - NumIndices: unsigned) -> ValueRef; - fn LLVMConstInBoundsGEP(ConstantVal: ValueRef, ConstantIndices: *uint, - NumIndices: unsigned) -> ValueRef; - fn LLVMConstTrunc(ConstantVal: ValueRef, ToType: TypeRef) -> ValueRef; - fn LLVMConstSExt(ConstantVal: ValueRef, ToType: TypeRef) -> ValueRef; - fn LLVMConstZExt(ConstantVal: ValueRef, ToType: TypeRef) -> ValueRef; - fn LLVMConstFPTrunc(ConstantVal: ValueRef, ToType: TypeRef) -> ValueRef; - fn LLVMConstFPExt(ConstantVal: ValueRef, ToType: TypeRef) -> ValueRef; - fn LLVMConstUIToFP(ConstantVal: ValueRef, ToType: TypeRef) -> ValueRef; - fn LLVMConstSIToFP(ConstantVal: ValueRef, ToType: TypeRef) -> ValueRef; - fn LLVMConstFPToUI(ConstantVal: ValueRef, ToType: TypeRef) -> ValueRef; - fn LLVMConstFPToSI(ConstantVal: ValueRef, ToType: TypeRef) -> ValueRef; - fn LLVMConstPtrToInt(ConstantVal: ValueRef, ToType: TypeRef) -> ValueRef; - fn LLVMConstIntToPtr(ConstantVal: ValueRef, ToType: TypeRef) -> ValueRef; - fn LLVMConstBitCast(ConstantVal: ValueRef, ToType: TypeRef) -> ValueRef; - fn LLVMConstZExtOrBitCast(ConstantVal: ValueRef, ToType: TypeRef) -> - ValueRef; - fn LLVMConstSExtOrBitCast(ConstantVal: ValueRef, ToType: TypeRef) -> - ValueRef; - fn LLVMConstTruncOrBitCast(ConstantVal: ValueRef, ToType: TypeRef) -> - ValueRef; - fn LLVMConstPointerCast(ConstantVal: ValueRef, ToType: TypeRef) -> - ValueRef; - fn LLVMConstIntCast(ConstantVal: ValueRef, ToType: TypeRef, - isSigned: Bool) -> ValueRef; - fn LLVMConstFPCast(ConstantVal: ValueRef, ToType: TypeRef) -> ValueRef; - fn LLVMConstSelect(ConstantCondition: ValueRef, ConstantIfTrue: ValueRef, - ConstantIfFalse: ValueRef) -> ValueRef; - fn LLVMConstExtractElement(VectorConstant: ValueRef, - IndexConstant: ValueRef) -> ValueRef; - fn LLVMConstInsertElement(VectorConstant: ValueRef, - ElementValueConstant: ValueRef, - IndexConstant: ValueRef) -> ValueRef; - fn LLVMConstShuffleVector(VectorAConstant: ValueRef, - VectorBConstant: ValueRef, - MaskConstant: ValueRef) -> ValueRef; - fn LLVMConstExtractValue(AggConstant: ValueRef, IdxList: *uint, - NumIdx: unsigned) -> ValueRef; - fn LLVMConstInsertValue(AggConstant: ValueRef, - ElementValueConstant: ValueRef, IdxList: *uint, - NumIdx: unsigned) -> ValueRef; - fn LLVMConstInlineAsm(Ty: TypeRef, AsmString: sbuf, Constraints: sbuf, - HasSideEffects: Bool, IsAlignStack: Bool) -> - ValueRef; - fn LLVMBlockAddress(F: ValueRef, BB: BasicBlockRef) -> ValueRef; - - - - /* Operations on global variables, functions, and aliases (globals) */ - fn LLVMGetGlobalParent(Global: ValueRef) -> ModuleRef; - fn LLVMIsDeclaration(Global: ValueRef) -> Bool; - fn LLVMGetLinkage(Global: ValueRef) -> unsigned; - fn LLVMSetLinkage(Global: ValueRef, Link: unsigned); - fn LLVMGetSection(Global: ValueRef) -> sbuf; - fn LLVMSetSection(Global: ValueRef, Section: sbuf); - fn LLVMGetVisibility(Global: ValueRef) -> unsigned; - fn LLVMSetVisibility(Global: ValueRef, Viz: unsigned); - fn LLVMGetAlignment(Global: ValueRef) -> unsigned; - fn LLVMSetAlignment(Global: ValueRef, Bytes: unsigned); - - - /* Operations on global variables */ - fn LLVMAddGlobal(M: ModuleRef, Ty: TypeRef, Name: sbuf) -> ValueRef; - fn LLVMAddGlobalInAddressSpace(M: ModuleRef, Ty: TypeRef, Name: sbuf, - AddressSpace: unsigned) -> ValueRef; - fn LLVMGetNamedGlobal(M: ModuleRef, Name: sbuf) -> ValueRef; - fn LLVMGetFirstGlobal(M: ModuleRef) -> ValueRef; - fn LLVMGetLastGlobal(M: ModuleRef) -> ValueRef; - fn LLVMGetNextGlobal(GlobalVar: ValueRef) -> ValueRef; - fn LLVMGetPreviousGlobal(GlobalVar: ValueRef) -> ValueRef; - fn LLVMDeleteGlobal(GlobalVar: ValueRef); - fn LLVMGetInitializer(GlobalVar: ValueRef) -> ValueRef; - fn LLVMSetInitializer(GlobalVar: ValueRef, ConstantVal: ValueRef); - fn LLVMIsThreadLocal(GlobalVar: ValueRef) -> Bool; - fn LLVMSetThreadLocal(GlobalVar: ValueRef, IsThreadLocal: Bool); - fn LLVMIsGlobalConstant(GlobalVar: ValueRef) -> Bool; - fn LLVMSetGlobalConstant(GlobalVar: ValueRef, IsConstant: Bool); - - /* Operations on aliases */ - fn LLVMAddAlias(M: ModuleRef, Ty: TypeRef, Aliasee: ValueRef, Name: sbuf) - -> ValueRef; - - /* Operations on functions */ - fn LLVMAddFunction(M: ModuleRef, Name: sbuf, FunctionTy: TypeRef) -> - ValueRef; - fn LLVMGetNamedFunction(M: ModuleRef, Name: sbuf) -> ValueRef; - fn LLVMGetFirstFunction(M: ModuleRef) -> ValueRef; - fn LLVMGetLastFunction(M: ModuleRef) -> ValueRef; - fn LLVMGetNextFunction(Fn: ValueRef) -> ValueRef; - fn LLVMGetPreviousFunction(Fn: ValueRef) -> ValueRef; - fn LLVMDeleteFunction(Fn: ValueRef); - fn LLVMGetOrInsertFunction(M: ModuleRef, Name: sbuf, FunctionTy: TypeRef) - -> ValueRef; - fn LLVMGetIntrinsicID(Fn: ValueRef) -> unsigned; - fn LLVMGetFunctionCallConv(Fn: ValueRef) -> unsigned; - fn LLVMSetFunctionCallConv(Fn: ValueRef, CC: unsigned); - fn LLVMGetGC(Fn: ValueRef) -> sbuf; - fn LLVMSetGC(Fn: ValueRef, Name: sbuf); - fn LLVMAddFunctionAttr(Fn: ValueRef, PA: unsigned, HighPA: unsigned); - fn LLVMGetFunctionAttr(Fn: ValueRef) -> unsigned; - fn LLVMRemoveFunctionAttr(Fn: ValueRef, PA: unsigned, HighPA: unsigned); - - /* Operations on parameters */ - fn LLVMCountParams(Fn: ValueRef) -> unsigned; - fn LLVMGetParams(Fn: ValueRef, Params: *ValueRef); - fn LLVMGetParam(Fn: ValueRef, Index: unsigned) -> ValueRef; - fn LLVMGetParamParent(Inst: ValueRef) -> ValueRef; - fn LLVMGetFirstParam(Fn: ValueRef) -> ValueRef; - fn LLVMGetLastParam(Fn: ValueRef) -> ValueRef; - fn LLVMGetNextParam(Arg: ValueRef) -> ValueRef; - fn LLVMGetPreviousParam(Arg: ValueRef) -> ValueRef; - fn LLVMAddAttribute(Arg: ValueRef, PA: unsigned); - fn LLVMRemoveAttribute(Arg: ValueRef, PA: unsigned); - fn LLVMGetAttribute(Arg: ValueRef) -> unsigned; - fn LLVMSetParamAlignment(Arg: ValueRef, align: unsigned); - - /* Operations on basic blocks */ - fn LLVMBasicBlockAsValue(BB: BasicBlockRef) -> ValueRef; - fn LLVMValueIsBasicBlock(Val: ValueRef) -> Bool; - fn LLVMValueAsBasicBlock(Val: ValueRef) -> BasicBlockRef; - fn LLVMGetBasicBlockParent(BB: BasicBlockRef) -> ValueRef; - fn LLVMCountBasicBlocks(Fn: ValueRef) -> unsigned; - fn LLVMGetBasicBlocks(Fn: ValueRef, BasicBlocks: *ValueRef); - fn LLVMGetFirstBasicBlock(Fn: ValueRef) -> BasicBlockRef; - fn LLVMGetLastBasicBlock(Fn: ValueRef) -> BasicBlockRef; - fn LLVMGetNextBasicBlock(BB: BasicBlockRef) -> BasicBlockRef; - fn LLVMGetPreviousBasicBlock(BB: BasicBlockRef) -> BasicBlockRef; - fn LLVMGetEntryBasicBlock(Fn: ValueRef) -> BasicBlockRef; - - fn LLVMAppendBasicBlockInContext(C: ContextRef, Fn: ValueRef, Name: sbuf) - -> BasicBlockRef; - fn LLVMInsertBasicBlockInContext(C: ContextRef, BB: BasicBlockRef, - Name: sbuf) -> BasicBlockRef; - - fn LLVMAppendBasicBlock(Fn: ValueRef, Name: sbuf) -> BasicBlockRef; - fn LLVMInsertBasicBlock(InsertBeforeBB: BasicBlockRef, Name: sbuf) -> - BasicBlockRef; - fn LLVMDeleteBasicBlock(BB: BasicBlockRef); - - /* Operations on instructions */ - fn LLVMGetInstructionParent(Inst: ValueRef) -> BasicBlockRef; - fn LLVMGetFirstInstruction(BB: BasicBlockRef) -> ValueRef; - fn LLVMGetLastInstruction(BB: BasicBlockRef) -> ValueRef; - fn LLVMGetNextInstruction(Inst: ValueRef) -> ValueRef; - fn LLVMGetPreviousInstruction(Inst: ValueRef) -> ValueRef; - - /* Operations on call sites */ - fn LLVMSetInstructionCallConv(Instr: ValueRef, CC: unsigned); - fn LLVMGetInstructionCallConv(Instr: ValueRef) -> unsigned; - fn LLVMAddInstrAttribute(Instr: ValueRef, index: unsigned, IA: unsigned); - fn LLVMRemoveInstrAttribute(Instr: ValueRef, index: unsigned, - IA: unsigned); - fn LLVMSetInstrParamAlignment(Instr: ValueRef, index: unsigned, - align: unsigned); - - /* Operations on call instructions (only) */ - fn LLVMIsTailCall(CallInst: ValueRef) -> Bool; - fn LLVMSetTailCall(CallInst: ValueRef, IsTailCall: Bool); - - /* Operations on phi nodes */ - fn LLVMAddIncoming(PhiNode: ValueRef, IncomingValues: *ValueRef, - IncomingBlocks: *BasicBlockRef, Count: unsigned); - fn LLVMCountIncoming(PhiNode: ValueRef) -> unsigned; - fn LLVMGetIncomingValue(PhiNode: ValueRef, Index: unsigned) -> ValueRef; - fn LLVMGetIncomingBlock(PhiNode: ValueRef, - Index: unsigned) -> BasicBlockRef; - - /* Instruction builders */ - fn LLVMCreateBuilderInContext(C: ContextRef) -> BuilderRef; - fn LLVMCreateBuilder() -> BuilderRef; - fn LLVMPositionBuilder(Builder: BuilderRef, Block: BasicBlockRef, - Instr: ValueRef); - fn LLVMPositionBuilderBefore(Builder: BuilderRef, Instr: ValueRef); - fn LLVMPositionBuilderAtEnd(Builder: BuilderRef, Block: BasicBlockRef); - fn LLVMGetInsertBlock(Builder: BuilderRef) -> BasicBlockRef; - fn LLVMClearInsertionPosition(Builder: BuilderRef); - fn LLVMInsertIntoBuilder(Builder: BuilderRef, Instr: ValueRef); - fn LLVMInsertIntoBuilderWithName(Builder: BuilderRef, Instr: ValueRef, - Name: sbuf); - fn LLVMDisposeBuilder(Builder: BuilderRef); - - /* Metadata */ - fn LLVMSetCurrentDebugLocation(Builder: BuilderRef, L: ValueRef); - fn LLVMGetCurrentDebugLocation(Builder: BuilderRef) -> ValueRef; - fn LLVMSetInstDebugLocation(Builder: BuilderRef, Inst: ValueRef); - - /* Terminators */ - fn LLVMBuildRetVoid(B: BuilderRef) -> ValueRef; - fn LLVMBuildRet(B: BuilderRef, V: ValueRef) -> ValueRef; - fn LLVMBuildAggregateRet(B: BuilderRef, RetVals: *ValueRef, - N: unsigned) -> ValueRef; - fn LLVMBuildBr(B: BuilderRef, Dest: BasicBlockRef) -> ValueRef; - fn LLVMBuildCondBr(B: BuilderRef, If: ValueRef, Then: BasicBlockRef, - Else: BasicBlockRef) -> ValueRef; - fn LLVMBuildSwitch(B: BuilderRef, V: ValueRef, Else: BasicBlockRef, - NumCases: unsigned) -> ValueRef; - fn LLVMBuildIndirectBr(B: BuilderRef, Addr: ValueRef, - NumDests: unsigned) -> ValueRef; - fn LLVMBuildInvoke(B: BuilderRef, Fn: ValueRef, Args: *ValueRef, - NumArgs: unsigned, Then: BasicBlockRef, - Catch: BasicBlockRef, Name: sbuf) -> ValueRef; - fn LLVMBuildLandingPad(B: BuilderRef, Ty: TypeRef, PersFn: ValueRef, - NumClauses: unsigned, Name: sbuf) -> ValueRef; - fn LLVMBuildResume(B: BuilderRef, Exn: ValueRef) -> ValueRef; - fn LLVMBuildUnreachable(B: BuilderRef) -> ValueRef; - - /* Add a case to the switch instruction */ - fn LLVMAddCase(Switch: ValueRef, OnVal: ValueRef, Dest: BasicBlockRef); - - /* Add a destination to the indirectbr instruction */ - fn LLVMAddDestination(IndirectBr: ValueRef, Dest: BasicBlockRef); - - /* Add a clause to the landing pad instruction */ - fn LLVMAddClause(LandingPad: ValueRef, ClauseVal: ValueRef); - - /* Set the cleanup on a landing pad instruction */ - fn LLVMSetCleanup(LandingPad: ValueRef, Val: Bool); - - /* Arithmetic */ - fn LLVMBuildAdd(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildNSWAdd(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildNUWAdd(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildFAdd(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildSub(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildNSWSub(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildNUWSub(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildFSub(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildMul(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildNSWMul(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildNUWMul(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildFMul(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildUDiv(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildSDiv(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildExactSDiv(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildFDiv(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildURem(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildSRem(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildFRem(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildShl(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildLShr(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildAShr(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildAnd(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildOr(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) -> - ValueRef; - fn LLVMBuildXor(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildBinOp(B: BuilderRef, Op: Opcode, LHS: ValueRef, RHS: ValueRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildNeg(B: BuilderRef, V: ValueRef, Name: sbuf) -> ValueRef; - fn LLVMBuildNSWNeg(B: BuilderRef, V: ValueRef, Name: sbuf) -> ValueRef; - fn LLVMBuildNUWNeg(B: BuilderRef, V: ValueRef, Name: sbuf) -> ValueRef; - fn LLVMBuildFNeg(B: BuilderRef, V: ValueRef, Name: sbuf) -> ValueRef; - fn LLVMBuildNot(B: BuilderRef, V: ValueRef, Name: sbuf) -> ValueRef; - - /* Memory */ - fn LLVMBuildMalloc(B: BuilderRef, Ty: TypeRef, Name: sbuf) -> ValueRef; - fn LLVMBuildArrayMalloc(B: BuilderRef, Ty: TypeRef, Val: ValueRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildAlloca(B: BuilderRef, Ty: TypeRef, Name: sbuf) -> ValueRef; - fn LLVMBuildArrayAlloca(B: BuilderRef, Ty: TypeRef, Val: ValueRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildFree(B: BuilderRef, PointerVal: ValueRef) -> ValueRef; - fn LLVMBuildLoad(B: BuilderRef, PointerVal: ValueRef, Name: sbuf) -> - ValueRef; - fn LLVMBuildStore(B: BuilderRef, Val: ValueRef, Ptr: ValueRef) -> - ValueRef; - fn LLVMBuildGEP(B: BuilderRef, Pointer: ValueRef, Indices: *ValueRef, - NumIndices: unsigned, Name: sbuf) -> ValueRef; - fn LLVMBuildInBoundsGEP(B: BuilderRef, Pointer: ValueRef, - Indices: *ValueRef, NumIndices: unsigned, - Name: sbuf) - -> ValueRef; - fn LLVMBuildStructGEP(B: BuilderRef, Pointer: ValueRef, Idx: unsigned, - Name: sbuf) -> ValueRef; - fn LLVMBuildGlobalString(B: BuilderRef, Str: sbuf, Name: sbuf) -> - ValueRef; - fn LLVMBuildGlobalStringPtr(B: BuilderRef, Str: sbuf, Name: sbuf) -> - ValueRef; - - /* Casts */ - fn LLVMBuildTrunc(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildZExt(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildSExt(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildFPToUI(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildFPToSI(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildUIToFP(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildSIToFP(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildFPTrunc(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildFPExt(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildPtrToInt(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildIntToPtr(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildBitCast(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildZExtOrBitCast(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildSExtOrBitCast(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildTruncOrBitCast(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildCast(B: BuilderRef, Op: Opcode, Val: ValueRef, - DestTy: TypeRef, Name: sbuf) -> ValueRef; - fn LLVMBuildPointerCast(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildIntCast(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - fn LLVMBuildFPCast(B: BuilderRef, Val: ValueRef, DestTy: TypeRef, - Name: sbuf) -> ValueRef; - - /* Comparisons */ - fn LLVMBuildICmp(B: BuilderRef, Op: unsigned, LHS: ValueRef, - RHS: ValueRef, Name: sbuf) -> ValueRef; - fn LLVMBuildFCmp(B: BuilderRef, Op: unsigned, LHS: ValueRef, - RHS: ValueRef, Name: sbuf) -> ValueRef; - - /* Miscellaneous instructions */ - fn LLVMBuildPhi(B: BuilderRef, Ty: TypeRef, Name: sbuf) -> ValueRef; - fn LLVMBuildCall(B: BuilderRef, Fn: ValueRef, Args: *ValueRef, - NumArgs: unsigned, Name: sbuf) -> ValueRef; - fn LLVMBuildSelect(B: BuilderRef, If: ValueRef, Then: ValueRef, - Else: ValueRef, Name: sbuf) -> ValueRef; - fn LLVMBuildVAArg(B: BuilderRef, list: ValueRef, Ty: TypeRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildExtractElement(B: BuilderRef, VecVal: ValueRef, - Index: ValueRef, Name: sbuf) -> ValueRef; - fn LLVMBuildInsertElement(B: BuilderRef, VecVal: ValueRef, - EltVal: ValueRef, Index: ValueRef, Name: sbuf) - -> ValueRef; - fn LLVMBuildShuffleVector(B: BuilderRef, V1: ValueRef, V2: ValueRef, - Mask: ValueRef, Name: sbuf) -> ValueRef; - fn LLVMBuildExtractValue(B: BuilderRef, AggVal: ValueRef, Index: unsigned, - Name: sbuf) -> ValueRef; - fn LLVMBuildInsertValue(B: BuilderRef, AggVal: ValueRef, EltVal: ValueRef, - Index: unsigned, Name: sbuf) -> ValueRef; - - fn LLVMBuildIsNull(B: BuilderRef, Val: ValueRef, Name: sbuf) -> ValueRef; - fn LLVMBuildIsNotNull(B: BuilderRef, Val: ValueRef, Name: sbuf) -> - ValueRef; - fn LLVMBuildPtrDiff(B: BuilderRef, LHS: ValueRef, RHS: ValueRef, - Name: sbuf) -> ValueRef; - - /* Selected entries from the downcasts. */ - fn LLVMIsATerminatorInst(Inst: ValueRef) -> ValueRef; - - /** Writes a module to the specified path. Returns 0 on success. */ - fn LLVMWriteBitcodeToFile(M: ModuleRef, Path: sbuf) -> c_int; - - /** Creates target data from a target layout string. */ - fn LLVMCreateTargetData(StringRep: sbuf) -> TargetDataRef; - /** Adds the target data to the given pass manager. The pass manager - references the target data only weakly. */ - fn LLVMAddTargetData(TD: TargetDataRef, PM: PassManagerRef); - /** Returns the size of a type. FIXME: rv is actually a ULongLong! */ - fn LLVMStoreSizeOfType(TD: TargetDataRef, Ty: TypeRef) -> unsigned; - /** Returns the alignment of a type. */ - fn LLVMPreferredAlignmentOfType(TD: TargetDataRef, - Ty: TypeRef) -> unsigned; - /** Disposes target data. */ - fn LLVMDisposeTargetData(TD: TargetDataRef); - - /** Creates a pass manager. */ - fn LLVMCreatePassManager() -> PassManagerRef; - /** Disposes a pass manager. */ - fn LLVMDisposePassManager(PM: PassManagerRef); - /** Runs a pass manager on a module. */ - fn LLVMRunPassManager(PM: PassManagerRef, M: ModuleRef) -> Bool; - - /** Adds a verification pass. */ - fn LLVMAddVerifierPass(PM: PassManagerRef); - - fn LLVMAddGlobalOptimizerPass(PM: PassManagerRef); - fn LLVMAddIPSCCPPass(PM: PassManagerRef); - fn LLVMAddDeadArgEliminationPass(PM: PassManagerRef); - fn LLVMAddInstructionCombiningPass(PM: PassManagerRef); - fn LLVMAddCFGSimplificationPass(PM: PassManagerRef); - fn LLVMAddFunctionInliningPass(PM: PassManagerRef); - fn LLVMAddFunctionAttrsPass(PM: PassManagerRef); - fn LLVMAddScalarReplAggregatesPass(PM: PassManagerRef); - fn LLVMAddScalarReplAggregatesPassSSA(PM: PassManagerRef); - fn LLVMAddJumpThreadingPass(PM: PassManagerRef); - fn LLVMAddConstantPropagationPass(PM: PassManagerRef); - fn LLVMAddReassociatePass(PM: PassManagerRef); - fn LLVMAddLoopRotatePass(PM: PassManagerRef); - fn LLVMAddLICMPass(PM: PassManagerRef); - fn LLVMAddLoopUnswitchPass(PM: PassManagerRef); - fn LLVMAddLoopDeletionPass(PM: PassManagerRef); - fn LLVMAddLoopUnrollPass(PM: PassManagerRef); - fn LLVMAddGVNPass(PM: PassManagerRef); - fn LLVMAddMemCpyOptPass(PM: PassManagerRef); - fn LLVMAddSCCPPass(PM: PassManagerRef); - fn LLVMAddDeadStoreEliminationPass(PM: PassManagerRef); - fn LLVMAddStripDeadPrototypesPass(PM: PassManagerRef); - fn LLVMAddConstantMergePass(PM: PassManagerRef); - fn LLVMAddArgumentPromotionPass(PM: PassManagerRef); - fn LLVMAddTailCallEliminationPass(PM: PassManagerRef); - fn LLVMAddIndVarSimplifyPass(PM: PassManagerRef); - fn LLVMAddAggressiveDCEPass(PM: PassManagerRef); - fn LLVMAddGlobalDCEPass(PM: PassManagerRef); - fn LLVMAddCorrelatedValuePropagationPass(PM: PassManagerRef); - fn LLVMAddPruneEHPass(PM: PassManagerRef); - fn LLVMAddSimplifyLibCallsPass(PM: PassManagerRef); - fn LLVMAddLoopIdiomPass(PM: PassManagerRef); - fn LLVMAddEarlyCSEPass(PM: PassManagerRef); - fn LLVMAddTypeBasedAliasAnalysisPass(PM: PassManagerRef); - fn LLVMAddBasicAliasAnalysisPass(PM: PassManagerRef); - - fn LLVMPassManagerBuilderCreate() -> PassManagerBuilderRef; - fn LLVMPassManagerBuilderDispose(PMB: PassManagerBuilderRef); - fn LLVMPassManagerBuilderSetOptLevel(PMB: PassManagerBuilderRef, - OptimizationLevel: unsigned); - fn LLVMPassManagerBuilderSetSizeLevel(PMB: PassManagerBuilderRef, - Value: Bool); - fn LLVMPassManagerBuilderSetDisableUnitAtATime(PMB: PassManagerBuilderRef, - Value: Bool); - fn LLVMPassManagerBuilderSetDisableUnrollLoops(PMB: PassManagerBuilderRef, - Value: Bool); - fn LLVMPassManagerBuilderSetDisableSimplifyLibCalls - (PMB: PassManagerBuilderRef, Value: Bool); - fn LLVMPassManagerBuilderUseInlinerWithThreshold - (PMB: PassManagerBuilderRef, threshold: unsigned); - fn LLVMPassManagerBuilderPopulateModulePassManager - (PMB: PassManagerBuilderRef, PM: PassManagerRef); - - fn LLVMPassManagerBuilderPopulateFunctionPassManager - (PMB: PassManagerBuilderRef, PM: PassManagerRef); - - /** Destroys a memory buffer. */ - fn LLVMDisposeMemoryBuffer(MemBuf: MemoryBufferRef); - - - /* Stuff that's in rustllvm/ because it's not upstream yet. */ - - /** Opens an object file. */ - fn LLVMCreateObjectFile(MemBuf: MemoryBufferRef) -> ObjectFileRef; - /** Closes an object file. */ - fn LLVMDisposeObjectFile(ObjectFile: ObjectFileRef); - - /** Enumerates the sections in an object file. */ - fn LLVMGetSections(ObjectFile: ObjectFileRef) -> SectionIteratorRef; - /** Destroys a section iterator. */ - fn LLVMDisposeSectionIterator(SI: SectionIteratorRef); - /** Returns true if the section iterator is at the end of the section - list: */ - fn LLVMIsSectionIteratorAtEnd(ObjectFile: ObjectFileRef, - SI: SectionIteratorRef) -> Bool; - /** Moves the section iterator to point to the next section. */ - fn LLVMMoveToNextSection(SI: SectionIteratorRef); - /** Returns the current section name. */ - fn LLVMGetSectionName(SI: SectionIteratorRef) -> sbuf; - /** Returns the current section size. */ - fn LLVMGetSectionSize(SI: SectionIteratorRef) -> ulonglong; - /** Returns the current section contents as a string buffer. */ - fn LLVMGetSectionContents(SI: SectionIteratorRef) -> sbuf; - - /** Reads the given file and returns it as a memory buffer. Use - LLVMDisposeMemoryBuffer() to get rid of it. */ - fn LLVMRustCreateMemoryBufferWithContentsOfFile(Path: sbuf) -> - MemoryBufferRef; - - /* FIXME: The FileType is an enum.*/ - fn LLVMRustWriteOutputFile(PM: PassManagerRef, M: ModuleRef, Triple: sbuf, - Output: sbuf, FileType: c_int, OptLevel: c_int, - EnableSegmentedStacks: bool); - - /** Returns a string describing the last error caused by an LLVMRust* - call. */ - fn LLVMRustGetLastError() -> sbuf; - - /** Parses the bitcode in the given memory buffer. */ - fn LLVMRustParseBitcode(MemBuf: MemoryBufferRef) -> ModuleRef; - - /** Parses LLVM asm in the given file */ - fn LLVMRustParseAssemblyFile(Filename: sbuf) -> ModuleRef; - - /** FiXME: Hacky adaptor for lack of ULongLong in FFI: */ - fn LLVMRustConstInt(IntTy: TypeRef, N_hi: unsigned, N_lo: unsigned, - SignExtend: Bool) -> ValueRef; - - fn LLVMRustAddPrintModulePass(PM: PassManagerRef, M: ModuleRef, - Output: sbuf); - - /** Turn on LLVM pass-timing. */ - fn LLVMRustEnableTimePasses(); - - /** Print the pass timings since static dtors aren't picking them up. */ - fn LLVMRustPrintPassTimings(); - - fn LLVMStructCreateNamed(C: ContextRef, Name: sbuf) -> TypeRef; - - fn LLVMStructSetBody(StructTy: TypeRef, ElementTypes: *TypeRef, - ElementCount: unsigned, Packed: Bool); - - fn LLVMConstNamedStruct(S: TypeRef, ConstantVals: *ValueRef, - Count: unsigned) -> ValueRef; - - /** Links LLVM modules together. `Src` is destroyed by this call and - must never be referenced again. */ - fn LLVMLinkModules(Dest: ModuleRef, Src: ModuleRef) -> Bool; -} - -fn SetInstructionCallConv(Instr: ValueRef, CC: CallConv) { - llvm::LLVMSetInstructionCallConv(Instr, CC as unsigned); -} -fn SetFunctionCallConv(Fn: ValueRef, CC: CallConv) { - llvm::LLVMSetFunctionCallConv(Fn, CC as unsigned); -} -fn SetLinkage(Global: ValueRef, Link: Linkage) { - llvm::LLVMSetLinkage(Global, Link as unsigned); -} - -/* Memory-managed object interface to type handles. */ - -type type_names = @{type_names: std::map::hashmap<TypeRef, str>, - named_types: std::map::hashmap<str, TypeRef>}; - -fn associate_type(tn: type_names, s: str, t: TypeRef) { - assert tn.type_names.insert(t, s); - assert tn.named_types.insert(s, t); -} - -fn type_has_name(tn: type_names, t: TypeRef) -> option<str> { - ret tn.type_names.find(t); -} - -fn name_has_type(tn: type_names, s: str) -> option<TypeRef> { - ret tn.named_types.find(s); -} - -fn mk_type_names() -> type_names { - fn hash(&&t: TypeRef) -> uint { ret t as uint; } - fn eq(&&a: TypeRef, &&b: TypeRef) -> bool { ret a as uint == b as uint; } - @{type_names: std::map::mk_hashmap(hash, eq), - named_types: std::map::new_str_hash()} -} - -fn type_to_str(names: type_names, ty: TypeRef) -> str { - ret type_to_str_inner(names, [], ty); -} - -fn type_to_str_inner(names: type_names, outer0: [TypeRef], ty: TypeRef) -> - str { - alt type_has_name(names, ty) { - option::some(n) { ret n; } - _ {} - } - - let outer = outer0 + [ty]; - - let kind: int = llvm::LLVMGetTypeKind(ty) as int; - - fn tys_str(names: type_names, outer: [TypeRef], tys: [TypeRef]) -> str { - let s: str = ""; - let first: bool = true; - for t: TypeRef in tys { - if first { first = false; } else { s += ", "; } - s += type_to_str_inner(names, outer, t); - } - ret s; - } - - alt kind { - // FIXME: more enum-as-int constants determined from Core::h; - // horrible, horrible. Complete as needed. - 0 { ret "Void"; } - 1 { ret "Half"; } - 2 { ret "Float"; } - 3 { ret "Double"; } - 4 { ret "X86_FP80"; } - 5 { ret "FP128"; } - 6 { ret "PPC_FP128"; } - 7 { ret "Label"; } - 8 { - ret "i" + int::str(llvm::LLVMGetIntTypeWidth(ty) as int); - } - 9 { - let s = "fn("; - let out_ty: TypeRef = llvm::LLVMGetReturnType(ty); - let n_args = llvm::LLVMCountParamTypes(ty) as uint; - let args: [TypeRef] = vec::init_elt::<TypeRef>(n_args, 0 as TypeRef); - unsafe { - llvm::LLVMGetParamTypes(ty, vec::unsafe::to_ptr(args)); - } - s += tys_str(names, outer, args); - s += ") -> "; - s += type_to_str_inner(names, outer, out_ty); - ret s; - } - 10 { - let s: str = "{"; - let n_elts = llvm::LLVMCountStructElementTypes(ty) as uint; - let elts: [TypeRef] = vec::init_elt::<TypeRef>(n_elts, 0 as TypeRef); - unsafe { - llvm::LLVMGetStructElementTypes(ty, vec::unsafe::to_ptr(elts)); - } - s += tys_str(names, outer, elts); - s += "}"; - ret s; - } - 11 { - let el_ty = llvm::LLVMGetElementType(ty); - ret "[" + type_to_str_inner(names, outer, el_ty) + " x " + - uint::str(llvm::LLVMGetArrayLength(ty) as uint) + "]"; - } - 12 { - let i: uint = 0u; - for tout: TypeRef in outer0 { - i += 1u; - if tout as int == ty as int { - let n: uint = vec::len::<TypeRef>(outer0) - i; - ret "*\\" + int::str(n as int); - } - } - ret "*" + - type_to_str_inner(names, outer, llvm::LLVMGetElementType(ty)); - } - 13 { ret "Vector"; } - 14 { ret "Metadata"; } - 15 { ret "X86_MMAX"; } - _ { #error("unknown TypeKind %d", kind as int); fail; } - } -} - -fn float_width(llt: TypeRef) -> uint { - ret alt llvm::LLVMGetTypeKind(llt) as int { - 1 { 32u } - 2 { 64u } - 3 { 80u } - 4 | 5 { 128u } - _ { fail "llvm_float_width called on a non-float type" } - }; -} - -fn fn_ty_param_tys(fn_ty: TypeRef) -> [TypeRef] unsafe { - let args = vec::init_elt(llvm::LLVMCountParamTypes(fn_ty) as uint, - 0 as TypeRef); - llvm::LLVMGetParamTypes(fn_ty, vec::unsafe::to_ptr(args)); - ret args; -} - - -/* Memory-managed interface to target data. */ - -resource target_data_res(TD: TargetDataRef) { - llvm::LLVMDisposeTargetData(TD); -} - -type target_data = {lltd: TargetDataRef, dtor: @target_data_res}; - -fn mk_target_data(string_rep: str) -> target_data { - let lltd = - str::as_buf(string_rep, {|buf| llvm::LLVMCreateTargetData(buf) }); - ret {lltd: lltd, dtor: @target_data_res(lltd)}; -} - -/* Memory-managed interface to pass managers. */ - -resource pass_manager_res(PM: PassManagerRef) { - llvm::LLVMDisposePassManager(PM); -} - -type pass_manager = {llpm: PassManagerRef, dtor: @pass_manager_res}; - -fn mk_pass_manager() -> pass_manager { - let llpm = llvm::LLVMCreatePassManager(); - ret {llpm: llpm, dtor: @pass_manager_res(llpm)}; -} - -/* Memory-managed interface to object files. */ - -resource object_file_res(ObjectFile: ObjectFileRef) { - llvm::LLVMDisposeObjectFile(ObjectFile); -} - -type object_file = {llof: ObjectFileRef, dtor: @object_file_res}; - -fn mk_object_file(llmb: MemoryBufferRef) -> option<object_file> { - let llof = llvm::LLVMCreateObjectFile(llmb); - if llof as int == 0 { ret option::none::<object_file>; } - ret option::some({llof: llof, dtor: @object_file_res(llof)}); -} - -/* Memory-managed interface to section iterators. */ - -resource section_iter_res(SI: SectionIteratorRef) { - llvm::LLVMDisposeSectionIterator(SI); -} - -type section_iter = {llsi: SectionIteratorRef, dtor: @section_iter_res}; - -fn mk_section_iter(llof: ObjectFileRef) -> section_iter { - let llsi = llvm::LLVMGetSections(llof); - ret {llsi: llsi, dtor: @section_iter_res(llsi)}; -} - -// -// Local Variables: -// mode: rust -// fill-column: 78; -// indent-tabs-mode: nil -// c-basic-offset: 4 -// buffer-file-coding-system: utf-8-unix -// End: -// |
