Skip to content

Commit ef58806

Browse files
author
git apple-llvm automerger
committed
Merge commit '8f860c6af0dd' from apple/main into swift/next
2 parents fb6a32b + 8f860c6 commit ef58806

File tree

4 files changed

+138
-7
lines changed

4 files changed

+138
-7
lines changed

llvm/lib/MC/MCParser/MasmParser.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6728,6 +6728,8 @@ bool MasmParser::lookUpField(const StructInfo &Structure, StringRef Member,
67286728
Info.Type.Length = Field.LengthOf;
67296729
if (Field.Contents.FT == FT_STRUCT)
67306730
Info.Type.Name = Field.Contents.StructInfo.Structure.Name;
6731+
else
6732+
Info.Type.Name = "";
67316733
return false;
67326734
}
67336735

llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp

Lines changed: 68 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1674,6 +1674,18 @@ bool X86AsmParser::ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End) {
16741674
if (ParseIntelDotOperator(SM, End))
16751675
return true;
16761676
break;
1677+
case AsmToken::Dot:
1678+
if (!Parser.isParsingMasm()) {
1679+
if ((Done = SM.isValidEndState()))
1680+
break;
1681+
return Error(Tok.getLoc(), "unknown token in expression");
1682+
}
1683+
// MASM allows spaces around the dot operator (e.g., "var . x")
1684+
Lex();
1685+
UpdateLocLex = false;
1686+
if (ParseIntelDotOperator(SM, End))
1687+
return true;
1688+
break;
16771689
case AsmToken::Dollar:
16781690
if (!Parser.isParsingMasm()) {
16791691
if ((Done = SM.isValidEndState()))
@@ -1687,6 +1699,23 @@ bool X86AsmParser::ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End) {
16871699
SMLoc IdentLoc = Tok.getLoc();
16881700
StringRef Identifier = Tok.getString();
16891701
UpdateLocLex = false;
1702+
if (Parser.isParsingMasm()) {
1703+
size_t DotOffset = Identifier.find_first_of('.');
1704+
if (DotOffset != StringRef::npos) {
1705+
consumeToken();
1706+
StringRef LHS = Identifier.slice(0, DotOffset);
1707+
StringRef Dot = Identifier.slice(DotOffset, DotOffset + 1);
1708+
StringRef RHS = Identifier.slice(DotOffset + 1, StringRef::npos);
1709+
if (!RHS.empty()) {
1710+
getLexer().UnLex(AsmToken(AsmToken::Identifier, RHS));
1711+
}
1712+
getLexer().UnLex(AsmToken(AsmToken::Dot, Dot));
1713+
if (!LHS.empty()) {
1714+
getLexer().UnLex(AsmToken(AsmToken::Identifier, LHS));
1715+
}
1716+
break;
1717+
}
1718+
}
16901719
// (MASM only) <TYPE> PTR operator
16911720
if (Parser.isParsingMasm()) {
16921721
const AsmToken &NextTok = getLexer().peekTok();
@@ -1744,7 +1773,7 @@ bool X86AsmParser::ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End) {
17441773
}
17451774
// Symbol reference, when parsing assembly content
17461775
InlineAsmIdentifierInfo Info;
1747-
AsmTypeInfo Type;
1776+
AsmFieldInfo FieldInfo;
17481777
const MCExpr *Val;
17491778
if (isParsingMSInlineAsm() || Parser.isParsingMasm()) {
17501779
// MS Dot Operator expression
@@ -1761,8 +1790,9 @@ bool X86AsmParser::ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End) {
17611790
if (int64_t Val = ParseIntelInlineAsmOperator(OpKind)) {
17621791
if (SM.onInteger(Val, ErrMsg))
17631792
return Error(IdentLoc, ErrMsg);
1764-
} else
1793+
} else {
17651794
return true;
1795+
}
17661796
break;
17671797
}
17681798
// MS InlineAsm identifier
@@ -1771,7 +1801,8 @@ bool X86AsmParser::ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End) {
17711801
return Error(IdentLoc, "expected identifier");
17721802
if (ParseIntelInlineAsmIdentifier(Val, Identifier, Info, false, End))
17731803
return true;
1774-
else if (SM.onIdentifierExpr(Val, Identifier, Info, Type, true, ErrMsg))
1804+
else if (SM.onIdentifierExpr(Val, Identifier, Info, FieldInfo.Type,
1805+
true, ErrMsg))
17751806
return Error(IdentLoc, ErrMsg);
17761807
break;
17771808
}
@@ -1784,11 +1815,35 @@ bool X86AsmParser::ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End) {
17841815
return Error(IdentLoc, ErrMsg);
17851816
break;
17861817
}
1818+
if (!getParser().lookUpType(Identifier, FieldInfo.Type)) {
1819+
// Field offset immediate; <TYPE>.<field specification>
1820+
Lex(); // eat type
1821+
bool EndDot = parseOptionalToken(AsmToken::Dot);
1822+
while (EndDot || (getTok().is(AsmToken::Identifier) &&
1823+
getTok().getString().startswith("."))) {
1824+
getParser().parseIdentifier(Identifier);
1825+
if (!EndDot)
1826+
Identifier.consume_front(".");
1827+
EndDot = Identifier.consume_back(".");
1828+
if (getParser().lookUpField(FieldInfo.Type.Name, Identifier,
1829+
FieldInfo)) {
1830+
SMLoc IDEnd =
1831+
SMLoc::getFromPointer(Identifier.data() + Identifier.size());
1832+
return Error(IdentLoc, "Unable to lookup field reference!",
1833+
SMRange(IdentLoc, IDEnd));
1834+
}
1835+
if (!EndDot)
1836+
EndDot = parseOptionalToken(AsmToken::Dot);
1837+
}
1838+
if (SM.onInteger(FieldInfo.Offset, ErrMsg))
1839+
return Error(IdentLoc, ErrMsg);
1840+
break;
1841+
}
17871842
}
1788-
if (getParser().parsePrimaryExpr(Val, End, &Type)) {
1843+
if (getParser().parsePrimaryExpr(Val, End, &FieldInfo.Type)) {
17891844
return Error(Tok.getLoc(), "Unexpected identifier!");
1790-
} else if (SM.onIdentifierExpr(Val, Identifier, Info, Type, false,
1791-
ErrMsg)) {
1845+
} else if (SM.onIdentifierExpr(Val, Identifier, Info, FieldInfo.Type,
1846+
false, ErrMsg)) {
17921847
return Error(IdentLoc, ErrMsg);
17931848
}
17941849
break;
@@ -2006,6 +2061,7 @@ bool X86AsmParser::ParseIntelDotOperator(IntelExprStateMachine &SM,
20062061
StringRef DotDispStr = Tok.getString();
20072062
if (DotDispStr.startswith("."))
20082063
DotDispStr = DotDispStr.drop_front(1);
2064+
StringRef TrailingDot;
20092065

20102066
// .Imm gets lexed as a real.
20112067
if (Tok.is(AsmToken::Real)) {
@@ -2014,6 +2070,10 @@ bool X86AsmParser::ParseIntelDotOperator(IntelExprStateMachine &SM,
20142070
Info.Offset = DotDisp.getZExtValue();
20152071
} else if ((isParsingMSInlineAsm() || getParser().isParsingMasm()) &&
20162072
Tok.is(AsmToken::Identifier)) {
2073+
if (DotDispStr.endswith(".")) {
2074+
TrailingDot = DotDispStr.substr(DotDispStr.size() - 1);
2075+
DotDispStr = DotDispStr.drop_back(1);
2076+
}
20172077
const std::pair<StringRef, StringRef> BaseMember = DotDispStr.split('.');
20182078
const StringRef Base = BaseMember.first, Member = BaseMember.second;
20192079
if (getParser().lookUpField(SM.getType(), DotDispStr, Info) &&
@@ -2031,6 +2091,8 @@ bool X86AsmParser::ParseIntelDotOperator(IntelExprStateMachine &SM,
20312091
const char *DotExprEndLoc = DotDispStr.data() + DotDispStr.size();
20322092
while (Tok.getLoc().getPointer() < DotExprEndLoc)
20332093
Lex();
2094+
if (!TrailingDot.empty())
2095+
getLexer().UnLex(AsmToken(AsmToken::Dot, TrailingDot));
20342096
SM.addImm(Info.Offset);
20352097
SM.setTypeInfo(Info.Type);
20362098
return false;
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# RUN: llvm-ml -filetype=asm %s | FileCheck %s
2+
3+
.data
4+
5+
FOO STRUCT
6+
a BYTE ?
7+
b BYTE ?
8+
c BYTE ?
9+
d BYTE ?
10+
FOO ENDS
11+
12+
BAR STRUCT
13+
e WORD ?
14+
f WORD ?
15+
BAR ENDS
16+
17+
var FOO <>
18+
19+
.code
20+
21+
t1:
22+
mov al, var.a
23+
mov al, var. b
24+
mov al, var .c
25+
mov al, var . d
26+
27+
; CHECK-LABEL: t1:
28+
; CHECK: mov al, byte ptr [rip + var]
29+
; CHECK: mov al, byte ptr [rip + var+1]
30+
; CHECK: mov al, byte ptr [rip + var+2]
31+
; CHECK: mov al, byte ptr [rip + var+3]
32+
33+
t2:
34+
mov eax, FOO.a
35+
mov ax, FOO. b
36+
mov al, FOO .c
37+
mov eax, FOO . d
38+
39+
; CHECK-LABEL: t2:
40+
; CHECK: mov eax, 0
41+
; CHECK: mov ax, 1
42+
; CHECK: mov al, 2
43+
; CHECK: mov eax, 3
44+
45+
t3:
46+
mov al, BYTE PTR var[FOO.c]
47+
48+
; CHECK-LABEL: t3:
49+
; CHECK: mov al, byte ptr [rip + var+2]
50+
51+
t4:
52+
mov ax, var.BAR.f
53+
mov ax, var .BAR.f
54+
mov ax, var. BAR.f
55+
mov ax, var.BAR .f
56+
mov ax, var.BAR. f
57+
mov ax, var . BAR . f
58+
59+
; CHECK-LABEL: t4:
60+
; CHECK: mov ax, word ptr [rip + var+2]
61+
; CHECK: mov ax, word ptr [rip + var+2]
62+
; CHECK: mov ax, word ptr [rip + var+2]
63+
; CHECK: mov ax, word ptr [rip + var+2]
64+
; CHECK: mov ax, word ptr [rip + var+2]
65+
; CHECK: mov ax, word ptr [rip + var+2]
66+
67+
END

llvm/test/tools/llvm-ml/struct.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ mov al, [t2.FOOBAR.e.b]
140140
; CHECK-NEXT: mov al, byte ptr [rip + t2+9]
141141
; CHECK-NEXT: mov al, byte ptr [rip + t2+9]
142142
; CHECK-NEXT: mov al, byte ptr [rip + t2+9]
143-
; CHECK-NEXT: mov al, byte ptr [rip + (t2+8)+1]
143+
; CHECK-NEXT: mov al, byte ptr [rip + t2+9]
144144
; CHECK-NEXT: mov al, byte ptr [rip + t2+9]
145145

146146
QUUX STRUCT

0 commit comments

Comments
 (0)