https://github.com/paperchalice updated https://github.com/llvm/llvm-project/pull/161106
>From b0984e77945073ad7ff8f457261ec42028f38925 Mon Sep 17 00:00:00 2001 From: PaperChalice <[email protected]> Date: Sat, 27 Sep 2025 17:30:14 +0800 Subject: [PATCH] [ARM][clang] Add some build attributes support --- clang/lib/CodeGen/CodeGenModule.cpp | 27 +++++++++++++++++++ clang/test/CodeGen/ARM/build-attributes.c | 15 +++++++++++ clang/test/CodeGen/ubsan-function-sugared.cpp | 2 +- clang/test/CodeGen/ubsan-function.cpp | 2 +- 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 clang/test/CodeGen/ARM/build-attributes.c diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 0eac7c351b164..6baa66ed84791 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -61,6 +61,7 @@ #include "llvm/IR/ProfileSummary.h" #include "llvm/ProfileData/InstrProfReader.h" #include "llvm/ProfileData/SampleProf.h" +#include "llvm/Support/ARMBuildAttributes.h" #include "llvm/Support/CRC.h" #include "llvm/Support/CodeGen.h" #include "llvm/Support/CommandLine.h" @@ -1383,6 +1384,32 @@ void CodeGenModule::Release() { } } } + if ((T.isARM() || T.isThumb()) && getTriple().isTargetAEABI() && + getTriple().isOSBinFormatELF()) { + uint32_t TagVal = 0; + if (getCodeGenOpts().FPDenormalMode == + llvm::DenormalMode::getPositiveZero()) + TagVal = llvm::ARMBuildAttrs::PositiveZero; + else if (getCodeGenOpts().FPDenormalMode == llvm::DenormalMode::getIEEE()) + TagVal = llvm::ARMBuildAttrs::IEEEDenormals; + else if (getCodeGenOpts().FPDenormalMode == + llvm::DenormalMode::getPreserveSign()) + TagVal = llvm::ARMBuildAttrs::PreserveFPSign; + getModule().addModuleFlag(llvm::Module::Warning, "arm-eabi-fp-denormal", + TagVal); + + if (getLangOpts().getFPExceptionMode() != + LangOptions::FPExceptionModeKind::FPE_Ignore) + getModule().addModuleFlag(llvm::Module::Warning, "arm-eabi-fp-exceptions", + llvm::ARMBuildAttrs::Allowed); + + if (getLangOpts().NoHonorNaNs && getLangOpts().NoHonorInfs) + TagVal = llvm::ARMBuildAttrs::AllowIEEENormal; + else + TagVal = llvm::ARMBuildAttrs::AllowIEEE754; + getModule().addModuleFlag(llvm::Module::Warning, "arm-eabi-fp-number-model", + TagVal); + } if (CodeGenOpts.StackClashProtector) getModule().addModuleFlag( diff --git a/clang/test/CodeGen/ARM/build-attributes.c b/clang/test/CodeGen/ARM/build-attributes.c new file mode 100644 index 0000000000000..2f7ff17df0526 --- /dev/null +++ b/clang/test/CodeGen/ARM/build-attributes.c @@ -0,0 +1,15 @@ +// RUN: %clang_cc1 -triple arm-none-eabi -fdenormal-fp-math=positive-zero -emit-llvm -o - | FileCheck %s --check-prefix=DM-PZ +// RUN: %clang_cc1 -triple arm-none-eabi -fdenormal-fp-math=ieee -emit-llvm -o - | FileCheck %s --check-prefix=DM-IEEE +// RUN: %clang_cc1 -triple arm-none-eabi -fdenormal-fp-math=preserve-sign -emit-llvm -o - | FileCheck %s --check-prefix=DM-PS + +// RUN: %clang_cc1 -triple arm-none-eabi -menable-no-infs -menable-no-nans -emit-llvm -o - | FileCheck %s --check-prefix=NM-FIN +// RUN: %clang_cc1 -triple arm-none-eabi -emit-llvm -o - | FileCheck %s --check-prefix=NM-IEEE + +// DM-PZ: !{i32 2, !"arm-eabi-fp-denormal", i32 0} +// DM-IEEE: !{i32 2, !"arm-eabi-fp-denormal", i32 1} +// DM-PS: !{i32 2, !"arm-eabi-fp-denormal", i32 2} + +// NM-FIN: !{i32 2, !"arm-eabi-fp-number-model", i32 1} +// NM-IEEE: !{i32 2, !"arm-eabi-fp-number-model", i32 3} + +void foo() {} diff --git a/clang/test/CodeGen/ubsan-function-sugared.cpp b/clang/test/CodeGen/ubsan-function-sugared.cpp index fb2487c024ba9..9399f1ceae27e 100644 --- a/clang/test/CodeGen/ubsan-function-sugared.cpp +++ b/clang/test/CodeGen/ubsan-function-sugared.cpp @@ -10,7 +10,7 @@ auto fun() {} // GNU-LABEL: define{{.*}} void @_Z6callerv() // MSVC-LABEL: define{{.*}} void @"?caller@@YAXXZ"() -// ARM: ptrtoint ptr {{.*}} to i32, !nosanitize !4 +// ARM: ptrtoint ptr {{.*}} to i32, !nosanitize !7 // ARM: and i32 {{.*}}, -2, !nosanitize !4 // ARM: inttoptr i32 {{.*}} to ptr, !nosanitize !4 // CHECK: getelementptr <{ i32, i32 }>, ptr {{.*}}, i32 -1, i32 0, !nosanitize diff --git a/clang/test/CodeGen/ubsan-function.cpp b/clang/test/CodeGen/ubsan-function.cpp index 76d4237383f83..666121688d0be 100644 --- a/clang/test/CodeGen/ubsan-function.cpp +++ b/clang/test/CodeGen/ubsan-function.cpp @@ -13,7 +13,7 @@ void fun() {} // GNU-LABEL: define{{.*}} void @_Z6callerPFvvE(ptr noundef %f) // MSVC-LABEL: define{{.*}} void @"?caller@@YAXP6AXXZ@Z"(ptr noundef %f) -// ARM: ptrtoint ptr {{.*}} to i32, !nosanitize !5 +// ARM: ptrtoint ptr {{.*}} to i32, !nosanitize !8 // ARM: and i32 {{.*}}, -2, !nosanitize !5 // ARM: inttoptr i32 {{.*}} to ptr, !nosanitize !5 // AUTH: %[[STRIPPED:.*]] = ptrtoint ptr {{.*}} to i64, !nosanitize _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
