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