MachineFunction.cpp revision 4d149cdae1553426f49623fdae215d481d56d955
16b9445389a226b4ac97ceb89a34ee1a5bf921714Chris Lattner//===-- MachineFunction.cpp -----------------------------------------------===// 2f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner// 36b9445389a226b4ac97ceb89a34ee1a5bf921714Chris Lattner// Collect native machine code information for a function. This allows 46b9445389a226b4ac97ceb89a34ee1a5bf921714Chris Lattner// target-specific information about the generated code to be stored with each 56b9445389a226b4ac97ceb89a34ee1a5bf921714Chris Lattner// function. 66b9445389a226b4ac97ceb89a34ee1a5bf921714Chris Lattner// 76b9445389a226b4ac97ceb89a34ee1a5bf921714Chris Lattner//===----------------------------------------------------------------------===// 8f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 96b9445389a226b4ac97ceb89a34ee1a5bf921714Chris Lattner#include "llvm/CodeGen/MachineFunction.h" 10831fdcf0177a4eef66129cd6fb4138922c492bf0Chris Lattner#include "llvm/CodeGen/MachineInstr.h" 11227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner#include "llvm/CodeGen/MachineCodeForInstruction.h" 12831fdcf0177a4eef66129cd6fb4138922c492bf0Chris Lattner#include "llvm/CodeGen/SSARegMap.h" 13955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner#include "llvm/CodeGen/MachineFunctionInfo.h" 14eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner#include "llvm/CodeGen/MachineFrameInfo.h" 154d149cdae1553426f49623fdae215d481d56d955Chris Lattner#include "llvm/CodeGen/MachineConstantPool.h" 16f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner#include "llvm/Target/TargetMachine.h" 178bd66e690779c838db51f55cf0b31d7206b3b659Chris Lattner#include "llvm/Target/TargetFrameInfo.h" 18f27eeea54fb0176986f76731c499176345047dffChris Lattner#include "llvm/Target/TargetCacheInfo.h" 192fbfdcffd3e0cf41422aaa6c526c37cb02b81341Chris Lattner#include "llvm/Function.h" 20f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner#include "llvm/iOther.h" 21227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner#include "llvm/Pass.h" 22f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner#include <limits.h> 23f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 24f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattnerconst int INVALID_FRAME_OFFSET = INT_MAX; // std::numeric_limits<int>::max(); 25f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 26e316efc0e74442cffdda4889d30dca4fffcad749Chris Lattnerstatic AnnotationID MF_AID( 272fbfdcffd3e0cf41422aaa6c526c37cb02b81341Chris Lattner AnnotationManager::getID("CodeGen::MachineCodeForFunction")); 28f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 29227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner 30227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner//===---------------------------------------------------------------------===// 31227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner// Code generation/destruction passes 32227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner//===---------------------------------------------------------------------===// 33227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner 34227c3d355b017393963a690f9f27d1de7fa359bcChris Lattnernamespace { 35227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner class ConstructMachineFunction : public FunctionPass { 36227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner TargetMachine &Target; 37227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner public: 38227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner ConstructMachineFunction(TargetMachine &T) : Target(T) {} 39227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner 40227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner const char *getPassName() const { 41227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner return "ConstructMachineFunction"; 42227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner } 43227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner 44227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner bool runOnFunction(Function &F) { 45955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner MachineFunction::construct(&F, Target).getInfo()->CalculateArgSize(); 46227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner return false; 47227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner } 48227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner }; 49227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner 50227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner struct DestroyMachineFunction : public FunctionPass { 51227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner const char *getPassName() const { return "FreeMachineFunction"; } 52227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner 53227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner static void freeMachineCode(Instruction &I) { 54227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner MachineCodeForInstruction::destroy(&I); 55227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner } 56227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner 57227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner bool runOnFunction(Function &F) { 58227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI) 59227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner for (BasicBlock::iterator I = FI->begin(), E = FI->end(); I != E; ++I) 60227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner MachineCodeForInstruction::get(I).dropAllReferences(); 61227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner 62227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI) 63227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner for_each(FI->begin(), FI->end(), freeMachineCode); 64227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner 65227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner return false; 66227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner } 67227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner }; 681049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 691049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner struct Printer : public FunctionPass { 701049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner const char *getPassName() const { return "MachineFunction Printer"; } 711049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 721049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner virtual void getAnalysisUsage(AnalysisUsage &AU) const { 731049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner AU.setPreservesAll(); 741049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 751049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 761049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner bool runOnFunction(Function &F) { 771049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner MachineFunction::get(&F).dump(); 781049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner return false; 791049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 801049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner }; 81227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner} 82227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner 83227c3d355b017393963a690f9f27d1de7fa359bcChris LattnerPass *createMachineCodeConstructionPass(TargetMachine &Target) { 84227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner return new ConstructMachineFunction(Target); 85227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner} 86227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner 87227c3d355b017393963a690f9f27d1de7fa359bcChris LattnerPass *createMachineCodeDestructionPass() { 88227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner return new DestroyMachineFunction(); 89227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner} 90227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner 911049164aa6b06d91d9b3b557a9a213eaf3f6319aChris LattnerPass *createMachineFunctionPrinterPass() { 921049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner return new Printer(); 931049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 941049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 95227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner 96227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner//===---------------------------------------------------------------------===// 97227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner// MachineFunction implementation 98227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner//===---------------------------------------------------------------------===// 99227c3d355b017393963a690f9f27d1de7fa359bcChris Lattner 1001049164aa6b06d91d9b3b557a9a213eaf3f6319aChris LattnerMachineFunction::MachineFunction(const Function *F, 101955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner const TargetMachine &TM) 102955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner : Annotation(MF_AID), Fn(F), Target(TM) { 103b7825bc72534573c444e646dd1c3999ff787bbadMisha Brukman SSARegMapping = new SSARegMap(); 104955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner MFInfo = new MachineFunctionInfo(*this); 105eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner FrameInfo = new MachineFrameInfo(); 1064d149cdae1553426f49623fdae215d481d56d955Chris Lattner ConstantPool = new MachineConstantPool(); 107831fdcf0177a4eef66129cd6fb4138922c492bf0Chris Lattner} 108831fdcf0177a4eef66129cd6fb4138922c492bf0Chris Lattner 109831fdcf0177a4eef66129cd6fb4138922c492bf0Chris LattnerMachineFunction::~MachineFunction() { 110831fdcf0177a4eef66129cd6fb4138922c492bf0Chris Lattner delete SSARegMapping; 111955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner delete MFInfo; 112955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner delete FrameInfo; 1134d149cdae1553426f49623fdae215d481d56d955Chris Lattner delete ConstantPool; 1141049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 1151049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 1161049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattnervoid MachineFunction::dump() const { print(std::cerr); } 1171049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 1181049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattnervoid MachineFunction::print(std::ostream &OS) const { 119955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner OS << "\n" << *(Value*)Fn->getFunctionType() << " \"" << Fn->getName() 120955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner << "\"\n"; 121955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner 122955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner // Print Frame Information 123955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner getFrameInfo()->print(OS); 1244d149cdae1553426f49623fdae215d481d56d955Chris Lattner 1254d149cdae1553426f49623fdae215d481d56d955Chris Lattner // Print Constant Pool 1264d149cdae1553426f49623fdae215d481d56d955Chris Lattner getConstantPool()->print(OS); 1271049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 1281049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner for (const_iterator BB = begin(); BB != end(); ++BB) { 1291049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner BasicBlock *LBB = BB->getBasicBlock(); 1302109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner OS << "\n" << LBB->getName() << " (" << (const void*)LBB << "):\n"; 1311049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner for (MachineBasicBlock::const_iterator I = BB->begin(); I != BB->end();++I){ 1321049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "\t"; 1331049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner (*I)->print(OS, Target); 1341049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 1351049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 1361049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "\nEnd function \"" << Fn->getName() << "\"\n\n"; 1371049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 1381049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 1391049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 140f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner// The next two methods are used to construct and to retrieve 1412fbfdcffd3e0cf41422aaa6c526c37cb02b81341Chris Lattner// the MachineCodeForFunction object for the given function. 1422fbfdcffd3e0cf41422aaa6c526c37cb02b81341Chris Lattner// construct() -- Allocates and initializes for a given function and target 143f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner// get() -- Returns a handle to the object. 144f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner// This should not be called before "construct()" 1452fbfdcffd3e0cf41422aaa6c526c37cb02b81341Chris Lattner// for a given Function. 146f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner// 147fce1143bcfa73f61845002fa50473d1a01384202Misha BrukmanMachineFunction& 148335d5c399b52c2507ad11048310edc51462f4811Chris LattnerMachineFunction::construct(const Function *Fn, const TargetMachine &Tar) 14989e2da034a02cd33b306b59dbbf607650cca1c4cVikram S. Adve{ 150e316efc0e74442cffdda4889d30dca4fffcad749Chris Lattner assert(Fn->getAnnotation(MF_AID) == 0 && 1512fbfdcffd3e0cf41422aaa6c526c37cb02b81341Chris Lattner "Object already exists for this function!"); 152335d5c399b52c2507ad11048310edc51462f4811Chris Lattner MachineFunction* mcInfo = new MachineFunction(Fn, Tar); 153335d5c399b52c2507ad11048310edc51462f4811Chris Lattner Fn->addAnnotation(mcInfo); 154f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner return *mcInfo; 155f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner} 156f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 15789e2da034a02cd33b306b59dbbf607650cca1c4cVikram S. Advevoid 158335d5c399b52c2507ad11048310edc51462f4811Chris LattnerMachineFunction::destruct(const Function *Fn) 15989e2da034a02cd33b306b59dbbf607650cca1c4cVikram S. Adve{ 160e316efc0e74442cffdda4889d30dca4fffcad749Chris Lattner bool Deleted = Fn->deleteAnnotation(MF_AID); 1612fbfdcffd3e0cf41422aaa6c526c37cb02b81341Chris Lattner assert(Deleted && "Machine code did not exist for function!"); 162f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner} 163f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 164335d5c399b52c2507ad11048310edc51462f4811Chris LattnerMachineFunction& MachineFunction::get(const Function *F) 16589e2da034a02cd33b306b59dbbf607650cca1c4cVikram S. Adve{ 166e316efc0e74442cffdda4889d30dca4fffcad749Chris Lattner MachineFunction *mc = (MachineFunction*)F->getAnnotation(MF_AID); 167f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner assert(mc && "Call construct() method first to allocate the object"); 168f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner return *mc; 169f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner} 170f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 171831fdcf0177a4eef66129cd6fb4138922c492bf0Chris Lattnervoid MachineFunction::clearSSARegMap() { 172831fdcf0177a4eef66129cd6fb4138922c492bf0Chris Lattner delete SSARegMapping; 173831fdcf0177a4eef66129cd6fb4138922c492bf0Chris Lattner SSARegMapping = 0; 174831fdcf0177a4eef66129cd6fb4138922c492bf0Chris Lattner} 175831fdcf0177a4eef66129cd6fb4138922c492bf0Chris Lattner 176955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner//===----------------------------------------------------------------------===// 177eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattner// MachineFrameInfo implementation 178955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner//===----------------------------------------------------------------------===// 179955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner 1804d149cdae1553426f49623fdae215d481d56d955Chris Lattner/// CreateStackObject - Create a stack object for a value of the specified type. 1814d149cdae1553426f49623fdae215d481d56d955Chris Lattner/// 1824d149cdae1553426f49623fdae215d481d56d955Chris Lattnerint MachineFrameInfo::CreateStackObject(const Type *Ty, const TargetData &TD) { 1834d149cdae1553426f49623fdae215d481d56d955Chris Lattner return CreateStackObject(TD.getTypeSize(Ty), TD.getTypeAlignment(Ty)); 1844d149cdae1553426f49623fdae215d481d56d955Chris Lattner} 1854d149cdae1553426f49623fdae215d481d56d955Chris Lattner 1864d149cdae1553426f49623fdae215d481d56d955Chris Lattnerint MachineFrameInfo::CreateStackObject(const TargetRegisterClass *RC) { 1874d149cdae1553426f49623fdae215d481d56d955Chris Lattner return CreateStackObject(RC->getSize(), RC->getAlignment()); 1884d149cdae1553426f49623fdae215d481d56d955Chris Lattner} 1894d149cdae1553426f49623fdae215d481d56d955Chris Lattner 1904d149cdae1553426f49623fdae215d481d56d955Chris Lattner 191eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattnervoid MachineFrameInfo::print(std::ostream &OS) const { 192955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner for (unsigned i = 0, e = Objects.size(); i != e; ++i) { 193955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner const StackObject &SO = Objects[i]; 1944d149cdae1553426f49623fdae215d481d56d955Chris Lattner OS << " <fi #" << (int)(i-NumFixedObjects) << "> is "; 195955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner if (SO.Size == 0) 196955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner OS << "variable sized"; 197955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner else 198955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner OS << SO.Size << " byte" << (SO.Size != 1 ? "s" : " "); 199955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner 200955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner if (i < NumFixedObjects) 201955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner OS << " fixed"; 202955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner if (i < NumFixedObjects || SO.SPOffset != -1) { 203955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner OS << " at location [SP"; 204955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner if (SO.SPOffset > 0) 205955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner OS << "+" << SO.SPOffset; 206955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner else if (SO.SPOffset < 0) 207955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner OS << SO.SPOffset; 208955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner OS << "]"; 209955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner } 210955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner OS << "\n"; 211955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner } 212955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner 213955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner if (HasVarSizedObjects) 214955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner OS << " Stack frame contains variable sized objects\n"; 215955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner} 216955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner 217eb24db9727a7babe863d5afe70c7bda3a460da18Chris Lattnervoid MachineFrameInfo::dump() const { print(std::cerr); } 218955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner 219955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner 220955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner//===----------------------------------------------------------------------===// 2214d149cdae1553426f49623fdae215d481d56d955Chris Lattner// MachineConstantPool implementation 2224d149cdae1553426f49623fdae215d481d56d955Chris Lattner//===----------------------------------------------------------------------===// 2234d149cdae1553426f49623fdae215d481d56d955Chris Lattner 2244d149cdae1553426f49623fdae215d481d56d955Chris Lattnervoid MachineConstantPool::print(std::ostream &OS) const { 2254d149cdae1553426f49623fdae215d481d56d955Chris Lattner for (unsigned i = 0, e = Constants.size(); i != e; ++i) 2264d149cdae1553426f49623fdae215d481d56d955Chris Lattner OS << " <cp #" << i << "> is" << *(Value*)Constants[i] << "\n"; 2274d149cdae1553426f49623fdae215d481d56d955Chris Lattner} 2284d149cdae1553426f49623fdae215d481d56d955Chris Lattner 2294d149cdae1553426f49623fdae215d481d56d955Chris Lattnervoid MachineConstantPool::dump() const { print(std::cerr); } 2304d149cdae1553426f49623fdae215d481d56d955Chris Lattner 2314d149cdae1553426f49623fdae215d481d56d955Chris Lattner//===----------------------------------------------------------------------===// 232955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner// MachineFunctionInfo implementation 233955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner//===----------------------------------------------------------------------===// 234831fdcf0177a4eef66129cd6fb4138922c492bf0Chris Lattner 235f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattnerstatic unsigned 23603d33bd2640806ce8e661acf7bcfa3726a14d606Vikram S. AdveComputeMaxOptionalArgsSize(const TargetMachine& target, const Function *F, 23703d33bd2640806ce8e661acf7bcfa3726a14d606Vikram S. Adve unsigned &maxOptionalNumArgs) 238f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner{ 239955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner const TargetFrameInfo &frameInfo = target.getFrameInfo(); 240f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 2410b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner unsigned maxSize = 0; 242f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 2430b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner for (Function::const_iterator BB = F->begin(), BBE = F->end(); BB !=BBE; ++BB) 2440b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I) 2450b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner if (const CallInst *callInst = dyn_cast<CallInst>(&*I)) 2460b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner { 2470b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner unsigned numOperands = callInst->getNumOperands() - 1; 2480b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner int numExtra = (int)numOperands-frameInfo.getNumFixedOutgoingArgs(); 2490b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner if (numExtra <= 0) 2500b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner continue; 2510b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner 252955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner unsigned sizeForThisCall; 2530b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner if (frameInfo.argsOnStackHaveFixedSize()) 2540b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner { 2550b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner int argSize = frameInfo.getSizeOfEachArgOnStack(); 2560b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner sizeForThisCall = numExtra * (unsigned) argSize; 2570b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner } 2580b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner else 2590b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner { 2600b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner assert(0 && "UNTESTED CODE: Size per stack argument is not " 2610b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner "fixed on this architecture: use actual arg sizes to " 2620b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner "compute MaxOptionalArgsSize"); 2630b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner sizeForThisCall = 0; 2640b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner for (unsigned i = 0; i < numOperands; ++i) 265955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner sizeForThisCall += target.getTargetData().getTypeSize(callInst-> 2660b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner getOperand(i)->getType()); 2670b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner } 2680b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner 2690b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner if (maxSize < sizeForThisCall) 2700b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner maxSize = sizeForThisCall; 2710b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner 2720b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner if ((int)maxOptionalNumArgs < numExtra) 2730b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner maxOptionalNumArgs = (unsigned) numExtra; 2740b12b5f50ec77a8bd01b92d287c52d748619bb4bChris Lattner } 27589e2da034a02cd33b306b59dbbf607650cca1c4cVikram S. Adve 276f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner return maxSize; 277f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner} 278f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 279f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner// Align data larger than one L1 cache line on L1 cache line boundaries. 2801318bed20c52792913405c0d41766f69829cf944Vikram S. Adve// Align all smaller data on the next higher 2^x boundary (4, 8, ...), 2811318bed20c52792913405c0d41766f69829cf944Vikram S. Adve// but not higher than the alignment of the largest type we support 2821318bed20c52792913405c0d41766f69829cf944Vikram S. Adve// (currently a double word). -- see class TargetData). 283f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner// 2841318bed20c52792913405c0d41766f69829cf944Vikram S. Adve// This function is similar to the corresponding function in EmitAssembly.cpp 2851318bed20c52792913405c0d41766f69829cf944Vikram S. Adve// but they are unrelated. This one does not align at more than a 2861318bed20c52792913405c0d41766f69829cf944Vikram S. Adve// double-word boundary whereas that one might. 287f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner// 288955fad1f99dd174023a1b2e6a1795958147b077dChris Lattnerinline unsigned 289955fad1f99dd174023a1b2e6a1795958147b077dChris LattnerSizeToAlignment(unsigned size, const TargetMachine& target) 290f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner{ 291f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner unsigned short cacheLineSize = target.getCacheInfo().getCacheLineSize(1); 292f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner if (size > (unsigned) cacheLineSize / 2) 293f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner return cacheLineSize; 294f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner else 295f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner for (unsigned sz=1; /*no condition*/; sz *= 2) 296955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner if (sz >= size || sz >= target.getTargetData().getDoubleAlignment()) 297f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner return sz; 298f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner} 299f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 300f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 301955fad1f99dd174023a1b2e6a1795958147b077dChris Lattnervoid MachineFunctionInfo::CalculateArgSize() { 302955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner maxOptionalArgsSize = ComputeMaxOptionalArgsSize(MF.getTarget(), 303955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner MF.getFunction(), 30403d33bd2640806ce8e661acf7bcfa3726a14d606Vikram S. Adve maxOptionalNumArgs); 30589e2da034a02cd33b306b59dbbf607650cca1c4cVikram S. Adve staticStackSize = maxOptionalArgsSize 306955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner + MF.getTarget().getFrameInfo().getMinStackFrameSize(); 30789e2da034a02cd33b306b59dbbf607650cca1c4cVikram S. Adve} 30889e2da034a02cd33b306b59dbbf607650cca1c4cVikram S. Adve 30989e2da034a02cd33b306b59dbbf607650cca1c4cVikram S. Adveint 310955fad1f99dd174023a1b2e6a1795958147b077dChris LattnerMachineFunctionInfo::computeOffsetforLocalVar(const Value* val, 311955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner unsigned &getPaddedSize, 312955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner unsigned sizeToUse) 31389e2da034a02cd33b306b59dbbf607650cca1c4cVikram S. Adve{ 314e4e4d4e2f9d49855712f6dc9e785d5d9416f0dabVikram S. Adve if (sizeToUse == 0) 315955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner sizeToUse = MF.getTarget().findOptimalStorageSize(val->getType()); 316955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner unsigned align = SizeToAlignment(sizeToUse, MF.getTarget()); 3171318bed20c52792913405c0d41766f69829cf944Vikram S. Adve 3181318bed20c52792913405c0d41766f69829cf944Vikram S. Adve bool growUp; 319955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner int firstOffset = MF.getTarget().getFrameInfo().getFirstAutomaticVarOffset(MF, 320955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner growUp); 3211318bed20c52792913405c0d41766f69829cf944Vikram S. Adve int offset = growUp? firstOffset + getAutomaticVarsSize() 3221318bed20c52792913405c0d41766f69829cf944Vikram S. Adve : firstOffset - (getAutomaticVarsSize() + sizeToUse); 3231318bed20c52792913405c0d41766f69829cf944Vikram S. Adve 324955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner int aligned = MF.getTarget().getFrameInfo().adjustAlignment(offset, growUp, align); 3251318bed20c52792913405c0d41766f69829cf944Vikram S. Adve getPaddedSize = sizeToUse + abs(aligned - offset); 3261318bed20c52792913405c0d41766f69829cf944Vikram S. Adve 3271318bed20c52792913405c0d41766f69829cf944Vikram S. Adve return aligned; 328f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner} 329f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 330f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattnerint 331955fad1f99dd174023a1b2e6a1795958147b077dChris LattnerMachineFunctionInfo::allocateLocalVar(const Value* val, 332955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner unsigned sizeToUse) 333f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner{ 33403d33bd2640806ce8e661acf7bcfa3726a14d606Vikram S. Adve assert(! automaticVarsAreaFrozen && 33503d33bd2640806ce8e661acf7bcfa3726a14d606Vikram S. Adve "Size of auto vars area has been used to compute an offset so " 33603d33bd2640806ce8e661acf7bcfa3726a14d606Vikram S. Adve "no more automatic vars should be allocated!"); 33703d33bd2640806ce8e661acf7bcfa3726a14d606Vikram S. Adve 338f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner // Check if we've allocated a stack slot for this value already 339f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner // 340f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner int offset = getOffset(val); 341f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner if (offset == INVALID_FRAME_OFFSET) 342f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner { 343955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner unsigned getPaddedSize; 344955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner offset = computeOffsetforLocalVar(val, getPaddedSize, sizeToUse); 345f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner offsets[val] = offset; 346e4e4d4e2f9d49855712f6dc9e785d5d9416f0dabVikram S. Adve incrementAutomaticVarsSize(getPaddedSize); 347f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner } 348f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner return offset; 349f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner} 3501318bed20c52792913405c0d41766f69829cf944Vikram S. Adve 351f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattnerint 352955fad1f99dd174023a1b2e6a1795958147b077dChris LattnerMachineFunctionInfo::allocateSpilledValue(const Type* type) 353f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner{ 35403d33bd2640806ce8e661acf7bcfa3726a14d606Vikram S. Adve assert(! spillsAreaFrozen && 35503d33bd2640806ce8e661acf7bcfa3726a14d606Vikram S. Adve "Size of reg spills area has been used to compute an offset so " 35603d33bd2640806ce8e661acf7bcfa3726a14d606Vikram S. Adve "no more register spill slots should be allocated!"); 35703d33bd2640806ce8e661acf7bcfa3726a14d606Vikram S. Adve 358955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner unsigned size = MF.getTarget().getTargetData().getTypeSize(type); 359955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner unsigned char align = MF.getTarget().getTargetData().getTypeAlignment(type); 360f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 361f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner bool growUp; 362955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner int firstOffset = MF.getTarget().getFrameInfo().getRegSpillAreaOffset(MF, growUp); 363f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 3641318bed20c52792913405c0d41766f69829cf944Vikram S. Adve int offset = growUp? firstOffset + getRegSpillsSize() 3651318bed20c52792913405c0d41766f69829cf944Vikram S. Adve : firstOffset - (getRegSpillsSize() + size); 3661318bed20c52792913405c0d41766f69829cf944Vikram S. Adve 367955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner int aligned = MF.getTarget().getFrameInfo().adjustAlignment(offset, growUp, align); 3681318bed20c52792913405c0d41766f69829cf944Vikram S. Adve size += abs(aligned - offset); // include alignment padding in size 369f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 3701318bed20c52792913405c0d41766f69829cf944Vikram S. Adve incrementRegSpillsSize(size); // update size of reg. spills area 3711318bed20c52792913405c0d41766f69829cf944Vikram S. Adve 3721318bed20c52792913405c0d41766f69829cf944Vikram S. Adve return aligned; 373f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner} 374f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 375f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattnerint 376955fad1f99dd174023a1b2e6a1795958147b077dChris LattnerMachineFunctionInfo::pushTempValue(unsigned size) 377f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner{ 378955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner unsigned align = SizeToAlignment(size, MF.getTarget()); 3791318bed20c52792913405c0d41766f69829cf944Vikram S. Adve 380f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner bool growUp; 381955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner int firstOffset = MF.getTarget().getFrameInfo().getTmpAreaOffset(MF, growUp); 3821318bed20c52792913405c0d41766f69829cf944Vikram S. Adve 3831318bed20c52792913405c0d41766f69829cf944Vikram S. Adve int offset = growUp? firstOffset + currentTmpValuesSize 3841318bed20c52792913405c0d41766f69829cf944Vikram S. Adve : firstOffset - (currentTmpValuesSize + size); 3851318bed20c52792913405c0d41766f69829cf944Vikram S. Adve 386955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner int aligned = MF.getTarget().getFrameInfo().adjustAlignment(offset, growUp, 387955fad1f99dd174023a1b2e6a1795958147b077dChris Lattner align); 3881318bed20c52792913405c0d41766f69829cf944Vikram S. Adve size += abs(aligned - offset); // include alignment padding in size 3891318bed20c52792913405c0d41766f69829cf944Vikram S. Adve 3901318bed20c52792913405c0d41766f69829cf944Vikram S. Adve incrementTmpAreaSize(size); // update "current" size of tmp area 3911318bed20c52792913405c0d41766f69829cf944Vikram S. Adve 3921318bed20c52792913405c0d41766f69829cf944Vikram S. Adve return aligned; 393f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner} 394f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 395955fad1f99dd174023a1b2e6a1795958147b077dChris Lattnervoid MachineFunctionInfo::popAllTempValues() { 3961318bed20c52792913405c0d41766f69829cf944Vikram S. Adve resetTmpAreaSize(); // clear tmp area to reuse 397f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner} 398f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner 399f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattnerint 400955fad1f99dd174023a1b2e6a1795958147b077dChris LattnerMachineFunctionInfo::getOffset(const Value* val) const 401f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner{ 40209ff1126dab045d68be7d9e8ae7ad0601002a718Chris Lattner hash_map<const Value*, int>::const_iterator pair = offsets.find(val); 4036b9445389a226b4ac97ceb89a34ee1a5bf921714Chris Lattner return (pair == offsets.end()) ? INVALID_FRAME_OFFSET : pair->second; 404f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner} 405