; RUN: llc -mtriple=x86_64-unknown-unknown < %s | FileCheck %s --check-prefix=X64 ; RUN: llc -mtriple=i386-unknown-unknown < %s | FileCheck %s --check-prefix=X86 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; foo ;; ----- ;; Checks ENDBR insertion after return twice functions. ;; setjmp, sigsetjmp, savectx, vfork, getcontext ;; setzx is not return twice function, should not followed by endbr. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; X64: callq setjmp ; X64-NEXT: endbr64 ; X64: callq setzx ; X64-NEXT: xorl ; X64: callq sigsetjmp ; X64-NEXT: endbr64 ; X64: callq savectx ; X64-NEXT: endbr64 ; X64: callq vfork ; X64-NEXT: endbr64 ; X64: callq getcontext ; X64-NEXT: endbr64 ; X86: calll setjmp ; X86-NEXT: endbr32 ; X86: calll setzx ; X86-NEXT: xorl ; X86: calll sigsetjmp ; X86-NEXT: endbr32 ; X86: calll savectx ; X86-NEXT: endbr32 ; X86: calll vfork ; X86-NEXT: endbr32 ; X86: calll getcontext ; X86-NEXT: endbr32 ; Function Attrs: noinline nounwind optnone uwtable define dso_local void @foo() #0 { entry: %call = call i32 (i32, ...) bitcast (i32 (...)* @setjmp to i32 (i32, ...)*)(i32 0) #1 %call1 = call i32 (i32, ...) bitcast (i32 (...)* @setzx to i32 (i32, ...)*)(i32 0) %call2 = call i32 (i32, ...) bitcast (i32 (...)* @sigsetjmp to i32 (i32, ...)*)(i32 0) #1 %call3 = call i32 (i32, ...) bitcast (i32 (...)* @setzx to i32 (i32, ...)*)(i32 0) %call4 = call i32 (i32, ...) bitcast (i32 (...)* @savectx to i32 (i32, ...)*)(i32 0) #1 %call5 = call i32 @vfork() #1 %call6 = call i32 (i32, ...) bitcast (i32 (...)* @setzx to i32 (i32, ...)*)(i32 0) %call7 = call i32 (i32, ...) bitcast (i32 (...)* @getcontext to i32 (i32, ...)*)(i32 0) #1 ret void } ; Function Attrs: returns_twice declare dso_local i32 @setjmp(...) #1 declare dso_local i32 @setzx(...) ; Function Attrs: returns_twice declare dso_local i32 @sigsetjmp(...) #1 ; Function Attrs: returns_twice declare dso_local i32 @savectx(...) #1 ; Function Attrs: returns_twice declare dso_local i32 @vfork() #1 ; Function Attrs: returns_twice declare dso_local i32 @getcontext(...) #1 attributes #0 = { noinline nounwind optnone uwtable } attributes #1 = { returns_twice } !llvm.module.flags = !{!0, !1, !2} !0 = !{i32 1, !"wchar_size", i32 4} !1 = !{i32 4, !"cf-protection-return", i32 1} !2 = !{i32 4, !"cf-protection-branch", i32 1}