xref: /llvm-project/clang/unittests/CodeGen/TBAAMetadataTest.cpp (revision 7954a0514ba7de40dba6c598af830fd1b7a8bf0c)
1ccdac23aSSerge Pavlov //=== unittests/CodeGen/TBAAMetadataTest.cpp - Checks metadata generation -===//
2ccdac23aSSerge Pavlov //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ccdac23aSSerge Pavlov //
7ccdac23aSSerge Pavlov //===----------------------------------------------------------------------===//
8ccdac23aSSerge Pavlov 
9ccdac23aSSerge Pavlov #include "IRMatchers.h"
1054e655b3SVassil Vassilev #include "TestCompiler.h"
11ccdac23aSSerge Pavlov #include "clang/AST/ASTConsumer.h"
12ccdac23aSSerge Pavlov #include "clang/AST/ASTContext.h"
130f6959f3SReid Kleckner #include "clang/Basic/SourceManager.h"
144c2a6567SReid Kleckner #include "clang/Basic/TargetInfo.h"
15ccdac23aSSerge Pavlov #include "llvm/IR/Constants.h"
16ccdac23aSSerge Pavlov #include "llvm/Support/MemoryBuffer.h"
17ccdac23aSSerge Pavlov #include "gtest/gtest.h"
18ccdac23aSSerge Pavlov #include <memory>
19ccdac23aSSerge Pavlov 
20ccdac23aSSerge Pavlov using namespace llvm;
21ccdac23aSSerge Pavlov 
22ccdac23aSSerge Pavlov namespace {
23ccdac23aSSerge Pavlov 
2454e655b3SVassil Vassilev struct TBAATestCompiler : public TestCompiler {
2554e655b3SVassil Vassilev   TBAATestCompiler(clang::LangOptions LO, clang::CodeGenOptions CGO)
2654e655b3SVassil Vassilev     : TestCompiler(LO, CGO) {}
2754e655b3SVassil Vassilev   static clang::CodeGenOptions getCommonCodeGenOpts() {
2854e655b3SVassil Vassilev     clang::CodeGenOptions CGOpts;
2954e655b3SVassil Vassilev     CGOpts.StructPathTBAA = 1;
3054e655b3SVassil Vassilev     CGOpts.OptimizationLevel = 1;
3154e655b3SVassil Vassilev     return CGOpts;
32ccdac23aSSerge Pavlov   }
33ccdac23aSSerge Pavlov };
34ccdac23aSSerge Pavlov 
35ccdac23aSSerge Pavlov auto OmnipotentCharC = MMTuple(
36ccdac23aSSerge Pavlov   MMString("omnipotent char"),
37ccdac23aSSerge Pavlov   MMTuple(
38ccdac23aSSerge Pavlov     MMString("Simple C/C++ TBAA")),
39ccdac23aSSerge Pavlov   MConstInt(0, 64)
40ccdac23aSSerge Pavlov );
41ccdac23aSSerge Pavlov 
42*7954a051SFlorian Hahn auto AnyPtr = MMTuple(
43*7954a051SFlorian Hahn   MMString("any pointer"),
44*7954a051SFlorian Hahn   OmnipotentCharC,
45*7954a051SFlorian Hahn   MConstInt(0, 64)
46*7954a051SFlorian Hahn );
47ccdac23aSSerge Pavlov 
48ccdac23aSSerge Pavlov auto OmnipotentCharCXX = MMTuple(
49ccdac23aSSerge Pavlov   MMString("omnipotent char"),
50ccdac23aSSerge Pavlov   MMTuple(
51ccdac23aSSerge Pavlov     MMString("Simple C++ TBAA")),
52ccdac23aSSerge Pavlov   MConstInt(0, 64)
53ccdac23aSSerge Pavlov );
54ccdac23aSSerge Pavlov 
55ccdac23aSSerge Pavlov 
56ccdac23aSSerge Pavlov TEST(TBAAMetadataTest, BasicTypes) {
57ccdac23aSSerge Pavlov   const char TestProgram[] = R"**(
58ccdac23aSSerge Pavlov     void func(char *CP, short *SP, int *IP, long long *LP, void **VPP,
59ccdac23aSSerge Pavlov               int **IPP) {
60ccdac23aSSerge Pavlov       *CP = 4;
61ccdac23aSSerge Pavlov       *SP = 11;
62ccdac23aSSerge Pavlov       *IP = 601;
63ccdac23aSSerge Pavlov       *LP = 604;
64ccdac23aSSerge Pavlov       *VPP = CP;
65ccdac23aSSerge Pavlov       *IPP = IP;
66ccdac23aSSerge Pavlov     }
67ccdac23aSSerge Pavlov   )**";
68ccdac23aSSerge Pavlov 
6954e655b3SVassil Vassilev   clang::LangOptions LO;
7054e655b3SVassil Vassilev   TBAATestCompiler Compiler(LO, TBAATestCompiler::getCommonCodeGenOpts());
71ccdac23aSSerge Pavlov   Compiler.init(TestProgram);
72ccdac23aSSerge Pavlov   const BasicBlock *BB = Compiler.compile();
73ccdac23aSSerge Pavlov 
74ccdac23aSSerge Pavlov   const Instruction *I = match(BB,
75ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
76ccdac23aSSerge Pavlov         MConstInt(4, 8),
77ccdac23aSSerge Pavlov         MMTuple(
78ccdac23aSSerge Pavlov           OmnipotentCharC,
79ccdac23aSSerge Pavlov           MSameAs(0),
80ccdac23aSSerge Pavlov           MConstInt(0))));
81ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
82ccdac23aSSerge Pavlov 
83ccdac23aSSerge Pavlov   I = matchNext(I,
84ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
85ccdac23aSSerge Pavlov         MConstInt(11, 16),
86ccdac23aSSerge Pavlov         MMTuple(
87ccdac23aSSerge Pavlov           MMTuple(
88ccdac23aSSerge Pavlov             MMString("short"),
89ccdac23aSSerge Pavlov             OmnipotentCharC,
90ccdac23aSSerge Pavlov             MConstInt(0)),
91ccdac23aSSerge Pavlov           MSameAs(0),
92ccdac23aSSerge Pavlov           MConstInt(0))));
93ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
94ccdac23aSSerge Pavlov 
95ccdac23aSSerge Pavlov   I = matchNext(I,
96ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
97ccdac23aSSerge Pavlov         MConstInt(601, 32),
98ccdac23aSSerge Pavlov         MMTuple(
99ccdac23aSSerge Pavlov           MMTuple(
100ccdac23aSSerge Pavlov             MMString("int"),
101ccdac23aSSerge Pavlov             OmnipotentCharC,
102ccdac23aSSerge Pavlov             MConstInt(0)),
103ccdac23aSSerge Pavlov           MSameAs(0),
104ccdac23aSSerge Pavlov           MConstInt(0))));
105ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
106ccdac23aSSerge Pavlov 
107ccdac23aSSerge Pavlov   I = matchNext(I,
108ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
109ccdac23aSSerge Pavlov         MConstInt(604, 64),
110ccdac23aSSerge Pavlov         MMTuple(
111ccdac23aSSerge Pavlov           MMTuple(
112ccdac23aSSerge Pavlov             MMString("long long"),
113ccdac23aSSerge Pavlov             OmnipotentCharC,
114ccdac23aSSerge Pavlov             MConstInt(0)),
115ccdac23aSSerge Pavlov           MSameAs(0),
116ccdac23aSSerge Pavlov           MConstInt(0))));
117ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
118ccdac23aSSerge Pavlov 
119ccdac23aSSerge Pavlov   I = matchNext(I,
120ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
121fd05c34bSBjorn Pettersson         MValType(PointerType::getUnqual(Compiler.Context)),
122ccdac23aSSerge Pavlov         MMTuple(
123ccdac23aSSerge Pavlov           MMTuple(
124*7954a051SFlorian Hahn             MMString("p1 void"),
125*7954a051SFlorian Hahn             AnyPtr,
126ccdac23aSSerge Pavlov             MConstInt(0)),
127ccdac23aSSerge Pavlov           MSameAs(0),
128ccdac23aSSerge Pavlov           MConstInt(0))));
129ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
130ccdac23aSSerge Pavlov 
131ccdac23aSSerge Pavlov   I = matchNext(I,
132ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
133fd05c34bSBjorn Pettersson         MValType(PointerType::getUnqual(Compiler.Context)),
134ccdac23aSSerge Pavlov         MMTuple(
135ccdac23aSSerge Pavlov           MMTuple(
136*7954a051SFlorian Hahn             MMString("p1 int"),
137*7954a051SFlorian Hahn             AnyPtr,
138ccdac23aSSerge Pavlov             MConstInt(0)),
139ccdac23aSSerge Pavlov           MSameAs(0),
140ccdac23aSSerge Pavlov           MConstInt(0))));
141ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
142ccdac23aSSerge Pavlov }
143ccdac23aSSerge Pavlov 
144ccdac23aSSerge Pavlov TEST(TBAAMetadataTest, CFields) {
145ccdac23aSSerge Pavlov   const char TestProgram[] = R"**(
146ccdac23aSSerge Pavlov     struct ABC {
147ccdac23aSSerge Pavlov        short f16;
148ccdac23aSSerge Pavlov        int f32;
149ccdac23aSSerge Pavlov        long long f64;
150ccdac23aSSerge Pavlov        unsigned short f16_2;
151ccdac23aSSerge Pavlov        unsigned f32_2;
152ccdac23aSSerge Pavlov        unsigned long long f64_2;
153ccdac23aSSerge Pavlov     };
154ccdac23aSSerge Pavlov 
155ccdac23aSSerge Pavlov     void func(struct ABC *A) {
156ccdac23aSSerge Pavlov       A->f32 = 4;
157ccdac23aSSerge Pavlov       A->f16 = 11;
158ccdac23aSSerge Pavlov       A->f64 = 601;
159ccdac23aSSerge Pavlov       A->f16_2 = 22;
160ccdac23aSSerge Pavlov       A->f32_2 = 77;
161ccdac23aSSerge Pavlov       A->f64_2 = 604;
162ccdac23aSSerge Pavlov     }
163ccdac23aSSerge Pavlov   )**";
164ccdac23aSSerge Pavlov 
16554e655b3SVassil Vassilev   clang::LangOptions LO;
16654e655b3SVassil Vassilev   LO.C11 = 1;
16754e655b3SVassil Vassilev   TBAATestCompiler Compiler(LO, TBAATestCompiler::getCommonCodeGenOpts());
168ccdac23aSSerge Pavlov   Compiler.init(TestProgram);
169ccdac23aSSerge Pavlov   const BasicBlock *BB = Compiler.compile();
170ccdac23aSSerge Pavlov 
171ccdac23aSSerge Pavlov   auto StructABC = MMTuple(
172ccdac23aSSerge Pavlov     MMString("ABC"),
173ccdac23aSSerge Pavlov     MMTuple(
174ccdac23aSSerge Pavlov       MMString("short"),
175ccdac23aSSerge Pavlov       OmnipotentCharC,
176ccdac23aSSerge Pavlov       MConstInt(0)),
177ccdac23aSSerge Pavlov     MConstInt(0),
178ccdac23aSSerge Pavlov     MMTuple(
179ccdac23aSSerge Pavlov       MMString("int"),
180ccdac23aSSerge Pavlov       OmnipotentCharC,
181ccdac23aSSerge Pavlov       MConstInt(0)),
182ccdac23aSSerge Pavlov     MConstInt(4),
183ccdac23aSSerge Pavlov     MMTuple(
184ccdac23aSSerge Pavlov       MMString("long long"),
185ccdac23aSSerge Pavlov       OmnipotentCharC,
186ccdac23aSSerge Pavlov       MConstInt(0)),
187ccdac23aSSerge Pavlov     MConstInt(8),
188ccdac23aSSerge Pavlov     MSameAs(1),
189ccdac23aSSerge Pavlov     MConstInt(16),
190ccdac23aSSerge Pavlov     MSameAs(3),
191ccdac23aSSerge Pavlov     MConstInt(20),
192ccdac23aSSerge Pavlov     MSameAs(5),
193ccdac23aSSerge Pavlov     MConstInt(24));
194ccdac23aSSerge Pavlov 
195ccdac23aSSerge Pavlov   const Instruction *I = match(BB,
196ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
197ccdac23aSSerge Pavlov         MConstInt(4, 32),
198ccdac23aSSerge Pavlov         MMTuple(
199ccdac23aSSerge Pavlov           StructABC,
200ccdac23aSSerge Pavlov           MMTuple(
201ccdac23aSSerge Pavlov             MMString("int"),
202ccdac23aSSerge Pavlov             OmnipotentCharC,
203ccdac23aSSerge Pavlov             MConstInt(0)),
204ccdac23aSSerge Pavlov           MConstInt(4))));
205ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
206ccdac23aSSerge Pavlov 
207ccdac23aSSerge Pavlov   I = matchNext(I,
208ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
209ccdac23aSSerge Pavlov         MConstInt(11, 16),
210ccdac23aSSerge Pavlov         MMTuple(
211ccdac23aSSerge Pavlov           StructABC,
212ccdac23aSSerge Pavlov           MMTuple(
213ccdac23aSSerge Pavlov             MMString("short"),
214ccdac23aSSerge Pavlov             OmnipotentCharC,
215ccdac23aSSerge Pavlov             MConstInt(0)),
216ccdac23aSSerge Pavlov           MConstInt(0))));
217ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
218ccdac23aSSerge Pavlov 
219ccdac23aSSerge Pavlov   I = matchNext(I,
220ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
221ccdac23aSSerge Pavlov         MConstInt(601, 64),
222ccdac23aSSerge Pavlov         MMTuple(
223ccdac23aSSerge Pavlov           StructABC,
224ccdac23aSSerge Pavlov           MMTuple(
225ccdac23aSSerge Pavlov             MMString("long long"),
226ccdac23aSSerge Pavlov             OmnipotentCharC,
227ccdac23aSSerge Pavlov             MConstInt(0)),
228ccdac23aSSerge Pavlov           MConstInt(8))));
229ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
230ccdac23aSSerge Pavlov 
231ccdac23aSSerge Pavlov   I = matchNext(I,
232ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
233ccdac23aSSerge Pavlov         MConstInt(22, 16),
234ccdac23aSSerge Pavlov         MMTuple(
235ccdac23aSSerge Pavlov           StructABC,
236ccdac23aSSerge Pavlov           MMTuple(
237ccdac23aSSerge Pavlov             MMString("short"),
238ccdac23aSSerge Pavlov             OmnipotentCharC,
239ccdac23aSSerge Pavlov             MConstInt(0)),
240ccdac23aSSerge Pavlov           MConstInt(16))));
241ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
242ccdac23aSSerge Pavlov 
243ccdac23aSSerge Pavlov   I = matchNext(I,
244ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
245ccdac23aSSerge Pavlov         MConstInt(77, 32),
246ccdac23aSSerge Pavlov         MMTuple(
247ccdac23aSSerge Pavlov           StructABC,
248ccdac23aSSerge Pavlov           MMTuple(
249ccdac23aSSerge Pavlov             MMString("int"),
250ccdac23aSSerge Pavlov             OmnipotentCharC,
251ccdac23aSSerge Pavlov             MConstInt(0)),
252ccdac23aSSerge Pavlov           MConstInt(20))));
253ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
254ccdac23aSSerge Pavlov 
255ccdac23aSSerge Pavlov   I = matchNext(I,
256ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
257ccdac23aSSerge Pavlov         MConstInt(604, 64),
258ccdac23aSSerge Pavlov         MMTuple(
259ccdac23aSSerge Pavlov           StructABC,
260ccdac23aSSerge Pavlov           MMTuple(
261ccdac23aSSerge Pavlov             MMString("long long"),
262ccdac23aSSerge Pavlov             OmnipotentCharC,
263ccdac23aSSerge Pavlov             MConstInt(0)),
264ccdac23aSSerge Pavlov           MConstInt(24))));
265ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
266ccdac23aSSerge Pavlov }
267ccdac23aSSerge Pavlov 
268ccdac23aSSerge Pavlov TEST(TBAAMetadataTest, CTypedefFields) {
269ccdac23aSSerge Pavlov   const char TestProgram[] = R"**(
270ccdac23aSSerge Pavlov     typedef struct {
271ccdac23aSSerge Pavlov        short f16;
272ccdac23aSSerge Pavlov        int f32;
273ccdac23aSSerge Pavlov     } ABC;
274ccdac23aSSerge Pavlov     typedef struct {
275ccdac23aSSerge Pavlov        short value_f16;
276ccdac23aSSerge Pavlov        int value_f32;
277ccdac23aSSerge Pavlov     } CDE;
278ccdac23aSSerge Pavlov 
279ccdac23aSSerge Pavlov     void func(ABC *A, CDE *B) {
280ccdac23aSSerge Pavlov       A->f32 = 4;
281ccdac23aSSerge Pavlov       A->f16 = 11;
282ccdac23aSSerge Pavlov       B->value_f32 = 44;
283ccdac23aSSerge Pavlov       B->value_f16 = 111;
284ccdac23aSSerge Pavlov     }
285ccdac23aSSerge Pavlov   )**";
286ccdac23aSSerge Pavlov 
28754e655b3SVassil Vassilev   clang::LangOptions LO;
28854e655b3SVassil Vassilev   LO.C11 = 1;
28954e655b3SVassil Vassilev   TBAATestCompiler Compiler(LO, TBAATestCompiler::getCommonCodeGenOpts());
290ccdac23aSSerge Pavlov   Compiler.init(TestProgram);
291ccdac23aSSerge Pavlov   const BasicBlock *BB = Compiler.compile();
292ccdac23aSSerge Pavlov 
293ccdac23aSSerge Pavlov   auto NamelessStruct = MMTuple(
294ccdac23aSSerge Pavlov     MMString(""),
295ccdac23aSSerge Pavlov     MMTuple(
296ccdac23aSSerge Pavlov       MMString("short"),
297ccdac23aSSerge Pavlov       OmnipotentCharC,
298ccdac23aSSerge Pavlov       MConstInt(0)),
299ccdac23aSSerge Pavlov     MConstInt(0),
300ccdac23aSSerge Pavlov     MMTuple(
301ccdac23aSSerge Pavlov       MMString("int"),
302ccdac23aSSerge Pavlov       OmnipotentCharC,
303ccdac23aSSerge Pavlov       MConstInt(0)),
304ccdac23aSSerge Pavlov     MConstInt(4));
305ccdac23aSSerge Pavlov 
306ccdac23aSSerge Pavlov   const Metadata *MetaABC = nullptr;
307ccdac23aSSerge Pavlov   const Instruction *I = match(BB,
308ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
309ccdac23aSSerge Pavlov         MConstInt(4, 32),
310ccdac23aSSerge Pavlov         MMTuple(
311ccdac23aSSerge Pavlov           MMSave(MetaABC, NamelessStruct),
312ccdac23aSSerge Pavlov           MMTuple(
313ccdac23aSSerge Pavlov             MMString("int"),
314ccdac23aSSerge Pavlov             OmnipotentCharC,
315ccdac23aSSerge Pavlov             MConstInt(0)),
316ccdac23aSSerge Pavlov           MConstInt(4))));
317ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
318ccdac23aSSerge Pavlov 
319ccdac23aSSerge Pavlov   I = matchNext(I,
320ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
321ccdac23aSSerge Pavlov         MConstInt(11, 16),
322ccdac23aSSerge Pavlov         MMTuple(
323ccdac23aSSerge Pavlov           NamelessStruct,
324ccdac23aSSerge Pavlov           MMTuple(
325ccdac23aSSerge Pavlov             MMString("short"),
326ccdac23aSSerge Pavlov             OmnipotentCharC,
327ccdac23aSSerge Pavlov             MConstInt(0)),
328ccdac23aSSerge Pavlov           MConstInt(0))));
329ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
330ccdac23aSSerge Pavlov 
331ccdac23aSSerge Pavlov   const Metadata *MetaCDE = nullptr;
332ccdac23aSSerge Pavlov   I = matchNext(I,
333ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
334ccdac23aSSerge Pavlov         MConstInt(44, 32),
335ccdac23aSSerge Pavlov         MMTuple(
336ccdac23aSSerge Pavlov           MMSave(MetaCDE, NamelessStruct),
337ccdac23aSSerge Pavlov           MMTuple(
338ccdac23aSSerge Pavlov             MMString("int"),
339ccdac23aSSerge Pavlov             OmnipotentCharC,
340ccdac23aSSerge Pavlov             MConstInt(0)),
341ccdac23aSSerge Pavlov           MConstInt(4))));
342ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
343ccdac23aSSerge Pavlov 
344ccdac23aSSerge Pavlov   I = matchNext(I,
345ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
346ccdac23aSSerge Pavlov         MConstInt(111, 16),
347ccdac23aSSerge Pavlov         MMTuple(
348ccdac23aSSerge Pavlov           NamelessStruct,
349ccdac23aSSerge Pavlov           MMTuple(
350ccdac23aSSerge Pavlov             MMString("short"),
351ccdac23aSSerge Pavlov             OmnipotentCharC,
352ccdac23aSSerge Pavlov             MConstInt(0)),
353ccdac23aSSerge Pavlov           MConstInt(0))));
354ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
355ccdac23aSSerge Pavlov 
356ccdac23aSSerge Pavlov   // FIXME: Nameless structures used in definitions of 'ABC' and 'CDE' are
357ccdac23aSSerge Pavlov   // different structures and must be described by different descriptors.
358ccdac23aSSerge Pavlov   //ASSERT_TRUE(MetaABC != MetaCDE);
359ccdac23aSSerge Pavlov }
360ccdac23aSSerge Pavlov 
361ccdac23aSSerge Pavlov TEST(TBAAMetadataTest, CTypedefFields2) {
362ccdac23aSSerge Pavlov   const char TestProgram[] = R"**(
363ccdac23aSSerge Pavlov     typedef struct {
364ccdac23aSSerge Pavlov        short f16;
365ccdac23aSSerge Pavlov        int f32;
366ccdac23aSSerge Pavlov     } ABC;
367ccdac23aSSerge Pavlov     typedef struct {
368ccdac23aSSerge Pavlov        short f16;
369ccdac23aSSerge Pavlov        int f32;
370ccdac23aSSerge Pavlov     } CDE;
371ccdac23aSSerge Pavlov 
372ccdac23aSSerge Pavlov     void func(ABC *A, CDE *B) {
373ccdac23aSSerge Pavlov       A->f32 = 4;
374ccdac23aSSerge Pavlov       A->f16 = 11;
375ccdac23aSSerge Pavlov       B->f32 = 44;
376ccdac23aSSerge Pavlov       B->f16 = 111;
377ccdac23aSSerge Pavlov     }
378ccdac23aSSerge Pavlov   )**";
379ccdac23aSSerge Pavlov 
38054e655b3SVassil Vassilev   clang::LangOptions LO;
38154e655b3SVassil Vassilev   LO.C11 = 1;
38254e655b3SVassil Vassilev   TBAATestCompiler Compiler(LO, TBAATestCompiler::getCommonCodeGenOpts());
383ccdac23aSSerge Pavlov   Compiler.init(TestProgram);
384ccdac23aSSerge Pavlov   const BasicBlock *BB = Compiler.compile();
385ccdac23aSSerge Pavlov 
386ccdac23aSSerge Pavlov   auto NamelessStruct = MMTuple(
387ccdac23aSSerge Pavlov     MMString(""),
388ccdac23aSSerge Pavlov     MMTuple(
389ccdac23aSSerge Pavlov       MMString("short"),
390ccdac23aSSerge Pavlov       OmnipotentCharC,
391ccdac23aSSerge Pavlov       MConstInt(0)),
392ccdac23aSSerge Pavlov     MConstInt(0),
393ccdac23aSSerge Pavlov     MMTuple(
394ccdac23aSSerge Pavlov       MMString("int"),
395ccdac23aSSerge Pavlov       OmnipotentCharC,
396ccdac23aSSerge Pavlov       MConstInt(0)),
397ccdac23aSSerge Pavlov     MConstInt(4));
398ccdac23aSSerge Pavlov 
399ccdac23aSSerge Pavlov   const Metadata *MetaABC = nullptr;
400ccdac23aSSerge Pavlov   const Instruction *I = match(BB,
401ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
402ccdac23aSSerge Pavlov         MConstInt(4, 32),
403ccdac23aSSerge Pavlov         MMTuple(
404ccdac23aSSerge Pavlov           MMSave(MetaABC, NamelessStruct),
405ccdac23aSSerge Pavlov           MMTuple(
406ccdac23aSSerge Pavlov             MMString("int"),
407ccdac23aSSerge Pavlov             OmnipotentCharC,
408ccdac23aSSerge Pavlov             MConstInt(0)),
409ccdac23aSSerge Pavlov           MConstInt(4))));
410ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
411ccdac23aSSerge Pavlov 
412ccdac23aSSerge Pavlov   I = matchNext(I,
413ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
414ccdac23aSSerge Pavlov         MConstInt(11, 16),
415ccdac23aSSerge Pavlov         MMTuple(
416ccdac23aSSerge Pavlov           NamelessStruct,
417ccdac23aSSerge Pavlov           MMTuple(
418ccdac23aSSerge Pavlov             MMString("short"),
419ccdac23aSSerge Pavlov             OmnipotentCharC,
420ccdac23aSSerge Pavlov             MConstInt(0)),
421ccdac23aSSerge Pavlov           MConstInt(0))));
422ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
423ccdac23aSSerge Pavlov 
424ccdac23aSSerge Pavlov   const Metadata *MetaCDE = nullptr;
425ccdac23aSSerge Pavlov   I = matchNext(I,
426ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
427ccdac23aSSerge Pavlov         MConstInt(44, 32),
428ccdac23aSSerge Pavlov         MMTuple(
429ccdac23aSSerge Pavlov           MMSave(MetaCDE, NamelessStruct),
430ccdac23aSSerge Pavlov           MMTuple(
431ccdac23aSSerge Pavlov             MMString("int"),
432ccdac23aSSerge Pavlov             OmnipotentCharC,
433ccdac23aSSerge Pavlov             MConstInt(0)),
434ccdac23aSSerge Pavlov           MConstInt(4))));
435ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
436ccdac23aSSerge Pavlov 
437ccdac23aSSerge Pavlov   I = matchNext(I,
438ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
439ccdac23aSSerge Pavlov         MConstInt(111, 16),
440ccdac23aSSerge Pavlov         MMTuple(
441ccdac23aSSerge Pavlov           NamelessStruct,
442ccdac23aSSerge Pavlov           MMTuple(
443ccdac23aSSerge Pavlov             MMString("short"),
444ccdac23aSSerge Pavlov             OmnipotentCharC,
445ccdac23aSSerge Pavlov             MConstInt(0)),
446ccdac23aSSerge Pavlov           MConstInt(0))));
447ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
448ccdac23aSSerge Pavlov 
449ccdac23aSSerge Pavlov   // FIXME: Nameless structures used in definitions of 'ABC' and 'CDE' are
450ccdac23aSSerge Pavlov   // different structures, although they have the same field sequence. They must
451ccdac23aSSerge Pavlov   // be described by different descriptors.
452ccdac23aSSerge Pavlov   //ASSERT_TRUE(MetaABC != MetaCDE);
453ccdac23aSSerge Pavlov }
454ccdac23aSSerge Pavlov 
455ccdac23aSSerge Pavlov TEST(TBAAMetadataTest, CTypedefFields3) {
456ccdac23aSSerge Pavlov   const char TestProgram[] = R"**(
457ccdac23aSSerge Pavlov     typedef struct {
458ccdac23aSSerge Pavlov        short f16;
459ccdac23aSSerge Pavlov        int f32;
460ccdac23aSSerge Pavlov     } ABC;
461ccdac23aSSerge Pavlov     typedef struct {
462ccdac23aSSerge Pavlov        int f32;
463ccdac23aSSerge Pavlov        short f16;
464ccdac23aSSerge Pavlov     } CDE;
465ccdac23aSSerge Pavlov 
466ccdac23aSSerge Pavlov     void func(ABC *A, CDE *B) {
467ccdac23aSSerge Pavlov       A->f32 = 4;
468ccdac23aSSerge Pavlov       A->f16 = 11;
469ccdac23aSSerge Pavlov       B->f32 = 44;
470ccdac23aSSerge Pavlov       B->f16 = 111;
471ccdac23aSSerge Pavlov     }
472ccdac23aSSerge Pavlov   )**";
473ccdac23aSSerge Pavlov 
47454e655b3SVassil Vassilev   clang::LangOptions LO;
47554e655b3SVassil Vassilev   LO.C11 = 1;
47654e655b3SVassil Vassilev   TBAATestCompiler Compiler(LO, TBAATestCompiler::getCommonCodeGenOpts());
477ccdac23aSSerge Pavlov   Compiler.init(TestProgram);
478ccdac23aSSerge Pavlov   const BasicBlock *BB = Compiler.compile();
479ccdac23aSSerge Pavlov 
480ccdac23aSSerge Pavlov   auto NamelessStruct1 = MMTuple(
481ccdac23aSSerge Pavlov     MMString(""),
482ccdac23aSSerge Pavlov     MMTuple(
483ccdac23aSSerge Pavlov       MMString("short"),
484ccdac23aSSerge Pavlov       OmnipotentCharC,
485ccdac23aSSerge Pavlov       MConstInt(0)),
486ccdac23aSSerge Pavlov     MConstInt(0),
487ccdac23aSSerge Pavlov     MMTuple(
488ccdac23aSSerge Pavlov       MMString("int"),
489ccdac23aSSerge Pavlov       OmnipotentCharC,
490ccdac23aSSerge Pavlov       MConstInt(0)),
491ccdac23aSSerge Pavlov     MConstInt(4));
492ccdac23aSSerge Pavlov 
493ccdac23aSSerge Pavlov   auto NamelessStruct2 = MMTuple(
494ccdac23aSSerge Pavlov     MMString(""),
495ccdac23aSSerge Pavlov     MMTuple(
496ccdac23aSSerge Pavlov       MMString("int"),
497ccdac23aSSerge Pavlov       OmnipotentCharC,
498ccdac23aSSerge Pavlov       MConstInt(0)),
499ccdac23aSSerge Pavlov     MConstInt(0),
500ccdac23aSSerge Pavlov     MMTuple(
501ccdac23aSSerge Pavlov       MMString("short"),
502ccdac23aSSerge Pavlov       OmnipotentCharC,
503ccdac23aSSerge Pavlov       MConstInt(0)),
504ccdac23aSSerge Pavlov     MConstInt(4));
505ccdac23aSSerge Pavlov 
506ccdac23aSSerge Pavlov   const Instruction *I = match(BB,
507ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
508ccdac23aSSerge Pavlov         MConstInt(4, 32),
509ccdac23aSSerge Pavlov         MMTuple(
510ccdac23aSSerge Pavlov           NamelessStruct1,
511ccdac23aSSerge Pavlov           MMTuple(
512ccdac23aSSerge Pavlov             MMString("int"),
513ccdac23aSSerge Pavlov             OmnipotentCharC,
514ccdac23aSSerge Pavlov             MConstInt(0)),
515ccdac23aSSerge Pavlov           MConstInt(4))));
516ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
517ccdac23aSSerge Pavlov 
518ccdac23aSSerge Pavlov   I = matchNext(I,
519ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
520ccdac23aSSerge Pavlov         MConstInt(11, 16),
521ccdac23aSSerge Pavlov         MMTuple(
522ccdac23aSSerge Pavlov           NamelessStruct1,
523ccdac23aSSerge Pavlov           MMTuple(
524ccdac23aSSerge Pavlov             MMString("short"),
525ccdac23aSSerge Pavlov             OmnipotentCharC,
526ccdac23aSSerge Pavlov             MConstInt(0)),
527ccdac23aSSerge Pavlov           MConstInt(0))));
528ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
529ccdac23aSSerge Pavlov 
530ccdac23aSSerge Pavlov   I = matchNext(I,
531ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
532ccdac23aSSerge Pavlov         MConstInt(44, 32),
533ccdac23aSSerge Pavlov         MMTuple(
534ccdac23aSSerge Pavlov           NamelessStruct2,
535ccdac23aSSerge Pavlov           MMTuple(
536ccdac23aSSerge Pavlov             MMString("int"),
537ccdac23aSSerge Pavlov             OmnipotentCharC,
538ccdac23aSSerge Pavlov             MConstInt(0)),
539ccdac23aSSerge Pavlov           MConstInt(0))));
540ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
541ccdac23aSSerge Pavlov 
542ccdac23aSSerge Pavlov   I = matchNext(I,
543ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
544ccdac23aSSerge Pavlov         MConstInt(111, 16),
545ccdac23aSSerge Pavlov         MMTuple(
546ccdac23aSSerge Pavlov           NamelessStruct2,
547ccdac23aSSerge Pavlov           MMTuple(
548ccdac23aSSerge Pavlov             MMString("short"),
549ccdac23aSSerge Pavlov             OmnipotentCharC,
550ccdac23aSSerge Pavlov             MConstInt(0)),
551ccdac23aSSerge Pavlov           MConstInt(4))));
552ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
553ccdac23aSSerge Pavlov }
554ccdac23aSSerge Pavlov 
555ccdac23aSSerge Pavlov TEST(TBAAMetadataTest, CXXFields) {
556ccdac23aSSerge Pavlov   const char TestProgram[] = R"**(
557ccdac23aSSerge Pavlov     struct ABC {
558ccdac23aSSerge Pavlov        short f16;
559ccdac23aSSerge Pavlov        int f32;
560ccdac23aSSerge Pavlov        long long f64;
561ccdac23aSSerge Pavlov        unsigned short f16_2;
562ccdac23aSSerge Pavlov        unsigned f32_2;
563ccdac23aSSerge Pavlov        unsigned long long f64_2;
564ccdac23aSSerge Pavlov     };
565ccdac23aSSerge Pavlov 
566ccdac23aSSerge Pavlov     void func(struct ABC *A) {
567ccdac23aSSerge Pavlov       A->f32 = 4;
568ccdac23aSSerge Pavlov       A->f16 = 11;
569ccdac23aSSerge Pavlov       A->f64 = 601;
570ccdac23aSSerge Pavlov       A->f16_2 = 22;
571ccdac23aSSerge Pavlov       A->f32_2 = 77;
572ccdac23aSSerge Pavlov       A->f64_2 = 604;
573ccdac23aSSerge Pavlov     }
574ccdac23aSSerge Pavlov   )**";
575ccdac23aSSerge Pavlov 
57654e655b3SVassil Vassilev   clang::LangOptions LO;
57754e655b3SVassil Vassilev   LO.CPlusPlus = 1;
57854e655b3SVassil Vassilev   LO.CPlusPlus11 = 1;
57954e655b3SVassil Vassilev   TBAATestCompiler Compiler(LO, TBAATestCompiler::getCommonCodeGenOpts());
580ccdac23aSSerge Pavlov   Compiler.init(TestProgram);
581ccdac23aSSerge Pavlov   const BasicBlock *BB = Compiler.compile();
582ccdac23aSSerge Pavlov 
583ccdac23aSSerge Pavlov   auto StructABC = MMTuple(
584ccdac23aSSerge Pavlov     MMString("_ZTS3ABC"),
585ccdac23aSSerge Pavlov     MMTuple(
586ccdac23aSSerge Pavlov       MMString("short"),
587ccdac23aSSerge Pavlov       OmnipotentCharCXX,
588ccdac23aSSerge Pavlov       MConstInt(0)),
589ccdac23aSSerge Pavlov     MConstInt(0),
590ccdac23aSSerge Pavlov     MMTuple(
591ccdac23aSSerge Pavlov       MMString("int"),
592ccdac23aSSerge Pavlov       OmnipotentCharCXX,
593ccdac23aSSerge Pavlov       MConstInt(0)),
594ccdac23aSSerge Pavlov     MConstInt(4),
595ccdac23aSSerge Pavlov     MMTuple(
596ccdac23aSSerge Pavlov       MMString("long long"),
597ccdac23aSSerge Pavlov       OmnipotentCharCXX,
598ccdac23aSSerge Pavlov       MConstInt(0)),
599ccdac23aSSerge Pavlov     MConstInt(8),
600ccdac23aSSerge Pavlov     MSameAs(1),
601ccdac23aSSerge Pavlov     MConstInt(16),
602ccdac23aSSerge Pavlov     MSameAs(3),
603ccdac23aSSerge Pavlov     MConstInt(20),
604ccdac23aSSerge Pavlov     MSameAs(5),
605ccdac23aSSerge Pavlov     MConstInt(24));
606ccdac23aSSerge Pavlov 
607ccdac23aSSerge Pavlov   const Instruction *I = match(BB,
608ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
609ccdac23aSSerge Pavlov         MConstInt(4, 32),
610ccdac23aSSerge Pavlov         MMTuple(
611ccdac23aSSerge Pavlov           StructABC,
612ccdac23aSSerge Pavlov           MMTuple(
613ccdac23aSSerge Pavlov             MMString("int"),
614ccdac23aSSerge Pavlov             OmnipotentCharCXX,
615ccdac23aSSerge Pavlov             MConstInt(0)),
616ccdac23aSSerge Pavlov           MConstInt(4))));
617ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
618ccdac23aSSerge Pavlov 
619ccdac23aSSerge Pavlov   I = matchNext(I,
620ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
621ccdac23aSSerge Pavlov         MConstInt(11, 16),
622ccdac23aSSerge Pavlov         MMTuple(
623ccdac23aSSerge Pavlov           StructABC,
624ccdac23aSSerge Pavlov           MMTuple(
625ccdac23aSSerge Pavlov             MMString("short"),
626ccdac23aSSerge Pavlov             OmnipotentCharCXX,
627ccdac23aSSerge Pavlov             MConstInt(0)),
628ccdac23aSSerge Pavlov           MConstInt(0))));
629ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
630ccdac23aSSerge Pavlov 
631ccdac23aSSerge Pavlov   I = matchNext(I,
632ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
633ccdac23aSSerge Pavlov         MConstInt(601, 64),
634ccdac23aSSerge Pavlov         MMTuple(
635ccdac23aSSerge Pavlov           StructABC,
636ccdac23aSSerge Pavlov           MMTuple(
637ccdac23aSSerge Pavlov             MMString("long long"),
638ccdac23aSSerge Pavlov             OmnipotentCharCXX,
639ccdac23aSSerge Pavlov             MConstInt(0)),
640ccdac23aSSerge Pavlov           MConstInt(8))));
641ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
642ccdac23aSSerge Pavlov 
643ccdac23aSSerge Pavlov   I = matchNext(I,
644ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
645ccdac23aSSerge Pavlov         MConstInt(22, 16),
646ccdac23aSSerge Pavlov         MMTuple(
647ccdac23aSSerge Pavlov           StructABC,
648ccdac23aSSerge Pavlov           MMTuple(
649ccdac23aSSerge Pavlov             MMString("short"),
650ccdac23aSSerge Pavlov             OmnipotentCharCXX,
651ccdac23aSSerge Pavlov             MConstInt(0)),
652ccdac23aSSerge Pavlov           MConstInt(16))));
653ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
654ccdac23aSSerge Pavlov 
655ccdac23aSSerge Pavlov   I = matchNext(I,
656ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
657ccdac23aSSerge Pavlov         MConstInt(77, 32),
658ccdac23aSSerge Pavlov         MMTuple(
659ccdac23aSSerge Pavlov           StructABC,
660ccdac23aSSerge Pavlov           MMTuple(
661ccdac23aSSerge Pavlov             MMString("int"),
662ccdac23aSSerge Pavlov             OmnipotentCharCXX,
663ccdac23aSSerge Pavlov             MConstInt(0)),
664ccdac23aSSerge Pavlov           MConstInt(20))));
665ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
666ccdac23aSSerge Pavlov 
667ccdac23aSSerge Pavlov   I = matchNext(I,
668ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
669ccdac23aSSerge Pavlov         MConstInt(604, 64),
670ccdac23aSSerge Pavlov         MMTuple(
671ccdac23aSSerge Pavlov           StructABC,
672ccdac23aSSerge Pavlov           MMTuple(
673ccdac23aSSerge Pavlov             MMString("long long"),
674ccdac23aSSerge Pavlov             OmnipotentCharCXX,
675ccdac23aSSerge Pavlov             MConstInt(0)),
676ccdac23aSSerge Pavlov           MConstInt(24))));
677ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
678ccdac23aSSerge Pavlov }
679ccdac23aSSerge Pavlov 
680ccdac23aSSerge Pavlov TEST(TBAAMetadataTest, CXXTypedefFields) {
681ccdac23aSSerge Pavlov   const char TestProgram[] = R"**(
682ccdac23aSSerge Pavlov     typedef struct {
683ccdac23aSSerge Pavlov        short f16;
684ccdac23aSSerge Pavlov        int f32;
685ccdac23aSSerge Pavlov     } ABC;
686ccdac23aSSerge Pavlov     typedef struct {
687ccdac23aSSerge Pavlov        short value_f16;
688ccdac23aSSerge Pavlov        int value_f32;
689ccdac23aSSerge Pavlov     } CDE;
690ccdac23aSSerge Pavlov 
691ccdac23aSSerge Pavlov     void func(ABC *A, CDE *B) {
692ccdac23aSSerge Pavlov       A->f32 = 4;
693ccdac23aSSerge Pavlov       A->f16 = 11;
694ccdac23aSSerge Pavlov       B->value_f32 = 44;
695ccdac23aSSerge Pavlov       B->value_f16 = 111;
696ccdac23aSSerge Pavlov     }
697ccdac23aSSerge Pavlov   )**";
698ccdac23aSSerge Pavlov 
69954e655b3SVassil Vassilev   clang::LangOptions LO;
70054e655b3SVassil Vassilev   LO.CPlusPlus = 1;
70154e655b3SVassil Vassilev   LO.CPlusPlus11 = 1;
70254e655b3SVassil Vassilev   TBAATestCompiler Compiler(LO, TBAATestCompiler::getCommonCodeGenOpts());
703ccdac23aSSerge Pavlov   Compiler.init(TestProgram);
704ccdac23aSSerge Pavlov   const BasicBlock *BB = Compiler.compile();
705ccdac23aSSerge Pavlov 
706ccdac23aSSerge Pavlov   auto StructABC = MMTuple(
707ccdac23aSSerge Pavlov     MMString("_ZTS3ABC"),
708ccdac23aSSerge Pavlov     MMTuple(
709ccdac23aSSerge Pavlov       MMString("short"),
710ccdac23aSSerge Pavlov       OmnipotentCharCXX,
711ccdac23aSSerge Pavlov       MConstInt(0)),
712ccdac23aSSerge Pavlov     MConstInt(0),
713ccdac23aSSerge Pavlov     MMTuple(
714ccdac23aSSerge Pavlov       MMString("int"),
715ccdac23aSSerge Pavlov       OmnipotentCharCXX,
716ccdac23aSSerge Pavlov       MConstInt(0)),
717ccdac23aSSerge Pavlov     MConstInt(4));
718ccdac23aSSerge Pavlov 
719ccdac23aSSerge Pavlov   auto StructCDE = MMTuple(
720ccdac23aSSerge Pavlov     MMString("_ZTS3CDE"),
721ccdac23aSSerge Pavlov     MMTuple(
722ccdac23aSSerge Pavlov       MMString("short"),
723ccdac23aSSerge Pavlov       OmnipotentCharCXX,
724ccdac23aSSerge Pavlov       MConstInt(0)),
725ccdac23aSSerge Pavlov     MConstInt(0),
726ccdac23aSSerge Pavlov     MMTuple(
727ccdac23aSSerge Pavlov       MMString("int"),
728ccdac23aSSerge Pavlov       OmnipotentCharCXX,
729ccdac23aSSerge Pavlov       MConstInt(0)),
730ccdac23aSSerge Pavlov     MConstInt(4));
731ccdac23aSSerge Pavlov 
732ccdac23aSSerge Pavlov   const Instruction *I = match(BB,
733ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
734ccdac23aSSerge Pavlov         MConstInt(4, 32),
735ccdac23aSSerge Pavlov         MMTuple(
736ccdac23aSSerge Pavlov           StructABC,
737ccdac23aSSerge Pavlov           MMTuple(
738ccdac23aSSerge Pavlov             MMString("int"),
739ccdac23aSSerge Pavlov             OmnipotentCharCXX,
740ccdac23aSSerge Pavlov             MConstInt(0)),
741ccdac23aSSerge Pavlov           MConstInt(4))));
742ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
743ccdac23aSSerge Pavlov 
744ccdac23aSSerge Pavlov   I = matchNext(I,
745ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
746ccdac23aSSerge Pavlov         MConstInt(11, 16),
747ccdac23aSSerge Pavlov         MMTuple(
748ccdac23aSSerge Pavlov           StructABC,
749ccdac23aSSerge Pavlov           MMTuple(
750ccdac23aSSerge Pavlov             MMString("short"),
751ccdac23aSSerge Pavlov             OmnipotentCharCXX,
752ccdac23aSSerge Pavlov             MConstInt(0)),
753ccdac23aSSerge Pavlov           MConstInt(0))));
754ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
755ccdac23aSSerge Pavlov 
756ccdac23aSSerge Pavlov   I = matchNext(I,
757ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
758ccdac23aSSerge Pavlov         MConstInt(44, 32),
759ccdac23aSSerge Pavlov         MMTuple(
760ccdac23aSSerge Pavlov           StructCDE,
761ccdac23aSSerge Pavlov           MMTuple(
762ccdac23aSSerge Pavlov             MMString("int"),
763ccdac23aSSerge Pavlov             OmnipotentCharCXX,
764ccdac23aSSerge Pavlov             MConstInt(0)),
765ccdac23aSSerge Pavlov           MConstInt(4))));
766ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
767ccdac23aSSerge Pavlov 
768ccdac23aSSerge Pavlov   I = matchNext(I,
769ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
770ccdac23aSSerge Pavlov         MConstInt(111, 16),
771ccdac23aSSerge Pavlov         MMTuple(
772ccdac23aSSerge Pavlov           StructCDE,
773ccdac23aSSerge Pavlov           MMTuple(
774ccdac23aSSerge Pavlov             MMString("short"),
775ccdac23aSSerge Pavlov             OmnipotentCharCXX,
776ccdac23aSSerge Pavlov             MConstInt(0)),
777ccdac23aSSerge Pavlov           MConstInt(0))));
778ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
779ccdac23aSSerge Pavlov }
780ccdac23aSSerge Pavlov 
781ccdac23aSSerge Pavlov TEST(TBAAMetadataTest, StructureFields) {
782ccdac23aSSerge Pavlov   const char TestProgram[] = R"**(
783ccdac23aSSerge Pavlov     struct Inner {
784ccdac23aSSerge Pavlov       int f32;
785ccdac23aSSerge Pavlov     };
786ccdac23aSSerge Pavlov 
787ccdac23aSSerge Pavlov     struct Outer {
788ccdac23aSSerge Pavlov       short f16;
789ccdac23aSSerge Pavlov       Inner b1;
790ccdac23aSSerge Pavlov       Inner b2;
791ccdac23aSSerge Pavlov     };
792ccdac23aSSerge Pavlov 
793ccdac23aSSerge Pavlov     void func(Outer *S) {
794ccdac23aSSerge Pavlov       S->f16 = 14;
795ccdac23aSSerge Pavlov       S->b1.f32 = 35;
796ccdac23aSSerge Pavlov       S->b2.f32 = 77;
797ccdac23aSSerge Pavlov     }
798ccdac23aSSerge Pavlov   )**";
799ccdac23aSSerge Pavlov 
80054e655b3SVassil Vassilev   clang::LangOptions LO;
80154e655b3SVassil Vassilev   LO.CPlusPlus = 1;
80254e655b3SVassil Vassilev   LO.CPlusPlus11 = 1;
80354e655b3SVassil Vassilev   TBAATestCompiler Compiler(LO, TBAATestCompiler::getCommonCodeGenOpts());
804ccdac23aSSerge Pavlov   Compiler.init(TestProgram);
805ccdac23aSSerge Pavlov   const BasicBlock *BB = Compiler.compile();
806ccdac23aSSerge Pavlov 
807ccdac23aSSerge Pavlov   auto StructInner = MMTuple(
808ccdac23aSSerge Pavlov     MMString("_ZTS5Inner"),
809ccdac23aSSerge Pavlov     MMTuple(
810ccdac23aSSerge Pavlov       MMString("int"),
811ccdac23aSSerge Pavlov       OmnipotentCharCXX,
812ccdac23aSSerge Pavlov       MConstInt(0)),
813ccdac23aSSerge Pavlov     MConstInt(0));
814ccdac23aSSerge Pavlov 
815ccdac23aSSerge Pavlov   auto StructOuter = MMTuple(
816ccdac23aSSerge Pavlov     MMString("_ZTS5Outer"),
817ccdac23aSSerge Pavlov     MMTuple(
818ccdac23aSSerge Pavlov       MMString("short"),
819ccdac23aSSerge Pavlov       OmnipotentCharCXX,
820ccdac23aSSerge Pavlov       MConstInt(0)),
821ccdac23aSSerge Pavlov     MConstInt(0),
822ccdac23aSSerge Pavlov     StructInner,
823ccdac23aSSerge Pavlov     MConstInt(4),
824ccdac23aSSerge Pavlov     MSameAs(3),
825ccdac23aSSerge Pavlov     MConstInt(8));
826ccdac23aSSerge Pavlov 
827ccdac23aSSerge Pavlov   const Instruction *I = match(BB,
828ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
829ccdac23aSSerge Pavlov         MConstInt(14, 16),
830ccdac23aSSerge Pavlov         MMTuple(
831ccdac23aSSerge Pavlov           StructOuter,
832ccdac23aSSerge Pavlov           MMTuple(
833ccdac23aSSerge Pavlov             MMString("short"),
834ccdac23aSSerge Pavlov             OmnipotentCharCXX,
835ccdac23aSSerge Pavlov             MConstInt(0)),
836ccdac23aSSerge Pavlov           MConstInt(0))));
837ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
838ccdac23aSSerge Pavlov 
839ccdac23aSSerge Pavlov   I = matchNext(I,
840ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
841ccdac23aSSerge Pavlov         MConstInt(35, 32),
842ccdac23aSSerge Pavlov         MMTuple(
843ccdac23aSSerge Pavlov           StructOuter,
844ccdac23aSSerge Pavlov           MMTuple(
845ccdac23aSSerge Pavlov             MMString("int"),
846ccdac23aSSerge Pavlov             OmnipotentCharCXX,
847ccdac23aSSerge Pavlov             MConstInt(0)),
848ccdac23aSSerge Pavlov           MConstInt(4))));
849ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
850ccdac23aSSerge Pavlov 
851ccdac23aSSerge Pavlov   I = matchNext(I,
852ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
853ccdac23aSSerge Pavlov         MConstInt(77, 32),
854ccdac23aSSerge Pavlov         MMTuple(
855ccdac23aSSerge Pavlov           StructOuter,
856ccdac23aSSerge Pavlov           MMTuple(
857ccdac23aSSerge Pavlov             MMString("int"),
858ccdac23aSSerge Pavlov             OmnipotentCharCXX,
859ccdac23aSSerge Pavlov             MConstInt(0)),
860ccdac23aSSerge Pavlov           MConstInt(8))));
861ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
862ccdac23aSSerge Pavlov }
863ccdac23aSSerge Pavlov 
864ccdac23aSSerge Pavlov TEST(TBAAMetadataTest, ArrayFields) {
865ccdac23aSSerge Pavlov   const char TestProgram[] = R"**(
866ccdac23aSSerge Pavlov     struct Inner {
867ccdac23aSSerge Pavlov       int f32;
868ccdac23aSSerge Pavlov     };
869ccdac23aSSerge Pavlov 
870ccdac23aSSerge Pavlov     struct Outer {
871ccdac23aSSerge Pavlov       short f16;
872ccdac23aSSerge Pavlov       Inner b1[2];
873ccdac23aSSerge Pavlov     };
874ccdac23aSSerge Pavlov 
875ccdac23aSSerge Pavlov     void func(Outer *S) {
876ccdac23aSSerge Pavlov       S->f16 = 14;
877ccdac23aSSerge Pavlov       S->b1[0].f32 = 35;
878ccdac23aSSerge Pavlov       S->b1[1].f32 = 77;
879ccdac23aSSerge Pavlov     }
880ccdac23aSSerge Pavlov   )**";
881ccdac23aSSerge Pavlov 
88254e655b3SVassil Vassilev   clang::LangOptions LO;
88354e655b3SVassil Vassilev   LO.CPlusPlus = 1;
88454e655b3SVassil Vassilev   LO.CPlusPlus11 = 1;
88554e655b3SVassil Vassilev   TBAATestCompiler Compiler(LO, TBAATestCompiler::getCommonCodeGenOpts());
886ccdac23aSSerge Pavlov   Compiler.init(TestProgram);
887ccdac23aSSerge Pavlov   const BasicBlock *BB = Compiler.compile();
888ccdac23aSSerge Pavlov 
889ccdac23aSSerge Pavlov   auto StructInner = MMTuple(
890ccdac23aSSerge Pavlov     MMString("_ZTS5Inner"),
891ccdac23aSSerge Pavlov     MMTuple(
892ccdac23aSSerge Pavlov       MMString("int"),
893ccdac23aSSerge Pavlov       OmnipotentCharCXX,
894ccdac23aSSerge Pavlov       MConstInt(0)),
895ccdac23aSSerge Pavlov     MConstInt(0));
896ccdac23aSSerge Pavlov 
897ccdac23aSSerge Pavlov   auto StructOuter = MMTuple(
898ccdac23aSSerge Pavlov     MMString("_ZTS5Outer"),
899ccdac23aSSerge Pavlov     MMTuple(
900ccdac23aSSerge Pavlov       MMString("short"),
901ccdac23aSSerge Pavlov       OmnipotentCharCXX,
902ccdac23aSSerge Pavlov       MConstInt(0)),
903ccdac23aSSerge Pavlov     MConstInt(0),
904ccdac23aSSerge Pavlov     OmnipotentCharCXX,    // FIXME: Info about array field is lost.
905ccdac23aSSerge Pavlov     MConstInt(4));
906ccdac23aSSerge Pavlov 
907ccdac23aSSerge Pavlov   const Instruction *I = match(BB,
908ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
909ccdac23aSSerge Pavlov         MConstInt(14, 16),
910ccdac23aSSerge Pavlov         MMTuple(
911ccdac23aSSerge Pavlov           StructOuter,
912ccdac23aSSerge Pavlov           MMTuple(
913ccdac23aSSerge Pavlov             MMString("short"),
914ccdac23aSSerge Pavlov             OmnipotentCharCXX,
915ccdac23aSSerge Pavlov             MConstInt(0)),
916ccdac23aSSerge Pavlov           MConstInt(0))));
917ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
918ccdac23aSSerge Pavlov 
919ccdac23aSSerge Pavlov   I = matchNext(I,
920ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
921ccdac23aSSerge Pavlov         MConstInt(35, 32),
922ccdac23aSSerge Pavlov         MMTuple(
923ccdac23aSSerge Pavlov           StructInner,
924ccdac23aSSerge Pavlov           MMTuple(
925ccdac23aSSerge Pavlov             MMString("int"),
926ccdac23aSSerge Pavlov             OmnipotentCharCXX,
927ccdac23aSSerge Pavlov             MConstInt(0)),
928ccdac23aSSerge Pavlov           MConstInt(0))));
929ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
930ccdac23aSSerge Pavlov 
931ccdac23aSSerge Pavlov   I = matchNext(I,
932ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
933ccdac23aSSerge Pavlov         MConstInt(77, 32),
934ccdac23aSSerge Pavlov         MMTuple(
935ccdac23aSSerge Pavlov           StructInner,
936ccdac23aSSerge Pavlov           MMTuple(
937ccdac23aSSerge Pavlov             MMString("int"),
938ccdac23aSSerge Pavlov             OmnipotentCharCXX,
939ccdac23aSSerge Pavlov             MConstInt(0)),
940ccdac23aSSerge Pavlov           MConstInt(0))));
941ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
942ccdac23aSSerge Pavlov }
943ccdac23aSSerge Pavlov 
944ccdac23aSSerge Pavlov TEST(TBAAMetadataTest, BaseClass) {
945ccdac23aSSerge Pavlov   const char TestProgram[] = R"**(
946ccdac23aSSerge Pavlov     struct Base {
947ccdac23aSSerge Pavlov       int f32;
948ccdac23aSSerge Pavlov     };
949ccdac23aSSerge Pavlov 
950ccdac23aSSerge Pavlov     struct Derived : public Base {
951ccdac23aSSerge Pavlov       short f16;
952ccdac23aSSerge Pavlov     };
953ccdac23aSSerge Pavlov 
954ccdac23aSSerge Pavlov     void func(Base *B, Derived *D) {
955ccdac23aSSerge Pavlov       B->f32 = 14;
956ccdac23aSSerge Pavlov       D->f16 = 35;
957ccdac23aSSerge Pavlov       D->f32 = 77;
958ccdac23aSSerge Pavlov     }
959ccdac23aSSerge Pavlov   )**";
960ccdac23aSSerge Pavlov 
96154e655b3SVassil Vassilev   clang::LangOptions LO;
96254e655b3SVassil Vassilev   LO.CPlusPlus = 1;
96354e655b3SVassil Vassilev   LO.CPlusPlus11 = 1;
96454e655b3SVassil Vassilev   TBAATestCompiler Compiler(LO, TBAATestCompiler::getCommonCodeGenOpts());
965ccdac23aSSerge Pavlov   Compiler.init(TestProgram);
966ccdac23aSSerge Pavlov   const BasicBlock *BB = Compiler.compile();
967ccdac23aSSerge Pavlov 
968ccdac23aSSerge Pavlov   auto ClassBase = MMTuple(
969ccdac23aSSerge Pavlov     MMString("_ZTS4Base"),
970ccdac23aSSerge Pavlov     MMTuple(
971ccdac23aSSerge Pavlov       MMString("int"),
972ccdac23aSSerge Pavlov       OmnipotentCharCXX,
973ccdac23aSSerge Pavlov       MConstInt(0)),
974ccdac23aSSerge Pavlov     MConstInt(0));
975ccdac23aSSerge Pavlov 
9765b3247bfSBruno De Fraine   auto ClassDerived =
9775b3247bfSBruno De Fraine       MMTuple(MMString("_ZTS7Derived"), ClassBase, MConstInt(0),
9785b3247bfSBruno De Fraine               MMTuple(MMString("short"), OmnipotentCharCXX, MConstInt(0)),
979ccdac23aSSerge Pavlov               MConstInt(4));
980ccdac23aSSerge Pavlov 
981ccdac23aSSerge Pavlov   const Instruction *I = match(BB,
982ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
983ccdac23aSSerge Pavlov         MConstInt(14, 32),
984ccdac23aSSerge Pavlov         MMTuple(
985ccdac23aSSerge Pavlov           ClassBase,
986ccdac23aSSerge Pavlov           MMTuple(
987ccdac23aSSerge Pavlov             MMString("int"),
988ccdac23aSSerge Pavlov             OmnipotentCharCXX,
989ccdac23aSSerge Pavlov             MConstInt(0)),
990ccdac23aSSerge Pavlov           MConstInt(0))));
991ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
992ccdac23aSSerge Pavlov 
993ccdac23aSSerge Pavlov   I = matchNext(I,
994ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
995ccdac23aSSerge Pavlov         MConstInt(35, 16),
996ccdac23aSSerge Pavlov         MMTuple(
997ccdac23aSSerge Pavlov           ClassDerived,
998ccdac23aSSerge Pavlov           MMTuple(
999ccdac23aSSerge Pavlov             MMString("short"),
1000ccdac23aSSerge Pavlov             OmnipotentCharCXX,
1001ccdac23aSSerge Pavlov             MConstInt(0)),
1002ccdac23aSSerge Pavlov           MConstInt(4))));
1003ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
1004ccdac23aSSerge Pavlov 
1005ccdac23aSSerge Pavlov   I = matchNext(I,
1006ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
1007ccdac23aSSerge Pavlov         MConstInt(77, 32),
1008ccdac23aSSerge Pavlov         MMTuple(
1009ccdac23aSSerge Pavlov           ClassBase,
1010ccdac23aSSerge Pavlov           MMTuple(
1011ccdac23aSSerge Pavlov             MMString("int"),
1012ccdac23aSSerge Pavlov             OmnipotentCharCXX,
1013ccdac23aSSerge Pavlov             MConstInt(0)),
1014ccdac23aSSerge Pavlov           MConstInt(0))));
1015ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
1016ccdac23aSSerge Pavlov }
1017ccdac23aSSerge Pavlov 
1018ccdac23aSSerge Pavlov TEST(TBAAMetadataTest, PolymorphicClass) {
1019ccdac23aSSerge Pavlov   const char TestProgram[] = R"**(
1020ccdac23aSSerge Pavlov     struct Base {
1021ccdac23aSSerge Pavlov       virtual void m1(int *) = 0;
1022ccdac23aSSerge Pavlov       int f32;
1023ccdac23aSSerge Pavlov     };
1024ccdac23aSSerge Pavlov 
1025ccdac23aSSerge Pavlov     struct Derived : public Base {
1026ccdac23aSSerge Pavlov       virtual void m1(int *) override;
1027ccdac23aSSerge Pavlov       short f16;
1028ccdac23aSSerge Pavlov     };
1029ccdac23aSSerge Pavlov 
1030ccdac23aSSerge Pavlov     void func(Base *B, Derived *D) {
1031ccdac23aSSerge Pavlov       B->f32 = 14;
1032ccdac23aSSerge Pavlov       D->f16 = 35;
1033ccdac23aSSerge Pavlov       D->f32 = 77;
1034ccdac23aSSerge Pavlov     }
1035ccdac23aSSerge Pavlov   )**";
1036ccdac23aSSerge Pavlov 
103754e655b3SVassil Vassilev   clang::LangOptions LO;
103854e655b3SVassil Vassilev   LO.CPlusPlus = 1;
103954e655b3SVassil Vassilev   LO.CPlusPlus11 = 1;
104054e655b3SVassil Vassilev   TBAATestCompiler Compiler(LO, TBAATestCompiler::getCommonCodeGenOpts());
1041ccdac23aSSerge Pavlov   Compiler.init(TestProgram);
1042ccdac23aSSerge Pavlov   const BasicBlock *BB = Compiler.compile();
1043ccdac23aSSerge Pavlov 
1044ccdac23aSSerge Pavlov   auto ClassBase = MMTuple(
1045ccdac23aSSerge Pavlov     MMString("_ZTS4Base"),
1046ccdac23aSSerge Pavlov     MMTuple(
1047ccdac23aSSerge Pavlov       MMString("int"),
1048ccdac23aSSerge Pavlov       OmnipotentCharCXX,
1049ccdac23aSSerge Pavlov       MConstInt(0)),
1050ccdac23aSSerge Pavlov     MConstInt(Compiler.PtrSize));
1051ccdac23aSSerge Pavlov 
10525b3247bfSBruno De Fraine   auto ClassDerived =
10535b3247bfSBruno De Fraine       MMTuple(MMString("_ZTS7Derived"), ClassBase, MConstInt(0),
10545b3247bfSBruno De Fraine               MMTuple(MMString("short"), OmnipotentCharCXX, MConstInt(0)),
1055ccdac23aSSerge Pavlov               MConstInt(Compiler.PtrSize + 4));
1056ccdac23aSSerge Pavlov 
1057ccdac23aSSerge Pavlov   const Instruction *I = match(BB,
1058ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
1059ccdac23aSSerge Pavlov         MConstInt(14, 32),
1060ccdac23aSSerge Pavlov         MMTuple(
1061ccdac23aSSerge Pavlov           ClassBase,
1062ccdac23aSSerge Pavlov           MMTuple(
1063ccdac23aSSerge Pavlov             MMString("int"),
1064ccdac23aSSerge Pavlov             OmnipotentCharCXX,
1065ccdac23aSSerge Pavlov             MConstInt(0)),
1066ccdac23aSSerge Pavlov           MConstInt(Compiler.PtrSize))));
1067ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
1068ccdac23aSSerge Pavlov 
1069ccdac23aSSerge Pavlov   I = matchNext(I,
1070ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
1071ccdac23aSSerge Pavlov         MConstInt(35, 16),
1072ccdac23aSSerge Pavlov         MMTuple(
1073ccdac23aSSerge Pavlov           ClassDerived,
1074ccdac23aSSerge Pavlov           MMTuple(
1075ccdac23aSSerge Pavlov             MMString("short"),
1076ccdac23aSSerge Pavlov             OmnipotentCharCXX,
1077ccdac23aSSerge Pavlov             MConstInt(0)),
1078ccdac23aSSerge Pavlov           MConstInt(Compiler.PtrSize + 4))));
1079ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
1080ccdac23aSSerge Pavlov 
1081ccdac23aSSerge Pavlov   I = matchNext(I,
1082ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
1083ccdac23aSSerge Pavlov         MConstInt(77, 32),
1084ccdac23aSSerge Pavlov         MMTuple(
1085ccdac23aSSerge Pavlov           ClassBase,
1086ccdac23aSSerge Pavlov           MMTuple(
1087ccdac23aSSerge Pavlov             MMString("int"),
1088ccdac23aSSerge Pavlov             OmnipotentCharCXX,
1089ccdac23aSSerge Pavlov             MConstInt(0)),
1090ccdac23aSSerge Pavlov           MConstInt(Compiler.PtrSize))));
1091ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
1092ccdac23aSSerge Pavlov }
1093ccdac23aSSerge Pavlov 
1094ccdac23aSSerge Pavlov TEST(TBAAMetadataTest, VirtualBase) {
1095ccdac23aSSerge Pavlov   const char TestProgram[] = R"**(
1096ccdac23aSSerge Pavlov     struct Base {
1097ccdac23aSSerge Pavlov       int f32;
1098ccdac23aSSerge Pavlov     };
1099ccdac23aSSerge Pavlov 
1100ccdac23aSSerge Pavlov     struct Derived : public virtual Base {
1101ccdac23aSSerge Pavlov       short f16;
1102ccdac23aSSerge Pavlov     };
1103ccdac23aSSerge Pavlov 
1104ccdac23aSSerge Pavlov     void func(Base *B, Derived *D) {
1105ccdac23aSSerge Pavlov       B->f32 = 14;
1106ccdac23aSSerge Pavlov       D->f16 = 35;
1107ccdac23aSSerge Pavlov       D->f32 = 77;
1108ccdac23aSSerge Pavlov     }
1109ccdac23aSSerge Pavlov   )**";
1110ccdac23aSSerge Pavlov 
111154e655b3SVassil Vassilev   clang::LangOptions LO;
111254e655b3SVassil Vassilev   LO.CPlusPlus = 1;
111354e655b3SVassil Vassilev   LO.CPlusPlus11 = 1;
111454e655b3SVassil Vassilev   TBAATestCompiler Compiler(LO, TBAATestCompiler::getCommonCodeGenOpts());
1115ccdac23aSSerge Pavlov   Compiler.init(TestProgram);
1116ccdac23aSSerge Pavlov   const BasicBlock *BB = Compiler.compile();
1117ccdac23aSSerge Pavlov 
1118ccdac23aSSerge Pavlov   auto ClassBase = MMTuple(
1119ccdac23aSSerge Pavlov     MMString("_ZTS4Base"),
1120ccdac23aSSerge Pavlov     MMTuple(
1121ccdac23aSSerge Pavlov       MMString("int"),
1122ccdac23aSSerge Pavlov       OmnipotentCharCXX,
1123ccdac23aSSerge Pavlov       MConstInt(0)),
1124ccdac23aSSerge Pavlov     MConstInt(0));
1125ccdac23aSSerge Pavlov 
1126ccdac23aSSerge Pavlov   auto ClassDerived = MMTuple(
1127ccdac23aSSerge Pavlov     MMString("_ZTS7Derived"),
1128ccdac23aSSerge Pavlov     MMTuple(
1129ccdac23aSSerge Pavlov       MMString("short"),
1130ccdac23aSSerge Pavlov       OmnipotentCharCXX,
1131ccdac23aSSerge Pavlov       MConstInt(0)),
1132ccdac23aSSerge Pavlov     MConstInt(Compiler.PtrSize));
1133ccdac23aSSerge Pavlov 
1134ccdac23aSSerge Pavlov   const Instruction *I = match(BB,
1135ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
1136ccdac23aSSerge Pavlov         MConstInt(14, 32),
1137ccdac23aSSerge Pavlov         MMTuple(
1138ccdac23aSSerge Pavlov           ClassBase,
1139ccdac23aSSerge Pavlov           MMTuple(
1140ccdac23aSSerge Pavlov             MMString("int"),
1141ccdac23aSSerge Pavlov             OmnipotentCharCXX,
1142ccdac23aSSerge Pavlov             MConstInt(0)),
1143ccdac23aSSerge Pavlov           MConstInt(0))));
1144ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
1145ccdac23aSSerge Pavlov 
1146ccdac23aSSerge Pavlov   I = matchNext(I,
1147ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
1148ccdac23aSSerge Pavlov         MConstInt(35, 16),
1149ccdac23aSSerge Pavlov         MMTuple(
1150ccdac23aSSerge Pavlov           ClassDerived,
1151ccdac23aSSerge Pavlov           MMTuple(
1152ccdac23aSSerge Pavlov             MMString("short"),
1153ccdac23aSSerge Pavlov             OmnipotentCharCXX,
1154ccdac23aSSerge Pavlov             MConstInt(0)),
1155ccdac23aSSerge Pavlov           MConstInt(Compiler.PtrSize))));
1156ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
1157ccdac23aSSerge Pavlov 
1158ccdac23aSSerge Pavlov   I = matchNext(I,
1159ccdac23aSSerge Pavlov       MInstruction(Instruction::Load,
1160ccdac23aSSerge Pavlov         MMTuple(
1161ccdac23aSSerge Pavlov           MMTuple(
1162ccdac23aSSerge Pavlov             MMString("vtable pointer"),
1163ccdac23aSSerge Pavlov             MMTuple(
1164ccdac23aSSerge Pavlov               MMString("Simple C++ TBAA")),
1165ccdac23aSSerge Pavlov             MConstInt(0)),
1166ccdac23aSSerge Pavlov           MSameAs(0),
1167ccdac23aSSerge Pavlov           MConstInt(0))));
1168ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
1169ccdac23aSSerge Pavlov 
1170ccdac23aSSerge Pavlov   I = matchNext(I,
1171ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
1172ccdac23aSSerge Pavlov         MConstInt(77, 32),
1173ccdac23aSSerge Pavlov         MMTuple(
1174ccdac23aSSerge Pavlov           ClassBase,
1175ccdac23aSSerge Pavlov           MMTuple(
1176ccdac23aSSerge Pavlov             MMString("int"),
1177ccdac23aSSerge Pavlov             OmnipotentCharCXX,
1178ccdac23aSSerge Pavlov             MConstInt(0)),
1179ccdac23aSSerge Pavlov           MConstInt(0))));
1180ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
1181ccdac23aSSerge Pavlov }
1182ccdac23aSSerge Pavlov 
1183ccdac23aSSerge Pavlov TEST(TBAAMetadataTest, TemplSpec) {
1184ccdac23aSSerge Pavlov   const char TestProgram[] = R"**(
1185ccdac23aSSerge Pavlov     template<typename T1, typename T2>
1186ccdac23aSSerge Pavlov     struct ABC {
1187ccdac23aSSerge Pavlov       T1 f1;
1188ccdac23aSSerge Pavlov       T2 f2;
1189ccdac23aSSerge Pavlov     };
1190ccdac23aSSerge Pavlov 
1191ccdac23aSSerge Pavlov     void func(ABC<double, int> *p) {
1192ccdac23aSSerge Pavlov       p->f1 = 12.1;
1193ccdac23aSSerge Pavlov       p->f2 = 44;
1194ccdac23aSSerge Pavlov     }
1195ccdac23aSSerge Pavlov   )**";
1196ccdac23aSSerge Pavlov 
119754e655b3SVassil Vassilev   clang::LangOptions LO;
119854e655b3SVassil Vassilev   LO.CPlusPlus = 1;
119954e655b3SVassil Vassilev   LO.CPlusPlus11 = 1;
120054e655b3SVassil Vassilev   TBAATestCompiler Compiler(LO, TBAATestCompiler::getCommonCodeGenOpts());
1201ccdac23aSSerge Pavlov   Compiler.init(TestProgram);
1202ccdac23aSSerge Pavlov   const BasicBlock *BB = Compiler.compile();
1203ccdac23aSSerge Pavlov 
1204ccdac23aSSerge Pavlov   auto SpecABC = MMTuple(
1205ccdac23aSSerge Pavlov     MMString("_ZTS3ABCIdiE"),
1206ccdac23aSSerge Pavlov     MMTuple(
1207ccdac23aSSerge Pavlov       MMString("double"),
1208ccdac23aSSerge Pavlov       OmnipotentCharCXX,
1209ccdac23aSSerge Pavlov       MConstInt(0)),
1210ccdac23aSSerge Pavlov     MConstInt(0),
1211ccdac23aSSerge Pavlov     MMTuple(
1212ccdac23aSSerge Pavlov       MMString("int"),
1213ccdac23aSSerge Pavlov       OmnipotentCharCXX,
1214ccdac23aSSerge Pavlov       MConstInt(0)),
1215ccdac23aSSerge Pavlov     MConstInt(8));
1216ccdac23aSSerge Pavlov 
1217ccdac23aSSerge Pavlov   const Instruction *I = match(BB,
1218ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
1219ccdac23aSSerge Pavlov         MValType(MType([](const Type &T)->bool { return T.isDoubleTy(); })),
1220ccdac23aSSerge Pavlov         MMTuple(
1221ccdac23aSSerge Pavlov           SpecABC,
1222ccdac23aSSerge Pavlov           MMTuple(
1223ccdac23aSSerge Pavlov             MMString("double"),
1224ccdac23aSSerge Pavlov             OmnipotentCharCXX,
1225ccdac23aSSerge Pavlov             MConstInt(0)),
1226ccdac23aSSerge Pavlov           MConstInt(0))));
1227ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
1228ccdac23aSSerge Pavlov 
1229ccdac23aSSerge Pavlov   I = matchNext(I,
1230ccdac23aSSerge Pavlov       MInstruction(Instruction::Store,
1231ccdac23aSSerge Pavlov         MConstInt(44, 32),
1232ccdac23aSSerge Pavlov         MMTuple(
1233ccdac23aSSerge Pavlov           SpecABC,
1234ccdac23aSSerge Pavlov           MMTuple(
1235ccdac23aSSerge Pavlov             MMString("int"),
1236ccdac23aSSerge Pavlov             OmnipotentCharCXX,
1237ccdac23aSSerge Pavlov             MConstInt(0)),
1238ccdac23aSSerge Pavlov           MConstInt(8))));
1239ccdac23aSSerge Pavlov   ASSERT_TRUE(I);
1240ccdac23aSSerge Pavlov }
1241ccdac23aSSerge Pavlov }
1242