Home | History | Annotate | Download | only in X86
      1 # RUN: llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s | FileCheck %s
      2 # This test ensures that the MIR parser parses the external symbol machine
      3 # operands correctly.
      4 
      5 --- |
      6   @__stack_chk_guard = external global i8*
      7 
      8   define i32 @test(i32 %n) #0 {
      9   entry:
     10     %StackGuardSlot = alloca i8*
     11     %StackGuard = load i8*, i8** @__stack_chk_guard
     12     call void @llvm.stackprotector(i8* %StackGuard, i8** %StackGuardSlot)
     13     %a = alloca [128 x i32], align 16
     14     %idxprom = sext i32 %n to i64
     15     %arrayidx = getelementptr inbounds [128 x i32], [128 x i32]* %a, i64 0, i64 %idxprom
     16     %0 = load i32, i32* %arrayidx, align 4
     17     call void @llvm.stackprotectorcheck(i8** @__stack_chk_guard)
     18     ret i32 %0
     19   }
     20 
     21   declare void @llvm.stackprotector(i8*, i8**) #1
     22 
     23   declare void @llvm.stackprotectorcheck(i8**) #1
     24 
     25   attributes #0 = { ssp "stack-protector-buffer-size"="8" }
     26   attributes #1 = { nounwind }
     27 
     28 ...
     29 ---
     30 name:            test
     31 tracksRegLiveness: true
     32 body: |
     33   bb.0.entry:
     34     successors: %bb.1.entry, %bb.2.entry
     35     liveins: %edi
     36 
     37     %rsp = SUB64ri32 %rsp, 520, implicit-def %eflags
     38     %rcx = LOAD_STACK_GUARD
     39     MOV64mr %rsp, 1, _, 512, _, %rcx
     40     %rax = MOVSX64rr32 %edi
     41     %eax = MOV32rm %rsp, 4, %rax, 0, _
     42     CMP64rm %rcx, %rsp, 1, _, 512, _, implicit-def %eflags
     43     JNE_1 %bb.2.entry, implicit %eflags
     44 
     45   bb.1.entry:
     46     liveins: %eax
     47 
     48     %rsp = ADD64ri32 %rsp, 520, implicit-def %eflags
     49     RETQ %eax
     50 
     51   bb.2.entry:
     52     ; CHECK:      CALL64pcrel32 $__stack_chk_fail,
     53     ; CHECK-NEXT: CALL64pcrel32 $__stack_chk_fail.09-_,
     54     ; CHECK-NEXT: CALL64pcrel32 $"__stack_chk_fail$",
     55     ; CHECK-NEXT: CALL64pcrel32 $"$Quoted \09 External symbol \11 ",
     56     ; CHECK-NEXT: CALL64pcrel32 $__stack_chk_fail + 2,
     57     ; CHECK-NEXT: CALL64pcrel32 $" check stack - 20" - 20,
     58     CALL64pcrel32 $__stack_chk_fail, csr_64, implicit %rsp, implicit-def %rsp
     59     CALL64pcrel32 $__stack_chk_fail.09-_, csr_64, implicit %rsp, implicit-def %rsp
     60     CALL64pcrel32 $__stack_chk_fail$, csr_64, implicit %rsp, implicit-def %rsp
     61     CALL64pcrel32 $"$Quoted \09 External symbol \11 ", csr_64, implicit %rsp, implicit-def %rsp
     62     CALL64pcrel32 $__stack_chk_fail + 2, csr_64, implicit %rsp, implicit-def %rsp
     63     CALL64pcrel32 $" check stack - 20" - 20, csr_64, implicit %rsp, implicit-def %rsp
     64 ...
     65