brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · 57369be Raw
142 lines · plain
1; RUN: llc -mtriple=x86_64-windows-msvc < %s | FileCheck %s --check-prefix=X642; RUN: llc -mtriple=i686-windows-msvc < %s | FileCheck %s --check-prefix=X863 4declare ptr @llvm.frameaddress(i32)5declare void @llvm.localescape(...)6declare ptr @llvm.localaddress()7declare ptr @llvm.localrecover(ptr, ptr, i32)8declare i32 @printf(ptr, ...)9 10@str = internal constant [10 x i8] c"asdf: %d\0A\00"11 12define void @print_framealloc_from_fp(ptr %fp) {13  %a.i8 = call ptr @llvm.localrecover(ptr @alloc_func, ptr %fp, i32 0)14  %a.val = load i32, ptr %a.i815  call i32 (ptr, ...) @printf(ptr @str, i32 %a.val)16  %b.i8 = call ptr @llvm.localrecover(ptr @alloc_func, ptr %fp, i32 1)17  %b.val = load i32, ptr %b.i818  call i32 (ptr, ...) @printf(ptr @str, i32 %b.val)19  store i32 42, ptr %b.i820  %b2 = getelementptr i32, ptr %b.i8, i32 121  %b2.val = load i32, ptr %b222  call i32 (ptr, ...) @printf(ptr @str, i32 %b2.val)23  ret void24}25 26; X64-LABEL: print_framealloc_from_fp:27; X64: movq %rcx, %[[parent_fp:[a-z]+]]28; X64: movl .Lalloc_func$frame_escape_0(%rcx), %edx29; X64: leaq {{.*}}(%rip), %[[str:[a-z]+]]30; X64: movq %[[str]], %rcx31; X64: callq printf32; X64: movl .Lalloc_func$frame_escape_1(%[[parent_fp]]), %edx33; X64: movq %[[str]], %rcx34; X64: callq printf35; X64: movl    $42, .Lalloc_func$frame_escape_1(%[[parent_fp]])36; X64: retq37 38; X86-LABEL: print_framealloc_from_fp:39; X86: pushl   %esi40; X86: movl    8(%esp), %esi41; X86: pushl   Lalloc_func$frame_escape_0(%esi)42; X86: pushl   $_str43; X86: calll   _printf44; X86: addl    $8, %esp45; X86: pushl   Lalloc_func$frame_escape_1(%esi)46; X86: pushl   $_str47; X86: calll   _printf48; X86: addl    $8, %esp49; X86: movl    $42, Lalloc_func$frame_escape_1(%esi)50; X86: movl    $4, %eax51; X86: pushl   Lalloc_func$frame_escape_1(%esi,%eax)52; X86: pushl   $_str53; X86: calll   _printf54; X86: addl    $8, %esp55; X86: popl    %esi56; X86: retl57 58define void @alloc_func(i32 %n) {59  %a = alloca i3260  %b = alloca i32, i32 261  call void (...) @llvm.localescape(ptr %a, ptr %b)62  store i32 42, ptr %a63  store i32 13, ptr %b64 65  ; Force usage of EBP with a dynamic alloca.66  alloca i8, i32 %n67 68  %lp = call ptr @llvm.localaddress()69  call void @print_framealloc_from_fp(ptr %lp)70  ret void71}72 73; X64-LABEL: alloc_func:74; X64: pushq   %rbp75; X64: subq    $16, %rsp76; X64: .seh_stackalloc 1677; X64: leaq    16(%rsp), %rbp78; X64: .seh_setframe %rbp, 1679; X64: .Lalloc_func$frame_escape_0 = -480; X64: .Lalloc_func$frame_escape_1 = -1281; X64: movl $42, -4(%rbp)82; X64: movl $13, -12(%rbp)83; X64: movq 	%rbp, %rcx84; X64: callq print_framealloc_from_fp85; X64: retq86 87; X86-LABEL: alloc_func:88; X86: pushl   %ebp89; X86: movl    %esp, %ebp90; X86: subl    $12, %esp91; X86: Lalloc_func$frame_escape_0 = -492; X86: Lalloc_func$frame_escape_1 = -1293; X86: movl    $42, -4(%ebp)94; X86: movl    $13, -12(%ebp)95; X86: pushl   %ebp96; X86: calll   _print_framealloc_from_fp97; X86: movl    %ebp, %esp98; X86: popl    %ebp99; X86: retl100 101; Helper to make this a complete program so it can be compiled and tested.102define i32 @main() {103  call void @alloc_func(i32 3)104  ret i32 0105}106 107define void @alloc_func_no_frameaddr() {108  %a = alloca i32109  %b = alloca i32110  call void (...) @llvm.localescape(ptr %a, ptr %b)111  store i32 42, ptr %a112  store i32 13, ptr %b113  call void @print_framealloc_from_fp(ptr null)114  ret void115}116 117; X64-LABEL: alloc_func_no_frameaddr:118; X64: subq    $40, %rsp119; X64: .seh_stackalloc 40120; X64: .seh_endprologue121; X64: .Lalloc_func_no_frameaddr$frame_escape_0 = 36122; X64: .Lalloc_func_no_frameaddr$frame_escape_1 = 32123; X64: movl $42, 36(%rsp)124; X64: movl $13, 32(%rsp)125; X64: xorl %ecx, %ecx126; X64: callq print_framealloc_from_fp127; X64: .seh_startepilogue128; X64: addq $40, %rsp129; X64: .seh_endepilogue130; X64: retq131 132; X86-LABEL: alloc_func_no_frameaddr:133; X86: subl    $8, %esp134; X86: Lalloc_func_no_frameaddr$frame_escape_0 = 4135; X86: Lalloc_func_no_frameaddr$frame_escape_1 = 0136; X86: movl $42, 4(%esp)137; X86: movl $13, (%esp)138; X86: pushl $0139; X86: calll _print_framealloc_from_fp140; X86: addl    $12, %esp141; X86: retl142