ModuleMaker.cpp revision 66e7cd0eea6f116f3ed79acb8948c6d8db50833c
166e7cd0eea6f116f3ed79acb8948c6d8db50833cReid Spencer//===- examples/ModuleMaker/ModuleMaker.cpp - Example project ---*- C++ -*-===// 28ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner// 38ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner// This programs is a simple example that creates an LLVM module "from scratch", 48ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner// emitting it as a bytecode file to standard out. This is just to show how 58ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner// LLVM projects work and to demonstrate some of the LLVM APIs. 68ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner// 78ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner//===----------------------------------------------------------------------===// 88ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner 98ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner#include "llvm/Module.h" 108ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner#include "llvm/DerivedTypes.h" 118ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner#include "llvm/Constants.h" 128ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner#include "llvm/Instructions.h" 138ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner#include "llvm/Bytecode/Writer.h" 14321f8319dafc1374cd9512d6555b7a1a07887d94Reid Spencer#include <iostream> 158ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner 16d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm; 17d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 188ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattnerint main() { 198ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // Create the "module" or "program" or "translation unit" to hold the 208ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // function 218ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner Module *M = new Module("test"); 228ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner 238ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // Create the main function: first create the type 'int ()' 248ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner FunctionType *FT = FunctionType::get(Type::IntTy, std::vector<const Type*>(), 258ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner /*not vararg*/false); 268ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner 278ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // By passing a module as the last parameter to the Function constructor, 288ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // it automatically gets appended to the Module. 298ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner Function *F = new Function(FT, Function::ExternalLinkage, "main", M); 308ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner 318ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // Add a basic block to the function... again, it automatically inserts 328ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // because of the last argument. 338ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner BasicBlock *BB = new BasicBlock("EntryBlock", F); 348ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner 358ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // Get pointers to the constant integers... 368ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner Value *Two = ConstantSInt::get(Type::IntTy, 2); 378ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner Value *Three = ConstantSInt::get(Type::IntTy, 3); 388ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner 398ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // Create the add instruction... does not insert... 408ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner Instruction *Add = BinaryOperator::create(Instruction::Add, Two, Three, 418ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner "addresult"); 428ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner 438ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // explicitly insert it into the basic block... 448ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner BB->getInstList().push_back(Add); 458ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner 468ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // Create the return instruction and add it to the basic block 478ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner BB->getInstList().push_back(new ReturnInst(Add)); 488ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner 498ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // Output the bytecode file to stdout 508ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner WriteBytecodeToFile(M, std::cout); 518ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner 528ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // Delete the module and all of its contents. 538ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner delete M; 548ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner return 0; 558ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner} 56