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 
getLlvmMemcpy(fir::FirOpBuilder & builder)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 
getLlvmMemmove(fir::FirOpBuilder & builder)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 
getLlvmMemset(fir::FirOpBuilder & builder)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 
getRealloc(fir::FirOpBuilder & builder)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 
getLlvmStackSave(fir::FirOpBuilder & builder)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
getLlvmStackRestore(fir::FirOpBuilder & builder)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
getLlvmInitTrampoline(fir::FirOpBuilder & builder)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
getLlvmAdjustTrampoline(fir::FirOpBuilder & builder)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