diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-05-06 05:51:46 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-05-06 05:51:46 +0000 |
| commit | 0603845a4964e0ea7a4ac9af904d706a984341bc (patch) | |
| tree | d1cd93561e1bbcaa7037cc5a2e8abd788d8ed537 /llvm/lib/AsmParser | |
| parent | e23c13983655baaf9074cc50bda6f2fc048abd73 (diff) | |
| download | bcm5719-llvm-0603845a4964e0ea7a4ac9af904d706a984341bc.tar.gz bcm5719-llvm-0603845a4964e0ea7a4ac9af904d706a984341bc.zip | |
Add a 'tail' marker for call instructions, patch contributed by
Alexander Friedman.
llvm-svn: 21722
Diffstat (limited to 'llvm/lib/AsmParser')
| -rw-r--r-- | llvm/lib/AsmParser/llvmAsmParser.y | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/llvm/lib/AsmParser/llvmAsmParser.y b/llvm/lib/AsmParser/llvmAsmParser.y index c6251cc983f..b6a6e96fceb 100644 --- a/llvm/lib/AsmParser/llvmAsmParser.y +++ b/llvm/lib/AsmParser/llvmAsmParser.y @@ -803,6 +803,7 @@ Module *llvm::RunVMAsmParser(const std::string &Filename, FILE *F) { %type <JumpTable> JumpTable %type <BoolVal> GlobalType // GLOBAL or CONSTANT? %type <BoolVal> OptVolatile // 'volatile' or not +%type <BoolVal> OptTailCall // TAIL CALL or plain CALL. %type <Linkage> OptLinkage %type <Endianness> BigOrLittle @@ -837,7 +838,7 @@ Module *llvm::RunVMAsmParser(const std::string &Filename, FILE *F) { %token DECLARE GLOBAL CONSTANT VOLATILE %token TO DOTDOTDOT NULL_TOK UNDEF CONST INTERNAL LINKONCE WEAK APPENDING %token OPAQUE NOT EXTERNAL TARGET TRIPLE ENDIAN POINTERSIZE LITTLE BIG -%token DEPLIBS +%token DEPLIBS CALL TAIL // Basic Block Terminating Operators %token <TermOpVal> RET BR SWITCH INVOKE UNWIND UNREACHABLE @@ -852,7 +853,8 @@ Module *llvm::RunVMAsmParser(const std::string &Filename, FILE *F) { // Other Operators %type <OtherOpVal> ShiftOps -%token <OtherOpVal> PHI_TOK CALL CAST SELECT SHL SHR VAARG VANEXT +%token <OtherOpVal> PHI_TOK CAST SELECT SHL SHR VAARG VANEXT + %start Module %% @@ -883,6 +885,9 @@ SetCondOps : SETLE | SETGE | SETLT | SETGT | SETEQ | SETNE; ShiftOps : SHL | SHR; + + + // These are some types that allow classification if we only want a particular // thing... for example, only a signed, unsigned, or integral type. SIntType : LONG | INT | SHORT | SBYTE; @@ -1858,6 +1863,15 @@ ValueRefList : ResolvedVal { // Used for call statements, and memory insts... // ValueRefListE - Just like ValueRefList, except that it may also be empty! ValueRefListE : ValueRefList | /*empty*/ { $$ = 0; }; +OptTailCall : TAIL CALL { + $$ = true; + } + | CALL { + $$ = false; + }; + + + InstVal : ArithmeticOps Types ValueRef ',' ValueRef { if (!(*$2)->isInteger() && !(*$2)->isFloatingPoint() && !isa<PackedType>((*$2).get())) @@ -1944,8 +1958,8 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef { $2->pop_front(); } delete $2; // Free the list... - } - | CALL TypesV ValueRef '(' ValueRefListE ')' { + } + | OptTailCall TypesV ValueRef '(' ValueRefListE ')' { const PointerType *PFTy; const FunctionType *Ty; @@ -1997,6 +2011,7 @@ InstVal : ArithmeticOps Types ValueRef ',' ValueRef { $$ = new CallInst(V, *$5); } + cast<CallInst>($$)->setTailCall($1); delete $2; delete $5; } @@ -2020,6 +2035,7 @@ OptVolatile : VOLATILE { }; + MemoryInst : MALLOC Types { $$ = new MallocInst(*$2); delete $2; |

