llvm 学习笔记 2 : 添加 Pass 与调试

来源:互联网 发布:win10最详细优化设置 编辑:程序博客网 时间:2024/06/04 01:08

在BackendUtil.cpp 的 void EmitAssemblyHelper::EmitAssembly 函数中, if (PerFunctionPasses)  条件后 new 了自带的 Hello pass. 重新 make 时发生以下错误

make[4]: Entering directory '/home/nightwish/code/GIT/llvm/release/tools/clang/tools/driver'llvm[4]: Linking Release+Asserts executable clang (without symbols)/home/nightwish/code/GIT/llvm/release/Release+Asserts/lib/libclangCodeGen.a(BackendUtil.o): In function `clang::EmitBackendOutput(clang::DiagnosticsEngine&, clang::CodeGenOptions const&, clang::TargetOptions const&, clang::LangOptions const&, llvm::Module*, clang::BackendAction, llvm::raw_ostream*)':BackendUtil.cpp:(.text+0x1318): undefined reference to `Hello::Hello()'collect2: error: ld returned 1 exit status

请教高博之后学长告诉我这是linking时错误,编译是通过了的.问题发生在静态链接时没有这个hello符号.动态链接会生成 .so , 而静态链接生成的是 .a ( a 是什么的缩写?)

错误发生在

llvm/release/tools/clang/tools/driver
切换到 llvm/tools/clang/tools/driver, 查看 Makefile, 发现有跟链接相关的这行

LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser bitreader bitwriter codegen \                   instrumentation ipo irreader linker selectiondag option

以 selectiondag  为线索, 在 llvm 根目录下查找 

grep "selectiondag" -RI .

发现一些结果,主要是在 LibraryDependencies.inc 中,如下:

./release/tools/llvm-config/LibraryDependencies.inc:  { "aarch64codegen", "libLLVMAArch64CodeGen.a", 1, { "aarch64asmprinter", "aarch64desc", "aarch64info", "asmprinter", "codegen", "core", "mc", "selectiondag", "support", "target" } },
所以查看该文件,发现是自动生成的文件,有一个 AvailableComponents 的数组, 描述的是 Makefile 中 components 和 生成的 .a 文件的对应关系.

所以,做如下修改

LINK_COMPONENTS := $(TARGETS_TO_BUILD) hello asmparser bitreader bitwriter codegen \                   instrumentation ipo irreader linker selectiondag option
同时在 AvailableComponents 中加入新的一项, 并修改数组大小。在我后来又添加一个与Hello平行的目录的Pass,发现这个数组component的名称,也就是'hello'这项,必须是全小写,否则有误。高博推测makefile会把所有名称转成小写。

  { "gtest_main", "libgtest_main.a", 0, { "gtest" } },  { "hello", "LLVMHello.a", 1, {}},                          //added  { "hexagon", 0, 1, { "hexagoninfo", "hexagondesc", "hexagonasmprinter", "hexagoncodegen" } },

重新make则成功. 在  Release+Asserts/lib 目录下生成了新的 LLVMHello.a , 同时防止 LibraryDependencies.inc 被重新生成抹去, 备份好.

体会:

高博讲,做科研是要靠猜着学,比如发现链接错误,就去找与链接相关的makefile, 不断的推理找到答案.代码就是最好的文档,看到link_...就自然明白这是链接相关的.学东西不要指望有个教程从头到尾学,要猜中学.收益匪浅,感谢高博.

0 0
原创粉丝点击