Added check for inlinable function

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7206 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anand Shukla 2003-07-18 20:55:26 +00:00
parent d461505efd
commit a235e14eaf

View File

@ -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,