aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/Transforms/Instrumentation/EmitFunctions.cpp56
1 files changed, 55 insertions, 1 deletions
diff --git a/lib/Transforms/Instrumentation/EmitFunctions.cpp b/lib/Transforms/Instrumentation/EmitFunctions.cpp
index 7b98107..a676edc 100644
--- a/lib/Transforms/Instrumentation/EmitFunctions.cpp
+++ b/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,