Skip to content

Commit

Permalink
[llvm][ARM][AArch64] Add attributes to synthetic functions. (llvm#83153)
Browse files Browse the repository at this point in the history
Module flags represent the original intention.

Depends on llvm#82819
  • Loading branch information
DanielKristofKiss authored and aaryanshukla committed Jul 14, 2024
1 parent b665667 commit 0f0aa4f
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 0 deletions.
29 changes: 29 additions & 0 deletions llvm/lib/IR/Function.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -407,6 +407,35 @@ Function *Function::createWithDefaultAttr(FunctionType *Ty,
StringRef DefaultFeatures = F->getContext().getDefaultTargetFeatures();
if (!DefaultFeatures.empty())
B.addAttribute("target-features", DefaultFeatures);

// Check if the module attribute is present and not zero.
auto isModuleAttributeSet = [&](const StringRef &ModAttr) -> bool {
const auto *Attr =
mdconst::extract_or_null<ConstantInt>(M->getModuleFlag(ModAttr));
return Attr && !Attr->isZero();
};

auto AddAttributeIfSet = [&](const StringRef &ModAttr) {
if (isModuleAttributeSet(ModAttr))
B.addAttribute(ModAttr);
};

StringRef SignType = "none";
if (isModuleAttributeSet("sign-return-address"))
SignType = "non-leaf";
if (isModuleAttributeSet("sign-return-address-all"))
SignType = "all";
if (SignType != "none") {
B.addAttribute("sign-return-address", SignType);
B.addAttribute("sign-return-address-key",
isModuleAttributeSet("sign-return-address-with-bkey")
? "b_key"
: "a_key");
}
AddAttributeIfSet("branch-target-enforcement");
AddAttributeIfSet("branch-protection-pauth-lr");
AddAttributeIfSet("guarded-control-stack");

F->addFnAttrs(B);
return F;
}
Expand Down
33 changes: 33 additions & 0 deletions llvm/test/Instrumentation/AddressSanitizer/module-flags-aarch64.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
;; Verify that the synthetic functions inherit their flags from the corresponding
;; BTE and return address signing module flags.
; RUN: opt < %s -passes=asan -S | FileCheck %s
; REQUIRES: aarch64-registered-target

target triple = "aarch64-unknown-linux-gnu"

@g = dso_local global i32 0, align 4

define i32 @test_load() sanitize_address {
entry:
%tmp = load i32, ptr @g, align 4
ret i32 %tmp
}

!llvm.module.flags = !{!0, !1}

;; Due to -fasynchronous-unwind-tables.
!0 = !{i32 7, !"uwtable", i32 2}

;; Due to -fno-omit-frame-pointer.
!1 = !{i32 7, !"frame-pointer", i32 2}

!llvm.module.flags = !{!2, !3, !4}

!2 = !{i32 8, !"branch-target-enforcement", i32 1}
!3 = !{i32 8, !"sign-return-address", i32 1}
!4 = !{i32 8, !"sign-return-address-all", i32 0}

;; Set the uwtable attribute on ctor/dtor.
; CHECK: define internal void @asan.module_ctor() #[[#ATTR:]]
; CHECK: define internal void @asan.module_dtor() #[[#ATTR]]
; CHECK: attributes #[[#ATTR]] = { nounwind uwtable "branch-target-enforcement" "frame-pointer"="all" "sign-return-address"="non-leaf" "sign-return-address-key"="a_key" }
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
;; Verify that the synthetic functions inherit their flags from the corresponding
;; BTE and return address signing module flags.
; RUN: opt < %s -passes=asan -S | FileCheck %s
; REQUIRES: aarch64-registered-target

target triple = "aarch64-unknown-linux-gnu"

@g = dso_local global i32 0, align 4

define i32 @test_load() sanitize_memory {
entry:
%tmp = load i32, ptr @g, align 4
ret i32 %tmp
}

!llvm.module.flags = !{!0, !1}

;; Due to -fasynchronous-unwind-tables.
!0 = !{i32 7, !"uwtable", i32 2}

;; Due to -fno-omit-frame-pointer.
!1 = !{i32 7, !"frame-pointer", i32 2}

!llvm.module.flags = !{!2, !3, !4}

!2 = !{i32 8, !"branch-target-enforcement", i32 1}
!3 = !{i32 8, !"sign-return-address", i32 1}
!4 = !{i32 8, !"sign-return-address-all", i32 0}

;; Set the uwtable attribute on ctor/dtor.
; CHECK: define internal void @asan.module_ctor() #[[#ATTR:]]
; CHECK: define internal void @asan.module_dtor() #[[#ATTR]]
; CHECK: attributes #[[#ATTR]] = { nounwind uwtable "branch-target-enforcement" "frame-pointer"="all" "sign-return-address"="non-leaf" "sign-return-address-key"="a_key" }

0 comments on commit 0f0aa4f

Please sign in to comment.