[clang] [llvm] [LLVM][Clang][AArch64] Implement AArch64 build attributes (PR #118771)
Oliver Stannard via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 13 03:26:55 PST 2025
================
@@ -151,3 +151,97 @@ llvm::createAArch64ObjectTargetStreamer(MCStreamer &S,
MCTargetStreamer *llvm::createAArch64NullTargetStreamer(MCStreamer &S) {
return new AArch64TargetStreamer(S);
}
+
+void AArch64TargetStreamer::emitAtributesSubsection(
+ StringRef VendorName, AArch64BuildAttributes::SubsectionOptional IsOptional,
+ AArch64BuildAttributes::SubsectionType ParameterType) {
+
+ // If exists, return.
+ for (MCELFStreamer::AttributeSubSection &SubSection : AttributeSubSections) {
+ if (VendorName == SubSection.VendorName) {
+ activateAtributesSubsection(VendorName);
+ return;
+ }
+ }
+ // else, add the subsection
+ MCELFStreamer::AttributeSubSection AttSubSection;
+ AttSubSection.VendorName = VendorName;
+ AttSubSection.IsOptional = IsOptional;
+ AttSubSection.ParameterType = ParameterType;
+ AttributeSubSections.push_back(AttSubSection);
+ activateAtributesSubsection(VendorName);
+}
+
+std::unique_ptr<MCELFStreamer::AttributeSubSection>
+AArch64TargetStreamer::getActiveAtributesSubsection() {
+ for (MCELFStreamer::AttributeSubSection &SubSection : AttributeSubSections) {
+ if (SubSection.IsActive) {
+ return std::make_unique<MCELFStreamer::AttributeSubSection>(SubSection);
+ }
+ }
+ return nullptr;
+}
+
+void AArch64TargetStreamer::emitAttribute(StringRef VendorName, unsigned Tag,
+ unsigned Value, std::string String,
+ bool Override) {
+
+ if (unsigned(-1) == Value && "" == String) {
+ assert(0 && "Arguments error");
+ return;
+ }
+ if (AttributeSubSections.size() == 0) {
+ assert(0 &&
+ "Can not add AArch64 build attribute: no AArch64 subsection exists");
+ return;
+ }
+
+ for (MCELFStreamer::AttributeSubSection &SubSection : AttributeSubSections) {
+ if (VendorName == SubSection.VendorName) {
+ if (!SubSection.IsActive) {
+ assert(0 &&
+ "Can not add AArch64 build attribute: subsection is not active");
+ return;
+ }
+ for (MCELFStreamer::AttributeItem &Item : SubSection.Content) {
+ if (Item.Tag == Tag) {
+ if (!Override) {
+ if ((unsigned(-1) != Value && Item.IntValue != Value) ||
----------------
ostannard wrote:
Both sides of this `if` statement do the same thing (just slightly different wording in the assert).
https://github.com/llvm/llvm-project/pull/118771
More information about the llvm-commits
mailing list