diff options
author | Alex Lorenz <arphaman@gmail.com> | 2015-08-21 21:32:39 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2015-08-21 21:32:39 +0000 |
commit | 0e99876efe5c2cbea63ec91c74ec923c3fd193e5 (patch) | |
tree | b1ebd421eb6940e1449a9afa21ef37b4a5fe282d /unittests/AsmParser | |
parent | 8ccce34ac06c271cff7283d495c6038e0d4e8fd1 (diff) |
AsmParser: Save and restore the parsing state for types using SlotMapping.
This commit extends the 'SlotMapping' structure and includes mappings for named
and numbered types in it. The LLParser is extended accordingly to fill out
those mappings at the end of module parsing.
This information is useful when we want to parse standalone constant values
at a later stage using the 'parseConstantValue' method. The constant values
can be constant expressions, which can contain references to types. In order
to parse such constant values, we have to restore the internal named and
numbered mappings for the types in LLParser, otherwise the parser will report
a parsing error. Therefore, this commit also introduces a new method called
'restoreParsingState' to LLParser, which uses the slot mappings to restore
some of its internal parsing state.
This commit is required to serialize constant value pointers in the machine
memory operands for the MIR format.
Reviewers: Duncan P. N. Exon Smith
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245740 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests/AsmParser')
-rw-r--r-- | unittests/AsmParser/AsmParserTest.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/unittests/AsmParser/AsmParserTest.cpp b/unittests/AsmParser/AsmParserTest.cpp index 099f5b5f9233..ef16eb1cfb38 100644 --- a/unittests/AsmParser/AsmParserTest.cpp +++ b/unittests/AsmParser/AsmParserTest.cpp @@ -112,4 +112,40 @@ TEST(AsmParserTest, TypeAndConstantValueParsing) { EXPECT_EQ(Error.getMessage(), "expected end of string"); } +TEST(AsmParserTest, TypeAndConstantValueWithSlotMappingParsing) { + LLVMContext &Ctx = getGlobalContext(); + SMDiagnostic Error; + StringRef Source = + "%st = type { i32, i32 }\n" + "@v = common global [50 x %st] zeroinitializer, align 16\n" + "%0 = type { i32, i32, i32, i32 }\n" + "@g = common global [50 x %0] zeroinitializer, align 16\n" + "define void @marker4(i64 %d) {\n" + "entry:\n" + " %conv = trunc i64 %d to i32\n" + " store i32 %conv, i32* getelementptr inbounds " + " ([50 x %st], [50 x %st]* @v, i64 0, i64 0, i32 0), align 16\n" + " store i32 %conv, i32* getelementptr inbounds " + " ([50 x %0], [50 x %0]* @g, i64 0, i64 0, i32 0), align 16\n" + " ret void\n" + "}"; + SlotMapping Mapping; + auto Mod = parseAssemblyString(Source, Error, Ctx, &Mapping); + ASSERT_TRUE(Mod != nullptr); + auto &M = *Mod; + + const Value *V; + V = parseConstantValue("i32* getelementptr inbounds ([50 x %st], [50 x %st]* " + "@v, i64 0, i64 0, i32 0)", + Error, M, &Mapping); + ASSERT_TRUE(V); + ASSERT_TRUE(isa<ConstantExpr>(V)); + + V = parseConstantValue("i32* getelementptr inbounds ([50 x %0], [50 x %0]* " + "@g, i64 0, i64 0, i32 0)", + Error, M, &Mapping); + ASSERT_TRUE(V); + ASSERT_TRUE(isa<ConstantExpr>(V)); +} + } // end anonymous namespace |