@@ -45,11 +45,10 @@ static constexpr llvm::StringRef kGenericFree = "_mlir_memref_to_llvm_free";
45
45
static constexpr llvm::StringRef kMemRefCopy = " memrefCopy" ;
46
46
47
47
// / Generic print function lookupOrCreate helper.
48
- LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreateFn (Operation *moduleOp,
49
- StringRef name,
50
- ArrayRef<Type> paramTypes,
51
- Type resultType, bool isVarArg,
52
- bool isReserved) {
48
+ FailureOr<LLVM::LLVMFuncOp>
49
+ mlir::LLVM::lookupOrCreateFn (Operation *moduleOp, StringRef name,
50
+ ArrayRef<Type> paramTypes, Type resultType,
51
+ bool isVarArg, bool isReserved) {
53
52
assert (moduleOp->hasTrait <OpTrait::SymbolTable>() &&
54
53
" expected SymbolTable operation" );
55
54
auto func = llvm::dyn_cast_or_null<LLVM::LLVMFuncOp>(
@@ -63,14 +62,13 @@ LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreateFn(Operation *moduleOp,
63
62
" ' of different type " )
64
63
.append (func.getFunctionType ())
65
64
.append (" is prohibited" );
66
- exit (0 );
67
65
} else {
68
66
func.emitError (" redefinition of function '" + name +
69
67
" ' of different type " )
70
68
.append (funcT)
71
69
.append (" is prohibited" );
72
- exit (0 );
73
70
}
71
+ return failure ();
74
72
}
75
73
return func;
76
74
}
@@ -80,42 +78,58 @@ LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreateFn(Operation *moduleOp,
80
78
LLVM::LLVMFunctionType::get (resultType, paramTypes, isVarArg));
81
79
}
82
80
83
- LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreatePrintI64Fn (Operation *moduleOp) {
84
- return lookupOrCreateFn (
81
+ namespace {
82
+ FailureOr<LLVM::LLVMFuncOp> lookupOrCreateReservedFn (Operation *moduleOp,
83
+ StringRef name,
84
+ ArrayRef<Type> paramTypes,
85
+ Type resultType) {
86
+ return lookupOrCreateFn (moduleOp, name, paramTypes, resultType,
87
+ /* isVarArg=*/ false , /* isReserved=*/ true );
88
+ }
89
+ } // namespace
90
+
91
+ FailureOr<LLVM::LLVMFuncOp>
92
+ mlir::LLVM::lookupOrCreatePrintI64Fn (Operation *moduleOp) {
93
+ return lookupOrCreateReservedFn (
85
94
moduleOp, kPrintI64 , IntegerType::get (moduleOp->getContext (), 64 ),
86
- LLVM::LLVMVoidType::get (moduleOp->getContext ()), false , true );
95
+ LLVM::LLVMVoidType::get (moduleOp->getContext ()));
87
96
}
88
97
89
- LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreatePrintU64Fn (Operation *moduleOp) {
90
- return lookupOrCreateFn (
98
+ FailureOr<LLVM::LLVMFuncOp>
99
+ mlir::LLVM::lookupOrCreatePrintU64Fn (Operation *moduleOp) {
100
+ return lookupOrCreateReservedFn (
91
101
moduleOp, kPrintU64 , IntegerType::get (moduleOp->getContext (), 64 ),
92
- LLVM::LLVMVoidType::get (moduleOp->getContext ()), false , true );
102
+ LLVM::LLVMVoidType::get (moduleOp->getContext ()));
93
103
}
94
104
95
- LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreatePrintF16Fn (Operation *moduleOp) {
96
- return lookupOrCreateFn (moduleOp, kPrintF16 ,
97
- IntegerType::get (moduleOp->getContext (), 16 ), // bits!
98
- LLVM::LLVMVoidType::get (moduleOp->getContext ()),
99
- false , true );
105
+ FailureOr<LLVM::LLVMFuncOp>
106
+ mlir::LLVM::lookupOrCreatePrintF16Fn (Operation *moduleOp) {
107
+ return lookupOrCreateReservedFn (
108
+ moduleOp, kPrintF16 ,
109
+ IntegerType::get (moduleOp->getContext (), 16 ), // bits!
110
+ LLVM::LLVMVoidType::get (moduleOp->getContext ()));
100
111
}
101
112
102
- LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreatePrintBF16Fn (Operation *moduleOp) {
103
- return lookupOrCreateFn (moduleOp, kPrintBF16 ,
104
- IntegerType::get (moduleOp->getContext (), 16 ), // bits!
105
- LLVM::LLVMVoidType::get (moduleOp->getContext ()),
106
- false , true );
113
+ FailureOr<LLVM::LLVMFuncOp>
114
+ mlir::LLVM::lookupOrCreatePrintBF16Fn (Operation *moduleOp) {
115
+ return lookupOrCreateReservedFn (
116
+ moduleOp, kPrintBF16 ,
117
+ IntegerType::get (moduleOp->getContext (), 16 ), // bits!
118
+ LLVM::LLVMVoidType::get (moduleOp->getContext ()));
107
119
}
108
120
109
- LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreatePrintF32Fn (Operation *moduleOp) {
110
- return lookupOrCreateFn (
121
+ FailureOr<LLVM::LLVMFuncOp>
122
+ mlir::LLVM::lookupOrCreatePrintF32Fn (Operation *moduleOp) {
123
+ return lookupOrCreateReservedFn (
111
124
moduleOp, kPrintF32 , Float32Type::get (moduleOp->getContext ()),
112
- LLVM::LLVMVoidType::get (moduleOp->getContext ()), false , true );
125
+ LLVM::LLVMVoidType::get (moduleOp->getContext ()));
113
126
}
114
127
115
- LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreatePrintF64Fn (Operation *moduleOp) {
116
- return lookupOrCreateFn (
128
+ FailureOr<LLVM::LLVMFuncOp>
129
+ mlir::LLVM::lookupOrCreatePrintF64Fn (Operation *moduleOp) {
130
+ return lookupOrCreateReservedFn (
117
131
moduleOp, kPrintF64 , Float64Type::get (moduleOp->getContext ()),
118
- LLVM::LLVMVoidType::get (moduleOp->getContext ()), false , true );
132
+ LLVM::LLVMVoidType::get (moduleOp->getContext ()));
119
133
}
120
134
121
135
static LLVM::LLVMPointerType getCharPtr (MLIRContext *context) {
@@ -127,84 +141,88 @@ static LLVM::LLVMPointerType getVoidPtr(MLIRContext *context) {
127
141
return getCharPtr (context);
128
142
}
129
143
130
- LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreatePrintStringFn (
144
+ FailureOr< LLVM::LLVMFuncOp> mlir::LLVM::lookupOrCreatePrintStringFn (
131
145
Operation *moduleOp, std::optional<StringRef> runtimeFunctionName) {
132
- return lookupOrCreateFn (moduleOp, runtimeFunctionName. value_or ( kPrintString ),
133
- getCharPtr (moduleOp-> getContext () ),
134
- LLVM::LLVMVoidType::get (moduleOp->getContext ()),
135
- false , true );
146
+ return lookupOrCreateReservedFn (
147
+ moduleOp, runtimeFunctionName. value_or ( kPrintString ),
148
+ getCharPtr (moduleOp->getContext ()),
149
+ LLVM::LLVMVoidType::get (moduleOp-> getContext ()) );
136
150
}
137
151
138
- LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreatePrintOpenFn (Operation *moduleOp) {
139
- return lookupOrCreateFn (moduleOp, kPrintOpen , {},
140
- LLVM::LLVMVoidType::get (moduleOp->getContext ()),
141
- false , true );
152
+ FailureOr<LLVM::LLVMFuncOp>
153
+ mlir::LLVM::lookupOrCreatePrintOpenFn (Operation *moduleOp) {
154
+ return lookupOrCreateReservedFn (
155
+ moduleOp, kPrintOpen , {},
156
+ LLVM::LLVMVoidType::get (moduleOp->getContext ()));
142
157
}
143
158
144
- LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreatePrintCloseFn (Operation *moduleOp) {
145
- return lookupOrCreateFn (moduleOp, kPrintClose , {},
146
- LLVM::LLVMVoidType::get (moduleOp->getContext ()),
147
- false , true );
159
+ FailureOr<LLVM::LLVMFuncOp>
160
+ mlir::LLVM::lookupOrCreatePrintCloseFn (Operation *moduleOp) {
161
+ return lookupOrCreateReservedFn (
162
+ moduleOp, kPrintClose , {},
163
+ LLVM::LLVMVoidType::get (moduleOp->getContext ()));
148
164
}
149
165
150
- LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreatePrintCommaFn (Operation *moduleOp) {
151
- return lookupOrCreateFn (moduleOp, kPrintComma , {},
152
- LLVM::LLVMVoidType::get (moduleOp->getContext ()),
153
- false , true );
166
+ FailureOr<LLVM::LLVMFuncOp>
167
+ mlir::LLVM::lookupOrCreatePrintCommaFn (Operation *moduleOp) {
168
+ return lookupOrCreateReservedFn (
169
+ moduleOp, kPrintComma , {},
170
+ LLVM::LLVMVoidType::get (moduleOp->getContext ()));
154
171
}
155
172
156
- LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreatePrintNewlineFn (Operation *moduleOp) {
157
- return lookupOrCreateFn (moduleOp, kPrintNewline , {},
158
- LLVM::LLVMVoidType::get (moduleOp->getContext ()),
159
- false , true );
173
+ FailureOr<LLVM::LLVMFuncOp>
174
+ mlir::LLVM::lookupOrCreatePrintNewlineFn (Operation *moduleOp) {
175
+ return lookupOrCreateReservedFn (
176
+ moduleOp, kPrintNewline , {},
177
+ LLVM::LLVMVoidType::get (moduleOp->getContext ()));
160
178
}
161
179
162
- LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreateMallocFn (Operation *moduleOp,
163
- Type indexType) {
164
- return LLVM::lookupOrCreateFn (moduleOp, kMalloc , indexType,
165
- getVoidPtr (moduleOp->getContext ()), false ,
166
- true );
180
+ FailureOr<LLVM::LLVMFuncOp>
181
+ mlir::LLVM::lookupOrCreateMallocFn (Operation *moduleOp, Type indexType) {
182
+ return lookupOrCreateReservedFn (moduleOp, kMalloc , indexType,
183
+ getVoidPtr (moduleOp->getContext ()));
167
184
}
168
185
169
- LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreateAlignedAllocFn (Operation *moduleOp,
170
- Type indexType) {
171
- return LLVM::lookupOrCreateFn (moduleOp, kAlignedAlloc , {indexType, indexType} ,
172
- getVoidPtr (moduleOp-> getContext ()), false ,
173
- true );
186
+ FailureOr< LLVM::LLVMFuncOp>
187
+ mlir::LLVM::lookupOrCreateAlignedAllocFn (Operation *moduleOp, Type indexType) {
188
+ return lookupOrCreateReservedFn (moduleOp, kAlignedAlloc ,
189
+ {indexType, indexType} ,
190
+ getVoidPtr (moduleOp-> getContext ()) );
174
191
}
175
192
176
- LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreateFreeFn (Operation *moduleOp) {
177
- return LLVM::lookupOrCreateFn (
193
+ FailureOr<LLVM::LLVMFuncOp>
194
+ mlir::LLVM::lookupOrCreateFreeFn (Operation *moduleOp) {
195
+ return lookupOrCreateReservedFn (
178
196
moduleOp, kFree , getVoidPtr (moduleOp->getContext ()),
179
- LLVM::LLVMVoidType::get (moduleOp->getContext ()), false , true );
197
+ LLVM::LLVMVoidType::get (moduleOp->getContext ()));
180
198
}
181
199
182
- LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreateGenericAllocFn (Operation *moduleOp,
183
- Type indexType) {
184
- return LLVM::lookupOrCreateFn (moduleOp, kGenericAlloc , indexType,
185
- getVoidPtr (moduleOp->getContext ()), false ,
186
- true );
200
+ FailureOr<LLVM::LLVMFuncOp>
201
+ mlir::LLVM::lookupOrCreateGenericAllocFn (Operation *moduleOp, Type indexType) {
202
+ return lookupOrCreateReservedFn (moduleOp, kGenericAlloc , indexType,
203
+ getVoidPtr (moduleOp->getContext ()));
187
204
}
188
205
189
- LLVM::LLVMFuncOp
206
+ FailureOr< LLVM::LLVMFuncOp>
190
207
mlir::LLVM::lookupOrCreateGenericAlignedAllocFn (Operation *moduleOp,
191
208
Type indexType) {
192
- return LLVM::lookupOrCreateFn (
193
- moduleOp, kGenericAlignedAlloc , {indexType, indexType},
194
- getVoidPtr (moduleOp->getContext ()), false , true );
209
+ return lookupOrCreateReservedFn (moduleOp, kGenericAlignedAlloc ,
210
+ {indexType, indexType},
211
+ getVoidPtr (moduleOp->getContext ()));
195
212
}
196
213
197
- LLVM::LLVMFuncOp mlir::LLVM::lookupOrCreateGenericFreeFn (Operation *moduleOp) {
198
- return LLVM::lookupOrCreateFn (
214
+ FailureOr<LLVM::LLVMFuncOp>
215
+ mlir::LLVM::lookupOrCreateGenericFreeFn (Operation *moduleOp) {
216
+ return lookupOrCreateReservedFn (
199
217
moduleOp, kGenericFree , getVoidPtr (moduleOp->getContext ()),
200
- LLVM::LLVMVoidType::get (moduleOp->getContext ()), false , true );
218
+ LLVM::LLVMVoidType::get (moduleOp->getContext ()));
201
219
}
202
220
203
- LLVM::LLVMFuncOp
221
+ FailureOr< LLVM::LLVMFuncOp>
204
222
mlir::LLVM::lookupOrCreateMemRefCopyFn (Operation *moduleOp, Type indexType,
205
223
Type unrankedDescriptorType) {
206
- return LLVM::lookupOrCreateFn (
224
+ return lookupOrCreateReservedFn (
207
225
moduleOp, kMemRefCopy ,
208
226
ArrayRef<Type>{indexType, unrankedDescriptorType, unrankedDescriptorType},
209
- LLVM::LLVMVoidType::get (moduleOp->getContext ()), false , true );
227
+ LLVM::LLVMVoidType::get (moduleOp->getContext ()));
210
228
}
0 commit comments