xref: /llvm-project/clang/test/Preprocessor/embed_codegen.cpp (revision 94473f4db6a6f5f12d7c4081455b5b596094eac5)
141c6e437SMariya Podchishchaeva // RUN: %clang_cc1 %s -triple x86_64 --embed-dir=%S/Inputs -emit-llvm -o - | FileCheck %s
241c6e437SMariya Podchishchaeva 
341c6e437SMariya Podchishchaeva // CHECK: @__const._Z3fooi.ca = private unnamed_addr constant [3 x i32] [i32 0, i32 106, i32 107], align 4
441c6e437SMariya Podchishchaeva // CHECK: @__const._Z3fooi.sc = private unnamed_addr constant %struct.S1 { i32 106, i32 107, i32 0 }, align 4
541c6e437SMariya Podchishchaeva // CHECK: @__const._Z3fooi.t = private unnamed_addr constant [3 x %struct.T] [%struct.T { [2 x i32] [i32 48, i32 49], %struct.S1 { i32 50, i32 51, i32 52 } }, %struct.T { [2 x i32] [i32 53, i32 54], %struct.S1 { i32 55, i32 56, i32 57 } }, %struct.T { [2 x i32] [i32 10, i32 0], %struct.S1 zeroinitializer }], align 16
6a5b5208bSMariya Podchishchaeva // CHECK: @__const._Z3fooi.W = private unnamed_addr constant %struct.Wrapper { i32 48, %struct.HasCharArray { [10 x i8] c"123456789\0A" } }, align 4
741c6e437SMariya Podchishchaeva void foo(int a) {
841c6e437SMariya Podchishchaeva // CHECK: %a.addr = alloca i32, align 4
941c6e437SMariya Podchishchaeva // CHECK: store i32 %a, ptr %a.addr, align 4
1041c6e437SMariya Podchishchaeva // CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %ca, ptr align 4 @__const._Z3fooi.ca, i64 12, i1 false)
1141c6e437SMariya Podchishchaeva int ca[] = {
1241c6e437SMariya Podchishchaeva 0
1341c6e437SMariya Podchishchaeva #embed <jk.txt> prefix(,)
1441c6e437SMariya Podchishchaeva };
1541c6e437SMariya Podchishchaeva 
1641c6e437SMariya Podchishchaeva // CHECK: %arrayinit.element = getelementptr inbounds i32, ptr %notca, i64 1
177122b70cSMariya Podchishchaeva // CHECK: store i32 106, ptr %arrayinit.element, align 4
1841c6e437SMariya Podchishchaeva // CHECK: %arrayinit.element1 = getelementptr inbounds i32, ptr %notca, i64 2
197122b70cSMariya Podchishchaeva // CHECK: store i32 107, ptr %arrayinit.element1, align 4
2041c6e437SMariya Podchishchaeva int notca[] = {
2141c6e437SMariya Podchishchaeva a
2241c6e437SMariya Podchishchaeva #embed <jk.txt> prefix(,)
2341c6e437SMariya Podchishchaeva };
2441c6e437SMariya Podchishchaeva 
2541c6e437SMariya Podchishchaeva struct S1 {
2641c6e437SMariya Podchishchaeva   int x, y, z;
2741c6e437SMariya Podchishchaeva };
2841c6e437SMariya Podchishchaeva 
2941c6e437SMariya Podchishchaeva // CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 4 %sc, ptr align 4 @__const._Z3fooi.sc, i64 12, i1 false)
3041c6e437SMariya Podchishchaeva S1 sc = {
3141c6e437SMariya Podchishchaeva #embed <jk.txt> suffix(,)
3241c6e437SMariya Podchishchaeva 0
3341c6e437SMariya Podchishchaeva };
3441c6e437SMariya Podchishchaeva 
35*94473f4dSHari Limaye // CHECK: %x = getelementptr inbounds nuw %struct.S1, ptr %s, i32 0, i32 0
3641c6e437SMariya Podchishchaeva // CHECK: store i32 106, ptr %x, align 4
37*94473f4dSHari Limaye // CHECK: %y = getelementptr inbounds nuw %struct.S1, ptr %s, i32 0, i32 1
3841c6e437SMariya Podchishchaeva // CHECK: store i32 107, ptr %y, align 4
39*94473f4dSHari Limaye // CHECK: %z = getelementptr inbounds nuw %struct.S1, ptr %s, i32 0, i32 2
4041c6e437SMariya Podchishchaeva // CHECK: %1 = load i32, ptr %a.addr, align 4
4141c6e437SMariya Podchishchaeva S1 s = {
4241c6e437SMariya Podchishchaeva #embed <jk.txt> suffix(,)
4341c6e437SMariya Podchishchaeva a
4441c6e437SMariya Podchishchaeva };
4541c6e437SMariya Podchishchaeva 
4641c6e437SMariya Podchishchaeva // CHECK: store i32 107, ptr %b, align 4
47dba2e66eSMariya Podchishchaeva int b = (
4841c6e437SMariya Podchishchaeva #embed<jk.txt>
49dba2e66eSMariya Podchishchaeva     )
5041c6e437SMariya Podchishchaeva ;
5141c6e437SMariya Podchishchaeva 
5241c6e437SMariya Podchishchaeva 
5341c6e437SMariya Podchishchaeva struct T {
5441c6e437SMariya Podchishchaeva   int arr[2];
5541c6e437SMariya Podchishchaeva   struct S1 s;
5641c6e437SMariya Podchishchaeva };
5741c6e437SMariya Podchishchaeva 
5841c6e437SMariya Podchishchaeva // CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 16 %t, ptr align 16 @__const._Z3fooi.t, i64 60, i1 false)
5941c6e437SMariya Podchishchaeva constexpr struct T t[] = {
6041c6e437SMariya Podchishchaeva #embed <numbers.txt>
6141c6e437SMariya Podchishchaeva };
6241c6e437SMariya Podchishchaeva 
63*94473f4dSHari Limaye // CHECK:  %arr = getelementptr inbounds nuw %struct.T, ptr %tnonc, i32 0, i32 0
6441c6e437SMariya Podchishchaeva // CHECK:  %2 = load i32, ptr %a.addr, align 4
6541c6e437SMariya Podchishchaeva // CHECK:  store i32 %2, ptr %arr, align 4
6641c6e437SMariya Podchishchaeva // CHECK:  %arrayinit.element2 = getelementptr inbounds i32, ptr %arr, i64 1
6741c6e437SMariya Podchishchaeva // CHECK:  store i32 300, ptr %arrayinit.element2, align 4
68*94473f4dSHari Limaye // CHECK:  %s3 = getelementptr inbounds nuw %struct.T, ptr %tnonc, i32 0, i32 1
69*94473f4dSHari Limaye // CHECK:  %x4 = getelementptr inbounds nuw %struct.S1, ptr %s3, i32 0, i32 0
7041c6e437SMariya Podchishchaeva // CHECK:  store i32 1, ptr %x4, align 4
71*94473f4dSHari Limaye // CHECK:  %y5 = getelementptr inbounds nuw %struct.S1, ptr %s3, i32 0, i32 1
7241c6e437SMariya Podchishchaeva // CHECK:  store i32 2, ptr %y5, align 4
73*94473f4dSHari Limaye // CHECK:  %z6 = getelementptr inbounds nuw %struct.S1, ptr %s3, i32 0, i32 2
7441c6e437SMariya Podchishchaeva // CHECK:  store i32 3, ptr %z6, align 4
7541c6e437SMariya Podchishchaeva // CHECK:  %arrayinit.element7 = getelementptr inbounds %struct.T, ptr %tnonc, i64 1
7641c6e437SMariya Podchishchaeva // CHECK:  call void @llvm.memset.p0.i64(ptr align 4 %arrayinit.element7, i8 0, i64 20, i1 false)
77*94473f4dSHari Limaye // CHECK:  %arr8 = getelementptr inbounds nuw %struct.T, ptr %arrayinit.element7, i32 0, i32 0
787122b70cSMariya Podchishchaeva // CHECK:  store i32 106, ptr %arr8, align 4
7941c6e437SMariya Podchishchaeva // CHECK:  %arrayinit.element9 = getelementptr inbounds i32, ptr %arr8, i64 1
807122b70cSMariya Podchishchaeva // CHECK:  store i32 107, ptr %arrayinit.element9, align 4
8141c6e437SMariya Podchishchaeva struct T tnonc[] = {
8241c6e437SMariya Podchishchaeva   a, 300, 1, 2, 3
8341c6e437SMariya Podchishchaeva #embed <jk.txt> prefix(,)
8441c6e437SMariya Podchishchaeva };
8541c6e437SMariya Podchishchaeva 
86a5b5208bSMariya Podchishchaeva 
87a5b5208bSMariya Podchishchaeva struct HasCharArray { unsigned char h[10]; };
88a5b5208bSMariya Podchishchaeva struct Wrapper { int a; struct HasCharArray d;  };
89a5b5208bSMariya Podchishchaeva constexpr struct Wrapper W = {
90a5b5208bSMariya Podchishchaeva #embed "numbers.txt"
91a5b5208bSMariya Podchishchaeva };
92a5b5208bSMariya Podchishchaeva 
9341c6e437SMariya Podchishchaeva }
94