如何在llvm编译时将DWARF信息转储到文件中?

时间:2015-07-18 20:33:36

标签: clang llvm llvm-clang llvm-ir dwarf

我想知道如何在llvm编译IR时插入一些代码,以便生成DWARF信息文件。

(我不是要求在生成二进制文件后使用objdump / llvm-dwarfdump工具)

提前谢谢。

我尝试了Eli的回答,我在这里遇到了段错误,可能是我误用了它?

clang-3.7 -g -emit-llvm -c main.c -o build/main.bc
clang-3.7 -g -emit-llvm -c sum.c  -o build/sum.bc
llvm-link-3.7 build/main.bc build/sum.bc -o build/main.linked.bc
llc-3.7 -split-dwarf Enable build/main.linked.bc -o build/main

main.c中:

#include <stdio.h>

int sum(int x, int y);

int main()
{
    int r = sum(3, 4);
    printf("r = %d\n", r);
    return 0;
}

sum.c:

int sum(int x, int y) {
    return x + y;
}

Seg故障信息:

0  libLLVM-3.7.so.1 0x00002b332cdf0af8 llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 56
1  libLLVM-3.7.so.1 0x00002b332cdeff59
2  libc.so.6        0x00002b332e0bdd40
3  libLLVM-3.7.so.1 0x00002b332c86d146 llvm::MCExpr::print(llvm::raw_ostream&, llvm::MCAsmInfo const*) const + 134
4  libLLVM-3.7.so.1 0x00002b332c86d243 llvm::MCExpr::print(llvm::raw_ostream&, llvm::MCAsmInfo const*) const + 387
5  libLLVM-3.7.so.1 0x00002b332c84e356
6  libLLVM-3.7.so.1 0x00002b332c2f4927 llvm::AsmPrinter::EmitLabelPlusOffset(llvm::MCSymbol const*, unsigned long, unsigned int, bool) const + 87
7  libLLVM-3.7.so.1 0x00002b332c2fe6df llvm::AsmPrinter::emitDwarfDIE(llvm::DIE const&) const + 111
8  libLLVM-3.7.so.1 0x00002b332c2fe713 llvm::AsmPrinter::emitDwarfDIE(llvm::DIE const&) const + 163
9  libLLVM-3.7.so.1 0x00002b332c325a29 llvm::DwarfFile::emitUnits(bool) + 105
10 libLLVM-3.7.so.1 0x00002b332c323bf0 llvm::DwarfDebug::endModule() + 992
11 libLLVM-3.7.so.1 0x00002b332c2fc251 llvm::AsmPrinter::doFinalization(llvm::Module&) + 513
12 libLLVM-3.7.so.1 0x00002b332c6424b5 llvm::FPPassManager::doFinalization(llvm::Module&) + 69
13 libLLVM-3.7.so.1 0x00002b332c64c09d llvm::legacy::PassManagerImpl::run(llvm::Module&) + 797
14 llc-3.7          0x0000000000413d1f
15 llc-3.7          0x000000000040ea50 main + 384
16 libc.so.6        0x00002b332e0a8ec5 __libc_start_main + 245
17 llc-3.7          0x000000000040eaa9
Stack dump:
0.  Program arguments: llc-3.7 -split-dwarf Enable build/main.linked.bc -o build/main

2 个答案:

答案 0 :(得分:4)

(因为评论变得太长而添加作为答案)

FWIW我们现在只支持linux上的split dwarf,因为需要一个支持使用的objcopy,OS X自己做的事情,而且我们现在还没有任何Windows解决方案。 / p>

那说,对于linux:

clang -gsplit-dwarf -g foo.c -o foo.o
clang -gsplit-dwarf -g bar.c -o bar.o

将分别为foo.o(foo.dwo)和bar.o(bar.dwo)生成.dwo文件。

如果您需要整个程序的矮文件,则需要使用dwp实用程序将所有各种.dwo文件合并到一个包文件中。您需要使用clang驱动程序来执行第一部分,因为它知道如何在每个单独的文件上调用objcopy,llc没有内置的知识(尽管它会产生正确的矮化输出,它只是不会把它拆分出去。)

对于Mac OSX,您可以通过系统上的dsymutil程序执行此操作。 clang -g foo.c -o foo将生成一个.dSYM目录,其中包含整个程序的矮人。

    issola:~/tmp> ls -l a.x.dSYM/Contents/Resources/DWARF/a.x   
    -rw-r--r--  1 echristo  5001  9071 Jul 19 20:28  a.x.dSYM/Contents/Resources/DWARF/a.x

答案 1 :(得分:0)

是的,您可以使用MCJIT在运行时编译新代码并为其生成DWARF。

llc-split-dwarf标志。 Clang(-gsplit-dwarf)也是如此。