summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-04-22 19:07:06 +0000
committerChris Lattner <sabre@nondot.org>2003-04-22 19:07:06 +0000
commit20126130406ce67eb2195fe2fdbc1c2e5661e573 (patch)
tree122475c58199dc8a2c514068e68d95c491cf044b /llvm
parentf234e9975af694c81c5bd884353d4e1169a65faf (diff)
downloadbcm5719-llvm-20126130406ce67eb2195fe2fdbc1c2e5661e573.tar.gz
bcm5719-llvm-20126130406ce67eb2195fe2fdbc1c2e5661e573.zip
Allow information about the target to be specified in the .ll file
llvm-svn: 5843
Diffstat (limited to 'llvm')
-rw-r--r--llvm/lib/AsmParser/Lexer.l6
-rw-r--r--llvm/lib/AsmParser/llvmAsmParser.y23
2 files changed, 28 insertions, 1 deletions
diff --git a/llvm/lib/AsmParser/Lexer.l b/llvm/lib/AsmParser/Lexer.l
index 47c067ba8ce..92d4f3424f8 100644
--- a/llvm/lib/AsmParser/Lexer.l
+++ b/llvm/lib/AsmParser/Lexer.l
@@ -19,6 +19,7 @@
%{
#include "ParserInternals.h"
+#include "llvm/Module.h"
#include <list>
#include "llvmAsmParser.h"
#include <ctype.h>
@@ -176,6 +177,11 @@ null { return NULL_TOK; }
to { return TO; }
except { return EXCEPT; }
not { return NOT; } /* Deprecated, turned into XOR */
+target { return TARGET; }
+endian { return ENDIAN; }
+pointersize { return POINTERSIZE; }
+little { return LITTLE; }
+big { return BIG; }
void { llvmAsmlval.PrimType = Type::VoidTy ; return VOID; }
bool { llvmAsmlval.PrimType = Type::BoolTy ; return BOOL; }
diff --git a/llvm/lib/AsmParser/llvmAsmParser.y b/llvm/lib/AsmParser/llvmAsmParser.y
index 8309c91d5ed..19cda682a16 100644
--- a/llvm/lib/AsmParser/llvmAsmParser.y
+++ b/llvm/lib/AsmParser/llvmAsmParser.y
@@ -635,6 +635,7 @@ Module *RunVMAsmParser(const std::string &Filename, FILE *F) {
Instruction::TermOps TermOpVal;
Instruction::MemoryOps MemOpVal;
Instruction::OtherOps OtherOpVal;
+ Module::Endianness Endianness;
}
%type <ModuleVal> Module FunctionList
@@ -653,6 +654,7 @@ Module *RunVMAsmParser(const std::string &Filename, FILE *F) {
%type <JumpTable> JumpTable
%type <BoolVal> GlobalType // GLOBAL or CONSTANT?
%type <Linkage> OptLinkage
+%type <Endianness> BigOrLittle
// ValueRef - Unresolved reference to a definition or BB
%type <ValIDVal> ValueRef ConstValueRef SymbolicValueRef
@@ -683,7 +685,7 @@ Module *RunVMAsmParser(const std::string &Filename, FILE *F) {
%token IMPLEMENTATION TRUE FALSE BEGINTOK ENDTOK DECLARE GLOBAL CONSTANT
%token TO EXCEPT DOTDOTDOT NULL_TOK CONST INTERNAL LINKONCE APPENDING
-%token OPAQUE NOT EXTERNAL
+%token OPAQUE NOT EXTERNAL TARGET ENDIAN POINTERSIZE LITTLE BIG
// Basic Block Terminating Operators
%token <TermOpVal> RET BR SWITCH
@@ -1177,10 +1179,29 @@ ConstPool : ConstPool OptAssign CONST ConstVal {
}
delete $5;
}
+ | ConstPool TARGET TargetDefinition {
+ }
| /* empty: end of list */ {
};
+
+BigOrLittle : BIG { $$ = Module::BigEndian; };
+BigOrLittle : LITTLE { $$ = Module::LittleEndian; };
+
+TargetDefinition : ENDIAN '=' BigOrLittle {
+ CurModule.CurrentModule->setEndianness($3);
+ }
+ | POINTERSIZE '=' EUINT64VAL {
+ if ($3 == 32)
+ CurModule.CurrentModule->setPointerSize(Module::Pointer32);
+ else if ($3 == 64)
+ CurModule.CurrentModule->setPointerSize(Module::Pointer64);
+ else
+ ThrowException("Invalid pointer size: '" + utostr($3) + "'!");
+ };
+
+
//===----------------------------------------------------------------------===//
// Rules to match Function Headers
//===----------------------------------------------------------------------===//
OpenPOWER on IntegriCloud