diff options
author | Bill Wendling <isanbard@gmail.com> | 2011-10-01 07:52:37 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2011-10-01 07:52:37 +0000 |
commit | f117a35de0720a0e44b1418e6da29e86435205a8 (patch) | |
tree | 2961d71c8913d91787b77e9141423879229fa5b0 /llvm/lib/Target/ARM/ARMConstantPoolValue.cpp | |
parent | 6722556380652fd17f9b519510c20e9e3c4ad14e (diff) | |
download | bcm5719-llvm-f117a35de0720a0e44b1418e6da29e86435205a8.tar.gz bcm5719-llvm-f117a35de0720a0e44b1418e6da29e86435205a8.zip |
Some more refactoring.
* Add a couple of Create methods to the ARMConstantPoolConstant class,
* Add its own version of getExistingMachineCPValue, and
* Modify hasSameValue to return false if the object isn't an ARMConstantPoolConstant.
llvm-svn: 140935
Diffstat (limited to 'llvm/lib/Target/ARM/ARMConstantPoolValue.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMConstantPoolValue.cpp | 66 |
1 files changed, 60 insertions, 6 deletions
diff --git a/llvm/lib/Target/ARM/ARMConstantPoolValue.cpp b/llvm/lib/Target/ARM/ARMConstantPoolValue.cpp index bca165b36eb..8a4e555367e 100644 --- a/llvm/lib/Target/ARM/ARMConstantPoolValue.cpp +++ b/llvm/lib/Target/ARM/ARMConstantPoolValue.cpp @@ -31,8 +31,9 @@ ARMConstantPoolValue::ARMConstantPoolValue(Type *Ty, unsigned id, unsigned char PCAdj, ARMCP::ARMCPModifier modifier, bool addCurrentAddress) - : MachineConstantPoolValue(Ty), LabelId(id), Kind(kind), PCAdjust(PCAdj), - Modifier(modifier), AddCurrentAddress(addCurrentAddress) {} + : MachineConstantPoolValue(Ty), S(NULL), LabelId(id), Kind(kind), + PCAdjust(PCAdj), Modifier(modifier), + AddCurrentAddress(addCurrentAddress) {} ARMConstantPoolValue::ARMConstantPoolValue(const Constant *cval, unsigned id, ARMCP::ARMCPKind K, @@ -176,6 +177,16 @@ void ARMConstantPoolValue::print(raw_ostream &O) const { // ARMConstantPoolConstant //===----------------------------------------------------------------------===// +ARMConstantPoolConstant::ARMConstantPoolConstant(Type *Ty, + const Constant *C, + unsigned ID, + ARMCP::ARMCPKind Kind, + unsigned char PCAdj, + ARMCP::ARMCPModifier Modifier, + bool AddCurrentAddress) + : ARMConstantPoolValue(Ty, ID, Kind, PCAdj, Modifier, AddCurrentAddress), + CVal(C) {} + ARMConstantPoolConstant::ARMConstantPoolConstant(const Constant *C, unsigned ID, ARMCP::ARMCPKind Kind, @@ -193,21 +204,64 @@ ARMConstantPoolConstant::Create(const Constant *C, unsigned ID) { } ARMConstantPoolConstant * +ARMConstantPoolConstant::Create(const GlobalValue *GV, + ARMCP::ARMCPModifier Modifier) { + return new ARMConstantPoolConstant((Type*)Type::getInt32Ty(GV->getContext()), + GV, 0, ARMCP::CPValue, 0, + Modifier, false); +} + +ARMConstantPoolConstant * ARMConstantPoolConstant::Create(const Constant *C, unsigned ID, ARMCP::ARMCPKind Kind, unsigned char PCAdj) { return new ARMConstantPoolConstant(C, ID, Kind, PCAdj, ARMCP::no_modifier, false); } +ARMConstantPoolConstant * +ARMConstantPoolConstant::Create(const Constant *C, unsigned ID, + ARMCP::ARMCPKind Kind, unsigned char PCAdj, + ARMCP::ARMCPModifier Modifier, + bool AddCurrentAddress) { + return new ARMConstantPoolConstant(C, ID, Kind, PCAdj, Modifier, + AddCurrentAddress); +} + const GlobalValue *ARMConstantPoolConstant::getGV() const { - return dyn_cast<GlobalValue>(CVal); + return dyn_cast_or_null<GlobalValue>(CVal); +} + +const BlockAddress *ARMConstantPoolConstant::getBlockAddress() const { + return dyn_cast_or_null<BlockAddress>(CVal); +} + +int ARMConstantPoolConstant::getExistingMachineCPValue(MachineConstantPool *CP, + unsigned Alignment) { + unsigned AlignMask = Alignment - 1; + const std::vector<MachineConstantPoolEntry> Constants = CP->getConstants(); + for (unsigned i = 0, e = Constants.size(); i != e; ++i) { + if (Constants[i].isMachineConstantPoolEntry() && + (Constants[i].getAlignment() & AlignMask) == 0) { + ARMConstantPoolValue *CPV = + (ARMConstantPoolValue *)Constants[i].Val.MachineCPVal; + ARMConstantPoolConstant *APC = dyn_cast<ARMConstantPoolConstant>(CPV); + if (!APC) continue; + + if (APC->getGV() == this->CVal && + APC->getLabelId() == this->getLabelId() && + APC->getPCAdjustment() == this->getPCAdjustment() && + CPV_streq(APC->getSymbol(), this->getSymbol()) && + APC->getModifier() == this->getModifier()) + return i; + } + } + + return -1; } bool ARMConstantPoolConstant::hasSameValue(ARMConstantPoolValue *ACPV) { const ARMConstantPoolConstant *ACPC = dyn_cast<ARMConstantPoolConstant>(ACPV); - - return (ACPC ? ACPC->CVal == CVal : true) && - ARMConstantPoolValue::hasSameValue(ACPV); + return ACPC && ACPC->CVal == CVal && ARMConstantPoolValue::hasSameValue(ACPV); } void ARMConstantPoolConstant::addSelectionDAGCSEId(FoldingSetNodeID &ID) { |