Skip to content

Commit 82e7260

Browse files
jrtc27resistor
authored andcommitted
[llvm-objdump][llvm-readobj] Be strict for decoding caprelocs permissions
We don't know what future bit patterns will mean, so don't even try, as that's likely to be misleading.
1 parent acfa4dd commit 82e7260

File tree

2 files changed

+36
-11
lines changed

2 files changed

+36
-11
lines changed

llvm/tools/llvm-objdump/llvm-objdump.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2712,19 +2712,32 @@ printELFCapRelocations(const ELFObjectFile<ELFT> *Obj) {
27122712
uint64_t Perms =
27132713
support::endian::read<TargetUint, ELFT::Endianness, 1>(
27142714
entry + 4*sizeof(TargetUint));
2715-
bool isFunction = Perms & (UINT64_C(1) << ((sizeof(TargetUint) * 8) - 1));
2716-
bool isConstant = Perms & (UINT64_C(1) << ((sizeof(TargetUint) * 8) - 2));
2717-
//Perms &= 0xffffffff;
2715+
const uint64_t Function = UINT64_C(1) << ((sizeof(TargetUint) * 8) - 1);
2716+
const uint64_t Constant = UINT64_C(1) << ((sizeof(TargetUint) * 8) - 2);
2717+
StringRef PermStr;
2718+
switch (Perms) {
2719+
case 0:
2720+
PermStr = "";
2721+
break;
2722+
case Constant:
2723+
PermStr = " (Constant)";
2724+
break;
2725+
case Function:
2726+
PermStr = " (Function)";
2727+
break;
2728+
default:
2729+
PermStr = " (Unknown)";
2730+
break;
2731+
}
27182732
StringRef Symbol = "<Unnamed symbol>";
27192733
if (SymbolNames.find(Base) != SymbolNames.end())
27202734
Symbol = SymbolNames[Base];
27212735
outs() << format(AddrFmt.data(), Target) << "\tBase: " << Symbol << " ("
27222736
<< format(AddrFmt.data(), Base)
27232737
<< ")\tOffset: " << format(AddrFmt.data(), Offset)
27242738
<< "\tLength: " << format(AddrFmt.data(), Length)
2725-
<< "\tPermissions: " << format(PermsFmt.data(), Perms)
2726-
<< (isFunction ? " (Function)\n"
2727-
: (isConstant ? " (Constant)\n" : "\n"));
2739+
<< "\tPermissions: " << format(PermsFmt.data(), Perms) << PermStr
2740+
<< "\n";
27282741
}
27292742
outs() << "\n";
27302743
}

llvm/tools/llvm-readobj/ELFDumper.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3526,11 +3526,23 @@ template <class ELFT> void ELFDumper<ELFT>::printCheriCapRelocs() {
35263526
uint64_t Perms =
35273527
support::endian::read<TargetUint, ELFT::Endianness, 1>(
35283528
entry + 4*sizeof(TargetUint));
3529-
bool isFunction = Perms & (UINT64_C(1) << ((sizeof(TargetUint) * 8) - 1));
3530-
bool isReadOnly = Perms & (UINT64_C(1) << ((sizeof(TargetUint) * 8) - 2));
3531-
const char *PermStr =
3532-
isFunction ? "Function" : (isReadOnly ? "Constant" : "Object");
3533-
// Perms &= 0xffffffff;
3529+
const uint64_t Function = UINT64_C(1) << ((sizeof(TargetUint) * 8) - 1);
3530+
const uint64_t Constant = UINT64_C(1) << ((sizeof(TargetUint) * 8) - 2);
3531+
StringRef PermStr;
3532+
switch (Perms) {
3533+
case 0:
3534+
PermStr = "Object";
3535+
break;
3536+
case Constant:
3537+
PermStr = "Constant";
3538+
break;
3539+
case Function:
3540+
PermStr = "Function";
3541+
break;
3542+
default:
3543+
PermStr = "Unknown";
3544+
break;
3545+
}
35343546
std::string BaseSymbol;
35353547
if (Base == 0) {
35363548
// Base is 0 -> either it is really NULL or (more likely) there is a

0 commit comments

Comments
 (0)