brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.7 KiB · 92d7101 Raw
49 lines · c
1// RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=pattern %s -emit-llvm -o - | FileCheck %s2// RUN: %clang_cc1 -triple x86_64-unknown-unknown -ftrivial-auto-var-init=zero %s -emit-llvm -o - | FileCheck %s3 4// C guarantees that brace-init with fewer initializers than members in the5// aggregate will initialize the rest of the aggregate as-if it were static6// initialization. In turn static initialization guarantees that padding is7// initialized to zero bits.8 9// CHECK: @__const.partial_init.s = private unnamed_addr constant { i8, [7 x i8], i64 } { i8 42, [7 x i8] zeroinitializer, i64 0 }, align 810 11// Technically, we could initialize this padding to non-zero because all of the12// struct's members have initializers.13 14// CHECK: @__const.init_all.s = private unnamed_addr constant { i8, [7 x i8], i64 } { i8 42, [7 x i8] zeroinitializer, i64 -2401053089374216531 }, align 815 16struct S {17  char c;18  long long l;19};20 21void use(struct S*);22 23// CHECK-LABEL: @empty_braces(24// CHECK:       %s = alloca25// CHECK-NEXT:  call void @llvm.memset{{.*}}(ptr align 8 %s, i8 0,26// CHECK-NEXT:  call void @use(ptr noundef %s)27void empty_braces(void) {28  struct S s = {};29  return use(&s);30}31 32// CHECK-LABEL: @partial_init(33// CHECK:       %s = alloca34// CHECK-NEXT:  call void @llvm.memcpy{{.*}}(ptr align 8 %s, {{.*}}@__const.partial_init.s35// CHECK-NEXT:  call void @use(ptr noundef %s)36void partial_init(void) {37  struct S s = { .c = 42 };38  return use(&s);39}40 41// CHECK-LABEL: @init_all(42// CHECK:       %s = alloca43// CHECK-NEXT:  call void @llvm.memcpy{{.*}}(ptr align 8 %s, {{.*}}@__const.init_all.s44// CHECK-NEXT:  call void @use(ptr noundef %s)45void init_all(void) {46  struct S s = { .c = 42, .l = 0xdeadbeefc0fedead };47  return use(&s);48}49