Skip to content

Commit 005a0ff

Browse files
committed
[ARM][clang] Add some build attributes support
1 parent 3257dc3 commit 005a0ff

File tree

4 files changed

+48
-6
lines changed

4 files changed

+48
-6
lines changed

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@
6161
#include "llvm/IR/ProfileSummary.h"
6262
#include "llvm/ProfileData/InstrProfReader.h"
6363
#include "llvm/ProfileData/SampleProf.h"
64+
#include "llvm/Support/ARMBuildAttributes.h"
6465
#include "llvm/Support/CRC.h"
6566
#include "llvm/Support/CodeGen.h"
6667
#include "llvm/Support/CommandLine.h"
@@ -1383,6 +1384,32 @@ void CodeGenModule::Release() {
13831384
}
13841385
}
13851386
}
1387+
if ((T.isARM() || T.isThumb()) && getTriple().isTargetAEABI() &&
1388+
getTriple().isOSBinFormatELF()) {
1389+
uint32_t TagVal = 0;
1390+
if (getCodeGenOpts().FPDenormalMode ==
1391+
llvm::DenormalMode::getPositiveZero())
1392+
TagVal = llvm::ARMBuildAttrs::PositiveZero;
1393+
else if (getCodeGenOpts().FPDenormalMode == llvm::DenormalMode::getIEEE())
1394+
TagVal = llvm::ARMBuildAttrs::IEEEDenormals;
1395+
else if (getCodeGenOpts().FPDenormalMode ==
1396+
llvm::DenormalMode::getPreserveSign())
1397+
TagVal = llvm::ARMBuildAttrs::PreserveFPSign;
1398+
getModule().addModuleFlag(llvm::Module::Warning, "arm-eabi-fp-denormal",
1399+
TagVal);
1400+
1401+
if (getLangOpts().getFPExceptionMode() !=
1402+
LangOptions::FPExceptionModeKind::FPE_Ignore)
1403+
getModule().addModuleFlag(llvm::Module::Warning, "arm-eabi-fp-exceptions",
1404+
llvm::ARMBuildAttrs::Allowed);
1405+
1406+
if (getLangOpts().NoHonorNaNs && getLangOpts().NoHonorInfs)
1407+
TagVal = llvm::ARMBuildAttrs::AllowIEEENormal;
1408+
else
1409+
TagVal = llvm::ARMBuildAttrs::AllowIEEE754;
1410+
getModule().addModuleFlag(llvm::Module::Warning, "arm-eabi-fp-number-model",
1411+
TagVal);
1412+
}
13861413

13871414
if (CodeGenOpts.StackClashProtector)
13881415
getModule().addModuleFlag(
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// RUN: %clang_cc1 -triple arm-none-eabi -fdenormal-fp-math=positive-zero -emit-llvm -o - | FileCheck %s --check-prefix=DM-PZ
2+
// RUN: %clang_cc1 -triple arm-none-eabi -fdenormal-fp-math=ieee -emit-llvm -o - | FileCheck %s --check-prefix=DM-IEEE
3+
// RUN: %clang_cc1 -triple arm-none-eabi -fdenormal-fp-math=preserve-sign -emit-llvm -o - | FileCheck %s --check-prefix=DM-PS
4+
5+
// RUN: %clang_cc1 -triple arm-none-eabi -menable-no-infs -menable-no-nans -emit-llvm -o - | FileCheck %s --check-prefix=NM-FIN
6+
// RUN: %clang_cc1 -triple arm-none-eabi -emit-llvm -o - | FileCheck %s --check-prefix=NM-IEEE
7+
8+
// DM-PZ: !{i32 2, !"arm-eabi-fp-denormal", i32 0}
9+
// DM-IEEE: !{i32 2, !"arm-eabi-fp-denormal", i32 1}
10+
// DM-PS: !{i32 2, !"arm-eabi-fp-denormal", i32 2}
11+
12+
// NM-FIN: !{i32 2, !"arm-eabi-fp-number-model", i32 1}
13+
// NM-IEEE: !{i32 2, !"arm-eabi-fp-number-model", i32 3}
14+
15+
void foo() {}

clang/test/CodeGen/ubsan-function-sugared.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ auto fun() {}
1010

1111
// GNU-LABEL: define{{.*}} void @_Z6callerv()
1212
// MSVC-LABEL: define{{.*}} void @"?caller@@YAXXZ"()
13-
// ARM: ptrtoint ptr {{.*}} to i32, !nosanitize !4
14-
// ARM: and i32 {{.*}}, -2, !nosanitize !4
15-
// ARM: inttoptr i32 {{.*}} to ptr, !nosanitize !4
13+
// ARM: ptrtoint ptr {{.*}} to i32, !nosanitize !7
14+
// ARM: and i32 {{.*}}, -2, !nosanitize !7
15+
// ARM: inttoptr i32 {{.*}} to ptr, !nosanitize !7
1616
// CHECK: getelementptr <{ i32, i32 }>, ptr {{.*}}, i32 -1, i32 0, !nosanitize
1717
// CHECK: load i32, ptr {{.*}}, align {{.*}}, !nosanitize
1818
// CHECK: icmp eq i32 {{.*}}, -1056584962, !nosanitize

clang/test/CodeGen/ubsan-function.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ void fun() {}
1313

1414
// GNU-LABEL: define{{.*}} void @_Z6callerPFvvE(ptr noundef %f)
1515
// MSVC-LABEL: define{{.*}} void @"?caller@@YAXP6AXXZ@Z"(ptr noundef %f)
16-
// ARM: ptrtoint ptr {{.*}} to i32, !nosanitize !5
17-
// ARM: and i32 {{.*}}, -2, !nosanitize !5
18-
// ARM: inttoptr i32 {{.*}} to ptr, !nosanitize !5
16+
// ARM: ptrtoint ptr {{.*}} to i32, !nosanitize !8
17+
// ARM: and i32 {{.*}}, -2, !nosanitize !8
18+
// ARM: inttoptr i32 {{.*}} to ptr, !nosanitize !8
1919
// AUTH: %[[STRIPPED:.*]] = ptrtoint ptr {{.*}} to i64, !nosanitize
2020
// AUTH: call i64 @llvm.ptrauth.auth(i64 %[[STRIPPED]], i32 0, i64 0), !nosanitize
2121
// CHECK: getelementptr <{ i32, i32 }>, ptr {{.*}}, i32 -1, i32 0, !nosanitize

0 commit comments

Comments
 (0)