编译手动编辑的IR文件时,llc中的模块错误

时间:2015-10-16 07:44:35

标签: llvm llc

我尝试在代码中插入第35行和第36行,但是当我尝试使用llc生成.o文件时发生错误。

<ItemsControl ItemsSource="{Binding WordList}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ui:NewWord>
                <ui:NewWord.DataContext>
                    <viewModels:NewWordViewModel CorrespondingWord="{Binding}"/>
                </ui:NewWord.DataContext>
            </ui:NewWord>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

错误信息:

 35   %12 = ptrtoint i32* %1 to i64 
 36   call void @__Storemy(i32 10, i64 %12) 
 37   store i32 %10, i32* %1 
 38   br label %18 

这是此功能的整个IR:

Instruction does not dominate all uses! 
  %12 = ptrtoint i32* %1 to i64 
  call void @__StoreTo(i32 15, i64 %12) 
Broken module found, compilation aborted! 
0  libLLVM-3.4.so.1 0x00007f6d31fe25d2 llvm::sys::PrintStackTrace(_IO_FILE*) + 34 
1  libLLVM-3.4.so.1 0x00007f6d31fe23c4 
2  libc.so.6        0x00007f6d30a62d40 
3  libc.so.6        0x00007f6d30a62cc9 gsignal + 57 
4  libc.so.6        0x00007f6d30a660d8 abort + 328 
5  libLLVM-3.4.so.1 0x00007f6d319d2a41 
6  libLLVM-3.4.so.1 0x00007f6d319dbb03 
7  libLLVM-3.4.so.1 0x00007f6d319b2f77 llvm::FPPassManager::runOnFunction(llvm::Function&) + 471 
8  libLLVM-3.4.so.1 0x00007f6d319b2ffb llvm::FPPassManager::runOnModule(llvm::Module&) + 43 
9  libLLVM-3.4.so.1 0x00007f6d319b54b5 llvm::legacy::PassManagerImpl::run(llvm::Module&) + 693 
10 llc              0x000000000040c0d4 
11 llc              0x000000000040b150 main + 368 
12 libc.so.6        0x00007f6d30a4dec5 __libc_start_main + 245 
13 llc              0x000000000040b1a9 
Stack dump: 
0.  Program arguments: llc -filetype=obj test.bc -o test.o 
1.  Running pass 'Function Pass Manager' on module 'test.bc'. 
2.  Running pass 'Module Verifier' on function '@dblfun' 

我发现此代码没有任何问题,有人可以给我一些建议吗?

1 个答案:

答案 0 :(得分:1)

您的函数的控制流图如下所示:

      entry
      /   \
     /     \
  _then   _else
    |       | 
    8       13
     \     /
      \   /
       18

%12在块8中定义。之后立即使用它,这很好,然后在块13中有另一种用法,你可以从图中看到它不被8支配(实际上它甚至不能从{{1}到达})。

在这种情况下,您应该能够将8指令移到条目块 - 这样就可以在其他每个块中访问它。