1e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//===- examples/ModuleMaker/ModuleMaker.cpp - Example project ---*- C++ -*-===// 2e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// 3e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// The LLVM Compiler Infrastructure 4e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// 5e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// This file is distributed under the University of Illinois Open Source 6e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// License. See LICENSE.TXT for details. 7e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// 8e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//===----------------------------------------------------------------------===// 9e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// 10e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// This programs is a simple example that creates an LLVM module "from scratch", 11e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// emitting it as a bitcode file to standard out. This is just to show how 12e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// LLVM projects work and to demonstrate some of the LLVM APIs. 13e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao// 14e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao//===----------------------------------------------------------------------===// 15e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 16e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "llvm/LLVMContext.h" 17e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "llvm/Module.h" 18e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "llvm/DerivedTypes.h" 19e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "llvm/Constants.h" 20e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "llvm/Instructions.h" 21e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "llvm/Bitcode/ReaderWriter.h" 22e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao#include "llvm/Support/raw_ostream.h" 23e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaousing namespace llvm; 24e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 25e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liaoint main() { 26e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao LLVMContext Context; 27e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 28e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // Create the "module" or "program" or "translation unit" to hold the 29e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // function 30e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao Module *M = new Module("test", Context); 31e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 32e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // Create the main function: first create the type 'int ()' 33e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao FunctionType *FT = 34e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao FunctionType::get(Type::getInt32Ty(Context), /*not vararg*/false); 35e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 36e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // By passing a module as the last parameter to the Function constructor, 37e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // it automatically gets appended to the Module. 38e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao Function *F = Function::Create(FT, Function::ExternalLinkage, "main", M); 39e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 40e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // Add a basic block to the function... again, it automatically inserts 41e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // because of the last argument. 42e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao BasicBlock *BB = BasicBlock::Create(Context, "EntryBlock", F); 43e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 44e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // Get pointers to the constant integers... 45e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao Value *Two = ConstantInt::get(Type::getInt32Ty(Context), 2); 46e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao Value *Three = ConstantInt::get(Type::getInt32Ty(Context), 3); 47e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 48e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // Create the add instruction... does not insert... 49e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao Instruction *Add = BinaryOperator::Create(Instruction::Add, Two, Three, 50e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao "addresult"); 51e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 52e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // explicitly insert it into the basic block... 53e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao BB->getInstList().push_back(Add); 54e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 55e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // Create the return instruction and add it to the basic block 56e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao BB->getInstList().push_back(ReturnInst::Create(Context, Add)); 57e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 58e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // Output the bitcode file to stdout 59e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao WriteBitcodeToFile(M, outs()); 60e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao 61e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao // Delete the module and all of its contents. 62e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao delete M; 63e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao return 0; 64e264f62ca09a8f65c87a46d562a4d0f9ec5d457Shih-wei Liao} 65