Skip to content

Commit e29b15b

Browse files
committed
Add helper methods to AArch64PauthAbiCoreInfo
- Convert AArch64PauthAbiCoreInfo to a struct with isValid(), size(), and comparison operators. - Simplify comparison logic in readSecurityNotes() using operator!=.
1 parent fe8a6c3 commit e29b15b

File tree

5 files changed

+30
-27
lines changed

5 files changed

+30
-27
lines changed

lld/ELF/Arch/AArch64.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1044,9 +1044,7 @@ AArch64BtiPac::AArch64BtiPac(Ctx &ctx) : AArch64(ctx) {
10441044
// instructions.
10451045

10461046
if (ctx.arg.zPacPlt) {
1047-
if (ctx.aarch64PauthAbiCoreInfo.has_value() &&
1048-
(ctx.aarch64PauthAbiCoreInfo->platform != 0 ||
1049-
ctx.aarch64PauthAbiCoreInfo->version != 0))
1047+
if (ctx.aarch64PauthAbiCoreInfo && ctx.aarch64PauthAbiCoreInfo->isValid())
10501048
pacEntryKind = PEK_Auth;
10511049
else
10521050
pacEntryKind = PEK_AuthHint;

lld/ELF/Config.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,14 @@ enum class ReportPolicy { None, Warning, Error };
142142
struct AArch64PauthAbiCoreInfo {
143143
uint64_t platform;
144144
uint64_t version;
145+
bool isValid() const { return platform || version; }
146+
static constexpr size_t size() { return sizeof(platform) + sizeof(version); }
147+
bool operator==(const AArch64PauthAbiCoreInfo &other) const {
148+
return platform == other.platform && version == other.version;
149+
}
150+
bool operator!=(const AArch64PauthAbiCoreInfo &other) const {
151+
return !(*this == other);
152+
}
145153
};
146154

147155
struct SymbolVersion {

lld/ELF/Driver.cpp

Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2848,9 +2848,8 @@ static void readSecurityNotes(Ctx &ctx) {
28482848
referenceFileName = (*it)->getName();
28492849
}
28502850
}
2851-
bool hasValidPauthAbiCoreInfo = ctx.aarch64PauthAbiCoreInfo.has_value() &&
2852-
(ctx.aarch64PauthAbiCoreInfo->platform != 0 ||
2853-
ctx.aarch64PauthAbiCoreInfo->version != 0);
2851+
bool hasValidPauthAbiCoreInfo =
2852+
ctx.aarch64PauthAbiCoreInfo && ctx.aarch64PauthAbiCoreInfo->isValid();
28542853

28552854
auto report = [&](ReportPolicy policy) -> ELFSyncStream {
28562855
return {ctx, toDiagLevel(policy)};
@@ -2922,25 +2921,19 @@ static void readSecurityNotes(Ctx &ctx) {
29222921
continue;
29232922
}
29242923

2925-
if (ctx.aarch64PauthAbiCoreInfo->platform !=
2926-
f->aarch64PauthAbiCoreInfo->platform)
2927-
Err(ctx) << "incompatible AArch64 PAuth Platform Values\n>>> "
2928-
<< referenceFileName << ": 0x"
2929-
<< toHex(ctx.aarch64PauthAbiCoreInfo->platform,
2930-
/*LowerCase=*/true)
2931-
<< "\n>>> " << f << ": 0x"
2932-
<< toHex(f->aarch64PauthAbiCoreInfo->platform,
2933-
/*LowerCase=*/true);
2934-
2935-
if (ctx.aarch64PauthAbiCoreInfo->version !=
2936-
f->aarch64PauthAbiCoreInfo->version)
2937-
Err(ctx) << "incompatible AArch64 PAuth Version Values\n>>> "
2938-
<< referenceFileName << ": 0x"
2939-
<< toHex(ctx.aarch64PauthAbiCoreInfo->version,
2940-
/*LowerCase=*/true)
2941-
<< "\n>>> " << f << ": 0x"
2942-
<< toHex(f->aarch64PauthAbiCoreInfo->version,
2943-
/*LowerCase=*/true);
2924+
if (ctx.aarch64PauthAbiCoreInfo != f->aarch64PauthAbiCoreInfo)
2925+
Err(ctx)
2926+
<< "incompatible values of AArch64 PAuth core info found\n"
2927+
<< "platform:\n"
2928+
<< ">>> " << referenceFileName << ": 0x"
2929+
<< toHex(ctx.aarch64PauthAbiCoreInfo->platform, /*LowerCase=*/true)
2930+
<< "\n>>> " << f << ": 0x"
2931+
<< toHex(f->aarch64PauthAbiCoreInfo->platform, /*LowerCase=*/true)
2932+
<< "\nversion:\n"
2933+
<< ">>> " << referenceFileName << ": 0x"
2934+
<< toHex(ctx.aarch64PauthAbiCoreInfo->version, /*LowerCase=*/true)
2935+
<< "\n>>> " << f << ": 0x"
2936+
<< toHex(f->aarch64PauthAbiCoreInfo->version, /*LowerCase=*/true);
29442937
}
29452938

29462939
// Force enable Shadow Stack.

lld/ELF/SyntheticSections.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ void GnuPropertySection::writeTo(uint8_t *buf) {
346346

347347
if (ctx.aarch64PauthAbiCoreInfo) {
348348
write32(ctx, buf + offset + 0, GNU_PROPERTY_AARCH64_FEATURE_PAUTH);
349-
write32(ctx, buf + offset + 4, sizeof(uint64_t) * 2);
349+
write32(ctx, buf + offset + 4, AArch64PauthAbiCoreInfo::size());
350350
write64(ctx, buf + offset + 8, ctx.aarch64PauthAbiCoreInfo->platform);
351351
write64(ctx, buf + offset + 16, ctx.aarch64PauthAbiCoreInfo->version);
352352
}

lld/test/ELF/aarch64-feature-pauth.s

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@
1212
# RUN: llvm-mc -filetype=obj -triple=aarch64-linux-gnu abi-tag2.s -o tag2.o
1313
# RUN: not ld.lld tag1.o tag1a.o tag2.o -o /dev/null 2>&1 | FileCheck --check-prefix ERR1 %s
1414

15-
# ERR1: error: incompatible AArch64 PAuth Version Values
15+
# ERR1: error: incompatible values of AArch64 PAuth core info found
16+
# ERR1-NEXT: platform:
17+
# ERR1-NEXT: >>> tag1.o: 0x2a
18+
# ERR1-NEXT: >>> tag2.o: 0x2a
19+
# ERR1-NEXT: version:
1620
# ERR1-NEXT: >>> tag1.o: 0x01
1721
# ERR1-NEXT: >>> tag2.o: 0x02
1822

0 commit comments

Comments
 (0)