mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
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 llvm-svn: 315791
This commit is contained in:
parent
2aa97100da
commit
db879213ed
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
25
test/Assembler/alloca-addrspace-elems.ll
Normal file
25
test/Assembler/alloca-addrspace-elems.ll
Normal 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 = !{}
|
Loading…
Reference in New Issue
Block a user