llvm - 加载大型数组时“LLVMSymbolizer:读取文件时出错:没有这样的文件或目录”
问题描述
我正在尝试在 LLVM IR 代码中加载一个大型数组。这是我的 LLVM IR 代码(存储在 p.ll 中):
; ModuleID = 'my_module'
source_filename = "my_module"
@arr = internal global [300 x [300 x i1]] zeroinitializer
define i32 @main() {
entry:
%arr = load [300 x [300 x i1]], [300 x [300 x i1]]* @arr
ret i32 0
}
当我尝试用 编译它时llc p.ll
,它会给出以下错误消息:
LLVMSymbolizer: error reading file: No such file or directory
#0 0x00007f7bfe16c9cb llvm::sys::PrintStackTrace(llvm::raw_ostream&) (/usr/bin/../lib/libLLVM-6.0.so+0x8759cb)
#1 0x00007f7bfe16a886 llvm::sys::RunSignalHandlers() (/usr/bin/../lib/libLLVM-6.0.so+0x873886)
#2 0x00007f7bfe16a9d3 (/usr/bin/../lib/libLLVM-6.0.so+0x8739d3)
#3 0x00007f7bfd1e88f0 __restore_rt (/usr/bin/../lib/libc.so.6+0x368f0)
#4 0x00007f7bfe7ca360 llvm::SelectionDAG::DeallocateNode(llvm::SDNode*) (/usr/bin/../lib/libLLVM-6.0.so+0xed3360)
#5 0x00007f7bfe689c67 (/usr/bin/../lib/libLLVM-6.0.so+0xd92c67)
#6 0x00007f7bfe6933b7 llvm::SelectionDAG::Combine(llvm::CombineLevel, llvm::AAResults*, llvm::CodeGenOpt::Level) (/usr/bin/../lib/libLLVM-6.0.so+0xd9c3b7)
#7 0x00007f7bfe7dec11 llvm::SelectionDAGISel::CodeGenAndEmitDAG() (/usr/bin/../lib/libLLVM-6.0.so+0xee7c11)
#8 0x00007f7bfe7e946e llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) (/usr/bin/../lib/libLLVM-6.0.so+0xef246e)
#9 0x00007f7bfe7eba67 (/usr/bin/../lib/libLLVM-6.0.so+0xef4a67)
#10 0x00007f7bffef02c5 (/usr/bin/../lib/libLLVM-6.0.so+0x25f92c5)
#11 0x00007f7bfe452172 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) (/usr/bin/../lib/libLLVM-6.0.so+0xb5b172)
#12 0x00007f7bfe254dc1 llvm::FPPassManager::runOnFunction(llvm::Function&) (/usr/bin/../lib/libLLVM-6.0.so+0x95ddc1)
#13 0x00007f7bfe254e02 llvm::FPPassManager::runOnModule(llvm::Module&) (/usr/bin/../lib/libLLVM-6.0.so+0x95de02)
#14 0x00007f7bfe254592 llvm::legacy::PassManagerImpl::run(llvm::Module&) (/usr/bin/../lib/libLLVM-6.0.so+0x95d592)
#15 0x0000557aa4dbb3f9 (llc+0x223f9)
#16 0x0000557aa4daefd5 (llc+0x15fd5)
#17 0x00007f7bfd1d506b __libc_start_main (/usr/bin/../lib/libc.so.6+0x2306b)
#18 0x0000557aa4daf16a (llc+0x1616a)
Stack dump:
0. Program arguments: llc p.ll
1. Running pass 'Function Pass Manager' on module 'p.ll'.
2. Running pass 'X86 DAG->DAG Instruction Selection' on function '@main'
Segmentation fault (core dumped)
但是当我使数组变小时,就像[30 x [30 x i1]]
,错误不会出现。
我无法从错误消息中读取我丢失的文件。为什么在大型阵列中会发生这种情况?我缺少什么文件?
解决方案
罪魁祸首似乎是指令%arr = load [300 x [300 x i1]], [300 x [300 x i1]]* @arr
,而不是大数组。load 指令试图将一个非常大的 obj 加载[300 x [300 x i1]]
到堆栈中,这似乎是不允许的。如果您将其更改为跟随,那就没问题了。
; ModuleID = 'my_module'
source_filename = "my_module"
@arr = internal global [300 x [300 x i1]] zeroinitializer
define i32 @main() {
entry:
%0 = load i1, i1* getelementptr inbounds ([300 x [300 x i1]], [300 x [300 x i1]]* @arr, i64 0, i64 0, i64 0)
ret i32 0
}
推荐阅读
- python - 如何计算python中日期的滚动窗口期?
- object-detection - 可旋转边界框
- django - 插入新记录时如何向用户发送短信
- ios - Xcode 在导入 gradle 插件生成的 cocoapods 时显示 swift 编译器错误
- android - Google Play 控制台给出错误。“Произошлаошибка。Повторите попытку позже。”
- oauth-2.0 - 角度认证 OIDC;Azue B2C:从 Azure 获取令牌后获取用户配置文件加载并承诺未捕获的错误
- javascript - 编写这些函数以检查数字是否按升序/降序连续的更简洁的方法
- typescript - 根据第一个参数的值将第二个参数定义为条件类型
- entity-framework - 如何通过 Entity Framework Core 中的多对多额外列进行排序?
- sql - Converting column to decimal in stored procedure