Skip to content

Commit 36f457e

Browse files
committed
Review feedback: use std::string for AddrSpaceName
1 parent 7ba46b8 commit 36f457e

File tree

2 files changed

+23
-54
lines changed

2 files changed

+23
-54
lines changed

llvm/include/llvm/IR/DataLayout.h

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -93,15 +93,10 @@ class DataLayout {
9393
/// of this would be CHERI capabilities where the validity bit is stored
9494
/// separately from the pointer address+bounds information.
9595
bool HasExternalState;
96-
// Symbolic name of the address space. We can store a StringRef here
97-
// directly (backed by StringRepresentation) but then the copy construtor
98-
// for DataLayout has to be updated to redirect these StringRefs to the new
99-
// copy of StringRepresentation. To avoid that, we store just the offset and
100-
// size of the address space name within the StringRepresentation.
101-
size_t AddrSpaceNameOffset;
102-
size_t AddrSpaceNameSize;
103-
104-
StringRef getAddrSpaceName(const DataLayout &DL) const;
96+
// Symbolic name of the address space.
97+
std::string AddrSpaceName;
98+
99+
LLVM_ABI bool operator==(const PointerSpec &Other) const;
105100
};
106101

107102
enum class FunctionPtrAlignType {

llvm/lib/IR/DataLayout.cpp

Lines changed: 19 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -147,10 +147,13 @@ bool DataLayout::PrimitiveSpec::operator==(const PrimitiveSpec &Other) const {
147147
PrefAlign == Other.PrefAlign;
148148
}
149149

150-
StringRef
151-
DataLayout::PointerSpec::getAddrSpaceName(const DataLayout &DL) const {
152-
return StringRef(DL.StringRepresentation)
153-
.substr(AddrSpaceNameOffset, AddrSpaceNameSize);
150+
bool DataLayout::PointerSpec::operator==(const PointerSpec &Other) const {
151+
return AddrSpace == Other.AddrSpace && BitWidth == Other.BitWidth &&
152+
ABIAlign == Other.ABIAlign && PrefAlign == Other.PrefAlign &&
153+
IndexBitWidth == Other.IndexBitWidth &&
154+
HasUnstableRepresentation == Other.HasUnstableRepresentation &&
155+
HasExternalState == Other.HasExternalState &&
156+
AddrSpaceName == Other.AddrSpaceName;
154157
}
155158

156159
namespace {
@@ -190,17 +193,14 @@ constexpr DataLayout::PrimitiveSpec DefaultVectorSpecs[] = {
190193
{128, Align::Constant<16>(), Align::Constant<16>()}, // v128:128:128
191194
};
192195

193-
// Default pointer type specifications.
194-
constexpr DataLayout::PointerSpec DefaultPointerSpecs[] = {
195-
// p0:64:64:64:64
196-
{0, 64, Align::Constant<8>(), Align::Constant<8>(), 64, false, false, 0, 0},
197-
};
198-
199196
DataLayout::DataLayout()
200197
: IntSpecs(ArrayRef(DefaultIntSpecs)),
201198
FloatSpecs(ArrayRef(DefaultFloatSpecs)),
202-
VectorSpecs(ArrayRef(DefaultVectorSpecs)),
203-
PointerSpecs(ArrayRef(DefaultPointerSpecs)) {}
199+
VectorSpecs(ArrayRef(DefaultVectorSpecs)) {
200+
// Default pointer type specifications.
201+
setPointerSpec(0, 64, Align::Constant<8>(), Align::Constant<8>(), 64, false,
202+
false, "");
203+
}
204204

205205
DataLayout::DataLayout(StringRef LayoutString) : DataLayout() {
206206
if (Error Err = parseLayoutString(LayoutString))
@@ -231,15 +231,6 @@ DataLayout &DataLayout::operator=(const DataLayout &Other) {
231231

232232
bool DataLayout::operator==(const DataLayout &Other) const {
233233
// NOTE: StringRepresentation might differ, it is not canonicalized.
234-
auto IsPointerSpecEqual = [this, &Other](const PointerSpec &A,
235-
const PointerSpec &B) {
236-
return A.AddrSpace == B.AddrSpace && A.BitWidth == B.BitWidth &&
237-
A.ABIAlign == B.ABIAlign && A.PrefAlign == B.PrefAlign &&
238-
A.IndexBitWidth == B.IndexBitWidth &&
239-
A.HasUnstableRepresentation == B.HasUnstableRepresentation &&
240-
A.HasExternalState == B.HasExternalState &&
241-
A.getAddrSpaceName(*this) == B.getAddrSpaceName(Other);
242-
};
243234
return BigEndian == Other.BigEndian &&
244235
AllocaAddrSpace == Other.AllocaAddrSpace &&
245236
ProgramAddrSpace == Other.ProgramAddrSpace &&
@@ -250,9 +241,9 @@ bool DataLayout::operator==(const DataLayout &Other) const {
250241
ManglingMode == Other.ManglingMode &&
251242
LegalIntWidths == Other.LegalIntWidths && IntSpecs == Other.IntSpecs &&
252243
FloatSpecs == Other.FloatSpecs && VectorSpecs == Other.VectorSpecs &&
244+
PointerSpecs == Other.PointerSpecs &&
253245
StructABIAlignment == Other.StructABIAlignment &&
254-
StructPrefAlignment == Other.StructPrefAlignment &&
255-
llvm::equal(PointerSpecs, Other.PointerSpecs, IsPointerSpecEqual);
246+
StructPrefAlignment == Other.StructPrefAlignment;
256247
}
257248

258249
Expected<DataLayout> DataLayout::parse(StringRef LayoutString) {
@@ -751,34 +742,18 @@ void DataLayout::setPointerSpec(uint32_t AddrSpace, uint32_t BitWidth,
751742
bool HasExternalState,
752743
StringRef AddrSpaceName) {
753744
auto I = lower_bound(PointerSpecs, AddrSpace, LessPointerAddrSpace());
754-
size_t AddrSpaceNameOffset = 0, AddrSpaceNameSize = AddrSpaceName.size();
755-
if (!AddrSpaceName.empty()) {
756-
// Validate that AddrSpaceName points to data within the
757-
// StringRepresentation.
758-
const char *RepStart = StringRepresentation.data();
759-
const char *ASStart = AddrSpaceName.data();
760-
[[maybe_unused]] const char *RepEnd =
761-
RepStart + StringRepresentation.size();
762-
[[maybe_unused]] const char *ASEnd = ASStart + AddrSpaceNameSize;
763-
764-
assert(RepStart <= ASStart && ASStart < RepEnd && RepStart < ASEnd &&
765-
ASEnd <= RepEnd);
766-
AddrSpaceNameOffset = std::distance(RepStart, ASStart);
767-
}
768745
if (I == PointerSpecs.end() || I->AddrSpace != AddrSpace) {
769746
PointerSpecs.insert(I, PointerSpec{AddrSpace, BitWidth, ABIAlign, PrefAlign,
770747
IndexBitWidth, HasUnstableRepr,
771-
HasExternalState, AddrSpaceNameOffset,
772-
AddrSpaceNameSize});
748+
HasExternalState, AddrSpaceName.str()});
773749
} else {
774750
I->BitWidth = BitWidth;
775751
I->ABIAlign = ABIAlign;
776752
I->PrefAlign = PrefAlign;
777753
I->IndexBitWidth = IndexBitWidth;
778754
I->HasUnstableRepresentation = HasUnstableRepr;
779755
I->HasExternalState = HasExternalState;
780-
I->AddrSpaceNameOffset = AddrSpaceNameOffset;
781-
I->AddrSpaceNameSize = AddrSpaceNameSize;
756+
I->AddrSpaceName = AddrSpaceName.str();
782757
}
783758
}
784759

@@ -827,13 +802,12 @@ Align DataLayout::getPointerABIAlignment(unsigned AS) const {
827802
}
828803

829804
StringRef DataLayout::getAddressSpaceName(unsigned AS) const {
830-
const PointerSpec &PS = getPointerSpec(AS);
831-
return PS.getAddrSpaceName(*this);
805+
return getPointerSpec(AS).AddrSpaceName;
832806
}
833807

834808
std::optional<unsigned> DataLayout::getNamedAddressSpace(StringRef Name) const {
835-
auto II = llvm::find_if(PointerSpecs, [Name, this](const PointerSpec &PS) {
836-
return PS.getAddrSpaceName(*this) == Name;
809+
auto II = llvm::find_if(PointerSpecs, [Name](const PointerSpec &PS) {
810+
return PS.AddrSpaceName == Name;
837811
});
838812
if (II != PointerSpecs.end())
839813
return II->AddrSpace;

0 commit comments

Comments
 (0)