mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 20:29:53 +00:00
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
This commit is contained in:
parent
ba705f62b1
commit
6ac28095c2
@ -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())
|
||||
|
16
test/Assembler/numbered-values.ll
Normal file
16
test/Assembler/numbered-values.ll
Normal file
@ -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
|
||||
}
|
Loading…
Reference in New Issue
Block a user