Mercurial > projects > ldc
diff tools/binding/llvmsample1.d @ 1273:1ba61de8796b
Committing LLVM binding for D as it currently exists in the SVN repository.
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Mon, 27 Apr 2009 22:33:17 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/binding/llvmsample1.d Mon Apr 27 22:33:17 2009 +0200 @@ -0,0 +1,47 @@ +// simple hello world sample of D LLVM +module llvmsample1; + +import llvm.llvm; + +void main() +{ + // create module + auto m = new Module("sample1"); + scope(exit) m.dispose(); + + // declare string + auto chello = ConstantArray.GetString("Hello World!\n", true); + auto hello = m.addGlobal(chello.type, "hellostring"); + hello.initializer = chello; + hello.linkage = Linkage.Internal; + hello.globalConstant = true; + + // declare printf + auto printfType = FunctionType.Get(Type.Int32, [ PointerType.Get(Type.Int8) ], true); + auto llprintf = m.addFunction(printfType, "printf"); + + // declare main + auto mainType = FunctionType.Get(Type.Int32, null); + auto llmain = m.addFunction(mainType, "main"); + + // create builder + auto b = new Builder; + scope(exit) b.dispose(); + + // create main body block + auto bb = llmain.appendBasicBlock("entry"); + b.positionAtEnd(bb); + + // call printf + auto zero = ConstantInt.GetU(Type.Int32, 0); + auto helloptr = b.buildGEP(hello, [ zero, zero ], "str"); + helloptr.dump(); + auto args = [ helloptr ]; + auto call = b.buildCall(llprintf, args, ""); + + // return 0 + b.buildRet(ConstantInt.GetS(Type.Int32, 0)); + + // write bitcode + m.writeBitcodeToFile("sample1.bc"); +}