summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorAlex Lorenz <arphaman@gmail.com>2015-08-17 22:05:15 +0000
committerAlex Lorenz <arphaman@gmail.com>2015-08-17 22:05:15 +0000
commita617c9162dcc23e1b974c7e30509ef4e303fce33 (patch)
tree8092334818f2afc9894269449bf4138bb0324e7e /llvm/lib/CodeGen
parent05ddbffbf3eba8ef2cac067b0cf8e9c53b78855e (diff)
downloadbcm5719-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')
-rw-r--r--llvm/lib/CodeGen/MIRParser/MILexer.cpp31
-rw-r--r--llvm/lib/CodeGen/MIRParser/MILexer.h3
-rw-r--r--llvm/lib/CodeGen/MIRParser/MIParser.cpp28
-rw-r--r--llvm/lib/CodeGen/MIRPrinter.cpp9
4 files changed, 60 insertions, 11 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;
}
diff --git a/llvm/lib/CodeGen/MIRPrinter.cpp b/llvm/lib/CodeGen/MIRPrinter.cpp
index 248db52790e..b7292f3e151 100644
--- a/llvm/lib/CodeGen/MIRPrinter.cpp
+++ b/llvm/lib/CodeGen/MIRPrinter.cpp
@@ -777,7 +777,14 @@ void MIPrinter::print(const MachineMemOperand &Op) {
printOffset(Op.getOffset());
if (Op.getBaseAlignment() != Op.getSize())
OS << ", align " << Op.getBaseAlignment();
- // TODO: Print the metadata attributes.
+ auto AAInfo = Op.getAAInfo();
+ if (AAInfo.TBAA) {
+ OS << ", !tbaa ";
+ AAInfo.TBAA->printAsOperand(OS, MST);
+ }
+ // TODO: Print AA Scope metadata.
+ // TODO: Print AA NoAlias metadata.
+ // TODO: Print the ranges metadata.
OS << ')';
}
OpenPOWER on IntegriCloud