[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