Fix assembler for alloca of multiple elements in non-zero addr space

Currently llvm assembler emits parsing error for valid IR assembly

alloca i32, i32 9, addrspace(5)
when alloca addr space is 5.

This patch fixes that.

Differential Revision: https://reviews.llvm.org/D38713


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315791 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Yaxun Liu 2017-10-14 03:23:18 +00:00
parent a1b8a23583
commit 7581146f57
2 changed files with 41 additions and 5 deletions

View File

@ -6074,7 +6074,7 @@ bool LLParser::ParseCall(Instruction *&Inst, PerFunctionState &PFS,
/// ParseAlloc
/// ::= 'alloca' 'inalloca'? 'swifterror'? Type (',' TypeAndValue)?
/// (',' 'align' i32)?
/// (',' 'align' i32)? (',', 'addrspace(n))?
int LLParser::ParseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
Value *Size = nullptr;
LocTy SizeLoc, TyLoc, ASLoc;
@ -6104,11 +6104,22 @@ int LLParser::ParseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
} else if (Lex.getKind() == lltok::MetadataVar) {
AteExtraComma = true;
} else {
if (ParseTypeAndValue(Size, SizeLoc, PFS) ||
ParseOptionalCommaAlign(Alignment, AteExtraComma) ||
(!AteExtraComma &&
ParseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma)))
if (ParseTypeAndValue(Size, SizeLoc, PFS))
return true;
if (EatIfPresent(lltok::comma)) {
if (Lex.getKind() == lltok::kw_align) {
if (ParseOptionalAlignment(Alignment))
return true;
if (ParseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma))
return true;
} else if (Lex.getKind() == lltok::kw_addrspace) {
ASLoc = Lex.getLoc();
if (ParseOptionalAddrSpace(AddrSpace))
return true;
} else if (Lex.getKind() == lltok::MetadataVar) {
AteExtraComma = true;
}
}
}
}

View File

@ -0,0 +1,25 @@
; RUN: llvm-as < %s | llvm-dis | FileCheck %s
target datalayout = "A5"
; CHECK: target datalayout = "A5"
; CHECK: %alloca_array_no_align = alloca i32, i32 9, addrspace(5)
; CHECK-NEXT: %alloca_array_align4 = alloca i32, i32 9, align 4, addrspace(5)
; CHECK-NEXT: %alloca_array_no_align_metadata = alloca i32, i32 9, addrspace(5), !foo !0
; CHECK-NEXT: %alloca_array_align4_metadata = alloca i32, i32 9, align 4, addrspace(5), !foo !0
; CHECK-NEXT: %alloca_inalloca_array_no_align = alloca inalloca i32, i32 9, addrspace(5)
; CHECK-NEXT: %alloca_inalloca_array_align4_metadata = alloca inalloca i32, i32 9, align 4, addrspace(5), !foo !0
define void @use_alloca() {
%alloca_array_no_align = alloca i32, i32 9, addrspace(5)
%alloca_array_align4 = alloca i32, i32 9, align 4, addrspace(5)
%alloca_array_no_align_metadata = alloca i32, i32 9, addrspace(5), !foo !0
%alloca_array_align4_metadata = alloca i32, i32 9, align 4, addrspace(5), !foo !0
%alloca_inalloca_array_no_align = alloca inalloca i32, i32 9, addrspace(5)
%alloca_inalloca_array_align4_metadata = alloca inalloca i32, i32 9, align 4, addrspace(5), !foo !0
ret void
}
!0 = !{}