summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@apple.com>2013-04-11 23:24:15 +0000
committerChad Rosier <mcrosier@apple.com>2013-04-11 23:24:15 +0000
commitce03189b5763a32d3ec128325599c674f409affb (patch)
tree93ac538446d6f8cfbea8ddc5b4c7ecd3110c32a7 /llvm/lib/Target
parente1ad74e6fd1da695e119d1a92ae10f326e6e0968 (diff)
downloadbcm5719-llvm-ce03189b5763a32d3ec128325599c674f409affb.tar.gz
bcm5719-llvm-ce03189b5763a32d3ec128325599c674f409affb.zip
[ms-inline asm] Pass a StringRef reference to ParseIntelVarWithQualifier so we
can build up the identifier string. No test case as support for looking up these type of identifiers hasn't been implemented on the clang side. Part of rdar://13499009 llvm-svn: 179336
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp30
1 files changed, 15 insertions, 15 deletions
diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
index aaf571ae9d3..6f026cd3798 100644
--- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
+++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp
@@ -64,7 +64,7 @@ private:
X86Operand *ParseIntelBracExpression(unsigned SegReg, SMLoc SizeDirLoc,
uint64_t ImmDisp, unsigned Size);
X86Operand *ParseIntelVarWithQualifier(const MCExpr *&Disp,
- SMLoc &IdentStart);
+ StringRef &Identifier);
X86Operand *ParseMemOperand(unsigned SegReg, SMLoc StartLoc);
X86Operand *CreateMemForInlineAsm(const MCExpr *Disp, SMLoc Start, SMLoc End,
@@ -1130,11 +1130,11 @@ X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg,
SMLoc Loc = Tok.getLoc();
if (ParseRegister(TmpReg, Loc, End)) {
const MCExpr *Disp;
- SMLoc IdentStart = Tok.getLoc();
+ StringRef Identifier = Tok.getString();
if (getParser().parseExpression(Disp, End))
return 0;
- if (X86Operand *Err = ParseIntelVarWithQualifier(Disp, IdentStart))
+ if (X86Operand *Err = ParseIntelVarWithQualifier(Disp, Identifier))
return Err;
if (getLexer().isNot(AsmToken::RBrac))
@@ -1145,12 +1145,11 @@ X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg,
InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Skip, Start, 1));
InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Skip, Tok.getLoc(), 1));
}
- unsigned Len = Tok.getLoc().getPointer() - IdentStart.getPointer();
- StringRef SymName(IdentStart.getPointer(), Len);
Parser.Lex(); // Eat ']'
if (!isParsingInlineAsm())
- return X86Operand::CreateMem(Disp, Start, End, Size, SymName);
- return CreateMemForInlineAsm(Disp, Start, End, SizeDirLoc, Size, SymName);
+ return X86Operand::CreateMem(Disp, Start, End, Size);
+ return CreateMemForInlineAsm(Disp, Start, End, SizeDirLoc, Size,
+ Identifier);
}
}
@@ -1255,7 +1254,7 @@ X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg,
// Inline assembly may use variable names with namespace alias qualifiers.
X86Operand *X86AsmParser::ParseIntelVarWithQualifier(const MCExpr *&Disp,
- SMLoc &IdentStart) {
+ StringRef &Identifier) {
// We should only see Foo::Bar if we're parsing inline assembly.
if (!isParsingInlineAsm())
return 0;
@@ -1266,6 +1265,7 @@ X86Operand *X86AsmParser::ParseIntelVarWithQualifier(const MCExpr *&Disp,
bool Done = false;
const AsmToken &Tok = Parser.getTok();
+ AsmToken IdentEnd = Tok;
while (!Done) {
switch (getLexer().getKind()) {
default:
@@ -1280,12 +1280,14 @@ X86Operand *X86AsmParser::ParseIntelVarWithQualifier(const MCExpr *&Disp,
return ErrorOperand(Tok.getLoc(), "Expected an identifier token!");
break;
case AsmToken::Identifier:
+ IdentEnd = Tok;
getLexer().Lex(); // Consume the identifier.
break;
}
}
- size_t Len = Tok.getLoc().getPointer() - IdentStart.getPointer();
- StringRef Identifier(IdentStart.getPointer(), Len);
+
+ unsigned Len = IdentEnd.getLoc().getPointer() - Identifier.data();
+ Identifier = StringRef(Identifier.data(), Len + IdentEnd.getString().size());
MCSymbol *Sym = getContext().GetOrCreateSymbol(Identifier);
MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
Disp = MCSymbolRefExpr::Create(Sym, Variant, getParser().getContext());
@@ -1333,19 +1335,17 @@ X86Operand *X86AsmParser::ParseIntelMemOperand(unsigned SegReg,
}
const MCExpr *Disp = 0;
- SMLoc IdentStart = Tok.getLoc();
+ StringRef Identifier = Tok.getString();
if (getParser().parseExpression(Disp, End))
return 0;
if (!isParsingInlineAsm())
return X86Operand::CreateMem(Disp, Start, End, Size);
- if (X86Operand *Err = ParseIntelVarWithQualifier(Disp, IdentStart))
+ if (X86Operand *Err = ParseIntelVarWithQualifier(Disp, Identifier))
return Err;
- unsigned Len = Tok.getLoc().getPointer() - IdentStart.getPointer();
- StringRef SymName(IdentStart.getPointer(), Len);
- return CreateMemForInlineAsm(Disp, Start, End, Start, Size, SymName);
+ return CreateMemForInlineAsm(Disp, Start, End, Start, Size, Identifier);
}
/// Parse the '.' operator.
OpenPOWER on IntegriCloud