diff options
author | Alex Lorenz <arphaman@gmail.com> | 2015-08-17 22:05:15 +0000 |
---|---|---|
committer | Alex Lorenz <arphaman@gmail.com> | 2015-08-17 22:05:15 +0000 |
commit | a617c9162dcc23e1b974c7e30509ef4e303fce33 (patch) | |
tree | 8092334818f2afc9894269449bf4138bb0324e7e /llvm/lib/CodeGen/MIRParser | |
parent | 05ddbffbf3eba8ef2cac067b0cf8e9c53b78855e (diff) | |
download | bcm5719-llvm-a617c9162dcc23e1b974c7e30509ef4e303fce33.tar.gz bcm5719-llvm-a617c9162dcc23e1b974c7e30509ef4e303fce33.zip |
MIR Serialization: Serialize the memory operand's TBAA metadata node.
llvm-svn: 245244
Diffstat (limited to 'llvm/lib/CodeGen/MIRParser')
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.cpp | 31 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MILexer.h | 3 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MIParser.cpp | 28 |
3 files changed, 52 insertions, 10 deletions
diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.cpp b/llvm/lib/CodeGen/MIRParser/MILexer.cpp index f607edddecc..f4c9786d421 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.cpp +++ b/llvm/lib/CodeGen/MIRParser/MILexer.cpp @@ -442,6 +442,33 @@ static Cursor maybeLexNumericalLiteral(Cursor C, MIToken &Token) { return C; } +static MIToken::TokenKind getMetadataKeywordKind(StringRef Identifier) { + return StringSwitch<MIToken::TokenKind>(Identifier) + .Case("!tbaa", MIToken::md_tbaa) + .Default(MIToken::Error); +} + +static Cursor maybeLexExlaim( + Cursor C, MIToken &Token, + function_ref<void(StringRef::iterator Loc, const Twine &)> ErrorCallback) { + if (C.peek() != '!') + return None; + auto Range = C; + C.advance(1); + if (isdigit(C.peek()) || !isIdentifierChar(C.peek())) { + Token.reset(MIToken::exclaim, Range.upto(C)); + return C; + } + while (isIdentifierChar(C.peek())) + C.advance(); + StringRef StrVal = Range.upto(C); + Token.reset(getMetadataKeywordKind(StrVal), StrVal); + if (Token.isError()) + ErrorCallback(Token.location(), + "use of unknown metadata keyword '" + StrVal + "'"); + return C; +} + static MIToken::TokenKind symbolToken(char C) { switch (C) { case ',': @@ -450,8 +477,6 @@ static MIToken::TokenKind symbolToken(char C) { return MIToken::equal; case ':': return MIToken::colon; - case '!': - return MIToken::exclaim; case '(': return MIToken::lparen; case ')': @@ -531,6 +556,8 @@ StringRef llvm::lexMIToken( return R.remaining(); if (Cursor R = maybeLexNumericalLiteral(C, Token)) return R.remaining(); + if (Cursor R = maybeLexExlaim(C, Token, ErrorCallback)) + return R.remaining(); if (Cursor R = maybeLexSymbol(C, Token)) return R.remaining(); if (Cursor R = maybeLexNewline(C, Token)) diff --git a/llvm/lib/CodeGen/MIRParser/MILexer.h b/llvm/lib/CodeGen/MIRParser/MILexer.h index 747e6523e4b..fc92cc14e89 100644 --- a/llvm/lib/CodeGen/MIRParser/MILexer.h +++ b/llvm/lib/CodeGen/MIRParser/MILexer.h @@ -85,6 +85,9 @@ struct MIToken { kw_liveins, kw_successors, + // Named metadata keywords + md_tbaa, + // Identifier tokens Identifier, IntegerType, diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp index c6383720e23..e076a2d5b5e 100644 --- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp +++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp @@ -1526,17 +1526,29 @@ bool MIParser::parseMachineMemoryOperand(MachineMemOperand *&Dest) { if (parseMachinePointerInfo(Ptr)) return true; unsigned BaseAlignment = Size; - if (Token.is(MIToken::comma)) { - lex(); - if (Token.isNot(MIToken::kw_align)) - return error("expected 'align'"); - if (parseAlignment(BaseAlignment)) - return true; + AAMDNodes AAInfo; + while (consumeIfPresent(MIToken::comma)) { + switch (Token.kind()) { + case MIToken::kw_align: + if (parseAlignment(BaseAlignment)) + return true; + break; + case MIToken::md_tbaa: + lex(); + if (parseMDNode(AAInfo.TBAA)) + return true; + break; + // TODO: Parse AA Scope metadata. + // TODO: Parse AA NoAlias metadata. + // TODO: Parse the ranges metadata. + // TODO: Report an error on duplicate metadata nodes. + default: + return error("expected 'align' or '!tbaa'"); + } } - // TODO: Parse the attached metadata nodes. if (expectAndConsume(MIToken::rparen)) return true; - Dest = MF.getMachineMemOperand(Ptr, Flags, Size, BaseAlignment); + Dest = MF.getMachineMemOperand(Ptr, Flags, Size, BaseAlignment, AAInfo); return false; } |