Add more LLVM library bindings to rustc.
This commit is contained in:
parent
bc0d1fbae5
commit
5267b77d3b
@ -20,6 +20,14 @@ native mod llvm = "libLLVM-2.7.so" {
|
||||
type PassManagerRef;
|
||||
type UseRef;
|
||||
|
||||
/* FIXME: These are enums in the C header. Represent them how, in rust? */
|
||||
type Linkage;
|
||||
type Attribute;
|
||||
type Visibility;
|
||||
type CallConv;
|
||||
type IntPredicate;
|
||||
type RealPredicate;
|
||||
type Opcode;
|
||||
|
||||
/* Create and destroy contexts. */
|
||||
fn ContextCreate() -> ContextRef;
|
||||
@ -29,7 +37,7 @@ native mod llvm = "libLLVM-2.7.so" {
|
||||
fn GetMDKindID(sbuf Name, uint SLen) -> uint;
|
||||
|
||||
/* Create and destroy modules. */
|
||||
fn ModuleCreateWithName(sbuf ModuleID) -> ModuleRef;
|
||||
fn ModuleCreateWithNameInContext(sbuf ModuleID, ContextRef C) -> ModuleRef;
|
||||
fn DisposeModule(ModuleRef M);
|
||||
|
||||
/** Data layout. See Module::getDataLayout. */
|
||||
@ -274,4 +282,344 @@ native mod llvm = "libLLVM-2.7.so" {
|
||||
Bool HasSideEffects, Bool IsAlignStack) -> ValueRef;
|
||||
fn BlockAddress(ValueRef F, BasicBlockRef BB) -> ValueRef;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* Operations on global variables, functions, and aliases (globals) */
|
||||
fn GetGlobalParent(ValueRef Global) -> ModuleRef;
|
||||
fn IsDeclaration(ValueRef Global) -> Bool;
|
||||
fn GetLinkage(ValueRef Global) -> Linkage;
|
||||
fn SetLinkage(ValueRef Global, Linkage Link);
|
||||
fn GetSection(ValueRef Global) -> sbuf;
|
||||
fn SetSection(ValueRef Global, sbuf Section);
|
||||
fn GetVisibility(ValueRef Global) -> Visibility;
|
||||
fn SetVisibility(ValueRef Global, Visibility Viz);
|
||||
fn GetAlignment(ValueRef Global) -> uint;
|
||||
fn SetAlignment(ValueRef Global, uint Bytes);
|
||||
|
||||
|
||||
/* Operations on global variables */
|
||||
fn AddGlobal(ModuleRef M, TypeRef Ty, sbuf Name) -> ValueRef;
|
||||
fn AddGlobalInAddressSpace(ModuleRef M, TypeRef Ty,
|
||||
sbuf Name,
|
||||
uint AddressSpace) -> ValueRef;
|
||||
fn GetNamedGlobal(ModuleRef M, sbuf Name) -> ValueRef;
|
||||
fn GetFirstGlobal(ModuleRef M) -> ValueRef;
|
||||
fn GetLastGlobal(ModuleRef M) -> ValueRef;
|
||||
fn GetNextGlobal(ValueRef GlobalVar) -> ValueRef;
|
||||
fn GetPreviousGlobal(ValueRef GlobalVar) -> ValueRef;
|
||||
fn DeleteGlobal(ValueRef GlobalVar);
|
||||
fn GetInitializer(ValueRef GlobalVar) -> ValueRef;
|
||||
fn SetInitializer(ValueRef GlobalVar, ValueRef ConstantVal);
|
||||
fn IsThreadLocal(ValueRef GlobalVar) -> Bool;
|
||||
fn SetThreadLocal(ValueRef GlobalVar, Bool IsThreadLocal);
|
||||
fn IsGlobalConstant(ValueRef GlobalVar) -> Bool;
|
||||
fn SetGlobalConstant(ValueRef GlobalVar, Bool IsConstant);
|
||||
|
||||
/* Operations on aliases */
|
||||
fn AddAlias(ModuleRef M, TypeRef Ty, ValueRef Aliasee,
|
||||
sbuf Name) -> ValueRef;
|
||||
|
||||
/* Operations on functions */
|
||||
fn AddFunction(ModuleRef M, sbuf Name,
|
||||
TypeRef FunctionTy) -> ValueRef;
|
||||
fn GetNamedFunction(ModuleRef M, sbuf Name) -> ValueRef;
|
||||
fn GetFirstFunction(ModuleRef M) -> ValueRef;
|
||||
fn GetLastFunction(ModuleRef M) -> ValueRef;
|
||||
fn GetNextFunction(ValueRef Fn) -> ValueRef;
|
||||
fn GetPreviousFunction(ValueRef Fn) -> ValueRef;
|
||||
fn DeleteFunction(ValueRef Fn);
|
||||
fn GetIntrinsicID(ValueRef Fn) -> uint;
|
||||
fn GetFunctionCallConv(ValueRef Fn) -> uint;
|
||||
fn SetFunctionCallConv(ValueRef Fn, uint CC);
|
||||
fn GetGC(ValueRef Fn) -> sbuf;
|
||||
fn SetGC(ValueRef Fn, sbuf Name);
|
||||
fn AddFunctionAttr(ValueRef Fn, Attribute PA);
|
||||
fn GetFunctionAttr(ValueRef Fn) -> Attribute;
|
||||
fn RemoveFunctionAttr(ValueRef Fn, Attribute PA);
|
||||
|
||||
/* Operations on parameters */
|
||||
fn CountParams(ValueRef Fn) -> uint;
|
||||
fn GetParams(ValueRef Fn, vbuf Params);
|
||||
fn GetParam(ValueRef Fn, uint Index) -> ValueRef;
|
||||
fn GetParamParent(ValueRef Inst) -> ValueRef;
|
||||
fn GetFirstParam(ValueRef Fn) -> ValueRef;
|
||||
fn GetLastParam(ValueRef Fn) -> ValueRef;
|
||||
fn GetNextParam(ValueRef Arg) -> ValueRef;
|
||||
fn GetPreviousParam(ValueRef Arg) -> ValueRef;
|
||||
fn AddAttribute(ValueRef Arg, Attribute PA);
|
||||
fn RemoveAttribute(ValueRef Arg, Attribute PA);
|
||||
fn GetAttribute(ValueRef Arg) -> Attribute;
|
||||
fn SetParamAlignment(ValueRef Arg, uint align);
|
||||
|
||||
/* Operations on basic blocks */
|
||||
fn BasicBlockAsValue(BasicBlockRef BB) -> ValueRef;
|
||||
fn ValueIsBasicBlock(ValueRef Val) -> Bool;
|
||||
fn ValueAsBasicBlock(ValueRef Val) -> BasicBlockRef;
|
||||
fn GetBasicBlockParent(BasicBlockRef BB) -> ValueRef;
|
||||
fn CountBasicBlocks(ValueRef Fn) -> uint;
|
||||
fn GetBasicBlocks(ValueRef Fn, vbuf BasicBlocks);
|
||||
fn GetFirstBasicBlock(ValueRef Fn) -> BasicBlockRef;
|
||||
fn GetLastBasicBlock(ValueRef Fn) -> BasicBlockRef;
|
||||
fn GetNextBasicBlock(BasicBlockRef BB) -> BasicBlockRef;
|
||||
fn GetPreviousBasicBlock(BasicBlockRef BB) -> BasicBlockRef;
|
||||
fn GetEntryBasicBlock(ValueRef Fn) -> BasicBlockRef;
|
||||
|
||||
fn AppendBasicBlockInContext(ContextRef C, ValueRef Fn,
|
||||
sbuf Name) -> BasicBlockRef;
|
||||
fn InsertBasicBlockInContext(ContextRef C, BasicBlockRef BB,
|
||||
sbuf Name) -> BasicBlockRef;
|
||||
|
||||
fn AppendBasicBlock(ValueRef Fn, sbuf Name) -> BasicBlockRef;
|
||||
fn InsertBasicBlock(BasicBlockRef InsertBeforeBB,
|
||||
sbuf Name) -> BasicBlockRef;
|
||||
fn DeleteBasicBlock(BasicBlockRef BB);
|
||||
|
||||
/* Operations on instructions */
|
||||
fn GetInstructionParent(ValueRef Inst) -> BasicBlockRef;
|
||||
fn GetFirstInstruction(BasicBlockRef BB) -> ValueRef;
|
||||
fn GetLastInstruction(BasicBlockRef BB) -> ValueRef;
|
||||
fn GetNextInstruction(ValueRef Inst) -> ValueRef;
|
||||
fn GetPreviousInstruction(ValueRef Inst) -> ValueRef;
|
||||
|
||||
/* Operations on call sites */
|
||||
fn SetInstructionCallConv(ValueRef Instr, uint CC);
|
||||
fn GetInstructionCallConv(ValueRef Instr) -> uint;
|
||||
fn AddInstrAttribute(ValueRef Instr, uint index, Attribute IA);
|
||||
fn RemoveInstrAttribute(ValueRef Instr, uint index, Attribute IA);
|
||||
fn SetInstrParamAlignment(ValueRef Instr, uint index, uint align);
|
||||
|
||||
/* Operations on call instructions (only) */
|
||||
fn IsTailCall(ValueRef CallInst) -> Bool;
|
||||
fn SetTailCall(ValueRef CallInst, Bool IsTailCall);
|
||||
|
||||
/* Operations on phi nodes */
|
||||
fn AddIncoming(ValueRef PhiNode, vbuf IncomingValues,
|
||||
vbuf IncomingBlocks, uint Count);
|
||||
fn CountIncoming(ValueRef PhiNode) -> uint;
|
||||
fn GetIncomingValue(ValueRef PhiNode, uint Index) -> ValueRef;
|
||||
fn GetIncomingBlock(ValueRef PhiNode, uint Index) -> BasicBlockRef;
|
||||
|
||||
/* Instruction builders */
|
||||
fn CreateBuilderInContext(ContextRef C) -> BuilderRef;
|
||||
fn CreateBuilder() -> BuilderRef;
|
||||
fn PositionBuilder(BuilderRef Builder, BasicBlockRef Block,
|
||||
ValueRef Instr);
|
||||
fn PositionBuilderBefore(BuilderRef Builder, ValueRef Instr);
|
||||
fn PositionBuilderAtEnd(BuilderRef Builder, BasicBlockRef Block);
|
||||
fn GetInsertBlock(BuilderRef Builder) -> BasicBlockRef;
|
||||
fn ClearInsertionPosition(BuilderRef Builder);
|
||||
fn InsertIntoBuilder(BuilderRef Builder, ValueRef Instr);
|
||||
fn InsertIntoBuilderWithName(BuilderRef Builder, ValueRef Instr,
|
||||
sbuf Name);
|
||||
fn DisposeBuilder(BuilderRef Builder);
|
||||
|
||||
/* Metadata */
|
||||
fn SetCurrentDebugLocation(BuilderRef Builder, ValueRef L);
|
||||
fn GetCurrentDebugLocation(BuilderRef Builder) -> ValueRef;
|
||||
fn SetInstDebugLocation(BuilderRef Builder, ValueRef Inst);
|
||||
|
||||
/* Terminators */
|
||||
fn BuildRetVoid(BuilderRef B) -> ValueRef;
|
||||
fn BuildRet(BuilderRef B, ValueRef V) -> ValueRef;
|
||||
fn BuildAggregateRet(BuilderRef B, vbuf RetVals,
|
||||
uint N) -> ValueRef;
|
||||
fn BuildBr(BuilderRef B, BasicBlockRef Dest) -> ValueRef;
|
||||
fn BuildCondBr(BuilderRef B, ValueRef If,
|
||||
BasicBlockRef Then, BasicBlockRef Else) -> ValueRef;
|
||||
fn BuildSwitch(BuilderRef B, ValueRef V,
|
||||
BasicBlockRef Else, uint NumCases) -> ValueRef;
|
||||
fn BuildIndirectBr(BuilderRef B, ValueRef Addr,
|
||||
uint NumDests) -> ValueRef;
|
||||
fn BuildInvoke(BuilderRef B, ValueRef Fn,
|
||||
vbuf Args, uint NumArgs,
|
||||
BasicBlockRef Then, BasicBlockRef Catch,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildUnwind(BuilderRef B) -> ValueRef;
|
||||
fn BuildUnreachable(BuilderRef B) -> ValueRef;
|
||||
|
||||
/* Add a case to the switch instruction */
|
||||
fn AddCase(ValueRef Switch, ValueRef OnVal,
|
||||
BasicBlockRef Dest);
|
||||
|
||||
/* Add a destination to the indirectbr instruction */
|
||||
fn AddDestination(ValueRef IndirectBr, BasicBlockRef Dest);
|
||||
|
||||
/* Arithmetic */
|
||||
fn BuildAdd(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildNSWAdd(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildNUWAdd(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildFAdd(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildSub(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildNSWSub(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildNUWSub(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildFSub(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildMul(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildNSWMul(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildNUWMul(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildFMul(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildUDiv(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildSDiv(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildExactSDiv(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildFDiv(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildURem(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildSRem(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildFRem(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildShl(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildLShr(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildAShr(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildAnd(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildOr(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildXor(BuilderRef B, ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildBinOp(BuilderRef B, Opcode Op,
|
||||
ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildNeg(BuilderRef B, ValueRef V, sbuf Name) -> ValueRef;
|
||||
fn BuildNSWNeg(BuilderRef B, ValueRef V,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildNUWNeg(BuilderRef B, ValueRef V,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildFNeg(BuilderRef B, ValueRef V, sbuf Name) -> ValueRef;
|
||||
fn BuildNot(BuilderRef B, ValueRef V, sbuf Name) -> ValueRef;
|
||||
|
||||
/* Memory */
|
||||
fn BuildMalloc(BuilderRef B, TypeRef Ty, sbuf Name) -> ValueRef;
|
||||
fn BuildArrayMalloc(BuilderRef B, TypeRef Ty,
|
||||
ValueRef Val, sbuf Name) -> ValueRef;
|
||||
fn BuildAlloca(BuilderRef B, TypeRef Ty, sbuf Name) -> ValueRef;
|
||||
fn BuildArrayAlloca(BuilderRef B, TypeRef Ty,
|
||||
ValueRef Val, sbuf Name) -> ValueRef;
|
||||
fn BuildFree(BuilderRef B, ValueRef PointerVal) -> ValueRef;
|
||||
fn BuildLoad(BuilderRef B, ValueRef PointerVal,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildStore(BuilderRef B, ValueRef Val, ValueRef Ptr) -> ValueRef;
|
||||
fn BuildGEP(BuilderRef B, ValueRef Pointer,
|
||||
vbuf Indices, uint NumIndices,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildInBoundsGEP(BuilderRef B, ValueRef Pointer,
|
||||
vbuf Indices, uint NumIndices,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildStructGEP(BuilderRef B, ValueRef Pointer,
|
||||
uint Idx, sbuf Name) -> ValueRef;
|
||||
fn BuildGlobalString(BuilderRef B, sbuf Str,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildGlobalStringPtr(BuilderRef B, sbuf Str,
|
||||
sbuf Name) -> ValueRef;
|
||||
|
||||
/* Casts */
|
||||
fn BuildTrunc(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildZExt(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildSExt(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildFPToUI(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildFPToSI(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildUIToFP(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildSIToFP(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildFPTrunc(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildFPExt(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildPtrToInt(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildIntToPtr(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildBitCast(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildZExtOrBitCast(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildSExtOrBitCast(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildTruncOrBitCast(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildCast(BuilderRef B, Opcode Op, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildPointerCast(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildIntCast(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
fn BuildFPCast(BuilderRef B, ValueRef Val,
|
||||
TypeRef DestTy, sbuf Name) -> ValueRef;
|
||||
|
||||
/* Comparisons */
|
||||
fn BuildICmp(BuilderRef B, IntPredicate Op,
|
||||
ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildFCmp(BuilderRef B, RealPredicate Op,
|
||||
ValueRef LHS, ValueRef RHS,
|
||||
sbuf Name) -> ValueRef;
|
||||
|
||||
/* Miscellaneous instructions */
|
||||
fn BuildPhi(BuilderRef B, TypeRef Ty, sbuf Name) -> ValueRef;
|
||||
fn BuildCall(BuilderRef B, ValueRef Fn,
|
||||
vbuf Args, uint NumArgs,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildSelect(BuilderRef B, ValueRef If,
|
||||
ValueRef Then, ValueRef Else,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildVAArg(BuilderRef B, ValueRef List, TypeRef Ty,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildExtractElement(BuilderRef B, ValueRef VecVal,
|
||||
ValueRef Index, sbuf Name) -> ValueRef;
|
||||
fn BuildInsertElement(BuilderRef B, ValueRef VecVal,
|
||||
ValueRef EltVal, ValueRef Index,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildShuffleVector(BuilderRef B, ValueRef V1,
|
||||
ValueRef V2, ValueRef Mask,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildExtractValue(BuilderRef B, ValueRef AggVal,
|
||||
uint Index, sbuf Name) -> ValueRef;
|
||||
fn BuildInsertValue(BuilderRef B, ValueRef AggVal,
|
||||
ValueRef EltVal, uint Index,
|
||||
sbuf Name) -> ValueRef;
|
||||
|
||||
fn BuildIsNull(BuilderRef B, ValueRef Val,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildIsNotNull(BuilderRef B, ValueRef Val,
|
||||
sbuf Name) -> ValueRef;
|
||||
fn BuildPtrDiff(BuilderRef B, ValueRef LHS,
|
||||
ValueRef RHS, sbuf Name) -> ValueRef;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
// Local Variables:
|
||||
// mode: rust
|
||||
// fill-column: 78;
|
||||
// indent-tabs-mode: nil
|
||||
// c-basic-offset: 4
|
||||
// buffer-file-coding-system: utf-8-unix
|
||||
// compile-command: "make -k -C ../.. 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
|
||||
// End:
|
||||
//
|
||||
|
Loading…
x
Reference in New Issue
Block a user