diff options
| author | Anand Shukla <ashukla@cs.uiuc.edu> | 2003-07-18 20:55:26 +0000 | 
|---|---|---|
| committer | Anand Shukla <ashukla@cs.uiuc.edu> | 2003-07-18 20:55:26 +0000 | 
| commit | 1db75a0f7c0fba6b129a32247754f55c15e3a1c8 (patch) | |
| tree | 536f846a965d7eadf2c7f16da9a2cfcccaa4bb2e | |
| parent | 26bb3c1df65661ae447d0d48d53ef1ecf05b6f1c (diff) | |
| download | bcm5719-llvm-1db75a0f7c0fba6b129a32247754f55c15e3a1c8.tar.gz bcm5719-llvm-1db75a0f7c0fba6b129a32247754f55c15e3a1c8.zip  | |
Added check for inlinable function
llvm-svn: 7206
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp | 56 | 
1 files changed, 55 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp b/llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp index 7b9810748fb..a676edcc01b 100644 --- a/llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp +++ b/llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp @@ -8,6 +8,13 @@  #include "llvm/DerivedTypes.h"  #include "llvm/Module.h"  #include "llvm/Pass.h" +#include "llvm/Support/CFG.h" + +enum Color{ +  WHITE, +  GREY, +  BLACK +};  namespace {    struct EmitFunctionTable : public Pass { @@ -17,15 +24,52 @@ namespace {    RegisterOpt<EmitFunctionTable> X("emitfuncs", "Emit a Function Table");  } +char doDFS(BasicBlock * node,std::map<BasicBlock *, Color > &color){ +  color[node] = GREY; + +  for(BasicBlock::succ_iterator vl = succ_begin(node),  +	ve = succ_end(node); vl != ve; ++vl){ +    +    BasicBlock *BB = *vl;  +     +    if(color[BB]!=GREY && color[BB]!=BLACK){ +      if(!doDFS(BB, color)){ +	return 0; +      } +    } + +    //if has backedge +    else if(color[BB]==GREY) +      return 0; + +  } + +  color[node] = BLACK; +  return 1; +} + +char hasBackEdge(Function *F){ +  std::map<BasicBlock *, Color > color; +  return doDFS(F->begin(), color); +} +  // Per Module pass for inserting function table  bool EmitFunctionTable::run(Module &M){    std::vector<const Type*> vType; +     std::vector<Constant *> vConsts; -  unsigned char counter = 0; +  std::vector<Constant *> sBCons; + +  unsigned int counter = 0;    for(Module::iterator MI = M.begin(), ME = M.end(); MI != ME; ++MI)      if (!MI->isExternal()) {        vType.push_back(MI->getType()); +     +      //std::cerr<<MI; +        vConsts.push_back(ConstantPointerRef::get(MI)); +      sBCons.push_back(ConstantInt::get(Type::SByteTy, hasBackEdge(MI))); +              counter++;      } @@ -37,6 +81,16 @@ bool EmitFunctionTable::run(Module &M){                                            cstruct, "llvmFunctionTable");    M.getGlobalList().push_back(gb); +  ConstantArray *constArray = ConstantArray::get(ArrayType::get(Type::SByteTy,  +								sBCons.size()), +						 sBCons); + +  GlobalVariable *funcArray = new GlobalVariable(constArray->getType(), true, +					      GlobalValue::ExternalLinkage, +					      constArray, "llvmSimpleFunction"); + +  M.getGlobalList().push_back(funcArray); +    ConstantInt *cnst = ConstantSInt::get(Type::IntTy, counter);     GlobalVariable *fnCount = new GlobalVariable(Type::IntTy, true,   					       GlobalValue::ExternalLinkage,   | 

