llvm/llvm/test/CodeGen/WebAssembly/stack-protector.ll

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -verify-machineinstrs -mtriple=wasm32-unknown-unknown < %s | FileCheck -check-prefix=WASM32 %s

@"\01LC" = internal constant [11 x i8] c"buf == %s\0A\00"		; <ptr> [#uses=1]

define void @test(ptr %a) nounwind ssp {
; WASM32-LABEL: test:
; WASM32:         .functype test (i32) -> ()
; WASM32-NEXT:    .local i32
; WASM32-NEXT:  # %bb.0: # %entry
; WASM32-NEXT:    global.get __stack_pointer
; WASM32-NEXT:    i32.const 32
; WASM32-NEXT:    i32.sub
; WASM32-NEXT:    local.tee 1
; WASM32-NEXT:    global.set __stack_pointer
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    local.get 0
; WASM32-NEXT:    i32.store 16
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.const 0
; WASM32-NEXT:    i32.load __stack_chk_guard
; WASM32-NEXT:    i32.store 28
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.const 20
; WASM32-NEXT:    i32.add
; WASM32-NEXT:    local.get 0
; WASM32-NEXT:    call strcpy
; WASM32-NEXT:    drop
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.const 20
; WASM32-NEXT:    i32.add
; WASM32-NEXT:    i32.store 0
; WASM32-NEXT:    i32.const LC
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    call printf
; WASM32-NEXT:    drop
; WASM32-NEXT:    block
; WASM32-NEXT:    i32.const 0
; WASM32-NEXT:    i32.load __stack_chk_guard
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.load 28
; WASM32-NEXT:    i32.eq
; WASM32-NEXT:    br_if 0 # 0: down to label0
; WASM32-NEXT:  # %bb.1: # %return
; WASM32-NEXT:    call __stack_chk_fail
; WASM32-NEXT:    unreachable
; WASM32-NEXT:  .LBB0_2: # %return
; WASM32-NEXT:    end_block # label0:
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.const 32
; WASM32-NEXT:    i32.add
; WASM32-NEXT:    global.set __stack_pointer
; WASM32-NEXT:    # fallthrough-return
entry:
	%a_addr = alloca ptr		; <ptr> [#uses=2]
	%buf = alloca [8 x i8]		; <ptr> [#uses=2]
  %"alloca point" = bitcast i32 0 to i32		; <i32> [#uses=0]
	store ptr %a, ptr %a_addr
	%0 = load ptr, ptr %a_addr, align 4		; <ptr> [#uses=1]
	%1 = call ptr @strcpy(ptr %buf, ptr %0) nounwind		; <ptr> [#uses=0]
	%2 = call i32 (ptr, ...) @printf(ptr @"\01LC", ptr %buf) nounwind		; <i32> [#uses=0]
	br label %return

return:		; preds = %entry
	ret void
}

define i32 @test_return_i32(ptr %a) nounwind ssp {
; WASM32-LABEL: test_return_i32:
; WASM32:         .functype test_return_i32 (i32) -> (i32)
; WASM32-NEXT:    .local i32
; WASM32-NEXT:  # %bb.0: # %entry
; WASM32-NEXT:    global.get __stack_pointer
; WASM32-NEXT:    i32.const 32
; WASM32-NEXT:    i32.sub
; WASM32-NEXT:    local.tee 1
; WASM32-NEXT:    global.set __stack_pointer
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    local.get 0
; WASM32-NEXT:    i32.store 16
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.const 0
; WASM32-NEXT:    i32.load __stack_chk_guard
; WASM32-NEXT:    i32.store 28
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.const 20
; WASM32-NEXT:    i32.add
; WASM32-NEXT:    local.get 0
; WASM32-NEXT:    call strcpy
; WASM32-NEXT:    drop
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.const 20
; WASM32-NEXT:    i32.add
; WASM32-NEXT:    i32.store 0
; WASM32-NEXT:    i32.const LC
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    call printf
; WASM32-NEXT:    drop
; WASM32-NEXT:    block
; WASM32-NEXT:    i32.const 0
; WASM32-NEXT:    i32.load __stack_chk_guard
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.load 28
; WASM32-NEXT:    i32.eq
; WASM32-NEXT:    br_if 0 # 0: down to label1
; WASM32-NEXT:  # %bb.1: # %return
; WASM32-NEXT:    call __stack_chk_fail
; WASM32-NEXT:    unreachable
; WASM32-NEXT:  .LBB1_2: # %return
; WASM32-NEXT:    end_block # label1:
; WASM32-NEXT:    local.get 1
; WASM32-NEXT:    i32.const 32
; WASM32-NEXT:    i32.add
; WASM32-NEXT:    global.set __stack_pointer
; WASM32-NEXT:    i32.const 0
; WASM32-NEXT:    # fallthrough-return
entry:
  %a_addr = alloca ptr    ; <ptr> [#uses=2]
  %buf = alloca [8 x i8]    ; <ptr> [#uses=2]
  %"alloca point" = bitcast i32 0 to i32    ; <i32> [#uses=0]
  store ptr %a, ptr %a_addr
  %0 = load ptr, ptr %a_addr, align 4    ; <ptr> [#uses=1]
  %1 = call ptr @strcpy(ptr %buf, ptr %0) nounwind    ; <ptr> [#uses=0]
  %2 = call i32 (ptr, ...) @printf(ptr @"\01LC", ptr %buf) nounwind    ; <i32> [#uses=0]
  br label %return

return:    ; preds = %entry
  ret i32 0
}

declare ptr @strcpy(ptr, ptr) nounwind

declare i32 @printf(ptr, ...) nounwind