Use a sorted array to store the information about a few address spaces.

We don't have any test with more than 6 address spaces, so a DenseMap is
probably not the correct answer.

An unsorted array would also be OK, but we have to sort it for printing anyway.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202275 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2014-02-26 16:58:35 +00:00
parent 3c4c95e522
commit e3561972d4
2 changed files with 44 additions and 33 deletions

View File

@ -115,7 +115,14 @@ private:
/// pointers vs. 64-bit pointers by extending LayoutAlignment, but for now, /// pointers vs. 64-bit pointers by extending LayoutAlignment, but for now,
/// we don't. /// we don't.
SmallVector<LayoutAlignElem, 16> Alignments; SmallVector<LayoutAlignElem, 16> Alignments;
DenseMap<unsigned, PointerAlignElem> Pointers; typedef SmallVector<PointerAlignElem, 8> PointersTy;
PointersTy Pointers;
PointersTy::const_iterator findPoiterLowerBound(uint32_t AddressSpace) const {
return const_cast<DataLayout *>(this)->findPoiterLowerBound(AddressSpace);
}
PointersTy::iterator findPoiterLowerBound(uint32_t AddressSpace);
/// InvalidAlignmentElem - This member is a signal that a requested alignment /// InvalidAlignmentElem - This member is a signal that a requested alignment
/// type and bit width were not found in the SmallVector. /// type and bit width were not found in the SmallVector.

View File

@ -374,18 +374,29 @@ DataLayout::setAlignment(AlignTypeEnum align_type, unsigned abi_align,
pref_align, bit_width)); pref_align, bit_width));
} }
static bool comparePointerAlignElem(const PointerAlignElem &A,
uint32_t AddressSpace) {
return A.AddressSpace < AddressSpace;
}
DataLayout::PointersTy::iterator
DataLayout::findPoiterLowerBound(uint32_t AddressSpace) {
return std::lower_bound(Pointers.begin(), Pointers.end(), AddressSpace,
comparePointerAlignElem);
}
void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign, void DataLayout::setPointerAlignment(uint32_t AddrSpace, unsigned ABIAlign,
unsigned PrefAlign, unsigned PrefAlign,
uint32_t TypeByteWidth) { uint32_t TypeByteWidth) {
assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!"); assert(ABIAlign <= PrefAlign && "Preferred alignment worse than ABI!");
DenseMap<unsigned,PointerAlignElem>::iterator val = Pointers.find(AddrSpace); PointersTy::iterator I = findPoiterLowerBound(AddrSpace);
if (val == Pointers.end()) { if (I == Pointers.end() || I->AddressSpace != AddrSpace) {
Pointers[AddrSpace] = Pointers.insert(I, PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign,
PointerAlignElem::get(AddrSpace, ABIAlign, PrefAlign, TypeByteWidth); TypeByteWidth));
} else { } else {
val->second.ABIAlign = ABIAlign; I->ABIAlign = ABIAlign;
val->second.PrefAlign = PrefAlign; I->PrefAlign = PrefAlign;
val->second.TypeByteWidth = TypeByteWidth; I->TypeByteWidth = TypeByteWidth;
} }
} }
@ -529,19 +540,9 @@ std::string DataLayout::getStringRepresentation() const {
break; break;
} }
SmallVector<unsigned, 8> addrSpaces; for (PointersTy::const_iterator I = Pointers.begin(), E = Pointers.end();
// Lets get all of the known address spaces and sort them I != E; ++I) {
// into increasing order so that we can emit the string const PointerAlignElem &PI = *I;
// in a cleaner format.
for (DenseMap<unsigned, PointerAlignElem>::const_iterator
pib = Pointers.begin(), pie = Pointers.end();
pib != pie; ++pib) {
addrSpaces.push_back(pib->first);
}
std::sort(addrSpaces.begin(), addrSpaces.end());
for (SmallVectorImpl<unsigned>::iterator asb = addrSpaces.begin(),
ase = addrSpaces.end(); asb != ase; ++asb) {
const PointerAlignElem &PI = Pointers.find(*asb)->second;
// Skip default. // Skip default.
if (PI.AddressSpace == 0 && PI.ABIAlign == 8 && PI.PrefAlign == 8 && if (PI.AddressSpace == 0 && PI.ABIAlign == 8 && PI.PrefAlign == 8 &&
@ -586,27 +587,30 @@ std::string DataLayout::getStringRepresentation() const {
} }
unsigned DataLayout::getPointerABIAlignment(unsigned AS) const { unsigned DataLayout::getPointerABIAlignment(unsigned AS) const {
DenseMap<unsigned, PointerAlignElem>::const_iterator val = Pointers.find(AS); PointersTy::const_iterator I = findPoiterLowerBound(AS);
if (val == Pointers.end()) { if (I == Pointers.end() || I->AddressSpace != AS) {
val = Pointers.find(0); I = findPoiterLowerBound(0);
assert(I->AddressSpace == 0);
} }
return val->second.ABIAlign; return I->ABIAlign;
} }
unsigned DataLayout::getPointerPrefAlignment(unsigned AS) const { unsigned DataLayout::getPointerPrefAlignment(unsigned AS) const {
DenseMap<unsigned, PointerAlignElem>::const_iterator val = Pointers.find(AS); PointersTy::const_iterator I = findPoiterLowerBound(AS);
if (val == Pointers.end()) { if (I == Pointers.end() || I->AddressSpace != AS) {
val = Pointers.find(0); I = findPoiterLowerBound(0);
assert(I->AddressSpace == 0);
} }
return val->second.PrefAlign; return I->PrefAlign;
} }
unsigned DataLayout::getPointerSize(unsigned AS) const { unsigned DataLayout::getPointerSize(unsigned AS) const {
DenseMap<unsigned, PointerAlignElem>::const_iterator val = Pointers.find(AS); PointersTy::const_iterator I = findPoiterLowerBound(AS);
if (val == Pointers.end()) { if (I == Pointers.end() || I->AddressSpace != AS) {
val = Pointers.find(0); I = findPoiterLowerBound(0);
assert(I->AddressSpace == 0);
} }
return val->second.TypeByteWidth; return I->TypeByteWidth;
} }
unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const { unsigned DataLayout::getPointerTypeSizeInBits(Type *Ty) const {