From: Chris Lattner Date: Fri, 29 Aug 2008 17:12:13 +0000 (+0000) Subject: Add support for parsing .ll files that have numbers in front of X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=6ac28095c27d887fe1f8191883baf67ab99432fe;p=oota-llvm.git Add support for parsing .ll files that have numbers in front of nameless values, such as: %3 = add i32 4, 2 This fixes the first half of PR2480 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55539 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AsmParser/llvmAsmParser.y b/lib/AsmParser/llvmAsmParser.y index d9b84994422..36b56eabc74 100644 --- a/lib/AsmParser/llvmAsmParser.y +++ b/lib/AsmParser/llvmAsmParser.y @@ -249,10 +249,12 @@ static bool inFunctionScope() { return CurFun.CurrentFunction != 0; } // Code to handle definitions of all the types //===----------------------------------------------------------------------===// -static void InsertValue(Value *V, ValueList &ValueTab = CurFun.Values) { +/// InsertValue - Insert a value into the value table. If it is named, this +/// returns -1, otherwise it returns the slot number for the value. +static int InsertValue(Value *V, ValueList &ValueTab = CurFun.Values) { // Things that have names or are void typed don't get slot numbers if (V->hasName() || (V->getType() == Type::VoidTy)) - return; + return -1; // In the case of function values, we have to allow for the forward reference // of basic blocks, which are included in the numbering. Consequently, we keep @@ -262,10 +264,11 @@ static void InsertValue(Value *V, ValueList &ValueTab = CurFun.Values) { if (ValueTab.size() <= CurFun.NextValNum) ValueTab.resize(CurFun.NextValNum+1); ValueTab[CurFun.NextValNum++] = V; - return; + return CurFun.NextValNum-1; } // For all other lists, its okay to just tack it on the back of the vector. ValueTab.push_back(V); + return ValueTab.size()-1; } static const Type *getTypeVal(const ValID &D, bool DoNotImprovise = false) { @@ -1084,7 +1087,7 @@ Module *llvm::RunVMAsmParser(llvm::MemoryBuffer *MB) { %token CC_TOK CCC_TOK FASTCC_TOK COLDCC_TOK X86_STDCALLCC_TOK X86_FASTCALLCC_TOK %token X86_SSECALLCC_TOK %token DATALAYOUT -%type OptCallingConv +%type OptCallingConv LocalNumber %type OptParamAttrs ParamAttr %type OptFuncAttrs FuncAttr @@ -1177,6 +1180,12 @@ OptLocalAssign : LocalName '=' { CHECK_FOR_ERROR }; +LocalNumber : LOCALVAL_ID '=' { + $$ = $1; + CHECK_FOR_ERROR +}; + + GlobalName : GLOBALVAR | ATSTRINGCONSTANT ; OptGlobalAssign : GlobalAssign @@ -2673,7 +2682,7 @@ BasicBlockList : BasicBlockList BasicBlock { // Basic blocks are terminated by branching instructions: // br, br/cc, switch, ret // -BasicBlock : InstructionList OptLocalAssign BBTerminatorInst { +BasicBlock : InstructionList OptLocalAssign BBTerminatorInst { setValueName($3, $2); CHECK_FOR_ERROR InsertValue($3); @@ -2682,6 +2691,19 @@ BasicBlock : InstructionList OptLocalAssign BBTerminatorInst { CHECK_FOR_ERROR }; +BasicBlock : InstructionList LocalNumber BBTerminatorInst { + CHECK_FOR_ERROR + int ValNum = InsertValue($3); + if (ValNum != (int)$2) + GEN_ERROR("Result value number %" + utostr($2) + + " is incorrect, expected %" + utostr((unsigned)ValNum)); + + $1->getInstList().push_back($3); + $$ = $1; + CHECK_FOR_ERROR +}; + + InstructionList : InstructionList Inst { if (CastInst *CI1 = dyn_cast($2)) if (CastInst *CI2 = dyn_cast(CI1->getOperand(0))) @@ -2901,6 +2923,18 @@ Inst : OptLocalAssign InstVal { CHECK_FOR_ERROR }; +Inst : LocalNumber InstVal { + CHECK_FOR_ERROR + int ValNum = InsertValue($2); + + if (ValNum != (int)$1) + GEN_ERROR("Result value number %" + utostr($1) + + " is incorrect, expected %" + utostr((unsigned)ValNum)); + + $$ = $2; + CHECK_FOR_ERROR + }; + PHIList : Types '[' ValueRef ',' ValueRef ']' { // Used for PHI nodes if (!UpRefs.empty()) diff --git a/test/Assembler/numbered-values.ll b/test/Assembler/numbered-values.ll new file mode 100644 index 00000000000..2439c831a70 --- /dev/null +++ b/test/Assembler/numbered-values.ll @@ -0,0 +1,16 @@ +; RUN: llvm-as < %s | llvm-dis | llvm-as | llvm-dis +; PR2480 + +define i32 @test(i32 %X) nounwind { +entry: + %X_addr = alloca i32 ; [#uses=2] + %retval = alloca i32 ; [#uses=2] + %0 = alloca i32 ; :0 [#uses=2] + %"alloca point" = bitcast i32 0 to i32 ; [#uses=0] + store i32 %X, i32* %X_addr + %1 = load i32* %X_addr, align 4 ; :1 [#uses=1] + mul i32 %1, 4 ; :2 [#uses=1] + %3 = add i32 %2, 123 ; :3 [#uses=1] + store i32 %3, i32* %0, align 4 + ret i32 %3 +}