From 005a0ff620c0df0b3192e9935e2979a7b3d8f759 Mon Sep 17 00:00:00 2001 From: PaperChalice 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 | 6 ++--- clang/test/CodeGen/ubsan-function.cpp | 6 ++--- 4 files changed, 48 insertions(+), 6 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..2eb1e5239de50 100644 --- a/clang/test/CodeGen/ubsan-function-sugared.cpp +++ b/clang/test/CodeGen/ubsan-function-sugared.cpp @@ -10,9 +10,9 @@ auto fun() {} // GNU-LABEL: define{{.*}} void @_Z6callerv() // MSVC-LABEL: define{{.*}} void @"?caller@@YAXXZ"() -// ARM: ptrtoint ptr {{.*}} to i32, !nosanitize !4 -// ARM: and i32 {{.*}}, -2, !nosanitize !4 -// ARM: inttoptr i32 {{.*}} to ptr, !nosanitize !4 +// ARM: ptrtoint ptr {{.*}} to i32, !nosanitize !7 +// ARM: and i32 {{.*}}, -2, !nosanitize !7 +// ARM: inttoptr i32 {{.*}} to ptr, !nosanitize !7 // CHECK: getelementptr <{ i32, i32 }>, ptr {{.*}}, i32 -1, i32 0, !nosanitize // CHECK: load i32, ptr {{.*}}, align {{.*}}, !nosanitize // CHECK: icmp eq i32 {{.*}}, -1056584962, !nosanitize diff --git a/clang/test/CodeGen/ubsan-function.cpp b/clang/test/CodeGen/ubsan-function.cpp index 76d4237383f83..33c110eb6a404 100644 --- a/clang/test/CodeGen/ubsan-function.cpp +++ b/clang/test/CodeGen/ubsan-function.cpp @@ -13,9 +13,9 @@ 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: and i32 {{.*}}, -2, !nosanitize !5 -// ARM: inttoptr i32 {{.*}} to ptr, !nosanitize !5 +// ARM: ptrtoint ptr {{.*}} to i32, !nosanitize !8 +// ARM: and i32 {{.*}}, -2, !nosanitize !8 +// ARM: inttoptr i32 {{.*}} to ptr, !nosanitize !8 // AUTH: %[[STRIPPED:.*]] = ptrtoint ptr {{.*}} to i64, !nosanitize // AUTH: call i64 @llvm.ptrauth.auth(i64 %[[STRIPPED]], i32 0, i64 0), !nosanitize // CHECK: getelementptr <{ i32, i32 }>, ptr {{.*}}, i32 -1, i32 0, !nosanitize