const int INVALID_FRAME_OFFSET = INT_MAX; // std::numeric_limits<int>::max();
-static AnnotationID MCFM_AID(
+static AnnotationID MF_AID(
AnnotationManager::getID("CodeGen::MachineCodeForFunction"));
}
bool runOnFunction(Function &F) {
- MachineFunction::construct(&F, Target);
+ MachineFunction::construct(&F, Target).CalculateArgSize();
return false;
}
};
return false;
}
};
+
+ struct Printer : public FunctionPass {
+ const char *getPassName() const { return "MachineFunction Printer"; }
+
+ virtual void getAnalysisUsage(AnalysisUsage &AU) const {
+ AU.setPreservesAll();
+ }
+
+ bool runOnFunction(Function &F) {
+ MachineFunction::get(&F).dump();
+ return false;
+ }
+ };
}
Pass *createMachineCodeConstructionPass(TargetMachine &Target) {
return new DestroyMachineFunction();
}
-
-// get - This deprecated static method returns the MachineBasicBlock object
-// for the specified BasicBlock.
-//
-MachineBasicBlock& MachineBasicBlock::get(const BasicBlock *BB) {
- const Function *F = BB->getParent();
- MachineFunction &MF = MachineFunction::get(F);
-
- for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I)
- if (I->getBasicBlock() == BB)
- return *I;
- assert(0 && "MachineBasicBlock object not found for specified block!");
- return get(BB);
+Pass *createMachineFunctionPrinterPass() {
+ return new Printer();
}
// MachineFunction implementation
//===---------------------------------------------------------------------===//
+MachineFunction::MachineFunction(const Function *F,
+ const TargetMachine& target)
+ : Annotation(MF_AID),
+ Fn(F), Target(target), staticStackSize(0),
+ automaticVarsSize(0), regSpillsSize(0),
+ maxOptionalArgsSize(0), maxOptionalNumArgs(0),
+ currentTmpValuesSize(0), maxTmpValuesSize(0), compiledAsLeaf(false),
+ spillsAreaFrozen(false), automaticVarsAreaFrozen(false)
+{
+}
+
+void MachineFunction::dump() const { print(std::cerr); }
+
+void MachineFunction::print(std::ostream &OS) const {
+ OS << "\n" << *(Value*)Fn->getReturnType() << " \"" << Fn->getName()<< "\"\n";
+
+ for (const_iterator BB = begin(); BB != end(); ++BB) {
+ BasicBlock *LBB = BB->getBasicBlock();
+ OS << "\n" << LBB->getName() << " ("
+ << (const void*)BB->getBasicBlock() << "):\n";
+ for (MachineBasicBlock::const_iterator I = BB->begin(); I != BB->end();++I){
+ OS << "\t";
+ (*I)->print(OS, Target);
+ }
+ }
+ OS << "\nEnd function \"" << Fn->getName() << "\"\n\n";
+}
+
+
// The next two methods are used to construct and to retrieve
// the MachineCodeForFunction object for the given function.
// construct() -- Allocates and initializes for a given function and target
// for a given Function.
//
MachineFunction&
-MachineFunction::construct(const Function *M, const TargetMachine &Tar)
+MachineFunction::construct(const Function *Fn, const TargetMachine &Tar)
{
- assert(M->getAnnotation(MCFM_AID) == 0 &&
+ assert(Fn->getAnnotation(MF_AID) == 0 &&
"Object already exists for this function!");
- MachineFunction* mcInfo = new MachineFunction(M, Tar);
- M->addAnnotation(mcInfo);
+ MachineFunction* mcInfo = new MachineFunction(Fn, Tar);
+ Fn->addAnnotation(mcInfo);
return *mcInfo;
}
void
-MachineFunction::destruct(const Function *M)
+MachineFunction::destruct(const Function *Fn)
{
- bool Deleted = M->deleteAnnotation(MCFM_AID);
+ bool Deleted = Fn->deleteAnnotation(MF_AID);
assert(Deleted && "Machine code did not exist for function!");
}
-MachineFunction&
-MachineFunction::get(const Function *F)
+MachineFunction& MachineFunction::get(const Function *F)
{
- MachineFunction *mc = (MachineFunction*)F->getAnnotation(MCFM_AID);
+ MachineFunction *mc = (MachineFunction*)F->getAnnotation(MF_AID);
assert(mc && "Call construct() method first to allocate the object");
return *mc;
}
}
-/*ctor*/
-MachineFunction::MachineFunction(const Function *F,
- const TargetMachine& target)
- : Annotation(MCFM_AID),
- method(F), staticStackSize(0),
- automaticVarsSize(0), regSpillsSize(0),
- maxOptionalArgsSize(0), maxOptionalNumArgs(0),
- currentTmpValuesSize(0), maxTmpValuesSize(0), compiledAsLeaf(false),
- spillsAreaFrozen(false), automaticVarsAreaFrozen(false)
-{
- maxOptionalArgsSize = ComputeMaxOptionalArgsSize(target, method,
+void MachineFunction::CalculateArgSize() {
+ maxOptionalArgsSize = ComputeMaxOptionalArgsSize(Target, Fn,
maxOptionalNumArgs);
staticStackSize = maxOptionalArgsSize
- + target.getFrameInfo().getMinStackFrameSize();
+ + Target.getFrameInfo().getMinStackFrameSize();
}
int
hash_map<const Value*, int>::const_iterator pair = offsets.find(val);
return (pair == offsets.end()) ? INVALID_FRAME_OFFSET : pair->second;
}
-
-void
-MachineFunction::dump() const
-{
- std::cerr << "\n" << method->getReturnType()
- << " \"" << method->getName() << "\"\n";
-
- for (Function::const_iterator BB = method->begin(); BB != method->end(); ++BB)
- {
- std::cerr << "\n" << BB->getName() << " (" << (const void*)BB
- << ")" << ":" << "\n";
- MachineBasicBlock& mvec = MachineBasicBlock::get(BB);
- for (unsigned i=0; i < mvec.size(); i++)
- std::cerr << "\t" << *mvec[i];
- }
- std::cerr << "\nEnd function \"" << method->getName() << "\"\n\n";
-}