diff options
author | Chad Rosier <mcrosier@apple.com> | 2012-10-18 19:39:30 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2012-10-18 19:39:30 +0000 |
commit | c8dd27e58301af85979facf291b817802d3523e5 (patch) | |
tree | 0ae25382986499d48b67f03841cd1c4526e420ba | |
parent | 8c1dcdf26dc7d597308698b5ae08680cebcd9d3f (diff) | |
download | llvm-c8dd27e58301af85979facf291b817802d3523e5.tar.gz llvm-c8dd27e58301af85979facf291b817802d3523e5.tar.bz2 llvm-c8dd27e58301af85979facf291b817802d3523e5.tar.xz |
[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
-rw-r--r-- | include/llvm/MC/MCParser/MCAsmParser.h | 6 | ||||
-rw-r--r-- | lib/MC/MCParser/AsmParser.cpp | 37 |
2 files changed, 15 insertions, 28 deletions
diff --git a/include/llvm/MC/MCParser/MCAsmParser.h b/include/llvm/MC/MCParser/MCAsmParser.h index ea20c15fe1..bb71a4633d 100644 --- a/include/llvm/MC/MCParser/MCAsmParser.h +++ b/include/llvm/MC/MCParser/MCAsmParser.h @@ -34,8 +34,7 @@ class Twine; /// MCAsmParserSemaCallback - Generic Sema callback for assembly parser. class MCAsmParserSemaCallback { public: - virtual void *LookupInlineAsmIdentifier(StringRef Name, void *Loc, - void **IdentifierInfoPtr) = 0; + virtual void *LookupInlineAsmIdentifier(StringRef Name, void *Loc) = 0; }; /// MCAsmParser - Generic assembler parser interface, for use by target specific @@ -89,9 +88,8 @@ public: /// ParseMSInlineAsm - Parse ms-style inline assembly. virtual 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, diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index 78a877baa0..0e8fe6d5e9 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]; } } |