[LLVMdev] noob IR builder question

Hal Finkel hfinkel at anl.gov
Tue Mar 10 15:33:03 PDT 2015


----- Original Message -----
> From: "Alan Nilsson" <alan.n at mac.com>
> To: "LLVM Developers Mailing List" <llvmdev at cs.uiuc.edu>
> Sent: Tuesday, March 10, 2015 5:15:23 PM
> Subject: [LLVMdev] noob IR builder question
> 
> 
> I am trying to get a handle on IR builder, at least some basics. I
> ran through a tutorial here: Create a working compiler with the LLVM
> framework, Part 1 , and it worked well enough. I have some simple
> code that creates a hello world IR. I am trying to now bring in some
> concepts from the Kaleidoscope tutorial, namely adding expressions
> the the IR that is dumped out.
> 
> 
> I’ve added the following snippets:
> 
> 
> Value *c1 = ConstantFP::get(context, APFloat(1.0));
> Value *c2 = ConstantFP::get(context, APFloat(3.0));
> builder.CreateFAdd(c1, c2, "addtmp”);

The IRBuilder has a builtin constant folder, and since you're not actually doing anything with the value returned, the constant that is created just goes away.

 -Hal

> 
> 
> expecting to see an add instruction in the dump, but nothing is
> added. This seems to be pretty strait from the kaleidoscope examples
> but I am missing something here I am sure. Here is the full program:
> 
> 
> 
> 1 using namespace llvm;
> 2
> 3 llvm::Module *module;
> 4 llvm::IRBuilder<> builder(getGlobalContext());
> 5
> 6 int main(int argc, const char * argv[]) {
> 7 llvm::LLVMContext & context = llvm::getGlobalContext();
> 8 module = new llvm::Module("calc", context);
> 9
> 10
> 11 llvm::FunctionType *funcType =
> llvm::FunctionType::get(builder.getVoidTy(), false);
> 12 llvm::Function *mainFunc =
> 13 llvm::Function::Create(funcType, llvm::Function::ExternalLinkage,
> "main", module);
> 14 llvm::BasicBlock *entry = llvm::BasicBlock::Create(context,
> "entrypoint", mainFunc);
> 15 builder.SetInsertPoint(entry);
> 16
> 17 llvm::Value *helloWorld = builder.CreateGlobalStringPtr("hello
> world!\n");
> 18
> 19 std::vector<llvm::Type *> putsArgs;
> 20 putsArgs.push_back(builder.getInt8Ty()->getPointerTo());
> 21 llvm::ArrayRef<llvm::Type*> argsRef(putsArgs);
> 22
> 23 llvm::FunctionType *putsType =
> 24 llvm::FunctionType::get(builder.getInt32Ty(), argsRef, false);
> 25 llvm::Constant *putsFunc = module->getOrInsertFunction("puts",
> putsType);
> 26
> 27 Value *a;
> 28 builder.CreateAlloca(builder.getDoubleTy(), a, "a");
> 29
> 30 Value *c1 = ConstantFP::get(context, APFloat(1.0));
> 31 Value *c2 = ConstantFP::get(context, APFloat(3.0));
> 32 builder.CreateFAdd(c1, c2, "addtmp");
> 33
> 34 builder.CreateCall(putsFunc, helloWorld);
> 35 builder.CreateRetVoid();
> 36 module->dump();
> 37 return 0;
> 38 }
> 
> 
> Produces:
> 
> 
> ; ModuleID = 'calc'
> 
> @0 = private unnamed_addr constant [14 x i8] c"hello world!\0A\00"
> 
> define void @main() {
> entrypoint:
> %a = alloca double
> %0 = call i32 @puts(i8* getelementptr inbounds ([14 x i8]* @0, i32 0,
> i32 0))
> ret void
> }
> 
> declare i32 @puts(i8*)
> 
> 
> Lines 27-32 are the code I have added beyond the demo at the
> mentioned website. As shown, the alloca shows up but no fadd
> instruction. I would appreciate if someone could help me understand
> this and point out what I am missing. Open to reading if someone can
> point me to more documentation as well.
> 
> 
> (llvm 3.5 downloaded from llvm.org on OSX)
> 
> 
> thanks
> alan
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> 

-- 
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory




More information about the llvm-dev mailing list