From 1e9297340c796134737044470363cd128dbe2789 Mon Sep 17 00:00:00 2001 From: PaperChalice Date: Mon, 29 Sep 2025 12:32:42 +0800 Subject: [PATCH 1/2] [ARM] Recognize some module flags --- llvm/lib/Target/ARM/ARMAsmPrinter.cpp | 28 +++++++++++++++---- .../CodeGen/ARM/build-attributes-module.ll | 14 ++++++++++ 2 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 llvm/test/CodeGen/ARM/build-attributes-module.ll diff --git a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp index 1f773e2a7e0fc..125c002682012 100644 --- a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp @@ -701,9 +701,21 @@ void ARMAsmPrinter::emitAttributes() { ARMBuildAttrs::AddressDirect); } + Metadata *MDEx = nullptr; + Metadata *MDDM = nullptr; + Metadata *MDNM = nullptr; + if (const Module *M = MMI->getModule()) { + MDEx = M->getModuleFlag("arm-eabi-fp-exceptions"); + MDDM = M->getModuleFlag("arm-eabi-fp-denormal"); + MDNM = M->getModuleFlag("arm-eabi-fp-number-model"); + } + // Set FP Denormals. - if (checkDenormalAttributeConsistency(*MMI->getModule(), "denormal-fp-math", - DenormalMode::getPreserveSign())) + if (auto *DM = mdconst::extract_or_null(MDDM)) + ATS.emitAttribute(ARMBuildAttrs::ABI_FP_denormal, DM->getZExtValue()); + else if (checkDenormalAttributeConsistency(*MMI->getModule(), + "denormal-fp-math", + DenormalMode::getPreserveSign())) ATS.emitAttribute(ARMBuildAttrs::ABI_FP_denormal, ARMBuildAttrs::PreserveFPSign); else if (checkDenormalAttributeConsistency(*MMI->getModule(), @@ -743,9 +755,11 @@ void ARMAsmPrinter::emitAttributes() { } // Set FP exceptions and rounding - if (checkFunctionsAttributeConsistency(*MMI->getModule(), - "no-trapping-math", "true") || - TM.Options.NoTrappingFPMath) + if (auto *Ex = mdconst::extract_or_null(MDEx)) + ATS.emitAttribute(ARMBuildAttrs::ABI_FP_exceptions, Ex->getZExtValue()); + else if (checkFunctionsAttributeConsistency(*MMI->getModule(), + "no-trapping-math", "true") || + TM.Options.NoTrappingFPMath) ATS.emitAttribute(ARMBuildAttrs::ABI_FP_exceptions, ARMBuildAttrs::Not_Allowed); else { @@ -759,7 +773,9 @@ void ARMAsmPrinter::emitAttributes() { // TM.Options.NoInfsFPMath && TM.Options.NoNaNsFPMath is the // equivalent of GCC's -ffinite-math-only flag. - if (TM.Options.NoInfsFPMath && TM.Options.NoNaNsFPMath) + if (auto *NM = mdconst::extract_or_null(MDNM)) + ATS.emitAttribute(ARMBuildAttrs::ABI_FP_number_model, NM->getZExtValue()); + else if (TM.Options.NoInfsFPMath && TM.Options.NoNaNsFPMath) ATS.emitAttribute(ARMBuildAttrs::ABI_FP_number_model, ARMBuildAttrs::Allowed); else diff --git a/llvm/test/CodeGen/ARM/build-attributes-module.ll b/llvm/test/CodeGen/ARM/build-attributes-module.ll new file mode 100644 index 0000000000000..d7ac8e7df376f --- /dev/null +++ b/llvm/test/CodeGen/ARM/build-attributes-module.ll @@ -0,0 +1,14 @@ +; RUN: llc %s -mtriple=arm-none-none-eabi -o - | FileCheck %s + +define void @f() { + ret void +} + +!llvm.module.flags = !{!0, !1, !2} + +; CHECK: .eabi_attribute 20, 0 +!0 = !{i32 2, !"arm-eabi-fp-denormal", i32 0} +; CHECK: .eabi_attribute 21, 1 +!1 = !{i32 2, !"arm-eabi-fp-exceptions", i32 1} +; CHECK: .eabi_attribute 23, 1 +!2 = !{i32 2, !"arm-eabi-fp-number-model", i32 1} From 0afe4bc65cf92532b48934ffb1cf350e8ee4aa30 Mon Sep 17 00:00:00 2001 From: PaperChalice Date: Tue, 7 Oct 2025 13:31:51 +0800 Subject: [PATCH 2/2] address comments --- llvm/lib/Target/ARM/ARMAsmPrinter.cpp | 41 +++++++++++++-------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp index 125c002682012..c08fca7c66b5c 100644 --- a/llvm/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/llvm/lib/Target/ARM/ARMAsmPrinter.cpp @@ -701,21 +701,14 @@ void ARMAsmPrinter::emitAttributes() { ARMBuildAttrs::AddressDirect); } - Metadata *MDEx = nullptr; - Metadata *MDDM = nullptr; - Metadata *MDNM = nullptr; - if (const Module *M = MMI->getModule()) { - MDEx = M->getModuleFlag("arm-eabi-fp-exceptions"); - MDDM = M->getModuleFlag("arm-eabi-fp-denormal"); - MDNM = M->getModuleFlag("arm-eabi-fp-number-model"); - } - // Set FP Denormals. - if (auto *DM = mdconst::extract_or_null(MDDM)) - ATS.emitAttribute(ARMBuildAttrs::ABI_FP_denormal, DM->getZExtValue()); - else if (checkDenormalAttributeConsistency(*MMI->getModule(), - "denormal-fp-math", - DenormalMode::getPreserveSign())) + if (auto *DM = mdconst::extract_or_null( + MMI->getModule()->getModuleFlag("arm-eabi-fp-denormal"))) { + if (unsigned TagVal = DM->getZExtValue()) + ATS.emitAttribute(ARMBuildAttrs::ABI_FP_denormal, TagVal); + } else if (checkDenormalAttributeConsistency(*MMI->getModule(), + "denormal-fp-math", + DenormalMode::getPreserveSign())) ATS.emitAttribute(ARMBuildAttrs::ABI_FP_denormal, ARMBuildAttrs::PreserveFPSign); else if (checkDenormalAttributeConsistency(*MMI->getModule(), @@ -755,11 +748,13 @@ void ARMAsmPrinter::emitAttributes() { } // Set FP exceptions and rounding - if (auto *Ex = mdconst::extract_or_null(MDEx)) - ATS.emitAttribute(ARMBuildAttrs::ABI_FP_exceptions, Ex->getZExtValue()); - else if (checkFunctionsAttributeConsistency(*MMI->getModule(), - "no-trapping-math", "true") || - TM.Options.NoTrappingFPMath) + if (auto *Ex = mdconst::extract_or_null( + MMI->getModule()->getModuleFlag("arm-eabi-fp-exceptions"))) { + if (unsigned TagVal = Ex->getZExtValue()) + ATS.emitAttribute(ARMBuildAttrs::ABI_FP_exceptions, Ex->getZExtValue()); + } else if (checkFunctionsAttributeConsistency(*MMI->getModule(), + "no-trapping-math", "true") || + TM.Options.NoTrappingFPMath) ATS.emitAttribute(ARMBuildAttrs::ABI_FP_exceptions, ARMBuildAttrs::Not_Allowed); else { @@ -773,9 +768,11 @@ void ARMAsmPrinter::emitAttributes() { // TM.Options.NoInfsFPMath && TM.Options.NoNaNsFPMath is the // equivalent of GCC's -ffinite-math-only flag. - if (auto *NM = mdconst::extract_or_null(MDNM)) - ATS.emitAttribute(ARMBuildAttrs::ABI_FP_number_model, NM->getZExtValue()); - else if (TM.Options.NoInfsFPMath && TM.Options.NoNaNsFPMath) + if (auto *NumModel = mdconst::extract_or_null( + MMI->getModule()->getModuleFlag("arm-eabi-fp-number-model"))) { + if (unsigned TagVal = NumModel->getZExtValue()) + ATS.emitAttribute(ARMBuildAttrs::ABI_FP_number_model, TagVal); + } else if (TM.Options.NoInfsFPMath && TM.Options.NoNaNsFPMath) ATS.emitAttribute(ARMBuildAttrs::ABI_FP_number_model, ARMBuildAttrs::Allowed); else