//===-- MachineFunction.cpp -----------------------------------------------===//
-//
+//
// The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
-//
+//
//===----------------------------------------------------------------------===//
-//
+//
// Collect native machine code information for a function. This allows
// target-specific information about the generated code to be stored with each
// function.
using namespace llvm;
static AnnotationID MF_AID(
- AnnotationManager::getID("CodeGen::MachineCodeForFunction"));
+ AnnotationManager::getID("CodeGen::MachineCodeForFunction"));
namespace {
/// stream is std::cerr; the default banner is empty.
///
FunctionPass *llvm::createMachineFunctionPrinterPass(std::ostream *OS,
- const std::string &Banner) {
+ const std::string &Banner){
return new Printer(OS, Banner);
}
//===---------------------------------------------------------------------===//
// MachineFunction implementation
//===---------------------------------------------------------------------===//
-MachineBasicBlock* ilist_traits<MachineBasicBlock>::createNode()
-{
- MachineBasicBlock* dummy = new MachineBasicBlock();
- LeakDetector::removeGarbageObject(dummy);
- return dummy;
+
+MachineBasicBlock* ilist_traits<MachineBasicBlock>::createSentinel() {
+ MachineBasicBlock* dummy = new MachineBasicBlock();
+ LeakDetector::removeGarbageObject(dummy);
+ return dummy;
}
void ilist_traits<MachineBasicBlock>::transferNodesFromList(
- iplist<MachineBasicBlock, ilist_traits<MachineBasicBlock> >& toList,
- ilist_iterator<MachineBasicBlock> first,
- ilist_iterator<MachineBasicBlock> last)
-{
- if (Parent != toList.Parent)
- for (; first != last; ++first)
- first->Parent = toList.Parent;
+ iplist<MachineBasicBlock, ilist_traits<MachineBasicBlock> >& toList,
+ ilist_iterator<MachineBasicBlock> first,
+ ilist_iterator<MachineBasicBlock> last) {
+ if (Parent != toList.Parent)
+ for (; first != last; ++first)
+ first->Parent = toList.Parent;
}
MachineFunction::MachineFunction(const Function *F,
const TargetMachine &TM)
- : Annotation(MF_AID), Fn(F), Target(TM) {
+ : Annotation(MF_AID), Fn(F), Target(TM), UsedPhysRegs(0) {
SSARegMapping = new SSARegMap();
MFInfo = 0;
FrameInfo = new MachineFrameInfo();
BasicBlocks.Parent = this;
}
-MachineFunction::~MachineFunction() {
+MachineFunction::~MachineFunction() {
BasicBlocks.clear();
delete SSARegMapping;
delete MFInfo;
delete FrameInfo;
delete ConstantPool;
+ delete[] UsedPhysRegs;
}
void MachineFunction::dump() const { print(std::cerr); }
// Print Constant Pool
getConstantPool()->print(OS);
-
+
for (const_iterator BB = begin(); BB != end(); ++BB)
BB->print(OS);
static bool CFGOnly = false;
namespace llvm {
-template<>
-struct DOTGraphTraits<const MachineFunction*> : public DefaultDOTGraphTraits {
- static std::string getGraphName(const MachineFunction *F) {
- return "CFG for '" + F->getFunction()->getName() + "' function";
- }
+ template<>
+ struct DOTGraphTraits<const MachineFunction*> : public DefaultDOTGraphTraits {
+ static std::string getGraphName(const MachineFunction *F) {
+ return "CFG for '" + F->getFunction()->getName() + "' function";
+ }
- static std::string getNodeLabel(const MachineBasicBlock *Node,
- const MachineFunction *Graph) {
- if (CFGOnly && Node->getBasicBlock() &&
- !Node->getBasicBlock()->getName().empty())
- return Node->getBasicBlock()->getName() + ":";
+ static std::string getNodeLabel(const MachineBasicBlock *Node,
+ const MachineFunction *Graph) {
+ if (CFGOnly && Node->getBasicBlock() &&
+ !Node->getBasicBlock()->getName().empty())
+ return Node->getBasicBlock()->getName() + ":";
- std::ostringstream Out;
- if (CFGOnly) {
- Out << Node->getNumber() << ':';
- return Out.str();
- }
+ std::ostringstream Out;
+ if (CFGOnly) {
+ Out << Node->getNumber() << ':';
+ return Out.str();
+ }
- Node->print(Out);
+ Node->print(Out);
- std::string OutStr = Out.str();
- if (OutStr[0] == '\n') OutStr.erase(OutStr.begin());
+ std::string OutStr = Out.str();
+ if (OutStr[0] == '\n') OutStr.erase(OutStr.begin());
- // Process string output to make it nicer...
- for (unsigned i = 0; i != OutStr.length(); ++i)
- if (OutStr[i] == '\n') { // Left justify
- OutStr[i] = '\\';
- OutStr.insert(OutStr.begin()+i+1, 'l');
- }
- return OutStr;
- }
-};
+ // Process string output to make it nicer...
+ for (unsigned i = 0; i != OutStr.length(); ++i)
+ if (OutStr[i] == '\n') { // Left justify
+ OutStr[i] = '\\';
+ OutStr.insert(OutStr.begin()+i+1, 'l');
+ }
+ return OutStr;
+ }
+ };
}
void MachineFunction::viewCFG() const
std::string Filename = "/tmp/cfg." + getFunction()->getName() + ".dot";
std::cerr << "Writing '" << Filename << "'... ";
std::ofstream F(Filename.c_str());
-
+
if (!F) {
std::cerr << " error opening file for writing!\n";
return;
// get() -- Returns a handle to the object.
// This should not be called before "construct()"
// for a given Function.
-//
+//
MachineFunction&
MachineFunction::construct(const Function *Fn, const TargetMachine &Tar)
{
/// CreateStackObject - Create a stack object for a value of the specified type.
///
int MachineFrameInfo::CreateStackObject(const Type *Ty, const TargetData &TD) {
- return CreateStackObject(TD.getTypeSize(Ty), TD.getTypeAlignment(Ty));
+ return CreateStackObject((unsigned)TD.getTypeSize(Ty),
+ TD.getTypeAlignment(Ty));
}
OS << "variable sized";
else
OS << SO.Size << " byte" << (SO.Size != 1 ? "s" : " ");
-
+
if (i < NumFixedObjects)
OS << " fixed";
if (i < NumFixedObjects || SO.SPOffset != -1) {
int Off = SO.SPOffset - ValOffset;
OS << " at location [SP";
if (Off > 0)
- OS << "+" << Off;
+ OS << "+" << Off;
else if (Off < 0)
- OS << Off;
+ OS << Off;
OS << "]";
}
OS << "\n";
}
void MachineConstantPool::dump() const { print(std::cerr); }
-