【问题标题】:Running LLVM passes on Windows 10 gives no output in terminal?在 Windows 10 上运行 LLVM 传递在终端中没有输出?
【发布时间】:2017-01-30 18:51:10
【问题描述】:

我有来自 LLVM.org 的示例密码:

#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 */);

项目构建良好并创建了 SkeletonPass.dll。

当我执行命令时:

C:\Users\nlykkei\Projects\llvm-pass-tutorial\build>opt -load skeleton\Debug\SkeletonPass.dll -hello foo.bc
opt: Unknown command line argument '-hello'.  Try: 'opt -help'
opt: Did you mean '-help'?

opt 无法识别-hello 选项,即使这样在 Ubuntu 16.04 上一切正常。

另外,如果我执行:

clang -Xclang -load -Xclang skeleton\Debug\SkeletonPass.dll foo.bc

Visual Studio 终端(本机工具命令提示符 x86)上没有打印任何内容。在 Linux 上,可以很好地为同一个位码文件打印函数名称。

我的经历可能是什么原因?我在 Windows 10 上执行的操作与在 Ubuntu 上执行的操作完全相同,但结果却大不相同。

【问题讨论】:

    标签: linux windows clang llvm


    【解决方案1】:

    插件是 Windows 上的特殊野兽,因为后者不支持正确的动态链接,因此,您的通行证根本不会在 PassRegistry 中注册自己。因此,您要么需要将所有 LLVM 编译成 .dll,要么将您的通行证静态链接到 opt / clang。

    【讨论】:

    • 正确的动态链接是什么意思?我如何将所有 LLVM 编译成 .dll?
    • 在 windows 上,将符号从 .exe 导入到加载的 .dll 中有点不简单,而这是在 Linux / MacOS / FreeBSD 上的普通操作。插件基础设施依赖于此进行正确的插件注册。
    • 如何将“所有 LLVM”编译成 .dll?
    猜你喜欢
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 2018-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多