mirror of
https://github.com/exaloop/codon.git
synced 2025-06-03 15:03:52 +08:00
Fix CPython interface in codegen
This commit is contained in:
parent
999e42664e
commit
ef957c417a
@ -610,16 +610,35 @@ llvm::Function *LLVMVisitor::createPyTryCatchWrapper(llvm::Function *func) {
|
|||||||
auto *last = B->CreateInBoundsGEP(B->getInt8Ty(), buf, msgLen);
|
auto *last = B->CreateInBoundsGEP(B->getInt8Ty(), buf, msgLen);
|
||||||
B->CreateStore(B->getInt8(0), last);
|
B->CreateStore(B->getInt8(0), last);
|
||||||
|
|
||||||
auto *pyErrSetString = M->getNamedValue("PyErr_SetString");
|
const std::string pyErrSetStringName = "PyErr_SetString";
|
||||||
seqassertn(pyErrSetString, "'PyErr_SetString' not found in module");
|
llvm::Value *pyErrSetString = M->getNamedValue(pyErrSetStringName);
|
||||||
auto *pyExcRuntimeError = M->getNamedValue("PyExc_RuntimeError");
|
if (!pyErrSetString) {
|
||||||
seqassertn(pyExcRuntimeError, "'PyExc_RuntimeError' not found in module");
|
pyErrSetString = llvm::cast<llvm::Function>(
|
||||||
|
M->getOrInsertFunction(pyErrSetStringName, B->getVoidTy(), B->getInt8PtrTy(),
|
||||||
|
B->getInt8PtrTy())
|
||||||
|
.getCallee());
|
||||||
|
} else {
|
||||||
|
pyErrSetString = B->CreateLoad(B->getInt8PtrTy(), pyErrSetString);
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string pyExcRuntimeErrorName = "PyExc_RuntimeError";
|
||||||
|
llvm::Value *pyExcRuntimeError = M->getNamedValue(pyExcRuntimeErrorName);
|
||||||
|
if (!pyExcRuntimeError) {
|
||||||
|
auto *pyExcRuntimeErrorVar = new llvm::GlobalVariable(
|
||||||
|
*M, B->getInt8PtrTy(), /*isConstant=*/false, llvm::GlobalValue::ExternalLinkage,
|
||||||
|
/*Initializer=*/nullptr, pyExcRuntimeErrorName);
|
||||||
|
pyExcRuntimeErrorVar->setDSOLocal(true);
|
||||||
|
pyExcRuntimeError = pyExcRuntimeErrorVar;
|
||||||
|
} else {
|
||||||
|
pyExcRuntimeError = B->CreateLoad(B->getInt8PtrTy(), pyExcRuntimeError);
|
||||||
|
}
|
||||||
|
|
||||||
B->CreateCall(llvm::FunctionCallee(
|
B->CreateCall(llvm::FunctionCallee(
|
||||||
llvm::FunctionType::get(B->getVoidTy(),
|
llvm::FunctionType::get(B->getVoidTy(),
|
||||||
{B->getInt8PtrTy(), B->getInt8PtrTy()},
|
{B->getInt8PtrTy(), B->getInt8PtrTy()},
|
||||||
/*isVarArg=*/false),
|
/*isVarArg=*/false),
|
||||||
B->CreateLoad(B->getInt8PtrTy(), pyErrSetString)),
|
pyErrSetString),
|
||||||
{B->CreateLoad(B->getInt8PtrTy(), pyExcRuntimeError), buf});
|
{pyExcRuntimeError, buf});
|
||||||
B->CreateRet(llvm::Constant::getNullValue(wrap->getReturnType()));
|
B->CreateRet(llvm::Constant::getNullValue(wrap->getReturnType()));
|
||||||
|
|
||||||
return wrap;
|
return wrap;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user