aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2010-05-04 00:33:07 +0000
committerDaniel Dunbar <daniel@zuster.org>2010-05-04 00:33:07 +0000
commit31e8e1d08566c9b169df003d499a7e22856e5408 (patch)
tree1c9fe4a1ec915c17ba506a593fb45b718738eb51
parentba609c88a5a0eb717772c89bda89157c85fdf95e (diff)
downloadexternal_llvm-31e8e1d08566c9b169df003d499a7e22856e5408.zip
external_llvm-31e8e1d08566c9b169df003d499a7e22856e5408.tar.gz
external_llvm-31e8e1d08566c9b169df003d499a7e22856e5408.tar.bz2
llvm-mc: Fix case were we would skip a line in the .s file after an instruction
match failure. Also, fixes a few memory leak FIXMEs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@102986 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/MC/MCAssembler.cpp4
-rw-r--r--lib/MC/MCParser/AsmParser.cpp51
2 files changed, 28 insertions, 27 deletions
diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp
index 252e9ca..69afcc8 100644
--- a/lib/MC/MCAssembler.cpp
+++ b/lib/MC/MCAssembler.cpp
@@ -212,7 +212,7 @@ static bool isScatteredFixupFullyResolvedSimple(const MCAssembler &Asm,
// resolved. This also works in conjunction with absolutized .set, which
// requires the compiler to use .set to absolutize the differences between
// symbols which the compiler knows to be assembly time constants, so we don't
- // need to worry about consider symbol differences fully resolved.
+ // need to worry about considering symbol differences fully resolved.
// Non-relative fixups are only resolved if constant.
if (!BaseSection)
@@ -715,6 +715,8 @@ bool MCAssembler::FixupNeedsRelaxation(const MCAsmFixup &Fixup,
return true;
// Otherwise, relax if the value is too big for a (signed) i8.
+ //
+ // FIXME: This is target dependent!
return int64_t(Value) != int64_t(int8_t(Value));
}
diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp
index 0c6af4d..a63d2e4 100644
--- a/lib/MC/MCParser/AsmParser.cpp
+++ b/lib/MC/MCParser/AsmParser.cpp
@@ -729,39 +729,38 @@ bool AsmParser::ParseStatement() {
return false;
}
-
SmallVector<MCParsedAsmOperand*, 8> ParsedOperands;
- if (getTargetParser().ParseInstruction(IDVal, IDLoc, ParsedOperands))
- // FIXME: Leaking ParsedOperands on failure.
- return true;
-
- if (Lexer.isNot(AsmToken::EndOfStatement))
- // FIXME: Leaking ParsedOperands on failure.
- return TokError("unexpected token in argument list");
-
- // Eat the end of statement marker.
- Lex();
-
-
- MCInst Inst;
+ bool HadError = getTargetParser().ParseInstruction(IDVal, IDLoc,
+ ParsedOperands);
+ if (!HadError && Lexer.isNot(AsmToken::EndOfStatement))
+ HadError = TokError("unexpected token in argument list");
+
+ // If parsing succeeded, match the instruction.
+ if (!HadError) {
+ MCInst Inst;
+ if (!getTargetParser().MatchInstruction(ParsedOperands, Inst)) {
+ // Emit the instruction on success.
+ Out.EmitInstruction(Inst);
+ } else {
+ // Otherwise emit a diagnostic about the match failure and set the error
+ // flag.
+ //
+ // FIXME: We should give nicer diagnostics about the exact failure.
+ Error(IDLoc, "unrecognized instruction");
+ HadError = true;
+ }
+ }
- bool MatchFail = getTargetParser().MatchInstruction(ParsedOperands, Inst);
+ // If there was no error, consume the end-of-statement token. Otherwise this
+ // will be done by our caller.
+ if (!HadError)
+ Lex();
// Free any parsed operands.
for (unsigned i = 0, e = ParsedOperands.size(); i != e; ++i)
delete ParsedOperands[i];
- if (MatchFail) {
- // FIXME: We should give nicer diagnostics about the exact failure.
- Error(IDLoc, "unrecognized instruction");
- return true;
- }
-
- // Instruction is good, process it.
- Out.EmitInstruction(Inst);
-
- // Skip to end of line for now.
- return false;
+ return HadError;
}
bool AsmParser::ParseAssignment(const StringRef &Name) {