brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · e794857 Raw
129 lines · c
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature2// RUN: %clang_cc1 -triple wasm32-unknown-unknown -o - -emit-llvm %s | FileCheck %s3 4#include <stdarg.h>5 6// CHECK-LABEL: define {{[^@]+}}@test_i327// CHECK-SAME: (ptr noundef [[FMT:%.*]], ...) #[[ATTR0:[0-9]+]] {8// CHECK-NEXT:  entry:9// CHECK-NEXT:    [[FMT_ADDR:%.*]] = alloca ptr, align 410// CHECK-NEXT:    [[VA:%.*]] = alloca ptr, align 411// CHECK-NEXT:    [[V:%.*]] = alloca i32, align 412// CHECK-NEXT:    store ptr [[FMT]], ptr [[FMT_ADDR]], align 413// CHECK-NEXT:    call void @llvm.va_start.p0(ptr [[VA]])14// CHECK-NEXT:    [[ARGP_CUR:%.*]] = load ptr, ptr [[VA]], align 415// CHECK-NEXT:    [[ARGP_NEXT:%.*]] = getelementptr inbounds i8, ptr [[ARGP_CUR]], i32 416// CHECK-NEXT:    store ptr [[ARGP_NEXT]], ptr [[VA]], align 417// CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[ARGP_CUR]], align 418// CHECK-NEXT:    store i32 [[TMP0]], ptr [[V]], align 419// CHECK-NEXT:    call void @llvm.va_end.p0(ptr [[VA]])20// CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[V]], align 421// CHECK-NEXT:    ret i32 [[TMP1]]22//23int test_i32(char *fmt, ...) {24  va_list va;25 26  va_start(va, fmt);27  int v = va_arg(va, int);28  va_end(va);29 30  return v;31}32 33 34// CHECK-LABEL: define {{[^@]+}}@test_i6435// CHECK-SAME: (ptr noundef [[FMT:%.*]], ...) #[[ATTR0]] {36// CHECK-NEXT:  entry:37// CHECK-NEXT:    [[FMT_ADDR:%.*]] = alloca ptr, align 438// CHECK-NEXT:    [[VA:%.*]] = alloca ptr, align 439// CHECK-NEXT:    [[V:%.*]] = alloca i64, align 840// CHECK-NEXT:    store ptr [[FMT]], ptr [[FMT_ADDR]], align 441// CHECK-NEXT:    call void @llvm.va_start.p0(ptr [[VA]])42// CHECK-NEXT:    [[ARGP_CUR:%.*]] = load ptr, ptr [[VA]], align 443// CHECK-NEXT:    [[TMP0:%.*]] = getelementptr inbounds i8, ptr [[ARGP_CUR]], i32 744// CHECK-NEXT:    [[ARGP_CUR_ALIGNED:%.*]] = call ptr @llvm.ptrmask.p0.i32(ptr [[TMP0]], i32 -8)45// CHECK-NEXT:    [[ARGP_NEXT:%.*]] = getelementptr inbounds i8, ptr [[ARGP_CUR_ALIGNED]], i32 846// CHECK-NEXT:    store ptr [[ARGP_NEXT]], ptr [[VA]], align 447// CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr [[ARGP_CUR_ALIGNED]], align 848// CHECK-NEXT:    store i64 [[TMP1]], ptr [[V]], align 849// CHECK-NEXT:    call void @llvm.va_end.p0(ptr [[VA]])50// CHECK-NEXT:    [[TMP2:%.*]] = load i64, ptr [[V]], align 851// CHECK-NEXT:    ret i64 [[TMP2]]52//53long long test_i64(char *fmt, ...) {54  va_list va;55 56  va_start(va, fmt);57  long long v = va_arg(va, long long);58  va_end(va);59 60  return v;61}62 63 64struct S {65  int x;66  int y;67  int z;68};69 70// CHECK-LABEL: define {{[^@]+}}@test_struct71// CHECK-SAME: (ptr dead_on_unwind noalias writable sret([[STRUCT_S:%.*]]) align 4 [[AGG_RESULT:%.*]], ptr noundef [[FMT:%.*]], ...) #[[ATTR0]] {72// CHECK-NEXT:  entry:73// CHECK-NEXT:    [[FMT_ADDR:%.*]] = alloca ptr, align 474// CHECK-NEXT:    [[VA:%.*]] = alloca ptr, align 475// CHECK-NEXT:    store ptr [[FMT]], ptr [[FMT_ADDR]], align 476// CHECK-NEXT:    call void @llvm.va_start.p0(ptr [[VA]])77// CHECK-NEXT:    [[ARGP_CUR:%.*]] = load ptr, ptr [[VA]], align 478// CHECK-NEXT:    [[ARGP_NEXT:%.*]] = getelementptr inbounds i8, ptr [[ARGP_CUR]], i32 479// CHECK-NEXT:    store ptr [[ARGP_NEXT]], ptr [[VA]], align 480// CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[ARGP_CUR]], align 481// CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[AGG_RESULT]], ptr align 4 [[TMP0]], i32 12, i1 false)82// CHECK-NEXT:    call void @llvm.va_end.p0(ptr [[VA]])83// CHECK-NEXT:    ret void84//85struct S test_struct(char *fmt, ...) {86  va_list va;87 88  va_start(va, fmt);89  struct S v = va_arg(va, struct S);90  va_end(va);91 92  return v;93}94 95 96struct Z {};97 98// CHECK-LABEL: define {{[^@]+}}@test_empty_struct99// CHECK-SAME: (ptr dead_on_unwind noalias writable sret([[STRUCT_S:%.*]]) align 4 [[AGG_RESULT:%.*]], ptr noundef [[FMT:%.*]], ...) #[[ATTR0]] {100// CHECK-NEXT:  entry:101// CHECK-NEXT:    [[FMT_ADDR:%.*]] = alloca ptr, align 4102// CHECK-NEXT:    [[VA:%.*]] = alloca ptr, align 4103// CHECK-NEXT:    [[U:%.*]] = alloca [[STRUCT_Z:%.*]], align 1104// CHECK-NEXT:    store ptr [[FMT]], ptr [[FMT_ADDR]], align 4105// CHECK-NEXT:    call void @llvm.va_start.p0(ptr [[VA]])106// CHECK-NEXT:    [[ARGP_CUR:%.*]] = load ptr, ptr [[VA]], align 4107// CHECK-NEXT:    [[ARGP_NEXT:%.*]] = getelementptr inbounds i8, ptr [[ARGP_CUR]], i32 0108// CHECK-NEXT:    store ptr [[ARGP_NEXT]], ptr [[VA]], align 4109// CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr align 1 [[U]], ptr align 4 [[ARGP_CUR]], i32 0, i1 false)110// CHECK-NEXT:    [[ARGP_CUR1:%.*]] = load ptr, ptr [[VA]], align 4111// CHECK-NEXT:    [[ARGP_NEXT2:%.*]] = getelementptr inbounds i8, ptr [[ARGP_CUR1]], i32 4112// CHECK-NEXT:    store ptr [[ARGP_NEXT2]], ptr [[VA]], align 4113// CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[ARGP_CUR1]], align 4114// CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[AGG_RESULT]], ptr align 4 [[TMP0]], i32 12, i1 false)115// CHECK-NEXT:    call void @llvm.va_end.p0(ptr [[VA]])116// CHECK-NEXT:    ret void117//118struct S test_empty_struct(char *fmt, ...) {119  va_list va;120 121  va_start(va, fmt);122  struct Z u = va_arg(va, struct Z);123  struct S v = va_arg(va, struct S);124  va_end(va);125 126  return v;127}128 129