diff --git a/docs/LangRef.rst b/docs/LangRef.rst index e38184ca689..760a064f69e 100644 --- a/docs/LangRef.rst +++ b/docs/LangRef.rst @@ -4713,7 +4713,7 @@ Syntax: :: - = alloca [, inalloca][, ][, align ] ; yields {type*}:result + = alloca [inalloca] [, ] [, align ] ; yields {type*}:result Overview: """"""""" diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index a4bbcfcefd5..f29ceddf643 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -707,7 +707,8 @@ bool LLParser::ParseAlias(const std::string &Name, LocTy NameLoc, /// OptionalThreadLocal OptionalAddrSpace OptionalUnNammedAddr /// OptionalExternallyInitialized GlobalType Type Const /// -/// Everything through visibility has been parsed already. +/// Everything up to and including OptionalDLLStorageClass has been parsed +/// already. /// bool LLParser::ParseGlobal(const std::string &Name, LocTy NameLoc, unsigned Linkage, bool HasLinkage, @@ -4071,33 +4072,27 @@ bool LLParser::ParseCall(Instruction *&Inst, PerFunctionState &PFS, //===----------------------------------------------------------------------===// /// ParseAlloc -/// ::= 'alloca' Type (',' 'inalloca')? (',' TypeAndValue)? (',' OptionalInfo)? +/// ::= 'alloca' 'inalloca'? Type (',' TypeAndValue)? (',' 'align' i32)? int LLParser::ParseAlloc(Instruction *&Inst, PerFunctionState &PFS) { Value *Size = 0; LocTy SizeLoc; unsigned Alignment = 0; - bool IsInAlloca = false; Type *Ty = 0; + + bool IsInAlloca = EatIfPresent(lltok::kw_inalloca); + if (ParseType(Ty)) return true; bool AteExtraComma = false; if (EatIfPresent(lltok::comma)) { - bool HaveComma = true; - if (EatIfPresent(lltok::kw_inalloca)) { - IsInAlloca = true; - HaveComma = EatIfPresent(lltok::comma); - } - - if (HaveComma) { - if (Lex.getKind() == lltok::kw_align) { - if (ParseOptionalAlignment(Alignment)) return true; - } else if (Lex.getKind() == lltok::MetadataVar) { - AteExtraComma = true; - } else { - if (ParseTypeAndValue(Size, SizeLoc, PFS) || - ParseOptionalCommaAlign(Alignment, AteExtraComma)) - return true; - } + if (Lex.getKind() == lltok::kw_align) { + if (ParseOptionalAlignment(Alignment)) return true; + } else if (Lex.getKind() == lltok::MetadataVar) { + AteExtraComma = true; + } else { + if (ParseTypeAndValue(Size, SizeLoc, PFS) || + ParseOptionalCommaAlign(Alignment, AteExtraComma)) + return true; } } diff --git a/lib/IR/AsmWriter.cpp b/lib/IR/AsmWriter.cpp index 8a25ff8a979..c9ea49b2224 100644 --- a/lib/IR/AsmWriter.cpp +++ b/lib/IR/AsmWriter.cpp @@ -1946,9 +1946,9 @@ void AssemblyWriter::printInstruction(const Instruction &I) { } else if (const AllocaInst *AI = dyn_cast(&I)) { Out << ' '; - TypePrinter.print(AI->getAllocatedType(), Out); if (AI->isUsedWithInAlloca()) - Out << ", inalloca"; + Out << "inalloca "; + TypePrinter.print(AI->getAllocatedType(), Out); if (!AI->getArraySize() || AI->isArrayAllocation()) { Out << ", "; writeOperand(AI->getArraySize(), true); diff --git a/test/Assembler/inalloca.ll b/test/Assembler/inalloca.ll index 94fac26265c..ff7a87e0a39 100644 --- a/test/Assembler/inalloca.ll +++ b/test/Assembler/inalloca.ll @@ -2,11 +2,11 @@ define void @a() { entry: - %0 = alloca i32, inalloca - %1 = alloca [2 x i32], inalloca - %2 = alloca i32, inalloca, i32 2 - %3 = alloca i32, inalloca, i32 2, align 16 - %4 = alloca i32, inalloca, i32 2, align 16, !foo !0 + %0 = alloca inalloca i32 + %1 = alloca inalloca [2 x i32] + %2 = alloca inalloca i32, i32 2 + %3 = alloca inalloca i32, i32 2, align 16 + %4 = alloca inalloca i32, i32 2, align 16, !foo !0 %5 = alloca i32, i32 2, align 16, !foo !0 %6 = alloca i32, i32 2, align 16 ret void diff --git a/test/CodeGen/X86/dynamic-alloca-in-entry.ll b/test/CodeGen/X86/dynamic-alloca-in-entry.ll index 2ac89baaf9f..7ed471c2f50 100644 --- a/test/CodeGen/X86/dynamic-alloca-in-entry.ll +++ b/test/CodeGen/X86/dynamic-alloca-in-entry.ll @@ -11,7 +11,7 @@ define void @foo(i32 %n) { ; Use of inalloca implies that that the alloca is not static. define void @bar() { - %m = alloca i32, inalloca + %m = alloca inalloca i32 ret void } ; CHECK-LABEL: _bar: diff --git a/test/CodeGen/X86/inalloca-ctor.ll b/test/CodeGen/X86/inalloca-ctor.ll index f81e9675b70..7cfa9291357 100644 --- a/test/CodeGen/X86/inalloca-ctor.ll +++ b/test/CodeGen/X86/inalloca-ctor.ll @@ -10,7 +10,7 @@ declare void @Foo_ctor(%Foo* %this) define void @g() { entry: - %args = alloca %frame, inalloca + %args = alloca inalloca %frame %c = getelementptr %frame* %args, i32 0, i32 2 ; CHECK: movl $20, %eax ; CHECK: calll __chkstk diff --git a/test/CodeGen/X86/inalloca-invoke.ll b/test/CodeGen/X86/inalloca-invoke.ll index ac530ca5255..6cff9ac0640 100644 --- a/test/CodeGen/X86/inalloca-invoke.ll +++ b/test/CodeGen/X86/inalloca-invoke.ll @@ -16,7 +16,7 @@ define i32 @main() { blah: %inalloca.save = call i8* @llvm.stacksave() - %rev_args = alloca %frame.reverse, inalloca, align 4 + %rev_args = alloca inalloca %frame.reverse, align 4 %beg = getelementptr %frame.reverse* %rev_args, i32 0, i32 0 %end = getelementptr %frame.reverse* %rev_args, i32 0, i32 1 diff --git a/test/CodeGen/X86/inalloca-stdcall.ll b/test/CodeGen/X86/inalloca-stdcall.ll index 93ac451a508..54f97d99a9c 100644 --- a/test/CodeGen/X86/inalloca-stdcall.ll +++ b/test/CodeGen/X86/inalloca-stdcall.ll @@ -6,7 +6,7 @@ declare x86_stdcallcc void @f(%Foo* inalloca %a) declare x86_stdcallcc void @i(i32 %a) define void @g() { - %b = alloca %Foo, inalloca + %b = alloca inalloca %Foo ; CHECK: movl $8, %eax ; CHECK: calll __chkstk ; CHECK: movl %[[REG:[^,]*]], %esp diff --git a/test/CodeGen/X86/inalloca.ll b/test/CodeGen/X86/inalloca.ll index ac002863cf5..12643f9d0d5 100644 --- a/test/CodeGen/X86/inalloca.ll +++ b/test/CodeGen/X86/inalloca.ll @@ -7,7 +7,7 @@ declare void @f(%Foo* inalloca %b) define void @a() { ; CHECK-LABEL: _a: entry: - %b = alloca %Foo, inalloca + %b = alloca inalloca %Foo ; CHECK: movl $8, %eax ; CHECK: calll __chkstk ; CHECK: movl %[[REG:[^,]*]], %esp @@ -27,7 +27,7 @@ declare void @inreg_with_inalloca(i32 inreg %a, %Foo* inalloca %b) define void @b() { ; CHECK-LABEL: _b: entry: - %b = alloca %Foo, inalloca + %b = alloca inalloca %Foo ; CHECK: movl $8, %eax ; CHECK: calll __chkstk ; CHECK: movl %[[REG:[^,]*]], %esp @@ -48,7 +48,7 @@ declare x86_thiscallcc void @thiscall_with_inalloca(i8* %a, %Foo* inalloca %b) define void @c() { ; CHECK-LABEL: _c: entry: - %b = alloca %Foo, inalloca + %b = alloca inalloca %Foo ; CHECK: movl $8, %eax ; CHECK: calll __chkstk ; CHECK: movl %[[REG:[^,]*]], %esp diff --git a/test/Transforms/DeadArgElim/keepalive.ll b/test/Transforms/DeadArgElim/keepalive.ll index b66df792ca8..16569db4d38 100644 --- a/test/Transforms/DeadArgElim/keepalive.ll +++ b/test/Transforms/DeadArgElim/keepalive.ll @@ -38,7 +38,7 @@ define internal x86_thiscallcc i32 @unused_this(i32* %this, i32* inalloca %argme define i32 @caller2() { %t = alloca i32 - %m = alloca i32, inalloca + %m = alloca inalloca i32 store i32 42, i32* %m %v = call x86_thiscallcc i32 @unused_this(i32* %t, i32* inalloca %m) ret i32 %v diff --git a/test/Verifier/inalloca-vararg.ll b/test/Verifier/inalloca-vararg.ll index 8521ebce2d9..5099fd19927 100755 --- a/test/Verifier/inalloca-vararg.ll +++ b/test/Verifier/inalloca-vararg.ll @@ -2,7 +2,7 @@ declare void @h(i32, ...) define void @i() { - %args = alloca i32, inalloca + %args = alloca inalloca i32 call void (i32, ...)* @h(i32 1, i32* inalloca %args, i32 3) ; CHECK: inalloca isn't on the last argument! ret void diff --git a/test/Verifier/inalloca2.ll b/test/Verifier/inalloca2.ll index e4e81be3861..12a45499928 100644 --- a/test/Verifier/inalloca2.ll +++ b/test/Verifier/inalloca2.ll @@ -6,7 +6,7 @@ declare void @doit(i64* inalloca %a) define void @a() { entry: - %a = alloca [2 x i32], inalloca + %a = alloca inalloca [2 x i32] %b = bitcast [2 x i32]* %a to i64* call void @doit(i64* inalloca %b) ret void @@ -14,7 +14,7 @@ entry: define void @b() { entry: - %a = alloca i64, inalloca + %a = alloca inalloca i64 call void @doit(i64* inalloca %a) call void @doit(i64* inalloca %a) ret void @@ -25,11 +25,11 @@ entry: br i1 %cond, label %if, label %else if: - %a = alloca i64, inalloca + %a = alloca inalloca i64 br label %call else: - %b = alloca i64, inalloca + %b = alloca inalloca i64 br label %call call: