[GSYM] Fix the initialization of DataExtractor (#67904)
Without this patch, we pass Endian as one of the parameters to the
constructor of DataExtractor. The problem is that Endian is of:
enum endianness {big, little, native};
whereas the constructor is expecting "bool IsLittleEndian". That is,
we are relying on an implicit conversion to convert big and little to
false and true, respectively.
When we migrate llvm::support::endianness to std::endian in future, we
can no longer rely on an implicit conversion because std::endian is
declared with "enum class". Even if we could, the conversion would
not be guaranteed to work because, for example, libcxx defines:
enum class endian {
little = 0xDEAD,
big = 0xFACE,
:
where big and little are not boolean values.
This patch fixes the problem by properly converting Endian to a
boolean value.
GitOrigin-RevId: 95f4b2a70850b5e6ab83ec21af3fe5246cac0675
diff --git a/lib/DebugInfo/GSYM/GsymReader.cpp b/lib/DebugInfo/GSYM/GsymReader.cpp
index 6afaeea..689d8f8 100644
--- a/lib/DebugInfo/GSYM/GsymReader.cpp
+++ b/lib/DebugInfo/GSYM/GsymReader.cpp
@@ -261,7 +261,10 @@
// Address info offsets size should have been checked in parse().
assert(*AddressIndex < AddrInfoOffsets.size());
auto AddrInfoOffset = AddrInfoOffsets[*AddressIndex];
- DataExtractor Data(MemBuffer->getBuffer().substr(AddrInfoOffset), Endian, 4);
+ assert((Endian == support::big || Endian == support::little) &&
+ "Endian must be either big or little");
+ DataExtractor Data(MemBuffer->getBuffer().substr(AddrInfoOffset),
+ Endian == support::little, 4);
if (std::optional<uint64_t> OptAddr = getAddress(*AddressIndex)) {
auto ExpectedFI = FunctionInfo::decode(Data, *OptAddr);
if (ExpectedFI) {
@@ -283,7 +286,10 @@
// Address info offsets size should have been checked in parse().
assert(*AddressIndex < AddrInfoOffsets.size());
auto AddrInfoOffset = AddrInfoOffsets[*AddressIndex];
- DataExtractor Data(MemBuffer->getBuffer().substr(AddrInfoOffset), Endian, 4);
+ assert((Endian == support::big || Endian == support::little) &&
+ "Endian must be either big or little");
+ DataExtractor Data(MemBuffer->getBuffer().substr(AddrInfoOffset),
+ Endian == support::little, 4);
if (std::optional<uint64_t> OptAddr = getAddress(*AddressIndex))
return FunctionInfo::lookup(Data, *this, *OptAddr, Addr);
return createStringError(std::errc::invalid_argument,