| ; RUN: opt -passes=lowertypetests -lowertypetests-summary-action=import -lowertypetests-read-summary=%p/Inputs/cfi-direct-call.yaml %s -S | FileCheck %s |
| |
| target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" |
| target triple = "x86_64-unknown-linux" |
| |
| declare void @external_decl() |
| declare void @external_nodecl() |
| ;declare void @internal_default_def() |
| declare hidden void @internal_hidden_def() |
| |
| define i8 @local_a() { |
| call void @external_decl() |
| call void @external_nodecl() |
| call void @internal_default_def() |
| call void @internal_hidden_def() |
| call void @dsolocal_default_def() |
| call void @local_b() |
| ret i8 1 |
| } |
| |
| define dso_local void @dsolocal_default_def() { |
| ret void |
| } |
| |
| define void @internal_default_def() { |
| ret void |
| } |
| |
| define void @local_b() { |
| ret void |
| } |
| |
| ; CHECK: define i8 @local_a() { |
| |
| ; Even though a jump table entry is generated, the call goes directly |
| ; to the function |
| ; CHECK-NEXT: call void @external_decl() |
| |
| ; External call with no CFI decl - no action |
| ; CHECK-NEXT: call void @external_nodecl() |
| |
| ; Internal function with default visibility gets routed through the jump table |
| ; as it may be overriden at run time. |
| ; CHECK-NEXT: call void @internal_default_def() |
| |
| ; Internal function with hidden visibility defined outside the module |
| ; generates a jump table entry and is renamed to *.cfi: route direct call |
| ; to the actual function, not jump table |
| ; CHECK-NEXT: call void @internal_hidden_def.cfi() |
| |
| ; dso_local function with defailt visibility can be short-circuited |
| ; CHECK-NEXT: call void @dsolocal_default_def.cfi() |
| |
| ; Local call - no action |
| ; CHECK-NEXT: call void @local_b |
| |
| ; CHECK-NEXT: ret i8 1 |
| |
| ; CHECK: declare hidden void @internal_hidden_def.cfi() |
| ; CHECK: declare hidden void @external_decl.cfi_jt() |