首页 > 解决方案 > 加载大型数组时“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]],错误不会出现。

我无法从错误消息中读取我丢失的文件。为什么在大型阵列中会发生这种情况?我缺少什么文件?

标签: llvm

解决方案


罪魁祸首似乎是指令%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
}

推荐阅读