We only want to treat globals as potentially far away, not other things like constants in the constant pool. This matches the object file emission that only puts the large section flag on globals. Remove FIXME since the remaining differences are accesses to 0 sized globals which are intentional.
608 lines
20 KiB
LLVM
608 lines
20 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp
|
|
; Run with --no_x86_scrub_rip because we care a lot about how globals are
|
|
; accessed in the code model.
|
|
|
|
; RUN: llc -verify-machineinstrs < %s -relocation-model=static -code-model=small | FileCheck %s --check-prefix=CHECK --check-prefix=SMALL-STATIC
|
|
; RUN: llc -verify-machineinstrs < %s -relocation-model=static -code-model=medium | FileCheck %s --check-prefix=CHECK --check-prefix=MEDIUM-STATIC
|
|
; RUN: llc -verify-machineinstrs < %s -relocation-model=static -code-model=large | FileCheck %s --check-prefix=CHECK --check-prefix=LARGE-STATIC
|
|
; RUN: llc -verify-machineinstrs < %s -relocation-model=pic -code-model=small | FileCheck %s --check-prefix=CHECK --check-prefix=SMALL-PIC
|
|
; RUN: llc -verify-machineinstrs < %s -relocation-model=pic -code-model=medium -large-data-threshold=1000 | FileCheck %s --check-prefix=CHECK --check-prefix=MEDIUM-SMALL-DATA-PIC
|
|
; RUN: llc -verify-machineinstrs < %s -relocation-model=pic -code-model=medium | FileCheck %s --check-prefix=CHECK --check-prefix=MEDIUM-PIC
|
|
; RUN: llc -verify-machineinstrs < %s -relocation-model=pic -code-model=large | FileCheck %s --check-prefix=CHECK --check-prefix=LARGE-PIC
|
|
|
|
; Generated from this C source:
|
|
;
|
|
; static int static_data[10];
|
|
; int global_data[10] = {1, 2};
|
|
; extern int extern_data[10];
|
|
;
|
|
; int *lea_static_data() { return &static_data[0]; }
|
|
; int *lea_global_data() { return &global_data[0]; }
|
|
; int *lea_extern_data() { return &extern_data[0]; }
|
|
;
|
|
; static void static_fn(void) {}
|
|
; void global_fn(void) {}
|
|
; void extern_fn(void);
|
|
;
|
|
; typedef void (*void_fn)(void);
|
|
; void_fn lea_static_fn() { return &static_fn; }
|
|
; void_fn lea_global_fn() { return &global_fn; }
|
|
; void_fn lea_extern_fn() { return &extern_fn; }
|
|
|
|
|
|
; ModuleID = 'model.c'
|
|
source_filename = "model.c"
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64--linux"
|
|
|
|
@global_data = dso_local global [10 x i32] [i32 1, i32 2, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0], align 16
|
|
@static_data = internal global [10 x i32] zeroinitializer, align 16
|
|
@extern_data = external global [10 x i32], align 16
|
|
@thread_data = external thread_local global i32, align 4
|
|
@unknown_size_data = dso_local global [0 x i32] zeroinitializer, align 16
|
|
|
|
|
|
define dso_local ptr @lea_static_data() #0 {
|
|
; SMALL-STATIC-LABEL: lea_static_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl $static_data, %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: lea_static_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movabsq $static_data, %rax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: lea_static_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $static_data, %rax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: lea_static_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: leaq static_data(%rip), %rax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_static_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq static_data(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: lea_static_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
|
|
; MEDIUM-PIC-NEXT: movabsq $static_data@GOTOFF, %rax
|
|
; MEDIUM-PIC-NEXT: addq %rcx, %rax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: lea_static_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L0$pb:
|
|
; LARGE-PIC-NEXT: leaq .L0$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L0$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $static_data@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: addq %rcx, %rax
|
|
; LARGE-PIC-NEXT: retq
|
|
ret ptr @static_data
|
|
}
|
|
|
|
define dso_local ptr @lea_global_data() #0 {
|
|
; SMALL-STATIC-LABEL: lea_global_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl $global_data, %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: lea_global_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movabsq $global_data, %rax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: lea_global_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $global_data, %rax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: lea_global_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: leaq global_data(%rip), %rax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_global_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq global_data(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: lea_global_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
|
|
; MEDIUM-PIC-NEXT: movabsq $global_data@GOTOFF, %rax
|
|
; MEDIUM-PIC-NEXT: addq %rcx, %rax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: lea_global_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L1$pb:
|
|
; LARGE-PIC-NEXT: leaq .L1$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L1$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $global_data@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: addq %rcx, %rax
|
|
; LARGE-PIC-NEXT: retq
|
|
ret ptr @global_data
|
|
}
|
|
|
|
define dso_local ptr @lea_extern_data() #0 {
|
|
; SMALL-STATIC-LABEL: lea_extern_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: lea_extern_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: lea_extern_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $extern_data, %rax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: lea_extern_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_extern_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: lea_extern_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: lea_extern_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L2$pb:
|
|
; LARGE-PIC-NEXT: leaq .L2$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L2$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $extern_data@GOT, %rax
|
|
; LARGE-PIC-NEXT: movq (%rcx,%rax), %rax
|
|
; LARGE-PIC-NEXT: retq
|
|
ret ptr @extern_data
|
|
}
|
|
|
|
define dso_local ptr @lea_unknown_size_data() #0 {
|
|
; SMALL-STATIC-LABEL: lea_unknown_size_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl $unknown_size_data, %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: lea_unknown_size_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movabsq $unknown_size_data, %rax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: lea_unknown_size_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $unknown_size_data, %rax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: lea_unknown_size_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: leaq unknown_size_data(%rip), %rax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_unknown_size_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movabsq $unknown_size_data@GOTOFF, %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: addq %rcx, %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: lea_unknown_size_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rcx
|
|
; MEDIUM-PIC-NEXT: movabsq $unknown_size_data@GOTOFF, %rax
|
|
; MEDIUM-PIC-NEXT: addq %rcx, %rax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: lea_unknown_size_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L3$pb:
|
|
; LARGE-PIC-NEXT: leaq .L3$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L3$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $unknown_size_data@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: addq %rcx, %rax
|
|
; LARGE-PIC-NEXT: retq
|
|
ret ptr @unknown_size_data
|
|
}
|
|
|
|
define dso_local i32 @load_global_data() #0 {
|
|
; SMALL-STATIC-LABEL: load_global_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl global_data+8(%rip), %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: load_global_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movabsq $global_data, %rax
|
|
; MEDIUM-STATIC-NEXT: movl 8(%rax), %eax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: load_global_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $global_data, %rax
|
|
; LARGE-STATIC-NEXT: movl 8(%rax), %eax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: load_global_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: movl global_data+8(%rip), %eax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: load_global_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq global_data(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movl 8(%rax), %eax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: load_global_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
|
|
; MEDIUM-PIC-NEXT: movabsq $global_data@GOTOFF, %rcx
|
|
; MEDIUM-PIC-NEXT: movl 8(%rax,%rcx), %eax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: load_global_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L4$pb:
|
|
; LARGE-PIC-NEXT: leaq .L4$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L4$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $global_data@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: movl 8(%rcx,%rax), %eax
|
|
; LARGE-PIC-NEXT: retq
|
|
%rv = load i32, ptr getelementptr inbounds ([10 x i32], ptr @global_data, i64 0, i64 2)
|
|
ret i32 %rv
|
|
}
|
|
|
|
define dso_local i32 @load_extern_data() #0 {
|
|
; SMALL-STATIC-LABEL: load_extern_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; SMALL-STATIC-NEXT: movl 8(%rax), %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: load_extern_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; MEDIUM-STATIC-NEXT: movl 8(%rax), %eax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: load_extern_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $extern_data, %rax
|
|
; LARGE-STATIC-NEXT: movl 8(%rax), %eax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: load_extern_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; SMALL-PIC-NEXT: movl 8(%rax), %eax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: load_extern_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movl 8(%rax), %eax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: load_extern_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: movq extern_data@GOTPCREL(%rip), %rax
|
|
; MEDIUM-PIC-NEXT: movl 8(%rax), %eax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: load_extern_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L5$pb:
|
|
; LARGE-PIC-NEXT: leaq .L5$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L5$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $extern_data@GOT, %rax
|
|
; LARGE-PIC-NEXT: movq (%rcx,%rax), %rax
|
|
; LARGE-PIC-NEXT: movl 8(%rax), %eax
|
|
; LARGE-PIC-NEXT: retq
|
|
%rv = load i32, ptr getelementptr inbounds ([10 x i32], ptr @extern_data, i64 0, i64 2)
|
|
ret i32 %rv
|
|
}
|
|
|
|
define dso_local i32 @load_unknown_size_data() #0 {
|
|
; SMALL-STATIC-LABEL: load_unknown_size_data:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl unknown_size_data+8(%rip), %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: load_unknown_size_data:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movabsq $unknown_size_data, %rax
|
|
; MEDIUM-STATIC-NEXT: movl 8(%rax), %eax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: load_unknown_size_data:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $unknown_size_data, %rax
|
|
; LARGE-STATIC-NEXT: movl 8(%rax), %eax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: load_unknown_size_data:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: movl unknown_size_data+8(%rip), %eax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: load_unknown_size_data:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movabsq $unknown_size_data@GOTOFF, %rcx
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movl 8(%rax,%rcx), %eax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: load_unknown_size_data:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq _GLOBAL_OFFSET_TABLE_(%rip), %rax
|
|
; MEDIUM-PIC-NEXT: movabsq $unknown_size_data@GOTOFF, %rcx
|
|
; MEDIUM-PIC-NEXT: movl 8(%rax,%rcx), %eax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: load_unknown_size_data:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L6$pb:
|
|
; LARGE-PIC-NEXT: leaq .L6$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L6$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $unknown_size_data@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: movl 8(%rcx,%rax), %eax
|
|
; LARGE-PIC-NEXT: retq
|
|
%rv = load i32, ptr getelementptr inbounds (i32, ptr @unknown_size_data, i64 2)
|
|
ret i32 %rv
|
|
}
|
|
|
|
define dso_local void @global_fn() #0 {
|
|
; CHECK-LABEL: global_fn:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: retq
|
|
ret void
|
|
}
|
|
|
|
define internal void @static_fn() #0 {
|
|
; CHECK-LABEL: static_fn:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: retq
|
|
ret void
|
|
}
|
|
|
|
declare void @extern_fn()
|
|
|
|
define dso_local ptr @lea_static_fn() #0 {
|
|
; SMALL-STATIC-LABEL: lea_static_fn:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl $static_fn, %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: lea_static_fn:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: leaq static_fn(%rip), %rax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: lea_static_fn:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $static_fn, %rax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: lea_static_fn:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: leaq static_fn(%rip), %rax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_static_fn:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq static_fn(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: lea_static_fn:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq static_fn(%rip), %rax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: lea_static_fn:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L9$pb:
|
|
; LARGE-PIC-NEXT: leaq .L9$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L9$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $static_fn@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: addq %rcx, %rax
|
|
; LARGE-PIC-NEXT: retq
|
|
ret ptr @static_fn
|
|
}
|
|
|
|
define dso_local ptr @lea_global_fn() #0 {
|
|
; SMALL-STATIC-LABEL: lea_global_fn:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movl $global_fn, %eax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: lea_global_fn:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: leaq global_fn(%rip), %rax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: lea_global_fn:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $global_fn, %rax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: lea_global_fn:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: leaq global_fn(%rip), %rax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_global_fn:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: leaq global_fn(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: lea_global_fn:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: leaq global_fn(%rip), %rax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: lea_global_fn:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L10$pb:
|
|
; LARGE-PIC-NEXT: leaq .L10$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L10$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $global_fn@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: addq %rcx, %rax
|
|
; LARGE-PIC-NEXT: retq
|
|
ret ptr @global_fn
|
|
}
|
|
|
|
define dso_local ptr @lea_extern_fn() #0 {
|
|
; SMALL-STATIC-LABEL: lea_extern_fn:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: movq extern_fn@GOTPCREL(%rip), %rax
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: lea_extern_fn:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movq extern_fn@GOTPCREL(%rip), %rax
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: lea_extern_fn:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq $extern_fn, %rax
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: lea_extern_fn:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: movq extern_fn@GOTPCREL(%rip), %rax
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: lea_extern_fn:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: movq extern_fn@GOTPCREL(%rip), %rax
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: lea_extern_fn:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: movq extern_fn@GOTPCREL(%rip), %rax
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: lea_extern_fn:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L11$pb:
|
|
; LARGE-PIC-NEXT: leaq .L11$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L11$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq $extern_fn@GOT, %rax
|
|
; LARGE-PIC-NEXT: movq (%rcx,%rax), %rax
|
|
; LARGE-PIC-NEXT: retq
|
|
ret ptr @extern_fn
|
|
}
|
|
|
|
; FIXME: The result is same for small, medium and large model, because we
|
|
; specify pie option in the test case. And the type of tls is initial exec tls.
|
|
; For pic code. The large model code for pic tls should be emitted as below.
|
|
|
|
; .L3:
|
|
; leaq .L3(%rip), %rbx
|
|
; movabsq $_GLOBAL_OFFSET_TABLE_-.L3, %r11
|
|
; addq %r11, %rbx
|
|
; leaq thread_data@TLSGD(%rip), %rdi
|
|
; movabsq $__tls_get_addr@PLTOFF, %rax
|
|
; addq %rbx, %rax
|
|
; call *%rax
|
|
; movl (%rax), %eax
|
|
|
|
; The medium and small model code for pic tls should be emitted as below.
|
|
; data16
|
|
; leaq thread_data@TLSGD(%rip), %rdi
|
|
; data16
|
|
; data16
|
|
; rex64
|
|
; callq __tls_get_addr@PLT
|
|
; movl (%rax), %eax
|
|
|
|
define dso_local i32 @load_thread_data() #0 {
|
|
; CHECK-LABEL: load_thread_data:
|
|
; CHECK: # %bb.0:
|
|
; CHECK-NEXT: movq thread_data@GOTTPOFF(%rip), %rax
|
|
; CHECK-NEXT: movl %fs:(%rax), %eax
|
|
; CHECK-NEXT: retq
|
|
%1 = load i32, ptr @thread_data, align 4
|
|
ret i32 %1
|
|
}
|
|
|
|
define dso_local float @load_constant_pool(float %x) #0 {
|
|
; SMALL-STATIC-LABEL: load_constant_pool:
|
|
; SMALL-STATIC: # %bb.0:
|
|
; SMALL-STATIC-NEXT: addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
|
|
; SMALL-STATIC-NEXT: retq
|
|
;
|
|
; MEDIUM-STATIC-LABEL: load_constant_pool:
|
|
; MEDIUM-STATIC: # %bb.0:
|
|
; MEDIUM-STATIC-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax
|
|
; MEDIUM-STATIC-NEXT: addss (%rax), %xmm0
|
|
; MEDIUM-STATIC-NEXT: retq
|
|
;
|
|
; LARGE-STATIC-LABEL: load_constant_pool:
|
|
; LARGE-STATIC: # %bb.0:
|
|
; LARGE-STATIC-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}, %rax
|
|
; LARGE-STATIC-NEXT: addss (%rax), %xmm0
|
|
; LARGE-STATIC-NEXT: retq
|
|
;
|
|
; SMALL-PIC-LABEL: load_constant_pool:
|
|
; SMALL-PIC: # %bb.0:
|
|
; SMALL-PIC-NEXT: addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
|
|
; SMALL-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-SMALL-DATA-PIC-LABEL: load_constant_pool:
|
|
; MEDIUM-SMALL-DATA-PIC: # %bb.0:
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
|
|
; MEDIUM-SMALL-DATA-PIC-NEXT: retq
|
|
;
|
|
; MEDIUM-PIC-LABEL: load_constant_pool:
|
|
; MEDIUM-PIC: # %bb.0:
|
|
; MEDIUM-PIC-NEXT: addss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
|
|
; MEDIUM-PIC-NEXT: retq
|
|
;
|
|
; LARGE-PIC-LABEL: load_constant_pool:
|
|
; LARGE-PIC: # %bb.0:
|
|
; LARGE-PIC-NEXT: .L13$pb:
|
|
; LARGE-PIC-NEXT: leaq .L13$pb(%rip), %rax
|
|
; LARGE-PIC-NEXT: movabsq $_GLOBAL_OFFSET_TABLE_-.L13$pb, %rcx
|
|
; LARGE-PIC-NEXT: addq %rax, %rcx
|
|
; LARGE-PIC-NEXT: movabsq ${{\.?LCPI[0-9]+_[0-9]+}}@GOTOFF, %rax
|
|
; LARGE-PIC-NEXT: addss (%rcx,%rax), %xmm0
|
|
; LARGE-PIC-NEXT: retq
|
|
%a = fadd float %x, 1.0
|
|
ret float %a
|
|
}
|
|
|
|
attributes #0 = { noinline nounwind uwtable }
|
|
|
|
!llvm.module.flags = !{!0, !1, !2}
|
|
!llvm.ident = !{!3}
|
|
|
|
!0 = !{i32 1, !"wchar_size", i32 4}
|
|
!1 = !{i32 7, !"PIC Level", i32 2}
|
|
!2 = !{i32 7, !"PIE Level", i32 2}
|
|
!3 = !{!"clang version 7.0.0 "}
|