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
24mlir::func::FuncOp fir::factory::getRealloc(fir::FirOpBuilder &builder) {
25 auto ptrTy = builder.getRefType(builder.getIntegerType(8));
26 llvm::SmallVector<mlir::Type> args = {ptrTy, builder.getI64Type()};
27 auto reallocTy = mlir::FunctionType::get(builder.getContext(), args, {ptrTy});
28 return builder.createFunction(builder.getUnknownLoc(), "realloc", reallocTy);
29}
30
31mlir::func::FuncOp
32fir::factory::getLlvmGetRounding(fir::FirOpBuilder &builder) {
33 auto int32Ty = builder.getIntegerType(32);
34 auto funcTy =
35 mlir::FunctionType::get(builder.getContext(), std::nullopt, {int32Ty});
36 return builder.createFunction(builder.getUnknownLoc(), "llvm.get.rounding",
37 funcTy);
38}
39
40mlir::func::FuncOp
41fir::factory::getLlvmSetRounding(fir::FirOpBuilder &builder) {
42 auto int32Ty = builder.getIntegerType(32);
43 auto funcTy =
44 mlir::FunctionType::get(builder.getContext(), {int32Ty}, std::nullopt);
45 return builder.createFunction(builder.getUnknownLoc(), "llvm.set.rounding",
46 funcTy);
47}
48
49mlir::func::FuncOp
50fir::factory::getLlvmInitTrampoline(fir::FirOpBuilder &builder) {
51 auto ptrTy = builder.getRefType(builder.getIntegerType(8));
52 auto funcTy = mlir::FunctionType::get(builder.getContext(),
53 {ptrTy, ptrTy, ptrTy}, std::nullopt);
54 return builder.createFunction(builder.getUnknownLoc(), "llvm.init.trampoline",
55 funcTy);
56}
57
58mlir::func::FuncOp
59fir::factory::getLlvmAdjustTrampoline(fir::FirOpBuilder &builder) {
60 auto ptrTy = builder.getRefType(builder.getIntegerType(8));
61 auto funcTy = mlir::FunctionType::get(builder.getContext(), {ptrTy}, {ptrTy});
62 return builder.createFunction(builder.getUnknownLoc(),
63 "llvm.adjust.trampoline", funcTy);
64}
65
66mlir::func::FuncOp fir::factory::getFeclearexcept(fir::FirOpBuilder &builder) {
67 auto int32Ty = builder.getIntegerType(32);
68 auto funcTy =
69 mlir::FunctionType::get(builder.getContext(), {int32Ty}, {int32Ty});
70 return builder.createFunction(builder.getUnknownLoc(), "feclearexcept",
71 funcTy);
72}
73
74mlir::func::FuncOp
75fir::factory::getFedisableexcept(fir::FirOpBuilder &builder) {
76 auto int32Ty = builder.getIntegerType(32);
77 auto funcTy =
78 mlir::FunctionType::get(builder.getContext(), {int32Ty}, {int32Ty});
79 return builder.createFunction(builder.getUnknownLoc(), "fedisableexcept",
80 funcTy);
81}
82
83mlir::func::FuncOp fir::factory::getFeenableexcept(fir::FirOpBuilder &builder) {
84 auto int32Ty = builder.getIntegerType(32);
85 auto funcTy =
86 mlir::FunctionType::get(builder.getContext(), {int32Ty}, {int32Ty});
87 return builder.createFunction(builder.getUnknownLoc(), "feenableexcept",
88 funcTy);
89}
90
91mlir::func::FuncOp fir::factory::getFegetexcept(fir::FirOpBuilder &builder) {
92 auto int32Ty = builder.getIntegerType(32);
93 auto funcTy =
94 mlir::FunctionType::get(builder.getContext(), std::nullopt, {int32Ty});
95 return builder.createFunction(builder.getUnknownLoc(), "fegetexcept", funcTy);
96}
97
98mlir::func::FuncOp fir::factory::getFeraiseexcept(fir::FirOpBuilder &builder) {
99 auto int32Ty = builder.getIntegerType(32);
100 auto funcTy =
101 mlir::FunctionType::get(builder.getContext(), {int32Ty}, {int32Ty});
102 return builder.createFunction(builder.getUnknownLoc(), "feraiseexcept",
103 funcTy);
104}
105
106mlir::func::FuncOp fir::factory::getFetestexcept(fir::FirOpBuilder &builder) {
107 auto int32Ty = builder.getIntegerType(32);
108 auto funcTy =
109 mlir::FunctionType::get(builder.getContext(), {int32Ty}, {int32Ty});
110 return builder.createFunction(builder.getUnknownLoc(), "fetestexcept",
111 funcTy);
112}
113

source code of flang/lib/Optimizer/Builder/LowLevelIntrinsics.cpp