Skip to content

Commit ecb1d84

Browse files
committed
OffloadBinary: Switch to MapVector<StringRef, StringRef> to stabilize iteration order
D122069 incorrectly uses StringMap iteration order (https://llvm.org/docs/ProgrammersManual.html#llvm-adt-stringmap-h). Switch to MapVector.
1 parent 76d94d3 commit ecb1d84

File tree

5 files changed

+13
-16
lines changed

5 files changed

+13
-16
lines changed

llvm/include/llvm/Object/OffloadBinary.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#ifndef LLVM_OBJECT_OFFLOADBINARY_H
1818
#define LLVM_OBJECT_OFFLOADBINARY_H
1919

20-
#include "llvm/ADT/StringMap.h"
20+
#include "llvm/ADT/MapVector.h"
2121
#include "llvm/ADT/StringRef.h"
2222
#include "llvm/Object/Binary.h"
2323
#include "llvm/Support/Error.h"
@@ -59,7 +59,7 @@ enum ImageKind : uint16_t {
5959
/// offsets from the beginning of the file.
6060
class OffloadBinary : public Binary {
6161
public:
62-
using string_iterator = StringMap<StringRef>::const_iterator;
62+
using string_iterator = MapVector<StringRef, StringRef>::const_iterator;
6363
using string_iterator_range = iterator_range<string_iterator>;
6464

6565
/// The current version of the binary used for backwards compatibility.
@@ -70,7 +70,7 @@ class OffloadBinary : public Binary {
7070
ImageKind TheImageKind;
7171
OffloadKind TheOffloadKind;
7272
uint32_t Flags;
73-
StringMap<StringRef> StringData;
73+
MapVector<StringRef, StringRef> StringData;
7474
std::unique_ptr<MemoryBuffer> Image;
7575
};
7676

@@ -142,7 +142,7 @@ class OffloadBinary : public Binary {
142142
OffloadBinary(const OffloadBinary &Other) = delete;
143143

144144
/// Map from keys to offsets in the binary.
145-
StringMap<StringRef> StringData;
145+
MapVector<StringRef, StringRef> StringData;
146146
/// Raw pointer to the MemoryBufferRef for convenience.
147147
const char *Buffer;
148148
/// Location of the header within the binary.

llvm/lib/Object/OffloadBinary.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,8 @@ OffloadBinary::write(const OffloadingImage &OffloadingData) {
209209
// Create a null-terminated string table with all the used strings.
210210
StringTableBuilder StrTab(StringTableBuilder::ELF);
211211
for (auto &KeyAndValue : OffloadingData.StringData) {
212-
StrTab.add(KeyAndValue.getKey());
213-
StrTab.add(KeyAndValue.getValue());
212+
StrTab.add(KeyAndValue.first);
213+
StrTab.add(KeyAndValue.second);
214214
}
215215
StrTab.finalize();
216216

@@ -250,8 +250,8 @@ OffloadBinary::write(const OffloadingImage &OffloadingData) {
250250
OS << StringRef(reinterpret_cast<char *>(&TheEntry), sizeof(Entry));
251251
for (auto &KeyAndValue : OffloadingData.StringData) {
252252
uint64_t Offset = sizeof(Header) + sizeof(Entry) + StringEntrySize;
253-
StringEntry Map{Offset + StrTab.getOffset(KeyAndValue.getKey()),
254-
Offset + StrTab.getOffset(KeyAndValue.getValue())};
253+
StringEntry Map{Offset + StrTab.getOffset(KeyAndValue.first),
254+
Offset + StrTab.getOffset(KeyAndValue.second)};
255255
OS << StringRef(reinterpret_cast<char *>(&Map), sizeof(StringEntry));
256256
}
257257
StrTab.write(OS);

llvm/lib/ObjectYAML/OffloadEmitter.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,9 @@ bool yaml2offload(Binary &Doc, raw_ostream &Out, ErrorHandler EH) {
2828
if (Member.Flags)
2929
Image.Flags = *Member.Flags;
3030

31-
StringMap<StringRef> &StringData = Image.StringData;
32-
if (Member.StringEntries) {
33-
for (const auto &Entry : *Member.StringEntries) {
34-
StringData[Entry.Key] = Entry.Value;
35-
}
36-
}
31+
if (Member.StringEntries)
32+
for (const auto &Entry : *Member.StringEntries)
33+
Image.StringData[Entry.Key] = Entry.Value;
3734

3835
SmallVector<char, 1024> Data;
3936
raw_svector_ostream OS(Data);

llvm/tools/obj2yaml/offload2yaml.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ void populateYAML(OffloadYAML::Binary &YAMLBinary, object::OffloadBinary &OB,
2727
Member.StringEntries = std::vector<OffloadYAML::Binary::StringEntry>();
2828
for (const auto &Entry : OB.strings())
2929
Member.StringEntries->emplace_back(OffloadYAML::Binary::StringEntry(
30-
{Saver.save(Entry.getKey()), Saver.save(Entry.getValue())}));
30+
{Saver.save(Entry.first), Saver.save(Entry.second)}));
3131
}
3232

3333
if (!OB.getImage().empty())

llvm/unittests/Object/OffloadingTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ TEST(OffloadingTest, checkOffloadingBinary) {
3030
}
3131

3232
// Create the image.
33-
StringMap<StringRef> StringData;
33+
MapVector<StringRef, StringRef> StringData;
3434
for (auto &KeyAndValue : Strings)
3535
StringData[KeyAndValue.first] = KeyAndValue.second;
3636
std::unique_ptr<MemoryBuffer> ImageData = MemoryBuffer::getMemBuffer(

0 commit comments

Comments
 (0)