forked from OSchip/llvm-project
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
This commit is contained in:
parent
6722556380
commit
f117a35de0
|
@ -31,8 +31,9 @@ ARMConstantPoolValue::ARMConstantPoolValue(Type *Ty, unsigned id,
|
||||||
unsigned char PCAdj,
|
unsigned char PCAdj,
|
||||||
ARMCP::ARMCPModifier modifier,
|
ARMCP::ARMCPModifier modifier,
|
||||||
bool addCurrentAddress)
|
bool addCurrentAddress)
|
||||||
: MachineConstantPoolValue(Ty), LabelId(id), Kind(kind), PCAdjust(PCAdj),
|
: MachineConstantPoolValue(Ty), S(NULL), LabelId(id), Kind(kind),
|
||||||
Modifier(modifier), AddCurrentAddress(addCurrentAddress) {}
|
PCAdjust(PCAdj), Modifier(modifier),
|
||||||
|
AddCurrentAddress(addCurrentAddress) {}
|
||||||
|
|
||||||
ARMConstantPoolValue::ARMConstantPoolValue(const Constant *cval, unsigned id,
|
ARMConstantPoolValue::ARMConstantPoolValue(const Constant *cval, unsigned id,
|
||||||
ARMCP::ARMCPKind K,
|
ARMCP::ARMCPKind K,
|
||||||
|
@ -176,6 +177,16 @@ void ARMConstantPoolValue::print(raw_ostream &O) const {
|
||||||
// ARMConstantPoolConstant
|
// 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,
|
ARMConstantPoolConstant::ARMConstantPoolConstant(const Constant *C,
|
||||||
unsigned ID,
|
unsigned ID,
|
||||||
ARMCP::ARMCPKind Kind,
|
ARMCP::ARMCPKind Kind,
|
||||||
|
@ -192,6 +203,14 @@ ARMConstantPoolConstant::Create(const Constant *C, unsigned ID) {
|
||||||
ARMCP::no_modifier, false);
|
ARMCP::no_modifier, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 *
|
||||||
ARMConstantPoolConstant::Create(const Constant *C, unsigned ID,
|
ARMConstantPoolConstant::Create(const Constant *C, unsigned ID,
|
||||||
ARMCP::ARMCPKind Kind, unsigned char PCAdj) {
|
ARMCP::ARMCPKind Kind, unsigned char PCAdj) {
|
||||||
|
@ -199,15 +218,50 @@ ARMConstantPoolConstant::Create(const Constant *C, unsigned ID,
|
||||||
ARMCP::no_modifier, false);
|
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 {
|
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) {
|
bool ARMConstantPoolConstant::hasSameValue(ARMConstantPoolValue *ACPV) {
|
||||||
const ARMConstantPoolConstant *ACPC = dyn_cast<ARMConstantPoolConstant>(ACPV);
|
const ARMConstantPoolConstant *ACPC = dyn_cast<ARMConstantPoolConstant>(ACPV);
|
||||||
|
return ACPC && ACPC->CVal == CVal && ARMConstantPoolValue::hasSameValue(ACPV);
|
||||||
return (ACPC ? ACPC->CVal == CVal : true) &&
|
|
||||||
ARMConstantPoolValue::hasSameValue(ACPV);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ARMConstantPoolConstant::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
|
void ARMConstantPoolConstant::addSelectionDAGCSEId(FoldingSetNodeID &ID) {
|
||||||
|
|
|
@ -137,13 +137,31 @@ class ARMConstantPoolConstant : public ARMConstantPoolValue {
|
||||||
unsigned char PCAdj,
|
unsigned char PCAdj,
|
||||||
ARMCP::ARMCPModifier Modifier,
|
ARMCP::ARMCPModifier Modifier,
|
||||||
bool AddCurrentAddress);
|
bool AddCurrentAddress);
|
||||||
|
ARMConstantPoolConstant(Type *Ty, const Constant *C,
|
||||||
|
unsigned ID,
|
||||||
|
ARMCP::ARMCPKind Kind,
|
||||||
|
unsigned char PCAdj,
|
||||||
|
ARMCP::ARMCPModifier Modifier,
|
||||||
|
bool AddCurrentAddress);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static ARMConstantPoolConstant *Create(const Constant *C, unsigned ID);
|
static ARMConstantPoolConstant *Create(const Constant *C, unsigned ID);
|
||||||
|
static ARMConstantPoolConstant *Create(const GlobalValue *GV,
|
||||||
|
ARMCP::ARMCPModifier Modifier);
|
||||||
static ARMConstantPoolConstant *Create(const Constant *C, unsigned ID,
|
static ARMConstantPoolConstant *Create(const Constant *C, unsigned ID,
|
||||||
ARMCP::ARMCPKind Kind,
|
ARMCP::ARMCPKind Kind,
|
||||||
unsigned char PCAdj);
|
unsigned char PCAdj);
|
||||||
|
static ARMConstantPoolConstant *Create(const Constant *C, unsigned ID,
|
||||||
|
ARMCP::ARMCPKind Kind,
|
||||||
|
unsigned char PCAdj,
|
||||||
|
ARMCP::ARMCPModifier Modifier,
|
||||||
|
bool AddCurrentAddress);
|
||||||
|
|
||||||
const GlobalValue *getGV() const;
|
const GlobalValue *getGV() const;
|
||||||
|
const BlockAddress *getBlockAddress() const;
|
||||||
|
|
||||||
|
virtual int getExistingMachineCPValue(MachineConstantPool *CP,
|
||||||
|
unsigned Alignment);
|
||||||
|
|
||||||
/// hasSameValue - Return true if this ARM constpool value can share the same
|
/// hasSameValue - Return true if this ARM constpool value can share the same
|
||||||
/// constantpool entry as another ARM constpool value.
|
/// constantpool entry as another ARM constpool value.
|
||||||
|
|
Loading…
Reference in New Issue