Give the asmparser the ability to parse strings. Patch contributed by

Alexander Friedman


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22146 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2005-05-20 03:25:47 +00:00
parent 98c162a086
commit 6184febcda
4 changed files with 49 additions and 13 deletions

View File

@ -32,6 +32,13 @@
#include <cctype>
#include <cstdlib>
void set_scan_file(FILE * F){
yy_switch_to_buffer(yy_create_buffer( F, YY_BUF_SIZE ) );
}
void set_scan_string (const char * str) {
yy_scan_string (str);
}
#define RET_TOK(type, Enum, sym) \
llvmAsmlval.type = Instruction::Enum; return sym

View File

@ -42,6 +42,10 @@ Module *llvm::ParseAssemblyFile(const std::string &Filename) {
return Result;
}
Module *llvm::ParseAssemblyString(const char * AsmString, Module * M) {
return RunVMAsmParser(AsmString, M);
}
//===------------------------------------------------------------------------===
// ParseException Class

View File

@ -22,10 +22,17 @@
#include "llvm/Assembly/Parser.h"
#include "llvm/ADT/StringExtras.h"
// Global variables exported from the lexer...
extern std::FILE *llvmAsmin;
extern int llvmAsmlineno;
extern std::string &llvmAsmTextin;
// functions exported from the lexer
void set_scan_file(FILE * F);
void set_scan_string (const char * str);
// Globals exported by the parser...
extern char* llvmAsmtext;
extern int llvmAsmleng;
@ -38,6 +45,9 @@ extern std::string CurFilename;
class Module;
Module *RunVMAsmParser(const std::string &Filename, FILE *F);
// Parse a string directly
Module *RunVMAsmParser(const char * AsmString, Module * M);
// 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

View File

@ -719,26 +719,41 @@ static PATypeHolder HandleUpRefs(const Type *ty) {
}
// common code from the two 'RunVMAsmParser' functions
static Module * RunParser(Module * M) {
llvmAsmlineno = 1; // Reset the current line number...
CurModule.CurrentModule = M;
yyparse(); // Parse the file, potentially throwing exception
Module *Result = ParserResult;
ParserResult = 0;
return Result;
}
//===----------------------------------------------------------------------===//
// RunVMAsmParser - Define an interface to this parser
//===----------------------------------------------------------------------===//
//
Module *llvm::RunVMAsmParser(const std::string &Filename, FILE *F) {
llvmAsmin = F;
set_scan_file(F);
CurFilename = Filename;
llvmAsmlineno = 1; // Reset the current line number...
return RunParser(new Module(CurFilename));
}
// Allocate a new module to read
CurModule.CurrentModule = new Module(Filename);
Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) {
set_scan_string(AsmString);
yyparse(); // Parse the file, potentially throwing exception
Module *Result = ParserResult;
llvmAsmin = stdin; // F is about to go away, don't use it anymore...
ParserResult = 0;
return Result;
CurFilename = "from_memory";
if (M == NULL) {
return RunParser(new Module (CurFilename));
} else {
return RunParser(M);
}
}
%}