c++ - LLVM 运行 PassManager(非遗留)

标签 c++ llvm llvm-ir llvm-c++-api

如何运行非旧版 PassManager?我尝试执行以下操作,但在尝试使运行函数中的分析管理器无效时抛出一些异常。我还应该为初始化做些什么吗?

llvm::AnalysisManager<Module> mm;
PassBuilder builder;
auto pm = builder.buildModuleOptimizationPipeline(PassBuilder::OptimizationLevel::O3);
pm.run(module, mm );

最佳答案

这些片段说明了如何运行和设置以在一些 .c/.cpp 文件上运行现代自定义函数和模块传递...用一个 makefile 完成。这适用于最近(2018 年 3 月)的 LLVM 6。它不使用旧版通行证管理器。 Hello World .cpp:

#include <llvm/Pass.h>
#include <llvm/IR/Function.h>
#include <llvm/IR/Module.h>
#include <llvm/Support/raw_ostream.h>

namespace {

  struct Hello : public llvm::FunctionPass {
    static char ID;
    Hello() : llvm::FunctionPass{ID} {}

    bool runOnFunction(llvm::Function &F) override {
      llvm::errs() << "Hello ";
      llvm::errs().write_escaped(F.getName()) << "\n";
      return false;
    }
  };

  struct Hello2 : public llvm::ModulePass {
    static char ID;

    Hello2() : llvm::ModulePass{ID} {}

    bool runOnModule(llvm::Module &M) override {
      llvm::errs() << "Name of the module ", llvm::errs().write_escaped(M.getName()) << "\n";
      for(auto iter = M.getFunctionList().begin(); iter != M.getFunctionList().end(); ++iter) {
    llvm::errs() << "Function name:" << iter->getName() << "\n";
      }
      return false;
    }
  };
}

char Hello::ID = 0;
static llvm::RegisterPass<Hello> X("Hello", 
                   "Hello World Pass",
                   false,   
                   false
                   );

char Hello2::ID = 1;
static llvm::RegisterPass<Hello2> Y("Hello2", 
                    "Hello World2 pass",
                    false,  
                    false
);

对应的makefile:

LLVM_VERSION=
LLVM_INCLUDEDIR = `llvm-config-6.0 --includedir`
LLVM_FLAGS = `llvm-config-6.0 --cxxflags --ldflags --system-libs --libs all`
CXX = clang++-6.0
CXXFLAGS = -g -std=c++11 -O3 -I $(LLVM_INCLUDEDIR) -I $(LLVM_INCLUDEDIR)
Hello.so:
    $(CXX) -fPIC $(CXXFLAGS) HelloWorld.cpp $(LLVM_FLAGS) -shared -o Hello.so
Hello: Hello.so

testfile:
    clang++-6.0 -emit-llvm -c test.cpp -o test.bc

runFunctionPassOnTestFile: Hello testfile
    opt-6.0 -load ./Hello.so -Hello < test.bc > /dev/null

runModulePassOnTestfile: Hello testfile
    opt-6.0 -load ./Hello.so -Hello2 < test.bc > /dev/null

clean:
    rm *.o *.so *.out *~
DBG:
@echo LLVM INCLUDE DIRS $(LLVM_INCLUDEDIR) $(test)

用于测试所有内容的简单文件,test.cpp:

#include <stdio.h>
#include <stdlib.h>

int a = 4;

int c = 5;

int d = 6;

int e = 7;

int bar() { int *a = (int*) malloc(4); e = 1; return 1;}

int foo() { return 2; }

int barfoo() { return 3; }

int main() {
  printf("Testing testing\n");
  return 0;
}

关于c++ - LLVM 运行 PassManager(非遗留),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45410799/

相关文章:

java - 在施工时双重优先于 float

c++ - 链接时 LLVM IR 类型被错误折叠(C++ API)

c++ - 如何为 llvm IR 调用指令创建结构参数?

compiler-construction - 最佳编译器目的地

ARM 的 Clang 交叉编译

llvm - 是否可以在没有 clang 的情况下将 LLIR 编译为二进制文件?

c++ - 如何在 C++ 中进行内联汇编 (Visual Studio 2010)

c++ - C++ 程序的 sleep 或时间延迟

c++ - 将字符串转换为标准文件系统路径

c++ - 在 LLVM 中获取非常量操作数