From 3801f6d38371b734d9de2fb8394ca75d2bf190eb Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 3 Feb 2002 07:46:01 +0000 Subject: [PATCH] * Prune #includes * Remove MachineCodeFor(Method|VMInstr) code to their own .cpp files git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1649 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/MachineInstr.cpp | 260 +---------------------------------- 1 file changed, 1 insertion(+), 259 deletions(-) diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp index ccb52c2c981..bb22008f952 100644 --- a/lib/CodeGen/MachineInstr.cpp +++ b/lib/CodeGen/MachineInstr.cpp @@ -12,20 +12,11 @@ // 7/2/01 - Vikram Adve - Created //**************************************************************************/ - #include "llvm/CodeGen/MachineInstr.h" -#include "llvm/Target/MachineFrameInfo.h" -#include "llvm/Target/MachineRegInfo.h" -#include "llvm/Target/MachineCacheInfo.h" -#include "llvm/Method.h" -#include "llvm/iOther.h" -#include "llvm/Instruction.h" +#include "llvm/Value.h" #include using std::cerr; -AnnotationID MachineCodeForMethod::AID( - AnnotationManager::getID("MachineCodeForMethodAnnotation")); - //************************ Class Implementations **************************/ @@ -188,252 +179,3 @@ std::ostream &operator<<(std::ostream &os, const MachineOperand &mop) return os; } - -// Align data larger than one L1 cache line on L1 cache line boundaries. -// Align all smaller data on the next higher 2^x boundary (4, 8, ...). -// -// THIS FUNCTION HAS BEEN COPIED FROM EMITASSEMBLY.CPP AND -// SHOULD BE USED DIRECTLY THERE -// -inline unsigned int -SizeToAlignment(unsigned int size, const TargetMachine& target) -{ - unsigned short cacheLineSize = target.getCacheInfo().getCacheLineSize(1); - if (size > (unsigned) cacheLineSize / 2) - return cacheLineSize; - else - for (unsigned sz=1; /*no condition*/; sz *= 2) - if (sz >= size) - return sz; -} - -static unsigned int -ComputeMaxOptionalArgsSize(const TargetMachine& target, const Method* method) -{ - const MachineFrameInfo& frameInfo = target.getFrameInfo(); - - unsigned int maxSize = 0; - - for (Method::const_inst_iterator I=method->inst_begin(),E=method->inst_end(); - I != E; ++I) - if ((*I)->getOpcode() == Instruction::Call) - { - CallInst* callInst = cast(*I); - unsigned int numOperands = callInst->getNumOperands() - 1; - int numExtra = (int) numOperands - frameInfo.getNumFixedOutgoingArgs(); - if (numExtra <= 0) - continue; - - unsigned int sizeForThisCall; - if (frameInfo.argsOnStackHaveFixedSize()) - { - int argSize = frameInfo.getSizeOfEachArgOnStack(); - sizeForThisCall = numExtra * (unsigned) argSize; - } - else - { - assert(0 && "UNTESTED CODE: Size per stack argument is not fixed on this architecture: use actual arg sizes to compute MaxOptionalArgsSize"); - sizeForThisCall = 0; - for (unsigned i=0; i < numOperands; ++i) - sizeForThisCall += target.findOptimalStorageSize(callInst-> - getOperand(i)->getType()); - } - - if (maxSize < sizeForThisCall) - maxSize = sizeForThisCall; - } - - return maxSize; -} - - -/*ctor*/ -MachineCodeForMethod::MachineCodeForMethod(const Method* _M, - const TargetMachine& target) - : Annotation(AID), - method(_M), compiledAsLeaf(false), staticStackSize(0), - automaticVarsSize(0), regSpillsSize(0), - currentOptionalArgsSize(0), maxOptionalArgsSize(0), - currentTmpValuesSize(0) -{ - maxOptionalArgsSize = ComputeMaxOptionalArgsSize(target, method); - staticStackSize = maxOptionalArgsSize + - target.getFrameInfo().getMinStackFrameSize(); -} - -int -MachineCodeForMethod::allocateLocalVar(const TargetMachine& target, - const Value* val, - unsigned int size) -{ - // Check if we've allocated a stack slot for this value already - // - int offset = getOffset(val); - if (offset == INVALID_FRAME_OFFSET) - { - bool growUp; - int firstOffset =target.getFrameInfo().getFirstAutomaticVarOffset(*this, - growUp); - unsigned char align; - if (size == 0) - { - size = target.findOptimalStorageSize(val->getType()); - // align = target.DataLayout.getTypeAlignment(val->getType()); - } - - align = SizeToAlignment(size, target); - - offset = getAutomaticVarsSize(); - if (! growUp) - offset += size; - - if (unsigned int mod = offset % align) - { - offset += align - mod; - size += align - mod; - } - - offset = growUp? firstOffset + offset - : firstOffset - offset; - - offsets[val] = offset; - - incrementAutomaticVarsSize(size); - } - return offset; -} - -int -MachineCodeForMethod::allocateSpilledValue(const TargetMachine& target, - const Type* type) -{ - unsigned int size = target.findOptimalStorageSize(type); - unsigned char align = target.DataLayout.getTypeAlignment(type); - - bool growUp; - int firstOffset = target.getFrameInfo().getRegSpillAreaOffset(*this, growUp); - - int offset = getRegSpillsSize(); - if (! growUp) - offset += size; - - if (unsigned int mod = offset % align) - { - offset += align - mod; - size += align - mod; - } - - offset = growUp? firstOffset + offset - : firstOffset - offset; - - incrementRegSpillsSize(size); - - return offset; -} - -int -MachineCodeForMethod::allocateOptionalArg(const TargetMachine& target, - const Type* type) -{ - const MachineFrameInfo& frameInfo = target.getFrameInfo(); - - int size = MAXINT; - if (frameInfo.argsOnStackHaveFixedSize()) - size = frameInfo.getSizeOfEachArgOnStack(); - else - { - size = target.findOptimalStorageSize(type); - assert(0 && "UNTESTED CODE: Size per stack argument is not fixed on this architecture: use actual argument sizes for computing optional arg offsets"); - } - unsigned char align = target.DataLayout.getTypeAlignment(type); - - bool growUp; - int firstOffset = frameInfo.getFirstOptionalOutgoingArgOffset(*this, growUp); - - int offset = getCurrentOptionalArgsSize(); - if (! growUp) - offset += size; - - if (unsigned int mod = offset % align) - { - offset += align - mod; - size += align - mod; - } - - offset = growUp? firstOffset + offset - : firstOffset - offset; - - incrementCurrentOptionalArgsSize(size); - - return offset; -} - -void -MachineCodeForMethod::resetOptionalArgs(const TargetMachine& target) -{ - currentOptionalArgsSize = 0; -} - -int -MachineCodeForMethod::pushTempValue(const TargetMachine& target, - unsigned int size) -{ - // Compute a power-of-2 alignment according to the possible sizes, - // but not greater than the alignment of the largest type we support - // (currently a double word -- see class TargetData). - unsigned char align = 1; - for (; align < size && align < target.DataLayout.getDoubleAlignment(); - align = 2*align) - ; - - bool growUp; - int firstTmpOffset = target.getFrameInfo().getTmpAreaOffset(*this, growUp); - - int offset = currentTmpValuesSize; - if (! growUp) - offset += size; - - if (unsigned int mod = offset % align) - { - offset += align - mod; - size += align - mod; - } - - offset = growUp ? firstTmpOffset + offset : firstTmpOffset - offset; - - currentTmpValuesSize += size; - return offset; -} - -void -MachineCodeForMethod::popAllTempValues(const TargetMachine& target) -{ - currentTmpValuesSize = 0; -} - -int -MachineCodeForMethod::getOffset(const Value* val) const -{ - std::hash_map::const_iterator pair = offsets.find(val); - return (pair == offsets.end())? INVALID_FRAME_OFFSET : pair->second; -} - -void -MachineCodeForMethod::dump() const -{ - cerr << "\n" << method->getReturnType() - << " \"" << method->getName() << "\"\n"; - - for (Method::const_iterator BI = method->begin(); BI != method->end(); ++BI) - { - BasicBlock* bb = *BI; - cerr << "\n" - << (bb->hasName()? bb->getName() : "Label") - << " (" << bb << ")" << ":\n"; - - MachineCodeForBasicBlock& mvec = bb->getMachineInstrVec(); - for (unsigned i=0; i < mvec.size(); i++) - cerr << "\t" << *mvec[i]; - } - cerr << "\nEnd method \"" << method->getName() << "\"\n\n"; -}