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