diff --git a/codon/cir/llvm/llvisitor.cpp b/codon/cir/llvm/llvisitor.cpp index 2449d239..ac584480 100644 --- a/codon/cir/llvm/llvisitor.cpp +++ b/codon/cir/llvm/llvisitor.cpp @@ -925,6 +925,9 @@ void LLVMVisitor::writeToPythonExtension(const PyModule &pymod, } B->CreateRet(pythonObject); + auto *pyNew = llvm::cast( + M->getOrInsertFunction("PyType_GenericNew", ptr, ptr, ptr, ptr).getCallee()); + std::vector typeSlots = { llvm::ConstantStruct::get( pyVarObjectType, @@ -966,7 +969,7 @@ void LLVMVisitor::writeToPythonExtension(const PyModule &pymod, zero64, // tp_dictoffset pyFunc(pytype.init), // tp_init alloc, // tp_alloc - null, // tp_new + pyNew, // tp_new free, // tp_free null, // tp_is_gc null, // tp_bases @@ -1017,6 +1020,11 @@ void LLVMVisitor::writeToPythonExtension(const PyModule &pymod, auto *block = llvm::BasicBlock::Create(*context, "entry", pyModuleInit); B->SetInsertPoint(block); + if (auto *main = M->getFunction("main")) { + main->setName(".main"); + B->CreateCall({main->getFunctionType(), main}, {zero32, null}); + } + auto *refModFuncType = llvm::FunctionType::get(B->getVoidTy(), {ptr}, /*isVarArg=*/false); @@ -1038,11 +1046,6 @@ void LLVMVisitor::writeToPythonExtension(const PyModule &pymod, pyDecRef = B->CreateLoad(B->getInt8PtrTy(), pyDecRef); } - if (auto *main = M->getFunction("main")) { - main->setName(".main"); - B->CreateCall({main->getFunctionType(), main}, {zero32, null}); - } - // Set base types for (auto &pytype : pymod.types) { if (pytype.base) {