[llvm-commits] CVS: llvm/lib/AsmParser/Lexer.l llvmAsmParser.y
Chris Lattner
lattner at cs.uiuc.edu
Mon Jan 23 15:05:27 PST 2006
Changes in directory llvm/lib/AsmParser:
Lexer.l updated: 1.68 -> 1.69
llvmAsmParser.y updated: 1.245 -> 1.246
---
Log message:
Add support for parsing global asm blocks
---
Diffs of the changes: (+22 -4)
Lexer.l | 1 +
llvmAsmParser.y | 25 +++++++++++++++++++++----
2 files changed, 22 insertions(+), 4 deletions(-)
Index: llvm/lib/AsmParser/Lexer.l
diff -u llvm/lib/AsmParser/Lexer.l:1.68 llvm/lib/AsmParser/Lexer.l:1.69
--- llvm/lib/AsmParser/Lexer.l:1.68 Tue Jan 17 14:06:24 2006
+++ llvm/lib/AsmParser/Lexer.l Mon Jan 23 17:05:15 2006
@@ -212,6 +212,7 @@
volatile { return VOLATILE; }
align { return ALIGN; }
section { return SECTION; }
+asm { return ASM_TOK; }
cc { return CC_TOK; }
ccc { return CCC_TOK; }
Index: llvm/lib/AsmParser/llvmAsmParser.y
diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.245 llvm/lib/AsmParser/llvmAsmParser.y:1.246
--- llvm/lib/AsmParser/llvmAsmParser.y:1.245 Wed Jan 18 19:21:04 2006
+++ llvm/lib/AsmParser/llvmAsmParser.y Mon Jan 23 17:05:15 2006
@@ -967,7 +967,7 @@
%token DECLARE GLOBAL CONSTANT SECTION VOLATILE
%token TO DOTDOTDOT NULL_TOK UNDEF CONST INTERNAL LINKONCE WEAK APPENDING
%token OPAQUE NOT EXTERNAL TARGET TRIPLE ENDIAN POINTERSIZE LITTLE BIG ALIGN
-%token DEPLIBS CALL TAIL
+%token DEPLIBS CALL TAIL ASM_TOK
%token CC_TOK CCC_TOK FASTCC_TOK COLDCC_TOK
%type <UIntVal> OptCallingConv
@@ -1256,11 +1256,12 @@
" when array has size " + itostr(NumElements) + "!");
std::vector<Constant*> Vals;
if (ETy == Type::SByteTy) {
- for (char *C = $3; C != EndStr; ++C)
+ for (signed char *C = (signed char *)$3; C != (signed char *)EndStr; ++C)
Vals.push_back(ConstantSInt::get(ETy, *C));
} else if (ETy == Type::UByteTy) {
- for (char *C = $3; C != EndStr; ++C)
- Vals.push_back(ConstantUInt::get(ETy, (unsigned char)*C));
+ for (unsigned char *C = (unsigned char *)$3;
+ C != (unsigned char*)EndStr; ++C)
+ Vals.push_back(ConstantUInt::get(ETy, *C));
} else {
free($3);
ThrowException("Cannot build string arrays of non byte sized elements!");
@@ -1570,6 +1571,9 @@
| FunctionList FunctionProto {
$$ = $1;
}
+ | FunctionList ASM_TOK AsmBlock {
+ $$ = $1;
+ }
| FunctionList IMPLEMENTATION {
$$ = $1;
}
@@ -1608,6 +1612,8 @@
}
| ConstPool FunctionProto { // Function prototypes can be in const pool
}
+ | ConstPool ASM_TOK AsmBlock { // Asm blocks can be in the const pool
+ }
| ConstPool OptAssign OptLinkage GlobalType ConstVal {
if ($5 == 0) ThrowException("Global value initializer is not a constant!");
CurGV = ParseGlobalVariable($2, $3, $4, $5->getType(), $5);
@@ -1629,6 +1635,17 @@
};
+AsmBlock : STRINGCONSTANT {
+ const std::string &AsmSoFar = CurModule.CurrentModule->getInlineAsm();
+ char *EndStr = UnEscapeLexed($1, true);
+ std::string NewAsm($1, EndStr);
+ free($1);
+
+ if (AsmSoFar.empty())
+ CurModule.CurrentModule->setInlineAsm(NewAsm);
+ else
+ CurModule.CurrentModule->setInlineAsm(AsmSoFar+"\n"+NewAsm);
+};
BigOrLittle : BIG { $$ = Module::BigEndian; };
BigOrLittle : LITTLE { $$ = Module::LittleEndian; };
More information about the llvm-commits
mailing list