aboutsummaryrefslogtreecommitdiffstats
path: root/lib/MC
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@apple.com>2012-10-18 19:39:30 +0000
committerChad Rosier <mcrosier@apple.com>2012-10-18 19:39:30 +0000
commitc8dd27e58301af85979facf291b817802d3523e5 (patch)
tree0ae25382986499d48b67f03841cd1c4526e420ba /lib/MC
parent8c1dcdf26dc7d597308698b5ae08680cebcd9d3f (diff)
downloadexternal_llvm-c8dd27e58301af85979facf291b817802d3523e5.zip
external_llvm-c8dd27e58301af85979facf291b817802d3523e5.tar.gz
external_llvm-c8dd27e58301af85979facf291b817802d3523e5.tar.bz2
[ms-inline asm] Have the LookupInlineAsmIdentifier() callback function return a
*NamedDecl. In turn, build the expressions after we're finished parsing the asm. This avoids a crasher if the lookup fails. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166212 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC')
-rw-r--r--lib/MC/MCParser/AsmParser.cpp37
1 files changed, 13 insertions, 24 deletions
diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp
index 78a877b..0e8fe6d 100644
--- a/lib/MC/MCParser/AsmParser.cpp
+++ b/lib/MC/MCParser/AsmParser.cpp
@@ -190,9 +190,8 @@ public:
bool ParseMSInlineAsm(void *AsmLoc, std::string &AsmString,
unsigned &NumOutputs, unsigned &NumInputs,
- SmallVectorImpl<void *> &Names,
+ SmallVectorImpl<void *> &OpDecls,
SmallVectorImpl<std::string> &Constraints,
- SmallVectorImpl<void *> &Exprs,
SmallVectorImpl<std::string> &Clobbers,
const MCInstrInfo *MII,
const MCInstPrinter *IP,
@@ -3592,19 +3591,16 @@ public:
bool AsmParser::ParseMSInlineAsm(void *AsmLoc, std::string &AsmString,
unsigned &NumOutputs, unsigned &NumInputs,
- SmallVectorImpl<void *> &Names,
+ SmallVectorImpl<void *> &OpDecls,
SmallVectorImpl<std::string> &Constraints,
- SmallVectorImpl<void *> &Exprs,
SmallVectorImpl<std::string> &Clobbers,
const MCInstrInfo *MII,
const MCInstPrinter *IP,
MCAsmParserSemaCallback &SI) {
- SmallVector<void*, 4> Inputs;
- SmallVector<void*, 4> Outputs;
+ SmallVector<void*, 4> InputDecls;
+ SmallVector<void*, 4> OutputDecls;
SmallVector<std::string, 4> InputConstraints;
SmallVector<std::string, 4> OutputConstraints;
- SmallVector<void*, 4> InputExprs;
- SmallVector<void*, 4> OutputExprs;
std::set<std::string> ClobberRegs;
SmallVector<struct AsmOpRewrite, 4> AsmStrRewrites;
@@ -3647,24 +3643,20 @@ bool AsmParser::ParseMSInlineAsm(void *AsmLoc, std::string &AsmString,
}
// Expr/Input or Output.
- void *II;
- void *ExprResult = SI.LookupInlineAsmIdentifier(Operand->getName(),
- AsmLoc, &II);
- if (ExprResult) {
+ void *OpDecl = SI.LookupInlineAsmIdentifier(Operand->getName(), AsmLoc);
+ if (OpDecl) {
bool isOutput = (i == 1) && Desc.mayStore();
if (isOutput) {
std::string Constraint = "=";
++InputIdx;
- Outputs.push_back(II);
- OutputExprs.push_back(ExprResult);
+ OutputDecls.push_back(OpDecl);
Constraint += Operand->getConstraint().str();
OutputConstraints.push_back(Constraint);
AsmStrRewrites.push_back(AsmOpRewrite(AOK_Output,
Operand->getStartLoc(),
Operand->getNameLen()));
} else {
- Inputs.push_back(II);
- InputExprs.push_back(ExprResult);
+ InputDecls.push_back(OpDecl);
InputConstraints.push_back(Operand->getConstraint().str());
AsmStrRewrites.push_back(AsmOpRewrite(AOK_Input,
Operand->getStartLoc(),
@@ -3680,8 +3672,8 @@ bool AsmParser::ParseMSInlineAsm(void *AsmLoc, std::string &AsmString,
}
// Set the number of Outputs and Inputs.
- NumOutputs = Outputs.size();
- NumInputs = Inputs.size();
+ NumOutputs = OutputDecls.size();
+ NumInputs = InputDecls.size();
// Set the unique clobbers.
for (std::set<std::string>::iterator I = ClobberRegs.begin(),
@@ -3691,18 +3683,15 @@ bool AsmParser::ParseMSInlineAsm(void *AsmLoc, std::string &AsmString,
// Merge the various outputs and inputs. Output are expected first.
if (NumOutputs || NumInputs) {
unsigned NumExprs = NumOutputs + NumInputs;
- Names.resize(NumExprs);
+ OpDecls.resize(NumExprs);
Constraints.resize(NumExprs);
- Exprs.resize(NumExprs);
for (unsigned i = 0; i < NumOutputs; ++i) {
- Names[i] = Outputs[i];
+ OpDecls[i] = OutputDecls[i];
Constraints[i] = OutputConstraints[i];
- Exprs[i] = OutputExprs[i];
}
for (unsigned i = 0, j = NumOutputs; i < NumInputs; ++i, ++j) {
- Names[j] = Inputs[i];
+ OpDecls[j] = InputDecls[i];
Constraints[j] = InputConstraints[i];
- Exprs[j] = InputExprs[i];
}
}