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; }; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits