Add support for parsing .ll files that have numbers in front of
authorChris Lattner <sabre@nondot.org>
Fri, 29 Aug 2008 17:12:13 +0000 (17:12 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 29 Aug 2008 17:12:13 +0000 (17:12 +0000)
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

lib/AsmParser/llvmAsmParser.y
test/Assembler/numbered-values.ll [new file with mode: 0644]

index d9b8499442217247bf1f8f9cfed474b11c505289..36b56eabc74648786dd347d531dba54f1d554ee8 100644 (file)
@@ -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 <UIntVal> OptCallingConv
+%type <UIntVal> OptCallingConv LocalNumber
 %type <ParamAttrs> OptParamAttrs ParamAttr 
 %type <ParamAttrs> 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<CastInst>($2))
       if (CastInst *CI2 = dyn_cast<CastInst>(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 (file)
index 0000000..2439c83
--- /dev/null
@@ -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            ; <i32*> [#uses=2]
+       %retval = alloca i32            ; <i32*> [#uses=2]
+       %0 = alloca i32         ; <i32*>:0 [#uses=2]
+       %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
+       store i32 %X, i32* %X_addr
+       %1 = load i32* %X_addr, align 4         ; <i32>:1 [#uses=1]
+       mul i32 %1, 4           ; <i32>:2 [#uses=1]
+       %3 = add i32 %2, 123            ; <i32>:3 [#uses=1]
+       store i32 %3, i32* %0, align 4
+       ret i32 %3
+}