ModuleMaker.cpp revision 051a950000e21935165db56695e35bade668193b
166e7cd0eea6f116f3ed79acb8948c6d8db50833cReid Spencer//===- examples/ModuleMaker/ModuleMaker.cpp - Example project ---*- C++ -*-===//
2237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman//
37db7fa0828bc4ac375032a847b3fd530cef131e2Chris Lattner//                     The LLVM Compiler Infrastructure
47db7fa0828bc4ac375032a847b3fd530cef131e2Chris Lattner//
5fc001bbfc360ab828e5a4b0cbe4bb7db87361b85Chris Lattner// This file is distributed under the University of Illinois Open Source
6fc001bbfc360ab828e5a4b0cbe4bb7db87361b85Chris Lattner// License. See LICENSE.TXT for details.
7237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman//
87db7fa0828bc4ac375032a847b3fd530cef131e2Chris Lattner//===----------------------------------------------------------------------===//
98ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner//
108ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner// This programs is a simple example that creates an LLVM module "from scratch",
11a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif// emitting it as a bitcode file to standard out.  This is just to show how
128ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner// LLVM projects work and to demonstrate some of the LLVM APIs.
138ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner//
148ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner//===----------------------------------------------------------------------===//
158ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner
168ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner#include "llvm/Module.h"
178ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner#include "llvm/DerivedTypes.h"
188ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner#include "llvm/Constants.h"
198ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner#include "llvm/Instructions.h"
204bcca0f2ac85c918fc8617e34b7642e5e5233460Chris Lattner#include "llvm/Bitcode/ReaderWriter.h"
214bcca0f2ac85c918fc8617e34b7642e5e5233460Chris Lattner#include <iostream>
22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm;
23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
248ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattnerint main() {
258ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner  // Create the "module" or "program" or "translation unit" to hold the
268ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner  // function
278ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner  Module *M = new Module("test");
28237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman
298ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner  // Create the main function: first create the type 'int ()'
30db8d2bed6a0ef890b81fabb014bfcb678e891695Reid Spencer  FunctionType *FT = FunctionType::get(Type::Int32Ty, std::vector<const Type*>(),
318ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner                                       /*not vararg*/false);
32237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman
338ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner  // By passing a module as the last parameter to the Function constructor,
348ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner  // it automatically gets appended to the Module.
35051a950000e21935165db56695e35bade668193bGabor Greif  Function *F = Function::Create(FT, Function::ExternalLinkage, "main", M);
36237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman
378ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner  // Add a basic block to the function... again, it automatically inserts
388ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner  // because of the last argument.
39051a950000e21935165db56695e35bade668193bGabor Greif  BasicBlock *BB = BasicBlock::Create("EntryBlock", F);
40237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman
418ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner  // Get pointers to the constant integers...
42db8d2bed6a0ef890b81fabb014bfcb678e891695Reid Spencer  Value *Two = ConstantInt::get(Type::Int32Ty, 2);
43db8d2bed6a0ef890b81fabb014bfcb678e891695Reid Spencer  Value *Three = ConstantInt::get(Type::Int32Ty, 3);
44237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman
458ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner  // Create the add instruction... does not insert...
468ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner  Instruction *Add = BinaryOperator::create(Instruction::Add, Two, Three,
478ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner                                            "addresult");
48237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman
498ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner  // explicitly insert it into the basic block...
508ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner  BB->getInstList().push_back(Add);
51237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman
528ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner  // Create the return instruction and add it to the basic block
53051a950000e21935165db56695e35bade668193bGabor Greif  BB->getInstList().push_back(ReturnInst::Create(Add));
54237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman
55a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif  // Output the bitcode file to stdout
564bcca0f2ac85c918fc8617e34b7642e5e5233460Chris Lattner  WriteBitcodeToFile(M, std::cout);
57237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman
588ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner  // Delete the module and all of its contents.
598ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner  delete M;
608ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner  return 0;
618ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner}
62