在程序上使用llvm传递时,错误:无法执行命令:分段错误(核心已转储)

时间:2018-10-18 16:23:37

标签: compiler-errors clang llvm clang++ llvm-clang

一个简单的LLVM传递示例,用于LLVM-7.0.0。 尝试运行时出现此错误:

  

clang -I〜/ clang_llvm2 / include -Xclang -load -Xclang build / skeleton / libSkeletonPass。* test / a.cpp

我看到了一个叫做main的函数!

...

clang-7:错误:无法执行命令:分段错误(核心已转储) clang-7:错误:clang前端命令由于信号失败(使用-v查看调用) clang版本7.0.0(标签/ RELEASE_700 / final) 目标:x86_64-unknown-linux-gnu 螺纹型号:posix clang-7:注意:诊断消息:请向https://bugs.llvm.org/提交错误报告,并包括崩溃回溯,预处理的源代码和关联的运行脚本。 clang-7:错误:无法执行命令:分段错误(核心已转储) clang-7:注意:诊断消息:生成预处理源时出错。

用于LLVM-7.0.0的简单LLVM传递

#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/IR/LegacyPassManager.h"
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
using namespace llvm;

namespace {
  struct SkeletonPass : public FunctionPass {
    static char ID;
    SkeletonPass() : FunctionPass(ID) {}

    bool runOnFunction(Function &F) {
      errs() << "I saw a function called " << F.getName() << "!\n";
      return false;
    }
  };
}

char SkeletonPass::ID = 0;

// Automatically enable the pass.
// http://adriansampson.net/blog/clangpass.html
static void registerSkeletonPass(const PassManagerBuilder &,
                         legacy::PassManagerBase &PM) {
  PM.add(new SkeletonPass());
}
static RegisterStandardPasses
  RegisterMyPass(PassManagerBuilder::EP_EarlyAsPossible,
                 registerSkeletonPass);

a.cpp程序是一个简单的hello world程序。 LLVM_HOME设置正确。 使用预构建的llvm文件。

2 个答案:

答案 0 :(得分:0)

并非只有一个错误(https://bugs.llvm.org/show_bug.cgi?id=34573),从LLVM 5开始使用RegisterStandardPasses时LLVM似乎在程序末尾崩溃。

根据以下答案:https://github.com/sampsyo/llvm-pass-skeleton/issues/7#issuecomment-401834287,一种解决方案是在链接程序时将-Wl,-znodelete添加到编译器标志中。它对我有用。

答案 1 :(得分:0)

如果要开发源内传递(在LLVM源树内),则必须从源编译LLVM。在开发源外传递的情况下,它也很方便,因为它使您可以完全控制编译选项。例如,与经过优化的版本相比, LLVM的调试版本更易于使用llvm-pass-tutorial

我刚遇到类似的问题。似乎优化的clang构建(从apt installpre-built binaries获得的clang构建)不支持源内传递。我目前知道的唯一选择是从源代码构建llvm和clang。

LLVM Download Page