@@ -303,12 +303,29 @@ LogicalResult ModuleTranslation::convertOperation(Operation &opInst,
303
303
auto convertCall = [this , &builder](Operation &op) -> llvm::Value * {
304
304
auto operands = lookupValues (op.getOperands ());
305
305
ArrayRef<llvm::Value *> operandsRef (operands);
306
+ llvm::Value *callV;
306
307
if (auto attr = op.getAttrOfType <FlatSymbolRefAttr>(" callee" )) {
307
- return builder.CreateCall (functionMapping.lookup (attr.getValue ()),
308
+ callV = builder.CreateCall (functionMapping.lookup (attr.getValue ()),
308
309
operandsRef);
309
310
} else {
310
- return builder.CreateCall (operandsRef.front (), operandsRef.drop_front ());
311
+ callV = builder.CreateCall (operandsRef.front (), operandsRef.drop_front ());
311
312
}
313
+ auto callInst = static_cast <llvm::CallInst *>(callV);
314
+ if (op.getAttrOfType <UnitAttr>(" tail" )) {
315
+ callInst->setTailCall (true );
316
+ } else if (op.getAttrOfType <UnitAttr>(" musttail" )) {
317
+ callInst->setTailCallKind (llvm::CallInst::TailCallKind::TCK_MustTail);
318
+ }
319
+ for (auto namedAttr : op.getAttrs ()) {
320
+ if (auto fnAttr = namedAttr.second .dyn_cast_or_null <UnitAttr>()) {
321
+ StringRef fnAttrKindName = namedAttr.first .strref ();
322
+ auto fnAttrKind = llvm::Attribute::getAttrKindFromName (fnAttrKindName);
323
+ if (fnAttrKind != llvm::Attribute::None) {
324
+ callInst->addAttribute (llvm::AttributeList::FunctionIndex, fnAttrKind);
325
+ }
326
+ }
327
+ }
328
+ return callInst;
312
329
};
313
330
314
331
// Emit calls. If the called function has a result, remap the corresponding
0 commit comments