aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/AsmParser/Lexer.l7
-rw-r--r--lib/AsmParser/Parser.cpp4
-rw-r--r--lib/AsmParser/ParserInternals.h12
-rw-r--r--lib/AsmParser/llvmAsmParser.y39
4 files changed, 49 insertions, 13 deletions
diff --git a/lib/AsmParser/Lexer.l b/lib/AsmParser/Lexer.l
index 12a430af36..062e00c419 100644
--- a/lib/AsmParser/Lexer.l
+++ b/lib/AsmParser/Lexer.l
@@ -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
diff --git a/lib/AsmParser/Parser.cpp b/lib/AsmParser/Parser.cpp
index 0111ea35df..7bb4f0a362 100644
--- a/lib/AsmParser/Parser.cpp
+++ b/lib/AsmParser/Parser.cpp
@@ -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
diff --git a/lib/AsmParser/ParserInternals.h b/lib/AsmParser/ParserInternals.h
index 20961357c8..b21dea7a07 100644
--- a/lib/AsmParser/ParserInternals.h
+++ b/lib/AsmParser/ParserInternals.h
@@ -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
diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y
index c459a0eec0..d73b008416 100644
--- a/lib/AsmParser/llvmAsmParser.y
+++ b/lib/AsmParser/llvmAsmParser.y
@@ -719,26 +719,41 @@ static PATypeHolder HandleUpRefs(const Type *ty) {
}
-//===----------------------------------------------------------------------===//
-// RunVMAsmParser - Define an interface to this parser
-//===----------------------------------------------------------------------===//
-//
-Module *llvm::RunVMAsmParser(const std::string &Filename, FILE *F) {
- llvmAsmin = F;
- CurFilename = Filename;
- llvmAsmlineno = 1; // Reset the current line number...
+// common code from the two 'RunVMAsmParser' functions
+ static Module * RunParser(Module * M) {
- // Allocate a new module to read
- CurModule.CurrentModule = new Module(Filename);
+ llvmAsmlineno = 1; // Reset the current line number...
+ CurModule.CurrentModule = M;
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;
+
+ }
+
+//===----------------------------------------------------------------------===//
+// RunVMAsmParser - Define an interface to this parser
+//===----------------------------------------------------------------------===//
+//
+Module *llvm::RunVMAsmParser(const std::string &Filename, FILE *F) {
+ set_scan_file(F);
+
+ CurFilename = Filename;
+ return RunParser(new Module(CurFilename));
+}
+
+Module *llvm::RunVMAsmParser(const char * AsmString, Module * M) {
+ set_scan_string(AsmString);
+
+ CurFilename = "from_memory";
+ if (M == NULL) {
+ return RunParser(new Module (CurFilename));
+ } else {
+ return RunParser(M);
+ }
}
%}