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::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.p0i8.p0i8.i64", memcpyTy); 32 } 33 34 mlir::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.p0i8.p0i8.i64", memmoveTy); 42 } 43 44 mlir::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.p0i8.p0i8.i64", memsetTy); 52 } 53 54 mlir::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::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::FuncOp fir::factory::getLlvmStackRestore(fir::FirOpBuilder &builder) { 71 auto ptrTy = builder.getRefType(builder.getIntegerType(8)); 72 auto funcTy = 73 mlir::FunctionType::get(builder.getContext(), {ptrTy}, llvm::None); 74 return builder.addNamedFunction(builder.getUnknownLoc(), "llvm.stackrestore", 75 funcTy); 76 } 77 78 mlir::FuncOp fir::factory::getLlvmInitTrampoline(fir::FirOpBuilder &builder) { 79 auto ptrTy = builder.getRefType(builder.getIntegerType(8)); 80 auto funcTy = mlir::FunctionType::get(builder.getContext(), 81 {ptrTy, ptrTy, ptrTy}, llvm::None); 82 return builder.addNamedFunction(builder.getUnknownLoc(), 83 "llvm.init.trampoline", funcTy); 84 } 85 86 mlir::FuncOp fir::factory::getLlvmAdjustTrampoline(fir::FirOpBuilder &builder) { 87 auto ptrTy = builder.getRefType(builder.getIntegerType(8)); 88 auto funcTy = mlir::FunctionType::get(builder.getContext(), {ptrTy}, {ptrTy}); 89 return builder.addNamedFunction(builder.getUnknownLoc(), 90 "llvm.adjust.trampoline", funcTy); 91 } 92