[llvm] [DataLayout] Refactor parsing of "p" specification (PR #104583)
Sergei Barannikov via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 16 05:12:40 PDT 2024
================
@@ -134,6 +105,98 @@ TEST(DataLayout, LayoutStringFormat) {
FailedWithMessage("empty specification is not allowed"));
}
+TEST(DataLayout, ParsePointerSpec) {
+ for (StringRef Str :
+ {"p:16:8", "p:16:16:64", "p:32:64:64:32", "p0:32:64", "p42:64:32:32",
+ "p16777215:32:32:64:8", "p16777215:16777215:32768:32768:16777215"})
+ EXPECT_THAT_EXPECTED(DataLayout::parse(Str), Succeeded());
+
+ for (StringRef Str :
+ {"p", "p0", "p:32", "p0:32", "p:32:32:32:32:32", "p0:32:32:32:32:32"})
+ EXPECT_THAT_EXPECTED(
+ DataLayout::parse(Str),
+ FailedWithMessage("malformed specification, must be of the form "
+ "\"p[<n>]:<size>:<abi>[:<pref>[:<idx>]]\""));
+
+ // address space
+ for (StringRef Str : {"p0x0:32:32", "px:32:32:32", "p16777216:32:32:32:32"})
+ EXPECT_THAT_EXPECTED(
+ DataLayout::parse(Str),
+ FailedWithMessage("address space must be a 24-bit integer"));
+
+ // pointer size
+ for (StringRef Str : {"p::32", "p0::32"})
+ EXPECT_THAT_EXPECTED(
+ DataLayout::parse(Str),
+ FailedWithMessage("pointer size component cannot be empty"));
+
+ for (StringRef Str : {"p:0:32", "p0:0x1:32:32", "p42:16777216:32:32:32"})
+ EXPECT_THAT_EXPECTED(
+ DataLayout::parse(Str),
+ FailedWithMessage("pointer size must be a non-zero 24-bit integer"));
+
+ // ABI alignment
+ for (StringRef Str : {"p:32:", "p0:32::32", "p42:32::32:32"})
+ EXPECT_THAT_EXPECTED(
+ DataLayout::parse(Str),
+ FailedWithMessage("ABI alignment component cannot be empty"));
+
+ for (StringRef Str : {"p:32:x", "p0:32:0x20:32", "p42:32:65536:32:32"})
+ EXPECT_THAT_EXPECTED(
+ DataLayout::parse(Str),
+ FailedWithMessage("ABI alignment must be a 16-bit integer"));
+
+ for (StringRef Str : {"p:32:0", "p0:32:0:32", "p42:32:0:32:32"})
+ EXPECT_THAT_EXPECTED(DataLayout::parse(Str),
+ FailedWithMessage("ABI alignment must be non-zero"));
+
+ for (StringRef Str : {"p:32:4", "p42:32:24:32", "p0:32:65535:32:32"})
+ EXPECT_THAT_EXPECTED(
+ DataLayout::parse(Str),
+ FailedWithMessage(
+ "ABI alignment must be a power of two times the byte width"));
+
+ // preferred alignment
+ for (StringRef Str : {"p:32:32:", "p0:32:32:", "p42:32:32::32"})
+ EXPECT_THAT_EXPECTED(
+ DataLayout::parse(Str),
+ FailedWithMessage("preferred alignment component cannot be empty"));
+
+ for (StringRef Str : {"p:32:32:x", "p0:32:32:0x20", "p42:32:32:65536:32"})
+ EXPECT_THAT_EXPECTED(
+ DataLayout::parse(Str),
+ FailedWithMessage("preferred alignment must be a 16-bit integer"));
+
+ for (StringRef Str : {"p:32:32:0", "p0:32:32:0", "p42:32:32:0:32"})
+ EXPECT_THAT_EXPECTED(
+ DataLayout::parse(Str),
+ FailedWithMessage("preferred alignment must be non-zero"));
+
+ for (StringRef Str : {"p:32:32:4", "p42:32:32:24", "p0:32:32:65535:32"})
+ EXPECT_THAT_EXPECTED(
+ DataLayout::parse(Str),
+ FailedWithMessage(
+ "preferred alignment must be a power of two times the byte width"));
+ // TODO: Check PrefAlign >= ABIAlign.
----------------
s-barannikov wrote:
I'll add the missing test, but otherwise the PR is ready for review.
https://github.com/llvm/llvm-project/pull/104583
More information about the llvm-commits
mailing list