61
61
#include " llvm/Support/SystemZ/zOSSupport.h"
62
62
#include " llvm/Support/raw_ostream.h"
63
63
#include < algorithm>
64
+ #include < array>
64
65
#include < cinttypes>
65
66
#include < cstddef>
66
67
#include < cstdint>
@@ -5119,7 +5120,7 @@ static bool printAArch64PAuthABICoreInfo(raw_ostream &OS, uint32_t DataSize,
5119
5120
uint64_t Version =
5120
5121
support::endian::read64<ELFT::TargetEndianness>(Desc.data () + 8 );
5121
5122
5122
- std::string PlatformDesc = [Platform]() {
5123
+ const char * PlatformDesc = [Platform]() {
5123
5124
switch (Platform) {
5124
5125
case AARCH64_PAUTH_PLATFORM_INVALID:
5125
5126
return " invalid" ;
@@ -5137,47 +5138,35 @@ static bool printAArch64PAuthABICoreInfo(raw_ostream &OS, uint32_t DataSize,
5137
5138
return " " ;
5138
5139
if (Version >= (1 << (AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST + 1 )))
5139
5140
return " unknown" ;
5140
- return std::string (" " ) +
5141
- ((Version &
5142
- (1 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS))
5143
- ? " "
5144
- : " !" ) +
5145
- " PointerAuthIntrinsics, " +
5146
- ((Version & (1 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS))
5147
- ? " "
5148
- : " !" ) +
5149
- " PointerAuthCalls, " +
5150
- ((Version & (1 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS))
5151
- ? " "
5152
- : " !" ) +
5153
- " PointerAuthReturns, " +
5154
- ((Version &
5155
- (1 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS))
5156
- ? " "
5157
- : " !" ) +
5158
- " PointerAuthAuthTraps, " +
5159
- ((Version &
5160
- (1 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR))
5161
- ? " "
5162
- : " !" ) +
5163
- " PointerAuthVTPtrAddressDiscrimination, " +
5164
- ((Version &
5165
- (1 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR))
5166
- ? " "
5167
- : " !" ) +
5168
- " PointerAuthVTPtrTypeDiscrimination, " +
5169
- ((Version &
5170
- (1 << AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI))
5171
- ? " "
5172
- : " !" ) +
5173
- " PointerAuthInitFini" ;
5141
+
5142
+ std::array<StringRef, AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST + 1 >
5143
+ Flags;
5144
+ Flags[AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS] = " Intrinsics" ;
5145
+ Flags[AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS] = " Calls" ;
5146
+ Flags[AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS] = " Returns" ;
5147
+ Flags[AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS] = " AuthTraps" ;
5148
+ Flags[AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR] =
5149
+ " VTPtrAddressDiscrimination" ;
5150
+ Flags[AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR] =
5151
+ " VTPtrTypeDiscrimination" ;
5152
+ Flags[AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI] = " InitFini" ;
5153
+
5174
5154
static_assert (AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI ==
5175
5155
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
5176
5156
" Update when new enum items are defined" );
5157
+
5158
+ std::string Desc;
5159
+ for (uint32_t I = 0 ; I < Flags.size (); ++I) {
5160
+ if (!(Version & (1 << I)))
5161
+ Desc += ' !' ;
5162
+ Desc += Twine (" PointerAuth" + Flags[I] + " , " ).str ();
5163
+ }
5164
+ Desc.resize (Desc.size () - 2 ); // Trim last ", "
5165
+ return Desc;
5177
5166
}();
5178
5167
5179
- OS << format (" platform 0x%x (%s), version 0x%x" , Platform,
5180
- PlatformDesc. c_str (), Version);
5168
+ OS << format (" platform 0x%x (%s), version 0x%x" , Platform, PlatformDesc,
5169
+ Version);
5181
5170
if (!VersionDesc.empty ())
5182
5171
OS << format (" (%s)" , VersionDesc.c_str ());
5183
5172
0 commit comments