Haskell 漂亮的打印llvm通用纯AST作为llvm ir?

Haskell 漂亮的打印llvm通用纯AST作为llvm ir?,haskell,llvm-ir,Haskell,Llvm Ir,我曾在中为程序构建抽象语法树 使用,我得到如下输出 A.Module { A.moduleName = "main", A.moduleDataLayout = Nothing, A.moduleTargetTriple = Nothing, A.moduleDefinitions = [ ... A.GlobalDefinition A.G.Function { A.G.linkage = A.L.External, A.G.visibi

我曾在中为程序构建抽象语法树

使用,我得到如下输出

A.Module {
  A.moduleName = "main",
  A.moduleDataLayout = Nothing,
  A.moduleTargetTriple = Nothing,
  A.moduleDefinitions = [
    ...
    A.GlobalDefinition A.G.Function {
      A.G.linkage = A.L.External,
      A.G.visibility = A.V.Default,
      A.G.callingConvention = A.CC.C,
      A.G.returnAttributes = [],
      A.G.returnType = A.IntegerType {A.typeBits = 32},
      A.G.name = A.Name "Main",
      A.G.parameters = ([], False),
      A.G.functionAttributes = [],
      A.G.section = Nothing,
      A.G.alignment = 0,
      A.G.garbageCollectorName = Nothing,
      A.G.basicBlocks = [
        A.G.BasicBlock (A.Name "mainBlock") [
          A.Name "n57" A.:= A.Alloca {
            A.allocatedType = A.IntegerType {A.typeBits = 64},
            A.numElements = Nothing,
            A.alignment = 0,
            A.metadata = []
          },
...
define i32 @main() {
mainBlock:
    %n57 = alloca i64
    ...
}
...
我希望输出看起来像

A.Module {
  A.moduleName = "main",
  A.moduleDataLayout = Nothing,
  A.moduleTargetTriple = Nothing,
  A.moduleDefinitions = [
    ...
    A.GlobalDefinition A.G.Function {
      A.G.linkage = A.L.External,
      A.G.visibility = A.V.Default,
      A.G.callingConvention = A.CC.C,
      A.G.returnAttributes = [],
      A.G.returnType = A.IntegerType {A.typeBits = 32},
      A.G.name = A.Name "Main",
      A.G.parameters = ([], False),
      A.G.functionAttributes = [],
      A.G.section = Nothing,
      A.G.alignment = 0,
      A.G.garbageCollectorName = Nothing,
      A.G.basicBlocks = [
        A.G.BasicBlock (A.Name "mainBlock") [
          A.Name "n57" A.:= A.Alloca {
            A.allocatedType = A.IntegerType {A.typeBits = 64},
            A.numElements = Nothing,
            A.alignment = 0,
            A.metadata = []
          },
...
define i32 @main() {
mainBlock:
    %n57 = alloca i64
    ...
}
...
看起来很可疑,LLVM通用报价包中有一个LLVM语言的名称,但没有相应的漂亮打印机


提示称为
moduleString
llvm-general-pure
的东西没有纯漂亮的打印机,我们必须通过
llvm-general
才能做到这一点。它可以通过在Haskell AST上通过模块Navest[/Cuff]通过<代码>打印IR,以显示IR的模块表示(即C++模块),然后调用<代码>模块化组件/<代码>调用漂亮的打印机。p>
moduleLLVMAssembly :: Mod.Module -> IO String
withModuleFromAST :: Context -> AST.Module -> (Mod.Module -> IO a) -> ErrorT String IO a
这不是纯粹的Haskell,而是通过FFI调用LLVM的内部函数

import LLVM.General.Module as Mod
import qualified LLVM.General.AST as AST

ppModule :: AST.Module -> IO ()
ppModule ast = withContext $ \ctx ->
  runExceptT $ withModuleFromAST ctx ast $ \m -> do
    llstr <- moduleLLVMAssembly m
    putStrLn llstr
将LLVM.General.Module作为Mod导入
将符合条件的LLVM.General.AST导入为AST
ppModule::AST.Module->IO()
ppModule ast=withContext$\ctx->
使用ModuleFromast ctx ast$\m->do运行EXCEPTT$

llstr我找不到
moduleString
。它似乎是,但它不在(最新版本的黑客文档)。今天早上,当它说“为你正在使用的llvm的子集编写一个漂亮的打印机,你知道你会在几个小时内完成”时,我应该相信我的直觉,但当它说,“你不会对一台漂亮的打印机感到满意,因为它不符合整个规格”,所以我的脑海里一直在抱怨,“为整个规格编写一台漂亮的打印机是一件令人麻木的枯燥工作。”“.Sorry
moduleString
在更高版本中变成了
moduleLLVMAssembly
。他们做同样的事情,将IR转储到标准输出。@Cirdec至于纯漂亮的打印机,这将是非常好的(尤其是将llvm general导入GHC主线),但是,是的,这是一大堆吃力不讨好的枯燥工作。我添加了足够多的llvm pp解析器来完成我需要的工作。