X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FCodeGen%2FMachineFunction.cpp;h=cf7f39140b8663e25daf837a8973b3001d2b7384;hb=d8e880c670699bd56dc3968647a4b963793d201d;hp=787f38903d8c2f6cdbd4a723d97fb4fde249b73f;hpb=8e5f2c6f65841542e2a7092553fe42a00048e4c7;p=oota-llvm.git diff --git a/lib/CodeGen/MachineFunction.cpp b/lib/CodeGen/MachineFunction.cpp index 787f38903d8..cf7f39140b8 100644 --- a/lib/CodeGen/MachineFunction.cpp +++ b/lib/CodeGen/MachineFunction.cpp @@ -22,13 +22,13 @@ #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/Passes.h" #include "llvm/Target/TargetData.h" -#include "llvm/Target/TargetLowering.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetFrameInfo.h" #include "llvm/Function.h" #include "llvm/Instructions.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/GraphWriter.h" +#include "llvm/Support/raw_ostream.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Config/config.h" #include @@ -48,8 +48,8 @@ namespace { std::ostream *OS; const std::string Banner; - Printer (std::ostream *_OS, const std::string &_Banner) - : MachineFunctionPass((intptr_t)&ID), OS (_OS), Banner (_Banner) { } + Printer (std::ostream *os, const std::string &banner) + : MachineFunctionPass(&ID), OS(os), Banner(banner) {} const char *getPassName() const { return "MachineFunction Printer"; } @@ -77,7 +77,7 @@ FunctionPass *llvm::createMachineFunctionPrinterPass(std::ostream *OS, namespace { struct VISIBILITY_HIDDEN Deleter : public MachineFunctionPass { static char ID; - Deleter() : MachineFunctionPass((intptr_t)&ID) {} + Deleter() : MachineFunctionPass(&ID) {} const char *getPassName() const { return "Machine Code Deleter"; } @@ -103,15 +103,18 @@ FunctionPass *llvm::createMachineCodeDeleter() { // MachineFunction implementation //===---------------------------------------------------------------------===// -void alist_traits::deleteNode(MachineBasicBlock *MBB) { +void ilist_traits::deleteNode(MachineBasicBlock *MBB) { MBB->getParent()->DeleteMachineBasicBlock(MBB); } MachineFunction::MachineFunction(const Function *F, const TargetMachine &TM) : Annotation(MF_AID), Fn(F), Target(TM) { - RegInfo = new (Allocator.Allocate()) - MachineRegisterInfo(*TM.getRegisterInfo()); + if (TM.getRegisterInfo()) + RegInfo = new (Allocator.Allocate()) + MachineRegisterInfo(*TM.getRegisterInfo()); + else + RegInfo = 0; MFInfo = 0; FrameInfo = new (Allocator.Allocate()) MachineFrameInfo(*TM.getFrameInfo()); @@ -132,8 +135,8 @@ MachineFunction::~MachineFunction() { BasicBlocks.clear(); InstructionRecycler.clear(Allocator); BasicBlockRecycler.clear(Allocator); - MemOperandRecycler.clear(Allocator); - RegInfo->~MachineRegisterInfo(); Allocator.Deallocate(RegInfo); + if (RegInfo) + RegInfo->~MachineRegisterInfo(); Allocator.Deallocate(RegInfo); if (MFInfo) { MFInfo->~MachineFunctionInfo(); Allocator.Deallocate(MFInfo); } @@ -189,9 +192,10 @@ void MachineFunction::RenumberBlocks(MachineBasicBlock *MBB) { /// of `new MachineInstr'. /// MachineInstr * -MachineFunction::CreateMachineInstr(const TargetInstrDesc &TID, bool NoImp) { +MachineFunction::CreateMachineInstr(const TargetInstrDesc &TID, + DebugLoc DL, bool NoImp) { return new (InstructionRecycler.Allocate(Allocator)) - MachineInstr(TID, NoImp); + MachineInstr(TID, DL, NoImp); } /// CloneMachineInstr - Create a new MachineInstr which is a copy of the @@ -235,23 +239,6 @@ MachineFunction::DeleteMachineBasicBlock(MachineBasicBlock *MBB) { BasicBlockRecycler.Deallocate(Allocator, MBB); } -/// CreateMachineMemOperand - Allocate a new MachineMemOperand. Use this -/// instead of `new MachineMemOperand'. -/// -MachineMemOperand * -MachineFunction::CreateMachineMemOperand(const MachineMemOperand &MMO) { - return new (MemOperandRecycler.Allocate(Allocator)) - MachineMemOperand(MMO); -} - -/// DeleteMachineMemOperand - Delete the given MachineMemOperand. -/// -void -MachineFunction::DeleteMachineMemOperand(MachineMemOperand *MO) { - MO->~MachineMemOperand(); - MemOperandRecycler.Deallocate(Allocator, MO); -} - void MachineFunction::dump() const { print(*cerr.stream()); } @@ -266,11 +253,14 @@ void MachineFunction::print(std::ostream &OS) const { JumpTableInfo->print(OS); // Print Constant Pool - ConstantPool->print(OS); + { + raw_os_ostream OSS(OS); + ConstantPool->print(OSS); + } const TargetRegisterInfo *TRI = getTarget().getRegisterInfo(); - if (!RegInfo->livein_empty()) { + if (RegInfo && !RegInfo->livein_empty()) { OS << "Live Ins:"; for (MachineRegisterInfo::livein_iterator I = RegInfo->livein_begin(), E = RegInfo->livein_end(); I != E; ++I) { @@ -284,7 +274,7 @@ void MachineFunction::print(std::ostream &OS) const { } OS << "\n"; } - if (!RegInfo->liveout_empty()) { + if (RegInfo && !RegInfo->liveout_empty()) { OS << "Live Outs:"; for (MachineRegisterInfo::liveout_iterator I = RegInfo->liveout_begin(), E = RegInfo->liveout_end(); I != E; ++I) @@ -389,6 +379,31 @@ MachineFunction& MachineFunction::get(const Function *F) return *mc; } +/// getOrCreateDebugLocID - Look up the DebugLocTuple index with the given +/// source file, line, and column. If none currently exists, create a new +/// DebugLocTuple, and insert it into the DebugIdMap. +unsigned MachineFunction::getOrCreateDebugLocID(unsigned Src, unsigned Line, + unsigned Col) { + DebugLocTuple Tuple(Src, Line, Col); + DenseMap::iterator II + = DebugLocInfo.DebugIdMap.find(Tuple); + if (II != DebugLocInfo.DebugIdMap.end()) + return II->second; + // Add a new tuple. + unsigned Id = DebugLocInfo.DebugLocations.size(); + DebugLocInfo.DebugLocations.push_back(Tuple); + DebugLocInfo.DebugIdMap[Tuple] = Id; + return Id; +} + +/// getDebugLocTuple - Get the DebugLocTuple for a given DebugLoc object. +DebugLocTuple MachineFunction::getDebugLocTuple(DebugLoc DL) const { + unsigned Idx = DL.getIndex(); + assert(Idx < DebugLocInfo.DebugLocations.size() && + "Invalid index into debug locations!"); + return DebugLocInfo.DebugLocations[Idx]; +} + //===----------------------------------------------------------------------===// // MachineFrameInfo implementation //===----------------------------------------------------------------------===// @@ -407,11 +422,12 @@ int MachineFrameInfo::CreateFixedObject(uint64_t Size, int64_t SPOffset, void MachineFrameInfo::print(const MachineFunction &MF, std::ostream &OS) const{ - int ValOffset = MF.getTarget().getFrameInfo()->getOffsetOfLocalArea(); + const TargetFrameInfo *FI = MF.getTarget().getFrameInfo(); + int ValOffset = (FI ? FI->getOffsetOfLocalArea() : 0); for (unsigned i = 0, e = Objects.size(); i != e; ++i) { const StackObject &SO = Objects[i]; - OS << " : "; + OS << " : "; if (SO.Size == ~0ULL) { OS << "dead\n"; continue; @@ -469,7 +485,7 @@ void MachineJumpTableInfo::print(std::ostream &OS) const { // FIXME: this is lame, maybe we could print out the MBB numbers or something // like {1, 2, 4, 5, 3, 0} for (unsigned i = 0, e = JumpTables.size(); i != e; ++i) { - OS << " has " << JumpTables[i].MBBs.size() + OS << " has " << JumpTables[i].MBBs.size() << " entries\n"; } } @@ -494,7 +510,8 @@ MachineConstantPool::~MachineConstantPool() { } /// getConstantPoolIndex - Create a new entry in the constant pool or return -/// an existing one. User must specify an alignment in bytes for the object. +/// an existing one. User must specify the log2 of the minimum required +/// alignment for the object. /// unsigned MachineConstantPool::getConstantPoolIndex(Constant *C, unsigned Alignment) { @@ -512,7 +529,7 @@ unsigned MachineConstantPool::getConstantPoolIndex(Constant *C, unsigned Offset = 0; if (!Constants.empty()) { Offset = Constants.back().getOffset(); - Offset += TD->getABITypeSize(Constants.back().getType()); + Offset += TD->getTypePaddedSize(Constants.back().getType()); Offset = (Offset+AlignMask)&~AlignMask; } @@ -536,7 +553,7 @@ unsigned MachineConstantPool::getConstantPoolIndex(MachineConstantPoolValue *V, unsigned Offset = 0; if (!Constants.empty()) { Offset = Constants.back().getOffset(); - Offset += TD->getABITypeSize(Constants.back().getType()); + Offset += TD->getTypePaddedSize(Constants.back().getType()); Offset = (Offset+AlignMask)&~AlignMask; } @@ -544,10 +561,9 @@ unsigned MachineConstantPool::getConstantPoolIndex(MachineConstantPoolValue *V, return Constants.size()-1; } - -void MachineConstantPool::print(std::ostream &OS) const { +void MachineConstantPool::print(raw_ostream &OS) const { for (unsigned i = 0, e = Constants.size(); i != e; ++i) { - OS << " is"; + OS << " is"; if (Constants[i].isMachineConstantPoolEntry()) Constants[i].Val.MachineCPVal->print(OS); else @@ -557,4 +573,4 @@ void MachineConstantPool::print(std::ostream &OS) const { } } -void MachineConstantPool::dump() const { print(*cerr.stream()); } +void MachineConstantPool::dump() const { print(errs()); errs().flush(); }