================
@@ -225,4 +225,120 @@ TEST_F(RegisterTypeBuilderClangTest, RejectsSizeMismatch)
{
EXPECT_FALSE(builder.GetRegisterType(MakeRegisterInfo(pointer, 4)));
}
+TEST_F(RegisterTypeBuilderClangTest, BuildsPowerOfTwoVector) {
+ Target &target = m_debugger_sp->GetDummyTarget();
+ RegisterTypeBuiltin element_type("ieee_single", eEncodingIEEE754,
+ eFormatFloat, 4);
+ RegisterTypeVector vector_type("v4f", &element_type, 4);
+ RegisterTypeBuilderClang builder(target);
+
+ CompilerType type =
+ builder.GetRegisterType(MakeRegisterInfo(vector_type, 16));
+
+ ASSERT_TRUE(type);
+ EXPECT_EQ(llvm::expectedToOptional(type.GetByteSize(nullptr)), 16u);
+ EXPECT_NE(type.GetTypeInfo() & eTypeIsVector, 0u);
+ EXPECT_EQ(llvm::expectedToOptional(type.GetNumChildren(true, nullptr)), 4u);
+}
+
+TEST_F(RegisterTypeBuilderClangTest, PreservesThreeLaneVectorLayout) {
+ Target &target = m_debugger_sp->GetDummyTarget();
+ RegisterTypeBuiltin element_type("ieee_single", eEncodingIEEE754,
+ eFormatFloat, 4);
+ RegisterTypeVector vector_type("v3f", &element_type, 3);
+ RegisterTypeBuilderClang builder(target);
+
+ CompilerType type =
+ builder.GetRegisterType(MakeRegisterInfo(vector_type, 12));
+
+ ASSERT_TRUE(type);
+ EXPECT_EQ(llvm::expectedToOptional(type.GetByteSize(nullptr)), 12u);
+ EXPECT_NE(type.GetTypeInfo() & eTypeIsArray, 0u);
+ EXPECT_EQ(type.GetTypeInfo() & eTypeIsVector, 0u);
+ EXPECT_EQ(llvm::expectedToOptional(type.GetNumChildren(true, nullptr)), 3u);
+}
+
+TEST_F(RegisterTypeBuilderClangTest, BuildsNestedVectors) {
+ Target &target = m_debugger_sp->GetDummyTarget();
+ RegisterTypeBuiltin element_type("ieee_single", eEncodingIEEE754,
+ eFormatFloat, 4);
+ RegisterTypeVector inner_type("v2f", &element_type, 2);
+ RegisterTypeVector outer_type("v2v2f", &inner_type, 2);
+ RegisterTypeBuilderClang builder(target);
+
+ CompilerType type = builder.GetRegisterType(MakeRegisterInfo(outer_type,
16));
+
+ ASSERT_TRUE(type);
+ EXPECT_EQ(llvm::expectedToOptional(type.GetByteSize(nullptr)), 16u);
+ EXPECT_NE(type.GetTypeInfo() & eTypeIsArray, 0u);
+ EXPECT_EQ(llvm::expectedToOptional(type.GetNumChildren(true, nullptr)), 2u);
+
+ CompilerType inner = type.GetArrayElementType(nullptr);
+ ASSERT_TRUE(inner);
+ EXPECT_NE(inner.GetTypeInfo() & eTypeIsVector, 0u);
+ EXPECT_EQ(llvm::expectedToOptional(inner.GetNumChildren(true, nullptr)), 2u);
+}
+
+TEST_F(RegisterTypeBuilderClangTest, BuildsTargetSizedPointerVector) {
+ Target &target = m_debugger_sp->GetDummyTarget();
+ RegisterTypeBuiltin pointer_type("data_ptr", eEncodingUint,
+ eFormatAddressInfo, std::nullopt);
+ RegisterTypeVector vector_type("v2p", &pointer_type, 2);
+ RegisterTypeBuilderClang builder(target);
+
+ CompilerType type =
+ builder.GetRegisterType(MakeRegisterInfo(vector_type, 16));
+
+ ASSERT_TRUE(type);
+ EXPECT_EQ(llvm::expectedToOptional(type.GetByteSize(nullptr)), 16u);
+ EXPECT_NE(type.GetTypeInfo() & eTypeIsArray, 0u);
+ EXPECT_EQ(llvm::expectedToOptional(type.GetNumChildren(true, nullptr)), 2u);
+}
+
+TEST_F(RegisterTypeBuilderClangTest, BuildsBoolVectorAsArray) {
+ Target &target = m_debugger_sp->GetDummyTarget();
+ RegisterTypeBuiltin element_type("bool", eEncodingUint, eFormatBoolean, 1);
+ RegisterTypeVector vector_type("v4b", &element_type, 4);
+ RegisterTypeBuilderClang builder(target);
+
+ CompilerType type = builder.GetRegisterType(MakeRegisterInfo(vector_type,
4));
+
+ ASSERT_TRUE(type);
+ EXPECT_EQ(llvm::expectedToOptional(type.GetByteSize(nullptr)), 4u);
+ EXPECT_NE(type.GetTypeInfo() & eTypeIsArray, 0u);
+ EXPECT_EQ(type.GetTypeInfo() & eTypeIsVector, 0u);
+ EXPECT_EQ(llvm::expectedToOptional(type.GetNumChildren(true, nullptr)), 4u);
+}
+
+TEST_F(RegisterTypeBuilderClangTest, BuildsSingleUint128Vector) {
+ Target &target = m_debugger_sp->GetDummyTarget();
+ RegisterTypeBuiltin element_type("uint128", eEncodingUint, eFormatHex, 16);
+ RegisterTypeVector vector_type("v1u128", &element_type, 1);
+ RegisterTypeBuilderClang builder(target);
+
+ CompilerType type =
+ builder.GetRegisterType(MakeRegisterInfo(vector_type, 16));
+
+ ASSERT_TRUE(type);
+ EXPECT_EQ(llvm::expectedToOptional(type.GetByteSize(nullptr)), 16u);
+ EXPECT_NE(type.GetTypeInfo() & eTypeIsVector, 0u);
----------------
DavidSpickett wrote:
If you could write these as:
```
EXPECT_EQ(type.GetTypeInfo() & eTypeIsVector, eTypeIsVector);
```
It would save me a few minutes inverting the logic to understand what it's
doing.
Or can we use the built in IsVectorType and IsArrayType instead?
https://github.com/llvm/llvm-project/pull/220707
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits