forked from OSchip/llvm-project
MIR Serialization: Serialize the memory operand's TBAA metadata node.
llvm-svn: 245244
This commit is contained in:
parent
05ddbffbf3
commit
a617c9162d
|
@ -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))
|
||||
|
|
|
@ -85,6 +85,9 @@ struct MIToken {
|
|||
kw_liveins,
|
||||
kw_successors,
|
||||
|
||||
// Named metadata keywords
|
||||
md_tbaa,
|
||||
|
||||
// Identifier tokens
|
||||
Identifier,
|
||||
IntegerType,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 << ')';
|
||||
}
|
||||
|
||||
|
|
|
@ -111,6 +111,27 @@
|
|||
ret i32 8
|
||||
}
|
||||
|
||||
%struct.XXH_state64_t = type { i32, i32, i64, i64, i64 }
|
||||
|
||||
@a = common global i32 0, align 4
|
||||
|
||||
define i32 @tbaa_metadata() {
|
||||
entry:
|
||||
%0 = load i32, i32* @a, align 4, !tbaa !2
|
||||
%1 = inttoptr i32 %0 to %struct.XXH_state64_t*
|
||||
%total_len2 = bitcast %struct.XXH_state64_t* %1 to i32*
|
||||
%2 = load i32, i32* %total_len2, align 4, !tbaa !6
|
||||
ret i32 %2
|
||||
}
|
||||
|
||||
!2 = !{!3, !3, i64 0}
|
||||
!3 = !{!"int", !4, i64 0}
|
||||
!4 = !{!"omnipotent char", !5, i64 0}
|
||||
!5 = !{!"Simple C/C++ TBAA"}
|
||||
!6 = !{!7, !3, i64 0}
|
||||
!7 = !{!"XXH_state64_t", !3, i64 0, !3, i64 4, !8, i64 8, !8, i64 16, !8, i64 24}
|
||||
!8 = !{!"long long", !4, i64 0}
|
||||
|
||||
...
|
||||
---
|
||||
name: test
|
||||
|
@ -338,3 +359,16 @@ body: |
|
|||
%eax = MOV32ri 8
|
||||
RETQ %eax
|
||||
...
|
||||
---
|
||||
name: tbaa_metadata
|
||||
tracksRegLiveness: true
|
||||
body: |
|
||||
bb.0.entry:
|
||||
%rax = MOV64rm %rip, 1, _, @a, _ :: (load 8 from got)
|
||||
; CHECK-LABEL: name: tbaa_metadata
|
||||
; CHECK: %eax = MOV32rm killed %rax, 1, _, 0, _, implicit-def %rax :: (load 4 from %ir.a, !tbaa !2)
|
||||
; CHECK-NEXT: %eax = MOV32rm killed %rax, 1, _, 0, _ :: (load 4 from %ir.total_len2, !tbaa !6)
|
||||
%eax = MOV32rm killed %rax, 1, _, 0, _, implicit-def %rax :: (load 4 from %ir.a, !tbaa !2)
|
||||
%eax = MOV32rm killed %rax, 1, _, 0, _ :: (load 4 from %ir.total_len2, !tbaa !6)
|
||||
RETQ %eax
|
||||
...
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
# RUN: not llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o /dev/null %s 2>&1 | FileCheck %s
|
||||
|
||||
--- |
|
||||
define i32 @inc(i32* %x) {
|
||||
entry:
|
||||
%0 = load i32, i32* %x
|
||||
%1 = add i32 %0, 1
|
||||
store i32 %1, i32* %x
|
||||
ret i32 %1
|
||||
}
|
||||
...
|
||||
---
|
||||
name: inc
|
||||
tracksRegLiveness: true
|
||||
liveins:
|
||||
- { reg: '%rdi' }
|
||||
body: |
|
||||
bb.0.entry:
|
||||
liveins: %rdi
|
||||
; CHECK: [[@LINE+1]]:60: use of unknown metadata keyword '!tba'
|
||||
%eax = MOV32rm %rdi, 1, _, 0, _ :: (load 4 from %ir.x, !tba !0)
|
||||
%eax = INC32r killed %eax, implicit-def dead %eflags
|
||||
MOV32mr killed %rdi, 1, _, 0, _, %eax :: (store 4 into %ir.x)
|
||||
RETQ %eax
|
||||
...
|
Loading…
Reference in New Issue