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
MachineFunction&
MachineFunction::construct(const Function *Fn, const TargetMachine &Tar)
{
- assert(Fn->getAnnotation(MCFM_AID) == 0 &&
+ assert(Fn->getAnnotation(MF_AID) == 0 &&
"Object already exists for this function!");
MachineFunction* mcInfo = new MachineFunction(Fn, Tar);
Fn->addAnnotation(mcInfo);
void
MachineFunction::destruct(const Function *Fn)
{
- bool Deleted = Fn->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 *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),
- Fn(F), Target(target), staticStackSize(0),
- automaticVarsSize(0), regSpillsSize(0),
- maxOptionalArgsSize(0), maxOptionalNumArgs(0),
- currentTmpValuesSize(0), maxTmpValuesSize(0), compiledAsLeaf(false),
- spillsAreaFrozen(false), automaticVarsAreaFrozen(false)
-{
- maxOptionalArgsSize = ComputeMaxOptionalArgsSize(target, Fn,
+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" << Fn->getReturnType()
- << " \"" << Fn->getName() << "\"\n";
-
- for (const_iterator BB = begin(); BB != end(); ++BB) {
- std::cerr << "\n" << BB->getBasicBlock()->getName() << " ("
- << (const void*)BB->getBasicBlock() << ")" << ":" << "\n";
- for (MachineBasicBlock::const_iterator I = BB->begin(); I != BB->end(); ++I)
- std::cerr << "\t" << *I;
- }
- std::cerr << "\nEnd function \"" << Fn->getName() << "\"\n\n";
-}