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