symbol_relocation_tls.ll 6.48 KB
; FIXME: Even under non-pic mode, llvm for ve needs to generate pic code since
;        nld doesn't work with non-pic code.  Thefore, we test only pic codes
;        for both cases here.
;      llc -filetype=obj -mtriple=ve -o - %s | llvm-objdump - -d -r \
;          | FileCheck %s -check-prefix=LOCAL
; RUN: llc -filetype=obj -mtriple=ve -o - %s | llvm-objdump - -d -r \
; RUN:     | FileCheck %s -check-prefix=GENDYN
; RUN: llc -filetype=obj -mtriple=ve -relocation-model=pic -o - %s \
; RUN:     |  llvm-objdump - -d -r | FileCheck %s -check-prefix=GENDYNPIC

@x = external thread_local global i32, align 4
@y = internal thread_local global i32 0, align 4

; Function Attrs: norecurse nounwind readnone
define nonnull i32* @get_global() {
; GENDYN:         lea %s0, (-24)
; GENDYN-NEXT:    R_VE_TLS_GD_LO32 x
; GENDYN-NEXT:    and %s0, %s0, (32)0
; GENDYN-NEXT:    sic %s10
; GENDYN-NEXT:    lea.sl %s0, (%s10, %s0)
; GENDYN-NEXT:    R_VE_TLS_GD_HI32 x
; GENDYN-NEXT:    lea %s12, (8)
; GENDYN-NEXT:    R_VE_PLT_LO32 __tls_get_addr
; GENDYN-NEXT:    and %s12, %s12, (32)0
; GENDYN-NEXT:    lea.sl %s12, (%s10, %s12)
; GENDYN-NEXT:    R_VE_PLT_HI32 __tls_get_addr
; GENDYN-NEXT:    bsic %s10, (, %s12)
; GENDYN-NEXT:    or %s11, 0, %s9
;
; GENDYNPIC:         lea %s15, (-24)
; GENDYNPIC-NEXT:    R_VE_PC_LO32 _GLOBAL_OFFSET_TABLE_
; GENDYNPIC-NEXT:    and %s15, %s15, (32)0
; GENDYNPIC-NEXT:    sic %s16
; GENDYNPIC-NEXT:    lea.sl %s15, (%s16, %s15)
; GENDYNPIC-NEXT:    R_VE_PC_HI32 _GLOBAL_OFFSET_TABLE_
; GENDYNPIC-NEXT:    lea %s0, (-24)
; GENDYNPIC-NEXT:    R_VE_TLS_GD_LO32 x
; GENDYNPIC-NEXT:    and %s0, %s0, (32)0
; GENDYNPIC-NEXT:    sic %s10
; GENDYNPIC-NEXT:    lea.sl %s0, (%s10, %s0)
; GENDYNPIC-NEXT:    R_VE_TLS_GD_HI32 x
; GENDYNPIC-NEXT:    lea %s12, (8)
; GENDYNPIC-NEXT:    R_VE_PLT_LO32 __tls_get_addr
; GENDYNPIC-NEXT:    and %s12, %s12, (32)0
; GENDYNPIC-NEXT:    lea.sl %s12, (%s10, %s12)
; GENDYNPIC-NEXT:    R_VE_PLT_HI32 __tls_get_addr
; GENDYNPIC-NEXT:    bsic %s10, (, %s12)
; GENDYNPIC-NEXT:    or %s11, 0, %s9
entry:
  ret i32* @x
}

; Function Attrs: norecurse nounwind readnone
define nonnull i32* @get_local() {
; GENDYN:         lea %s0, (-24)
; GENDYN-NEXT:    R_VE_TLS_GD_LO32 y
; GENDYN-NEXT:    and %s0, %s0, (32)0
; GENDYN-NEXT:    sic %s10
; GENDYN-NEXT:    lea.sl %s0, (%s10, %s0)
; GENDYN-NEXT:    R_VE_TLS_GD_HI32 y
; GENDYN-NEXT:    lea %s12, (8)
; GENDYN-NEXT:    R_VE_PLT_LO32 __tls_get_addr
; GENDYN-NEXT:    and %s12, %s12, (32)0
; GENDYN-NEXT:    lea.sl %s12, (%s10, %s12)
; GENDYN-NEXT:    R_VE_PLT_HI32 __tls_get_addr
; GENDYN-NEXT:    bsic %s10, (, %s12)
; GENDYN-NEXT:    or %s11, 0, %s9
;
; GENDYNPIC:         lea %s15, (-24)
; GENDYNPIC-NEXT:    R_VE_PC_LO32 _GLOBAL_OFFSET_TABLE_
; GENDYNPIC-NEXT:    and %s15, %s15, (32)0
; GENDYNPIC-NEXT:    sic %s16
; GENDYNPIC-NEXT:    lea.sl %s15, (%s16, %s15)
; GENDYNPIC-NEXT:    R_VE_PC_HI32 _GLOBAL_OFFSET_TABLE_
; GENDYNPIC-NEXT:    lea %s0, (-24)
; GENDYNPIC-NEXT:    R_VE_TLS_GD_LO32 y
; GENDYNPIC-NEXT:    and %s0, %s0, (32)0
; GENDYNPIC-NEXT:    sic %s10
; GENDYNPIC-NEXT:    lea.sl %s0, (%s10, %s0)
; GENDYNPIC-NEXT:    R_VE_TLS_GD_HI32 y
; GENDYNPIC-NEXT:    lea %s12, (8)
; GENDYNPIC-NEXT:    R_VE_PLT_LO32 __tls_get_addr
; GENDYNPIC-NEXT:    and %s12, %s12, (32)0
; GENDYNPIC-NEXT:    lea.sl %s12, (%s10, %s12)
; GENDYNPIC-NEXT:    R_VE_PLT_HI32 __tls_get_addr
; GENDYNPIC-NEXT:    bsic %s10, (, %s12)
; GENDYNPIC-NEXT:    or %s11, 0, %s9
entry:
  ret i32* @y
}

; Function Attrs: norecurse nounwind
define void @set_global(i32 %v) {
; GENDYN:         lea %s0, (-24)
; GENDYN-NEXT:    R_VE_TLS_GD_LO32 x
; GENDYN-NEXT:    and %s0, %s0, (32)0
; GENDYN-NEXT:    sic %s10
; GENDYN-NEXT:    lea.sl %s0, (%s10, %s0)
; GENDYN-NEXT:    R_VE_TLS_GD_HI32 x
; GENDYN-NEXT:    lea %s12, (8)
; GENDYN-NEXT:    R_VE_PLT_LO32 __tls_get_addr
; GENDYN-NEXT:    and %s12, %s12, (32)0
; GENDYN-NEXT:    lea.sl %s12, (%s10, %s12)
; GENDYN-NEXT:    R_VE_PLT_HI32 __tls_get_addr
; GENDYN-NEXT:    bsic %s10, (, %s12)
; GENDYN-NEXT:    stl %s18, (, %s0)
; GENDYN-NEXT:    ld %s18, 48(, %s9)
; GENDYN-NEXT:    or %s11, 0, %s9
;
; GENDYNPIC:         lea %s15, (-24)
; GENDYNPIC-NEXT:    R_VE_PC_LO32 _GLOBAL_OFFSET_TABLE_
; GENDYNPIC-NEXT:    and %s15, %s15, (32)0
; GENDYNPIC-NEXT:    sic %s16
; GENDYNPIC-NEXT:    lea.sl %s15, (%s16, %s15)
; GENDYNPIC-NEXT:    R_VE_PC_HI32 _GLOBAL_OFFSET_TABLE_
; GENDYNPIC-NEXT:    lea %s0, (-24)
; GENDYNPIC-NEXT:    R_VE_TLS_GD_LO32 x
; GENDYNPIC-NEXT:    and %s0, %s0, (32)0
; GENDYNPIC-NEXT:    sic %s10
; GENDYNPIC-NEXT:    lea.sl %s0, (%s10, %s0)
; GENDYNPIC-NEXT:    R_VE_TLS_GD_HI32 x
; GENDYNPIC-NEXT:    lea %s12, (8)
; GENDYNPIC-NEXT:    R_VE_PLT_LO32 __tls_get_addr
; GENDYNPIC-NEXT:    and %s12, %s12, (32)0
; GENDYNPIC-NEXT:    lea.sl %s12, (%s10, %s12)
; GENDYNPIC-NEXT:    R_VE_PLT_HI32 __tls_get_addr
; GENDYNPIC-NEXT:    bsic %s10, (, %s12)
; GENDYNPIC-NEXT:    stl %s18, (, %s0)
; GENDYNPIC-NEXT:    ld %s18, 48(, %s9)
; GENDYNPIC-NEXT:    or %s11, 0, %s9
entry:
  store i32 %v, i32* @x, align 4
  ret void
}

; Function Attrs: norecurse nounwind
define void @set_local(i32 %v) {
; GENDYN:         lea %s0, (-24)
; GENDYN-NEXT:    R_VE_TLS_GD_LO32 y
; GENDYN-NEXT:    and %s0, %s0, (32)0
; GENDYN-NEXT:    sic %s10
; GENDYN-NEXT:    lea.sl %s0, (%s10, %s0)
; GENDYN-NEXT:    R_VE_TLS_GD_HI32 y
; GENDYN-NEXT:    lea %s12, (8)
; GENDYN-NEXT:    R_VE_PLT_LO32 __tls_get_addr
; GENDYN-NEXT:    and %s12, %s12, (32)0
; GENDYN-NEXT:    lea.sl %s12, (%s10, %s12)
; GENDYN-NEXT:    R_VE_PLT_HI32 __tls_get_addr
; GENDYN-NEXT:    bsic %s10, (, %s12)
; GENDYN-NEXT:    stl %s18, (, %s0)
; GENDYN-NEXT:    ld %s18, 48(, %s9)
; GENDYN-NEXT:    or %s11, 0, %s9
;
; GENDYNPIC:         lea %s15, (-24)
; GENDYNPIC-NEXT:    R_VE_PC_LO32 _GLOBAL_OFFSET_TABLE_
; GENDYNPIC-NEXT:    and %s15, %s15, (32)0
; GENDYNPIC-NEXT:    sic %s16
; GENDYNPIC-NEXT:    lea.sl %s15, (%s16, %s15)
; GENDYNPIC-NEXT:    R_VE_PC_HI32 _GLOBAL_OFFSET_TABLE_
; GENDYNPIC-NEXT:    lea %s0, (-24)
; GENDYNPIC-NEXT:    R_VE_TLS_GD_LO32 y
; GENDYNPIC-NEXT:    and %s0, %s0, (32)0
; GENDYNPIC-NEXT:    sic %s10
; GENDYNPIC-NEXT:    lea.sl %s0, (%s10, %s0)
; GENDYNPIC-NEXT:    R_VE_TLS_GD_HI32 y
; GENDYNPIC-NEXT:    lea %s12, (8)
; GENDYNPIC-NEXT:    R_VE_PLT_LO32 __tls_get_addr
; GENDYNPIC-NEXT:    and %s12, %s12, (32)0
; GENDYNPIC-NEXT:    lea.sl %s12, (%s10, %s12)
; GENDYNPIC-NEXT:    R_VE_PLT_HI32 __tls_get_addr
; GENDYNPIC-NEXT:    bsic %s10, (, %s12)
; GENDYNPIC-NEXT:    stl %s18, (, %s0)
; GENDYNPIC-NEXT:    ld %s18, 48(, %s9)
; GENDYNPIC-NEXT:    or %s11, 0, %s9
entry:
  store i32 %v, i32* @y, align 4
  ret void
}