[llvm-commits] CVS: llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp

Anand Shukla ashukla at cs.uiuc.edu
Fri Jul 18 15:56:01 PDT 2003


Changes in directory llvm/lib/Transforms/Instrumentation:

EmitFunctions.cpp updated: 1.9 -> 1.10

---
Log message:

Added check for inlinable function

---
Diffs of the changes:

Index: llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp
diff -u llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp:1.9 llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp:1.10
--- llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp:1.9	Wed Jun  4 15:08:47 2003
+++ llvm/lib/Transforms/Instrumentation/EmitFunctions.cpp	Fri Jul 18 15:55:26 2003
@@ -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 @@
   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++;
     }
   
@@ -36,6 +80,16 @@
                                           GlobalValue::ExternalLinkage, 
                                           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, 





More information about the llvm-commits mailing list