при использовании прохода llvm в программе ошибка: невозможно выполнить команду: ошибка сегментации (ядро сброшено) - PullRequest
0 голосов
/ 18 октября 2018

Простой пример прохождения 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 (tags / RELEASE_700 / final) Цель: x86_64-unknown-linux-gnu Модель потока: posix clang-7: примечание: диагностическое сообщение msg: ПОЖАЛУЙСТА, отправьтеотчет об ошибках https://bugs.llvm.org/ и включает в себя обратную трассировку сбоя, предварительно обработанный источник и связанный скрипт запуска.clang-7: ошибка: невозможно выполнить команду: ошибка сегментации (сброшено ядро) clang-7: примечание: диагностическое сообщение: ошибка создания предварительно обработанных источников.

Простой проход LLVM для LLVM-7.0.0

#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.

1 Ответ

0 голосов
/ 29 мая 2019

Вы не одиноки с этой ошибкой (https://bugs.llvm.org/show_bug.cgi?id=34573), Кажется, что LLVM падает в конце программы, когда RegisterStandardPasses используется с LLVM 5.

Согласно этому ответу: https://github.com/sampsyo/llvm-pass-skeleton/issues/7#issuecomment-401834287 решение состоит в том, чтобы добавить -Wl,-znodelete к флагам компилятора, когда вы связываете свою программу. Это сработало для меня.

...