1*5b81eea7SReid Spencer //===- ModuleMaker.cpp - Example project which creates modules --*- C++ -*-===//
2*5b81eea7SReid Spencer //
3*5b81eea7SReid Spencer // This programs is a simple example that creates an LLVM module "from scratch",
4*5b81eea7SReid Spencer // emitting it as a bytecode file to standard out.  This is just to show how
5*5b81eea7SReid Spencer // LLVM projects work and to demonstrate some of the LLVM APIs.
6*5b81eea7SReid Spencer //
7*5b81eea7SReid Spencer //===----------------------------------------------------------------------===//
8*5b81eea7SReid Spencer 
9*5b81eea7SReid Spencer #include "llvm/Module.h"
10*5b81eea7SReid Spencer #include "llvm/DerivedTypes.h"
11*5b81eea7SReid Spencer #include "llvm/Constants.h"
12*5b81eea7SReid Spencer #include "llvm/Instructions.h"
13*5b81eea7SReid Spencer #include "llvm/Bytecode/Writer.h"
14*5b81eea7SReid Spencer #include <iostream>
15*5b81eea7SReid Spencer 
16*5b81eea7SReid Spencer using namespace llvm;
17*5b81eea7SReid Spencer 
18*5b81eea7SReid Spencer int main() {
19*5b81eea7SReid Spencer   // Create the "module" or "program" or "translation unit" to hold the
20*5b81eea7SReid Spencer   // function
21*5b81eea7SReid Spencer   Module *M = new Module("test");
22*5b81eea7SReid Spencer 
23*5b81eea7SReid Spencer   // Create the main function: first create the type 'int ()'
24*5b81eea7SReid Spencer   FunctionType *FT = FunctionType::get(Type::IntTy, std::vector<const Type*>(),
25*5b81eea7SReid Spencer                                        /*not vararg*/false);
26*5b81eea7SReid Spencer 
27*5b81eea7SReid Spencer   // By passing a module as the last parameter to the Function constructor,
28*5b81eea7SReid Spencer   // it automatically gets appended to the Module.
29*5b81eea7SReid Spencer   Function *F = new Function(FT, Function::ExternalLinkage, "main", M);
30*5b81eea7SReid Spencer 
31*5b81eea7SReid Spencer   // Add a basic block to the function... again, it automatically inserts
32*5b81eea7SReid Spencer   // because of the last argument.
33*5b81eea7SReid Spencer   BasicBlock *BB = new BasicBlock("EntryBlock", F);
34*5b81eea7SReid Spencer 
35*5b81eea7SReid Spencer   // Get pointers to the constant integers...
36*5b81eea7SReid Spencer   Value *Two = ConstantSInt::get(Type::IntTy, 2);
37*5b81eea7SReid Spencer   Value *Three = ConstantSInt::get(Type::IntTy, 3);
38*5b81eea7SReid Spencer 
39*5b81eea7SReid Spencer   // Create the add instruction... does not insert...
40*5b81eea7SReid Spencer   Instruction *Add = BinaryOperator::create(Instruction::Add, Two, Three,
41*5b81eea7SReid Spencer                                             "addresult");
42*5b81eea7SReid Spencer 
43*5b81eea7SReid Spencer   // explicitly insert it into the basic block...
44*5b81eea7SReid Spencer   BB->getInstList().push_back(Add);
45*5b81eea7SReid Spencer 
46*5b81eea7SReid Spencer   // Create the return instruction and add it to the basic block
47*5b81eea7SReid Spencer   BB->getInstList().push_back(new ReturnInst(Add));
48*5b81eea7SReid Spencer 
49*5b81eea7SReid Spencer   // Output the bytecode file to stdout
50*5b81eea7SReid Spencer   WriteBytecodeToFile(M, std::cout);
51*5b81eea7SReid Spencer 
52*5b81eea7SReid Spencer   // Delete the module and all of its contents.
53*5b81eea7SReid Spencer   delete M;
54*5b81eea7SReid Spencer   return 0;
55*5b81eea7SReid Spencer }
56