我正在尝试在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]]
,则不会出现错误。
我无法从错误消息中读取我缺少的文件。为什么这会发生大阵列?我错过了什么文件?
答案 0 :(得分:0)
罪魁祸首似乎是指令%arr = load [300 x [300 x i1]], [300 x [300 x i1]]* @arr
,而不是大型数组。
加载指令尝试将非常大的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
}