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>