Generate LLVM program that returns 0 when run
parent
c0e77d22cf
commit
d42de52f78
|
@ -1,6 +1,6 @@
|
|||
# Really Bad Compiler in Haskell
|
||||
|
||||
A compiler written in Haskell which can currently perform basic arithmetic using the megaparsec and llvm-hs libraries (I do not know what language I am going to compile yet). Built for the Introduction to Compiler Design class at The University of Texas at Dallas.
|
||||
A compiler written in Haskell which can currently perform basic arithmetic. Currently using the megaparsec and llvm-hs libraries, but I plan to reimplement parsing and llvm generation myself. Built for the Introduction to Compiler Design class at The University of Texas at Dallas.
|
||||
|
||||
Main repo: https://git.sudoer.ch/me/really-bad-compiler-in-haskell
|
||||
|
||||
|
@ -42,5 +42,5 @@ Main repo: https://git.sudoer.ch/me/really-bad-compiler-in-haskell
|
|||
- Dependencies: llvm, clang
|
||||
- IDE: VSCodium
|
||||
- Git platform: Forgejo
|
||||
- AI: Phind
|
||||
- AI: Phind (GPT-4), ollama (codellama)
|
||||
- Search: Kagi, Stack Overflow
|
||||
|
|
|
@ -5,6 +5,9 @@ import qualified Objects.Expression as Expr
|
|||
import LLVM.AST
|
||||
import qualified LLVM.AST as AST
|
||||
import LLVM.AST.Global
|
||||
import LLVM.AST.Constant
|
||||
import LLVM.AST.Type
|
||||
import LLVM.AST.Name
|
||||
import LLVM.Context
|
||||
import LLVM.Module
|
||||
|
||||
|
@ -13,6 +16,21 @@ import Data.ByteString.Char8 as BS
|
|||
int :: Type
|
||||
int = IntegerType 32
|
||||
|
||||
defMain :: Definition
|
||||
defMain = GlobalDefinition functionDefaults
|
||||
{ name = Name "main"
|
||||
, parameters =
|
||||
( []
|
||||
, False )
|
||||
, returnType = int
|
||||
, basicBlocks = [body]
|
||||
}
|
||||
where
|
||||
body = BasicBlock
|
||||
(Name "entry")
|
||||
[]
|
||||
(Do $ Ret (Just (ConstantOperand (Int 32 0))) [])
|
||||
|
||||
defAdd :: Definition
|
||||
defAdd = GlobalDefinition functionDefaults
|
||||
{ name = Name "add"
|
||||
|
@ -27,7 +45,7 @@ defAdd = GlobalDefinition functionDefaults
|
|||
body = BasicBlock
|
||||
(Name "entry")
|
||||
[ Name "result" :=
|
||||
Add False -- no signed wrap
|
||||
AST.Add False -- no signed wrap
|
||||
False -- no unsigned wrap
|
||||
(LocalReference int (Name "a"))
|
||||
(LocalReference int (Name "b"))
|
||||
|
@ -38,7 +56,7 @@ defAdd = GlobalDefinition functionDefaults
|
|||
module_ :: AST.Module
|
||||
module_ = defaultModule
|
||||
{ moduleName = "basic"
|
||||
, moduleDefinitions = [defAdd]
|
||||
, moduleDefinitions = [defMain, defAdd]
|
||||
}
|
||||
|
||||
|
|
@ -19,7 +19,7 @@ ghc-options: -threaded -Wall -j8 +RTS -A64M -RTS -fllvm
|
|||
# source-dirs: src
|
||||
|
||||
executable:
|
||||
source-dirs: app
|
||||
source-dirs: main
|
||||
main: Main.hs
|
||||
# tests:
|
||||
# testall:
|
||||
|
|
|
@ -22,7 +22,7 @@ executable really-bad-compiler-in-haskell
|
|||
Parser.Expression
|
||||
Paths_really_bad_compiler_in_haskell
|
||||
hs-source-dirs:
|
||||
app
|
||||
main
|
||||
default-extensions:
|
||||
OverloadedStrings, LambdaCase
|
||||
ghc-options: -threaded -Wall -j8 +RTS -A64M -RTS -fllvm
|
||||
|
|
Reference in New Issue