
The CrossDSOCFI pass runs on the full LTO module and fills in the body of __cfi_check. This function must have the correct attributes in order to be compatible with the rest of the program. For example, when building with -mbranch-protection=standard, the function must have the branch-target-enforcement attribute, which is normally added by Clang. When __cfi_check is missing, CrossDSOCFI will give it the default set of attributes, which are likely incorrect. Therefore, emit __cfi_check to the full LTO part, where CrossDSOCFI will see it. Reviewers: efriedma-quic, vitalybuka, fmayer Reviewed By: efriedma-quic Pull Request: https://github.com/llvm/llvm-project/pull/154833
20 lines
573 B
LLVM
20 lines
573 B
LLVM
; RUN: opt -thinlto-bc -thinlto-split-lto-unit -o %t %s
|
|
; RUN: llvm-modextract -b -n 0 -o - %t | llvm-dis | FileCheck --check-prefix=M0 %s
|
|
; RUN: llvm-modextract -b -n 1 -o - %t | llvm-dis | FileCheck --check-prefix=M1 %s
|
|
|
|
; Check that __cfi_check is emitted on the full LTO side with
|
|
; attributes preserved.
|
|
|
|
; M0: define void @f()
|
|
define void @f() !type !{!"f1", i32 0} {
|
|
ret void
|
|
}
|
|
|
|
; M1: define void @__cfi_check() #0
|
|
define void @__cfi_check() #0 {
|
|
ret void
|
|
}
|
|
|
|
; M1: attributes #0 = { "branch-target-enforcement" }
|
|
attributes #0 = { "branch-target-enforcement" }
|