看到标题是 LLVM 差点哭出来
因为台湾真的在做 compiler 的人用手指就数得完
※ 引述《flypaper (一直飞)》之铭言:
: 开发平台(Platform): (Ex: Win10, Linux, ...)
: Ubuntu
: 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
: clang
: 额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
: llvm
: 问题(Question):
: 我在看llvm的附带文件:
: http://llvm.org/docs/WritingAnLLVMPass.html#running-a-pass-with-opt
懒人包:这个教学过时非常非常非常久了
LLVM 现在有一个新的 PassManager 而且在 7.0 之后默认使用
而新的 Pass 的写法和使用方法蛮不一样的
我有写一系列的文章大致讲解怎么写/使用新的 Pass:
Part1:
https://medium.com/@mshockwave/writing-llvm-pass-in-2018-part-i-531c700e85eb
Part2:
https://medium.com/@mshockwave/writing-llvm-pass-in-2018-part-ii-640f680978ec
当然旧的 Pass 目前还是可以用 但是嘛...现在都默认使用新的了 不学一下吗
: 里面有段 Hello.cpp
: 然后我发现 clang++ Hello.cpp是无法成功编译档案的
: (错误讯息有点多 所以我就不加上了
: 我也试着编译 关于llvm/lib/Transform里面 也是无法成功
: 程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
: p.s我付的网址里面有这段code
: #include "llvm/Pass.h"
: #include "llvm/IR/Function.h"
: #include "llvm/Support/raw_ostream.h"
: using namespace llvm;
: namespace {
: struct Hello : public FunctionPass {
: static char ID;
: Hello() : FunctionPass(ID) {}
: bool runOnFunction(Function &F) override {
: errs() << "Hello: ";
: errs().write_escaped(F.getName()) << '\n';
: return false;
: }
: }; // end of struct Hello
: } // end of anonymous namespace
: char Hello::ID = 0;
: static RegisterPass<Hello> X("hello", "Hello World Pass",
: false /* Only looks at CFG */,
: false /* Analysis Pass */);
我还有写一个小工具 是可以帮你生成一个简单的 LLVM Pass 专案:
https://github.com/mshockwave/generator-llvm
因为...恩 每次都要打一堆 public FunctionPass 之类的很麻烦XDD
使用方法就如 README 所示
另外我有看到下面推文谈到使用 llvm-config + make
恩...我个人是比较推荐用 cmake,因为 LLVM 已经提供一堆方便的
cmake function/macro,例如 add_llvm_loadable_module
比起 gcc pass.cpp `llvm-config