@@ -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
156159namespace {
@@ -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-
199196DataLayout::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
205205DataLayout::DataLayout (StringRef LayoutString) : DataLayout() {
206206 if (Error Err = parseLayoutString (LayoutString))
@@ -231,15 +231,6 @@ DataLayout &DataLayout::operator=(const DataLayout &Other) {
231231
232232bool 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
258249Expected<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
829804StringRef DataLayout::getAddressSpaceName (unsigned AS) const {
830- const PointerSpec &PS = getPointerSpec (AS);
831- return PS.getAddrSpaceName (*this );
805+ return getPointerSpec (AS).AddrSpaceName ;
832806}
833807
834808std::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