1 //===- LLVMTypeTest.cpp - Tests for LLVM types ----------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 #include "LLVMTestBase.h"
10 #include "mlir/Dialect/LLVMIR/LLVMTypes.h"
11 #include "mlir/IR/SubElementInterfaces.h"
12
13 using namespace mlir;
14 using namespace mlir::LLVM;
15
TEST_F(LLVMIRTest,IsStructTypeMutable)16 TEST_F(LLVMIRTest, IsStructTypeMutable) {
17 auto structTy = LLVMStructType::getIdentified(&context, "foo");
18 ASSERT_TRUE(bool(structTy));
19 ASSERT_TRUE(structTy.hasTrait<TypeTrait::IsMutable>());
20 }
21
TEST_F(LLVMIRTest,MutualReferencedSubElementTypes)22 TEST_F(LLVMIRTest, MutualReferencedSubElementTypes) {
23 auto fooStructTy = LLVMStructType::getIdentified(&context, "foo");
24 ASSERT_TRUE(bool(fooStructTy));
25 auto barStructTy = LLVMStructType::getIdentified(&context, "bar");
26 ASSERT_TRUE(bool(barStructTy));
27
28 // Created two structs that are referencing each other.
29 Type fooBody[] = {LLVMPointerType::get(barStructTy)};
30 ASSERT_TRUE(succeeded(fooStructTy.setBody(fooBody, /*packed=*/false)));
31 Type barBody[] = {LLVMPointerType::get(fooStructTy)};
32 ASSERT_TRUE(succeeded(barStructTy.setBody(barBody, /*packed=*/false)));
33
34 auto subElementInterface = fooStructTy.dyn_cast<SubElementTypeInterface>();
35 ASSERT_TRUE(bool(subElementInterface));
36 // Test if walkSubElements goes into infinite loops.
37 SmallVector<Type, 4> subElementTypes;
38 subElementInterface.walkSubElements(
39 [](Attribute attr) {},
40 [&](Type type) { subElementTypes.push_back(type); });
41 // We don't record LLVMPointerType (because it's immutable), thus
42 // !llvm.ptr<struct<"bar",...>> will be visited twice.
43 ASSERT_EQ(subElementTypes.size(), 5U);
44
45 // !llvm.ptr<struct<"bar",...>>
46 ASSERT_TRUE(subElementTypes[0].isa<LLVMPointerType>());
47
48 // !llvm.struct<"foo",...>
49 auto structType = subElementTypes[1].dyn_cast<LLVMStructType>();
50 ASSERT_TRUE(bool(structType));
51 ASSERT_TRUE(structType.getName().equals("foo"));
52
53 // !llvm.ptr<struct<"foo",...>>
54 ASSERT_TRUE(subElementTypes[2].isa<LLVMPointerType>());
55
56 // !llvm.struct<"bar",...>
57 structType = subElementTypes[3].dyn_cast<LLVMStructType>();
58 ASSERT_TRUE(bool(structType));
59 ASSERT_TRUE(structType.getName().equals("bar"));
60
61 // !llvm.ptr<struct<"bar",...>>
62 ASSERT_TRUE(subElementTypes[4].isa<LLVMPointerType>());
63 }
64