[llvm] 460e9a8 - [LLVM][AArch64] Build attributes: Support switching to a defined subsection by name only (#154159)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 20 02:50:51 PDT 2025
Author: SivanShani-Arm
Date: 2025-08-20T10:50:48+01:00
New Revision: 460e9a883786c23197d064e71c810cb2a95f3564
URL: https://github.com/llvm/llvm-project/commit/460e9a883786c23197d064e71c810cb2a95f3564
DIFF: https://github.com/llvm/llvm-project/commit/460e9a883786c23197d064e71c810cb2a95f3564.diff
LOG: [LLVM][AArch64] Build attributes: Support switching to a defined subsection by name only (#154159)
The AArch64 build attribute specification now allows switching to an
already-defined subsection using its name alone, without repeating the
optionality and type parameters.
This patch updates the parser to support that behavior.
Spec reference: https://github.com/ARM-software/abi-aa/pull/230/files
Added:
llvm/test/MC/AArch64/build-attributes-asm-aeabi-switch_using_name_only.s
Modified:
llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
index 1ca61f5c6b349..3641e22e6f76a 100644
--- a/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
+++ b/llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
@@ -7909,9 +7909,11 @@ bool AArch64AsmParser::parseDirectiveSEHSavePReg(SMLoc L) {
}
bool AArch64AsmParser::parseDirectiveAeabiSubSectionHeader(SMLoc L) {
- // Expecting 3 AsmToken::Identifier after '.aeabi_subsection', a name and 2
- // parameters, e.g.: .aeabi_subsection (1)aeabi_feature_and_bits, (2)optional,
- // (3)uleb128 separated by 2 commas.
+ // Handle parsing of .aeabi_subsection directives
+ // - On first declaration of a subsection, expect exactly three identifiers
+ // after `.aeabi_subsection`: the subsection name and two parameters.
+ // - When switching to an existing subsection, it is valid to provide only
+ // the subsection name, or the name together with the two parameters.
MCAsmParser &Parser = getParser();
// Consume the name (subsection name)
@@ -7925,16 +7927,38 @@ bool AArch64AsmParser::parseDirectiveAeabiSubSectionHeader(SMLoc L) {
return true;
}
Parser.Lex();
- // consume a comma
+
+ std::unique_ptr<MCELFStreamer::AttributeSubSection> SubsectionExists =
+ getTargetStreamer().getAttributesSubsectionByName(SubsectionName);
+ // Check whether only the subsection name was provided.
+ // If so, the user is trying to switch to a subsection that should have been
+ // declared before.
+ if (Parser.getTok().is(llvm::AsmToken::EndOfStatement)) {
+ if (SubsectionExists) {
+ getTargetStreamer().emitAttributesSubsection(
+ SubsectionName,
+ static_cast<AArch64BuildAttributes::SubsectionOptional>(
+ SubsectionExists->IsOptional),
+ static_cast<AArch64BuildAttributes::SubsectionType>(
+ SubsectionExists->ParameterType));
+ return false;
+ }
+ // If subsection does not exists, report error.
+ else {
+ Error(Parser.getTok().getLoc(),
+ "Could not switch to subsection '" + SubsectionName +
+ "' using subsection name, subsection has not been defined");
+ return true;
+ }
+ }
+
+ // Otherwise, expecting 2 more parameters: consume a comma
// parseComma() return *false* on success, and call Lex(), no need to call
// Lex() again.
if (Parser.parseComma()) {
return true;
}
- std::unique_ptr<MCELFStreamer::AttributeSubSection> SubsectionExists =
- getTargetStreamer().getAttributesSubsectionByName(SubsectionName);
-
// Consume the first parameter (optionality parameter)
AArch64BuildAttributes::SubsectionOptional IsOptional;
// options: optional/required
diff --git a/llvm/test/MC/AArch64/build-attributes-asm-aeabi-switch_using_name_only.s b/llvm/test/MC/AArch64/build-attributes-asm-aeabi-switch_using_name_only.s
new file mode 100644
index 0000000000000..cf89d3e376f3b
--- /dev/null
+++ b/llvm/test/MC/AArch64/build-attributes-asm-aeabi-switch_using_name_only.s
@@ -0,0 +1,39 @@
+// RUN: llvm-mc -triple=aarch64 %s -o - | FileCheck %s --check-prefix=ASM
+// RUN: llvm-mc -triple=aarch64 -filetype=obj %s -o - | llvm-readelf --hex-dump=.ARM.attributes - | FileCheck %s --check-prefix=ELF
+
+// ASM: .aeabi_subsection aeabi_pauthabi, required, uleb128
+// ASM: .aeabi_subsection aeabi_feature_and_bits, optional, uleb128
+// ASM: .aeabi_attribute 0, 1 // Tag_Feature_BTI
+// ASM: .aeabi_attribute 2, 1 // Tag_PAuth_Schema
+// ASM: .aeabi_attribute 1, 1 // Tag_PAuth_Platform
+// ASM: .aeabi_attribute 2, 1 // Tag_Feature_GCS
+// ASM: .aeabi_attribute 1, 0 // Tag_Feature_PAC
+// ASM: .aeabi_attribute 7, 1
+// ASM: .aeabi_attribute 7, 0
+
+// ELF: Hex dump of section '.ARM.attributes':
+// ELF-NEXT: 0x00000000 411b0000 00616561 62695f70 61757468 A....aeabi_pauth
+// ELF-NEXT: 0x00000010 61626900 00000201 01010700 25000000 abi.........%...
+// ELF-NEXT: 0x00000020 61656162 695f6665 61747572 655f616e aeabi_feature_an
+// ELF-NEXT: 0x00000030 645f6269 74730001 00000102 01010007 d_bits..........
+// ELF-NEXT: 0x00000040 01
+
+
+.aeabi_subsection aeabi_pauthabi, required, uleb128
+.aeabi_subsection aeabi_feature_and_bits, optional, uleb128
+.aeabi_attribute Tag_Feature_BTI, 1
+.aeabi_subsection aeabi_feature_and_bits
+.aeabi_subsection aeabi_pauthabi
+.aeabi_attribute Tag_PAuth_Schema, 1
+.aeabi_subsection aeabi_pauthabi
+.aeabi_attribute Tag_PAuth_Platform, 1
+.aeabi_subsection aeabi_pauthabi
+.aeabi_subsection aeabi_feature_and_bits
+.aeabi_attribute Tag_Feature_GCS, 1
+.aeabi_subsection aeabi_pauthabi
+.aeabi_subsection aeabi_feature_and_bits
+.aeabi_attribute Tag_Feature_PAC, 0
+.aeabi_subsection aeabi_feature_and_bits
+.aeabi_attribute 7, 1
+.aeabi_subsection aeabi_pauthabi
+.aeabi_attribute 7, 0
More information about the llvm-commits
mailing list