mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29763 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===- Parser.cpp - Main dispatch module for the Parser library -------------===
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file was developed by the LLVM research group and is distributed under
 | |
| // the University of Illinois Open Source License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // This library implements the functionality defined in llvm/assembly/parser.h
 | |
| //
 | |
| //===------------------------------------------------------------------------===
 | |
| 
 | |
| #include "ParserInternals.h"
 | |
| #include "llvm/Module.h"
 | |
| using namespace llvm;
 | |
| 
 | |
| 
 | |
| ParseError* TheParseError = 0; /// FIXME: Not threading friendly
 | |
| 
 | |
| Module *llvm::ParseAssemblyFile(const std::string &Filename, ParseError* Err) {
 | |
|   FILE *F = stdin;
 | |
| 
 | |
|   if (Filename != "-") {
 | |
|     F = fopen(Filename.c_str(), "r");
 | |
| 
 | |
|     if (F == 0) {
 | |
|       if (Err)
 | |
|         Err->setError(Filename,"Could not open file '" + Filename + "'");
 | |
|       return 0;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   TheParseError = Err;
 | |
|   Module *Result = RunVMAsmParser(Filename, F);
 | |
| 
 | |
|   if (F != stdin)
 | |
|     fclose(F);
 | |
| 
 | |
|   return Result;
 | |
| }
 | |
| 
 | |
| Module *llvm::ParseAssemblyString(
 | |
|   const char * AsmString, Module * M, ParseError* Err) 
 | |
| {
 | |
|   TheParseError = Err;
 | |
|   return RunVMAsmParser(AsmString, M);
 | |
| }
 | |
| 
 | |
| 
 | |
| //===------------------------------------------------------------------------===
 | |
| //                              ParseError Class
 | |
| //===------------------------------------------------------------------------===
 | |
| 
 | |
| 
 | |
| void ParseError::setError(const std::string &filename,
 | |
|                          const std::string &message,
 | |
|                          int lineNo, int colNo)
 | |
| {
 | |
|   Filename = filename;
 | |
|   Message = message;
 | |
|   LineNo = lineNo;
 | |
|   colNo = colNo;
 | |
| }
 | |
| 
 | |
| ParseError::ParseError(const ParseError &E)
 | |
|   : Filename(E.Filename), Message(E.Message) {
 | |
|   LineNo = E.LineNo;
 | |
|   ColumnNo = E.ColumnNo;
 | |
| }
 | |
| 
 | |
| // Includes info from options
 | |
| const std::string ParseError::getMessage() const {
 | |
|   std::string Result;
 | |
|   char Buffer[10];
 | |
| 
 | |
|   if (Filename == "-")
 | |
|     Result += "<stdin>";
 | |
|   else
 | |
|     Result += Filename;
 | |
| 
 | |
|   if (LineNo != -1) {
 | |
|     sprintf(Buffer, "%d", LineNo);
 | |
|     Result += std::string(":") + Buffer;
 | |
|     if (ColumnNo != -1) {
 | |
|       sprintf(Buffer, "%d", ColumnNo);
 | |
|       Result += std::string(",") + Buffer;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return Result + ": " + Message;
 | |
| }
 |