For PR797:
Rid the Assembly Parser of exceptions. This is a really gross hack but it
will do until the Assembly Parser is re-written as a recursive descent.
The basic premise is that wherever the old "ThrowException" function was
called (new name: GenerateError) we set a flag (TriggerError). Every
production checks that flag and calls YYERROR if it is set. Additionally,
each call to ThrowException in the grammar is replaced with GEN_ERROR
which calls GenerateError and then YYERROR immediately. This prevents
the remaining production from continuing after an error condition.
llvm-svn: 29763
diff --git a/llvm/lib/AsmParser/ParserInternals.h b/llvm/lib/AsmParser/ParserInternals.h
index 820e5ba..633ffc1 100644
--- a/llvm/lib/AsmParser/ParserInternals.h
+++ b/llvm/lib/AsmParser/ParserInternals.h
@@ -25,7 +25,8 @@
// Global variables exported from the lexer...
-extern int llvmAsmlineno;
+extern int llvmAsmlineno; /// FIXME: Not threading friendly
+extern llvm::ParseError* TheParseError; /// FIXME: Not threading friendly
extern std::string &llvmAsmTextin;
@@ -40,7 +41,7 @@
namespace llvm {
// Globals exported by the parser...
-extern std::string CurFilename;
+extern std::string CurFilename; /// FIXME: Not threading friendly
class Module;
Module *RunVMAsmParser(const std::string &Filename, FILE *F);
@@ -51,7 +52,7 @@
// UnEscapeLexed - Run through the specified buffer and change \xx codes to the
// appropriate character. If AllowNull is set to false, a \00 value will cause
-// an exception to be thrown.
+// an error.
//
// If AllowNull is set to true, the return value of the function points to the
// last character of the string in memory.
@@ -65,12 +66,7 @@
// This also helps me because I keep typing 'throw new ParseException' instead
// of just 'throw ParseException'... sigh...
//
-static inline void ThrowException(const std::string &message,
- int LineNo = -1) {
- if (LineNo == -1) LineNo = llvmAsmlineno;
- // TODO: column number in exception
- throw ParseException(CurFilename, message, LineNo);
-}
+extern void GenerateError(const std::string &message, int LineNo = -1);
/// InlineAsmDescriptor - This is a simple class that holds info about inline
/// asm blocks, for use by ValID.