2015-01-09 11 views
6

Ich habe llvm-general-pure verwendet, um eine abstrakte Syntax Bäume für ein Programm in der LLVM language zu erstellen.Pretty print llvm-general-pure ASTs als llvm-ir?

Mit dem provided pretty printer, ich Ausgabe, die

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 = [] 
      }, 
... 

I ausgegeben werden soll, die wie

define i32 @main() { 
mainBlock: 
    %n57 = alloca i64 
    ... 
} 
... 

Es verdächtig aussieht

sieht sieht aus wie es ein automatically generated parser für die Sprache LLVM ist in der llvm General -Paket, aber kein entsprechender hübscher Drucker.

Stephen Diehl's excellent article Hinweise auf etwas namens moduleString.

Antwort

6

llvm-general-pure hat keinen reinen hübschen Drucker, wir müssen durch llvm-general gehen, um dies zu tun. Es kann das IR ausdrucken, indem es withModuleFromAST auf dem Haskell AST durchläuft, um die Moduldarstellung (d. H. Das C++ Modul) des IR zu manifestieren und dann moduleLLVMAssembly aufzurufen, um den hübschen Drucker aufzurufen.

Dies ist nicht pure Haskell, aber es ist alles durch die FFI zu LLVM interne Funktionen aufrufen.

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 

Es gibt keinen Grund, warum wir nicht einen reinen ziemlich Drucker obwohl ja ich an einem Projekt nur diese llvm-pp genannt zu tun begonnen haben könnten, aber es ist nur eine große Menge an nervtötend langweilig Arbeit ziemlich zu schreiben Drucker für die gesamte LLVM-Spezifikation.

+0

Ich kann 'moduleString' nicht finden (https://www.google.com/search?q=site%3Ahackage.haskell.org+moduleString+LLVM). Es scheint [in der Dokumentation für 3.3.8.2] (http://bscarlet.github.io/llvm-general/3.3.8.2/doc/html/llvm-general/LLVM-General-Module.html) aber gewesen zu sein es ist nicht in [3.4.4.1] (https://hackage.haskell.org/package/llvm-general-3.4.4.1/docs/LLVM-General-Module.html) (die neueste Version auf Hackage mit Dokumentation). – Cirdec

+0

Ich hätte heute Morgen meinem Bauch vertrauen sollen, als es hieß: "Schreib einen hübschen Drucker für die Teilmenge von llvm, die du benutzt, du weißt, dass du in ein paar Stunden fertig bist", aber mein Herz entgleiste mir, als es sagte: "Sie werden nicht mit einem schönen Drucker für etwas weniger als die ganze Spezifikation zufrieden sein", und so beklagte sich mein Geist in den Zeilen: "Es ist eine große Menge von sinnlos langweilig Arbeit, einen hübschen Drucker für eine ganze Spezifikation zu schreiben ". – Cirdec

+1

Sorry '' moduleString'' wurde in späteren Versionen '' moduleLLVMAssembly''. Sie tun das gleiche, dump die IR auf stdout. –

Verwandte Themen