Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 21 additions & 14 deletions llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7870,8 +7870,7 @@ bool AArch64AsmParser::parseDirectiveAeabiSubSectionHeader(SMLoc L) {
IsOptional = AArch64BuildAttrs::getOptionalID(Optionality);
if (AArch64BuildAttrs::OPTIONAL_NOT_FOUND == IsOptional) {
Error(Parser.getTok().getLoc(),
AArch64BuildAttrs::getSubsectionOptionalUnknownError() + ": " +
Optionality);
AArch64BuildAttrs::getSubsectionOptionalUnknownError());
return true;
}
if (SubsectionExists) {
Expand Down Expand Up @@ -7919,7 +7918,7 @@ bool AArch64AsmParser::parseDirectiveAeabiSubSectionHeader(SMLoc L) {
Type = AArch64BuildAttrs::getTypeID(Name);
if (AArch64BuildAttrs::TYPE_NOT_FOUND == Type) {
Error(Parser.getTok().getLoc(),
AArch64BuildAttrs::getSubsectionTypeUnknownError() + ": " + Name);
AArch64BuildAttrs::getSubsectionTypeUnknownError());
return true;
}
if (SubsectionExists) {
Expand Down Expand Up @@ -7948,7 +7947,9 @@ bool AArch64AsmParser::parseDirectiveAeabiSubSectionHeader(SMLoc L) {
}
}
Parser.Lex();
// Parsing finished, check for trailing tokens.

// Parsing finished. Check for trailing characters (no need to check for
// comments; they are removed by the lexer).
if (Parser.getTok().isNot(llvm::AsmToken::EndOfStatement)) {
Error(Parser.getTok().getLoc(), "unexpected token for AArch64 build "
"attributes subsection header directive");
Expand Down Expand Up @@ -7986,14 +7987,22 @@ bool AArch64AsmParser::parseDirectiveAeabiAArch64Attr(SMLoc L) {

StringRef TagStr = "";
unsigned Tag;
if (Parser.getTok().is(AsmToken::Identifier)) {
if (Parser.getTok().is(AsmToken::Integer)) {
Tag = getTok().getIntVal();
} else if (Parser.getTok().is(AsmToken::Identifier)) {
TagStr = Parser.getTok().getIdentifier();
switch (ActiveSubsectionID) {
default:
// Should not happen
assert(0 && "Subsection name error");
break;
case AArch64BuildAttrs::VENDOR_UNKNOWN:
// Private subsection, accept any tag.
// Tag was provided as an unrecognized string instead of an unsigned
// integer
Error(Parser.getTok().getLoc(), "unrecognized Tag: '" + TagStr +
"' \nExcept for public subsections, "
"tags have to be an unsigned int.");
return true;
break;
case AArch64BuildAttrs::AEABI_PAUTHABI:
Tag = AArch64BuildAttrs::getPauthABITagsID(TagStr);
Expand All @@ -8014,8 +8023,6 @@ bool AArch64AsmParser::parseDirectiveAeabiAArch64Attr(SMLoc L) {
}
break;
}
} else if (Parser.getTok().is(AsmToken::Integer)) {
Tag = getTok().getIntVal();
} else {
Error(Parser.getTok().getLoc(), "AArch64 build attributes tag not found");
return true;
Expand Down Expand Up @@ -8059,10 +8066,9 @@ bool AArch64AsmParser::parseDirectiveAeabiAArch64Attr(SMLoc L) {
Error(Parser.getTok().getLoc(), "AArch64 build attributes value not found");
return true;
}
// Check for possible unaccepted values for known tags (AEABI_PAUTHABI,
// AEABI_FEATURE_AND_BITS)
if (!(ActiveSubsectionID == AArch64BuildAttrs::VENDOR_UNKNOWN) &&
TagStr != "") { // TagStr was a recognized string
// Check for possible unaccepted values for known tags
// (AEABI_FEATURE_AND_BITS)
if (ActiveSubsectionID == AArch64BuildAttrs::AEABI_FEATURE_AND_BITS) {
if (0 != ValueInt && 1 != ValueInt) {
Error(Parser.getTok().getLoc(),
"unknown AArch64 build attributes Value for Tag '" + TagStr +
Expand All @@ -8071,7 +8077,9 @@ bool AArch64AsmParser::parseDirectiveAeabiAArch64Attr(SMLoc L) {
}
}
Parser.Lex();
// Parsing finished, check for trailing tokens.

// Parsing finished. Check for trailing characters (no need to check for
// comments; they are removed by the lexer).
if (Parser.getTok().isNot(llvm::AsmToken::EndOfStatement)) {
Error(Parser.getTok().getLoc(),
"unexpected token for AArch64 build attributes tag and value "
Expand All @@ -8083,7 +8091,6 @@ bool AArch64AsmParser::parseDirectiveAeabiAArch64Attr(SMLoc L) {
getTargetStreamer().emitAttribute(ActiveSubsectionName, Tag, ValueInt, "",
false);
}

if ("" != ValueStr) {
getTargetStreamer().emitAttribute(ActiveSubsectionName, Tag, unsigned(-1),
ValueStr, false);
Expand Down
8 changes: 4 additions & 4 deletions llvm/lib/Target/AArch64/MCTargetDesc/AArch64ELFStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -191,8 +191,8 @@ class AArch64TargetAsmStreamer : public AArch64TargetStreamer {
case AArch64BuildAttrs::TAG_FEATURE_BTI:
case AArch64BuildAttrs::TAG_FEATURE_GCS:
case AArch64BuildAttrs::TAG_FEATURE_PAC:
OS << "\t.aeabi_attribute" << "\t"
<< AArch64BuildAttrs::getFeatureAndBitsTagsStr(Tag) << ", " << Value;
OS << "\t.aeabi_attribute" << "\t" << Tag << ", " << Value << "\t// "
<< AArch64BuildAttrs::getFeatureAndBitsTagsStr(Tag);
AArch64TargetStreamer::emitAttribute(VendorName, Tag, Value, "",
Override);
break;
Expand All @@ -210,8 +210,8 @@ class AArch64TargetAsmStreamer : public AArch64TargetStreamer {
break;
case AArch64BuildAttrs::TAG_PAUTH_PLATFORM:
case AArch64BuildAttrs::TAG_PAUTH_SCHEMA:
OS << "\t.aeabi_attribute" << "\t"
<< AArch64BuildAttrs::getPauthABITagsStr(Tag) << ", " << Value;
OS << "\t.aeabi_attribute" << "\t" << Tag << ", " << Value << "\t// "
<< AArch64BuildAttrs::getPauthABITagsStr(Tag);
AArch64TargetStreamer::emitAttribute(VendorName, Tag, Value, "",
Override);
break;
Expand Down
27 changes: 13 additions & 14 deletions llvm/lib/Target/AArch64/MCTargetDesc/AArch64TargetStreamer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "llvm/BinaryFormat/ELF.h"
#include "llvm/MC/ConstantPools.h"
#include "llvm/MC/MCContext.h"
#include "llvm/MC/MCELFStreamer.h"
#include "llvm/MC/MCSection.h"
#include "llvm/MC/MCSectionELF.h"
#include "llvm/MC/MCSubtargetInfo.h"
Expand Down Expand Up @@ -214,22 +215,20 @@ void AArch64TargetStreamer::emitAttribute(StringRef VendorName, unsigned Tag,
return;
}
for (MCELFStreamer::AttributeItem &Item : SubSection.Content) {
// Tag already exists
if (Item.Tag == Tag) {
if (!Override) {
if ((unsigned(-1) != Value && Item.IntValue != Value) ||
("" != String && Item.StringValue != String)) {
assert(0 &&
"Can not add AArch64 build attribute: An attribute with "
"the same tag and a different value already exists");
return;
} else {
// Case Item.IntValue == Value, no need to emit twice
assert(0 &&
"AArch64 build attribute: An attribute with the same tag "
"and a same value already exists");
return;
}
// New value for existing tag: update tag
if ((unsigned(-1) != Value && Item.IntValue != Value) ||
("" != String && Item.StringValue != String)) {
Item.Type = unsigned(-1) != Value
? MCELFStreamer::AttributeItem::NumericAttribute
: MCELFStreamer::AttributeItem::TextAttribute;
Item.IntValue = unsigned(-1) != Value ? Value : unsigned(-1);
Item.StringValue = unsigned(-1) != Value ? "" : String;
return;
}
// Same value for existing tag: do nothing
return;
}
}
if (unsigned(-1) != Value)
Expand Down
6 changes: 3 additions & 3 deletions llvm/test/CodeGen/AArch64/aarch64-build-attributes-all.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
; RUN: llc %s -filetype=obj -o - | llvm-readelf --hex-dump=.ARM.attributes - | FileCheck %s --check-prefix=ELF

; ASM: .aeabi_subsection aeabi_feature_and_bits, optional, uleb128
; ASM-NEXT: .aeabi_attribute Tag_Feature_BTI, 1
; ASM-NEXT: .aeabi_attribute Tag_Feature_PAC, 1
; ASM-NEXT: .aeabi_attribute Tag_Feature_GCS, 1
; ASM-NEXT: .aeabi_attribute 0, 1 // Tag_Feature_BTI
; ASM-NEXT: .aeabi_attribute 1, 1 // Tag_Feature_PAC
; ASM-NEXT: .aeabi_attribute 2, 1 // Tag_Feature_GCS

; ELF: Hex dump of section '.ARM.attributes':
; ELF-NEXT: 0x00000000 41230000 00616561 62695f66 65617475 A#...aeabi_featu
Expand Down
6 changes: 3 additions & 3 deletions llvm/test/CodeGen/AArch64/aarch64-build-attributes-bti.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
; RUN: llc %s -filetype=obj -o - | llvm-readelf --hex-dump=.ARM.attributes - | FileCheck %s --check-prefix=ELF

; ASM: .aeabi_subsection aeabi_feature_and_bits, optional, uleb128
; ASM-NEXT: .aeabi_attribute Tag_Feature_BTI, 1
; ASM-NEXT: .aeabi_attribute Tag_Feature_PAC, 0
; ASM-NEXT: .aeabi_attribute Tag_Feature_GCS, 0
; ASM-NEXT: .aeabi_attribute 0, 1 // Tag_Feature_BTI
; ASM-NEXT: .aeabi_attribute 1, 0 // Tag_Feature_PAC
; ASM-NEXT: .aeabi_attribute 2, 0 // Tag_Feature_GCS

; ELF: Hex dump of section '.ARM.attributes':
; ELF-NEXT: 0x00000000 41230000 00616561 62695f66 65617475 A#...aeabi_featu
Expand Down
6 changes: 3 additions & 3 deletions llvm/test/CodeGen/AArch64/aarch64-build-attributes-gcs.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
; RUN: llc %s -filetype=obj -o - | llvm-readelf --hex-dump=.ARM.attributes - | FileCheck %s --check-prefix=ELF

; ASM: .aeabi_subsection aeabi_feature_and_bits, optional, uleb128
; ASM-NEXT: .aeabi_attribute Tag_Feature_BTI, 0
; ASM-NEXT: .aeabi_attribute Tag_Feature_PAC, 0
; ASM-NEXT: .aeabi_attribute Tag_Feature_GCS, 1
; ASM-NEXT: .aeabi_attribute 0, 0 // Tag_Feature_BTI
; ASM-NEXT: .aeabi_attribute 1, 0 // Tag_Feature_PAC
; ASM-NEXT: .aeabi_attribute 2, 1 // Tag_Feature_GCS

; ELF: Hex dump of section '.ARM.attributes':
; ELF-NEXT: 0x00000000 41230000 00616561 62695f66 65617475 A#...aeabi_featu
Expand Down
6 changes: 3 additions & 3 deletions llvm/test/CodeGen/AArch64/aarch64-build-attributes-pac.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
; RUN: llc %s -filetype=obj -o - | llvm-readelf --hex-dump=.ARM.attributes - | FileCheck %s --check-prefix=ELF

; ASM: .aeabi_subsection aeabi_feature_and_bits, optional, uleb128
; ASM-NEXT: .aeabi_attribute Tag_Feature_BTI, 0
; ASM-NEXT: .aeabi_attribute Tag_Feature_PAC, 1
; ASM-NEXT: .aeabi_attribute Tag_Feature_GCS, 0
; ASM-NEXT: .aeabi_attribute 0, 0 // Tag_Feature_BTI
; ASM-NEXT: .aeabi_attribute 1, 1 // Tag_Feature_PAC
; ASM-NEXT: .aeabi_attribute 2, 0 // Tag_Feature_GCS

; ELF: Hex dump of section '.ARM.attributes':
; ELF-NEXT: 0x00000000 41230000 00616561 62695f66 65617475 A#...aeabi_featu
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
; RUN: llc %s -filetype=obj -o - | llvm-readelf --hex-dump=.ARM.attributes - | FileCheck %s --check-prefix=ELF

; ASM: .aeabi_subsection aeabi_pauthabi, required, uleb128
; ASM-NEXT: .aeabi_attribute Tag_PAuth_Platform, 2
; ASM-NEXT: .aeabi_attribute Tag_PAuth_Schema, 31
; ASM-NEXT: .aeabi_attribute 1, 2 // Tag_PAuth_Platform
; ASM-NEXT: .aeabi_attribute 2, 31 // Tag_PAuth_Schema

; ELF: Hex dump of section '.ARM.attributes':
; ELF-NEXT: 0x00000000 41190000 00616561 62695f70 61757468 A....aeabi_pauth
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// 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_attribute 1, 7 // Tag_PAuth_Platform
// ASM: .aeabi_attribute 2, 777 // Tag_PAuth_Schema
// ASM: .aeabi_attribute 2, 777 // Tag_PAuth_Schema
// ASM: .aeabi_subsection aeabi_feature_and_bits, optional, uleb128
// ASM: .aeabi_attribute 0, 1 // Tag_Feature_BTI
// ASM: .aeabi_attribute 1, 1 // Tag_Feature_PAC
// ASM: .aeabi_attribute 2, 1 // Tag_Feature_GCS
// ASM: .aeabi_subsection aeabi_pauthabi, required, uleb128
// ASM: .aeabi_attribute 1, 7 // Tag_PAuth_Platform
// ASM: .aeabi_attribute 2, 777 // Tag_PAuth_Schema
// ASM: .aeabi_attribute 2, 777 // Tag_PAuth_Schema
// ASM: .aeabi_subsection aeabi_feature_and_bits, optional, uleb128
// ASM: .aeabi_attribute 0, 1 // Tag_Feature_BTI
// ASM: .aeabi_attribute 1, 1 // Tag_Feature_PAC
// ASM: .aeabi_attribute 2, 1 // Tag_Feature_GCS

// ELF: Hex dump of section '.ARM.attributes':
// ELF: 0x00000000 411a0000 00616561 62695f70 61757468 A....aeabi_pauth
// ELF: 0x00000010 61626900 00000107 02890623 00000061 abi........#...a
// ELF: 0x00000020 65616269 5f666561 74757265 5f616e64 eabi_feature_and
// ELF: 0x00000030 5f626974 73000100 00010101 0201 _bits.........


.aeabi_subsection aeabi_pauthabi, required, uleb128 // test header comment
.aeabi_attribute Tag_PAuth_Platform, 7
.aeabi_attribute Tag_PAuth_Schema, 777
.aeabi_attribute Tag_PAuth_Schema, 777
.aeabi_subsection aeabi_feature_and_bits, optional, uleb128
.aeabi_attribute Tag_Feature_BTI, 1
.aeabi_attribute Tag_Feature_PAC, 1
.aeabi_attribute Tag_Feature_GCS, 1
.aeabi_subsection aeabi_pauthabi, required, uleb128
.aeabi_attribute 1, 7 // Tag_PAuth_Platform
.aeabi_attribute 2, 777 // Tag_PAuth_Schema
.aeabi_attribute 2, 777 // Tag_PAuth_Schema
.aeabi_subsection aeabi_feature_and_bits, optional, uleb128
.aeabi_attribute 0, 1 // Tag_Feature_BTI
.aeabi_attribute 1, 1 // Tag_Feature_PAC
.aeabi_attribute 2, 1 // Tag_Feature_GCS
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
// RUN: llvm-mc -triple=aarch64 -filetype=obj %s -o - | llvm-readelf --hex-dump=.ARM.attributes - | FileCheck %s --check-prefix=ELF

// ASM: .aeabi_subsection aeabi_feature_and_bits, optional, uleb128
// ASM: .aeabi_attribute Tag_Feature_BTI, 1
// ASM: .aeabi_attribute Tag_Feature_PAC, 0
// ASM: .aeabi_attribute Tag_Feature_GCS, 0
// ASM: .aeabi_attribute 0, 1 // Tag_Feature_BTI
// ASM: .aeabi_attribute 1, 0 // Tag_Feature_PAC
// ASM: .aeabi_attribute 2, 0 // Tag_Feature_GCS

// ELF: Hex dump of section '.ARM.attributes':
// ELF-NEXT: 0x00000000 41230000 00616561 62695f66 65617475 A#...aeabi_featu
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// RUN: not llvm-mc -triple=aarch64 %s 2>&1 | FileCheck --check-prefix=ERR %s

// Test logic and type mismatch
.aeabi_attribute Tag_Feature_BTI, 1
// ERR: error: no active subsection, build attribute can not be added
// ERR-NEXT: .aeabi_attribute Tag_Feature_BTI, 1
Expand All @@ -9,10 +10,6 @@
// ERR: error: unknown AArch64 build attribute 'Tag_Feature_BTI' for subsection 'aeabi_pauthabi'
// ERR-NEXT: .aeabi_attribute Tag_Feature_BTI, 1

.aeabi_attribute Tag_PAuth_Platform, 4
// ERR: error: unknown AArch64 build attributes Value for Tag 'Tag_PAuth_Platform' options are 0|1
// ERR-NEXT: .aeabi_attribute Tag_PAuth_Platform, 4

.aeabi_attribute a, 1
// ERR: error: unknown AArch64 build attribute 'a' for subsection 'aeabi_pauthabi'
// ERR-NEXT: .aeabi_attribute a, 1
Expand All @@ -25,6 +22,8 @@
// ERR: error: active subsection type is ULEB128 (unsigned), found NTBS (string)
// ERR-NEXT: .aeabi_attribute Tag_PAuth_Platform, a


// Test syntax errors
.aeabi_attribute Tag_PAuth_Platform,
// ERR: error: AArch64 build attributes value not found
// ERR-NEXT: .aeabi_attribute Tag_PAuth_Platform,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,6 @@
// RUN: not llvm-mc -triple=aarch64 %s 2>&1 | FileCheck --check-prefix=ERR %s

.aeabi_subsection aeabi_pauthabi, optional, uleb128
// ERR: error: aeabi_pauthabi must be marked as required
// ERR-NEXT: .aeabi_subsection aeabi_pauthabi, optional, uleb128

.aeabi_subsection aeabi_pauthabi, required, ntbs
// ERR: error: aeabi_pauthabi must be marked as ULEB128
// ERR-NEXT: .aeabi_subsection aeabi_pauthabi, required, ntbs

.aeabi_subsection aeabi_feature_and_bits, required, uleb128
// ERR: error: aeabi_feature_and_bits must be marked as optional
// ERR-NEXT: .aeabi_subsection aeabi_feature_and_bits, required, uleb128

.aeabi_subsection aeabi_feature_and_bits, optional, ntbs
// ERR: error: aeabi_feature_and_bits must be marked as ULEB128
// ERR-NEXT: .aeabi_subsection aeabi_feature_and_bits, optional, ntbs

// Test syntax errors
.aeabi_subsection 1, required, uleb128
// ERR: error: subsection name not found
// ERR-NEXT: .aeabi_subsection 1, required, uleb128
Expand All @@ -25,11 +10,7 @@
// ERR-NEXT: .aeabi_subsection , required, uleb128

.aeabi_subsection aeabi_pauthabi, a, uleb128
// ERR: error: unknown AArch64 build attributes optionality, expected required|optional: a
// ERR-NEXT: .aeabi_subsection aeabi_pauthabi, a, uleb128

.aeabi_subsection aeabi_pauthabi, a, uleb128
// ERR: error: unknown AArch64 build attributes optionality, expected required|optional: a
// ERR: error: unknown AArch64 build attributes optionality, expected required|optional
// ERR-NEXT: .aeabi_subsection aeabi_pauthabi, a, uleb128

.aeabi_subsection aeabi_pauthabi, 1, uleb128
Expand All @@ -41,7 +22,7 @@
// ERR-NEXT: .aeabi_subsection aeabi_pauthabi, ,uleb128

.aeabi_subsection aeabi_pauthabi,uleb128
// ERR: error: unknown AArch64 build attributes optionality, expected required|optional: uleb128
// ERR: error: unknown AArch64 build attributes optionality, expected required|optional
// ERR-NEXT: .aeabi_subsection aeabi_pauthabi,uleb128

.aeabi_subsection aeabi_pauthabi uleb128
Expand All @@ -57,5 +38,27 @@
// ERR-NEXT: .aeabi_subsection aeabi_pauthabi, required,

.aeabi_subsection aeabi_pauthabi, required, a
// ERR: error: unknown AArch64 build attributes type, expected uleb128|ntbs: a
// ERR: error: unknown AArch64 build attributes type, expected uleb128|ntbs
// ERR-NEXT: .aeabi_subsection aeabi_pauthabi, required, a

.aeabi_subsection aeabi_pauthabi, optional, uleb128
// ERR: error: aeabi_pauthabi must be marked as required
// ERR-NEXT: .aeabi_subsection aeabi_pauthabi, optional, uleb128


// Test types mismatch
.aeabi_subsection aeabi_pauthabi, optional, uleb128
// ERR: error: aeabi_pauthabi must be marked as required
// ERR-NEXT: .aeabi_subsection aeabi_pauthabi, optional, uleb128

.aeabi_subsection aeabi_pauthabi, required, ntbs
// ERR: error: aeabi_pauthabi must be marked as ULEB128
// ERR-NEXT: .aeabi_subsection aeabi_pauthabi, required, ntbs

.aeabi_subsection aeabi_feature_and_bits, required, uleb128
// ERR: error: aeabi_feature_and_bits must be marked as optional
// ERR-NEXT: .aeabi_subsection aeabi_feature_and_bits, required, uleb128

.aeabi_subsection aeabi_feature_and_bits, optional, ntbs
// ERR: error: aeabi_feature_and_bits must be marked as ULEB128
// ERR-NEXT: .aeabi_subsection aeabi_feature_and_bits, optional, ntbs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
// RUN: llvm-mc -triple=aarch64 -filetype=obj %s -o - | llvm-readelf --hex-dump=.ARM.attributes - | FileCheck %s --check-prefix=ELF

// ASM: .aeabi_subsection aeabi_feature_and_bits, optional, uleb128
// ASM: .aeabi_attribute Tag_Feature_BTI, 0
// ASM: .aeabi_attribute Tag_Feature_PAC, 0
// ASM: .aeabi_attribute Tag_Feature_GCS, 1
// ASM: .aeabi_attribute 0, 0 // Tag_Feature_BTI
// ASM: .aeabi_attribute 1, 0 // Tag_Feature_PAC
// ASM: .aeabi_attribute 2, 1 // Tag_Feature_GCS

// ELF: Hex dump of section '.ARM.attributes':
// ELF-NEXT: 0x00000000 41230000 00616561 62695f66 65617475 A#...aeabi_featu
Expand Down
Loading