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 164ca7e09b7c1e41535f2a1bd86915375d023daf27Chandler Carruth#include "llvm/Bitcode/ReaderWriter.h" 170a08460599eed603e469e3e16d0cf6aa33b8ba93Chandler Carruth#include "llvm/IR/Constants.h" 180a08460599eed603e469e3e16d0cf6aa33b8ba93Chandler Carruth#include "llvm/IR/DerivedTypes.h" 190a08460599eed603e469e3e16d0cf6aa33b8ba93Chandler Carruth#include "llvm/IR/Instructions.h" 200a08460599eed603e469e3e16d0cf6aa33b8ba93Chandler Carruth#include "llvm/IR/LLVMContext.h" 210a08460599eed603e469e3e16d0cf6aa33b8ba93Chandler Carruth#include "llvm/IR/Module.h" 22b515d75856f58a8b3b71d782eb00916d686329adChris Lattner#include "llvm/Support/raw_ostream.h" 23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeusing namespace llvm; 24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 258ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattnerint main() { 268b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson LLVMContext Context; 278b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson 288ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // Create the "module" or "program" or "translation unit" to hold the 298ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // function 3031895e73591d3c9ceae731a1274c8f56194b9616Owen Anderson Module *M = new Module("test", Context); 31237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman 328ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // Create the main function: first create the type 'int ()' 339adc0abad3c3ed40a268ccbcee0c74cb9e1359feOwen Anderson FunctionType *FT = 341d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson FunctionType::get(Type::getInt32Ty(Context), /*not vararg*/false); 35237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman 368ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // By passing a module as the last parameter to the Function constructor, 378ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // it automatically gets appended to the Module. 38051a950000e21935165db56695e35bade668193bGabor Greif Function *F = Function::Create(FT, Function::ExternalLinkage, "main", M); 39237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman 408ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // Add a basic block to the function... again, it automatically inserts 418ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // because of the last argument. 421d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson BasicBlock *BB = BasicBlock::Create(Context, "EntryBlock", F); 43237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman 448ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // Get pointers to the constant integers... 451d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson Value *Two = ConstantInt::get(Type::getInt32Ty(Context), 2); 461d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson Value *Three = ConstantInt::get(Type::getInt32Ty(Context), 3); 47237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman 488ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // Create the add instruction... does not insert... 497cbd8a3e92221437048b484d5ef9c0a22d0f8c58Gabor Greif Instruction *Add = BinaryOperator::Create(Instruction::Add, Two, Three, 508ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner "addresult"); 51237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman 528ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // explicitly insert it into the basic block... 538ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner BB->getInstList().push_back(Add); 54237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman 558ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // Create the return instruction and add it to the basic block 561d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson BB->getInstList().push_back(ReturnInst::Create(Context, Add)); 57237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman 58a99be51bf5cdac1438069d4b01766c47704961c8Gabor Greif // Output the bitcode file to stdout 59b515d75856f58a8b3b71d782eb00916d686329adChris Lattner WriteBitcodeToFile(M, outs()); 60237cef4b0b94b17ca065efad484f386f42579b61Misha Brukman 618ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner // Delete the module and all of its contents. 628ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner delete M; 638ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner return 0; 648ca0eebe4ef4fe810dba5ce91306031272f139cfChris Lattner} 65