mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-11 00:39:36 +00:00
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:
parent
d461505efd
commit
a235e14eaf
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user