[LLVMdev] Help needed with a pass

Rohit Jamuar rohitjamuar at hotmail.com
Mon Nov 25 22:10:15 PST 2013


I'm a newbie to LLVM and I've really been struggling to write a pass which changes the behavior of the following function:
#include<stdlib.h>#include<stdio.h>#include<string.h>void foo(char* bar){const char* path;path=getenv(<SOME_ENV_VAR>);
if (path!=NULL){strcpy(bar,path);}else{printf("env_var not set!");}}
In the pass, I hope to invoke strncpy(dest,src,n) instead of strcpy(dest,src).
After looking at the IR, this is what I've got so far:
#include <stdlib.h>#include <stdio.h>#include "llvm/Pass.h"#include "llvm/IR/Function.h"#include "llvm/Support/raw_ostream.h"#include "llvm/IR/Module.h"#include "llvm/PassManager.h"#include "llvm/Analysis/Verifier.h"#include "llvm/Assembly/PrintModulePass.h"#include "llvm/IR/IRBuilder.h" using namespace llvm;
Module* makeLLVMModule() {
   Module* mod = new Module(getGlobalContext());  
    Function* strncpy_func = cast<Function>(mod->getOrInsertFunction(new StringRef("strncpy"), Type::getInt32Ty(getGlobalContext()), Type::getInt32Ty(getGlobalContext()), Type::getInt32Ty(getGlobalContext()), NULL));  
    Function* printf_func = cast<Function>(mod->getOrInsertFunction(new StringRef("printf"), Type::getInt32Ty(getGlobalContext()), NULL));   	  
  Constant* c = mod->getOrInsertFunction(new StringRef("foo"),Type::getInt32Ty(getGlobalContext()),NULL);   
    Function* foo = cast<Function>(c);    Function::arg_iterator args =foo->arg_begin();    Value* bar = args++;      BasicBlock* Entry = BasicBlock::Create(getGlobalContext(),new Twine("Entry"), foo);    BasicBlock* False = BasicBlock::Create(getGlobalContext(),new Twine("False"), foo);    BasicBlock* True = BasicBlock::Create(getGlobalContext(),new Twine("True"), foo);       const char* pPath;    pPath = getenv("<SOME_ENV_VAR>");    Twine temp=new Twine("tmp");
    IRBuilder<> builder(Entry);    Value* envVarDoesntExist = builder.CreateICmpEQ(new StringRef(pPath),Constant::getNullValue(StringRef),temp);    builder.CreateCondBr(envVarDoesntExist, False, True);        builder.SetInsertPoint(True);    builder.CreateCall3(strncpy_func,buf,new StringRef(pPath),29,temp);
    builder.SetInsertPoint(False);    builder.CreateCall(printf_func,"Set <SOME_ENV_VAR>\n",temp);
    return mod;         	 	 	 	 	 	 	 	 	 	 	 	 	 	  }} char funcP::ID = 0;static RegisterPass<funcP> X("funcp", "funcP", false, false);

Any help would be appreciated.
Thanks,Rohit
 		 	   		  
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20131126/267137a7/attachment.html>


More information about the llvm-dev mailing list