1 //===-- LowLevelIntrinsics.cpp --------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Coding style: https://mlir.llvm.org/getting_started/DeveloperGuide/ 10 // 11 //===----------------------------------------------------------------------===// 12 // 13 // Low level intrinsic functions. 14 // 15 // These include LLVM intrinsic calls and standard C library calls. 16 // Target-specific calls, such as OS functions, should be factored in other 17 // file(s). 18 // 19 //===----------------------------------------------------------------------===// 20 21 #include "flang/Optimizer/Builder/LowLevelIntrinsics.h" 22 #include "flang/Optimizer/Builder/FIRBuilder.h" 23 24 mlir::func::FuncOp fir::factory::getLlvmMemcpy(fir::FirOpBuilder &builder) { 25 auto ptrTy = builder.getRefType(builder.getIntegerType(8)); 26 llvm::SmallVector<mlir::Type> args = {ptrTy, ptrTy, builder.getI64Type(), 27 builder.getI1Type()}; 28 auto memcpyTy = 29 mlir::FunctionType::get(builder.getContext(), args, llvm::None); 30 return builder.addNamedFunction(builder.getUnknownLoc(), 31 "llvm.memcpy.p0.p0.i64", memcpyTy); 32 } 33 34 mlir::func::FuncOp fir::factory::getLlvmMemmove(fir::FirOpBuilder &builder) { 35 auto ptrTy = builder.getRefType(builder.getIntegerType(8)); 36 llvm::SmallVector<mlir::Type> args = {ptrTy, ptrTy, builder.getI64Type(), 37 builder.getI1Type()}; 38 auto memmoveTy = 39 mlir::FunctionType::get(builder.getContext(), args, llvm::None); 40 return builder.addNamedFunction(builder.getUnknownLoc(), 41 "llvm.memmove.p0.p0.i64", memmoveTy); 42 } 43 44 mlir::func::FuncOp fir::factory::getLlvmMemset(fir::FirOpBuilder &builder) { 45 auto ptrTy = builder.getRefType(builder.getIntegerType(8)); 46 llvm::SmallVector<mlir::Type> args = {ptrTy, ptrTy, builder.getI64Type(), 47 builder.getI1Type()}; 48 auto memsetTy = 49 mlir::FunctionType::get(builder.getContext(), args, llvm::None); 50 return builder.addNamedFunction(builder.getUnknownLoc(), 51 "llvm.memset.p0.p0.i64", memsetTy); 52 } 53 54 mlir::func::FuncOp fir::factory::getRealloc(fir::FirOpBuilder &builder) { 55 auto ptrTy = builder.getRefType(builder.getIntegerType(8)); 56 llvm::SmallVector<mlir::Type> args = {ptrTy, builder.getI64Type()}; 57 auto reallocTy = mlir::FunctionType::get(builder.getContext(), args, {ptrTy}); 58 return builder.addNamedFunction(builder.getUnknownLoc(), "realloc", 59 reallocTy); 60 } 61 62 mlir::func::FuncOp fir::factory::getLlvmStackSave(fir::FirOpBuilder &builder) { 63 auto ptrTy = builder.getRefType(builder.getIntegerType(8)); 64 auto funcTy = 65 mlir::FunctionType::get(builder.getContext(), llvm::None, {ptrTy}); 66 return builder.addNamedFunction(builder.getUnknownLoc(), "llvm.stacksave", 67 funcTy); 68 } 69 70 mlir::func::FuncOp 71 fir::factory::getLlvmStackRestore(fir::FirOpBuilder &builder) { 72 auto ptrTy = builder.getRefType(builder.getIntegerType(8)); 73 auto funcTy = 74 mlir::FunctionType::get(builder.getContext(), {ptrTy}, llvm::None); 75 return builder.addNamedFunction(builder.getUnknownLoc(), "llvm.stackrestore", 76 funcTy); 77 } 78 79 mlir::func::FuncOp 80 fir::factory::getLlvmInitTrampoline(fir::FirOpBuilder &builder) { 81 auto ptrTy = builder.getRefType(builder.getIntegerType(8)); 82 auto funcTy = mlir::FunctionType::get(builder.getContext(), 83 {ptrTy, ptrTy, ptrTy}, llvm::None); 84 return builder.addNamedFunction(builder.getUnknownLoc(), 85 "llvm.init.trampoline", funcTy); 86 } 87 88 mlir::func::FuncOp 89 fir::factory::getLlvmAdjustTrampoline(fir::FirOpBuilder &builder) { 90 auto ptrTy = builder.getRefType(builder.getIntegerType(8)); 91 auto funcTy = mlir::FunctionType::get(builder.getContext(), {ptrTy}, {ptrTy}); 92 return builder.addNamedFunction(builder.getUnknownLoc(), 93 "llvm.adjust.trampoline", funcTy); 94 } 95