漂亮的印刷llvm-general-pure ASTs作为llvm-ir?

Cir*_*dec 6 haskell llvm-ir

我使用llvm-general-pureLLVM语言中的程序构建抽象语法树.

使用提供的漂亮的打印机,我得到的输出看起来像

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 = []
          },
...
Run Code Online (Sandbox Code Playgroud)

我想要看起来像的输出

define i32 @main() {
mainBlock:
    %n57 = alloca i64
    ...
}
...
Run Code Online (Sandbox Code Playgroud)

看起来很可疑在llvm-general-quote包中有一个自动生成的LLVM语言解析器,但没有相应的漂亮打印机.

斯蒂芬迪尔的优秀文章暗示了一些被称为的东西moduleString.

Ste*_*ehl 6

llvm-general-pure没有一个纯粹漂亮的打印机,我们必须经历llvm-general这样做.它可以通过遍历withModuleFromASTHaskell AST来打印IR,以显示IR 的模块表示(即C++模块),然后调用moduleLLVMAssembly以调用漂亮的打印机.

moduleLLVMAssembly :: Mod.Module -> IO String
withModuleFromAST :: Context -> AST.Module -> (Mod.Module -> IO a) -> ErrorT String IO a
Run Code Online (Sandbox Code Playgroud)

这不是纯粹的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
Run Code Online (Sandbox Code Playgroud)

我们没有理由不能拥有一台纯粹漂亮的打印机,事实上我开始做一个名为llvm-pp的项目,但是为整个LLVM编写一台漂亮的打印机只是一大堆令人费解的麻烦工作.规格.