You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LLVM IR代码生成仅方法声明带参数时程序退出触发段错误

问题根因

这个问题是典型的LLVM对象生命周期顺序错误导致的析构时段错误,触发条件和参数相关是因为带参数的函数会在Context中注册更多的元数据/值对象,放大了生命周期不匹配的问题:
你当前的代码中TheModule是通过new创建的堆对象,从来没有手动释放,而TheContext大概率是全局变量。LLVM要求所有关联到LLVMContext的对象(包括Module、Function、Instruction等)必须在LLVMContext本身析构之前全部销毁。你当前的执行顺序是:main函数返回 -> 全局变量TheContext开始析构 -> 堆上的TheModule还未销毁,其内部关联的参数、函数等对象还持有Context的引用,导致Context析构时访问空指针触发段错误。无参数的函数不会触发是因为其关联的Context资源更少,刚好没踩到非法访问的边界。
你Method::Codegen中参数存储的代码逻辑没问题,生成的IR也符合预期,不需要修改。

解决方法

  1. 调整对象销毁顺序,在main函数打印IR之后、return之前,手动销毁关联对象:
TheModule->print(llvm::errs(), nullptr);
// 新增以下代码
FPM.reset(); // 先销毁FunctionPassManager,它持有Module的引用
delete TheModule; // 再销毁Module,释放所有关联到Context的函数、指令等资源
return(retval >= 1 ? EXIT_FAILURE : EXIT_SUCCESS);
  1. 优化建议:不要把LLVMContext声明为全局变量,改为main函数的局部变量,这样天然符合销毁顺序:main函数退出时会先销毁局部的FPM、再销毁Module,最后销毁Context,完全满足LLVM的生命周期要求,从根源上避免这类问题。

内容的提问来源于stack exchange,提问作者Trevor Bonas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:24:05