mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-13 14:47:00 +00: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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315791 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a1b8a23583
commit
7581146f57
@ -6074,7 +6074,7 @@ bool LLParser::ParseCall(Instruction *&Inst, PerFunctionState &PFS,
|
|||||||
|
|
||||||
/// ParseAlloc
|
/// ParseAlloc
|
||||||
/// ::= 'alloca' 'inalloca'? 'swifterror'? Type (',' TypeAndValue)?
|
/// ::= 'alloca' 'inalloca'? 'swifterror'? Type (',' TypeAndValue)?
|
||||||
/// (',' 'align' i32)?
|
/// (',' 'align' i32)? (',', 'addrspace(n))?
|
||||||
int LLParser::ParseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
|
int LLParser::ParseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
|
||||||
Value *Size = nullptr;
|
Value *Size = nullptr;
|
||||||
LocTy SizeLoc, TyLoc, ASLoc;
|
LocTy SizeLoc, TyLoc, ASLoc;
|
||||||
@ -6104,11 +6104,22 @@ int LLParser::ParseAlloc(Instruction *&Inst, PerFunctionState &PFS) {
|
|||||||
} else if (Lex.getKind() == lltok::MetadataVar) {
|
} else if (Lex.getKind() == lltok::MetadataVar) {
|
||||||
AteExtraComma = true;
|
AteExtraComma = true;
|
||||||
} else {
|
} else {
|
||||||
if (ParseTypeAndValue(Size, SizeLoc, PFS) ||
|
if (ParseTypeAndValue(Size, SizeLoc, PFS))
|
||||||
ParseOptionalCommaAlign(Alignment, AteExtraComma) ||
|
|
||||||
(!AteExtraComma &&
|
|
||||||
ParseOptionalCommaAddrSpace(AddrSpace, ASLoc, AteExtraComma)))
|
|
||||||
return true;
|
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